From 49f8f2ce197f0360c0ad0a86ce2a0f710edd8d75 Mon Sep 17 00:00:00 2001
From: coolsnowwolf <coolsnowwolf@gmail.com>
Date: Sat, 12 Apr 2025 11:20:54 +0800
Subject: [PATCH] kernel: refresh 6.12 patches

---
 .../hack-6.12/220-arm-gc_sections.patch       |  9 --
 .../781-usb-net-rndis-support-asr.patch       | 69 ++++++++++++++
 ...nps-pcie3-rk3568-update-fw-when-init.patch | 92 +++++++++++++++++++
 3 files changed, 161 insertions(+), 9 deletions(-)
 create mode 100644 target/linux/generic/hack-6.12/781-usb-net-rndis-support-asr.patch
 create mode 100644 target/linux/rockchip/patches-6.12/700-phy-rockchip-snps-pcie3-rk3568-update-fw-when-init.patch

diff --git a/target/linux/generic/hack-6.12/220-arm-gc_sections.patch b/target/linux/generic/hack-6.12/220-arm-gc_sections.patch
index cd036c63a..d26cf4053 100644
--- a/target/linux/generic/hack-6.12/220-arm-gc_sections.patch
+++ b/target/linux/generic/hack-6.12/220-arm-gc_sections.patch
@@ -83,15 +83,6 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
  		__stop_unwind_tab = .;					\
  	}
  
-@@ -125,7 +125,7 @@
- 	__vectors_lma = .;						\
- 	OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) {		\
- 		.vectors {						\
--			*(.vectors)					\
-+			KEEP(*(.vectors))				\
- 		}							\
- 		.vectors.bhb.loop8 {					\
- 			*(.vectors.bhb.loop8)				\
 @@ -143,7 +143,7 @@
  									\
  	__stubs_lma = .;						\
diff --git a/target/linux/generic/hack-6.12/781-usb-net-rndis-support-asr.patch b/target/linux/generic/hack-6.12/781-usb-net-rndis-support-asr.patch
new file mode 100644
index 000000000..fa7ace2ce
--- /dev/null
+++ b/target/linux/generic/hack-6.12/781-usb-net-rndis-support-asr.patch
@@ -0,0 +1,69 @@
+From 9fabf60187f1fa19e6f6bb5441587d485bd534b0 Mon Sep 17 00:00:00 2001
+From: Daniel Golle <daniel@makrotopia.org>
+Date: Tue, 9 Apr 2024 17:06:38 +0100
+Subject: [PATCH] rndis_host: add a bunch of USB IDs
+
+Add a bunch of USB IDs found in various places online to the
+RNDIS USB network driver.
+
+Signed-off-by: Daniel Golle <daniel@makrotopia.org>
+---
+ drivers/net/usb/rndis_host.c | 40 ++++++++++++++++++++++
+ 1 file changed, 40 insertions(+)
+
+--- a/drivers/net/usb/rndis_host.c
++++ b/drivers/net/usb/rndis_host.c
+@@ -640,6 +640,16 @@ static const struct driver_info	zte_rndi
+ 	.tx_fixup =	rndis_tx_fixup,
+ };
+ 
++static const struct driver_info asr_rndis_info = {
++	.description =	"Asr RNDIS device",
++	.flags =	FLAG_WWAN | FLAG_POINTTOPOINT | FLAG_FRAMING_RN | FLAG_NO_SETINT | FLAG_NOARP,
++	.bind =		rndis_bind,
++	.unbind =	rndis_unbind,
++	.status =	rndis_status,
++	.rx_fixup =	rndis_rx_fixup,
++	.tx_fixup =	rndis_tx_fixup,
++};
++
+ /*-------------------------------------------------------------------------*/
+ 
+ static const struct usb_device_id	products [] = {
+@@ -675,6 +685,36 @@ static const struct usb_device_id	produc
+ 	/* RNDIS for tethering */
+ 	USB_INTERFACE_INFO(USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
+ 	.driver_info = (unsigned long) &rndis_info,
++}, {
++	/* Quectel EG060V rndis device */
++	USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x6004,
++				      USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
++	.driver_info = (unsigned long) &asr_rndis_info,
++}, {
++	/* Quectel EC200A rndis device */
++	USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x6005,
++				      USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
++	.driver_info = (unsigned long) &asr_rndis_info,
++}, {
++	/* Quectel EC200T rndis device */
++	USB_DEVICE_AND_INTERFACE_INFO(0x2c7c, 0x6026,
++				      USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
++	.driver_info = (unsigned long) &asr_rndis_info,
++}, {
++	/* Simcom A7906E rndis device */
++	USB_DEVICE_AND_INTERFACE_INFO(0x1e0e, 0x9011,
++				      USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
++	.driver_info = (unsigned long) &asr_rndis_info,
++}, {
++	/* Meig SLM770A */
++	USB_DEVICE_AND_INTERFACE_INFO(0x2dee, 0x4d57,
++				      USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
++	.driver_info = (unsigned long) &asr_rndis_info,
++}, {
++	/* Meig SLM828 */
++	USB_DEVICE_AND_INTERFACE_INFO(0x2dee, 0x4d49,
++				      USB_CLASS_WIRELESS_CONTROLLER, 1, 3),
++	.driver_info = (unsigned long) &asr_rndis_info,
+ }, {
+ 	/* Mobile Broadband Modem, seen in Novatel Verizon USB730L and
+ 	 * Telit FN990A (RNDIS)
diff --git a/target/linux/rockchip/patches-6.12/700-phy-rockchip-snps-pcie3-rk3568-update-fw-when-init.patch b/target/linux/rockchip/patches-6.12/700-phy-rockchip-snps-pcie3-rk3568-update-fw-when-init.patch
new file mode 100644
index 000000000..f587f5d67
--- /dev/null
+++ b/target/linux/rockchip/patches-6.12/700-phy-rockchip-snps-pcie3-rk3568-update-fw-when-init.patch
@@ -0,0 +1,92 @@
+From 91802f44a959582842bdbbd0190e68337ad4c60c Mon Sep 17 00:00:00 2001
+From: Kever Yang <kever.yang@rock-chips.com>
+Date: Mon, 11 Jul 2022 20:35:52 +0800
+Subject: [PATCH] phy: rockchip-snps-pcie3: rk3568: update fw when init
+
+This fw fix some RX issue:
+1. connect detect error;
+2. transfer error in ssd huge data write(more than 10GB).
+
+Signed-off-by: Kever Yang <kever.yang@rock-chips.com>
+Change-Id: I6624b6af2ede3c2fca61c0f753a08a33ce69a6d2
+---
+ drivers/phy/phy-rockchip-snps-pcie3.c  |   36 +-
+ drivers/phy/phy-rockchip-snps-pcie3.fw | 8192 ++++++++++++++++++++++++
+ 2 files changed, 8225 insertions(+), 3 deletions(-)
+ create mode 100644 drivers/phy/phy-rockchip-snps-pcie3.fw
+
+--- a/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
++++ b/drivers/phy/rockchip/phy-rockchip-snps-pcie3.c
+@@ -21,6 +21,7 @@
+ 
+ /* Register for RK3568 */
+ #define GRF_PCIE30PHY_CON1			0x4
++#define GRF_PCIE30PHY_CON4			0x10
+ #define GRF_PCIE30PHY_CON6			0x18
+ #define GRF_PCIE30PHY_CON9			0x24
+ #define GRF_PCIE30PHY_DA_OCM			(BIT(15) | BIT(31))
+@@ -73,6 +74,10 @@ struct rockchip_p3phy_ops {
+ 	int (*phy_init)(struct rockchip_p3phy_priv *priv);
+ };
+ 
++static u16 phy_fw[] = {
++	#include "p3phy.fw"
++};
++
+ static int rockchip_p3phy_set_mode(struct phy *phy, enum phy_mode mode, int submode)
+ {
+ 	struct rockchip_p3phy_priv *priv = phy_get_drvdata(phy);
+@@ -97,13 +102,14 @@ static int rockchip_p3phy_rk3568_init(st
+ {
+ 	struct phy *phy = priv->phy;
+ 	bool bifurcation = false;
++	int i;
+ 	int ret;
+ 	u32 reg;
+ 
+ 	/* Deassert PCIe PMA output clamp mode */
+ 	regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON9, GRF_PCIE30PHY_DA_OCM);
+ 
+-	for (int i = 0; i < priv->num_lanes; i++) {
++	for (i = 0; i < priv->num_lanes; i++) {
+ 		dev_info(&phy->dev, "lane number %d, val %d\n", i, priv->lanes[i]);
+ 		if (priv->lanes[i] > 1)
+ 			bifurcation = true;
+@@ -122,16 +128,35 @@ static int rockchip_p3phy_rk3568_init(st
+ 			     GRF_PCIE30PHY_WR_EN & ~RK3568_BIFURCATION_LANE_0_1);
+ 	}
+ 
++	regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON4,
++		     (0x0 << 14) | (0x1 << (14 + 16))); //sdram_ld_done
++	regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON4,
++		     (0x0 << 13) | (0x1 << (13 + 16))); //sdram_bypass
++
+ 	reset_control_deassert(priv->p30phy);
+ 
+ 	ret = regmap_read_poll_timeout(priv->phy_grf,
+ 				       GRF_PCIE30PHY_STATUS0,
+ 				       reg, SRAM_INIT_DONE(reg),
+ 				       0, 500);
+-	if (ret)
++	if (ret) {
+ 		dev_err(&priv->phy->dev, "%s: lock failed 0x%x, check input refclk and power supply\n",
+ 		       __func__, reg);
+-	return ret;
++		return ret;
++	}
++
++	regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON9,
++		     (0x3 << 8) | (0x3 << (8 + 16))); //map to access sram
++	for (i = 0; i < 8192; i++)
++		writel(phy_fw[i], priv->mmio + (i<<2));
++
++	regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON9,
++		     (0x0 << 8) | (0x3 << (8 + 16)));
++	regmap_write(priv->phy_grf, GRF_PCIE30PHY_CON4,
++		     (0x1 << 14) | (0x1 << (14 + 16))); //sdram_ld_done
++
++	dev_info(&priv->phy->dev, "p3phy (fw-d54d0eb) initialized\n");
++	return 0;
+ }
+ 
+ static const struct rockchip_p3phy_ops rk3568_ops = {