From 14a60a73997dbde204ec1ff39f9c38f15c1b9a63 Mon Sep 17 00:00:00 2001 From: Alex Shumsky Date: Fri, 7 Jun 2024 23:47:17 +0300 Subject: [PATCH] fix netdev (un)registration deadlock --- os_dep/linux/ioctl_cfg80211.c | 8 ++++++++ os_dep/linux/os_intfs.c | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/os_dep/linux/ioctl_cfg80211.c b/os_dep/linux/ioctl_cfg80211.c index c200b0b..c605493 100644 --- a/os_dep/linux/ioctl_cfg80211.c +++ b/os_dep/linux/ioctl_cfg80211.c @@ -5060,7 +5060,11 @@ static int rtw_cfg80211_add_monitor_if(_adapter *padapter, char *name, struct ne mon_wdev->iftype = NL80211_IFTYPE_MONITOR; mon_ndev->ieee80211_ptr = mon_wdev; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) + ret = cfg80211_register_netdevice(mon_ndev); +#else ret = register_netdevice(mon_ndev); +#endif if (ret) goto out; @@ -6762,7 +6766,11 @@ static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, pwdev_priv = adapter_wdev_data(adapter); if (ndev == pwdev_priv->pmon_ndev) { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) + cfg80211_unregister_netdevice(ndev); +#else unregister_netdevice(ndev); +#endif pwdev_priv->pmon_ndev = NULL; pwdev_priv->ifname_mon[0] = '\0'; RTW_INFO(FUNC_NDEV_FMT" remove monitor ndev\n", FUNC_NDEV_ARG(ndev)); diff --git a/os_dep/linux/os_intfs.c b/os_dep/linux/os_intfs.c index a68fac0..0a5bc72 100644 --- a/os_dep/linux/os_intfs.c +++ b/os_dep/linux/os_intfs.c @@ -2192,7 +2192,11 @@ int rtw_os_ndev_register(_adapter *adapter, const char *name) if (rtnl_lock_needed) ret = (register_netdev(ndev) == 0) ? _SUCCESS : _FAIL; else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) + ret = (cfg80211_register_netdevice(ndev) == 0) ? _SUCCESS : _FAIL; +#else ret = (register_netdevice(ndev) == 0) ? _SUCCESS : _FAIL; +#endif if (ret == _SUCCESS) adapter->registered = 1; @@ -2241,7 +2245,11 @@ void rtw_os_ndev_unregister(_adapter *adapter) if (rtnl_lock_needed) unregister_netdev(netdev); else +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 12, 0) + cfg80211_unregister_netdevice(netdev); +#else unregister_netdevice(netdev); +#endif } #if defined(CONFIG_IOCTL_CFG80211) && !defined(RTW_SINGLE_WIPHY)