mwifiex: reset scan_processing flag in failure cases
authorBing Zhao <bzhao@marvell.com>
Fri, 5 Oct 2012 01:00:22 +0000 (18:00 -0700)
committerGerrit <chrome-bot@google.com>
Fri, 5 Oct 2012 11:26:37 +0000 (04:26 -0700)
scan_processing flag should be reset when scan request is failed
due to some reasons Ex. memory allocation failure etc. Otherwise
further scan requests will be blocked.

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Bing Zhao <bzhao@marvell.com>
BUG=chrome-os-partner:14486
TEST=AP doing WPA and group rekeying every 600s;
DUT connects and is doing a ping with 2 second interval;
On DUT, run "while true; do iw mlan0 scan > /dev/null; done"

Change-Id: Ie0dcf5ac74cdec5c9ae3261180923a1405d5e2c7
Reviewed-on: https://gerrit.chromium.org/gerrit/34715
Reviewed-by: Paul Stewart <pstew@chromium.org>
Commit-Ready: Bing Zhao <bzhao@marvell.com>
Tested-by: Bing Zhao <bzhao@marvell.com>
drivers/net/wireless/mwifiex/scan.c

index 2106171..984f7ec 100644 (file)
@@ -1332,7 +1332,8 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
                                                                GFP_KERNEL);
        if (!scan_cfg_out) {
                dev_err(adapter->dev, "failed to alloc scan_cfg_out\n");
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto done;
        }
 
        buf_size = sizeof(struct mwifiex_chan_scan_param_set) *
@@ -1341,7 +1342,8 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
        if (!scan_chan_list) {
                dev_err(adapter->dev, "failed to alloc scan_chan_list\n");
                kfree(scan_cfg_out);
-               return -ENOMEM;
+               ret = -ENOMEM;
+               goto done;
        }
 
        mwifiex_config_scan(priv, user_scan_in, &scan_cfg_out->config,
@@ -1369,14 +1371,16 @@ int mwifiex_scan_networks(struct mwifiex_private *priv,
                        spin_unlock_irqrestore(&adapter->scan_pending_q_lock,
                                               flags);
                }
-       } else {
-               spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
-               adapter->scan_processing = true;
-               spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
        }
 
        kfree(scan_cfg_out);
        kfree(scan_chan_list);
+done:
+       if (ret) {
+               spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags);
+               adapter->scan_processing = false;
+               spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags);
+       }
        return ret;
 }