diff options
Diffstat (limited to 'drivers/net/wireless/mwifiex')
-rw-r--r-- | drivers/net/wireless/mwifiex/cfg80211.c | 31 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/init.c | 20 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/main.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/mwifiex/scan.c | 22 |
5 files changed, 34 insertions, 42 deletions
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index d3c8ece980d8..fcd293c64118 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
@@ -1859,6 +1859,7 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
1859 | int i, offset, ret; | 1859 | int i, offset, ret; |
1860 | struct ieee80211_channel *chan; | 1860 | struct ieee80211_channel *chan; |
1861 | struct ieee_types_header *ie; | 1861 | struct ieee_types_header *ie; |
1862 | struct mwifiex_user_scan_cfg *user_scan_cfg; | ||
1862 | 1863 | ||
1863 | wiphy_dbg(wiphy, "info: received scan request on %s\n", dev->name); | 1864 | wiphy_dbg(wiphy, "info: received scan request on %s\n", dev->name); |
1864 | 1865 | ||
@@ -1869,20 +1870,22 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
1869 | return -EBUSY; | 1870 | return -EBUSY; |
1870 | } | 1871 | } |
1871 | 1872 | ||
1872 | if (priv->user_scan_cfg) { | 1873 | /* Block scan request if scan operation or scan cleanup when interface |
1874 | * is disabled is in process | ||
1875 | */ | ||
1876 | if (priv->scan_request || priv->scan_aborting) { | ||
1873 | dev_err(priv->adapter->dev, "cmd: Scan already in process..\n"); | 1877 | dev_err(priv->adapter->dev, "cmd: Scan already in process..\n"); |
1874 | return -EBUSY; | 1878 | return -EBUSY; |
1875 | } | 1879 | } |
1876 | 1880 | ||
1877 | priv->user_scan_cfg = kzalloc(sizeof(struct mwifiex_user_scan_cfg), | 1881 | user_scan_cfg = kzalloc(sizeof(*user_scan_cfg), GFP_KERNEL); |
1878 | GFP_KERNEL); | 1882 | if (!user_scan_cfg) |
1879 | if (!priv->user_scan_cfg) | ||
1880 | return -ENOMEM; | 1883 | return -ENOMEM; |
1881 | 1884 | ||
1882 | priv->scan_request = request; | 1885 | priv->scan_request = request; |
1883 | 1886 | ||
1884 | priv->user_scan_cfg->num_ssids = request->n_ssids; | 1887 | user_scan_cfg->num_ssids = request->n_ssids; |
1885 | priv->user_scan_cfg->ssid_list = request->ssids; | 1888 | user_scan_cfg->ssid_list = request->ssids; |
1886 | 1889 | ||
1887 | if (request->ie && request->ie_len) { | 1890 | if (request->ie && request->ie_len) { |
1888 | offset = 0; | 1891 | offset = 0; |
@@ -1902,25 +1905,25 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
1902 | for (i = 0; i < min_t(u32, request->n_channels, | 1905 | for (i = 0; i < min_t(u32, request->n_channels, |
1903 | MWIFIEX_USER_SCAN_CHAN_MAX); i++) { | 1906 | MWIFIEX_USER_SCAN_CHAN_MAX); i++) { |
1904 | chan = request->channels[i]; | 1907 | chan = request->channels[i]; |
1905 | priv->user_scan_cfg->chan_list[i].chan_number = chan->hw_value; | 1908 | user_scan_cfg->chan_list[i].chan_number = chan->hw_value; |
1906 | priv->user_scan_cfg->chan_list[i].radio_type = chan->band; | 1909 | user_scan_cfg->chan_list[i].radio_type = chan->band; |
1907 | 1910 | ||
1908 | if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) | 1911 | if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) |
1909 | priv->user_scan_cfg->chan_list[i].scan_type = | 1912 | user_scan_cfg->chan_list[i].scan_type = |
1910 | MWIFIEX_SCAN_TYPE_PASSIVE; | 1913 | MWIFIEX_SCAN_TYPE_PASSIVE; |
1911 | else | 1914 | else |
1912 | priv->user_scan_cfg->chan_list[i].scan_type = | 1915 | user_scan_cfg->chan_list[i].scan_type = |
1913 | MWIFIEX_SCAN_TYPE_ACTIVE; | 1916 | MWIFIEX_SCAN_TYPE_ACTIVE; |
1914 | 1917 | ||
1915 | priv->user_scan_cfg->chan_list[i].scan_time = 0; | 1918 | user_scan_cfg->chan_list[i].scan_time = 0; |
1916 | } | 1919 | } |
1917 | 1920 | ||
1918 | ret = mwifiex_scan_networks(priv, priv->user_scan_cfg); | 1921 | ret = mwifiex_scan_networks(priv, user_scan_cfg); |
1922 | kfree(user_scan_cfg); | ||
1919 | if (ret) { | 1923 | if (ret) { |
1920 | dev_err(priv->adapter->dev, "scan failed: %d\n", ret); | 1924 | dev_err(priv->adapter->dev, "scan failed: %d\n", ret); |
1925 | priv->scan_aborting = false; | ||
1921 | priv->scan_request = NULL; | 1926 | priv->scan_request = NULL; |
1922 | kfree(priv->user_scan_cfg); | ||
1923 | priv->user_scan_cfg = NULL; | ||
1924 | return ret; | 1927 | return ret; |
1925 | } | 1928 | } |
1926 | 1929 | ||
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c index 71bbf1204685..1343725f8c4c 100644 --- a/drivers/net/wireless/mwifiex/init.c +++ b/drivers/net/wireless/mwifiex/init.c | |||
@@ -81,19 +81,13 @@ static void scan_delay_timer_fn(unsigned long data) | |||
81 | adapter->empty_tx_q_cnt = 0; | 81 | adapter->empty_tx_q_cnt = 0; |
82 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | 82 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); |
83 | 83 | ||
84 | if (priv->user_scan_cfg) { | 84 | if (priv->scan_request) { |
85 | if (priv->scan_request) { | 85 | dev_dbg(adapter->dev, "info: aborting scan\n"); |
86 | dev_dbg(priv->adapter->dev, | 86 | cfg80211_scan_done(priv->scan_request, 1); |
87 | "info: aborting scan\n"); | 87 | priv->scan_request = NULL; |
88 | cfg80211_scan_done(priv->scan_request, 1); | 88 | } else { |
89 | priv->scan_request = NULL; | 89 | priv->scan_aborting = false; |
90 | } else { | 90 | dev_dbg(adapter->dev, "info: scan already aborted\n"); |
91 | dev_dbg(priv->adapter->dev, | ||
92 | "info: scan already aborted\n"); | ||
93 | } | ||
94 | |||
95 | kfree(priv->user_scan_cfg); | ||
96 | priv->user_scan_cfg = NULL; | ||
97 | } | 91 | } |
98 | goto done; | 92 | goto done; |
99 | } | 93 | } |
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c index 121443a0f2a1..eb8518618622 100644 --- a/drivers/net/wireless/mwifiex/main.c +++ b/drivers/net/wireless/mwifiex/main.c | |||
@@ -436,6 +436,7 @@ mwifiex_close(struct net_device *dev) | |||
436 | dev_dbg(priv->adapter->dev, "aborting scan on ndo_stop\n"); | 436 | dev_dbg(priv->adapter->dev, "aborting scan on ndo_stop\n"); |
437 | cfg80211_scan_done(priv->scan_request, 1); | 437 | cfg80211_scan_done(priv->scan_request, 1); |
438 | priv->scan_request = NULL; | 438 | priv->scan_request = NULL; |
439 | priv->scan_aborting = true; | ||
439 | } | 440 | } |
440 | 441 | ||
441 | return 0; | 442 | return 0; |
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index 4ef67fca06d3..81251d91491c 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
@@ -492,7 +492,6 @@ struct mwifiex_private { | |||
492 | struct semaphore async_sem; | 492 | struct semaphore async_sem; |
493 | u8 report_scan_result; | 493 | u8 report_scan_result; |
494 | struct cfg80211_scan_request *scan_request; | 494 | struct cfg80211_scan_request *scan_request; |
495 | struct mwifiex_user_scan_cfg *user_scan_cfg; | ||
496 | u8 cfg_bssid[6]; | 495 | u8 cfg_bssid[6]; |
497 | struct wps wps; | 496 | struct wps wps; |
498 | u8 scan_block; | 497 | u8 scan_block; |
@@ -510,6 +509,7 @@ struct mwifiex_private { | |||
510 | u8 ap_11ac_enabled; | 509 | u8 ap_11ac_enabled; |
511 | u32 mgmt_frame_mask; | 510 | u32 mgmt_frame_mask; |
512 | struct mwifiex_roc_cfg roc_cfg; | 511 | struct mwifiex_roc_cfg roc_cfg; |
512 | bool scan_aborting; | ||
513 | }; | 513 | }; |
514 | 514 | ||
515 | enum mwifiex_ba_status { | 515 | enum mwifiex_ba_status { |
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index 9cf5d8f07df8..7b2566b308c3 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c | |||
@@ -1784,22 +1784,16 @@ check_next_scan: | |||
1784 | if (priv->report_scan_result) | 1784 | if (priv->report_scan_result) |
1785 | priv->report_scan_result = false; | 1785 | priv->report_scan_result = false; |
1786 | 1786 | ||
1787 | if (priv->user_scan_cfg) { | 1787 | if (priv->scan_request) { |
1788 | if (priv->scan_request) { | 1788 | dev_dbg(adapter->dev, "info: notifying scan done\n"); |
1789 | dev_dbg(priv->adapter->dev, | 1789 | cfg80211_scan_done(priv->scan_request, 0); |
1790 | "info: notifying scan done\n"); | 1790 | priv->scan_request = NULL; |
1791 | cfg80211_scan_done(priv->scan_request, 0); | 1791 | } else { |
1792 | priv->scan_request = NULL; | 1792 | priv->scan_aborting = false; |
1793 | } else { | 1793 | dev_dbg(adapter->dev, "info: scan already aborted\n"); |
1794 | dev_dbg(priv->adapter->dev, | ||
1795 | "info: scan already aborted\n"); | ||
1796 | } | ||
1797 | |||
1798 | kfree(priv->user_scan_cfg); | ||
1799 | priv->user_scan_cfg = NULL; | ||
1800 | } | 1794 | } |
1801 | } else { | 1795 | } else { |
1802 | if (priv->user_scan_cfg && !priv->scan_request) { | 1796 | if (priv->scan_aborting && !priv->scan_request) { |
1803 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, | 1797 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, |
1804 | flags); | 1798 | flags); |
1805 | adapter->scan_delay_cnt = MWIFIEX_MAX_SCAN_DELAY_CNT; | 1799 | adapter->scan_delay_cnt = MWIFIEX_MAX_SCAN_DELAY_CNT; |