Whenever sched_scan(BG_SCAN) is in progress and driver downloads
any command, firmware will send an event BG_SCAN_STOPPED. On
recieving this, driver calls cfg80211_sched_scan_stopped. This
function in turn will try to acquire rtnl_lock. But if the
rtnl_lock was already held(while sending the command above), this
will result in nested rtnl locking. To fix this driver must call
rtnl version of the API if rtnl_is_locked().

Signed-off-by: Cathy Luo <c...@marvell.com>
Signed-off-by: Ganapathi Bhat <gb...@marvell.com>
---
 drivers/net/wireless/marvell/mwifiex/sta_event.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/wireless/marvell/mwifiex/sta_event.c 
b/drivers/net/wireless/marvell/mwifiex/sta_event.c
index 93dfb76..03ef625c 100644
--- a/drivers/net/wireless/marvell/mwifiex/sta_event.c
+++ b/drivers/net/wireless/marvell/mwifiex/sta_event.c
@@ -848,7 +848,10 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
 
        case EVENT_BG_SCAN_STOPPED:
                dev_dbg(adapter->dev, "event: BGS_STOPPED\n");
-               cfg80211_sched_scan_stopped(priv->wdev.wiphy, 0);
+               if (rtnl_is_locked())
+                       cfg80211_sched_scan_stopped_rtnl(priv->wdev.wiphy, 0);
+               else
+                       cfg80211_sched_scan_stopped(priv->wdev.wiphy, 0);
                if (priv->sched_scanning)
                        priv->sched_scanning = false;
                break;
-- 
1.9.1

Reply via email to