[][kernel][common][eth][Fix panic issue for the Aquantia heartbeat check thread]
[Description]
Fix panic issue for the Aquantia heartbeat check thread.
The driver may encounter EINTR error when calling 'ktherad_create'
function. Therefore, we have to a check return valuen before wake-up
the thread.
If without this patch, the driver might encounter panic issue for the
heartbeat check thread.
[Release-log]
N/A
Change-Id: Iccfd6f986fc84564cf432aa7bf5debc328fb4cd0
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/7572155
diff --git a/target/linux/mediatek/patches-5.4/999-2719-net-phy-aquantia-add-firmware-download.patch b/target/linux/mediatek/patches-5.4/999-2719-net-phy-aquantia-add-firmware-download.patch
index a66e0f1..c128bbe 100644
--- a/target/linux/mediatek/patches-5.4/999-2719-net-phy-aquantia-add-firmware-download.patch
+++ b/target/linux/mediatek/patches-5.4/999-2719-net-phy-aquantia-add-firmware-download.patch
@@ -153,7 +153,7 @@
index 000000000..d2828aad4
--- /dev/null
+++ b/drivers/net/phy/aquantia_firmware.c
-@@ -0,0 +1,1090 @@
+@@ -0,0 +1,1091 @@
+// SPDX-License-Identifier: GPL-2.0
+/* FW download driver for Aquantia PHY
+ */
@@ -1212,7 +1212,8 @@
+ "aqr_firmware_gandload_thread");
+ if (IS_ERR(gangload_kthread)) {
+ dev_err(dev,
-+ "failed to create aqr_firmware_gandload_thread\n");
++ "failed to create aqr_firmware_gandload_thread(%ld)\n",
++ PTR_ERR(gangload_kthread));
+ return PTR_ERR(gangload_kthread);
+ }
+ wake_up_process(gangload_kthread);
@@ -1373,7 +1374,7 @@
return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
}
-@@ -574,12 +559,39 @@ static void aqr107_link_change_notify(struct phy_device *phydev)
+@@ -574,12 +559,41 @@ static void aqr107_link_change_notify(struct phy_device *phydev)
static int aqr107_suspend(struct phy_device *phydev)
{
@@ -1404,9 +1405,11 @@
+ "aqr_firmware_heartbeat_thread");
+ if (IS_ERR(priv->heartbeat_thread)) {
+ phydev_err(phydev,
-+ "Failed to create aqr_firmware_heartbeat_thread\n");
-+ }
-+ wake_up_process(priv->heartbeat_thread);
++ "Failed to create aqr_firmware_heartbeat_thread(%ld)\n",
++ PTR_ERR(priv->heartbeat_thread));
++ priv->heartbeat_thread = NULL;
++ } else
++ wake_up_process(priv->heartbeat_thread);
+ }
+ spin_unlock(&priv->lock);
+#endif