diff --git a/target/linux/ipq806x/patches-5.4/701-stmmac-fix-notifier-registration.patch b/target/linux/ipq806x/patches-5.4/701-stmmac-fix-notifier-registration.patch new file mode 100644 index 0000000000..187cbacde0 --- /dev/null +++ b/target/linux/ipq806x/patches-5.4/701-stmmac-fix-notifier-registration.patch @@ -0,0 +1,84 @@ +From 474a31e13a4e9749fb3ee55794d69d0f17ee0998 Mon Sep 17 00:00:00 2001 +From: Aaro Koskinen +Date: Wed, 26 Feb 2020 18:49:01 +0200 +Subject: net: stmmac: fix notifier registration + +We cannot register the same netdev notifier multiple times when probing +stmmac devices. Register the notifier only once in module init, and also +make debugfs creation/deletion safe against simultaneous notifier call. + +Fixes: 481a7d154cbb ("stmmac: debugfs entry name is not be changed when udev rename device name.") +Signed-off-by: Aaro Koskinen +Signed-off-by: David S. Miller +--- + drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +(limited to 'drivers/net/ethernet/stmicro/stmmac') + +diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +index 5836b21edd7e..7da18c9afa01 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c ++++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +@@ -4405,6 +4405,8 @@ static void stmmac_init_fs(struct net_device *dev) + { + struct stmmac_priv *priv = netdev_priv(dev); + ++ rtnl_lock(); ++ + /* Create per netdev entries */ + priv->dbgfs_dir = debugfs_create_dir(dev->name, stmmac_fs_dir); + +@@ -4416,14 +4418,13 @@ static void stmmac_init_fs(struct net_device *dev) + debugfs_create_file("dma_cap", 0444, priv->dbgfs_dir, dev, + &stmmac_dma_cap_fops); + +- register_netdevice_notifier(&stmmac_notifier); ++ rtnl_unlock(); + } + + static void stmmac_exit_fs(struct net_device *dev) + { + struct stmmac_priv *priv = netdev_priv(dev); + +- unregister_netdevice_notifier(&stmmac_notifier); + debugfs_remove_recursive(priv->dbgfs_dir); + } + #endif /* CONFIG_DEBUG_FS */ +@@ -4940,14 +4941,14 @@ int stmmac_dvr_remove(struct device *dev) + + netdev_info(priv->dev, "%s: removing driver", __func__); + +-#ifdef CONFIG_DEBUG_FS +- stmmac_exit_fs(ndev); +-#endif + stmmac_stop_all_dma(priv); + + stmmac_mac_set(priv, priv->ioaddr, false); + netif_carrier_off(ndev); + unregister_netdev(ndev); ++#ifdef CONFIG_DEBUG_FS ++ stmmac_exit_fs(ndev); ++#endif + phylink_destroy(priv->phylink); + if (priv->plat->stmmac_rst) + reset_control_assert(priv->plat->stmmac_rst); +@@ -5166,6 +5167,7 @@ static int __init stmmac_init(void) + /* Create debugfs main directory if it doesn't exist yet */ + if (!stmmac_fs_dir) + stmmac_fs_dir = debugfs_create_dir(STMMAC_RESOURCE_NAME, NULL); ++ register_netdevice_notifier(&stmmac_notifier); + #endif + + return 0; +@@ -5174,6 +5176,7 @@ static int __init stmmac_init(void) + static void __exit stmmac_exit(void) + { + #ifdef CONFIG_DEBUG_FS ++ unregister_netdevice_notifier(&stmmac_notifier); + debugfs_remove_recursive(stmmac_fs_dir); + #endif + } +-- +cgit 1.2-0.3.lf.el7 +