diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex/scan.c')
-rw-r--r-- | drivers/net/wireless/mwifiex/scan.c | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index e36a75988f87..00b658d3b6ec 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c | |||
@@ -1296,7 +1296,7 @@ mwifiex_radio_type_to_band(u8 radio_type) | |||
1296 | int mwifiex_scan_networks(struct mwifiex_private *priv, | 1296 | int mwifiex_scan_networks(struct mwifiex_private *priv, |
1297 | const struct mwifiex_user_scan_cfg *user_scan_in) | 1297 | const struct mwifiex_user_scan_cfg *user_scan_in) |
1298 | { | 1298 | { |
1299 | int ret = 0; | 1299 | int ret; |
1300 | struct mwifiex_adapter *adapter = priv->adapter; | 1300 | struct mwifiex_adapter *adapter = priv->adapter; |
1301 | struct cmd_ctrl_node *cmd_node; | 1301 | struct cmd_ctrl_node *cmd_node; |
1302 | union mwifiex_scan_cmd_config_tlv *scan_cfg_out; | 1302 | union mwifiex_scan_cmd_config_tlv *scan_cfg_out; |
@@ -1309,25 +1309,26 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
1309 | unsigned long flags; | 1309 | unsigned long flags; |
1310 | 1310 | ||
1311 | if (adapter->scan_processing) { | 1311 | if (adapter->scan_processing) { |
1312 | dev_dbg(adapter->dev, "cmd: Scan already in process...\n"); | 1312 | dev_err(adapter->dev, "cmd: Scan already in process...\n"); |
1313 | return ret; | 1313 | return -EBUSY; |
1314 | } | 1314 | } |
1315 | 1315 | ||
1316 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1317 | adapter->scan_processing = true; | ||
1318 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1319 | |||
1320 | if (priv->scan_block) { | 1316 | if (priv->scan_block) { |
1321 | dev_dbg(adapter->dev, | 1317 | dev_err(adapter->dev, |
1322 | "cmd: Scan is blocked during association...\n"); | 1318 | "cmd: Scan is blocked during association...\n"); |
1323 | return ret; | 1319 | return -EBUSY; |
1324 | } | 1320 | } |
1325 | 1321 | ||
1322 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1323 | adapter->scan_processing = true; | ||
1324 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1325 | |||
1326 | scan_cfg_out = kzalloc(sizeof(union mwifiex_scan_cmd_config_tlv), | 1326 | scan_cfg_out = kzalloc(sizeof(union mwifiex_scan_cmd_config_tlv), |
1327 | GFP_KERNEL); | 1327 | GFP_KERNEL); |
1328 | if (!scan_cfg_out) { | 1328 | if (!scan_cfg_out) { |
1329 | dev_err(adapter->dev, "failed to alloc scan_cfg_out\n"); | 1329 | dev_err(adapter->dev, "failed to alloc scan_cfg_out\n"); |
1330 | return -ENOMEM; | 1330 | ret = -ENOMEM; |
1331 | goto done; | ||
1331 | } | 1332 | } |
1332 | 1333 | ||
1333 | buf_size = sizeof(struct mwifiex_chan_scan_param_set) * | 1334 | buf_size = sizeof(struct mwifiex_chan_scan_param_set) * |
@@ -1336,7 +1337,8 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
1336 | if (!scan_chan_list) { | 1337 | if (!scan_chan_list) { |
1337 | dev_err(adapter->dev, "failed to alloc scan_chan_list\n"); | 1338 | dev_err(adapter->dev, "failed to alloc scan_chan_list\n"); |
1338 | kfree(scan_cfg_out); | 1339 | kfree(scan_cfg_out); |
1339 | return -ENOMEM; | 1340 | ret = -ENOMEM; |
1341 | goto done; | ||
1340 | } | 1342 | } |
1341 | 1343 | ||
1342 | mwifiex_config_scan(priv, user_scan_in, &scan_cfg_out->config, | 1344 | mwifiex_config_scan(priv, user_scan_in, &scan_cfg_out->config, |
@@ -1364,14 +1366,16 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
1364 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, | 1366 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, |
1365 | flags); | 1367 | flags); |
1366 | } | 1368 | } |
1367 | } else { | ||
1368 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1369 | adapter->scan_processing = true; | ||
1370 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1371 | } | 1369 | } |
1372 | 1370 | ||
1373 | kfree(scan_cfg_out); | 1371 | kfree(scan_cfg_out); |
1374 | kfree(scan_chan_list); | 1372 | kfree(scan_chan_list); |
1373 | done: | ||
1374 | if (ret) { | ||
1375 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
1376 | adapter->scan_processing = false; | ||
1377 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
1378 | } | ||
1375 | return ret; | 1379 | return ret; |
1376 | } | 1380 | } |
1377 | 1381 | ||
@@ -1430,8 +1434,8 @@ int mwifiex_check_network_compatibility(struct mwifiex_private *priv, | |||
1430 | ret = mwifiex_is_network_compatible(priv, bss_desc, | 1434 | ret = mwifiex_is_network_compatible(priv, bss_desc, |
1431 | priv->bss_mode); | 1435 | priv->bss_mode); |
1432 | if (ret) | 1436 | if (ret) |
1433 | dev_err(priv->adapter->dev, "cannot find ssid " | 1437 | dev_err(priv->adapter->dev, |
1434 | "%s\n", bss_desc->ssid.ssid); | 1438 | "Incompatible network settings\n"); |
1435 | break; | 1439 | break; |
1436 | default: | 1440 | default: |
1437 | ret = 0; | 1441 | ret = 0; |