aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2014-06-25 15:15:14 -0400
committerJohn W. Linville <linville@tuxdriver.com>2014-06-25 15:26:36 -0400
commit855df36de365fb3b49eb06c352015e3d215b43fe (patch)
tree2a76f128eb457e1bacb585260b3e03f72b03cc1e /drivers
parentd6067f0e17eb1de7d9b1d792f67d17c6e894b770 (diff)
parent97dc94f1d933c9df2c0b327066ea130c0e92083f (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jberg/mac80211-next
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/at76c50x-usb.c3
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c3
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c3
-rw-r--r--drivers/net/wireless/cw1200/scan.c3
-rw-r--r--drivers/net/wireless/cw1200/scan.h2
-rw-r--r--drivers/net/wireless/iwlegacy/common.c3
-rw-r--r--drivers/net/wireless/iwlegacy/common.h2
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c5
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/scan.c27
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c69
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c3
-rw-r--r--drivers/net/wireless/ti/wl1251/main.c3
-rw-r--r--drivers/net/wireless/ti/wl12xx/scan.c20
-rw-r--r--drivers/net/wireless/ti/wl12xx/scan.h2
-rw-r--r--drivers/net/wireless/ti/wl18xx/scan.c16
-rw-r--r--drivers/net/wireless/ti/wl18xx/scan.h2
-rw-r--r--drivers/net/wireless/ti/wlcore/cmd.c11
-rw-r--r--drivers/net/wireless/ti/wlcore/cmd.h3
-rw-r--r--drivers/net/wireless/ti/wlcore/main.c5
-rw-r--r--drivers/net/wireless/ti/wlcore/scan.h2
-rw-r--r--drivers/net/wireless/ti/wlcore/wlcore.h2
23 files changed, 114 insertions, 80 deletions
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index d48776e4f343..334c2ece855a 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -1955,8 +1955,9 @@ static void at76_dwork_hw_scan(struct work_struct *work)
1955 1955
1956static int at76_hw_scan(struct ieee80211_hw *hw, 1956static int at76_hw_scan(struct ieee80211_hw *hw,
1957 struct ieee80211_vif *vif, 1957 struct ieee80211_vif *vif,
1958 struct cfg80211_scan_request *req) 1958 struct ieee80211_scan_request *hw_req)
1959{ 1959{
1960 struct cfg80211_scan_request *req = &hw_req->req;
1960 struct at76_priv *priv = hw->priv; 1961 struct at76_priv *priv = hw->priv;
1961 struct at76_req_scan scan; 1962 struct at76_req_scan scan;
1962 u8 *ssid = NULL; 1963 u8 *ssid = NULL;
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index a21080028c54..b8314a534972 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -3137,10 +3137,11 @@ exit:
3137 3137
3138static int ath10k_hw_scan(struct ieee80211_hw *hw, 3138static int ath10k_hw_scan(struct ieee80211_hw *hw,
3139 struct ieee80211_vif *vif, 3139 struct ieee80211_vif *vif,
3140 struct cfg80211_scan_request *req) 3140 struct ieee80211_scan_request *hw_req)
3141{ 3141{
3142 struct ath10k *ar = hw->priv; 3142 struct ath10k *ar = hw->priv;
3143 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 3143 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3144 struct cfg80211_scan_request *req = &hw_req->req;
3144 struct wmi_start_scan_arg arg; 3145 struct wmi_start_scan_arg arg;
3145 int ret = 0; 3146 int ret = 0;
3146 int i; 3147 int i;
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 83cb39efb636..f5727c7a53b8 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -2409,8 +2409,9 @@ void ath_offchannel_timer(unsigned long data)
2409} 2409}
2410 2410
2411static int ath9k_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 2411static int ath9k_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
2412 struct cfg80211_scan_request *req) 2412 struct ieee80211_scan_request *hw_req)
2413{ 2413{
2414 struct cfg80211_scan_request *req = &hw_req->req;
2414 struct ath_softc *sc = hw->priv; 2415 struct ath_softc *sc = hw->priv;
2415 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 2416 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2416 int ret = 0; 2417 int ret = 0;
diff --git a/drivers/net/wireless/cw1200/scan.c b/drivers/net/wireless/cw1200/scan.c
index 9afcd4ce3368..b2fb6c632092 100644
--- a/drivers/net/wireless/cw1200/scan.c
+++ b/drivers/net/wireless/cw1200/scan.c
@@ -53,9 +53,10 @@ static int cw1200_scan_start(struct cw1200_common *priv, struct wsm_scan *scan)
53 53
54int cw1200_hw_scan(struct ieee80211_hw *hw, 54int cw1200_hw_scan(struct ieee80211_hw *hw,
55 struct ieee80211_vif *vif, 55 struct ieee80211_vif *vif,
56 struct cfg80211_scan_request *req) 56 struct ieee80211_scan_request *hw_req)
57{ 57{
58 struct cw1200_common *priv = hw->priv; 58 struct cw1200_common *priv = hw->priv;
59 struct cfg80211_scan_request *req = &hw_req->req;
59 struct wsm_template_frame frame = { 60 struct wsm_template_frame frame = {
60 .frame_type = WSM_FRAME_TYPE_PROBE_REQUEST, 61 .frame_type = WSM_FRAME_TYPE_PROBE_REQUEST,
61 }; 62 };
diff --git a/drivers/net/wireless/cw1200/scan.h b/drivers/net/wireless/cw1200/scan.h
index 5a8296ccfa82..cc75459e5784 100644
--- a/drivers/net/wireless/cw1200/scan.h
+++ b/drivers/net/wireless/cw1200/scan.h
@@ -41,7 +41,7 @@ struct cw1200_scan {
41 41
42int cw1200_hw_scan(struct ieee80211_hw *hw, 42int cw1200_hw_scan(struct ieee80211_hw *hw,
43 struct ieee80211_vif *vif, 43 struct ieee80211_vif *vif,
44 struct cfg80211_scan_request *req); 44 struct ieee80211_scan_request *hw_req);
45void cw1200_scan_work(struct work_struct *work); 45void cw1200_scan_work(struct work_struct *work);
46void cw1200_scan_timeout(struct work_struct *work); 46void cw1200_scan_timeout(struct work_struct *work);
47void cw1200_clear_recent_scan_work(struct work_struct *work); 47void cw1200_clear_recent_scan_work(struct work_struct *work);
diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
index ecc674627e6e..03de7467aecf 100644
--- a/drivers/net/wireless/iwlegacy/common.c
+++ b/drivers/net/wireless/iwlegacy/common.c
@@ -1572,8 +1572,9 @@ il_scan_initiate(struct il_priv *il, struct ieee80211_vif *vif)
1572 1572
1573int 1573int
1574il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1574il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1575 struct cfg80211_scan_request *req) 1575 struct ieee80211_scan_request *hw_req)
1576{ 1576{
1577 struct cfg80211_scan_request *req = &hw_req->req;
1577 struct il_priv *il = hw->priv; 1578 struct il_priv *il = hw->priv;
1578 int ret; 1579 int ret;
1579 1580
diff --git a/drivers/net/wireless/iwlegacy/common.h b/drivers/net/wireless/iwlegacy/common.h
index ea5c0f863c4e..5b972798bdff 100644
--- a/drivers/net/wireless/iwlegacy/common.h
+++ b/drivers/net/wireless/iwlegacy/common.h
@@ -1787,7 +1787,7 @@ int il_scan_cancel(struct il_priv *il);
1787int il_scan_cancel_timeout(struct il_priv *il, unsigned long ms); 1787int il_scan_cancel_timeout(struct il_priv *il, unsigned long ms);
1788void il_force_scan_end(struct il_priv *il); 1788void il_force_scan_end(struct il_priv *il);
1789int il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1789int il_mac_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1790 struct cfg80211_scan_request *req); 1790 struct ieee80211_scan_request *hw_req);
1791void il_internal_short_hw_scan(struct il_priv *il); 1791void il_internal_short_hw_scan(struct il_priv *il);
1792int il_force_reset(struct il_priv *il, bool external); 1792int il_force_reset(struct il_priv *il, bool external);
1793u16 il_fill_probe_req(struct il_priv *il, struct ieee80211_mgmt *frame, 1793u16 il_fill_probe_req(struct il_priv *il, struct ieee80211_mgmt *frame,
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index 29af7b51e370..afb98f4fdaf3 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -1495,9 +1495,10 @@ static int iwlagn_mac_change_interface(struct ieee80211_hw *hw,
1495 1495
1496static int iwlagn_mac_hw_scan(struct ieee80211_hw *hw, 1496static int iwlagn_mac_hw_scan(struct ieee80211_hw *hw,
1497 struct ieee80211_vif *vif, 1497 struct ieee80211_vif *vif,
1498 struct cfg80211_scan_request *req) 1498 struct ieee80211_scan_request *hw_req)
1499{ 1499{
1500 struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw); 1500 struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1501 struct cfg80211_scan_request *req = &hw_req->req;
1501 int ret; 1502 int ret;
1502 1503
1503 IWL_DEBUG_MAC80211(priv, "enter\n"); 1504 IWL_DEBUG_MAC80211(priv, "enter\n");
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 7215f5980186..7dd363dd3ad3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -1537,9 +1537,10 @@ static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw,
1537 1537
1538static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw, 1538static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
1539 struct ieee80211_vif *vif, 1539 struct ieee80211_vif *vif,
1540 struct cfg80211_scan_request *req) 1540 struct ieee80211_scan_request *hw_req)
1541{ 1541{
1542 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1542 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1543 struct cfg80211_scan_request *req = &hw_req->req;
1543 int ret; 1544 int ret;
1544 1545
1545 if (req->n_channels == 0 || req->n_channels > MAX_NUM_SCAN_CHANNELS) 1546 if (req->n_channels == 0 || req->n_channels > MAX_NUM_SCAN_CHANNELS)
@@ -1827,7 +1828,7 @@ static void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw,
1827static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw, 1828static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
1828 struct ieee80211_vif *vif, 1829 struct ieee80211_vif *vif,
1829 struct cfg80211_sched_scan_request *req, 1830 struct cfg80211_sched_scan_request *req,
1830 struct ieee80211_sched_scan_ies *ies) 1831 struct ieee80211_scan_ies *ies)
1831{ 1832{
1832 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1833 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1833 int ret; 1834 int ret;
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index fcc6c29482d0..97630f9a7cb9 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -854,7 +854,7 @@ int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
854int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm, 854int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,
855 struct ieee80211_vif *vif, 855 struct ieee80211_vif *vif,
856 struct cfg80211_sched_scan_request *req, 856 struct cfg80211_sched_scan_request *req,
857 struct ieee80211_sched_scan_ies *ies); 857 struct ieee80211_scan_ies *ies);
858int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, 858int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
859 struct cfg80211_sched_scan_request *req); 859 struct cfg80211_sched_scan_request *req);
860int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm, 860int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index 4b6c7d4bd199..3206fa097255 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -204,7 +204,8 @@ static void iwl_mvm_scan_fill_channels(struct iwl_scan_cmd *cmd,
204 */ 204 */
205static u16 iwl_mvm_fill_probe_req(struct ieee80211_mgmt *frame, const u8 *ta, 205static u16 iwl_mvm_fill_probe_req(struct ieee80211_mgmt *frame, const u8 *ta,
206 int n_ssids, const u8 *ssid, int ssid_len, 206 int n_ssids, const u8 *ssid, int ssid_len,
207 const u8 *ie, int ie_len, 207 const u8 *band_ie, int band_ie_len,
208 const u8 *common_ie, int common_ie_len,
208 int left) 209 int left)
209{ 210{
210 int len = 0; 211 int len = 0;
@@ -244,12 +245,19 @@ static u16 iwl_mvm_fill_probe_req(struct ieee80211_mgmt *frame, const u8 *ta,
244 245
245 len += ssid_len + 2; 246 len += ssid_len + 2;
246 247
247 if (WARN_ON(left < ie_len)) 248 if (WARN_ON(left < band_ie_len + common_ie_len))
248 return len; 249 return len;
249 250
250 if (ie && ie_len) { 251 if (band_ie && band_ie_len) {
251 memcpy(pos, ie, ie_len); 252 memcpy(pos, band_ie, band_ie_len);
252 len += ie_len; 253 pos += band_ie_len;
254 len += band_ie_len;
255 }
256
257 if (common_ie && common_ie_len) {
258 memcpy(pos, common_ie, common_ie_len);
259 pos += common_ie_len;
260 len += common_ie_len;
253 } 261 }
254 262
255 return (u16)len; 263 return (u16)len;
@@ -382,7 +390,7 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
382 (struct ieee80211_mgmt *)cmd->data, 390 (struct ieee80211_mgmt *)cmd->data,
383 vif->addr, 391 vif->addr,
384 req->n_ssids, ssid, ssid_len, 392 req->n_ssids, ssid, ssid_len,
385 req->ie, req->ie_len, 393 req->ie, req->ie_len, NULL, 0,
386 mvm->fw->ucode_capa.max_probe_length)); 394 mvm->fw->ucode_capa.max_probe_length));
387 395
388 iwl_mvm_scan_fill_channels(cmd, req, basic_ssid, &params); 396 iwl_mvm_scan_fill_channels(cmd, req, basic_ssid, &params);
@@ -561,7 +569,7 @@ int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
561 569
562static void iwl_scan_offload_build_tx_cmd(struct iwl_mvm *mvm, 570static void iwl_scan_offload_build_tx_cmd(struct iwl_mvm *mvm,
563 struct ieee80211_vif *vif, 571 struct ieee80211_vif *vif,
564 struct ieee80211_sched_scan_ies *ies, 572 struct ieee80211_scan_ies *ies,
565 enum ieee80211_band band, 573 enum ieee80211_band band,
566 struct iwl_tx_cmd *cmd, 574 struct iwl_tx_cmd *cmd,
567 u8 *data) 575 u8 *data)
@@ -577,7 +585,8 @@ static void iwl_scan_offload_build_tx_cmd(struct iwl_mvm *mvm,
577 cmd_len = iwl_mvm_fill_probe_req((struct ieee80211_mgmt *)data, 585 cmd_len = iwl_mvm_fill_probe_req((struct ieee80211_mgmt *)data,
578 vif->addr, 586 vif->addr,
579 1, NULL, 0, 587 1, NULL, 0,
580 ies->ie[band], ies->len[band], 588 ies->ies[band], ies->len[band],
589 ies->common_ies, ies->common_ie_len,
581 SCAN_OFFLOAD_PROBE_REQ_SIZE); 590 SCAN_OFFLOAD_PROBE_REQ_SIZE);
582 cmd->len = cpu_to_le16(cmd_len); 591 cmd->len = cpu_to_le16(cmd_len);
583} 592}
@@ -735,7 +744,7 @@ static void iwl_build_channel_cfg(struct iwl_mvm *mvm,
735int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm, 744int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,
736 struct ieee80211_vif *vif, 745 struct ieee80211_vif *vif,
737 struct cfg80211_sched_scan_request *req, 746 struct cfg80211_sched_scan_request *req,
738 struct ieee80211_sched_scan_ies *ies) 747 struct ieee80211_scan_ies *ies)
739{ 748{
740 int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels; 749 int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels;
741 int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels; 750 int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels;
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index a312c653d116..eba51460a5de 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -781,6 +781,36 @@ static void mac80211_hwsim_monitor_ack(struct ieee80211_channel *chan,
781 netif_rx(skb); 781 netif_rx(skb);
782} 782}
783 783
784struct mac80211_hwsim_addr_match_data {
785 u8 addr[ETH_ALEN];
786 bool ret;
787};
788
789static void mac80211_hwsim_addr_iter(void *data, u8 *mac,
790 struct ieee80211_vif *vif)
791{
792 struct mac80211_hwsim_addr_match_data *md = data;
793
794 if (memcmp(mac, md->addr, ETH_ALEN) == 0)
795 md->ret = true;
796}
797
798static bool mac80211_hwsim_addr_match(struct mac80211_hwsim_data *data,
799 const u8 *addr)
800{
801 struct mac80211_hwsim_addr_match_data md = {
802 .ret = false,
803 };
804
805 memcpy(md.addr, addr, ETH_ALEN);
806
807 ieee80211_iterate_active_interfaces_atomic(data->hw,
808 IEEE80211_IFACE_ITER_NORMAL,
809 mac80211_hwsim_addr_iter,
810 &md);
811
812 return md.ret;
813}
784 814
785static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data, 815static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
786 struct sk_buff *skb) 816 struct sk_buff *skb)
@@ -798,8 +828,7 @@ static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
798 /* Allow unicast frames to own address if there is a pending 828 /* Allow unicast frames to own address if there is a pending
799 * PS-Poll */ 829 * PS-Poll */
800 if (data->ps_poll_pending && 830 if (data->ps_poll_pending &&
801 memcmp(data->hw->wiphy->perm_addr, skb->data + 4, 831 mac80211_hwsim_addr_match(data, skb->data + 4)) {
802 ETH_ALEN) == 0) {
803 data->ps_poll_pending = false; 832 data->ps_poll_pending = false;
804 return true; 833 return true;
805 } 834 }
@@ -809,39 +838,6 @@ static bool hwsim_ps_rx_ok(struct mac80211_hwsim_data *data,
809 return true; 838 return true;
810} 839}
811 840
812
813struct mac80211_hwsim_addr_match_data {
814 bool ret;
815 const u8 *addr;
816};
817
818static void mac80211_hwsim_addr_iter(void *data, u8 *mac,
819 struct ieee80211_vif *vif)
820{
821 struct mac80211_hwsim_addr_match_data *md = data;
822 if (memcmp(mac, md->addr, ETH_ALEN) == 0)
823 md->ret = true;
824}
825
826
827static bool mac80211_hwsim_addr_match(struct mac80211_hwsim_data *data,
828 const u8 *addr)
829{
830 struct mac80211_hwsim_addr_match_data md;
831
832 if (memcmp(addr, data->hw->wiphy->perm_addr, ETH_ALEN) == 0)
833 return true;
834
835 md.ret = false;
836 md.addr = addr;
837 ieee80211_iterate_active_interfaces_atomic(data->hw,
838 IEEE80211_IFACE_ITER_NORMAL,
839 mac80211_hwsim_addr_iter,
840 &md);
841
842 return md.ret;
843}
844
845static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw, 841static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
846 struct sk_buff *my_skb, 842 struct sk_buff *my_skb,
847 int dst_portid) 843 int dst_portid)
@@ -1740,9 +1736,10 @@ static void hw_scan_work(struct work_struct *work)
1740 1736
1741static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw, 1737static int mac80211_hwsim_hw_scan(struct ieee80211_hw *hw,
1742 struct ieee80211_vif *vif, 1738 struct ieee80211_vif *vif,
1743 struct cfg80211_scan_request *req) 1739 struct ieee80211_scan_request *hw_req)
1744{ 1740{
1745 struct mac80211_hwsim_data *hwsim = hw->priv; 1741 struct mac80211_hwsim_data *hwsim = hw->priv;
1742 struct cfg80211_scan_request *req = &hw_req->req;
1746 1743
1747 mutex_lock(&hwsim->mutex); 1744 mutex_lock(&hwsim->mutex);
1748 if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) { 1745 if (WARN_ON(hwsim->tmp_chan || hwsim->hw_scan_request)) {
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index 8e7b9c9696f6..e33a0347d3e2 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -2609,7 +2609,8 @@ static int
2609mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev, 2609mwifiex_cfg80211_tdls_mgmt(struct wiphy *wiphy, struct net_device *dev,
2610 const u8 *peer, u8 action_code, u8 dialog_token, 2610 const u8 *peer, u8 action_code, u8 dialog_token,
2611 u16 status_code, u32 peer_capability, 2611 u16 status_code, u32 peer_capability,
2612 const u8 *extra_ies, size_t extra_ies_len) 2612 bool initiator, const u8 *extra_ies,
2613 size_t extra_ies_len)
2613{ 2614{
2614 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); 2615 struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev);
2615 int ret; 2616 int ret;
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index 4e782f18ae34..38234851457e 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -991,8 +991,9 @@ out:
991 991
992static int wl1251_op_hw_scan(struct ieee80211_hw *hw, 992static int wl1251_op_hw_scan(struct ieee80211_hw *hw,
993 struct ieee80211_vif *vif, 993 struct ieee80211_vif *vif,
994 struct cfg80211_scan_request *req) 994 struct ieee80211_scan_request *hw_req)
995{ 995{
996 struct cfg80211_scan_request *req = &hw_req->req;
996 struct wl1251 *wl = hw->priv; 997 struct wl1251 *wl = hw->priv;
997 struct sk_buff *skb; 998 struct sk_buff *skb;
998 size_t ssid_len = 0; 999 size_t ssid_len = 0;
diff --git a/drivers/net/wireless/ti/wl12xx/scan.c b/drivers/net/wireless/ti/wl12xx/scan.c
index 7541bd1a4a4b..0c0d5cd98514 100644
--- a/drivers/net/wireless/ti/wl12xx/scan.c
+++ b/drivers/net/wireless/ti/wl12xx/scan.c
@@ -156,7 +156,7 @@ static int wl1271_scan_send(struct wl1271 *wl, struct wl12xx_vif *wlvif,
156 cmd->params.role_id, band, 156 cmd->params.role_id, band,
157 wl->scan.ssid, wl->scan.ssid_len, 157 wl->scan.ssid, wl->scan.ssid_len,
158 wl->scan.req->ie, 158 wl->scan.req->ie,
159 wl->scan.req->ie_len, false); 159 wl->scan.req->ie_len, NULL, 0, false);
160 if (ret < 0) { 160 if (ret < 0) {
161 wl1271_error("PROBE request template failed"); 161 wl1271_error("PROBE request template failed");
162 goto out; 162 goto out;
@@ -317,7 +317,7 @@ static void wl12xx_adjust_channels(struct wl1271_cmd_sched_scan_config *cmd,
317int wl1271_scan_sched_scan_config(struct wl1271 *wl, 317int wl1271_scan_sched_scan_config(struct wl1271 *wl,
318 struct wl12xx_vif *wlvif, 318 struct wl12xx_vif *wlvif,
319 struct cfg80211_sched_scan_request *req, 319 struct cfg80211_sched_scan_request *req,
320 struct ieee80211_sched_scan_ies *ies) 320 struct ieee80211_scan_ies *ies)
321{ 321{
322 struct wl1271_cmd_sched_scan_config *cfg = NULL; 322 struct wl1271_cmd_sched_scan_config *cfg = NULL;
323 struct wlcore_scan_channels *cfg_channels = NULL; 323 struct wlcore_scan_channels *cfg_channels = NULL;
@@ -378,8 +378,11 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
378 wlvif->role_id, band, 378 wlvif->role_id, band,
379 req->ssids[0].ssid, 379 req->ssids[0].ssid,
380 req->ssids[0].ssid_len, 380 req->ssids[0].ssid_len,
381 ies->ie[band], 381 ies->ies[band],
382 ies->len[band], true); 382 ies->len[band],
383 ies->common_ies,
384 ies->common_ie_len,
385 true);
383 if (ret < 0) { 386 if (ret < 0) {
384 wl1271_error("2.4GHz PROBE request template failed"); 387 wl1271_error("2.4GHz PROBE request template failed");
385 goto out; 388 goto out;
@@ -392,8 +395,11 @@ int wl1271_scan_sched_scan_config(struct wl1271 *wl,
392 wlvif->role_id, band, 395 wlvif->role_id, band,
393 req->ssids[0].ssid, 396 req->ssids[0].ssid,
394 req->ssids[0].ssid_len, 397 req->ssids[0].ssid_len,
395 ies->ie[band], 398 ies->ies[band],
396 ies->len[band], true); 399 ies->len[band],
400 ies->common_ies,
401 ies->common_ie_len,
402 true);
397 if (ret < 0) { 403 if (ret < 0) {
398 wl1271_error("5GHz PROBE request template failed"); 404 wl1271_error("5GHz PROBE request template failed");
399 goto out; 405 goto out;
@@ -449,7 +455,7 @@ out_free:
449 455
450int wl12xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 456int wl12xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
451 struct cfg80211_sched_scan_request *req, 457 struct cfg80211_sched_scan_request *req,
452 struct ieee80211_sched_scan_ies *ies) 458 struct ieee80211_scan_ies *ies)
453{ 459{
454 int ret; 460 int ret;
455 461
diff --git a/drivers/net/wireless/ti/wl12xx/scan.h b/drivers/net/wireless/ti/wl12xx/scan.h
index 264af7ac2785..427f9af85a00 100644
--- a/drivers/net/wireless/ti/wl12xx/scan.h
+++ b/drivers/net/wireless/ti/wl12xx/scan.h
@@ -135,6 +135,6 @@ int wl12xx_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
135void wl12xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif); 135void wl12xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif);
136int wl12xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 136int wl12xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
137 struct cfg80211_sched_scan_request *req, 137 struct cfg80211_sched_scan_request *req,
138 struct ieee80211_sched_scan_ies *ies); 138 struct ieee80211_scan_ies *ies);
139void wl12xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif); 139void wl12xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
140#endif 140#endif
diff --git a/drivers/net/wireless/ti/wl18xx/scan.c b/drivers/net/wireless/ti/wl18xx/scan.c
index 2b642f8c9266..98666f235a12 100644
--- a/drivers/net/wireless/ti/wl18xx/scan.c
+++ b/drivers/net/wireless/ti/wl18xx/scan.c
@@ -113,6 +113,8 @@ static int wl18xx_scan_send(struct wl1271 *wl, struct wl12xx_vif *wlvif,
113 req->ssids ? req->ssids[0].ssid_len : 0, 113 req->ssids ? req->ssids[0].ssid_len : 0,
114 req->ie, 114 req->ie,
115 req->ie_len, 115 req->ie_len,
116 NULL,
117 0,
116 false); 118 false);
117 if (ret < 0) { 119 if (ret < 0) {
118 wl1271_error("2.4GHz PROBE request template failed"); 120 wl1271_error("2.4GHz PROBE request template failed");
@@ -128,6 +130,8 @@ static int wl18xx_scan_send(struct wl1271 *wl, struct wl12xx_vif *wlvif,
128 req->ssids ? req->ssids[0].ssid_len : 0, 130 req->ssids ? req->ssids[0].ssid_len : 0,
129 req->ie, 131 req->ie,
130 req->ie_len, 132 req->ie_len,
133 NULL,
134 0,
131 false); 135 false);
132 if (ret < 0) { 136 if (ret < 0) {
133 wl1271_error("5GHz PROBE request template failed"); 137 wl1271_error("5GHz PROBE request template failed");
@@ -161,7 +165,7 @@ static
161int wl18xx_scan_sched_scan_config(struct wl1271 *wl, 165int wl18xx_scan_sched_scan_config(struct wl1271 *wl,
162 struct wl12xx_vif *wlvif, 166 struct wl12xx_vif *wlvif,
163 struct cfg80211_sched_scan_request *req, 167 struct cfg80211_sched_scan_request *req,
164 struct ieee80211_sched_scan_ies *ies) 168 struct ieee80211_scan_ies *ies)
165{ 169{
166 struct wl18xx_cmd_scan_params *cmd; 170 struct wl18xx_cmd_scan_params *cmd;
167 struct wlcore_scan_channels *cmd_channels = NULL; 171 struct wlcore_scan_channels *cmd_channels = NULL;
@@ -237,8 +241,10 @@ int wl18xx_scan_sched_scan_config(struct wl1271 *wl,
237 cmd->role_id, band, 241 cmd->role_id, band,
238 req->ssids ? req->ssids[0].ssid : NULL, 242 req->ssids ? req->ssids[0].ssid : NULL,
239 req->ssids ? req->ssids[0].ssid_len : 0, 243 req->ssids ? req->ssids[0].ssid_len : 0,
240 ies->ie[band], 244 ies->ies[band],
241 ies->len[band], 245 ies->len[band],
246 ies->common_ies,
247 ies->common_ie_len,
242 true); 248 true);
243 if (ret < 0) { 249 if (ret < 0) {
244 wl1271_error("2.4GHz PROBE request template failed"); 250 wl1271_error("2.4GHz PROBE request template failed");
@@ -252,8 +258,10 @@ int wl18xx_scan_sched_scan_config(struct wl1271 *wl,
252 cmd->role_id, band, 258 cmd->role_id, band,
253 req->ssids ? req->ssids[0].ssid : NULL, 259 req->ssids ? req->ssids[0].ssid : NULL,
254 req->ssids ? req->ssids[0].ssid_len : 0, 260 req->ssids ? req->ssids[0].ssid_len : 0,
255 ies->ie[band], 261 ies->ies[band],
256 ies->len[band], 262 ies->len[band],
263 ies->common_ies,
264 ies->common_ie_len,
257 true); 265 true);
258 if (ret < 0) { 266 if (ret < 0) {
259 wl1271_error("5GHz PROBE request template failed"); 267 wl1271_error("5GHz PROBE request template failed");
@@ -277,7 +285,7 @@ out:
277 285
278int wl18xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 286int wl18xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
279 struct cfg80211_sched_scan_request *req, 287 struct cfg80211_sched_scan_request *req,
280 struct ieee80211_sched_scan_ies *ies) 288 struct ieee80211_scan_ies *ies)
281{ 289{
282 return wl18xx_scan_sched_scan_config(wl, wlvif, req, ies); 290 return wl18xx_scan_sched_scan_config(wl, wlvif, req, ies);
283} 291}
diff --git a/drivers/net/wireless/ti/wl18xx/scan.h b/drivers/net/wireless/ti/wl18xx/scan.h
index eadee42689d1..2e636aa5dba9 100644
--- a/drivers/net/wireless/ti/wl18xx/scan.h
+++ b/drivers/net/wireless/ti/wl18xx/scan.h
@@ -122,6 +122,6 @@ int wl18xx_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
122void wl18xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif); 122void wl18xx_scan_completed(struct wl1271 *wl, struct wl12xx_vif *wlvif);
123int wl18xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif, 123int wl18xx_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif,
124 struct cfg80211_sched_scan_request *req, 124 struct cfg80211_sched_scan_request *req,
125 struct ieee80211_sched_scan_ies *ies); 125 struct ieee80211_scan_ies *ies);
126void wl18xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif); 126void wl18xx_scan_sched_scan_stop(struct wl1271 *wl, struct wl12xx_vif *wlvif);
127#endif 127#endif
diff --git a/drivers/net/wireless/ti/wlcore/cmd.c b/drivers/net/wireless/ti/wlcore/cmd.c
index 40dc30f4faaa..e269c0a57017 100644
--- a/drivers/net/wireless/ti/wlcore/cmd.c
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
@@ -1124,7 +1124,8 @@ out:
1124int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif, 1124int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1125 u8 role_id, u8 band, 1125 u8 role_id, u8 band,
1126 const u8 *ssid, size_t ssid_len, 1126 const u8 *ssid, size_t ssid_len,
1127 const u8 *ie, size_t ie_len, bool sched_scan) 1127 const u8 *ie0, size_t ie0_len, const u8 *ie1,
1128 size_t ie1_len, bool sched_scan)
1128{ 1129{
1129 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif); 1130 struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
1130 struct sk_buff *skb; 1131 struct sk_buff *skb;
@@ -1136,13 +1137,15 @@ int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
1136 wl1271_debug(DEBUG_SCAN, "build probe request band %d", band); 1137 wl1271_debug(DEBUG_SCAN, "build probe request band %d", band);
1137 1138
1138 skb = ieee80211_probereq_get(wl->hw, vif, ssid, ssid_len, 1139 skb = ieee80211_probereq_get(wl->hw, vif, ssid, ssid_len,
1139 ie_len); 1140 ie0_len + ie1_len);
1140 if (!skb) { 1141 if (!skb) {
1141 ret = -ENOMEM; 1142 ret = -ENOMEM;
1142 goto out; 1143 goto out;
1143 } 1144 }
1144 if (ie_len) 1145 if (ie0_len)
1145 memcpy(skb_put(skb, ie_len), ie, ie_len); 1146 memcpy(skb_put(skb, ie0_len), ie0, ie0_len);
1147 if (ie1_len)
1148 memcpy(skb_put(skb, ie1_len), ie1, ie1_len);
1146 1149
1147 if (sched_scan && 1150 if (sched_scan &&
1148 (wl->quirks & WLCORE_QUIRK_DUAL_PROBE_TMPL)) { 1151 (wl->quirks & WLCORE_QUIRK_DUAL_PROBE_TMPL)) {
diff --git a/drivers/net/wireless/ti/wlcore/cmd.h b/drivers/net/wireless/ti/wlcore/cmd.h
index b084830a61cf..6788d7356ca5 100644
--- a/drivers/net/wireless/ti/wlcore/cmd.h
+++ b/drivers/net/wireless/ti/wlcore/cmd.h
@@ -64,7 +64,8 @@ int wl1271_cmd_build_ps_poll(struct wl1271 *wl, struct wl12xx_vif *wlvif,
64int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif, 64int wl12xx_cmd_build_probe_req(struct wl1271 *wl, struct wl12xx_vif *wlvif,
65 u8 role_id, u8 band, 65 u8 role_id, u8 band,
66 const u8 *ssid, size_t ssid_len, 66 const u8 *ssid, size_t ssid_len,
67 const u8 *ie, size_t ie_len, bool sched_scan); 67 const u8 *ie, size_t ie_len, const u8 *common_ie,
68 size_t common_ie_len, bool sched_scan);
68struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl, 69struct sk_buff *wl1271_cmd_build_ap_probe_req(struct wl1271 *wl,
69 struct wl12xx_vif *wlvif, 70 struct wl12xx_vif *wlvif,
70 struct sk_buff *skb); 71 struct sk_buff *skb);
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index 3d6028e62750..48f83868f9cb 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -3540,8 +3540,9 @@ out:
3540 3540
3541static int wl1271_op_hw_scan(struct ieee80211_hw *hw, 3541static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
3542 struct ieee80211_vif *vif, 3542 struct ieee80211_vif *vif,
3543 struct cfg80211_scan_request *req) 3543 struct ieee80211_scan_request *hw_req)
3544{ 3544{
3545 struct cfg80211_scan_request *req = &hw_req->req;
3545 struct wl1271 *wl = hw->priv; 3546 struct wl1271 *wl = hw->priv;
3546 int ret; 3547 int ret;
3547 u8 *ssid = NULL; 3548 u8 *ssid = NULL;
@@ -3636,7 +3637,7 @@ out:
3636static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw, 3637static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
3637 struct ieee80211_vif *vif, 3638 struct ieee80211_vif *vif,
3638 struct cfg80211_sched_scan_request *req, 3639 struct cfg80211_sched_scan_request *req,
3639 struct ieee80211_sched_scan_ies *ies) 3640 struct ieee80211_scan_ies *ies)
3640{ 3641{
3641 struct wl1271 *wl = hw->priv; 3642 struct wl1271 *wl = hw->priv;
3642 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif); 3643 struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
diff --git a/drivers/net/wireless/ti/wlcore/scan.h b/drivers/net/wireless/ti/wlcore/scan.h
index a6ab24b5c0f9..4dadd0c62cde 100644
--- a/drivers/net/wireless/ti/wlcore/scan.h
+++ b/drivers/net/wireless/ti/wlcore/scan.h
@@ -37,7 +37,7 @@ void wl1271_scan_complete_work(struct work_struct *work);
37int wl1271_scan_sched_scan_config(struct wl1271 *wl, 37int wl1271_scan_sched_scan_config(struct wl1271 *wl,
38 struct wl12xx_vif *wlvif, 38 struct wl12xx_vif *wlvif,
39 struct cfg80211_sched_scan_request *req, 39 struct cfg80211_sched_scan_request *req,
40 struct ieee80211_sched_scan_ies *ies); 40 struct ieee80211_scan_ies *ies);
41int wl1271_scan_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif); 41int wl1271_scan_sched_scan_start(struct wl1271 *wl, struct wl12xx_vif *wlvif);
42void wlcore_scan_sched_scan_results(struct wl1271 *wl); 42void wlcore_scan_sched_scan_results(struct wl1271 *wl);
43 43
diff --git a/drivers/net/wireless/ti/wlcore/wlcore.h b/drivers/net/wireless/ti/wlcore/wlcore.h
index 95a54504f0cc..71320509b56d 100644
--- a/drivers/net/wireless/ti/wlcore/wlcore.h
+++ b/drivers/net/wireless/ti/wlcore/wlcore.h
@@ -95,7 +95,7 @@ struct wlcore_ops {
95 int (*scan_stop)(struct wl1271 *wl, struct wl12xx_vif *wlvif); 95 int (*scan_stop)(struct wl1271 *wl, struct wl12xx_vif *wlvif);
96 int (*sched_scan_start)(struct wl1271 *wl, struct wl12xx_vif *wlvif, 96 int (*sched_scan_start)(struct wl1271 *wl, struct wl12xx_vif *wlvif,
97 struct cfg80211_sched_scan_request *req, 97 struct cfg80211_sched_scan_request *req,
98 struct ieee80211_sched_scan_ies *ies); 98 struct ieee80211_scan_ies *ies);
99 void (*sched_scan_stop)(struct wl1271 *wl, struct wl12xx_vif *wlvif); 99 void (*sched_scan_stop)(struct wl1271 *wl, struct wl12xx_vif *wlvif);
100 int (*get_spare_blocks)(struct wl1271 *wl, bool is_gem); 100 int (*get_spare_blocks)(struct wl1271 *wl, bool is_gem);
101 int (*set_key)(struct wl1271 *wl, enum set_key_cmd cmd, 101 int (*set_key)(struct wl1271 *wl, enum set_key_cmd cmd,