ipq40xx: ipqess: do not free ipqess_init
authorJohn Thomson <git@johnthomson.fastmail.com.au>
Sat, 29 Jun 2024 22:45:47 +0000 (08:45 +1000)
committerRobert Marko <robimarko@gmail.com>
Sun, 30 Jun 2024 09:07:02 +0000 (11:07 +0200)
If this function is marked as __init, kernel will splat when driver is
(re)bind
echo "c080000.ethernet">/sys/bus/platform/drivers/ipqess-edma/unbind
echo "c080000.ethernet">/sys/bus/platform/drivers/ipqess-edma/bind

Example with additional print messages, functions at boot:
[    2.039468] ipqess-edma c080000.ethernet: ipqess_axi_probe pre register_netdev
[    2.039530] ipqess-edma c080000.ethernet: *netdev: c27d2000
[    2.045609] ipqess-edma c080000.ethernet: &ipqess_init: c0d1e28c
[    2.051122] ipqess_init
[    2.057338] netdev: c27d2000
[    2.059492] ess = netdev_priv: c27d2500
[    2.062615] ess->pdev: c2138c00
[    2.066174] ess->pdev->dev: c2138c10
[    2.069314] ess->pdev->dev.of_node: ef6f6368
[    2.073120] ess->pdev->dev.of_node: /soc/ethernet@c080000

fails (bind) after unbind:
[   34.987948] ipqess-edma c080000.ethernet: ipqess_axi_probe pre register_netdev
[   34.988012] ipqess-edma c080000.ethernet: *netdev: c27d6000
[   34.994088] ipqess-edma c080000.ethernet: &ipqess_init: c0d1e28c
[   34.999652] 8<--- cut here ---
[   35.005802] Unable to handle kernel paging request at virtual address c0d1e28c when execute
[   35.008676] [c0d1e28c] *pgd=80c1941e(bad)
[   35.016918] Internal error: Oops: 8000000d [#1] SMP ARM

Signed-off-by: John Thomson <git@johnthomson.fastmail.com.au>
Link: https://github.com/openwrt/openwrt/pull/15831
Signed-off-by: Robert Marko <robimarko@gmail.com>
target/linux/ipq40xx/patches-6.6/700-net-ipqess-introduce-the-Qualcomm-IPQESS-driver.patch

index d8805ae70f76356c5132f529fb5abfa1231f5b7e..4910307c88708f58f84db6044b0082845c0530c9 100644 (file)
@@ -655,7 +655,7 @@ Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
 +      }
 +}
 +
-+static int __init ipqess_init(struct net_device *netdev)
++static int ipqess_init(struct net_device *netdev)
 +{
 +      struct ipqess *ess = netdev_priv(netdev);
 +      struct device_node *of_node = ess->pdev->dev.of_node;