CHROMIUM: mwifiex: do not call cfg80211_scan_done if scan is already aborted
authorBing Zhao <bzhao@marvell.com>
Fri, 12 Oct 2012 22:17:49 +0000 (15:17 -0700)
committerGerrit <chrome-bot@google.com>
Sat, 13 Oct 2012 21:52:04 +0000 (14:52 -0700)
The scan could be aborted by cfg80211 core.c:

if (WARN_ON(rdev->scan_req && rdev->scan_req->wdev == wdev)) {
        rdev->scan_req->aborted = true;
        ___cfg80211_scan_done(rdev, true);
}

Driver shouldn't call cfg80211_scan_done in this case, otherwise
it triggers a "Unable to handle kernel paging request at ..."

BUG=chrome-os-partner:15087
TEST=On Wi-Fi Network Settings, enable Wi-Fi and connect to AP,
then disable Wi-Fi. Repeat above test multiple time.

Change-Id: Ib054d27369ade4d0889880be3d77be0eb6513822
Signed-off-by: Bing Zhao <bzhao@marvell.com>
Signed-off-by: Paul Stewart <pstew@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/35479
Reviewed-by: Ryan Cairns <rtc@chromium.org>
drivers/net/wireless/mwifiex/init.c
drivers/net/wireless/mwifiex/scan.c

index 9dbeea9..8868046 100644 (file)
@@ -85,9 +85,15 @@ static void scan_delay_timer_fn(unsigned long data)
                spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
 
                if (priv->user_scan_cfg) {
-                       dev_dbg(priv->adapter->dev,
-                               "info: %s: scan aborted\n", __func__);
-                       cfg80211_scan_done(priv->scan_request, 1);
+                       if (!priv->scan_request->aborted) {
+                               dev_dbg(priv->adapter->dev,
+                                       "info: aborting scan\n");
+                               cfg80211_scan_done(priv->scan_request, 1);
+                       } else {
+                               dev_dbg(priv->adapter->dev,
+                                       "info: scan already aborted\n");
+                       }
+
                        priv->scan_request = NULL;
                        kfree(priv->user_scan_cfg);
                        priv->user_scan_cfg = NULL;
index 3afaace..a7d71a5 100644 (file)
@@ -1747,9 +1747,15 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
                }
 
                if (priv->user_scan_cfg) {
-                       dev_dbg(priv->adapter->dev,
-                               "info: %s: sending scan results\n", __func__);
-                       cfg80211_scan_done(priv->scan_request, 0);
+                       if (!priv->scan_request->aborted) {
+                               dev_dbg(priv->adapter->dev,
+                                       "info: notifying scan done\n");
+                               cfg80211_scan_done(priv->scan_request, 0);
+                       } else {
+                               dev_dbg(priv->adapter->dev,
+                                       "info: scan already aborted\n");
+                       }
+
                        priv->scan_request = NULL;
                        kfree(priv->user_scan_cfg);
                        priv->user_scan_cfg = NULL;