aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJohn W. Linville <linville@tuxdriver.com>2014-01-17 14:43:17 -0500
committerJohn W. Linville <linville@tuxdriver.com>2014-01-17 14:43:17 -0500
commit7916a075571f0ccd0830cf3da293188a8b6045e3 (patch)
tree119c5bb9e513c8205efed485c2dc7b8271123326
parentcf84eb0b09c0f09b4c70a648b9dfeec78be61f07 (diff)
parente4e19c031901e95dc7d1cf0a2c9c50525d71651f (diff)
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next into for-davem
-rw-r--r--drivers/net/wireless/adm8211.c1
-rw-r--r--drivers/net/wireless/at76c50x-usb.c1
-rw-r--r--drivers/net/wireless/ath/ath.h2
-rw-r--r--drivers/net/wireless/ath/ath10k/Kconfig7
-rw-r--r--drivers/net/wireless/ath/ath10k/core.h11
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.c66
-rw-r--r--drivers/net/wireless/ath/ath10k/htt.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/htt_rx.c15
-rw-r--r--drivers/net/wireless/ath/ath10k/hw.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c375
-rw-r--r--drivers/net/wireless/ath/ath10k/trace.h21
-rw-r--r--drivers/net/wireless/ath/ath10k/txrx.c2
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c106
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.h61
-rw-r--r--drivers/net/wireless/ath/ath5k/base.c34
-rw-r--r--drivers/net/wireless/ath/ath9k/Kconfig8
-rw-r--r--drivers/net/wireless/ath/ath9k/Makefile2
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_calib.c19
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h10
-rw-r--r--drivers/net/wireless/ath/ath9k/debug.c197
-rw-r--r--drivers/net/wireless/ath/ath9k/debug.h35
-rw-r--r--drivers/net/wireless/ath/ath9k/debug_sta.c269
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_init.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_txrx.c4
-rw-r--r--drivers/net/wireless/ath/ath9k/init.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c40
-rw-r--r--drivers/net/wireless/ath/ath9k/recv.c22
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c2
-rw-r--r--drivers/net/wireless/ath/carl9170/main.c12
-rw-r--r--drivers/net/wireless/ath/carl9170/rx.c9
-rw-r--r--drivers/net/wireless/ath/main.c8
-rw-r--r--drivers/net/wireless/ath/regd.c7
-rw-r--r--drivers/net/wireless/ath/wil6210/txrx.c2
-rw-r--r--drivers/net/wireless/b43/b43.h4
-rw-r--r--drivers/net/wireless/b43/main.c27
-rw-r--r--drivers/net/wireless/b43legacy/main.c1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/Makefile1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c40
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h21
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c4
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c339
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/nvram.c94
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/nvram.h24
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c593
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h31
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/usb.c4
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c1
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c1
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/main.c2
-rw-r--r--drivers/net/wireless/cw1200/main.c1
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c3
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/rx.c7
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/ucode.c7
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-nvm-parse.c9
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-prph.h4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h10
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/d3.c15
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs.c2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-sta.h3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c28
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/nvm.c13
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c13
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/time-event.c4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/tx.c9
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/utils.c4
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/rx.c2
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c22
-rw-r--r--drivers/net/wireless/libertas/cfg.c7
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c1246
-rw-r--r--drivers/net/wireless/mac80211_hwsim.h18
-rw-r--r--drivers/net/wireless/mwifiex/Kconfig4
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c14
-rw-r--r--drivers/net/wireless/mwifiex/fw.h2
-rw-r--r--drivers/net/wireless/mwifiex/scan.c4
-rw-r--r--drivers/net/wireless/mwifiex/usb.c54
-rw-r--r--drivers/net/wireless/mwifiex/usb.h12
-rw-r--r--drivers/net/wireless/mwl8k.c2
-rw-r--r--drivers/net/wireless/p54/main.c1
-rw-r--r--drivers/net/wireless/p54/txrx.c2
-rw-r--r--drivers/net/wireless/rtlwifi/base.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/sw.c1
-rw-r--r--drivers/net/wireless/ti/wl1251/main.c1
-rw-r--r--drivers/net/wireless/ti/wlcore/main.c11
-rw-r--r--drivers/nfc/Kconfig1
-rw-r--r--drivers/nfc/Makefile1
-rw-r--r--drivers/nfc/mei_phy.c2
-rw-r--r--drivers/nfc/nfcmrvl/Kconfig23
-rw-r--r--drivers/nfc/nfcmrvl/Makefile9
-rw-r--r--drivers/nfc/nfcmrvl/main.c165
-rw-r--r--drivers/nfc/nfcmrvl/nfcmrvl.h48
-rw-r--r--drivers/nfc/nfcmrvl/usb.c459
-rw-r--r--drivers/nfc/pn533.c3
-rw-r--r--drivers/nfc/pn544/pn544.c48
-rw-r--r--drivers/nfc/port100.c1
-rw-r--r--drivers/staging/winbond/wbusb.c1
-rw-r--r--include/linux/ieee80211.h2
-rw-r--r--include/net/cfg80211.h8
-rw-r--r--include/net/mac80211.h8
-rw-r--r--include/net/nfc/digital.h10
-rw-r--r--include/net/nfc/nci_core.h2
-rw-r--r--include/net/regulatory.h4
-rw-r--r--net/mac80211/cfg.c3
-rw-r--r--net/mac80211/debugfs_netdev.c61
-rw-r--r--net/mac80211/ht.c5
-rw-r--r--net/mac80211/ieee80211_i.h2
-rw-r--r--net/mac80211/main.c22
-rw-r--r--net/mac80211/mesh.c1
-rw-r--r--net/mac80211/mesh_plink.c1
-rw-r--r--net/mac80211/rx.c40
-rw-r--r--net/mac80211/sta_info.c238
-rw-r--r--net/mac80211/trace.h27
-rw-r--r--net/mac80211/tx.c2
-rw-r--r--net/mac80211/util.c41
-rw-r--r--net/mac80211/wpa.c2
-rw-r--r--net/nfc/core.c7
-rw-r--r--net/nfc/digital_core.c28
-rw-r--r--net/nfc/digital_dep.c54
-rw-r--r--net/nfc/hci/core.c7
-rw-r--r--net/nfc/llcp_commands.c6
-rw-r--r--net/nfc/llcp_core.c1
-rw-r--r--net/nfc/llcp_sock.c1
-rw-r--r--net/nfc/nci/core.c27
-rw-r--r--net/wireless/nl80211.c111
-rw-r--r--net/wireless/reg.c2
-rw-r--r--net/wireless/scan.c7
-rw-r--r--net/wireless/sme.c13
-rw-r--r--net/wireless/util.c15
-rw-r--r--net/wireless/wext-compat.c6
129 files changed, 3808 insertions, 1794 deletions
diff --git a/drivers/net/wireless/adm8211.c b/drivers/net/wireless/adm8211.c
index 55eda7afc041..f35f93c31b09 100644
--- a/drivers/net/wireless/adm8211.c
+++ b/drivers/net/wireless/adm8211.c
@@ -1865,7 +1865,6 @@ static int adm8211_probe(struct pci_dev *pdev,
1865 dev->flags = IEEE80211_HW_SIGNAL_UNSPEC; 1865 dev->flags = IEEE80211_HW_SIGNAL_UNSPEC;
1866 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); 1866 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
1867 1867
1868 dev->channel_change_time = 1000;
1869 dev->max_signal = 100; /* FIXME: find better value */ 1868 dev->max_signal = 100; /* FIXME: find better value */
1870 1869
1871 dev->queues = 1; /* ADM8211C supports more, maybe ADM8211B too */ 1870 dev->queues = 1; /* ADM8211C supports more, maybe ADM8211B too */
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index 031d4ec64779..99b3bfa717d5 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -2112,7 +2112,6 @@ static struct at76_priv *at76_alloc_new_device(struct usb_device *udev)
2112 priv->pm_period = 0; 2112 priv->pm_period = 0;
2113 2113
2114 /* unit us */ 2114 /* unit us */
2115 priv->hw->channel_change_time = 100000;
2116 2115
2117 return priv; 2116 return priv;
2118} 2117}
diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h
index e0ba7cd14252..b59cfbe0276b 100644
--- a/drivers/net/wireless/ath/ath.h
+++ b/drivers/net/wireless/ath/ath.h
@@ -17,6 +17,7 @@
17#ifndef ATH_H 17#ifndef ATH_H
18#define ATH_H 18#define ATH_H
19 19
20#include <linux/etherdevice.h>
20#include <linux/skbuff.h> 21#include <linux/skbuff.h>
21#include <linux/if_ether.h> 22#include <linux/if_ether.h>
22#include <linux/spinlock.h> 23#include <linux/spinlock.h>
@@ -165,6 +166,7 @@ struct ath_common {
165struct sk_buff *ath_rxbuf_alloc(struct ath_common *common, 166struct sk_buff *ath_rxbuf_alloc(struct ath_common *common,
166 u32 len, 167 u32 len,
167 gfp_t gfp_mask); 168 gfp_t gfp_mask);
169bool ath_is_mybeacon(struct ath_common *common, struct ieee80211_hdr *hdr);
168 170
169void ath_hw_setbssidmask(struct ath_common *common); 171void ath_hw_setbssidmask(struct ath_common *common);
170void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key); 172void ath_key_delete(struct ath_common *common, struct ieee80211_key_conf *key);
diff --git a/drivers/net/wireless/ath/ath10k/Kconfig b/drivers/net/wireless/ath/ath10k/Kconfig
index 82e8088ca9b4..a6f5285235af 100644
--- a/drivers/net/wireless/ath/ath10k/Kconfig
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
@@ -37,3 +37,10 @@ config ATH10K_TRACING
37 ---help--- 37 ---help---
38 Select this to ath10k use tracing infrastructure. 38 Select this to ath10k use tracing infrastructure.
39 39
40config ATH10K_DFS_CERTIFIED
41 bool "Atheros DFS support for certified platforms"
42 depends on ATH10K && CFG80211_CERTIFICATION_ONUS
43 default n
44 ---help---
45 This option enables DFS support for initiating radiation on
46 ath10k.
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 79726e0fe2f0..ade1781c7186 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -253,6 +253,9 @@ struct ath10k_vif {
253 u8 bssid[ETH_ALEN]; 253 u8 bssid[ETH_ALEN];
254 } ibss; 254 } ibss;
255 } u; 255 } u;
256
257 u8 fixed_rate;
258 u8 fixed_nss;
256}; 259};
257 260
258struct ath10k_vif_iter { 261struct ath10k_vif_iter {
@@ -272,6 +275,8 @@ struct ath10k_debug {
272 struct delayed_work htt_stats_dwork; 275 struct delayed_work htt_stats_dwork;
273 struct ath10k_dfs_stats dfs_stats; 276 struct ath10k_dfs_stats dfs_stats;
274 struct ath_dfs_pool_stats dfs_pool_stats; 277 struct ath_dfs_pool_stats dfs_pool_stats;
278
279 u32 fw_dbglog_mask;
275}; 280};
276 281
277enum ath10k_state { 282enum ath10k_state {
@@ -306,6 +311,9 @@ enum ath10k_fw_features {
306 /* firmware support tx frame management over WMI, otherwise it's HTT */ 311 /* firmware support tx frame management over WMI, otherwise it's HTT */
307 ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX = 2, 312 ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX = 2,
308 313
314 /* Firmware does not support P2P */
315 ATH10K_FW_FEATURE_NO_P2P = 3,
316
309 /* keep last */ 317 /* keep last */
310 ATH10K_FW_FEATURE_COUNT, 318 ATH10K_FW_FEATURE_COUNT,
311}; 319};
@@ -429,6 +437,9 @@ struct ath10k {
429 struct list_head peers; 437 struct list_head peers;
430 wait_queue_head_t peer_mapping_wq; 438 wait_queue_head_t peer_mapping_wq;
431 439
440 /* number of created peers; protected by data_lock */
441 int num_peers;
442
432 struct work_struct offchan_tx_work; 443 struct work_struct offchan_tx_work;
433 struct sk_buff_head offchan_tx_queue; 444 struct sk_buff_head offchan_tx_queue;
434 struct completion offchan_tx_completed; 445 struct completion offchan_tx_completed;
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index 6bdfad3144af..6debd281350a 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -614,6 +614,61 @@ static const struct file_operations fops_htt_stats_mask = {
614 .llseek = default_llseek, 614 .llseek = default_llseek,
615}; 615};
616 616
617static ssize_t ath10k_read_fw_dbglog(struct file *file,
618 char __user *user_buf,
619 size_t count, loff_t *ppos)
620{
621 struct ath10k *ar = file->private_data;
622 unsigned int len;
623 char buf[32];
624
625 len = scnprintf(buf, sizeof(buf), "0x%08x\n",
626 ar->debug.fw_dbglog_mask);
627
628 return simple_read_from_buffer(user_buf, count, ppos, buf, len);
629}
630
631static ssize_t ath10k_write_fw_dbglog(struct file *file,
632 const char __user *user_buf,
633 size_t count, loff_t *ppos)
634{
635 struct ath10k *ar = file->private_data;
636 unsigned long mask;
637 int ret;
638
639 ret = kstrtoul_from_user(user_buf, count, 0, &mask);
640 if (ret)
641 return ret;
642
643 mutex_lock(&ar->conf_mutex);
644
645 ar->debug.fw_dbglog_mask = mask;
646
647 if (ar->state == ATH10K_STATE_ON) {
648 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask);
649 if (ret) {
650 ath10k_warn("dbglog cfg failed from debugfs: %d\n",
651 ret);
652 goto exit;
653 }
654 }
655
656 ret = count;
657
658exit:
659 mutex_unlock(&ar->conf_mutex);
660
661 return ret;
662}
663
664static const struct file_operations fops_fw_dbglog = {
665 .read = ath10k_read_fw_dbglog,
666 .write = ath10k_write_fw_dbglog,
667 .open = simple_open,
668 .owner = THIS_MODULE,
669 .llseek = default_llseek,
670};
671
617int ath10k_debug_start(struct ath10k *ar) 672int ath10k_debug_start(struct ath10k *ar)
618{ 673{
619 int ret; 674 int ret;
@@ -625,6 +680,14 @@ int ath10k_debug_start(struct ath10k *ar)
625 /* continue normally anyway, this isn't serious */ 680 /* continue normally anyway, this isn't serious */
626 ath10k_warn("failed to start htt stats workqueue: %d\n", ret); 681 ath10k_warn("failed to start htt stats workqueue: %d\n", ret);
627 682
683 if (ar->debug.fw_dbglog_mask) {
684 ret = ath10k_wmi_dbglog_cfg(ar, ar->debug.fw_dbglog_mask);
685 if (ret)
686 /* not serious */
687 ath10k_warn("failed to enable dbglog during start: %d",
688 ret);
689 }
690
628 return 0; 691 return 0;
629} 692}
630 693
@@ -747,6 +810,9 @@ int ath10k_debug_create(struct ath10k *ar)
747 debugfs_create_file("htt_stats_mask", S_IRUSR, ar->debug.debugfs_phy, 810 debugfs_create_file("htt_stats_mask", S_IRUSR, ar->debug.debugfs_phy,
748 ar, &fops_htt_stats_mask); 811 ar, &fops_htt_stats_mask);
749 812
813 debugfs_create_file("fw_dbglog", S_IRUSR, ar->debug.debugfs_phy,
814 ar, &fops_fw_dbglog);
815
750 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) { 816 if (config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)) {
751 debugfs_create_file("dfs_simulate_radar", S_IWUSR, 817 debugfs_create_file("dfs_simulate_radar", S_IWUSR,
752 ar->debug.debugfs_phy, ar, 818 ar->debug.debugfs_phy, ar,
diff --git a/drivers/net/wireless/ath/ath10k/htt.h b/drivers/net/wireless/ath/ath10k/htt.h
index 7fc7919ea5f5..b93ae355bc08 100644
--- a/drivers/net/wireless/ath/ath10k/htt.h
+++ b/drivers/net/wireless/ath/ath10k/htt.h
@@ -1183,6 +1183,7 @@ struct htt_rx_info {
1183 } rate; 1183 } rate;
1184 bool fcs_err; 1184 bool fcs_err;
1185 bool amsdu_more; 1185 bool amsdu_more;
1186 bool mic_err;
1186}; 1187};
1187 1188
1188struct ath10k_htt { 1189struct ath10k_htt {
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index fcb534f2f28f..fe8bd1b59f0e 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -838,6 +838,20 @@ static bool ath10k_htt_rx_has_fcs_err(struct sk_buff *skb)
838 return false; 838 return false;
839} 839}
840 840
841static bool ath10k_htt_rx_has_mic_err(struct sk_buff *skb)
842{
843 struct htt_rx_desc *rxd;
844 u32 flags;
845
846 rxd = (void *)skb->data - sizeof(*rxd);
847 flags = __le32_to_cpu(rxd->attention.flags);
848
849 if (flags & RX_ATTENTION_FLAGS_TKIP_MIC_ERR)
850 return true;
851
852 return false;
853}
854
841static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb) 855static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb)
842{ 856{
843 struct htt_rx_desc *rxd; 857 struct htt_rx_desc *rxd;
@@ -960,6 +974,7 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
960 974
961 info.skb = msdu_head; 975 info.skb = msdu_head;
962 info.fcs_err = ath10k_htt_rx_has_fcs_err(msdu_head); 976 info.fcs_err = ath10k_htt_rx_has_fcs_err(msdu_head);
977 info.mic_err = ath10k_htt_rx_has_mic_err(msdu_head);
963 info.signal = ATH10K_DEFAULT_NOISE_FLOOR; 978 info.signal = ATH10K_DEFAULT_NOISE_FLOOR;
964 info.signal += rx->ppdu.combined_rssi; 979 info.signal += rx->ppdu.combined_rssi;
965 980
diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index 9535eaa09f09..f1505a25d810 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -115,6 +115,7 @@ enum ath10k_mcast2ucast_mode {
115#define TARGET_10X_MAC_AGGR_DELIM 0 115#define TARGET_10X_MAC_AGGR_DELIM 0
116#define TARGET_10X_AST_SKID_LIMIT 16 116#define TARGET_10X_AST_SKID_LIMIT 16
117#define TARGET_10X_NUM_PEERS (128 + (TARGET_10X_NUM_VDEVS)) 117#define TARGET_10X_NUM_PEERS (128 + (TARGET_10X_NUM_VDEVS))
118#define TARGET_10X_NUM_PEERS_MAX 128
118#define TARGET_10X_NUM_OFFLOAD_PEERS 0 119#define TARGET_10X_NUM_OFFLOAD_PEERS 0
119#define TARGET_10X_NUM_OFFLOAD_REORDER_BUFS 0 120#define TARGET_10X_NUM_OFFLOAD_REORDER_BUFS 0
120#define TARGET_10X_NUM_PEER_KEYS 2 121#define TARGET_10X_NUM_PEER_KEYS 2
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index ce9ef3499ecb..776e364eadcd 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -332,6 +332,9 @@ static int ath10k_peer_create(struct ath10k *ar, u32 vdev_id, const u8 *addr)
332 ath10k_warn("Failed to wait for created wmi peer: %i\n", ret); 332 ath10k_warn("Failed to wait for created wmi peer: %i\n", ret);
333 return ret; 333 return ret;
334 } 334 }
335 spin_lock_bh(&ar->data_lock);
336 ar->num_peers++;
337 spin_unlock_bh(&ar->data_lock);
335 338
336 return 0; 339 return 0;
337} 340}
@@ -377,6 +380,10 @@ static int ath10k_peer_delete(struct ath10k *ar, u32 vdev_id, const u8 *addr)
377 if (ret) 380 if (ret)
378 return ret; 381 return ret;
379 382
383 spin_lock_bh(&ar->data_lock);
384 ar->num_peers--;
385 spin_unlock_bh(&ar->data_lock);
386
380 return 0; 387 return 0;
381} 388}
382 389
@@ -396,6 +403,7 @@ static void ath10k_peer_cleanup(struct ath10k *ar, u32 vdev_id)
396 403
397 list_del(&peer->list); 404 list_del(&peer->list);
398 kfree(peer); 405 kfree(peer);
406 ar->num_peers--;
399 } 407 }
400 spin_unlock_bh(&ar->data_lock); 408 spin_unlock_bh(&ar->data_lock);
401} 409}
@@ -411,6 +419,7 @@ static void ath10k_peer_cleanup_all(struct ath10k *ar)
411 list_del(&peer->list); 419 list_del(&peer->list);
412 kfree(peer); 420 kfree(peer);
413 } 421 }
422 ar->num_peers = 0;
414 spin_unlock_bh(&ar->data_lock); 423 spin_unlock_bh(&ar->data_lock);
415} 424}
416 425
@@ -2205,7 +2214,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
2205 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 2214 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2206 enum wmi_sta_powersave_param param; 2215 enum wmi_sta_powersave_param param;
2207 int ret = 0; 2216 int ret = 0;
2208 u32 value; 2217 u32 value, param_id;
2209 int bit; 2218 int bit;
2210 u32 vdev_param; 2219 u32 vdev_param;
2211 2220
@@ -2297,6 +2306,13 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
2297 ath10k_warn("Failed to create peer for AP: %d\n", ret); 2306 ath10k_warn("Failed to create peer for AP: %d\n", ret);
2298 goto err_vdev_delete; 2307 goto err_vdev_delete;
2299 } 2308 }
2309
2310 param_id = ar->wmi.pdev_param->sta_kickout_th;
2311
2312 /* Disable STA KICKOUT functionality in FW */
2313 ret = ath10k_wmi_pdev_set_param(ar, param_id, 0);
2314 if (ret)
2315 ath10k_warn("Failed to disable STA KICKOUT\n");
2300 } 2316 }
2301 2317
2302 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) { 2318 if (arvif->vdev_type == WMI_VDEV_TYPE_STA) {
@@ -2842,6 +2858,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
2842{ 2858{
2843 struct ath10k *ar = hw->priv; 2859 struct ath10k *ar = hw->priv;
2844 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 2860 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
2861 int max_num_peers;
2845 int ret = 0; 2862 int ret = 0;
2846 2863
2847 mutex_lock(&ar->conf_mutex); 2864 mutex_lock(&ar->conf_mutex);
@@ -2852,9 +2869,21 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
2852 /* 2869 /*
2853 * New station addition. 2870 * New station addition.
2854 */ 2871 */
2872 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features))
2873 max_num_peers = TARGET_10X_NUM_PEERS_MAX - 1;
2874 else
2875 max_num_peers = TARGET_NUM_PEERS;
2876
2877 if (ar->num_peers >= max_num_peers) {
2878 ath10k_warn("Number of peers exceeded: peers number %d (max peers %d)\n",
2879 ar->num_peers, max_num_peers);
2880 ret = -ENOBUFS;
2881 goto exit;
2882 }
2883
2855 ath10k_dbg(ATH10K_DBG_MAC, 2884 ath10k_dbg(ATH10K_DBG_MAC,
2856 "mac vdev %d peer create %pM (new sta)\n", 2885 "mac vdev %d peer create %pM (new sta) num_peers %d\n",
2857 arvif->vdev_id, sta->addr); 2886 arvif->vdev_id, sta->addr, ar->num_peers);
2858 2887
2859 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr); 2888 ret = ath10k_peer_create(ar, arvif->vdev_id, sta->addr);
2860 if (ret) 2889 if (ret)
@@ -2904,7 +2933,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
2904 ath10k_warn("Failed to disassociate station: %pM\n", 2933 ath10k_warn("Failed to disassociate station: %pM\n",
2905 sta->addr); 2934 sta->addr);
2906 } 2935 }
2907 2936exit:
2908 mutex_unlock(&ar->conf_mutex); 2937 mutex_unlock(&ar->conf_mutex);
2909 return ret; 2938 return ret;
2910} 2939}
@@ -3310,6 +3339,307 @@ exit:
3310 return ret; 3339 return ret;
3311} 3340}
3312 3341
3342/* Helper table for legacy fixed_rate/bitrate_mask */
3343static const u8 cck_ofdm_rate[] = {
3344 /* CCK */
3345 3, /* 1Mbps */
3346 2, /* 2Mbps */
3347 1, /* 5.5Mbps */
3348 0, /* 11Mbps */
3349 /* OFDM */
3350 3, /* 6Mbps */
3351 7, /* 9Mbps */
3352 2, /* 12Mbps */
3353 6, /* 18Mbps */
3354 1, /* 24Mbps */
3355 5, /* 36Mbps */
3356 0, /* 48Mbps */
3357 4, /* 54Mbps */
3358};
3359
3360/* Check if only one bit set */
3361static int ath10k_check_single_mask(u32 mask)
3362{
3363 int bit;
3364
3365 bit = ffs(mask);
3366 if (!bit)
3367 return 0;
3368
3369 mask &= ~BIT(bit - 1);
3370 if (mask)
3371 return 2;
3372
3373 return 1;
3374}
3375
3376static bool
3377ath10k_default_bitrate_mask(struct ath10k *ar,
3378 enum ieee80211_band band,
3379 const struct cfg80211_bitrate_mask *mask)
3380{
3381 u32 legacy = 0x00ff;
3382 u8 ht = 0xff, i;
3383 u16 vht = 0x3ff;
3384
3385 switch (band) {
3386 case IEEE80211_BAND_2GHZ:
3387 legacy = 0x00fff;
3388 vht = 0;
3389 break;
3390 case IEEE80211_BAND_5GHZ:
3391 break;
3392 default:
3393 return false;
3394 }
3395
3396 if (mask->control[band].legacy != legacy)
3397 return false;
3398
3399 for (i = 0; i < ar->num_rf_chains; i++)
3400 if (mask->control[band].ht_mcs[i] != ht)
3401 return false;
3402
3403 for (i = 0; i < ar->num_rf_chains; i++)
3404 if (mask->control[band].vht_mcs[i] != vht)
3405 return false;
3406
3407 return true;
3408}
3409
3410static bool
3411ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
3412 enum ieee80211_band band,
3413 u8 *fixed_nss)
3414{
3415 int ht_nss = 0, vht_nss = 0, i;
3416
3417 /* check legacy */
3418 if (ath10k_check_single_mask(mask->control[band].legacy))
3419 return false;
3420
3421 /* check HT */
3422 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++) {
3423 if (mask->control[band].ht_mcs[i] == 0xff)
3424 continue;
3425 else if (mask->control[band].ht_mcs[i] == 0x00)
3426 break;
3427 else
3428 return false;
3429 }
3430
3431 ht_nss = i;
3432
3433 /* check VHT */
3434 for (i = 0; i < NL80211_VHT_NSS_MAX; i++) {
3435 if (mask->control[band].vht_mcs[i] == 0x03ff)
3436 continue;
3437 else if (mask->control[band].vht_mcs[i] == 0x0000)
3438 break;
3439 else
3440 return false;
3441 }
3442
3443 vht_nss = i;
3444
3445 if (ht_nss > 0 && vht_nss > 0)
3446 return false;
3447
3448 if (ht_nss)
3449 *fixed_nss = ht_nss;
3450 else if (vht_nss)
3451 *fixed_nss = vht_nss;
3452 else
3453 return false;
3454
3455 return true;
3456}
3457
3458static bool
3459ath10k_bitrate_mask_correct(const struct cfg80211_bitrate_mask *mask,
3460 enum ieee80211_band band,
3461 enum wmi_rate_preamble *preamble)
3462{
3463 int legacy = 0, ht = 0, vht = 0, i;
3464
3465 *preamble = WMI_RATE_PREAMBLE_OFDM;
3466
3467 /* check legacy */
3468 legacy = ath10k_check_single_mask(mask->control[band].legacy);
3469 if (legacy > 1)
3470 return false;
3471
3472 /* check HT */
3473 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3474 ht += ath10k_check_single_mask(mask->control[band].ht_mcs[i]);
3475 if (ht > 1)
3476 return false;
3477
3478 /* check VHT */
3479 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3480 vht += ath10k_check_single_mask(mask->control[band].vht_mcs[i]);
3481 if (vht > 1)
3482 return false;
3483
3484 /* Currently we support only one fixed_rate */
3485 if ((legacy + ht + vht) != 1)
3486 return false;
3487
3488 if (ht)
3489 *preamble = WMI_RATE_PREAMBLE_HT;
3490 else if (vht)
3491 *preamble = WMI_RATE_PREAMBLE_VHT;
3492
3493 return true;
3494}
3495
3496static bool
3497ath10k_bitrate_mask_rate(const struct cfg80211_bitrate_mask *mask,
3498 enum ieee80211_band band,
3499 u8 *fixed_rate,
3500 u8 *fixed_nss)
3501{
3502 u8 rate = 0, pream = 0, nss = 0, i;
3503 enum wmi_rate_preamble preamble;
3504
3505 /* Check if single rate correct */
3506 if (!ath10k_bitrate_mask_correct(mask, band, &preamble))
3507 return false;
3508
3509 pream = preamble;
3510
3511 switch (preamble) {
3512 case WMI_RATE_PREAMBLE_CCK:
3513 case WMI_RATE_PREAMBLE_OFDM:
3514 i = ffs(mask->control[band].legacy) - 1;
3515
3516 if (band == IEEE80211_BAND_2GHZ && i < 4)
3517 pream = WMI_RATE_PREAMBLE_CCK;
3518
3519 if (band == IEEE80211_BAND_5GHZ)
3520 i += 4;
3521
3522 if (i >= ARRAY_SIZE(cck_ofdm_rate))
3523 return false;
3524
3525 rate = cck_ofdm_rate[i];
3526 break;
3527 case WMI_RATE_PREAMBLE_HT:
3528 for (i = 0; i < IEEE80211_HT_MCS_MASK_LEN; i++)
3529 if (mask->control[band].ht_mcs[i])
3530 break;
3531
3532 if (i == IEEE80211_HT_MCS_MASK_LEN)
3533 return false;
3534
3535 rate = ffs(mask->control[band].ht_mcs[i]) - 1;
3536 nss = i;
3537 break;
3538 case WMI_RATE_PREAMBLE_VHT:
3539 for (i = 0; i < NL80211_VHT_NSS_MAX; i++)
3540 if (mask->control[band].vht_mcs[i])
3541 break;
3542
3543 if (i == NL80211_VHT_NSS_MAX)
3544 return false;
3545
3546 rate = ffs(mask->control[band].vht_mcs[i]) - 1;
3547 nss = i;
3548 break;
3549 }
3550
3551 *fixed_nss = nss + 1;
3552 nss <<= 4;
3553 pream <<= 6;
3554
3555 ath10k_dbg(ATH10K_DBG_MAC, "mac fixed rate pream 0x%02x nss 0x%02x rate 0x%02x\n",
3556 pream, nss, rate);
3557
3558 *fixed_rate = pream | nss | rate;
3559
3560 return true;
3561}
3562
3563static bool ath10k_get_fixed_rate_nss(const struct cfg80211_bitrate_mask *mask,
3564 enum ieee80211_band band,
3565 u8 *fixed_rate,
3566 u8 *fixed_nss)
3567{
3568 /* First check full NSS mask, if we can simply limit NSS */
3569 if (ath10k_bitrate_mask_nss(mask, band, fixed_nss))
3570 return true;
3571
3572 /* Next Check single rate is set */
3573 return ath10k_bitrate_mask_rate(mask, band, fixed_rate, fixed_nss);
3574}
3575
3576static int ath10k_set_fixed_rate_param(struct ath10k_vif *arvif,
3577 u8 fixed_rate,
3578 u8 fixed_nss)
3579{
3580 struct ath10k *ar = arvif->ar;
3581 u32 vdev_param;
3582 int ret = 0;
3583
3584 mutex_lock(&ar->conf_mutex);
3585
3586 if (arvif->fixed_rate == fixed_rate &&
3587 arvif->fixed_nss == fixed_nss)
3588 goto exit;
3589
3590 if (fixed_rate == WMI_FIXED_RATE_NONE)
3591 ath10k_dbg(ATH10K_DBG_MAC, "mac disable fixed bitrate mask\n");
3592
3593 vdev_param = ar->wmi.vdev_param->fixed_rate;
3594 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3595 vdev_param, fixed_rate);
3596 if (ret) {
3597 ath10k_warn("Could not set fixed_rate param 0x%02x: %d\n",
3598 fixed_rate, ret);
3599 ret = -EINVAL;
3600 goto exit;
3601 }
3602
3603 arvif->fixed_rate = fixed_rate;
3604
3605 vdev_param = ar->wmi.vdev_param->nss;
3606 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
3607 vdev_param, fixed_nss);
3608
3609 if (ret) {
3610 ath10k_warn("Could not set fixed_nss param %d: %d\n",
3611 fixed_nss, ret);
3612 ret = -EINVAL;
3613 goto exit;
3614 }
3615
3616 arvif->fixed_nss = fixed_nss;
3617
3618exit:
3619 mutex_unlock(&ar->conf_mutex);
3620 return ret;
3621}
3622
3623static int ath10k_set_bitrate_mask(struct ieee80211_hw *hw,
3624 struct ieee80211_vif *vif,
3625 const struct cfg80211_bitrate_mask *mask)
3626{
3627 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3628 struct ath10k *ar = arvif->ar;
3629 enum ieee80211_band band = ar->hw->conf.chandef.chan->band;
3630 u8 fixed_rate = WMI_FIXED_RATE_NONE;
3631 u8 fixed_nss = ar->num_rf_chains;
3632
3633 if (!ath10k_default_bitrate_mask(ar, band, mask)) {
3634 if (!ath10k_get_fixed_rate_nss(mask, band,
3635 &fixed_rate,
3636 &fixed_nss))
3637 return -EINVAL;
3638 }
3639
3640 return ath10k_set_fixed_rate_param(arvif, fixed_rate, fixed_nss);
3641}
3642
3313static const struct ieee80211_ops ath10k_ops = { 3643static const struct ieee80211_ops ath10k_ops = {
3314 .tx = ath10k_tx, 3644 .tx = ath10k_tx,
3315 .start = ath10k_start, 3645 .start = ath10k_start,
@@ -3332,6 +3662,7 @@ static const struct ieee80211_ops ath10k_ops = {
3332 .tx_last_beacon = ath10k_tx_last_beacon, 3662 .tx_last_beacon = ath10k_tx_last_beacon,
3333 .restart_complete = ath10k_restart_complete, 3663 .restart_complete = ath10k_restart_complete,
3334 .get_survey = ath10k_get_survey, 3664 .get_survey = ath10k_get_survey,
3665 .set_bitrate_mask = ath10k_set_bitrate_mask,
3335#ifdef CONFIG_PM 3666#ifdef CONFIG_PM
3336 .suspend = ath10k_suspend, 3667 .suspend = ath10k_suspend,
3337 .resume = ath10k_resume, 3668 .resume = ath10k_resume,
@@ -3464,14 +3795,12 @@ static const struct ieee80211_iface_limit ath10k_if_limits[] = {
3464 }, 3795 },
3465}; 3796};
3466 3797
3467#ifdef CONFIG_ATH10K_DFS_CERTIFIED 3798static const struct ieee80211_iface_limit ath10k_10x_if_limits[] = {
3468static const struct ieee80211_iface_limit ath10k_if_dfs_limits[] = {
3469 { 3799 {
3470 .max = 8, 3800 .max = 8,
3471 .types = BIT(NL80211_IFTYPE_AP) 3801 .types = BIT(NL80211_IFTYPE_AP)
3472 }, 3802 },
3473}; 3803};
3474#endif
3475 3804
3476static const struct ieee80211_iface_combination ath10k_if_comb[] = { 3805static const struct ieee80211_iface_combination ath10k_if_comb[] = {
3477 { 3806 {
@@ -3481,19 +3810,22 @@ static const struct ieee80211_iface_combination ath10k_if_comb[] = {
3481 .num_different_channels = 1, 3810 .num_different_channels = 1,
3482 .beacon_int_infra_match = true, 3811 .beacon_int_infra_match = true,
3483 }, 3812 },
3484#ifdef CONFIG_ATH10K_DFS_CERTIFIED 3813};
3814
3815static const struct ieee80211_iface_combination ath10k_10x_if_comb[] = {
3485 { 3816 {
3486 .limits = ath10k_if_dfs_limits, 3817 .limits = ath10k_10x_if_limits,
3487 .n_limits = ARRAY_SIZE(ath10k_if_dfs_limits), 3818 .n_limits = ARRAY_SIZE(ath10k_10x_if_limits),
3488 .max_interfaces = 8, 3819 .max_interfaces = 8,
3489 .num_different_channels = 1, 3820 .num_different_channels = 1,
3490 .beacon_int_infra_match = true, 3821 .beacon_int_infra_match = true,
3822#ifdef CONFIG_ATH10K_DFS_CERTIFIED
3491 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | 3823 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
3492 BIT(NL80211_CHAN_WIDTH_20) | 3824 BIT(NL80211_CHAN_WIDTH_20) |
3493 BIT(NL80211_CHAN_WIDTH_40) | 3825 BIT(NL80211_CHAN_WIDTH_40) |
3494 BIT(NL80211_CHAN_WIDTH_80), 3826 BIT(NL80211_CHAN_WIDTH_80),
3495 }
3496#endif 3827#endif
3828 },
3497}; 3829};
3498 3830
3499static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar) 3831static struct ieee80211_sta_vht_cap ath10k_create_vht_cap(struct ath10k *ar)
@@ -3672,9 +4004,12 @@ int ath10k_mac_register(struct ath10k *ar)
3672 ar->hw->wiphy->interface_modes = 4004 ar->hw->wiphy->interface_modes =
3673 BIT(NL80211_IFTYPE_STATION) | 4005 BIT(NL80211_IFTYPE_STATION) |
3674 BIT(NL80211_IFTYPE_ADHOC) | 4006 BIT(NL80211_IFTYPE_ADHOC) |
3675 BIT(NL80211_IFTYPE_AP) | 4007 BIT(NL80211_IFTYPE_AP);
3676 BIT(NL80211_IFTYPE_P2P_CLIENT) | 4008
3677 BIT(NL80211_IFTYPE_P2P_GO); 4009 if (!test_bit(ATH10K_FW_FEATURE_NO_P2P, ar->fw_features))
4010 ar->hw->wiphy->interface_modes |=
4011 BIT(NL80211_IFTYPE_P2P_CLIENT) |
4012 BIT(NL80211_IFTYPE_P2P_GO);
3678 4013
3679 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM | 4014 ar->hw->flags = IEEE80211_HW_SIGNAL_DBM |
3680 IEEE80211_HW_SUPPORTS_PS | 4015 IEEE80211_HW_SUPPORTS_PS |
@@ -3704,7 +4039,6 @@ int ath10k_mac_register(struct ath10k *ar)
3704 4039
3705 ar->hw->vif_data_size = sizeof(struct ath10k_vif); 4040 ar->hw->vif_data_size = sizeof(struct ath10k_vif);
3706 4041
3707 ar->hw->channel_change_time = 5000;
3708 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL; 4042 ar->hw->max_listen_interval = ATH10K_MAX_HW_LISTEN_INTERVAL;
3709 4043
3710 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 4044 ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
@@ -3717,8 +4051,15 @@ int ath10k_mac_register(struct ath10k *ar)
3717 */ 4051 */
3718 ar->hw->queues = 4; 4052 ar->hw->queues = 4;
3719 4053
3720 ar->hw->wiphy->iface_combinations = ath10k_if_comb; 4054 if (test_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features)) {
3721 ar->hw->wiphy->n_iface_combinations = ARRAY_SIZE(ath10k_if_comb); 4055 ar->hw->wiphy->iface_combinations = ath10k_10x_if_comb;
4056 ar->hw->wiphy->n_iface_combinations =
4057 ARRAY_SIZE(ath10k_10x_if_comb);
4058 } else {
4059 ar->hw->wiphy->iface_combinations = ath10k_if_comb;
4060 ar->hw->wiphy->n_iface_combinations =
4061 ARRAY_SIZE(ath10k_if_comb);
4062 }
3722 4063
3723 ar->hw->netdev_features = NETIF_F_HW_CSUM; 4064 ar->hw->netdev_features = NETIF_F_HW_CSUM;
3724 4065
diff --git a/drivers/net/wireless/ath/ath10k/trace.h b/drivers/net/wireless/ath/ath10k/trace.h
index 90817ddc92ba..4eb2ecbc06ef 100644
--- a/drivers/net/wireless/ath/ath10k/trace.h
+++ b/drivers/net/wireless/ath/ath10k/trace.h
@@ -182,6 +182,27 @@ TRACE_EVENT(ath10k_htt_stats,
182 ) 182 )
183); 183);
184 184
185TRACE_EVENT(ath10k_wmi_dbglog,
186 TP_PROTO(void *buf, size_t buf_len),
187
188 TP_ARGS(buf, buf_len),
189
190 TP_STRUCT__entry(
191 __field(size_t, buf_len)
192 __dynamic_array(u8, buf, buf_len)
193 ),
194
195 TP_fast_assign(
196 __entry->buf_len = buf_len;
197 memcpy(__get_dynamic_array(buf), buf, buf_len);
198 ),
199
200 TP_printk(
201 "len %zu",
202 __entry->buf_len
203 )
204);
205
185#endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/ 206#endif /* _TRACE_H_ || TRACE_HEADER_MULTI_READ*/
186 207
187/* we don't want to use include/trace/events */ 208/* we don't want to use include/trace/events */
diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index 22829803f087..74f45fa6f428 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -231,7 +231,7 @@ void ath10k_process_rx(struct ath10k *ar, struct htt_rx_info *info)
231 ~IEEE80211_FCTL_PROTECTED); 231 ~IEEE80211_FCTL_PROTECTED);
232 } 232 }
233 233
234 if (info->status == HTT_RX_IND_MPDU_STATUS_TKIP_MIC_ERR) 234 if (info->mic_err)
235 status->flag |= RX_FLAG_MMIC_ERROR; 235 status->flag |= RX_FLAG_MMIC_ERROR;
236 236
237 if (info->fcs_err) 237 if (info->fcs_err)
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index 1260a8d15dc3..712a606a080a 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -16,6 +16,7 @@
16 */ 16 */
17 17
18#include <linux/skbuff.h> 18#include <linux/skbuff.h>
19#include <linux/ctype.h>
19 20
20#include "core.h" 21#include "core.h"
21#include "htc.h" 22#include "htc.h"
@@ -875,6 +876,7 @@ static int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
875 struct wmi_mgmt_rx_event_v2 *ev_v2; 876 struct wmi_mgmt_rx_event_v2 *ev_v2;
876 struct wmi_mgmt_rx_hdr_v1 *ev_hdr; 877 struct wmi_mgmt_rx_hdr_v1 *ev_hdr;
877 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 878 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
879 struct ieee80211_channel *ch;
878 struct ieee80211_hdr *hdr; 880 struct ieee80211_hdr *hdr;
879 u32 rx_status; 881 u32 rx_status;
880 u32 channel; 882 u32 channel;
@@ -927,7 +929,25 @@ static int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
927 if (rx_status & WMI_RX_STATUS_ERR_MIC) 929 if (rx_status & WMI_RX_STATUS_ERR_MIC)
928 status->flag |= RX_FLAG_MMIC_ERROR; 930 status->flag |= RX_FLAG_MMIC_ERROR;
929 931
930 status->band = phy_mode_to_band(phy_mode); 932 /* HW can Rx CCK rates on 5GHz. In that case phy_mode is set to
933 * MODE_11B. This means phy_mode is not a reliable source for the band
934 * of mgmt rx. */
935
936 ch = ar->scan_channel;
937 if (!ch)
938 ch = ar->rx_channel;
939
940 if (ch) {
941 status->band = ch->band;
942
943 if (phy_mode == MODE_11B &&
944 status->band == IEEE80211_BAND_5GHZ)
945 ath10k_dbg(ATH10K_DBG_MGMT, "wmi mgmt rx 11b (CCK) on 5GHz\n");
946 } else {
947 ath10k_warn("using (unreliable) phy_mode to extract band for mgmt rx\n");
948 status->band = phy_mode_to_band(phy_mode);
949 }
950
931 status->freq = ieee80211_channel_to_frequency(channel, status->band); 951 status->freq = ieee80211_channel_to_frequency(channel, status->band);
932 status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR; 952 status->signal = snr + ATH10K_DEFAULT_NOISE_FLOOR;
933 status->rate_idx = get_rate_idx(rate, status->band); 953 status->rate_idx = get_rate_idx(rate, status->band);
@@ -937,7 +957,11 @@ static int ath10k_wmi_event_mgmt_rx(struct ath10k *ar, struct sk_buff *skb)
937 hdr = (struct ieee80211_hdr *)skb->data; 957 hdr = (struct ieee80211_hdr *)skb->data;
938 fc = le16_to_cpu(hdr->frame_control); 958 fc = le16_to_cpu(hdr->frame_control);
939 959
940 if (fc & IEEE80211_FCTL_PROTECTED) { 960 /* FW delivers WEP Shared Auth frame with Protected Bit set and
961 * encrypted payload. However in case of PMF it delivers decrypted
962 * frames with Protected Bit set. */
963 if (ieee80211_has_protected(hdr->frame_control) &&
964 !ieee80211_is_auth(hdr->frame_control)) {
941 status->flag |= RX_FLAG_DECRYPTED | RX_FLAG_IV_STRIPPED | 965 status->flag |= RX_FLAG_DECRYPTED | RX_FLAG_IV_STRIPPED |
942 RX_FLAG_MMIC_STRIPPED; 966 RX_FLAG_MMIC_STRIPPED;
943 hdr->frame_control = __cpu_to_le16(fc & 967 hdr->frame_control = __cpu_to_le16(fc &
@@ -1047,9 +1071,14 @@ static void ath10k_wmi_event_echo(struct ath10k *ar, struct sk_buff *skb)
1047 ath10k_dbg(ATH10K_DBG_WMI, "WMI_ECHO_EVENTID\n"); 1071 ath10k_dbg(ATH10K_DBG_WMI, "WMI_ECHO_EVENTID\n");
1048} 1072}
1049 1073
1050static void ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb) 1074static int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
1051{ 1075{
1052 ath10k_dbg(ATH10K_DBG_WMI, "WMI_DEBUG_MESG_EVENTID\n"); 1076 ath10k_dbg(ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
1077 skb->len);
1078
1079 trace_ath10k_wmi_dbglog(skb->data, skb->len);
1080
1081 return 0;
1053} 1082}
1054 1083
1055static void ath10k_wmi_event_update_stats(struct ath10k *ar, 1084static void ath10k_wmi_event_update_stats(struct ath10k *ar,
@@ -1653,9 +1682,37 @@ static void ath10k_wmi_event_profile_match(struct ath10k *ar,
1653} 1682}
1654 1683
1655static void ath10k_wmi_event_debug_print(struct ath10k *ar, 1684static void ath10k_wmi_event_debug_print(struct ath10k *ar,
1656 struct sk_buff *skb) 1685 struct sk_buff *skb)
1657{ 1686{
1658 ath10k_dbg(ATH10K_DBG_WMI, "WMI_DEBUG_PRINT_EVENTID\n"); 1687 char buf[101], c;
1688 int i;
1689
1690 for (i = 0; i < sizeof(buf) - 1; i++) {
1691 if (i >= skb->len)
1692 break;
1693
1694 c = skb->data[i];
1695
1696 if (c == '\0')
1697 break;
1698
1699 if (isascii(c) && isprint(c))
1700 buf[i] = c;
1701 else
1702 buf[i] = '.';
1703 }
1704
1705 if (i == sizeof(buf) - 1)
1706 ath10k_warn("wmi debug print truncated: %d\n", skb->len);
1707
1708 /* for some reason the debug prints end with \n, remove that */
1709 if (skb->data[i - 1] == '\n')
1710 i--;
1711
1712 /* the last byte is always reserved for the null character */
1713 buf[i] = '\0';
1714
1715 ath10k_dbg(ATH10K_DBG_WMI, "wmi event debug print '%s'\n", buf);
1659} 1716}
1660 1717
1661static void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb) 1718static void ath10k_wmi_event_pdev_qvit(struct ath10k *ar, struct sk_buff *skb)
@@ -3445,3 +3502,40 @@ int ath10k_wmi_force_fw_hang(struct ath10k *ar,
3445 type, delay_ms); 3502 type, delay_ms);
3446 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid); 3503 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->force_fw_hang_cmdid);
3447} 3504}
3505
3506int ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable)
3507{
3508 struct wmi_dbglog_cfg_cmd *cmd;
3509 struct sk_buff *skb;
3510 u32 cfg;
3511
3512 skb = ath10k_wmi_alloc_skb(sizeof(*cmd));
3513 if (!skb)
3514 return -ENOMEM;
3515
3516 cmd = (struct wmi_dbglog_cfg_cmd *)skb->data;
3517
3518 if (module_enable) {
3519 cfg = SM(ATH10K_DBGLOG_LEVEL_VERBOSE,
3520 ATH10K_DBGLOG_CFG_LOG_LVL);
3521 } else {
3522 /* set back defaults, all modules with WARN level */
3523 cfg = SM(ATH10K_DBGLOG_LEVEL_WARN,
3524 ATH10K_DBGLOG_CFG_LOG_LVL);
3525 module_enable = ~0;
3526 }
3527
3528 cmd->module_enable = __cpu_to_le32(module_enable);
3529 cmd->module_valid = __cpu_to_le32(~0);
3530 cmd->config_enable = __cpu_to_le32(cfg);
3531 cmd->config_valid = __cpu_to_le32(ATH10K_DBGLOG_CFG_LOG_LVL_MASK);
3532
3533 ath10k_dbg(ATH10K_DBG_WMI,
3534 "wmi dbglog cfg modules %08x %08x config %08x %08x\n",
3535 __le32_to_cpu(cmd->module_enable),
3536 __le32_to_cpu(cmd->module_valid),
3537 __le32_to_cpu(cmd->config_enable),
3538 __le32_to_cpu(cmd->config_valid));
3539
3540 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->dbglog_cfg_cmdid);
3541}
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 0087d699b85b..4b5e7d3d32b6 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -3003,6 +3003,18 @@ struct wmi_vdev_install_key_arg {
3003 const void *key_data; 3003 const void *key_data;
3004}; 3004};
3005 3005
3006/*
3007 * vdev fixed rate format:
3008 * - preamble - b7:b6 - see WMI_RATE_PREMABLE_
3009 * - nss - b5:b4 - ss number (0 mean 1ss)
3010 * - rate_mcs - b3:b0 - as below
3011 * CCK: 0 - 11Mbps, 1 - 5,5Mbps, 2 - 2Mbps, 3 - 1Mbps,
3012 * 4 - 11Mbps (s), 5 - 5,5Mbps (s), 6 - 2Mbps (s)
3013 * OFDM: 0 - 48Mbps, 1 - 24Mbps, 2 - 12Mbps, 3 - 6Mbps,
3014 * 4 - 54Mbps, 5 - 36Mbps, 6 - 18Mbps, 7 - 9Mbps
3015 * HT/VHT: MCS index
3016 */
3017
3006/* Preamble types to be used with VDEV fixed rate configuration */ 3018/* Preamble types to be used with VDEV fixed rate configuration */
3007enum wmi_rate_preamble { 3019enum wmi_rate_preamble {
3008 WMI_RATE_PREAMBLE_OFDM, 3020 WMI_RATE_PREAMBLE_OFDM,
@@ -4090,6 +4102,54 @@ struct wmi_force_fw_hang_cmd {
4090 __le32 delay_ms; 4102 __le32 delay_ms;
4091} __packed; 4103} __packed;
4092 4104
4105enum ath10k_dbglog_level {
4106 ATH10K_DBGLOG_LEVEL_VERBOSE = 0,
4107 ATH10K_DBGLOG_LEVEL_INFO = 1,
4108 ATH10K_DBGLOG_LEVEL_WARN = 2,
4109 ATH10K_DBGLOG_LEVEL_ERR = 3,
4110};
4111
4112/* VAP ids to enable dbglog */
4113#define ATH10K_DBGLOG_CFG_VAP_LOG_LSB 0
4114#define ATH10K_DBGLOG_CFG_VAP_LOG_MASK 0x0000ffff
4115
4116/* to enable dbglog in the firmware */
4117#define ATH10K_DBGLOG_CFG_REPORTING_ENABLE_LSB 16
4118#define ATH10K_DBGLOG_CFG_REPORTING_ENABLE_MASK 0x00010000
4119
4120/* timestamp resolution */
4121#define ATH10K_DBGLOG_CFG_RESOLUTION_LSB 17
4122#define ATH10K_DBGLOG_CFG_RESOLUTION_MASK 0x000E0000
4123
4124/* number of queued messages before sending them to the host */
4125#define ATH10K_DBGLOG_CFG_REPORT_SIZE_LSB 20
4126#define ATH10K_DBGLOG_CFG_REPORT_SIZE_MASK 0x0ff00000
4127
4128/*
4129 * Log levels to enable. This defines the minimum level to enable, this is
4130 * not a bitmask. See enum ath10k_dbglog_level for the values.
4131 */
4132#define ATH10K_DBGLOG_CFG_LOG_LVL_LSB 28
4133#define ATH10K_DBGLOG_CFG_LOG_LVL_MASK 0x70000000
4134
4135/*
4136 * Note: this is a cleaned up version of a struct firmware uses. For
4137 * example, config_valid was hidden inside an array.
4138 */
4139struct wmi_dbglog_cfg_cmd {
4140 /* bitmask to hold mod id config*/
4141 __le32 module_enable;
4142
4143 /* see ATH10K_DBGLOG_CFG_ */
4144 __le32 config_enable;
4145
4146 /* mask of module id bits to be changed */
4147 __le32 module_valid;
4148
4149 /* mask of config bits to be changed, see ATH10K_DBGLOG_CFG_ */
4150 __le32 config_valid;
4151} __packed;
4152
4093#define ATH10K_RTS_MAX 2347 4153#define ATH10K_RTS_MAX 2347
4094#define ATH10K_FRAGMT_THRESHOLD_MIN 540 4154#define ATH10K_FRAGMT_THRESHOLD_MIN 540
4095#define ATH10K_FRAGMT_THRESHOLD_MAX 2346 4155#define ATH10K_FRAGMT_THRESHOLD_MAX 2346
@@ -4167,5 +4227,6 @@ int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id);
4167int ath10k_wmi_force_fw_hang(struct ath10k *ar, 4227int ath10k_wmi_force_fw_hang(struct ath10k *ar,
4168 enum wmi_force_fw_hang_type type, u32 delay_ms); 4228 enum wmi_force_fw_hang_type type, u32 delay_ms);
4169int ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *skb); 4229int ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *skb);
4230int ath10k_wmi_dbglog_cfg(struct ath10k *ar, u32 module_enable);
4170 4231
4171#endif /* _WMI_H_ */ 4232#endif /* _WMI_H_ */
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 6396ad4bce67..ef35da84f63b 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -1238,14 +1238,11 @@ static void
1238ath5k_check_ibss_tsf(struct ath5k_hw *ah, struct sk_buff *skb, 1238ath5k_check_ibss_tsf(struct ath5k_hw *ah, struct sk_buff *skb,
1239 struct ieee80211_rx_status *rxs) 1239 struct ieee80211_rx_status *rxs)
1240{ 1240{
1241 struct ath_common *common = ath5k_hw_common(ah);
1242 u64 tsf, bc_tstamp; 1241 u64 tsf, bc_tstamp;
1243 u32 hw_tu; 1242 u32 hw_tu;
1244 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data; 1243 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
1245 1244
1246 if (ieee80211_is_beacon(mgmt->frame_control) && 1245 if (le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS) {
1247 le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS &&
1248 ether_addr_equal_64bits(mgmt->bssid, common->curbssid)) {
1249 /* 1246 /*
1250 * Received an IBSS beacon with the same BSSID. Hardware *must* 1247 * Received an IBSS beacon with the same BSSID. Hardware *must*
1251 * have updated the local TSF. We have to work around various 1248 * have updated the local TSF. We have to work around various
@@ -1301,23 +1298,6 @@ ath5k_check_ibss_tsf(struct ath5k_hw *ah, struct sk_buff *skb,
1301 } 1298 }
1302} 1299}
1303 1300
1304static void
1305ath5k_update_beacon_rssi(struct ath5k_hw *ah, struct sk_buff *skb, int rssi)
1306{
1307 struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
1308 struct ath_common *common = ath5k_hw_common(ah);
1309
1310 /* only beacons from our BSSID */
1311 if (!ieee80211_is_beacon(mgmt->frame_control) ||
1312 !ether_addr_equal_64bits(mgmt->bssid, common->curbssid))
1313 return;
1314
1315 ewma_add(&ah->ah_beacon_rssi_avg, rssi);
1316
1317 /* in IBSS mode we should keep RSSI statistics per neighbour */
1318 /* le16_to_cpu(mgmt->u.beacon.capab_info) & WLAN_CAPABILITY_IBSS */
1319}
1320
1321/* 1301/*
1322 * Compute padding position. skb must contain an IEEE 802.11 frame 1302 * Compute padding position. skb must contain an IEEE 802.11 frame
1323 */ 1303 */
@@ -1390,6 +1370,7 @@ ath5k_receive_frame(struct ath5k_hw *ah, struct sk_buff *skb,
1390 struct ath5k_rx_status *rs) 1370 struct ath5k_rx_status *rs)
1391{ 1371{
1392 struct ieee80211_rx_status *rxs; 1372 struct ieee80211_rx_status *rxs;
1373 struct ath_common *common = ath5k_hw_common(ah);
1393 1374
1394 ath5k_remove_padding(skb); 1375 ath5k_remove_padding(skb);
1395 1376
@@ -1442,11 +1423,13 @@ ath5k_receive_frame(struct ath5k_hw *ah, struct sk_buff *skb,
1442 1423
1443 trace_ath5k_rx(ah, skb); 1424 trace_ath5k_rx(ah, skb);
1444 1425
1445 ath5k_update_beacon_rssi(ah, skb, rs->rs_rssi); 1426 if (ath_is_mybeacon(common, (struct ieee80211_hdr *)skb->data)) {
1427 ewma_add(&ah->ah_beacon_rssi_avg, rs->rs_rssi);
1446 1428
1447 /* check beacons in IBSS mode */ 1429 /* check beacons in IBSS mode */
1448 if (ah->opmode == NL80211_IFTYPE_ADHOC) 1430 if (ah->opmode == NL80211_IFTYPE_ADHOC)
1449 ath5k_check_ibss_tsf(ah, skb, rxs); 1431 ath5k_check_ibss_tsf(ah, skb, rxs);
1432 }
1450 1433
1451 ieee80211_rx(ah->hw, skb); 1434 ieee80211_rx(ah->hw, skb);
1452} 1435}
@@ -2549,7 +2532,6 @@ ath5k_init_ah(struct ath5k_hw *ah, const struct ath_bus_ops *bus_ops)
2549 hw->wiphy->available_antennas_rx = 0x3; 2532 hw->wiphy->available_antennas_rx = 0x3;
2550 2533
2551 hw->extra_tx_headroom = 2; 2534 hw->extra_tx_headroom = 2;
2552 hw->channel_change_time = 5000;
2553 2535
2554 /* 2536 /*
2555 * Mark the device as detached to avoid processing 2537 * Mark the device as detached to avoid processing
diff --git a/drivers/net/wireless/ath/ath9k/Kconfig b/drivers/net/wireless/ath/ath9k/Kconfig
index 30d273c61bff..7b96b3e5712d 100644
--- a/drivers/net/wireless/ath/ath9k/Kconfig
+++ b/drivers/net/wireless/ath/ath9k/Kconfig
@@ -65,6 +65,14 @@ config ATH9K_DEBUGFS
65 65
66 Also required for changing debug message flags at run time. 66 Also required for changing debug message flags at run time.
67 67
68config ATH9K_STATION_STATISTICS
69 bool "Detailed station statistics"
70 depends on ATH9K && ATH9K_DEBUGFS && DEBUG_FS
71 select MAC80211_DEBUGFS
72 default n
73 ---help---
74 This option enables detailed statistics for association stations.
75
68config ATH9K_DFS_CERTIFIED 76config ATH9K_DFS_CERTIFIED
69 bool "Atheros DFS support for certified platforms" 77 bool "Atheros DFS support for certified platforms"
70 depends on ATH9K && CFG80211_CERTIFICATION_ONUS 78 depends on ATH9K && CFG80211_CERTIFICATION_ONUS
diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile
index e9904e5ccd81..a40e5c5d7418 100644
--- a/drivers/net/wireless/ath/ath9k/Makefile
+++ b/drivers/net/wireless/ath/ath9k/Makefile
@@ -19,6 +19,8 @@ ath9k-$(CONFIG_ATH9K_WOW) += wow.o
19ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o \ 19ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o \
20 spectral.o 20 spectral.o
21 21
22ath9k-$(CONFIG_ATH9K_STATION_STATISTICS) += debug_sta.o
23
22obj-$(CONFIG_ATH9K) += ath9k.o 24obj-$(CONFIG_ATH9K) += ath9k.o
23 25
24ath9k_hw-y:= \ 26ath9k_hw-y:= \
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
index 8c145cd98c1c..a352128c40ad 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
@@ -565,7 +565,7 @@ static bool ar9003_hw_solve_iq_cal(struct ath_hw *ah,
565 const s32 result_shift = 1 << 15; 565 const s32 result_shift = 1 << 15;
566 struct ath_common *common = ath9k_hw_common(ah); 566 struct ath_common *common = ath9k_hw_common(ah);
567 567
568 f2 = (f1 * f1 + f3 * f3) / result_shift; 568 f2 = ((f1 >> 3) * (f1 >> 3) + (f3 >> 3) * (f3 >> 3)) >> 9;
569 569
570 if (!f2) { 570 if (!f2) {
571 ath_dbg(common, CALIBRATE, "Divide by 0\n"); 571 ath_dbg(common, CALIBRATE, "Divide by 0\n");
@@ -655,8 +655,8 @@ static bool ar9003_hw_calc_iq_corr(struct ath_hw *ah,
655 if (i2_m_q2_a0_d1 > 0x800) 655 if (i2_m_q2_a0_d1 > 0x800)
656 i2_m_q2_a0_d1 = -((0xfff - i2_m_q2_a0_d1) + 1); 656 i2_m_q2_a0_d1 = -((0xfff - i2_m_q2_a0_d1) + 1);
657 657
658 if (i2_p_q2_a0_d1 > 0x800) 658 if (i2_p_q2_a0_d1 > 0x1000)
659 i2_p_q2_a0_d1 = -((0xfff - i2_p_q2_a0_d1) + 1); 659 i2_p_q2_a0_d1 = -((0x1fff - i2_p_q2_a0_d1) + 1);
660 660
661 if (iq_corr_a0_d1 > 0x800) 661 if (iq_corr_a0_d1 > 0x800)
662 iq_corr_a0_d1 = -((0xfff - iq_corr_a0_d1) + 1); 662 iq_corr_a0_d1 = -((0xfff - iq_corr_a0_d1) + 1);
@@ -700,6 +700,19 @@ static bool ar9003_hw_calc_iq_corr(struct ath_hw *ah,
700 return false; 700 return false;
701 } 701 }
702 702
703 if ((i2_p_q2_a0_d0 < 1024) || (i2_p_q2_a0_d0 > 2047) ||
704 (i2_p_q2_a1_d0 < 0) || (i2_p_q2_a1_d1 < 0) ||
705 (i2_p_q2_a0_d0 <= i2_m_q2_a0_d0) ||
706 (i2_p_q2_a0_d0 <= iq_corr_a0_d0) ||
707 (i2_p_q2_a0_d1 <= i2_m_q2_a0_d1) ||
708 (i2_p_q2_a0_d1 <= iq_corr_a0_d1) ||
709 (i2_p_q2_a1_d0 <= i2_m_q2_a1_d0) ||
710 (i2_p_q2_a1_d0 <= iq_corr_a1_d0) ||
711 (i2_p_q2_a1_d1 <= i2_m_q2_a1_d1) ||
712 (i2_p_q2_a1_d1 <= iq_corr_a1_d1)) {
713 return false;
714 }
715
703 mag_a0_d0 = (i2_m_q2_a0_d0 * res_scale) / i2_p_q2_a0_d0; 716 mag_a0_d0 = (i2_m_q2_a0_d0 * res_scale) / i2_p_q2_a0_d0;
704 phs_a0_d0 = (iq_corr_a0_d0 * res_scale) / i2_p_q2_a0_d0; 717 phs_a0_d0 = (iq_corr_a0_d0 * res_scale) / i2_p_q2_a0_d0;
705 718
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index f622a986c8cc..b5ac32cfbeb8 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -146,7 +146,9 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
146 146
147#define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)]) 147#define ATH_AN_2_TID(_an, _tidno) (&(_an)->tid[(_tidno)])
148 148
149#define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e)) 149#define IS_HT_RATE(rate) (rate & 0x80)
150#define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e))
151#define IS_OFDM_RATE(rate) ((rate >= 0x8) && (rate <= 0xf))
150 152
151struct ath_txq { 153struct ath_txq {
152 int mac80211_qnum; /* mac80211 queue number, -1 means not mac80211 Q */ 154 int mac80211_qnum; /* mac80211 queue number, -1 means not mac80211 Q */
@@ -262,6 +264,10 @@ struct ath_node {
262 264
263 bool sleeping; 265 bool sleeping;
264 bool no_ps_filter; 266 bool no_ps_filter;
267
268#ifdef CONFIG_ATH9K_STATION_STATISTICS
269 struct ath_rx_rate_stats rx_rate_stats;
270#endif
265}; 271};
266 272
267struct ath_tx_control { 273struct ath_tx_control {
@@ -685,6 +691,7 @@ void ath_ant_comb_scan(struct ath_softc *sc, struct ath_rx_status *rs);
685#define DEFAULT_CACHELINE 32 691#define DEFAULT_CACHELINE 32
686#define ATH_CABQ_READY_TIME 80 /* % of beacon interval */ 692#define ATH_CABQ_READY_TIME 80 /* % of beacon interval */
687#define ATH_TXPOWER_MAX 100 /* .5 dBm units */ 693#define ATH_TXPOWER_MAX 100 /* .5 dBm units */
694#define MAX_GTT_CNT 5
688 695
689enum sc_op_flags { 696enum sc_op_flags {
690 SC_OP_INVALID, 697 SC_OP_INVALID,
@@ -727,6 +734,7 @@ struct ath_softc {
727 unsigned long sc_flags; 734 unsigned long sc_flags;
728 unsigned long driver_data; 735 unsigned long driver_data;
729 736
737 u8 gtt_cnt;
730 u32 intrstatus; 738 u32 intrstatus;
731 u16 ps_flags; /* PS_* */ 739 u16 ps_flags; /* PS_* */
732 u16 curtxpow; 740 u16 curtxpow;
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
index b041052a10ee..ab7264c1d8f7 100644
--- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -943,14 +943,10 @@ static const struct file_operations fops_reset = {
943static ssize_t read_file_recv(struct file *file, char __user *user_buf, 943static ssize_t read_file_recv(struct file *file, char __user *user_buf,
944 size_t count, loff_t *ppos) 944 size_t count, loff_t *ppos)
945{ 945{
946#define PHY_ERR(s, p) \
947 len += scnprintf(buf + len, size - len, "%22s : %10u\n", s, \
948 sc->debug.stats.rxstats.phy_err_stats[p]);
949
950#define RXS_ERR(s, e) \ 946#define RXS_ERR(s, e) \
951 do { \ 947 do { \
952 len += scnprintf(buf + len, size - len, \ 948 len += scnprintf(buf + len, size - len, \
953 "%22s : %10u\n", s, \ 949 "%18s : %10u\n", s, \
954 sc->debug.stats.rxstats.e);\ 950 sc->debug.stats.rxstats.e);\
955 } while (0) 951 } while (0)
956 952
@@ -963,6 +959,12 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf,
963 if (buf == NULL) 959 if (buf == NULL)
964 return -ENOMEM; 960 return -ENOMEM;
965 961
962 RXS_ERR("PKTS-ALL", rx_pkts_all);
963 RXS_ERR("BYTES-ALL", rx_bytes_all);
964 RXS_ERR("BEACONS", rx_beacons);
965 RXS_ERR("FRAGS", rx_frags);
966 RXS_ERR("SPECTRAL", rx_spectral);
967
966 RXS_ERR("CRC ERR", crc_err); 968 RXS_ERR("CRC ERR", crc_err);
967 RXS_ERR("DECRYPT CRC ERR", decrypt_crc_err); 969 RXS_ERR("DECRYPT CRC ERR", decrypt_crc_err);
968 RXS_ERR("PHY ERR", phy_err); 970 RXS_ERR("PHY ERR", phy_err);
@@ -970,43 +972,10 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf,
970 RXS_ERR("PRE-DELIM CRC ERR", pre_delim_crc_err); 972 RXS_ERR("PRE-DELIM CRC ERR", pre_delim_crc_err);
971 RXS_ERR("POST-DELIM CRC ERR", post_delim_crc_err); 973 RXS_ERR("POST-DELIM CRC ERR", post_delim_crc_err);
972 RXS_ERR("DECRYPT BUSY ERR", decrypt_busy_err); 974 RXS_ERR("DECRYPT BUSY ERR", decrypt_busy_err);
973 RXS_ERR("RX-LENGTH-ERR", rx_len_err); 975 RXS_ERR("LENGTH-ERR", rx_len_err);
974 RXS_ERR("RX-OOM-ERR", rx_oom_err); 976 RXS_ERR("OOM-ERR", rx_oom_err);
975 RXS_ERR("RX-RATE-ERR", rx_rate_err); 977 RXS_ERR("RATE-ERR", rx_rate_err);
976 RXS_ERR("RX-TOO-MANY-FRAGS", rx_too_many_frags_err); 978 RXS_ERR("TOO-MANY-FRAGS", rx_too_many_frags_err);
977
978 PHY_ERR("UNDERRUN ERR", ATH9K_PHYERR_UNDERRUN);
979 PHY_ERR("TIMING ERR", ATH9K_PHYERR_TIMING);
980 PHY_ERR("PARITY ERR", ATH9K_PHYERR_PARITY);
981 PHY_ERR("RATE ERR", ATH9K_PHYERR_RATE);
982 PHY_ERR("LENGTH ERR", ATH9K_PHYERR_LENGTH);
983 PHY_ERR("RADAR ERR", ATH9K_PHYERR_RADAR);
984 PHY_ERR("SERVICE ERR", ATH9K_PHYERR_SERVICE);
985 PHY_ERR("TOR ERR", ATH9K_PHYERR_TOR);
986 PHY_ERR("OFDM-TIMING ERR", ATH9K_PHYERR_OFDM_TIMING);
987 PHY_ERR("OFDM-SIGNAL-PARITY ERR", ATH9K_PHYERR_OFDM_SIGNAL_PARITY);
988 PHY_ERR("OFDM-RATE ERR", ATH9K_PHYERR_OFDM_RATE_ILLEGAL);
989 PHY_ERR("OFDM-LENGTH ERR", ATH9K_PHYERR_OFDM_LENGTH_ILLEGAL);
990 PHY_ERR("OFDM-POWER-DROP ERR", ATH9K_PHYERR_OFDM_POWER_DROP);
991 PHY_ERR("OFDM-SERVICE ERR", ATH9K_PHYERR_OFDM_SERVICE);
992 PHY_ERR("OFDM-RESTART ERR", ATH9K_PHYERR_OFDM_RESTART);
993 PHY_ERR("FALSE-RADAR-EXT ERR", ATH9K_PHYERR_FALSE_RADAR_EXT);
994 PHY_ERR("CCK-TIMING ERR", ATH9K_PHYERR_CCK_TIMING);
995 PHY_ERR("CCK-HEADER-CRC ERR", ATH9K_PHYERR_CCK_HEADER_CRC);
996 PHY_ERR("CCK-RATE ERR", ATH9K_PHYERR_CCK_RATE_ILLEGAL);
997 PHY_ERR("CCK-SERVICE ERR", ATH9K_PHYERR_CCK_SERVICE);
998 PHY_ERR("CCK-RESTART ERR", ATH9K_PHYERR_CCK_RESTART);
999 PHY_ERR("CCK-LENGTH ERR", ATH9K_PHYERR_CCK_LENGTH_ILLEGAL);
1000 PHY_ERR("CCK-POWER-DROP ERR", ATH9K_PHYERR_CCK_POWER_DROP);
1001 PHY_ERR("HT-CRC ERR", ATH9K_PHYERR_HT_CRC_ERROR);
1002 PHY_ERR("HT-LENGTH ERR", ATH9K_PHYERR_HT_LENGTH_ILLEGAL);
1003 PHY_ERR("HT-RATE ERR", ATH9K_PHYERR_HT_RATE_ILLEGAL);
1004
1005 RXS_ERR("RX-Pkts-All", rx_pkts_all);
1006 RXS_ERR("RX-Bytes-All", rx_bytes_all);
1007 RXS_ERR("RX-Beacons", rx_beacons);
1008 RXS_ERR("RX-Frags", rx_frags);
1009 RXS_ERR("RX-Spectral", rx_spectral);
1010 979
1011 if (len > size) 980 if (len > size)
1012 len = size; 981 len = size;
@@ -1017,7 +986,6 @@ static ssize_t read_file_recv(struct file *file, char __user *user_buf,
1017 return retval; 986 return retval;
1018 987
1019#undef RXS_ERR 988#undef RXS_ERR
1020#undef PHY_ERR
1021} 989}
1022 990
1023void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs) 991void ath_debug_stat_rx(struct ath_softc *sc, struct ath_rx_status *rs)
@@ -1056,6 +1024,67 @@ static const struct file_operations fops_recv = {
1056 .llseek = default_llseek, 1024 .llseek = default_llseek,
1057}; 1025};
1058 1026
1027static ssize_t read_file_phy_err(struct file *file, char __user *user_buf,
1028 size_t count, loff_t *ppos)
1029{
1030#define PHY_ERR(s, p) \
1031 len += scnprintf(buf + len, size - len, "%22s : %10u\n", s, \
1032 sc->debug.stats.rxstats.phy_err_stats[p]);
1033
1034 struct ath_softc *sc = file->private_data;
1035 char *buf;
1036 unsigned int len = 0, size = 1600;
1037 ssize_t retval = 0;
1038
1039 buf = kzalloc(size, GFP_KERNEL);
1040 if (buf == NULL)
1041 return -ENOMEM;
1042
1043 PHY_ERR("UNDERRUN ERR", ATH9K_PHYERR_UNDERRUN);
1044 PHY_ERR("TIMING ERR", ATH9K_PHYERR_TIMING);
1045 PHY_ERR("PARITY ERR", ATH9K_PHYERR_PARITY);
1046 PHY_ERR("RATE ERR", ATH9K_PHYERR_RATE);
1047 PHY_ERR("LENGTH ERR", ATH9K_PHYERR_LENGTH);
1048 PHY_ERR("RADAR ERR", ATH9K_PHYERR_RADAR);
1049 PHY_ERR("SERVICE ERR", ATH9K_PHYERR_SERVICE);
1050 PHY_ERR("TOR ERR", ATH9K_PHYERR_TOR);
1051 PHY_ERR("OFDM-TIMING ERR", ATH9K_PHYERR_OFDM_TIMING);
1052 PHY_ERR("OFDM-SIGNAL-PARITY ERR", ATH9K_PHYERR_OFDM_SIGNAL_PARITY);
1053 PHY_ERR("OFDM-RATE ERR", ATH9K_PHYERR_OFDM_RATE_ILLEGAL);
1054 PHY_ERR("OFDM-LENGTH ERR", ATH9K_PHYERR_OFDM_LENGTH_ILLEGAL);
1055 PHY_ERR("OFDM-POWER-DROP ERR", ATH9K_PHYERR_OFDM_POWER_DROP);
1056 PHY_ERR("OFDM-SERVICE ERR", ATH9K_PHYERR_OFDM_SERVICE);
1057 PHY_ERR("OFDM-RESTART ERR", ATH9K_PHYERR_OFDM_RESTART);
1058 PHY_ERR("FALSE-RADAR-EXT ERR", ATH9K_PHYERR_FALSE_RADAR_EXT);
1059 PHY_ERR("CCK-TIMING ERR", ATH9K_PHYERR_CCK_TIMING);
1060 PHY_ERR("CCK-HEADER-CRC ERR", ATH9K_PHYERR_CCK_HEADER_CRC);
1061 PHY_ERR("CCK-RATE ERR", ATH9K_PHYERR_CCK_RATE_ILLEGAL);
1062 PHY_ERR("CCK-SERVICE ERR", ATH9K_PHYERR_CCK_SERVICE);
1063 PHY_ERR("CCK-RESTART ERR", ATH9K_PHYERR_CCK_RESTART);
1064 PHY_ERR("CCK-LENGTH ERR", ATH9K_PHYERR_CCK_LENGTH_ILLEGAL);
1065 PHY_ERR("CCK-POWER-DROP ERR", ATH9K_PHYERR_CCK_POWER_DROP);
1066 PHY_ERR("HT-CRC ERR", ATH9K_PHYERR_HT_CRC_ERROR);
1067 PHY_ERR("HT-LENGTH ERR", ATH9K_PHYERR_HT_LENGTH_ILLEGAL);
1068 PHY_ERR("HT-RATE ERR", ATH9K_PHYERR_HT_RATE_ILLEGAL);
1069
1070 if (len > size)
1071 len = size;
1072
1073 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
1074 kfree(buf);
1075
1076 return retval;
1077
1078#undef PHY_ERR
1079}
1080
1081static const struct file_operations fops_phy_err = {
1082 .read = read_file_phy_err,
1083 .open = simple_open,
1084 .owner = THIS_MODULE,
1085 .llseek = default_llseek,
1086};
1087
1059static ssize_t read_file_regidx(struct file *file, char __user *user_buf, 1088static ssize_t read_file_regidx(struct file *file, char __user *user_buf,
1060 size_t count, loff_t *ppos) 1089 size_t count, loff_t *ppos)
1061{ 1090{
@@ -1322,86 +1351,6 @@ static const struct file_operations fops_btcoex = {
1322}; 1351};
1323#endif 1352#endif
1324 1353
1325static ssize_t read_file_node_stat(struct file *file, char __user *user_buf,
1326 size_t count, loff_t *ppos)
1327{
1328 struct ath_node *an = file->private_data;
1329 struct ath_softc *sc = an->sc;
1330 struct ath_atx_tid *tid;
1331 struct ath_atx_ac *ac;
1332 struct ath_txq *txq;
1333 u32 len = 0, size = 4096;
1334 char *buf;
1335 size_t retval;
1336 int tidno, acno;
1337
1338 buf = kzalloc(size, GFP_KERNEL);
1339 if (buf == NULL)
1340 return -ENOMEM;
1341
1342 if (!an->sta->ht_cap.ht_supported) {
1343 len = scnprintf(buf, size, "%s\n",
1344 "HT not supported");
1345 goto exit;
1346 }
1347
1348 len = scnprintf(buf, size, "Max-AMPDU: %d\n",
1349 an->maxampdu);
1350 len += scnprintf(buf + len, size - len, "MPDU Density: %d\n\n",
1351 an->mpdudensity);
1352
1353 len += scnprintf(buf + len, size - len,
1354 "%2s%7s\n", "AC", "SCHED");
1355
1356 for (acno = 0, ac = &an->ac[acno];
1357 acno < IEEE80211_NUM_ACS; acno++, ac++) {
1358 txq = ac->txq;
1359 ath_txq_lock(sc, txq);
1360 len += scnprintf(buf + len, size - len,
1361 "%2d%7d\n",
1362 acno, ac->sched);
1363 ath_txq_unlock(sc, txq);
1364 }
1365
1366 len += scnprintf(buf + len, size - len,
1367 "\n%3s%11s%10s%10s%10s%10s%9s%6s%8s\n",
1368 "TID", "SEQ_START", "SEQ_NEXT", "BAW_SIZE",
1369 "BAW_HEAD", "BAW_TAIL", "BAR_IDX", "SCHED", "PAUSED");
1370
1371 for (tidno = 0, tid = &an->tid[tidno];
1372 tidno < IEEE80211_NUM_TIDS; tidno++, tid++) {
1373 txq = tid->ac->txq;
1374 ath_txq_lock(sc, txq);
1375 len += scnprintf(buf + len, size - len,
1376 "%3d%11d%10d%10d%10d%10d%9d%6d%8d\n",
1377 tid->tidno, tid->seq_start, tid->seq_next,
1378 tid->baw_size, tid->baw_head, tid->baw_tail,
1379 tid->bar_index, tid->sched, tid->paused);
1380 ath_txq_unlock(sc, txq);
1381 }
1382exit:
1383 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
1384 kfree(buf);
1385
1386 return retval;
1387}
1388
1389static const struct file_operations fops_node_stat = {
1390 .read = read_file_node_stat,
1391 .open = simple_open,
1392 .owner = THIS_MODULE,
1393 .llseek = default_llseek,
1394};
1395
1396void ath9k_sta_add_debugfs(struct ieee80211_hw *hw,
1397 struct ieee80211_vif *vif,
1398 struct ieee80211_sta *sta,
1399 struct dentry *dir)
1400{
1401 struct ath_node *an = (struct ath_node *)sta->drv_priv;
1402 debugfs_create_file("node_stat", S_IRUGO, dir, an, &fops_node_stat);
1403}
1404
1405/* Ethtool support for get-stats */ 1354/* Ethtool support for get-stats */
1406 1355
1407#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO" 1356#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO"
@@ -1569,6 +1518,8 @@ int ath9k_init_debug(struct ath_hw *ah)
1569 &fops_reset); 1518 &fops_reset);
1570 debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy, sc, 1519 debugfs_create_file("recv", S_IRUSR, sc->debug.debugfs_phy, sc,
1571 &fops_recv); 1520 &fops_recv);
1521 debugfs_create_file("phy_err", S_IRUSR, sc->debug.debugfs_phy, sc,
1522 &fops_phy_err);
1572 debugfs_create_u8("rx_chainmask", S_IRUSR, sc->debug.debugfs_phy, 1523 debugfs_create_u8("rx_chainmask", S_IRUSR, sc->debug.debugfs_phy,
1573 &ah->rxchainmask); 1524 &ah->rxchainmask);
1574 debugfs_create_u8("tx_chainmask", S_IRUSR, sc->debug.debugfs_phy, 1525 debugfs_create_u8("tx_chainmask", S_IRUSR, sc->debug.debugfs_phy,
diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h
index ec02d38ea8ea..cc7a025d833e 100644
--- a/drivers/net/wireless/ath/ath9k/debug.h
+++ b/drivers/net/wireless/ath/ath9k/debug.h
@@ -27,11 +27,13 @@ struct fft_sample_tlv;
27 27
28#ifdef CONFIG_ATH9K_DEBUGFS 28#ifdef CONFIG_ATH9K_DEBUGFS
29#define TX_STAT_INC(q, c) sc->debug.stats.txstats[q].c++ 29#define TX_STAT_INC(q, c) sc->debug.stats.txstats[q].c++
30#define RX_STAT_INC(c) (sc->debug.stats.rxstats.c++)
30#define RESET_STAT_INC(sc, type) sc->debug.stats.reset[type]++ 31#define RESET_STAT_INC(sc, type) sc->debug.stats.reset[type]++
31#define ANT_STAT_INC(i, c) sc->debug.stats.ant_stats[i].c++ 32#define ANT_STAT_INC(i, c) sc->debug.stats.ant_stats[i].c++
32#define ANT_LNA_INC(i, c) sc->debug.stats.ant_stats[i].lna_recv_cnt[c]++; 33#define ANT_LNA_INC(i, c) sc->debug.stats.ant_stats[i].lna_recv_cnt[c]++;
33#else 34#else
34#define TX_STAT_INC(q, c) do { } while (0) 35#define TX_STAT_INC(q, c) do { } while (0)
36#define RX_STAT_INC(c)
35#define RESET_STAT_INC(sc, type) do { } while (0) 37#define RESET_STAT_INC(sc, type) do { } while (0)
36#define ANT_STAT_INC(i, c) do { } while (0) 38#define ANT_STAT_INC(i, c) do { } while (0)
37#define ANT_LNA_INC(i, c) do { } while (0) 39#define ANT_LNA_INC(i, c) do { } while (0)
@@ -42,6 +44,7 @@ enum ath_reset_type {
42 RESET_TYPE_BB_WATCHDOG, 44 RESET_TYPE_BB_WATCHDOG,
43 RESET_TYPE_FATAL_INT, 45 RESET_TYPE_FATAL_INT,
44 RESET_TYPE_TX_ERROR, 46 RESET_TYPE_TX_ERROR,
47 RESET_TYPE_TX_GTT,
45 RESET_TYPE_TX_HANG, 48 RESET_TYPE_TX_HANG,
46 RESET_TYPE_PLL_HANG, 49 RESET_TYPE_PLL_HANG,
47 RESET_TYPE_MAC_HANG, 50 RESET_TYPE_MAC_HANG,
@@ -201,7 +204,23 @@ struct ath_tx_stats {
201 TXSTATS[PR_QNUM(IEEE80211_AC_VO)].elem); \ 204 TXSTATS[PR_QNUM(IEEE80211_AC_VO)].elem); \
202 } while(0) 205 } while(0)
203 206
204#define RX_STAT_INC(c) (sc->debug.stats.rxstats.c++) 207struct ath_rx_rate_stats {
208 struct {
209 u32 ht20_cnt;
210 u32 ht40_cnt;
211 u32 sgi_cnt;
212 u32 lgi_cnt;
213 } ht_stats[24];
214
215 struct {
216 u32 ofdm_cnt;
217 } ofdm_stats[8];
218
219 struct {
220 u32 cck_lp_cnt;
221 u32 cck_sp_cnt;
222 } cck_stats[4];
223};
205 224
206/** 225/**
207 * struct ath_rx_stats - RX Statistics 226 * struct ath_rx_stats - RX Statistics
@@ -299,8 +318,6 @@ void ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause);
299 318
300#else 319#else
301 320
302#define RX_STAT_INC(c) /* NOP */
303
304static inline int ath9k_init_debug(struct ath_hw *ah) 321static inline int ath9k_init_debug(struct ath_hw *ah)
305{ 322{
306 return 0; 323 return 0;
@@ -338,4 +355,16 @@ ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause)
338 355
339#endif /* CONFIG_ATH9K_DEBUGFS */ 356#endif /* CONFIG_ATH9K_DEBUGFS */
340 357
358#ifdef CONFIG_ATH9K_STATION_STATISTICS
359void ath_debug_rate_stats(struct ath_softc *sc,
360 struct ath_rx_status *rs,
361 struct sk_buff *skb);
362#else
363static inline void ath_debug_rate_stats(struct ath_softc *sc,
364 struct ath_rx_status *rs,
365 struct sk_buff *skb)
366{
367}
368#endif /* CONFIG_ATH9K_STATION_STATISTICS */
369
341#endif /* DEBUG_H */ 370#endif /* DEBUG_H */
diff --git a/drivers/net/wireless/ath/ath9k/debug_sta.c b/drivers/net/wireless/ath/ath9k/debug_sta.c
new file mode 100644
index 000000000000..d76e6e0120d2
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/debug_sta.c
@@ -0,0 +1,269 @@
1/*
2 * Copyright (c) 2013 Qualcomm Atheros, Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "ath9k.h"
18
19/*************/
20/* node_aggr */
21/*************/
22
23static ssize_t read_file_node_aggr(struct file *file, char __user *user_buf,
24 size_t count, loff_t *ppos)
25{
26 struct ath_node *an = file->private_data;
27 struct ath_softc *sc = an->sc;
28 struct ath_atx_tid *tid;
29 struct ath_atx_ac *ac;
30 struct ath_txq *txq;
31 u32 len = 0, size = 4096;
32 char *buf;
33 size_t retval;
34 int tidno, acno;
35
36 buf = kzalloc(size, GFP_KERNEL);
37 if (buf == NULL)
38 return -ENOMEM;
39
40 if (!an->sta->ht_cap.ht_supported) {
41 len = scnprintf(buf, size, "%s\n",
42 "HT not supported");
43 goto exit;
44 }
45
46 len = scnprintf(buf, size, "Max-AMPDU: %d\n",
47 an->maxampdu);
48 len += scnprintf(buf + len, size - len, "MPDU Density: %d\n\n",
49 an->mpdudensity);
50
51 len += scnprintf(buf + len, size - len,
52 "%2s%7s\n", "AC", "SCHED");
53
54 for (acno = 0, ac = &an->ac[acno];
55 acno < IEEE80211_NUM_ACS; acno++, ac++) {
56 txq = ac->txq;
57 ath_txq_lock(sc, txq);
58 len += scnprintf(buf + len, size - len,
59 "%2d%7d\n",
60 acno, ac->sched);
61 ath_txq_unlock(sc, txq);
62 }
63
64 len += scnprintf(buf + len, size - len,
65 "\n%3s%11s%10s%10s%10s%10s%9s%6s%8s\n",
66 "TID", "SEQ_START", "SEQ_NEXT", "BAW_SIZE",
67 "BAW_HEAD", "BAW_TAIL", "BAR_IDX", "SCHED", "PAUSED");
68
69 for (tidno = 0, tid = &an->tid[tidno];
70 tidno < IEEE80211_NUM_TIDS; tidno++, tid++) {
71 txq = tid->ac->txq;
72 ath_txq_lock(sc, txq);
73 if (tid->active) {
74 len += scnprintf(buf + len, size - len,
75 "%3d%11d%10d%10d%10d%10d%9d%6d%8d\n",
76 tid->tidno,
77 tid->seq_start,
78 tid->seq_next,
79 tid->baw_size,
80 tid->baw_head,
81 tid->baw_tail,
82 tid->bar_index,
83 tid->sched,
84 tid->paused);
85 }
86 ath_txq_unlock(sc, txq);
87 }
88exit:
89 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
90 kfree(buf);
91
92 return retval;
93}
94
95static const struct file_operations fops_node_aggr = {
96 .read = read_file_node_aggr,
97 .open = simple_open,
98 .owner = THIS_MODULE,
99 .llseek = default_llseek,
100};
101
102/*************/
103/* node_recv */
104/*************/
105
106void ath_debug_rate_stats(struct ath_softc *sc,
107 struct ath_rx_status *rs,
108 struct sk_buff *skb)
109{
110 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
111 struct ath_hw *ah = sc->sc_ah;
112 struct ieee80211_rx_status *rxs;
113 struct ath_rx_rate_stats *rstats;
114 struct ieee80211_sta *sta;
115 struct ath_node *an;
116
117 if (!ieee80211_is_data(hdr->frame_control))
118 return;
119
120 rcu_read_lock();
121
122 sta = ieee80211_find_sta_by_ifaddr(sc->hw, hdr->addr2, NULL);
123 if (!sta)
124 goto exit;
125
126 an = (struct ath_node *) sta->drv_priv;
127 rstats = &an->rx_rate_stats;
128 rxs = IEEE80211_SKB_RXCB(skb);
129
130 if (IS_HT_RATE(rs->rs_rate)) {
131 if (rxs->rate_idx >= ARRAY_SIZE(rstats->ht_stats))
132 goto exit;
133
134 if (rxs->flag & RX_FLAG_40MHZ)
135 rstats->ht_stats[rxs->rate_idx].ht40_cnt++;
136 else
137 rstats->ht_stats[rxs->rate_idx].ht20_cnt++;
138
139 if (rxs->flag & RX_FLAG_SHORT_GI)
140 rstats->ht_stats[rxs->rate_idx].sgi_cnt++;
141 else
142 rstats->ht_stats[rxs->rate_idx].lgi_cnt++;
143
144 goto exit;
145 }
146
147 if (IS_CCK_RATE(rs->rs_rate)) {
148 if (rxs->flag & RX_FLAG_SHORTPRE)
149 rstats->cck_stats[rxs->rate_idx].cck_sp_cnt++;
150 else
151 rstats->cck_stats[rxs->rate_idx].cck_lp_cnt++;
152
153 goto exit;
154 }
155
156 if (IS_OFDM_RATE(rs->rs_rate)) {
157 if (ah->curchan->chan->band == IEEE80211_BAND_2GHZ)
158 rstats->ofdm_stats[rxs->rate_idx - 4].ofdm_cnt++;
159 else
160 rstats->ofdm_stats[rxs->rate_idx].ofdm_cnt++;
161 }
162exit:
163 rcu_read_unlock();
164}
165
166#define PRINT_CCK_RATE(str, i, sp) \
167 do { \
168 len += scnprintf(buf + len, size - len, \
169 "%11s : %10u\n", \
170 str, \
171 (sp) ? rstats->cck_stats[i].cck_sp_cnt : \
172 rstats->cck_stats[i].cck_lp_cnt); \
173 } while (0)
174
175#define PRINT_OFDM_RATE(str, i) \
176 do { \
177 len += scnprintf(buf + len, size - len, \
178 "%11s : %10u\n", \
179 str, \
180 rstats->ofdm_stats[i].ofdm_cnt); \
181 } while (0)
182
183static ssize_t read_file_node_recv(struct file *file, char __user *user_buf,
184 size_t count, loff_t *ppos)
185{
186 struct ath_node *an = file->private_data;
187 struct ath_softc *sc = an->sc;
188 struct ath_hw *ah = sc->sc_ah;
189 struct ath_rx_rate_stats *rstats;
190 struct ieee80211_sta *sta = an->sta;
191 enum ieee80211_band band;
192 u32 len = 0, size = 4096;
193 char *buf;
194 size_t retval;
195 int i;
196
197 buf = kzalloc(size, GFP_KERNEL);
198 if (buf == NULL)
199 return -ENOMEM;
200
201 band = ah->curchan->chan->band;
202 rstats = &an->rx_rate_stats;
203
204 if (!sta->ht_cap.ht_supported)
205 goto legacy;
206
207 len += scnprintf(buf + len, size - len,
208 "%24s%10s%10s%10s\n",
209 "HT20", "HT40", "SGI", "LGI");
210
211 for (i = 0; i < 24; i++) {
212 len += scnprintf(buf + len, size - len,
213 "%8s%3u : %10u%10u%10u%10u\n",
214 "MCS", i,
215 rstats->ht_stats[i].ht20_cnt,
216 rstats->ht_stats[i].ht40_cnt,
217 rstats->ht_stats[i].sgi_cnt,
218 rstats->ht_stats[i].lgi_cnt);
219 }
220
221 len += scnprintf(buf + len, size - len, "\n");
222
223legacy:
224 if (band == IEEE80211_BAND_2GHZ) {
225 PRINT_CCK_RATE("CCK-1M/LP", 0, false);
226 PRINT_CCK_RATE("CCK-2M/LP", 1, false);
227 PRINT_CCK_RATE("CCK-5.5M/LP", 2, false);
228 PRINT_CCK_RATE("CCK-11M/LP", 3, false);
229
230 PRINT_CCK_RATE("CCK-2M/SP", 1, true);
231 PRINT_CCK_RATE("CCK-5.5M/SP", 2, true);
232 PRINT_CCK_RATE("CCK-11M/SP", 3, true);
233 }
234
235 PRINT_OFDM_RATE("OFDM-6M", 0);
236 PRINT_OFDM_RATE("OFDM-9M", 1);
237 PRINT_OFDM_RATE("OFDM-12M", 2);
238 PRINT_OFDM_RATE("OFDM-18M", 3);
239 PRINT_OFDM_RATE("OFDM-24M", 4);
240 PRINT_OFDM_RATE("OFDM-36M", 5);
241 PRINT_OFDM_RATE("OFDM-48M", 6);
242 PRINT_OFDM_RATE("OFDM-54M", 7);
243
244 retval = simple_read_from_buffer(user_buf, count, ppos, buf, len);
245 kfree(buf);
246
247 return retval;
248}
249
250#undef PRINT_OFDM_RATE
251#undef PRINT_CCK_RATE
252
253static const struct file_operations fops_node_recv = {
254 .read = read_file_node_recv,
255 .open = simple_open,
256 .owner = THIS_MODULE,
257 .llseek = default_llseek,
258};
259
260void ath9k_sta_add_debugfs(struct ieee80211_hw *hw,
261 struct ieee80211_vif *vif,
262 struct ieee80211_sta *sta,
263 struct dentry *dir)
264{
265 struct ath_node *an = (struct ath_node *)sta->drv_priv;
266
267 debugfs_create_file("node_aggr", S_IRUGO, dir, an, &fops_node_aggr);
268 debugfs_create_file("node_recv", S_IRUGO, dir, an, &fops_node_recv);
269}
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index b576c44bb314..f4e1de20d99c 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -748,7 +748,6 @@ static void ath9k_set_hw_capab(struct ath9k_htc_priv *priv,
748 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL; 748 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
749 749
750 hw->queues = 4; 750 hw->queues = 4;
751 hw->channel_change_time = 5000;
752 hw->max_listen_interval = 1; 751 hw->max_listen_interval = 1;
753 752
754 hw->vif_data_size = sizeof(struct ath9k_htc_vif); 753 hw->vif_data_size = sizeof(struct ath9k_htc_vif);
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
index b41e008298dc..12e0f32a4905 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c
@@ -1075,9 +1075,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
1075 1075
1076 last_rssi = priv->rx.last_rssi; 1076 last_rssi = priv->rx.last_rssi;
1077 1077
1078 if (ieee80211_is_beacon(hdr->frame_control) && 1078 if (ath_is_mybeacon(common, hdr)) {
1079 !is_zero_ether_addr(common->curbssid) &&
1080 ether_addr_equal_64bits(hdr->addr3, common->curbssid)) {
1081 s8 rssi = rxbuf->rxstatus.rs_rssi; 1079 s8 rssi = rxbuf->rxstatus.rs_rssi;
1082 1080
1083 if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER)) 1081 if (likely(last_rssi != ATH_RSSI_DUMMY_MARKER))
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
index f2a17fcf1ae4..c36de303c8f3 100644
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -946,7 +946,6 @@ static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
946 946
947 hw->queues = 4; 947 hw->queues = 4;
948 hw->max_rates = 4; 948 hw->max_rates = 4;
949 hw->channel_change_time = 5000;
950 hw->max_listen_interval = 1; 949 hw->max_listen_interval = 1;
951 hw->max_rate_tries = 10; 950 hw->max_rate_tries = 10;
952 hw->sta_data_size = sizeof(struct ath_node); 951 hw->sta_data_size = sizeof(struct ath_node);
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index d0c3aec7c74e..73a36551a5ed 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -258,6 +258,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
258 } 258 }
259 } 259 }
260 260
261 sc->gtt_cnt = 0;
261 ieee80211_wake_queues(sc->hw); 262 ieee80211_wake_queues(sc->hw);
262 263
263 return true; 264 return true;
@@ -476,6 +477,19 @@ void ath9k_tasklet(unsigned long data)
476 } 477 }
477 } 478 }
478 479
480 if (status & ATH9K_INT_GTT) {
481 sc->gtt_cnt++;
482
483 if ((sc->gtt_cnt >= MAX_GTT_CNT) && !ath9k_hw_check_alive(ah)) {
484 type = RESET_TYPE_TX_GTT;
485 ath9k_queue_reset(sc, type);
486 atomic_inc(&ah->intr_ref_cnt);
487 ath_dbg(common, ANY,
488 "GTT: Skipping interrupts\n");
489 goto out;
490 }
491 }
492
479 spin_lock_irqsave(&sc->sc_pm_lock, flags); 493 spin_lock_irqsave(&sc->sc_pm_lock, flags);
480 if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) { 494 if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
481 /* 495 /*
@@ -503,10 +517,19 @@ void ath9k_tasklet(unsigned long data)
503 } 517 }
504 518
505 if (status & ATH9K_INT_TX) { 519 if (status & ATH9K_INT_TX) {
506 if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) 520 if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) {
521 /*
522 * For EDMA chips, TX completion is enabled for the
523 * beacon queue, so if a beacon has been transmitted
524 * successfully after a GTT interrupt, the GTT counter
525 * gets reset to zero here.
526 */
527 /* sc->gtt_cnt = 0; */
528
507 ath_tx_edma_tasklet(sc); 529 ath_tx_edma_tasklet(sc);
508 else 530 } else {
509 ath_tx_tasklet(sc); 531 ath_tx_tasklet(sc);
532 }
510 533
511 wake_up(&sc->tx_wait); 534 wake_up(&sc->tx_wait);
512 } 535 }
@@ -536,13 +559,13 @@ irqreturn_t ath_isr(int irq, void *dev)
536 ATH9K_INT_TX | \ 559 ATH9K_INT_TX | \
537 ATH9K_INT_BMISS | \ 560 ATH9K_INT_BMISS | \
538 ATH9K_INT_CST | \ 561 ATH9K_INT_CST | \
562 ATH9K_INT_GTT | \
539 ATH9K_INT_TSFOOR | \ 563 ATH9K_INT_TSFOOR | \
540 ATH9K_INT_GENTIMER | \ 564 ATH9K_INT_GENTIMER | \
541 ATH9K_INT_MCI) 565 ATH9K_INT_MCI)
542 566
543 struct ath_softc *sc = dev; 567 struct ath_softc *sc = dev;
544 struct ath_hw *ah = sc->sc_ah; 568 struct ath_hw *ah = sc->sc_ah;
545 struct ath_common *common = ath9k_hw_common(ah);
546 enum ath9k_int status; 569 enum ath9k_int status;
547 u32 sync_cause = 0; 570 u32 sync_cause = 0;
548 bool sched = false; 571 bool sched = false;
@@ -603,14 +626,12 @@ irqreturn_t ath_isr(int irq, void *dev)
603#ifdef CONFIG_ATH9K_WOW 626#ifdef CONFIG_ATH9K_WOW
604 if (status & ATH9K_INT_BMISS) { 627 if (status & ATH9K_INT_BMISS) {
605 if (atomic_read(&sc->wow_sleep_proc_intr) == 0) { 628 if (atomic_read(&sc->wow_sleep_proc_intr) == 0) {
606 ath_dbg(common, ANY, "during WoW we got a BMISS\n");
607 atomic_inc(&sc->wow_got_bmiss_intr); 629 atomic_inc(&sc->wow_got_bmiss_intr);
608 atomic_dec(&sc->wow_sleep_proc_intr); 630 atomic_dec(&sc->wow_sleep_proc_intr);
609 } 631 }
610 } 632 }
611#endif 633#endif
612 634
613
614 if (status & ATH9K_INT_SWBA) 635 if (status & ATH9K_INT_SWBA)
615 tasklet_schedule(&sc->bcon_tasklet); 636 tasklet_schedule(&sc->bcon_tasklet);
616 637
@@ -735,7 +756,12 @@ static int ath9k_start(struct ieee80211_hw *hw)
735 if (ah->config.hw_hang_checks & HW_BB_WATCHDOG) 756 if (ah->config.hw_hang_checks & HW_BB_WATCHDOG)
736 ah->imask |= ATH9K_INT_BB_WATCHDOG; 757 ah->imask |= ATH9K_INT_BB_WATCHDOG;
737 758
738 ah->imask |= ATH9K_INT_GTT; 759 /*
760 * Enable GTT interrupts only for AR9003/AR9004 chips
761 * for now.
762 */
763 if (AR_SREV_9300_20_OR_LATER(ah))
764 ah->imask |= ATH9K_INT_GTT;
739 765
740 if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) 766 if (ah->caps.hw_caps & ATH9K_HW_CAP_HT)
741 ah->imask |= ATH9K_INT_CST; 767 ah->imask |= ATH9K_INT_CST;
@@ -2111,7 +2137,7 @@ struct ieee80211_ops ath9k_ops = {
2111 .get_et_strings = ath9k_get_et_strings, 2137 .get_et_strings = ath9k_get_et_strings,
2112#endif 2138#endif
2113 2139
2114#if defined(CONFIG_MAC80211_DEBUGFS) && defined(CONFIG_ATH9K_DEBUGFS) 2140#if defined(CONFIG_MAC80211_DEBUGFS) && defined(CONFIG_ATH9K_STATION_STATISTICS)
2115 .sta_add_debugfs = ath9k_sta_add_debugfs, 2141 .sta_add_debugfs = ath9k_sta_add_debugfs,
2116#endif 2142#endif
2117 .sw_scan_start = ath9k_sw_scan_start, 2143 .sw_scan_start = ath9k_sw_scan_start,
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c
index f7cc5b37a18f..a0ebdd000fc2 100644
--- a/drivers/net/wireless/ath/ath9k/recv.c
+++ b/drivers/net/wireless/ath/ath9k/recv.c
@@ -969,21 +969,6 @@ static void ath9k_process_tsf(struct ath_rx_status *rs,
969 rxs->mactime += 0x100000000ULL; 969 rxs->mactime += 0x100000000ULL;
970} 970}
971 971
972static bool ath9k_is_mybeacon(struct ath_softc *sc, struct ieee80211_hdr *hdr)
973{
974 struct ath_hw *ah = sc->sc_ah;
975 struct ath_common *common = ath9k_hw_common(ah);
976
977 if (ieee80211_is_beacon(hdr->frame_control)) {
978 RX_STAT_INC(rx_beacons);
979 if (!is_zero_ether_addr(common->curbssid) &&
980 ether_addr_equal_64bits(hdr->addr3, common->curbssid))
981 return true;
982 }
983
984 return false;
985}
986
987/* 972/*
988 * For Decrypt or Demic errors, we only mark packet status here and always push 973 * For Decrypt or Demic errors, we only mark packet status here and always push
989 * up the frame up to let mac80211 handle the actual error case, be it no 974 * up the frame up to let mac80211 handle the actual error case, be it no
@@ -1071,7 +1056,10 @@ static int ath9k_rx_skb_preprocess(struct ath_softc *sc,
1071 goto exit; 1056 goto exit;
1072 } 1057 }
1073 1058
1074 rx_stats->is_mybeacon = ath9k_is_mybeacon(sc, hdr); 1059 if (ath_is_mybeacon(common, hdr)) {
1060 RX_STAT_INC(rx_beacons);
1061 rx_stats->is_mybeacon = true;
1062 }
1075 1063
1076 /* 1064 /*
1077 * This shouldn't happen, but have a safety check anyway. 1065 * This shouldn't happen, but have a safety check anyway.
@@ -1354,8 +1342,8 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp)
1354 spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 1342 spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1355 1343
1356 ath9k_antenna_check(sc, &rs); 1344 ath9k_antenna_check(sc, &rs);
1357
1358 ath9k_apply_ampdu_details(sc, &rs, rxs); 1345 ath9k_apply_ampdu_details(sc, &rs, rxs);
1346 ath_debug_rate_stats(sc, &rs, skb);
1359 1347
1360 ieee80211_rx(hw, skb); 1348 ieee80211_rx(hw, skb);
1361 1349
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index e8d0e7fc77da..0a75e2f68c9d 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -47,8 +47,6 @@ static u16 bits_per_symbol[][2] = {
47 { 260, 540 }, /* 7: 64-QAM 5/6 */ 47 { 260, 540 }, /* 7: 64-QAM 5/6 */
48}; 48};
49 49
50#define IS_HT_RATE(_rate) ((_rate) & 0x80)
51
52static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq, 50static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq,
53 struct ath_atx_tid *tid, struct sk_buff *skb); 51 struct ath_atx_tid *tid, struct sk_buff *skb);
54static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, 52static void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb,
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c
index 4c3f576c3144..4c8cdb097b65 100644
--- a/drivers/net/wireless/ath/carl9170/main.c
+++ b/drivers/net/wireless/ath/carl9170/main.c
@@ -1967,18 +1967,6 @@ static int carl9170_parse_eeprom(struct ar9170 *ar)
1967 return -ENOMEM; 1967 return -ENOMEM;
1968 ar->num_channels = chans; 1968 ar->num_channels = chans;
1969 1969
1970 /*
1971 * I measured this, a bandswitch takes roughly
1972 * 135 ms and a frequency switch about 80.
1973 *
1974 * FIXME: measure these values again once EEPROM settings
1975 * are used, that will influence them!
1976 */
1977 if (bands == 2)
1978 ar->hw->channel_change_time = 135 * 1000;
1979 else
1980 ar->hw->channel_change_time = 80 * 1000;
1981
1982 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]); 1970 regulatory->current_rd = le16_to_cpu(ar->eeprom.reg_domain[0]);
1983 1971
1984 /* second part of wiphy init */ 1972 /* second part of wiphy init */
diff --git a/drivers/net/wireless/ath/carl9170/rx.c b/drivers/net/wireless/ath/carl9170/rx.c
index 1b1b20751ead..536bc46a2912 100644
--- a/drivers/net/wireless/ath/carl9170/rx.c
+++ b/drivers/net/wireless/ath/carl9170/rx.c
@@ -519,6 +519,7 @@ static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len)
519{ 519{
520 struct ieee80211_hdr *hdr = data; 520 struct ieee80211_hdr *hdr = data;
521 struct ieee80211_tim_ie *tim_ie; 521 struct ieee80211_tim_ie *tim_ie;
522 struct ath_common *common = &ar->common;
522 u8 *tim; 523 u8 *tim;
523 u8 tim_len; 524 u8 tim_len;
524 bool cam; 525 bool cam;
@@ -526,17 +527,13 @@ static void carl9170_ps_beacon(struct ar9170 *ar, void *data, unsigned int len)
526 if (likely(!(ar->hw->conf.flags & IEEE80211_CONF_PS))) 527 if (likely(!(ar->hw->conf.flags & IEEE80211_CONF_PS)))
527 return; 528 return;
528 529
529 /* check if this really is a beacon */
530 if (!ieee80211_is_beacon(hdr->frame_control))
531 return;
532
533 /* min. beacon length + FCS_LEN */ 530 /* min. beacon length + FCS_LEN */
534 if (len <= 40 + FCS_LEN) 531 if (len <= 40 + FCS_LEN)
535 return; 532 return;
536 533
534 /* check if this really is a beacon */
537 /* and only beacons from the associated BSSID, please */ 535 /* and only beacons from the associated BSSID, please */
538 if (!ether_addr_equal_64bits(hdr->addr3, ar->common.curbssid) || 536 if (!ath_is_mybeacon(common, hdr) || !common->curaid)
539 !ar->common.curaid)
540 return; 537 return;
541 538
542 ar->ps.last_beacon = jiffies; 539 ar->ps.last_beacon = jiffies;
diff --git a/drivers/net/wireless/ath/main.c b/drivers/net/wireless/ath/main.c
index 8e99540cd90e..8b0ac14d5c32 100644
--- a/drivers/net/wireless/ath/main.c
+++ b/drivers/net/wireless/ath/main.c
@@ -59,6 +59,14 @@ struct sk_buff *ath_rxbuf_alloc(struct ath_common *common,
59} 59}
60EXPORT_SYMBOL(ath_rxbuf_alloc); 60EXPORT_SYMBOL(ath_rxbuf_alloc);
61 61
62bool ath_is_mybeacon(struct ath_common *common, struct ieee80211_hdr *hdr)
63{
64 return ieee80211_is_beacon(hdr->frame_control) &&
65 !is_zero_ether_addr(common->curbssid) &&
66 ether_addr_equal_64bits(hdr->addr3, common->curbssid);
67}
68EXPORT_SYMBOL(ath_is_mybeacon);
69
62void ath_printk(const char *level, const struct ath_common* common, 70void ath_printk(const char *level, const struct ath_common* common,
63 const char *fmt, ...) 71 const char *fmt, ...)
64{ 72{
diff --git a/drivers/net/wireless/ath/regd.c b/drivers/net/wireless/ath/regd.c
index 9e154732afaa..e5e905910db4 100644
--- a/drivers/net/wireless/ath/regd.c
+++ b/drivers/net/wireless/ath/regd.c
@@ -632,7 +632,8 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
632 const struct ieee80211_regdomain *regd; 632 const struct ieee80211_regdomain *regd;
633 633
634 wiphy->reg_notifier = reg_notifier; 634 wiphy->reg_notifier = reg_notifier;
635 wiphy->regulatory_flags |= REGULATORY_STRICT_REG; 635 wiphy->regulatory_flags |= REGULATORY_STRICT_REG |
636 REGULATORY_CUSTOM_REG;
636 637
637 if (ath_is_world_regd(reg)) { 638 if (ath_is_world_regd(reg)) {
638 /* 639 /*
@@ -640,8 +641,7 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
640 * saved on the wiphy orig_* parameters 641 * saved on the wiphy orig_* parameters
641 */ 642 */
642 regd = ath_world_regdomain(reg); 643 regd = ath_world_regdomain(reg);
643 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | 644 wiphy->regulatory_flags |= REGULATORY_COUNTRY_IE_FOLLOW_POWER;
644 REGULATORY_COUNTRY_IE_FOLLOW_POWER;
645 } else { 645 } else {
646 /* 646 /*
647 * This gets applied in the case of the absence of CRDA, 647 * This gets applied in the case of the absence of CRDA,
@@ -650,6 +650,7 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
650 */ 650 */
651 regd = ath_default_world_regdomain(); 651 regd = ath_default_world_regdomain();
652 } 652 }
653
653 wiphy_apply_custom_regulatory(wiphy, regd); 654 wiphy_apply_custom_regulatory(wiphy, regd);
654 ath_reg_apply_radar_flags(wiphy); 655 ath_reg_apply_radar_flags(wiphy);
655 ath_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg); 656 ath_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c
index 9b88440ef05b..0b0975d88b43 100644
--- a/drivers/net/wireless/ath/wil6210/txrx.c
+++ b/drivers/net/wireless/ath/wil6210/txrx.c
@@ -21,7 +21,7 @@
21#include <linux/ip.h> 21#include <linux/ip.h>
22#include <linux/ipv6.h> 22#include <linux/ipv6.h>
23#include <net/ipv6.h> 23#include <net/ipv6.h>
24#include <asm/processor.h> 24#include <linux/prefetch.h>
25 25
26#include "wil6210.h" 26#include "wil6210.h"
27#include "wmi.h" 27#include "wmi.h"
diff --git a/drivers/net/wireless/b43/b43.h b/drivers/net/wireless/b43/b43.h
index 7f3d461f7e8d..54376fddfaf9 100644
--- a/drivers/net/wireless/b43/b43.h
+++ b/drivers/net/wireless/b43/b43.h
@@ -731,8 +731,6 @@ enum b43_firmware_file_type {
731struct b43_request_fw_context { 731struct b43_request_fw_context {
732 /* The device we are requesting the fw for. */ 732 /* The device we are requesting the fw for. */
733 struct b43_wldev *dev; 733 struct b43_wldev *dev;
734 /* a completion event structure needed if this call is asynchronous */
735 struct completion fw_load_complete;
736 /* a pointer to the firmware object */ 734 /* a pointer to the firmware object */
737 const struct firmware *blob; 735 const struct firmware *blob;
738 /* The type of firmware to request. */ 736 /* The type of firmware to request. */
@@ -809,6 +807,8 @@ enum {
809struct b43_wldev { 807struct b43_wldev {
810 struct b43_bus_dev *dev; 808 struct b43_bus_dev *dev;
811 struct b43_wl *wl; 809 struct b43_wl *wl;
810 /* a completion event structure needed if this call is asynchronous */
811 struct completion fw_load_complete;
812 812
813 /* The device initialization status. 813 /* The device initialization status.
814 * Use b43_status() to query. */ 814 * Use b43_status() to query. */
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index ccd24f0acb8d..c75237eb55a1 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -2070,6 +2070,7 @@ void b43_do_release_fw(struct b43_firmware_file *fw)
2070 2070
2071static void b43_release_firmware(struct b43_wldev *dev) 2071static void b43_release_firmware(struct b43_wldev *dev)
2072{ 2072{
2073 complete(&dev->fw_load_complete);
2073 b43_do_release_fw(&dev->fw.ucode); 2074 b43_do_release_fw(&dev->fw.ucode);
2074 b43_do_release_fw(&dev->fw.pcm); 2075 b43_do_release_fw(&dev->fw.pcm);
2075 b43_do_release_fw(&dev->fw.initvals); 2076 b43_do_release_fw(&dev->fw.initvals);
@@ -2095,7 +2096,7 @@ static void b43_fw_cb(const struct firmware *firmware, void *context)
2095 struct b43_request_fw_context *ctx = context; 2096 struct b43_request_fw_context *ctx = context;
2096 2097
2097 ctx->blob = firmware; 2098 ctx->blob = firmware;
2098 complete(&ctx->fw_load_complete); 2099 complete(&ctx->dev->fw_load_complete);
2099} 2100}
2100 2101
2101int b43_do_request_fw(struct b43_request_fw_context *ctx, 2102int b43_do_request_fw(struct b43_request_fw_context *ctx,
@@ -2142,7 +2143,7 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx,
2142 } 2143 }
2143 if (async) { 2144 if (async) {
2144 /* do this part asynchronously */ 2145 /* do this part asynchronously */
2145 init_completion(&ctx->fw_load_complete); 2146 init_completion(&ctx->dev->fw_load_complete);
2146 err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname, 2147 err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname,
2147 ctx->dev->dev->dev, GFP_KERNEL, 2148 ctx->dev->dev->dev, GFP_KERNEL,
2148 ctx, b43_fw_cb); 2149 ctx, b43_fw_cb);
@@ -2150,12 +2151,11 @@ int b43_do_request_fw(struct b43_request_fw_context *ctx,
2150 pr_err("Unable to load firmware\n"); 2151 pr_err("Unable to load firmware\n");
2151 return err; 2152 return err;
2152 } 2153 }
2153 /* stall here until fw ready */ 2154 wait_for_completion(&ctx->dev->fw_load_complete);
2154 wait_for_completion(&ctx->fw_load_complete);
2155 if (ctx->blob) 2155 if (ctx->blob)
2156 goto fw_ready; 2156 goto fw_ready;
2157 /* On some ARM systems, the async request will fail, but the next sync 2157 /* On some ARM systems, the async request will fail, but the next sync
2158 * request works. For this reason, we dall through here 2158 * request works. For this reason, we fall through here
2159 */ 2159 */
2160 } 2160 }
2161 err = request_firmware(&ctx->blob, ctx->fwname, 2161 err = request_firmware(&ctx->blob, ctx->fwname,
@@ -2424,6 +2424,7 @@ error:
2424 2424
2425static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl); 2425static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl);
2426static void b43_one_core_detach(struct b43_bus_dev *dev); 2426static void b43_one_core_detach(struct b43_bus_dev *dev);
2427static int b43_rng_init(struct b43_wl *wl);
2427 2428
2428static void b43_request_firmware(struct work_struct *work) 2429static void b43_request_firmware(struct work_struct *work)
2429{ 2430{
@@ -2475,6 +2476,10 @@ start_ieee80211:
2475 goto err_one_core_detach; 2476 goto err_one_core_detach;
2476 wl->hw_registred = true; 2477 wl->hw_registred = true;
2477 b43_leds_register(wl->current_dev); 2478 b43_leds_register(wl->current_dev);
2479
2480 /* Register HW RNG driver */
2481 b43_rng_init(wl);
2482
2478 goto out; 2483 goto out;
2479 2484
2480err_one_core_detach: 2485err_one_core_detach:
@@ -4636,9 +4641,6 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
4636 if (!dev || b43_status(dev) != B43_STAT_INITIALIZED) 4641 if (!dev || b43_status(dev) != B43_STAT_INITIALIZED)
4637 return; 4642 return;
4638 4643
4639 /* Unregister HW RNG driver */
4640 b43_rng_exit(dev->wl);
4641
4642 b43_set_status(dev, B43_STAT_UNINIT); 4644 b43_set_status(dev, B43_STAT_UNINIT);
4643 4645
4644 /* Stop the microcode PSM. */ 4646 /* Stop the microcode PSM. */
@@ -4795,9 +4797,6 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
4795 4797
4796 b43_set_status(dev, B43_STAT_INITIALIZED); 4798 b43_set_status(dev, B43_STAT_INITIALIZED);
4797 4799
4798 /* Register HW RNG driver */
4799 b43_rng_init(dev->wl);
4800
4801out: 4800out:
4802 return err; 4801 return err;
4803 4802
@@ -5464,6 +5463,9 @@ static void b43_bcma_remove(struct bcma_device *core)
5464 5463
5465 b43_one_core_detach(wldev->dev); 5464 b43_one_core_detach(wldev->dev);
5466 5465
5466 /* Unregister HW RNG driver */
5467 b43_rng_exit(wl);
5468
5467 b43_leds_unregister(wl); 5469 b43_leds_unregister(wl);
5468 5470
5469 ieee80211_free_hw(wl->hw); 5471 ieee80211_free_hw(wl->hw);
@@ -5541,6 +5543,9 @@ static void b43_ssb_remove(struct ssb_device *sdev)
5541 5543
5542 b43_one_core_detach(dev); 5544 b43_one_core_detach(dev);
5543 5545
5546 /* Unregister HW RNG driver */
5547 b43_rng_exit(wl);
5548
5544 if (list_empty(&wl->devlist)) { 5549 if (list_empty(&wl->devlist)) {
5545 b43_leds_unregister(wl); 5550 b43_leds_unregister(wl);
5546 /* Last core on the chip unregistered. 5551 /* Last core on the chip unregistered.
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 572668821862..349c77605231 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -3919,6 +3919,7 @@ static void b43legacy_remove(struct ssb_device *dev)
3919 * as the ieee80211 unreg will destroy the workqueue. */ 3919 * as the ieee80211 unreg will destroy the workqueue. */
3920 cancel_work_sync(&wldev->restart_work); 3920 cancel_work_sync(&wldev->restart_work);
3921 cancel_work_sync(&wl->firmware_load); 3921 cancel_work_sync(&wl->firmware_load);
3922 complete(&wldev->fw_load_complete);
3922 3923
3923 B43legacy_WARN_ON(!wl); 3924 B43legacy_WARN_ON(!wl);
3924 if (!wldev->fw.ucode) 3925 if (!wldev->fw.ucode)
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/Makefile b/drivers/net/wireless/brcm80211/brcmfmac/Makefile
index 5681b9862023..57cddee03252 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/Makefile
+++ b/drivers/net/wireless/brcm80211/brcmfmac/Makefile
@@ -32,6 +32,7 @@ brcmfmac-objs += \
32 bcdc.o \ 32 bcdc.o \
33 dhd_common.o \ 33 dhd_common.o \
34 dhd_linux.o \ 34 dhd_linux.o \
35 nvram.o \
35 btcoex.o 36 btcoex.o
36brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \ 37brcmfmac-$(CONFIG_BRCMFMAC_SDIO) += \
37 dhd_sdio.o \ 38 dhd_sdio.o \
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index 34c993dd0602..fa35b23bbaa7 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -287,6 +287,9 @@ static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
287 s32 retry = 0; 287 s32 retry = 0;
288 int ret; 288 int ret;
289 289
290 if (sdiodev->bus_if->state == BRCMF_BUS_NOMEDIUM)
291 return -ENOMEDIUM;
292
290 /* 293 /*
291 * figure out how to read the register based on address range 294 * figure out how to read the register based on address range
292 * 0x00 ~ 0x7FF: function 0 CCCR and FBR 295 * 0x00 ~ 0x7FF: function 0 CCCR and FBR
@@ -306,9 +309,12 @@ static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
306 usleep_range(1000, 2000); 309 usleep_range(1000, 2000);
307 ret = brcmf_sdiod_request_data(sdiodev, func_num, addr, regsz, 310 ret = brcmf_sdiod_request_data(sdiodev, func_num, addr, regsz,
308 data, write); 311 data, write);
309 } while (ret != 0 && retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); 312 } while (ret != 0 && ret != -ENOMEDIUM &&
313 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
310 314
311 if (ret != 0) 315 if (ret == -ENOMEDIUM)
316 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_NOMEDIUM);
317 else if (ret != 0)
312 brcmf_err("failed with %d\n", ret); 318 brcmf_err("failed with %d\n", ret);
313 319
314 return ret; 320 return ret;
@@ -320,6 +326,9 @@ brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
320 int err = 0, i; 326 int err = 0, i;
321 u8 addr[3]; 327 u8 addr[3];
322 328
329 if (sdiodev->bus_if->state == BRCMF_BUS_NOMEDIUM)
330 return -ENOMEDIUM;
331
323 addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK; 332 addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK;
324 addr[1] = (address >> 16) & SBSDIO_SBADDRMID_MASK; 333 addr[1] = (address >> 16) & SBSDIO_SBADDRMID_MASK;
325 addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK; 334 addr[2] = (address >> 24) & SBSDIO_SBADDRHIGH_MASK;
@@ -429,6 +438,7 @@ static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
429 bool write, u32 addr, struct sk_buff *pkt) 438 bool write, u32 addr, struct sk_buff *pkt)
430{ 439{
431 unsigned int req_sz; 440 unsigned int req_sz;
441 int err;
432 442
433 brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_buffer_wait); 443 brcmf_sdiod_pm_resume_wait(sdiodev, &sdiodev->request_buffer_wait);
434 if (brcmf_sdiod_pm_resume_error(sdiodev)) 444 if (brcmf_sdiod_pm_resume_error(sdiodev))
@@ -439,18 +449,18 @@ static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
439 req_sz &= (uint)~3; 449 req_sz &= (uint)~3;
440 450
441 if (write) 451 if (write)
442 return sdio_memcpy_toio(sdiodev->func[fn], addr, 452 err = sdio_memcpy_toio(sdiodev->func[fn], addr,
443 ((u8 *)(pkt->data)), 453 ((u8 *)(pkt->data)), req_sz);
444 req_sz);
445 else if (fn == 1) 454 else if (fn == 1)
446 return sdio_memcpy_fromio(sdiodev->func[fn], 455 err = sdio_memcpy_fromio(sdiodev->func[fn], ((u8 *)(pkt->data)),
447 ((u8 *)(pkt->data)), 456 addr, req_sz);
448 addr, req_sz);
449 else 457 else
450 /* function 2 read is FIFO operation */ 458 /* function 2 read is FIFO operation */
451 return sdio_readsb(sdiodev->func[fn], 459 err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
452 ((u8 *)(pkt->data)), addr, 460 req_sz);
453 req_sz); 461 if (err == -ENOMEDIUM)
462 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_NOMEDIUM);
463 return err;
454} 464}
455 465
456/** 466/**
@@ -593,7 +603,11 @@ static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn,
593 mmc_wait_for_req(sdiodev->func[fn]->card->host, &mmc_req); 603 mmc_wait_for_req(sdiodev->func[fn]->card->host, &mmc_req);
594 604
595 ret = mmc_cmd.error ? mmc_cmd.error : mmc_dat.error; 605 ret = mmc_cmd.error ? mmc_cmd.error : mmc_dat.error;
596 if (ret != 0) { 606 if (ret == -ENOMEDIUM) {
607 brcmf_bus_change_state(sdiodev->bus_if,
608 BRCMF_BUS_NOMEDIUM);
609 break;
610 } else if (ret != 0) {
597 brcmf_err("CMD53 sg block %s failed %d\n", 611 brcmf_err("CMD53 sg block %s failed %d\n",
598 write ? "write" : "read", ret); 612 write ? "write" : "read", ret);
599 ret = -EIO; 613 ret = -EIO;
@@ -852,8 +866,6 @@ int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn)
852 866
853static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev) 867static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
854{ 868{
855 sdiodev->bus_if->state = BRCMF_BUS_DOWN;
856
857 if (sdiodev->bus) { 869 if (sdiodev->bus) {
858 brcmf_sdio_remove(sdiodev->bus); 870 brcmf_sdio_remove(sdiodev->bus);
859 sdiodev->bus = NULL; 871 sdiodev->bus = NULL;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index 5c12a07673fa..c4535616064e 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -17,8 +17,12 @@
17#ifndef _BRCMF_BUS_H_ 17#ifndef _BRCMF_BUS_H_
18#define _BRCMF_BUS_H_ 18#define _BRCMF_BUS_H_
19 19
20#include "dhd_dbg.h"
21
20/* The level of bus communication with the dongle */ 22/* The level of bus communication with the dongle */
21enum brcmf_bus_state { 23enum brcmf_bus_state {
24 BRCMF_BUS_UNKNOWN, /* Not determined yet */
25 BRCMF_BUS_NOMEDIUM, /* No medium access to dongle */
22 BRCMF_BUS_DOWN, /* Not ready for frame transfers */ 26 BRCMF_BUS_DOWN, /* Not ready for frame transfers */
23 BRCMF_BUS_LOAD, /* Download access only (CPU reset) */ 27 BRCMF_BUS_LOAD, /* Download access only (CPU reset) */
24 BRCMF_BUS_DATA /* Ready for frame transfers */ 28 BRCMF_BUS_DATA /* Ready for frame transfers */
@@ -144,6 +148,23 @@ struct pktq *brcmf_bus_gettxq(struct brcmf_bus *bus)
144 148
145 return bus->ops->gettxq(bus->dev); 149 return bus->ops->gettxq(bus->dev);
146} 150}
151
152static inline bool brcmf_bus_ready(struct brcmf_bus *bus)
153{
154 return bus->state == BRCMF_BUS_LOAD || bus->state == BRCMF_BUS_DATA;
155}
156
157static inline void brcmf_bus_change_state(struct brcmf_bus *bus,
158 enum brcmf_bus_state new_state)
159{
160 /* NOMEDIUM is permanent */
161 if (bus->state == BRCMF_BUS_NOMEDIUM)
162 return;
163
164 brcmf_dbg(TRACE, "%d -> %d\n", bus->state, new_state);
165 bus->state = new_state;
166}
167
147/* 168/*
148 * interface functions from common layer 169 * interface functions from common layer
149 */ 170 */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
index af39edae8c62..d4d966beb840 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
@@ -934,7 +934,7 @@ int brcmf_bus_start(struct device *dev)
934 p2p_ifp = NULL; 934 p2p_ifp = NULL;
935 935
936 /* signal bus ready */ 936 /* signal bus ready */
937 bus_if->state = BRCMF_BUS_DATA; 937 brcmf_bus_change_state(bus_if, BRCMF_BUS_DATA);
938 938
939 /* Bus is ready, do any initialization */ 939 /* Bus is ready, do any initialization */
940 ret = brcmf_c_preinit_dcmds(ifp); 940 ret = brcmf_c_preinit_dcmds(ifp);
@@ -1029,6 +1029,8 @@ void brcmf_detach(struct device *dev)
1029 /* stop firmware event handling */ 1029 /* stop firmware event handling */
1030 brcmf_fweh_detach(drvr); 1030 brcmf_fweh_detach(drvr);
1031 1031
1032 brcmf_bus_change_state(bus_if, BRCMF_BUS_DOWN);
1033
1032 /* make sure primary interface removed last */ 1034 /* make sure primary interface removed last */
1033 for (i = BRCMF_MAX_IFS-1; i > -1; i--) 1035 for (i = BRCMF_MAX_IFS-1; i > -1; i--)
1034 if (drvr->iflist[i]) { 1036 if (drvr->iflist[i]) {
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
index 9c7f08a13105..3e991897d7ca 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
@@ -41,6 +41,7 @@
41#include <soc.h> 41#include <soc.h>
42#include "sdio_host.h" 42#include "sdio_host.h"
43#include "sdio_chip.h" 43#include "sdio_chip.h"
44#include "nvram.h"
44 45
45#define DCMD_RESP_TIMEOUT 2000 /* In milli second */ 46#define DCMD_RESP_TIMEOUT 2000 /* In milli second */
46 47
@@ -368,9 +369,7 @@ struct brcmf_sdio_hdrinfo {
368/* Private data for SDIO bus interaction */ 369/* Private data for SDIO bus interaction */
369struct brcmf_sdio { 370struct brcmf_sdio {
370 struct brcmf_sdio_dev *sdiodev; /* sdio device handler */ 371 struct brcmf_sdio_dev *sdiodev; /* sdio device handler */
371 struct chip_info *ci; /* Chip info struct */ 372 struct brcmf_chip *ci; /* Chip info struct */
372 char *vars; /* Variables (from CIS and/or other) */
373 uint varsz; /* Size of variables buffer */
374 373
375 u32 ramsize; /* Size of RAM in SOCRAM (bytes) */ 374 u32 ramsize; /* Size of RAM in SOCRAM (bytes) */
376 375
@@ -1083,10 +1082,6 @@ static void brcmf_sdio_rxfail(struct brcmf_sdio *bus, bool abort, bool rtx)
1083 1082
1084 /* Clear partial in any case */ 1083 /* Clear partial in any case */
1085 bus->cur_read.len = 0; 1084 bus->cur_read.len = 0;
1086
1087 /* If we can't reach the device, signal failure */
1088 if (err)
1089 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
1090} 1085}
1091 1086
1092/* return total length of buffer chain */ 1087/* return total length of buffer chain */
@@ -1683,8 +1678,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1683 bus->rxpending = true; 1678 bus->rxpending = true;
1684 1679
1685 for (rd->seq_num = bus->rx_seq, rxleft = maxframes; 1680 for (rd->seq_num = bus->rx_seq, rxleft = maxframes;
1686 !bus->rxskip && rxleft && 1681 !bus->rxskip && rxleft && brcmf_bus_ready(bus->sdiodev->bus_if);
1687 bus->sdiodev->bus_if->state != BRCMF_BUS_DOWN;
1688 rd->seq_num++, rxleft--) { 1682 rd->seq_num++, rxleft--) {
1689 1683
1690 /* Handle glomming separately */ 1684 /* Handle glomming separately */
@@ -2233,41 +2227,37 @@ static void brcmf_sdio_bus_stop(struct device *dev)
2233 bus->watchdog_tsk = NULL; 2227 bus->watchdog_tsk = NULL;
2234 } 2228 }
2235 2229
2236 sdio_claim_host(bus->sdiodev->func[1]); 2230 if (bus_if->state == BRCMF_BUS_DOWN) {
2237 2231 sdio_claim_host(sdiodev->func[1]);
2238 /* Enable clock for device interrupts */ 2232
2239 brcmf_sdio_bus_sleep(bus, false, false); 2233 /* Enable clock for device interrupts */
2234 brcmf_sdio_bus_sleep(bus, false, false);
2235
2236 /* Disable and clear interrupts at the chip level also */
2237 w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask));
2238 local_hostintmask = bus->hostintmask;
2239 bus->hostintmask = 0;
2240
2241 /* Force backplane clocks to assure F2 interrupt propagates */
2242 saveclk = brcmf_sdiod_regrb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
2243 &err);
2244 if (!err)
2245 brcmf_sdiod_regwb(sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
2246 (saveclk | SBSDIO_FORCE_HT), &err);
2247 if (err)
2248 brcmf_err("Failed to force clock for F2: err %d\n",
2249 err);
2240 2250
2241 /* Disable and clear interrupts at the chip level also */ 2251 /* Turn off the bus (F2), free any pending packets */
2242 w_sdreg32(bus, 0, offsetof(struct sdpcmd_regs, hostintmask)); 2252 brcmf_dbg(INTR, "disable SDIO interrupts\n");
2243 local_hostintmask = bus->hostintmask; 2253 sdio_disable_func(sdiodev->func[SDIO_FUNC_2]);
2244 bus->hostintmask = 0;
2245 2254
2246 /* Change our idea of bus state */ 2255 /* Clear any pending interrupts now that F2 is disabled */
2247 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN; 2256 w_sdreg32(bus, local_hostintmask,
2257 offsetof(struct sdpcmd_regs, intstatus));
2248 2258
2249 /* Force clocks on backplane to be sure F2 interrupt propagates */ 2259 sdio_release_host(sdiodev->func[1]);
2250 saveclk = brcmf_sdiod_regrb(bus->sdiodev,
2251 SBSDIO_FUNC1_CHIPCLKCSR, &err);
2252 if (!err) {
2253 brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_CHIPCLKCSR,
2254 (saveclk | SBSDIO_FORCE_HT), &err);
2255 } 2260 }
2256 if (err)
2257 brcmf_err("Failed to force clock for F2: err %d\n", err);
2258
2259 /* Turn off the bus (F2), free any pending packets */
2260 brcmf_dbg(INTR, "disable SDIO interrupts\n");
2261 sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
2262
2263 /* Clear any pending interrupts now that F2 is disabled */
2264 w_sdreg32(bus, local_hostintmask,
2265 offsetof(struct sdpcmd_regs, intstatus));
2266
2267 /* Turn off the backplane clock (only) */
2268 brcmf_sdio_clkctl(bus, CLK_SDONLY, false);
2269 sdio_release_host(bus->sdiodev->func[1]);
2270
2271 /* Clear the data packet queues */ 2261 /* Clear the data packet queues */
2272 brcmu_pktq_flush(&bus->txq, true, NULL, NULL); 2262 brcmu_pktq_flush(&bus->txq, true, NULL, NULL);
2273 2263
@@ -2357,20 +2347,11 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2357 /* Check for inconsistent device control */ 2347 /* Check for inconsistent device control */
2358 devctl = brcmf_sdiod_regrb(bus->sdiodev, 2348 devctl = brcmf_sdiod_regrb(bus->sdiodev,
2359 SBSDIO_DEVICE_CTL, &err); 2349 SBSDIO_DEVICE_CTL, &err);
2360 if (err) {
2361 brcmf_err("error reading DEVCTL: %d\n", err);
2362 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2363 }
2364#endif /* DEBUG */ 2350#endif /* DEBUG */
2365 2351
2366 /* Read CSR, if clock on switch to AVAIL, else ignore */ 2352 /* Read CSR, if clock on switch to AVAIL, else ignore */
2367 clkctl = brcmf_sdiod_regrb(bus->sdiodev, 2353 clkctl = brcmf_sdiod_regrb(bus->sdiodev,
2368 SBSDIO_FUNC1_CHIPCLKCSR, &err); 2354 SBSDIO_FUNC1_CHIPCLKCSR, &err);
2369 if (err) {
2370 brcmf_err("error reading CSR: %d\n",
2371 err);
2372 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2373 }
2374 2355
2375 brcmf_dbg(SDIO, "DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n", 2356 brcmf_dbg(SDIO, "DPC: PENDING, devctl 0x%02x clkctl 0x%02x\n",
2376 devctl, clkctl); 2357 devctl, clkctl);
@@ -2378,19 +2359,9 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2378 if (SBSDIO_HTAV(clkctl)) { 2359 if (SBSDIO_HTAV(clkctl)) {
2379 devctl = brcmf_sdiod_regrb(bus->sdiodev, 2360 devctl = brcmf_sdiod_regrb(bus->sdiodev,
2380 SBSDIO_DEVICE_CTL, &err); 2361 SBSDIO_DEVICE_CTL, &err);
2381 if (err) {
2382 brcmf_err("error reading DEVCTL: %d\n",
2383 err);
2384 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2385 }
2386 devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY; 2362 devctl &= ~SBSDIO_DEVCTL_CA_INT_ONLY;
2387 brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL, 2363 brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_DEVICE_CTL,
2388 devctl, &err); 2364 devctl, &err);
2389 if (err) {
2390 brcmf_err("error writing DEVCTL: %d\n",
2391 err);
2392 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2393 }
2394 bus->clkstate = CLK_AVAIL; 2365 bus->clkstate = CLK_AVAIL;
2395 } 2366 }
2396 } 2367 }
@@ -2525,9 +2496,8 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2525 txlimit -= framecnt; 2496 txlimit -= framecnt;
2526 } 2497 }
2527 2498
2528 if ((bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) || (err != 0)) { 2499 if (!brcmf_bus_ready(bus->sdiodev->bus_if) || (err != 0)) {
2529 brcmf_err("failed backplane access over SDIO, halting operation\n"); 2500 brcmf_err("failed backplane access over SDIO, halting operation\n");
2530 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
2531 atomic_set(&bus->intstatus, 0); 2501 atomic_set(&bus->intstatus, 0);
2532 } else if (atomic_read(&bus->intstatus) || 2502 } else if (atomic_read(&bus->intstatus) ||
2533 atomic_read(&bus->ipend) > 0 || 2503 atomic_read(&bus->ipend) > 0 ||
@@ -3195,46 +3165,69 @@ brcmf_sdio_bus_rxctl(struct device *dev, unsigned char *msg, uint msglen)
3195 return rxlen ? (int)rxlen : -ETIMEDOUT; 3165 return rxlen ? (int)rxlen : -ETIMEDOUT;
3196} 3166}
3197 3167
3198static bool brcmf_sdio_download_state(struct brcmf_sdio *bus, bool enter) 3168#ifdef DEBUG
3169static bool
3170brcmf_sdio_verifymemory(struct brcmf_sdio_dev *sdiodev, u32 ram_addr,
3171 u8 *ram_data, uint ram_sz)
3199{ 3172{
3200 struct chip_info *ci = bus->ci; 3173 char *ram_cmp;
3201 3174 int err;
3202 /* To enter download state, disable ARM and reset SOCRAM. 3175 bool ret = true;
3203 * To exit download state, simply reset ARM (default is RAM boot). 3176 int address;
3204 */ 3177 int offset;
3205 if (enter) { 3178 int len;
3206 bus->alp_only = true;
3207
3208 brcmf_sdio_chip_enter_download(bus->sdiodev, ci);
3209 } else {
3210 if (!brcmf_sdio_chip_exit_download(bus->sdiodev, ci, bus->vars,
3211 bus->varsz))
3212 return false;
3213 3179
3214 /* Allow HT Clock now that the ARM is running. */ 3180 /* read back and verify */
3215 bus->alp_only = false; 3181 brcmf_dbg(INFO, "Compare RAM dl & ul at 0x%08x; size=%d\n", ram_addr,
3182 ram_sz);
3183 ram_cmp = kmalloc(MEMBLOCK, GFP_KERNEL);
3184 /* do not proceed while no memory but */
3185 if (!ram_cmp)
3186 return true;
3216 3187
3217 bus->sdiodev->bus_if->state = BRCMF_BUS_LOAD; 3188 address = ram_addr;
3189 offset = 0;
3190 while (offset < ram_sz) {
3191 len = ((offset + MEMBLOCK) < ram_sz) ? MEMBLOCK :
3192 ram_sz - offset;
3193 err = brcmf_sdiod_ramrw(sdiodev, false, address, ram_cmp, len);
3194 if (err) {
3195 brcmf_err("error %d on reading %d membytes at 0x%08x\n",
3196 err, len, address);
3197 ret = false;
3198 break;
3199 } else if (memcmp(ram_cmp, &ram_data[offset], len)) {
3200 brcmf_err("Downloaded RAM image is corrupted, block offset is %d, len is %d\n",
3201 offset, len);
3202 ret = false;
3203 break;
3204 }
3205 offset += len;
3206 address += len;
3218 } 3207 }
3219 3208
3209 kfree(ram_cmp);
3210
3211 return ret;
3212}
3213#else /* DEBUG */
3214static bool
3215brcmf_sdio_verifymemory(struct brcmf_sdio_dev *sdiodev, u32 ram_addr,
3216 u8 *ram_data, uint ram_sz)
3217{
3220 return true; 3218 return true;
3221} 3219}
3220#endif /* DEBUG */
3222 3221
3223static int brcmf_sdio_download_code_file(struct brcmf_sdio *bus) 3222static int brcmf_sdio_download_code_file(struct brcmf_sdio *bus,
3223 const struct firmware *fw)
3224{ 3224{
3225 const struct firmware *fw;
3226 int err; 3225 int err;
3227 int offset; 3226 int offset;
3228 int address; 3227 int address;
3229 int len; 3228 int len;
3230 3229
3231 fw = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_BIN); 3230 brcmf_dbg(TRACE, "Enter\n");
3232 if (fw == NULL)
3233 return -ENOENT;
3234
3235 if (brcmf_sdio_chip_getinfidx(bus->ci, BCMA_CORE_ARM_CR4) !=
3236 BRCMF_MAX_CORENUM)
3237 memcpy(&bus->ci->rst_vec, fw->data, sizeof(bus->ci->rst_vec));
3238 3231
3239 err = 0; 3232 err = 0;
3240 offset = 0; 3233 offset = 0;
@@ -3247,138 +3240,96 @@ static int brcmf_sdio_download_code_file(struct brcmf_sdio *bus)
3247 if (err) { 3240 if (err) {
3248 brcmf_err("error %d on writing %d membytes at 0x%08x\n", 3241 brcmf_err("error %d on writing %d membytes at 0x%08x\n",
3249 err, len, address); 3242 err, len, address);
3250 goto failure; 3243 return err;
3251 } 3244 }
3252 offset += len; 3245 offset += len;
3253 address += len; 3246 address += len;
3254 } 3247 }
3255 3248 if (!err)
3256failure: 3249 if (!brcmf_sdio_verifymemory(bus->sdiodev, bus->ci->rambase,
3257 release_firmware(fw); 3250 (u8 *)fw->data, fw->size))
3251 err = -EIO;
3258 3252
3259 return err; 3253 return err;
3260} 3254}
3261 3255
3262/* 3256static int brcmf_sdio_download_nvram(struct brcmf_sdio *bus,
3263 * ProcessVars:Takes a buffer of "<var>=<value>\n" lines read from a file 3257 const struct firmware *nv)
3264 * and ending in a NUL.
3265 * Removes carriage returns, empty lines, comment lines, and converts
3266 * newlines to NULs.
3267 * Shortens buffer as needed and pads with NULs. End of buffer is marked
3268 * by two NULs.
3269*/
3270
3271static int brcmf_sdio_strip_nvram(struct brcmf_sdio *bus,
3272 const struct firmware *nv)
3273{ 3258{
3274 char *varbuf; 3259 void *vars;
3275 char *dp; 3260 u32 varsz;
3276 bool findNewline; 3261 int address;
3277 int column; 3262 int err;
3278 int ret = 0;
3279 uint buf_len, n, len;
3280
3281 len = nv->size;
3282 varbuf = vmalloc(len);
3283 if (!varbuf)
3284 return -ENOMEM;
3285
3286 memcpy(varbuf, nv->data, len);
3287 dp = varbuf;
3288
3289 findNewline = false;
3290 column = 0;
3291
3292 for (n = 0; n < len; n++) {
3293 if (varbuf[n] == 0)
3294 break;
3295 if (varbuf[n] == '\r')
3296 continue;
3297 if (findNewline && varbuf[n] != '\n')
3298 continue;
3299 findNewline = false;
3300 if (varbuf[n] == '#') {
3301 findNewline = true;
3302 continue;
3303 }
3304 if (varbuf[n] == '\n') {
3305 if (column == 0)
3306 continue;
3307 *dp++ = 0;
3308 column = 0;
3309 continue;
3310 }
3311 *dp++ = varbuf[n];
3312 column++;
3313 }
3314 buf_len = dp - varbuf;
3315 while (dp < varbuf + n)
3316 *dp++ = 0;
3317
3318 kfree(bus->vars);
3319 /* roundup needed for download to device */
3320 bus->varsz = roundup(buf_len + 1, 4);
3321 bus->vars = kmalloc(bus->varsz, GFP_KERNEL);
3322 if (bus->vars == NULL) {
3323 bus->varsz = 0;
3324 ret = -ENOMEM;
3325 goto err;
3326 }
3327 3263
3328 /* copy the processed variables and add null termination */ 3264 brcmf_dbg(TRACE, "Enter\n");
3329 memcpy(bus->vars, varbuf, buf_len);
3330 bus->vars[buf_len] = 0;
3331err:
3332 vfree(varbuf);
3333 return ret;
3334}
3335 3265
3336static int brcmf_sdio_download_nvram(struct brcmf_sdio *bus) 3266 vars = brcmf_nvram_strip(nv, &varsz);
3337{
3338 const struct firmware *nv;
3339 int ret;
3340 3267
3341 nv = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_NVRAM); 3268 if (vars == NULL)
3342 if (nv == NULL) 3269 return -EINVAL;
3343 return -ENOENT;
3344 3270
3345 ret = brcmf_sdio_strip_nvram(bus, nv); 3271 address = bus->ci->ramsize - varsz + bus->ci->rambase;
3272 err = brcmf_sdiod_ramrw(bus->sdiodev, true, address, vars, varsz);
3273 if (err)
3274 brcmf_err("error %d on writing %d nvram bytes at 0x%08x\n",
3275 err, varsz, address);
3276 else if (!brcmf_sdio_verifymemory(bus->sdiodev, address, vars, varsz))
3277 err = -EIO;
3346 3278
3347 release_firmware(nv); 3279 brcmf_nvram_free(vars);
3348 3280
3349 return ret; 3281 return err;
3350} 3282}
3351 3283
3352static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus) 3284static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus)
3353{ 3285{
3354 int bcmerror = -EFAULT; 3286 int bcmerror = -EFAULT;
3355 3287 const struct firmware *fw;
3288 u32 rstvec;
3356 3289
3357 sdio_claim_host(bus->sdiodev->func[1]); 3290 sdio_claim_host(bus->sdiodev->func[1]);
3358 brcmf_sdio_clkctl(bus, CLK_AVAIL, false); 3291 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
3359 3292
3360 /* Keep arm in reset */ 3293 /* Keep arm in reset */
3361 if (!brcmf_sdio_download_state(bus, true)) { 3294 brcmf_sdio_chip_enter_download(bus->sdiodev, bus->ci);
3362 brcmf_err("error placing ARM core in reset\n"); 3295
3296 fw = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_BIN);
3297 if (fw == NULL) {
3298 bcmerror = -ENOENT;
3363 goto err; 3299 goto err;
3364 } 3300 }
3365 3301
3366 if (brcmf_sdio_download_code_file(bus)) { 3302 rstvec = get_unaligned_le32(fw->data);
3303 brcmf_dbg(SDIO, "firmware rstvec: %x\n", rstvec);
3304
3305 bcmerror = brcmf_sdio_download_code_file(bus, fw);
3306 release_firmware(fw);
3307 if (bcmerror) {
3367 brcmf_err("dongle image file download failed\n"); 3308 brcmf_err("dongle image file download failed\n");
3368 goto err; 3309 goto err;
3369 } 3310 }
3370 3311
3371 if (brcmf_sdio_download_nvram(bus)) { 3312 fw = brcmf_sdio_get_fw(bus, BRCMF_FIRMWARE_NVRAM);
3313 if (fw == NULL) {
3314 bcmerror = -ENOENT;
3315 goto err;
3316 }
3317
3318 bcmerror = brcmf_sdio_download_nvram(bus, fw);
3319 release_firmware(fw);
3320 if (bcmerror) {
3372 brcmf_err("dongle nvram file download failed\n"); 3321 brcmf_err("dongle nvram file download failed\n");
3373 goto err; 3322 goto err;
3374 } 3323 }
3375 3324
3376 /* Take arm out of reset */ 3325 /* Take arm out of reset */
3377 if (!brcmf_sdio_download_state(bus, false)) { 3326 if (!brcmf_sdio_chip_exit_download(bus->sdiodev, bus->ci, rstvec)) {
3378 brcmf_err("error getting out of ARM core reset\n"); 3327 brcmf_err("error getting out of ARM core reset\n");
3379 goto err; 3328 goto err;
3380 } 3329 }
3381 3330
3331 /* Allow HT Clock now that the ARM is running. */
3332 brcmf_bus_change_state(bus->sdiodev->bus_if, BRCMF_BUS_LOAD);
3382 bcmerror = 0; 3333 bcmerror = 0;
3383 3334
3384err: 3335err:
@@ -3567,9 +3518,11 @@ static int brcmf_sdio_bus_init(struct device *dev)
3567 3518
3568 /* try to download image and nvram to the dongle */ 3519 /* try to download image and nvram to the dongle */
3569 if (bus_if->state == BRCMF_BUS_DOWN) { 3520 if (bus_if->state == BRCMF_BUS_DOWN) {
3521 bus->alp_only = true;
3570 err = brcmf_sdio_download_firmware(bus); 3522 err = brcmf_sdio_download_firmware(bus);
3571 if (err) 3523 if (err)
3572 return err; 3524 return err;
3525 bus->alp_only = false;
3573 } 3526 }
3574 3527
3575 if (!bus->sdiodev->bus_if->drvr) 3528 if (!bus->sdiodev->bus_if->drvr)
@@ -3653,7 +3606,7 @@ void brcmf_sdio_isr(struct brcmf_sdio *bus)
3653 return; 3606 return;
3654 } 3607 }
3655 3608
3656 if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) { 3609 if (!brcmf_bus_ready(bus->sdiodev->bus_if)) {
3657 brcmf_err("bus is down. we have nothing to do\n"); 3610 brcmf_err("bus is down. we have nothing to do\n");
3658 return; 3611 return;
3659 } 3612 }
@@ -3664,7 +3617,6 @@ void brcmf_sdio_isr(struct brcmf_sdio *bus)
3664 else 3617 else
3665 if (brcmf_sdio_intr_rstatus(bus)) { 3618 if (brcmf_sdio_intr_rstatus(bus)) {
3666 brcmf_err("failed backplane access\n"); 3619 brcmf_err("failed backplane access\n");
3667 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
3668 } 3620 }
3669 3621
3670 /* Disable additional interrupts (is this needed now)? */ 3622 /* Disable additional interrupts (is this needed now)? */
@@ -3779,8 +3731,6 @@ brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
3779 u32 reg_val; 3731 u32 reg_val;
3780 u32 drivestrength; 3732 u32 drivestrength;
3781 3733
3782 bus->alp_only = true;
3783
3784 sdio_claim_host(bus->sdiodev->func[1]); 3734 sdio_claim_host(bus->sdiodev->func[1]);
3785 3735
3786 pr_debug("F1 signature read @0x18000000=0x%4x\n", 3736 pr_debug("F1 signature read @0x18000000=0x%4x\n",
@@ -3803,6 +3753,11 @@ brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
3803 goto fail; 3753 goto fail;
3804 } 3754 }
3805 3755
3756 /* SDIO register access works so moving
3757 * state from UNKNOWN to DOWN.
3758 */
3759 brcmf_bus_change_state(bus->sdiodev->bus_if, BRCMF_BUS_DOWN);
3760
3806 if (brcmf_sdio_chip_attach(bus->sdiodev, &bus->ci)) { 3761 if (brcmf_sdio_chip_attach(bus->sdiodev, &bus->ci)) {
3807 brcmf_err("brcmf_sdio_chip_attach failed!\n"); 3762 brcmf_err("brcmf_sdio_chip_attach failed!\n");
3808 goto fail; 3763 goto fail;
@@ -4026,7 +3981,6 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
4026 /* Disable F2 to clear any intermediate frame state on the dongle */ 3981 /* Disable F2 to clear any intermediate frame state on the dongle */
4027 sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]); 3982 sdio_disable_func(bus->sdiodev->func[SDIO_FUNC_2]);
4028 3983
4029 bus->sdiodev->bus_if->state = BRCMF_BUS_DOWN;
4030 bus->rxflow = false; 3984 bus->rxflow = false;
4031 3985
4032 /* Done with backplane-dependent accesses, can drop clock... */ 3986 /* Done with backplane-dependent accesses, can drop clock... */
@@ -4082,17 +4036,26 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
4082 } 4036 }
4083 4037
4084 if (bus->ci) { 4038 if (bus->ci) {
4085 sdio_claim_host(bus->sdiodev->func[1]); 4039 if (bus->sdiodev->bus_if->state == BRCMF_BUS_DOWN) {
4086 brcmf_sdio_clkctl(bus, CLK_AVAIL, false); 4040 sdio_claim_host(bus->sdiodev->func[1]);
4087 brcmf_sdio_clkctl(bus, CLK_NONE, false); 4041 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
4088 sdio_release_host(bus->sdiodev->func[1]); 4042 /* Leave the device in state where it is
4043 * 'quiet'. This is done by putting it in
4044 * download_state which essentially resets
4045 * all necessary cores.
4046 */
4047 msleep(20);
4048 brcmf_sdio_chip_enter_download(bus->sdiodev,
4049 bus->ci);
4050 brcmf_sdio_clkctl(bus, CLK_NONE, false);
4051 sdio_release_host(bus->sdiodev->func[1]);
4052 }
4089 brcmf_sdio_chip_detach(&bus->ci); 4053 brcmf_sdio_chip_detach(&bus->ci);
4090 } 4054 }
4091 4055
4092 brcmu_pkt_buf_free_skb(bus->txglom_sgpad); 4056 brcmu_pkt_buf_free_skb(bus->txglom_sgpad);
4093 kfree(bus->rxbuf); 4057 kfree(bus->rxbuf);
4094 kfree(bus->hdrbuf); 4058 kfree(bus->hdrbuf);
4095 kfree(bus->vars);
4096 kfree(bus); 4059 kfree(bus);
4097 } 4060 }
4098 4061
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/nvram.c b/drivers/net/wireless/brcm80211/brcmfmac/nvram.c
new file mode 100644
index 000000000000..d5ef86db631b
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/nvram.c
@@ -0,0 +1,94 @@
1/*
2 * Copyright (c) 2013 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <linux/kernel.h>
18#include <linux/slab.h>
19#include <linux/firmware.h>
20
21#include "nvram.h"
22
23/* brcmf_nvram_strip :Takes a buffer of "<var>=<value>\n" lines read from a file
24 * and ending in a NUL. Removes carriage returns, empty lines, comment lines,
25 * and converts newlines to NULs. Shortens buffer as needed and pads with NULs.
26 * End of buffer is completed with token identifying length of buffer.
27 */
28void *brcmf_nvram_strip(const struct firmware *nv, u32 *new_length)
29{
30 u8 *nvram;
31 u32 i;
32 u32 len;
33 u32 column;
34 u8 val;
35 bool comment;
36 u32 token;
37 __le32 token_le;
38
39 /* Alloc for extra 0 byte + roundup by 4 + length field */
40 nvram = kmalloc(nv->size + 1 + 3 + sizeof(token_le), GFP_KERNEL);
41 if (!nvram)
42 return NULL;
43
44 len = 0;
45 column = 0;
46 comment = false;
47 for (i = 0; i < nv->size; i++) {
48 val = nv->data[i];
49 if (val == 0)
50 break;
51 if (val == '\r')
52 continue;
53 if (comment && (val != '\n'))
54 continue;
55 comment = false;
56 if (val == '#') {
57 comment = true;
58 continue;
59 }
60 if (val == '\n') {
61 if (column == 0)
62 continue;
63 nvram[len] = 0;
64 len++;
65 column = 0;
66 continue;
67 }
68 nvram[len] = val;
69 len++;
70 column++;
71 }
72 column = len;
73 *new_length = roundup(len + 1, 4);
74 while (column != *new_length) {
75 nvram[column] = 0;
76 column++;
77 }
78
79 token = *new_length / 4;
80 token = (~token << 16) | (token & 0x0000FFFF);
81 token_le = cpu_to_le32(token);
82
83 memcpy(&nvram[*new_length], &token_le, sizeof(token_le));
84 *new_length += sizeof(token_le);
85
86 return nvram;
87}
88
89void brcmf_nvram_free(void *nvram)
90{
91 kfree(nvram);
92}
93
94
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/nvram.h b/drivers/net/wireless/brcm80211/brcmfmac/nvram.h
new file mode 100644
index 000000000000..d454580928c9
--- /dev/null
+++ b/drivers/net/wireless/brcm80211/brcmfmac/nvram.h
@@ -0,0 +1,24 @@
1/*
2 * Copyright (c) 2013 Broadcom Corporation
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16#ifndef BRCMFMAC_NVRAM_H
17#define BRCMFMAC_NVRAM_H
18
19
20void *brcmf_nvram_strip(const struct firmware *nv, u32 *new_length);
21void brcmf_nvram_free(void *nvram);
22
23
24#endif /* BRCMFMAC_NVRAM_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
index 9fd40675f18e..82bf3c5d3cdc 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.c
@@ -51,6 +51,9 @@
51#define BCM43143_CORE_ARM_BASE 0x18003000 51#define BCM43143_CORE_ARM_BASE 0x18003000
52#define BCM43143_RAMSIZE 0x70000 52#define BCM43143_RAMSIZE 0x70000
53 53
54/* All D11 cores, ID 0x812 */
55#define BCM43xx_CORE_D11_BASE 0x18001000
56
54#define SBCOREREV(sbidh) \ 57#define SBCOREREV(sbidh) \
55 ((((sbidh) & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT) | \ 58 ((((sbidh) & SSB_IDHIGH_RCHI) >> SSB_IDHIGH_RCHI_SHIFT) | \
56 ((sbidh) & SSB_IDHIGH_RCLO)) 59 ((sbidh) & SSB_IDHIGH_RCLO))
@@ -66,6 +69,10 @@
66/* ARM CR4 core specific control flag bits */ 69/* ARM CR4 core specific control flag bits */
67#define ARMCR4_BCMA_IOCTL_CPUHALT 0x0020 70#define ARMCR4_BCMA_IOCTL_CPUHALT 0x0020
68 71
72/* D11 core specific control flag bits */
73#define D11_BCMA_IOCTL_PHYCLOCKEN 0x0004
74#define D11_BCMA_IOCTL_PHYRESET 0x0008
75
69#define SDIOD_DRVSTR_KEY(chip, pmu) (((chip) << 16) | (pmu)) 76#define SDIOD_DRVSTR_KEY(chip, pmu) (((chip) << 16) | (pmu))
70/* SDIO Pad drive strength to select value mappings */ 77/* SDIO Pad drive strength to select value mappings */
71struct sdiod_drive_str { 78struct sdiod_drive_str {
@@ -111,7 +118,7 @@ static const struct sdiod_drive_str sdiod_drvstr_tab2_3v3[] = {
111}; 118};
112 119
113u8 120u8
114brcmf_sdio_chip_getinfidx(struct chip_info *ci, u16 coreid) 121brcmf_sdio_chip_getinfidx(struct brcmf_chip *ci, u16 coreid)
115{ 122{
116 u8 idx; 123 u8 idx;
117 124
@@ -124,7 +131,7 @@ brcmf_sdio_chip_getinfidx(struct chip_info *ci, u16 coreid)
124 131
125static u32 132static u32
126brcmf_sdio_sb_corerev(struct brcmf_sdio_dev *sdiodev, 133brcmf_sdio_sb_corerev(struct brcmf_sdio_dev *sdiodev,
127 struct chip_info *ci, u16 coreid) 134 struct brcmf_chip *ci, u16 coreid)
128{ 135{
129 u32 regdata; 136 u32 regdata;
130 u8 idx; 137 u8 idx;
@@ -139,7 +146,7 @@ brcmf_sdio_sb_corerev(struct brcmf_sdio_dev *sdiodev,
139 146
140static u32 147static u32
141brcmf_sdio_ai_corerev(struct brcmf_sdio_dev *sdiodev, 148brcmf_sdio_ai_corerev(struct brcmf_sdio_dev *sdiodev,
142 struct chip_info *ci, u16 coreid) 149 struct brcmf_chip *ci, u16 coreid)
143{ 150{
144 u8 idx; 151 u8 idx;
145 152
@@ -150,7 +157,7 @@ brcmf_sdio_ai_corerev(struct brcmf_sdio_dev *sdiodev,
150 157
151static bool 158static bool
152brcmf_sdio_sb_iscoreup(struct brcmf_sdio_dev *sdiodev, 159brcmf_sdio_sb_iscoreup(struct brcmf_sdio_dev *sdiodev,
153 struct chip_info *ci, u16 coreid) 160 struct brcmf_chip *ci, u16 coreid)
154{ 161{
155 u32 regdata; 162 u32 regdata;
156 u8 idx; 163 u8 idx;
@@ -169,7 +176,7 @@ brcmf_sdio_sb_iscoreup(struct brcmf_sdio_dev *sdiodev,
169 176
170static bool 177static bool
171brcmf_sdio_ai_iscoreup(struct brcmf_sdio_dev *sdiodev, 178brcmf_sdio_ai_iscoreup(struct brcmf_sdio_dev *sdiodev,
172 struct chip_info *ci, u16 coreid) 179 struct brcmf_chip *ci, u16 coreid)
173{ 180{
174 u32 regdata; 181 u32 regdata;
175 u8 idx; 182 u8 idx;
@@ -193,7 +200,8 @@ brcmf_sdio_ai_iscoreup(struct brcmf_sdio_dev *sdiodev,
193 200
194static void 201static void
195brcmf_sdio_sb_coredisable(struct brcmf_sdio_dev *sdiodev, 202brcmf_sdio_sb_coredisable(struct brcmf_sdio_dev *sdiodev,
196 struct chip_info *ci, u16 coreid, u32 core_bits) 203 struct brcmf_chip *ci, u16 coreid, u32 pre_resetbits,
204 u32 in_resetbits)
197{ 205{
198 u32 regdata, base; 206 u32 regdata, base;
199 u8 idx; 207 u8 idx;
@@ -279,52 +287,48 @@ brcmf_sdio_sb_coredisable(struct brcmf_sdio_dev *sdiodev,
279 287
280static void 288static void
281brcmf_sdio_ai_coredisable(struct brcmf_sdio_dev *sdiodev, 289brcmf_sdio_ai_coredisable(struct brcmf_sdio_dev *sdiodev,
282 struct chip_info *ci, u16 coreid, u32 core_bits) 290 struct brcmf_chip *ci, u16 coreid, u32 pre_resetbits,
291 u32 in_resetbits)
283{ 292{
284 u8 idx; 293 u8 idx;
285 u32 regdata; 294 u32 regdata;
295 u32 wrapbase;
286 296
287 idx = brcmf_sdio_chip_getinfidx(ci, coreid); 297 idx = brcmf_sdio_chip_getinfidx(ci, coreid);
288 if (idx == BRCMF_MAX_CORENUM) 298 if (idx == BRCMF_MAX_CORENUM)
289 return; 299 return;
290 300
301 wrapbase = ci->c_inf[idx].wrapbase;
302
291 /* if core is already in reset, just return */ 303 /* if core is already in reset, just return */
292 regdata = brcmf_sdiod_regrl(sdiodev, 304 regdata = brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_RESET_CTL, NULL);
293 ci->c_inf[idx].wrapbase+BCMA_RESET_CTL,
294 NULL);
295 if ((regdata & BCMA_RESET_CTL_RESET) != 0) 305 if ((regdata & BCMA_RESET_CTL_RESET) != 0)
296 return; 306 return;
297 307
298 /* ensure no pending backplane operation 308 /* configure reset */
299 * 300uc should be sufficient for backplane ops to be finish 309 brcmf_sdiod_regwl(sdiodev, wrapbase + BCMA_IOCTL, pre_resetbits |
300 * extra 10ms is taken into account for firmware load stage 310 BCMA_IOCTL_FGC | BCMA_IOCTL_CLK, NULL);
301 * after 10300us carry on disabling the core anyway 311 regdata = brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_IOCTL, NULL);
302 */
303 SPINWAIT(brcmf_sdiod_regrl(sdiodev,
304 ci->c_inf[idx].wrapbase+BCMA_RESET_ST,
305 NULL), 10300);
306 regdata = brcmf_sdiod_regrl(sdiodev,
307 ci->c_inf[idx].wrapbase+BCMA_RESET_ST,
308 NULL);
309 if (regdata)
310 brcmf_err("disabling core 0x%x with reset status %x\n",
311 coreid, regdata);
312 312
313 brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_RESET_CTL, 313 /* put in reset */
314 brcmf_sdiod_regwl(sdiodev, wrapbase + BCMA_RESET_CTL,
314 BCMA_RESET_CTL_RESET, NULL); 315 BCMA_RESET_CTL_RESET, NULL);
315 udelay(1);
316
317 brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL,
318 core_bits, NULL);
319 regdata = brcmf_sdiod_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL,
320 NULL);
321 usleep_range(10, 20); 316 usleep_range(10, 20);
322 317
318 /* wait till reset is 1 */
319 SPINWAIT(brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_RESET_CTL, NULL) !=
320 BCMA_RESET_CTL_RESET, 300);
321
322 /* post reset configure */
323 brcmf_sdiod_regwl(sdiodev, wrapbase + BCMA_IOCTL, pre_resetbits |
324 BCMA_IOCTL_FGC | BCMA_IOCTL_CLK, NULL);
325 regdata = brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_IOCTL, NULL);
323} 326}
324 327
325static void 328static void
326brcmf_sdio_sb_resetcore(struct brcmf_sdio_dev *sdiodev, 329brcmf_sdio_sb_resetcore(struct brcmf_sdio_dev *sdiodev,
327 struct chip_info *ci, u16 coreid, u32 core_bits) 330 struct brcmf_chip *ci, u16 coreid, u32 pre_resetbits,
331 u32 in_resetbits, u32 post_resetbits)
328{ 332{
329 u32 regdata; 333 u32 regdata;
330 u8 idx; 334 u8 idx;
@@ -337,7 +341,8 @@ brcmf_sdio_sb_resetcore(struct brcmf_sdio_dev *sdiodev,
337 * Must do the disable sequence first to work for 341 * Must do the disable sequence first to work for
338 * arbitrary current core state. 342 * arbitrary current core state.
339 */ 343 */
340 brcmf_sdio_sb_coredisable(sdiodev, ci, coreid, 0); 344 brcmf_sdio_sb_coredisable(sdiodev, ci, coreid, pre_resetbits,
345 in_resetbits);
341 346
342 /* 347 /*
343 * Now do the initialization sequence. 348 * Now do the initialization sequence.
@@ -390,40 +395,37 @@ brcmf_sdio_sb_resetcore(struct brcmf_sdio_dev *sdiodev,
390 395
391static void 396static void
392brcmf_sdio_ai_resetcore(struct brcmf_sdio_dev *sdiodev, 397brcmf_sdio_ai_resetcore(struct brcmf_sdio_dev *sdiodev,
393 struct chip_info *ci, u16 coreid, u32 core_bits) 398 struct brcmf_chip *ci, u16 coreid, u32 pre_resetbits,
399 u32 in_resetbits, u32 post_resetbits)
394{ 400{
395 u8 idx; 401 u8 idx;
396 u32 regdata; 402 u32 regdata;
403 u32 wrapbase;
397 404
398 idx = brcmf_sdio_chip_getinfidx(ci, coreid); 405 idx = brcmf_sdio_chip_getinfidx(ci, coreid);
399 if (idx == BRCMF_MAX_CORENUM) 406 if (idx == BRCMF_MAX_CORENUM)
400 return; 407 return;
401 408
409 wrapbase = ci->c_inf[idx].wrapbase;
410
402 /* must disable first to work for arbitrary current core state */ 411 /* must disable first to work for arbitrary current core state */
403 brcmf_sdio_ai_coredisable(sdiodev, ci, coreid, core_bits); 412 brcmf_sdio_ai_coredisable(sdiodev, ci, coreid, pre_resetbits,
413 in_resetbits);
404 414
405 /* now do initialization sequence */ 415 while (brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_RESET_CTL, NULL) &
406 brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, 416 BCMA_RESET_CTL_RESET) {
407 core_bits | BCMA_IOCTL_FGC | BCMA_IOCTL_CLK, NULL); 417 brcmf_sdiod_regwl(sdiodev, wrapbase + BCMA_RESET_CTL, 0, NULL);
408 regdata = brcmf_sdiod_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, 418 usleep_range(40, 60);
409 NULL); 419 }
410 brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_RESET_CTL,
411 0, NULL);
412 regdata = brcmf_sdiod_regrl(sdiodev,
413 ci->c_inf[idx].wrapbase+BCMA_RESET_CTL,
414 NULL);
415 udelay(1);
416 420
417 brcmf_sdiod_regwl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, 421 brcmf_sdiod_regwl(sdiodev, wrapbase + BCMA_IOCTL, post_resetbits |
418 core_bits | BCMA_IOCTL_CLK, NULL); 422 BCMA_IOCTL_CLK, NULL);
419 regdata = brcmf_sdiod_regrl(sdiodev, ci->c_inf[idx].wrapbase+BCMA_IOCTL, 423 regdata = brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_IOCTL, NULL);
420 NULL);
421 udelay(1);
422} 424}
423 425
424#ifdef DEBUG 426#ifdef DEBUG
425/* safety check for chipinfo */ 427/* safety check for chipinfo */
426static int brcmf_sdio_chip_cichk(struct chip_info *ci) 428static int brcmf_sdio_chip_cichk(struct brcmf_chip *ci)
427{ 429{
428 u8 core_idx; 430 u8 core_idx;
429 431
@@ -450,189 +452,213 @@ static int brcmf_sdio_chip_cichk(struct chip_info *ci)
450 return 0; 452 return 0;
451} 453}
452#else /* DEBUG */ 454#else /* DEBUG */
453static inline int brcmf_sdio_chip_cichk(struct chip_info *ci) 455static inline int brcmf_sdio_chip_cichk(struct brcmf_chip *ci)
454{ 456{
455 return 0; 457 return 0;
456} 458}
457#endif 459#endif
458 460
459static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev, 461static int brcmf_sdio_chip_recognition(struct brcmf_sdio_dev *sdiodev,
460 struct chip_info *ci) 462 struct brcmf_chip *ci)
461{ 463{
462 u32 regdata; 464 u32 regdata;
463 int ret; 465 u32 socitype;
464 466
465 /* Get CC core rev 467 /* Get CC core rev
466 * Chipid is assume to be at offset 0 from regs arg 468 * Chipid is assume to be at offset 0 from SI_ENUM_BASE
467 * For different chiptypes or old sdio hosts w/o chipcommon, 469 * For different chiptypes or old sdio hosts w/o chipcommon,
468 * other ways of recognition should be added here. 470 * other ways of recognition should be added here.
469 */ 471 */
470 ci->c_inf[0].id = BCMA_CORE_CHIPCOMMON;
471 ci->c_inf[0].base = SI_ENUM_BASE;
472 regdata = brcmf_sdiod_regrl(sdiodev, 472 regdata = brcmf_sdiod_regrl(sdiodev,
473 CORE_CC_REG(ci->c_inf[0].base, chipid), 473 CORE_CC_REG(SI_ENUM_BASE, chipid),
474 NULL); 474 NULL);
475 ci->chip = regdata & CID_ID_MASK; 475 ci->chip = regdata & CID_ID_MASK;
476 ci->chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT; 476 ci->chiprev = (regdata & CID_REV_MASK) >> CID_REV_SHIFT;
477 if (sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 && 477 if (sdiodev->func[0]->device == SDIO_DEVICE_ID_BROADCOM_4335_4339 &&
478 ci->chiprev >= 2) 478 ci->chiprev >= 2)
479 ci->chip = BCM4339_CHIP_ID; 479 ci->chip = BCM4339_CHIP_ID;
480 ci->socitype = (regdata & CID_TYPE_MASK) >> CID_TYPE_SHIFT; 480 socitype = (regdata & CID_TYPE_MASK) >> CID_TYPE_SHIFT;
481 481
482 brcmf_dbg(INFO, "chipid=0x%x chiprev=%d\n", ci->chip, ci->chiprev); 482 brcmf_dbg(INFO, "found %s chip: id=0x%x, rev=%d\n",
483 socitype == SOCI_SB ? "SB" : "AXI", ci->chip, ci->chiprev);
483 484
484 /* Address of cores for new chips should be added here */ 485 if (socitype == SOCI_SB) {
485 switch (ci->chip) { 486 if (ci->chip != BCM4329_CHIP_ID) {
486 case BCM43143_CHIP_ID: 487 brcmf_err("SB chip is not supported\n");
487 ci->c_inf[0].wrapbase = ci->c_inf[0].base + 0x00100000; 488 return -ENODEV;
488 ci->c_inf[0].cib = 0x2b000000; 489 }
489 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV; 490 ci->iscoreup = brcmf_sdio_sb_iscoreup;
490 ci->c_inf[1].base = BCM43143_CORE_BUS_BASE; 491 ci->corerev = brcmf_sdio_sb_corerev;
491 ci->c_inf[1].wrapbase = ci->c_inf[1].base + 0x00100000; 492 ci->coredisable = brcmf_sdio_sb_coredisable;
492 ci->c_inf[1].cib = 0x18000000; 493 ci->resetcore = brcmf_sdio_sb_resetcore;
493 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM; 494
494 ci->c_inf[2].base = BCM43143_CORE_SOCRAM_BASE; 495 ci->c_inf[0].id = BCMA_CORE_CHIPCOMMON;
495 ci->c_inf[2].wrapbase = ci->c_inf[2].base + 0x00100000; 496 ci->c_inf[0].base = SI_ENUM_BASE;
496 ci->c_inf[2].cib = 0x14000000;
497 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
498 ci->c_inf[3].base = BCM43143_CORE_ARM_BASE;
499 ci->c_inf[3].wrapbase = ci->c_inf[3].base + 0x00100000;
500 ci->c_inf[3].cib = 0x07000000;
501 ci->ramsize = BCM43143_RAMSIZE;
502 break;
503 case BCM43241_CHIP_ID:
504 ci->c_inf[0].wrapbase = 0x18100000;
505 ci->c_inf[0].cib = 0x2a084411;
506 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
507 ci->c_inf[1].base = 0x18002000;
508 ci->c_inf[1].wrapbase = 0x18102000;
509 ci->c_inf[1].cib = 0x0e004211;
510 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
511 ci->c_inf[2].base = 0x18004000;
512 ci->c_inf[2].wrapbase = 0x18104000;
513 ci->c_inf[2].cib = 0x14080401;
514 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
515 ci->c_inf[3].base = 0x18003000;
516 ci->c_inf[3].wrapbase = 0x18103000;
517 ci->c_inf[3].cib = 0x07004211;
518 ci->ramsize = 0x90000;
519 break;
520 case BCM4329_CHIP_ID:
521 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV; 497 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
522 ci->c_inf[1].base = BCM4329_CORE_BUS_BASE; 498 ci->c_inf[1].base = BCM4329_CORE_BUS_BASE;
523 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM; 499 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
524 ci->c_inf[2].base = BCM4329_CORE_SOCRAM_BASE; 500 ci->c_inf[2].base = BCM4329_CORE_SOCRAM_BASE;
525 ci->c_inf[3].id = BCMA_CORE_ARM_CM3; 501 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
526 ci->c_inf[3].base = BCM4329_CORE_ARM_BASE; 502 ci->c_inf[3].base = BCM4329_CORE_ARM_BASE;
503 ci->c_inf[4].id = BCMA_CORE_80211;
504 ci->c_inf[4].base = BCM43xx_CORE_D11_BASE;
527 ci->ramsize = BCM4329_RAMSIZE; 505 ci->ramsize = BCM4329_RAMSIZE;
528 break; 506 } else if (socitype == SOCI_AI) {
529 case BCM4330_CHIP_ID:
530 ci->c_inf[0].wrapbase = 0x18100000;
531 ci->c_inf[0].cib = 0x27004211;
532 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
533 ci->c_inf[1].base = 0x18002000;
534 ci->c_inf[1].wrapbase = 0x18102000;
535 ci->c_inf[1].cib = 0x07004211;
536 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
537 ci->c_inf[2].base = 0x18004000;
538 ci->c_inf[2].wrapbase = 0x18104000;
539 ci->c_inf[2].cib = 0x0d080401;
540 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
541 ci->c_inf[3].base = 0x18003000;
542 ci->c_inf[3].wrapbase = 0x18103000;
543 ci->c_inf[3].cib = 0x03004211;
544 ci->ramsize = 0x48000;
545 break;
546 case BCM4334_CHIP_ID:
547 ci->c_inf[0].wrapbase = 0x18100000;
548 ci->c_inf[0].cib = 0x29004211;
549 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
550 ci->c_inf[1].base = 0x18002000;
551 ci->c_inf[1].wrapbase = 0x18102000;
552 ci->c_inf[1].cib = 0x0d004211;
553 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
554 ci->c_inf[2].base = 0x18004000;
555 ci->c_inf[2].wrapbase = 0x18104000;
556 ci->c_inf[2].cib = 0x13080401;
557 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
558 ci->c_inf[3].base = 0x18003000;
559 ci->c_inf[3].wrapbase = 0x18103000;
560 ci->c_inf[3].cib = 0x07004211;
561 ci->ramsize = 0x80000;
562 break;
563 case BCM4335_CHIP_ID:
564 ci->c_inf[0].wrapbase = 0x18100000;
565 ci->c_inf[0].cib = 0x2b084411;
566 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
567 ci->c_inf[1].base = 0x18005000;
568 ci->c_inf[1].wrapbase = 0x18105000;
569 ci->c_inf[1].cib = 0x0f004211;
570 ci->c_inf[2].id = BCMA_CORE_ARM_CR4;
571 ci->c_inf[2].base = 0x18002000;
572 ci->c_inf[2].wrapbase = 0x18102000;
573 ci->c_inf[2].cib = 0x01084411;
574 ci->ramsize = 0xc0000;
575 ci->rambase = 0x180000;
576 break;
577 case BCM4339_CHIP_ID:
578 ci->c_inf[0].wrapbase = 0x18100000;
579 ci->c_inf[0].cib = 0x2e084411;
580 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
581 ci->c_inf[1].base = 0x18005000;
582 ci->c_inf[1].wrapbase = 0x18105000;
583 ci->c_inf[1].cib = 0x15004211;
584 ci->c_inf[2].id = BCMA_CORE_ARM_CR4;
585 ci->c_inf[2].base = 0x18002000;
586 ci->c_inf[2].wrapbase = 0x18102000;
587 ci->c_inf[2].cib = 0x04084411;
588 ci->ramsize = 0xc0000;
589 ci->rambase = 0x180000;
590 break;
591 case BCM43362_CHIP_ID:
592 ci->c_inf[0].wrapbase = 0x18100000;
593 ci->c_inf[0].cib = 0x27004211;
594 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
595 ci->c_inf[1].base = 0x18002000;
596 ci->c_inf[1].wrapbase = 0x18102000;
597 ci->c_inf[1].cib = 0x0a004211;
598 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
599 ci->c_inf[2].base = 0x18004000;
600 ci->c_inf[2].wrapbase = 0x18104000;
601 ci->c_inf[2].cib = 0x08080401;
602 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
603 ci->c_inf[3].base = 0x18003000;
604 ci->c_inf[3].wrapbase = 0x18103000;
605 ci->c_inf[3].cib = 0x03004211;
606 ci->ramsize = 0x3C000;
607 break;
608 default:
609 brcmf_err("chipid 0x%x is not supported\n", ci->chip);
610 return -ENODEV;
611 }
612
613 ret = brcmf_sdio_chip_cichk(ci);
614 if (ret)
615 return ret;
616
617 switch (ci->socitype) {
618 case SOCI_SB:
619 ci->iscoreup = brcmf_sdio_sb_iscoreup;
620 ci->corerev = brcmf_sdio_sb_corerev;
621 ci->coredisable = brcmf_sdio_sb_coredisable;
622 ci->resetcore = brcmf_sdio_sb_resetcore;
623 break;
624 case SOCI_AI:
625 ci->iscoreup = brcmf_sdio_ai_iscoreup; 507 ci->iscoreup = brcmf_sdio_ai_iscoreup;
626 ci->corerev = brcmf_sdio_ai_corerev; 508 ci->corerev = brcmf_sdio_ai_corerev;
627 ci->coredisable = brcmf_sdio_ai_coredisable; 509 ci->coredisable = brcmf_sdio_ai_coredisable;
628 ci->resetcore = brcmf_sdio_ai_resetcore; 510 ci->resetcore = brcmf_sdio_ai_resetcore;
629 break; 511
630 default: 512 ci->c_inf[0].id = BCMA_CORE_CHIPCOMMON;
631 brcmf_err("socitype %u not supported\n", ci->socitype); 513 ci->c_inf[0].base = SI_ENUM_BASE;
514
515 /* Address of cores for new chips should be added here */
516 switch (ci->chip) {
517 case BCM43143_CHIP_ID:
518 ci->c_inf[0].wrapbase = ci->c_inf[0].base + 0x00100000;
519 ci->c_inf[0].cib = 0x2b000000;
520 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
521 ci->c_inf[1].base = BCM43143_CORE_BUS_BASE;
522 ci->c_inf[1].wrapbase = ci->c_inf[1].base + 0x00100000;
523 ci->c_inf[1].cib = 0x18000000;
524 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
525 ci->c_inf[2].base = BCM43143_CORE_SOCRAM_BASE;
526 ci->c_inf[2].wrapbase = ci->c_inf[2].base + 0x00100000;
527 ci->c_inf[2].cib = 0x14000000;
528 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
529 ci->c_inf[3].base = BCM43143_CORE_ARM_BASE;
530 ci->c_inf[3].wrapbase = ci->c_inf[3].base + 0x00100000;
531 ci->c_inf[3].cib = 0x07000000;
532 ci->c_inf[4].id = BCMA_CORE_80211;
533 ci->c_inf[4].base = BCM43xx_CORE_D11_BASE;
534 ci->c_inf[4].wrapbase = ci->c_inf[4].base + 0x00100000;
535 ci->ramsize = BCM43143_RAMSIZE;
536 break;
537 case BCM43241_CHIP_ID:
538 ci->c_inf[0].wrapbase = 0x18100000;
539 ci->c_inf[0].cib = 0x2a084411;
540 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
541 ci->c_inf[1].base = 0x18002000;
542 ci->c_inf[1].wrapbase = 0x18102000;
543 ci->c_inf[1].cib = 0x0e004211;
544 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
545 ci->c_inf[2].base = 0x18004000;
546 ci->c_inf[2].wrapbase = 0x18104000;
547 ci->c_inf[2].cib = 0x14080401;
548 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
549 ci->c_inf[3].base = 0x18003000;
550 ci->c_inf[3].wrapbase = 0x18103000;
551 ci->c_inf[3].cib = 0x07004211;
552 ci->c_inf[4].id = BCMA_CORE_80211;
553 ci->c_inf[4].base = BCM43xx_CORE_D11_BASE;
554 ci->c_inf[4].wrapbase = ci->c_inf[4].base + 0x00100000;
555 ci->ramsize = 0x90000;
556 break;
557 case BCM4330_CHIP_ID:
558 ci->c_inf[0].wrapbase = 0x18100000;
559 ci->c_inf[0].cib = 0x27004211;
560 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
561 ci->c_inf[1].base = 0x18002000;
562 ci->c_inf[1].wrapbase = 0x18102000;
563 ci->c_inf[1].cib = 0x07004211;
564 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
565 ci->c_inf[2].base = 0x18004000;
566 ci->c_inf[2].wrapbase = 0x18104000;
567 ci->c_inf[2].cib = 0x0d080401;
568 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
569 ci->c_inf[3].base = 0x18003000;
570 ci->c_inf[3].wrapbase = 0x18103000;
571 ci->c_inf[3].cib = 0x03004211;
572 ci->c_inf[4].id = BCMA_CORE_80211;
573 ci->c_inf[4].base = BCM43xx_CORE_D11_BASE;
574 ci->c_inf[4].wrapbase = ci->c_inf[4].base + 0x00100000;
575 ci->ramsize = 0x48000;
576 break;
577 case BCM4334_CHIP_ID:
578 ci->c_inf[0].wrapbase = 0x18100000;
579 ci->c_inf[0].cib = 0x29004211;
580 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
581 ci->c_inf[1].base = 0x18002000;
582 ci->c_inf[1].wrapbase = 0x18102000;
583 ci->c_inf[1].cib = 0x0d004211;
584 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
585 ci->c_inf[2].base = 0x18004000;
586 ci->c_inf[2].wrapbase = 0x18104000;
587 ci->c_inf[2].cib = 0x13080401;
588 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
589 ci->c_inf[3].base = 0x18003000;
590 ci->c_inf[3].wrapbase = 0x18103000;
591 ci->c_inf[3].cib = 0x07004211;
592 ci->c_inf[4].id = BCMA_CORE_80211;
593 ci->c_inf[4].base = BCM43xx_CORE_D11_BASE;
594 ci->c_inf[4].wrapbase = ci->c_inf[4].base + 0x00100000;
595 ci->ramsize = 0x80000;
596 break;
597 case BCM4335_CHIP_ID:
598 ci->c_inf[0].wrapbase = 0x18100000;
599 ci->c_inf[0].cib = 0x2b084411;
600 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
601 ci->c_inf[1].base = 0x18005000;
602 ci->c_inf[1].wrapbase = 0x18105000;
603 ci->c_inf[1].cib = 0x0f004211;
604 ci->c_inf[2].id = BCMA_CORE_ARM_CR4;
605 ci->c_inf[2].base = 0x18002000;
606 ci->c_inf[2].wrapbase = 0x18102000;
607 ci->c_inf[2].cib = 0x01084411;
608 ci->c_inf[3].id = BCMA_CORE_80211;
609 ci->c_inf[3].base = BCM43xx_CORE_D11_BASE;
610 ci->c_inf[3].wrapbase = ci->c_inf[3].base + 0x00100000;
611 ci->ramsize = 0xc0000;
612 ci->rambase = 0x180000;
613 break;
614 case BCM43362_CHIP_ID:
615 ci->c_inf[0].wrapbase = 0x18100000;
616 ci->c_inf[0].cib = 0x27004211;
617 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
618 ci->c_inf[1].base = 0x18002000;
619 ci->c_inf[1].wrapbase = 0x18102000;
620 ci->c_inf[1].cib = 0x0a004211;
621 ci->c_inf[2].id = BCMA_CORE_INTERNAL_MEM;
622 ci->c_inf[2].base = 0x18004000;
623 ci->c_inf[2].wrapbase = 0x18104000;
624 ci->c_inf[2].cib = 0x08080401;
625 ci->c_inf[3].id = BCMA_CORE_ARM_CM3;
626 ci->c_inf[3].base = 0x18003000;
627 ci->c_inf[3].wrapbase = 0x18103000;
628 ci->c_inf[3].cib = 0x03004211;
629 ci->c_inf[4].id = BCMA_CORE_80211;
630 ci->c_inf[4].base = BCM43xx_CORE_D11_BASE;
631 ci->c_inf[4].wrapbase = ci->c_inf[4].base + 0x00100000;
632 ci->ramsize = 0x3C000;
633 break;
634 case BCM4339_CHIP_ID:
635 ci->c_inf[0].wrapbase = 0x18100000;
636 ci->c_inf[0].cib = 0x2e084411;
637 ci->c_inf[1].id = BCMA_CORE_SDIO_DEV;
638 ci->c_inf[1].base = 0x18005000;
639 ci->c_inf[1].wrapbase = 0x18105000;
640 ci->c_inf[1].cib = 0x15004211;
641 ci->c_inf[2].id = BCMA_CORE_ARM_CR4;
642 ci->c_inf[2].base = 0x18002000;
643 ci->c_inf[2].wrapbase = 0x18102000;
644 ci->c_inf[2].cib = 0x04084411;
645 ci->c_inf[3].id = BCMA_CORE_80211;
646 ci->c_inf[3].base = BCM43xx_CORE_D11_BASE;
647 ci->c_inf[3].wrapbase = ci->c_inf[3].base + 0x00100000;
648 ci->ramsize = 0xc0000;
649 ci->rambase = 0x180000;
650 break;
651 default:
652 brcmf_err("AXI chip is not supported\n");
653 return -ENODEV;
654 }
655 } else {
656 brcmf_err("chip backplane type %u is not supported\n",
657 socitype);
632 return -ENODEV; 658 return -ENODEV;
633 } 659 }
634 660
635 return 0; 661 return brcmf_sdio_chip_cichk(ci);
636} 662}
637 663
638static int 664static int
@@ -682,7 +708,7 @@ brcmf_sdio_chip_buscoreprep(struct brcmf_sdio_dev *sdiodev)
682 708
683static void 709static void
684brcmf_sdio_chip_buscoresetup(struct brcmf_sdio_dev *sdiodev, 710brcmf_sdio_chip_buscoresetup(struct brcmf_sdio_dev *sdiodev,
685 struct chip_info *ci) 711 struct brcmf_chip *ci)
686{ 712{
687 u32 base = ci->c_inf[0].base; 713 u32 base = ci->c_inf[0].base;
688 714
@@ -713,19 +739,18 @@ brcmf_sdio_chip_buscoresetup(struct brcmf_sdio_dev *sdiodev,
713 * Make sure any on-chip ARM is off (in case strapping is wrong), 739 * Make sure any on-chip ARM is off (in case strapping is wrong),
714 * or downloaded code was already running. 740 * or downloaded code was already running.
715 */ 741 */
716 ci->coredisable(sdiodev, ci, BCMA_CORE_ARM_CM3, 0); 742 ci->coredisable(sdiodev, ci, BCMA_CORE_ARM_CM3, 0, 0);
717} 743}
718 744
719int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, 745int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev,
720 struct chip_info **ci_ptr) 746 struct brcmf_chip **ci_ptr)
721{ 747{
722 int ret; 748 int ret;
723 struct chip_info *ci; 749 struct brcmf_chip *ci;
724 750
725 brcmf_dbg(TRACE, "Enter\n"); 751 brcmf_dbg(TRACE, "Enter\n");
726 752
727 /* alloc chip_info_t */ 753 ci = kzalloc(sizeof(*ci), GFP_ATOMIC);
728 ci = kzalloc(sizeof(struct chip_info), GFP_ATOMIC);
729 if (!ci) 754 if (!ci)
730 return -ENOMEM; 755 return -ENOMEM;
731 756
@@ -753,7 +778,7 @@ err:
753} 778}
754 779
755void 780void
756brcmf_sdio_chip_detach(struct chip_info **ci_ptr) 781brcmf_sdio_chip_detach(struct brcmf_chip **ci_ptr)
757{ 782{
758 brcmf_dbg(TRACE, "Enter\n"); 783 brcmf_dbg(TRACE, "Enter\n");
759 784
@@ -772,7 +797,7 @@ static char *brcmf_sdio_chip_name(uint chipid, char *buf, uint len)
772 797
773void 798void
774brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev, 799brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev,
775 struct chip_info *ci, u32 drivestrength) 800 struct brcmf_chip *ci, u32 drivestrength)
776{ 801{
777 const struct sdiod_drive_str *str_tab = NULL; 802 const struct sdiod_drive_str *str_tab = NULL;
778 u32 str_mask; 803 u32 str_mask;
@@ -842,107 +867,19 @@ brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev,
842 } 867 }
843} 868}
844 869
845#ifdef DEBUG
846static bool
847brcmf_sdio_chip_verifynvram(struct brcmf_sdio_dev *sdiodev, u32 nvram_addr,
848 char *nvram_dat, uint nvram_sz)
849{
850 char *nvram_ularray;
851 int err;
852 bool ret = true;
853
854 /* read back and verify */
855 brcmf_dbg(INFO, "Compare NVRAM dl & ul; size=%d\n", nvram_sz);
856 nvram_ularray = kmalloc(nvram_sz, GFP_KERNEL);
857 /* do not proceed while no memory but */
858 if (!nvram_ularray)
859 return true;
860
861 /* Upload image to verify downloaded contents. */
862 memset(nvram_ularray, 0xaa, nvram_sz);
863
864 /* Read the vars list to temp buffer for comparison */
865 err = brcmf_sdiod_ramrw(sdiodev, false, nvram_addr, nvram_ularray,
866 nvram_sz);
867 if (err) {
868 brcmf_err("error %d on reading %d nvram bytes at 0x%08x\n",
869 err, nvram_sz, nvram_addr);
870 } else if (memcmp(nvram_dat, nvram_ularray, nvram_sz)) {
871 brcmf_err("Downloaded NVRAM image is corrupted\n");
872 ret = false;
873 }
874 kfree(nvram_ularray);
875
876 return ret;
877}
878#else /* DEBUG */
879static inline bool
880brcmf_sdio_chip_verifynvram(struct brcmf_sdio_dev *sdiodev, u32 nvram_addr,
881 char *nvram_dat, uint nvram_sz)
882{
883 return true;
884}
885#endif /* DEBUG */
886
887static bool brcmf_sdio_chip_writenvram(struct brcmf_sdio_dev *sdiodev,
888 struct chip_info *ci,
889 char *nvram_dat, uint nvram_sz)
890{
891 int err;
892 u32 nvram_addr;
893 u32 token;
894 __le32 token_le;
895
896 nvram_addr = (ci->ramsize - 4) - nvram_sz + ci->rambase;
897
898 /* Write the vars list */
899 err = brcmf_sdiod_ramrw(sdiodev, true, nvram_addr, nvram_dat, nvram_sz);
900 if (err) {
901 brcmf_err("error %d on writing %d nvram bytes at 0x%08x\n",
902 err, nvram_sz, nvram_addr);
903 return false;
904 }
905
906 if (!brcmf_sdio_chip_verifynvram(sdiodev, nvram_addr,
907 nvram_dat, nvram_sz))
908 return false;
909
910 /* generate token:
911 * nvram size, converted to words, in lower 16-bits, checksum
912 * in upper 16-bits.
913 */
914 token = nvram_sz / 4;
915 token = (~token << 16) | (token & 0x0000FFFF);
916 token_le = cpu_to_le32(token);
917
918 brcmf_dbg(INFO, "RAM size: %d\n", ci->ramsize);
919 brcmf_dbg(INFO, "nvram is placed at %d, size %d, token=0x%08x\n",
920 nvram_addr, nvram_sz, token);
921
922 /* Write the length token to the last word */
923 if (brcmf_sdiod_ramrw(sdiodev, true, (ci->ramsize - 4 + ci->rambase),
924 (u8 *)&token_le, 4))
925 return false;
926
927 return true;
928}
929
930static void 870static void
931brcmf_sdio_chip_cm3_enterdl(struct brcmf_sdio_dev *sdiodev, 871brcmf_sdio_chip_cm3_enterdl(struct brcmf_sdio_dev *sdiodev,
932 struct chip_info *ci) 872 struct brcmf_chip *ci)
933{ 873{
934 u32 zeros = 0; 874 ci->coredisable(sdiodev, ci, BCMA_CORE_ARM_CM3, 0, 0);
935 875 ci->resetcore(sdiodev, ci, BCMA_CORE_80211,
936 ci->coredisable(sdiodev, ci, BCMA_CORE_ARM_CM3, 0); 876 D11_BCMA_IOCTL_PHYRESET | D11_BCMA_IOCTL_PHYCLOCKEN,
937 ci->resetcore(sdiodev, ci, BCMA_CORE_INTERNAL_MEM, 0); 877 D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN);
938 878 ci->resetcore(sdiodev, ci, BCMA_CORE_INTERNAL_MEM, 0, 0, 0);
939 /* clear length token */
940 brcmf_sdiod_ramrw(sdiodev, true, ci->ramsize - 4, (u8 *)&zeros, 4);
941} 879}
942 880
943static bool 881static bool brcmf_sdio_chip_cm3_exitdl(struct brcmf_sdio_dev *sdiodev,
944brcmf_sdio_chip_cm3_exitdl(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci, 882 struct brcmf_chip *ci)
945 char *nvram_dat, uint nvram_sz)
946{ 883{
947 u8 core_idx; 884 u8 core_idx;
948 u32 reg_addr; 885 u32 reg_addr;
@@ -952,38 +889,45 @@ brcmf_sdio_chip_cm3_exitdl(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci,
952 return false; 889 return false;
953 } 890 }
954 891
955 if (!brcmf_sdio_chip_writenvram(sdiodev, ci, nvram_dat, nvram_sz))
956 return false;
957
958 /* clear all interrupts */ 892 /* clear all interrupts */
959 core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV); 893 core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV);
960 reg_addr = ci->c_inf[core_idx].base; 894 reg_addr = ci->c_inf[core_idx].base;
961 reg_addr += offsetof(struct sdpcmd_regs, intstatus); 895 reg_addr += offsetof(struct sdpcmd_regs, intstatus);
962 brcmf_sdiod_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL); 896 brcmf_sdiod_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL);
963 897
964 ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CM3, 0); 898 ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CM3, 0, 0, 0);
965 899
966 return true; 900 return true;
967} 901}
968 902
969static inline void 903static inline void
970brcmf_sdio_chip_cr4_enterdl(struct brcmf_sdio_dev *sdiodev, 904brcmf_sdio_chip_cr4_enterdl(struct brcmf_sdio_dev *sdiodev,
971 struct chip_info *ci) 905 struct brcmf_chip *ci)
972{ 906{
973 ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CR4, 907 u8 idx;
974 ARMCR4_BCMA_IOCTL_CPUHALT); 908 u32 regdata;
909 u32 wrapbase;
910 idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_ARM_CR4);
911
912 if (idx == BRCMF_MAX_CORENUM)
913 return;
914
915 wrapbase = ci->c_inf[idx].wrapbase;
916 regdata = brcmf_sdiod_regrl(sdiodev, wrapbase + BCMA_IOCTL, NULL);
917 regdata &= ARMCR4_BCMA_IOCTL_CPUHALT;
918 ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CR4, regdata,
919 ARMCR4_BCMA_IOCTL_CPUHALT, ARMCR4_BCMA_IOCTL_CPUHALT);
920 ci->resetcore(sdiodev, ci, BCMA_CORE_80211,
921 D11_BCMA_IOCTL_PHYRESET | D11_BCMA_IOCTL_PHYCLOCKEN,
922 D11_BCMA_IOCTL_PHYCLOCKEN, D11_BCMA_IOCTL_PHYCLOCKEN);
975} 923}
976 924
977static bool 925static bool brcmf_sdio_chip_cr4_exitdl(struct brcmf_sdio_dev *sdiodev,
978brcmf_sdio_chip_cr4_exitdl(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci, 926 struct brcmf_chip *ci, u32 rstvec)
979 char *nvram_dat, uint nvram_sz)
980{ 927{
981 u8 core_idx; 928 u8 core_idx;
982 u32 reg_addr; 929 u32 reg_addr;
983 930
984 if (!brcmf_sdio_chip_writenvram(sdiodev, ci, nvram_dat, nvram_sz))
985 return false;
986
987 /* clear all interrupts */ 931 /* clear all interrupts */
988 core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV); 932 core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_SDIO_DEV);
989 reg_addr = ci->c_inf[core_idx].base; 933 reg_addr = ci->c_inf[core_idx].base;
@@ -991,17 +935,18 @@ brcmf_sdio_chip_cr4_exitdl(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci,
991 brcmf_sdiod_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL); 935 brcmf_sdiod_regwl(sdiodev, reg_addr, 0xFFFFFFFF, NULL);
992 936
993 /* Write reset vector to address 0 */ 937 /* Write reset vector to address 0 */
994 brcmf_sdiod_ramrw(sdiodev, true, 0, (void *)&ci->rst_vec, 938 brcmf_sdiod_ramrw(sdiodev, true, 0, (void *)&rstvec,
995 sizeof(ci->rst_vec)); 939 sizeof(rstvec));
996 940
997 /* restore ARM */ 941 /* restore ARM */
998 ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CR4, 0); 942 ci->resetcore(sdiodev, ci, BCMA_CORE_ARM_CR4, ARMCR4_BCMA_IOCTL_CPUHALT,
943 0, 0);
999 944
1000 return true; 945 return true;
1001} 946}
1002 947
1003void brcmf_sdio_chip_enter_download(struct brcmf_sdio_dev *sdiodev, 948void brcmf_sdio_chip_enter_download(struct brcmf_sdio_dev *sdiodev,
1004 struct chip_info *ci) 949 struct brcmf_chip *ci)
1005{ 950{
1006 u8 arm_core_idx; 951 u8 arm_core_idx;
1007 952
@@ -1015,15 +960,13 @@ void brcmf_sdio_chip_enter_download(struct brcmf_sdio_dev *sdiodev,
1015} 960}
1016 961
1017bool brcmf_sdio_chip_exit_download(struct brcmf_sdio_dev *sdiodev, 962bool brcmf_sdio_chip_exit_download(struct brcmf_sdio_dev *sdiodev,
1018 struct chip_info *ci, char *nvram_dat, 963 struct brcmf_chip *ci, u32 rstvec)
1019 uint nvram_sz)
1020{ 964{
1021 u8 arm_core_idx; 965 u8 arm_core_idx;
1022 966
1023 arm_core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_ARM_CM3); 967 arm_core_idx = brcmf_sdio_chip_getinfidx(ci, BCMA_CORE_ARM_CM3);
1024 if (BRCMF_MAX_CORENUM != arm_core_idx) 968 if (BRCMF_MAX_CORENUM != arm_core_idx)
1025 return brcmf_sdio_chip_cm3_exitdl(sdiodev, ci, nvram_dat, 969 return brcmf_sdio_chip_cm3_exitdl(sdiodev, ci);
1026 nvram_sz);
1027 970
1028 return brcmf_sdio_chip_cr4_exitdl(sdiodev, ci, nvram_dat, nvram_sz); 971 return brcmf_sdio_chip_cr4_exitdl(sdiodev, ci, rstvec);
1029} 972}
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
index 7ea424e20773..fb0614329ede 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio_chip.h
@@ -54,7 +54,7 @@
54 54
55#define BRCMF_MAX_CORENUM 6 55#define BRCMF_MAX_CORENUM 6
56 56
57struct chip_core_info { 57struct brcmf_core {
58 u16 id; 58 u16 id;
59 u16 rev; 59 u16 rev;
60 u32 base; 60 u32 base;
@@ -63,27 +63,28 @@ struct chip_core_info {
63 u32 cib; 63 u32 cib;
64}; 64};
65 65
66struct chip_info { 66struct brcmf_chip {
67 u32 chip; 67 u32 chip;
68 u32 chiprev; 68 u32 chiprev;
69 u32 socitype;
70 /* core info */ 69 /* core info */
71 /* always put chipcommon core at 0, bus core at 1 */ 70 /* always put chipcommon core at 0, bus core at 1 */
72 struct chip_core_info c_inf[BRCMF_MAX_CORENUM]; 71 struct brcmf_core c_inf[BRCMF_MAX_CORENUM];
73 u32 pmurev; 72 u32 pmurev;
74 u32 pmucaps; 73 u32 pmucaps;
75 u32 ramsize; 74 u32 ramsize;
76 u32 rambase; 75 u32 rambase;
77 u32 rst_vec; /* reset vertor for ARM CR4 core */ 76 u32 rst_vec; /* reset vertor for ARM CR4 core */
78 77
79 bool (*iscoreup)(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci, 78 bool (*iscoreup)(struct brcmf_sdio_dev *sdiodev, struct brcmf_chip *ci,
80 u16 coreid); 79 u16 coreid);
81 u32 (*corerev)(struct brcmf_sdio_dev *sdiodev, struct chip_info *ci, 80 u32 (*corerev)(struct brcmf_sdio_dev *sdiodev, struct brcmf_chip *ci,
82 u16 coreid); 81 u16 coreid);
83 void (*coredisable)(struct brcmf_sdio_dev *sdiodev, 82 void (*coredisable)(struct brcmf_sdio_dev *sdiodev,
84 struct chip_info *ci, u16 coreid, u32 core_bits); 83 struct brcmf_chip *ci, u16 coreid, u32 pre_resetbits,
84 u32 in_resetbits);
85 void (*resetcore)(struct brcmf_sdio_dev *sdiodev, 85 void (*resetcore)(struct brcmf_sdio_dev *sdiodev,
86 struct chip_info *ci, u16 coreid, u32 core_bits); 86 struct brcmf_chip *ci, u16 coreid, u32 pre_resetbits,
87 u32 in_resetbits, u32 post_resetbits);
87}; 88};
88 89
89struct sbconfig { 90struct sbconfig {
@@ -216,15 +217,15 @@ struct sdpcmd_regs {
216}; 217};
217 218
218int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev, 219int brcmf_sdio_chip_attach(struct brcmf_sdio_dev *sdiodev,
219 struct chip_info **ci_ptr); 220 struct brcmf_chip **ci_ptr);
220void brcmf_sdio_chip_detach(struct chip_info **ci_ptr); 221void brcmf_sdio_chip_detach(struct brcmf_chip **ci_ptr);
221void brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev, 222void brcmf_sdio_chip_drivestrengthinit(struct brcmf_sdio_dev *sdiodev,
222 struct chip_info *ci, u32 drivestrength); 223 struct brcmf_chip *ci,
223u8 brcmf_sdio_chip_getinfidx(struct chip_info *ci, u16 coreid); 224 u32 drivestrength);
225u8 brcmf_sdio_chip_getinfidx(struct brcmf_chip *ci, u16 coreid);
224void brcmf_sdio_chip_enter_download(struct brcmf_sdio_dev *sdiodev, 226void brcmf_sdio_chip_enter_download(struct brcmf_sdio_dev *sdiodev,
225 struct chip_info *ci); 227 struct brcmf_chip *ci);
226bool brcmf_sdio_chip_exit_download(struct brcmf_sdio_dev *sdiodev, 228bool brcmf_sdio_chip_exit_download(struct brcmf_sdio_dev *sdiodev,
227 struct chip_info *ci, char *nvram_dat, 229 struct brcmf_chip *ci, u32 rstvec);
228 uint nvram_sz);
229 230
230#endif /* _BRCMFMAC_SDIO_CHIP_H_ */ 231#endif /* _BRCMFMAC_SDIO_CHIP_H_ */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/usb.c b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
index c345c32eb631..24f65cd53859 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/usb.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/usb.c
@@ -522,10 +522,10 @@ brcmf_usb_state_change(struct brcmf_usbdev_info *devinfo, int state)
522 /* update state of upper layer */ 522 /* update state of upper layer */
523 if (state == BRCMFMAC_USB_STATE_DOWN) { 523 if (state == BRCMFMAC_USB_STATE_DOWN) {
524 brcmf_dbg(USB, "DBUS is down\n"); 524 brcmf_dbg(USB, "DBUS is down\n");
525 bcmf_bus->state = BRCMF_BUS_DOWN; 525 brcmf_bus_change_state(bcmf_bus, BRCMF_BUS_DOWN);
526 } else if (state == BRCMFMAC_USB_STATE_UP) { 526 } else if (state == BRCMFMAC_USB_STATE_UP) {
527 brcmf_dbg(USB, "DBUS is up\n"); 527 brcmf_dbg(USB, "DBUS is up\n");
528 bcmf_bus->state = BRCMF_BUS_DATA; 528 brcmf_bus_change_state(bcmf_bus, BRCMF_BUS_DATA);
529 } else { 529 } else {
530 brcmf_dbg(USB, "DBUS current state=%d\n", state); 530 brcmf_dbg(USB, "DBUS current state=%d\n", state);
531 } 531 }
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index aad83aef7d93..d7718a5fa2f0 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -2989,6 +2989,7 @@ brcmf_notify_sched_scan_results(struct brcmf_if *ifp,
2989 } 2989 }
2990 2990
2991 set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); 2991 set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
2992 cfg->escan_info.run = brcmf_run_escan;
2992 err = brcmf_do_escan(cfg, wiphy, ifp, request); 2993 err = brcmf_do_escan(cfg, wiphy, ifp, request);
2993 if (err) { 2994 if (err) {
2994 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); 2995 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
index e71ce8c842a2..925034b80e9c 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
@@ -1071,7 +1071,6 @@ static int ieee_hw_init(struct ieee80211_hw *hw)
1071 hw->max_rates = 2; /* Primary rate and 1 fallback rate */ 1071 hw->max_rates = 2; /* Primary rate and 1 fallback rate */
1072 1072
1073 /* channel change time is dependent on chip and band */ 1073 /* channel change time is dependent on chip and band */
1074 hw->channel_change_time = 7 * 1000;
1075 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 1074 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
1076 BIT(NL80211_IFTYPE_AP) | 1075 BIT(NL80211_IFTYPE_AP) |
1077 BIT(NL80211_IFTYPE_ADHOC); 1076 BIT(NL80211_IFTYPE_ADHOC);
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index 8138f1cff4e5..9417cb5a2553 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -7108,7 +7108,6 @@ prep_mac80211_status(struct brcms_c_info *wlc, struct d11rxhdr *rxh,
7108 struct sk_buff *p, 7108 struct sk_buff *p,
7109 struct ieee80211_rx_status *rx_status) 7109 struct ieee80211_rx_status *rx_status)
7110{ 7110{
7111 int preamble;
7112 int channel; 7111 int channel;
7113 u32 rspec; 7112 u32 rspec;
7114 unsigned char *plcp; 7113 unsigned char *plcp;
@@ -7191,7 +7190,6 @@ prep_mac80211_status(struct brcms_c_info *wlc, struct d11rxhdr *rxh,
7191 rx_status->rate_idx -= BRCMS_LEGACY_5G_RATE_OFFSET; 7190 rx_status->rate_idx -= BRCMS_LEGACY_5G_RATE_OFFSET;
7192 7191
7193 /* Determine short preamble and rate_idx */ 7192 /* Determine short preamble and rate_idx */
7194 preamble = 0;
7195 if (is_cck_rate(rspec)) { 7193 if (is_cck_rate(rspec)) {
7196 if (rxh->PhyRxStatus_0 & PRXS0_SHORTH) 7194 if (rxh->PhyRxStatus_0 & PRXS0_SHORTH)
7197 rx_status->flag |= RX_FLAG_SHORTPRE; 7195 rx_status->flag |= RX_FLAG_SHORTPRE;
diff --git a/drivers/net/wireless/cw1200/main.c b/drivers/net/wireless/cw1200/main.c
index d1270da4dfea..3e78cc3ccb78 100644
--- a/drivers/net/wireless/cw1200/main.c
+++ b/drivers/net/wireless/cw1200/main.c
@@ -301,7 +301,6 @@ static struct ieee80211_hw *cw1200_init_common(const u8 *macaddr,
301 301
302 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 302 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
303 303
304 hw->channel_change_time = 1000; /* TODO: find actual value */
305 hw->queues = 4; 304 hw->queues = 4;
306 305
307 priv->rts_threshold = -1; 306 priv->rts_threshold = -1;
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index 40eb5e691475..c24d1d3d55f6 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -406,9 +406,8 @@ static bool iwl_resume_status_fn(struct iwl_notif_wait_data *notif_wait,
406{ 406{
407 struct iwl_resume_data *resume_data = data; 407 struct iwl_resume_data *resume_data = data;
408 struct iwl_priv *priv = resume_data->priv; 408 struct iwl_priv *priv = resume_data->priv;
409 u32 len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
410 409
411 if (len - 4 != sizeof(*resume_data->cmd)) { 410 if (iwl_rx_packet_payload_len(pkt) != sizeof(*resume_data->cmd)) {
412 IWL_ERR(priv, "rx wrong size data\n"); 411 IWL_ERR(priv, "rx wrong size data\n");
413 return true; 412 return true;
414 } 413 }
diff --git a/drivers/net/wireless/iwlwifi/dvm/rx.c b/drivers/net/wireless/iwlwifi/dvm/rx.c
index b68bb2f4d2c2..7a1bc1c547e1 100644
--- a/drivers/net/wireless/iwlwifi/dvm/rx.c
+++ b/drivers/net/wireless/iwlwifi/dvm/rx.c
@@ -205,8 +205,7 @@ static int iwlagn_rx_pm_debug_statistics_notif(struct iwl_priv *priv,
205 struct iwl_device_cmd *cmd) 205 struct iwl_device_cmd *cmd)
206{ 206{
207 struct iwl_rx_packet *pkt = rxb_addr(rxb); 207 struct iwl_rx_packet *pkt = rxb_addr(rxb);
208 u32 __maybe_unused len = 208 u32 __maybe_unused len = iwl_rx_packet_len(pkt);
209 le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
210 IWL_DEBUG_RADIO(priv, "Dumping %d bytes of unhandled " 209 IWL_DEBUG_RADIO(priv, "Dumping %d bytes of unhandled "
211 "notification for PM_DEBUG_STATISTIC_NOTIFIC:\n", len); 210 "notification for PM_DEBUG_STATISTIC_NOTIFIC:\n", len);
212 iwl_print_hex_dump(priv, IWL_DL_RADIO, pkt->data, len); 211 iwl_print_hex_dump(priv, IWL_DL_RADIO, pkt->data, len);
@@ -457,7 +456,7 @@ static int iwlagn_rx_statistics(struct iwl_priv *priv,
457 const int reg_recalib_period = 60; 456 const int reg_recalib_period = 60;
458 int change; 457 int change;
459 struct iwl_rx_packet *pkt = rxb_addr(rxb); 458 struct iwl_rx_packet *pkt = rxb_addr(rxb);
460 u32 len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; 459 u32 len = iwl_rx_packet_payload_len(pkt);
461 __le32 *flag; 460 __le32 *flag;
462 struct statistics_general_common *common; 461 struct statistics_general_common *common;
463 struct statistics_rx_non_phy *rx_non_phy; 462 struct statistics_rx_non_phy *rx_non_phy;
@@ -467,8 +466,6 @@ static int iwlagn_rx_statistics(struct iwl_priv *priv,
467 struct statistics_tx *tx; 466 struct statistics_tx *tx;
468 struct statistics_bt_activity *bt_activity; 467 struct statistics_bt_activity *bt_activity;
469 468
470 len -= sizeof(struct iwl_cmd_header); /* skip header */
471
472 IWL_DEBUG_RX(priv, "Statistics notification received (%d bytes).\n", 469 IWL_DEBUG_RX(priv, "Statistics notification received (%d bytes).\n",
473 len); 470 len);
474 471
diff --git a/drivers/net/wireless/iwlwifi/dvm/ucode.c b/drivers/net/wireless/iwlwifi/dvm/ucode.c
index f59709a9b79d..cf03ef5619d9 100644
--- a/drivers/net/wireless/iwlwifi/dvm/ucode.c
+++ b/drivers/net/wireless/iwlwifi/dvm/ucode.c
@@ -388,7 +388,6 @@ static bool iwlagn_wait_calib(struct iwl_notif_wait_data *notif_wait,
388{ 388{
389 struct iwl_priv *priv = data; 389 struct iwl_priv *priv = data;
390 struct iwl_calib_hdr *hdr; 390 struct iwl_calib_hdr *hdr;
391 int len;
392 391
393 if (pkt->hdr.cmd != CALIBRATION_RES_NOTIFICATION) { 392 if (pkt->hdr.cmd != CALIBRATION_RES_NOTIFICATION) {
394 WARN_ON(pkt->hdr.cmd != CALIBRATION_COMPLETE_NOTIFICATION); 393 WARN_ON(pkt->hdr.cmd != CALIBRATION_COMPLETE_NOTIFICATION);
@@ -396,12 +395,8 @@ static bool iwlagn_wait_calib(struct iwl_notif_wait_data *notif_wait,
396 } 395 }
397 396
398 hdr = (struct iwl_calib_hdr *)pkt->data; 397 hdr = (struct iwl_calib_hdr *)pkt->data;
399 len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
400 398
401 /* reduce the size by the length field itself */ 399 if (iwl_calib_set(priv, hdr, iwl_rx_packet_payload_len(pkt)))
402 len -= sizeof(__le32);
403
404 if (iwl_calib_set(priv, hdr, len))
405 IWL_ERR(priv, "Failed to record calibration data %d\n", 400 IWL_ERR(priv, "Failed to record calibration data %d\n",
406 hdr->op_code); 401 hdr->op_code);
407 402
diff --git a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
index 1b61cb529948..f06f4cbe1317 100644
--- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
+++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
@@ -264,14 +264,13 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
264 struct ieee80211_sta_vht_cap *vht_cap) 264 struct ieee80211_sta_vht_cap *vht_cap)
265{ 265{
266 int num_ants = num_of_ant(data->valid_rx_ant); 266 int num_ants = num_of_ant(data->valid_rx_ant);
267 int bf_sts_cap = num_ants - 1;
268 267
269 vht_cap->vht_supported = true; 268 vht_cap->vht_supported = true;
270 269
271 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 | 270 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 |
272 IEEE80211_VHT_CAP_RXSTBC_1 | 271 IEEE80211_VHT_CAP_RXSTBC_1 |
273 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | 272 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
274 bf_sts_cap << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT | 273 3 << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT |
275 7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 274 7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
276 275
277 if (num_ants > 1) 276 if (num_ants > 1)
@@ -290,9 +289,6 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
290 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 | 289 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
291 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14); 290 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14);
292 291
293 /* Max rate for Long GI NSS=2 80Mhz is 780Mbps */
294 vht_cap->vht_mcs.rx_highest = cpu_to_le16(780);
295
296 if (num_ants == 1 || 292 if (num_ants == 1 ||
297 cfg->rx_with_siso_diversity) { 293 cfg->rx_with_siso_diversity) {
298 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN | 294 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN |
@@ -300,12 +296,9 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
300 /* this works because NOT_SUPPORTED == 3 */ 296 /* this works because NOT_SUPPORTED == 3 */
301 vht_cap->vht_mcs.rx_mcs_map |= 297 vht_cap->vht_mcs.rx_mcs_map |=
302 cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2); 298 cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2);
303 /* Max rate for Long GI NSS=1 80Mhz is 390Mbps */
304 vht_cap->vht_mcs.rx_highest = cpu_to_le16(390);
305 } 299 }
306 300
307 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map; 301 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
308 vht_cap->vht_mcs.tx_highest = vht_cap->vht_mcs.rx_highest;
309} 302}
310 303
311static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg, 304static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
index d69b0fb0a434..100bd0d79681 100644
--- a/drivers/net/wireless/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
@@ -277,4 +277,8 @@ static inline unsigned int SCD_QUEUE_STATUS_BITS(unsigned int chnl)
277 277
278/*********************** END TX SCHEDULER *************************************/ 278/*********************** END TX SCHEDULER *************************************/
279 279
280/* Oscillator clock */
281#define OSC_CLK (0xa04068)
282#define OSC_CLK_FORCE_CONTROL (0x8)
283
280#endif /* __iwl_prph_h__ */ 284#endif /* __iwl_prph_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h
index 8d1b5ed3502a..1f065cf4a4ba 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.h
@@ -176,6 +176,16 @@ struct iwl_rx_packet {
176 u8 data[]; 176 u8 data[];
177} __packed; 177} __packed;
178 178
179static inline u32 iwl_rx_packet_len(const struct iwl_rx_packet *pkt)
180{
181 return le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK;
182}
183
184static inline u32 iwl_rx_packet_payload_len(const struct iwl_rx_packet *pkt)
185{
186 return iwl_rx_packet_len(pkt) - sizeof(pkt->hdr);
187}
188
179/** 189/**
180 * enum CMD_MODE - how to send the host commands ? 190 * enum CMD_MODE - how to send the host commands ?
181 * 191 *
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c
index f04d2f4d80cd..f36a7ee0267f 100644
--- a/drivers/net/wireless/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
@@ -886,8 +886,7 @@ static int iwl_mvm_get_last_nonqos_seq(struct iwl_mvm *mvm,
886 if (err) 886 if (err)
887 return err; 887 return err;
888 888
889 size = le32_to_cpu(cmd.resp_pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; 889 size = iwl_rx_packet_payload_len(cmd.resp_pkt);
890 size -= sizeof(cmd.resp_pkt->hdr);
891 if (size < sizeof(__le16)) { 890 if (size < sizeof(__le16)) {
892 err = -EINVAL; 891 err = -EINVAL;
893 } else { 892 } else {
@@ -1211,9 +1210,8 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
1211 if (ret) 1210 if (ret)
1212 goto out; 1211 goto out;
1213#ifdef CONFIG_IWLWIFI_DEBUGFS 1212#ifdef CONFIG_IWLWIFI_DEBUGFS
1214 len = le32_to_cpu(d3_cfg_cmd.resp_pkt->len_n_flags) & 1213 len = iwl_rx_packet_payload_len(d3_cfg_cmd.resp_pkt);
1215 FH_RSCSR_FRAME_SIZE_MSK; 1214 if (len >= sizeof(u32)) {
1216 if (len >= sizeof(u32) * 2) {
1217 mvm->d3_test_pme_ptr = 1215 mvm->d3_test_pme_ptr =
1218 le32_to_cpup((__le32 *)d3_cfg_cmd.resp_pkt->data); 1216 le32_to_cpup((__le32 *)d3_cfg_cmd.resp_pkt->data);
1219 } 1217 }
@@ -1668,8 +1666,8 @@ static bool iwl_mvm_query_wakeup_reasons(struct iwl_mvm *mvm,
1668 else 1666 else
1669 status_size = sizeof(struct iwl_wowlan_status_v4); 1667 status_size = sizeof(struct iwl_wowlan_status_v4);
1670 1668
1671 len = le32_to_cpu(cmd.resp_pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; 1669 len = iwl_rx_packet_payload_len(cmd.resp_pkt);
1672 if (len - sizeof(struct iwl_cmd_header) < status_size) { 1670 if (len < status_size) {
1673 IWL_ERR(mvm, "Invalid WoWLAN status response!\n"); 1671 IWL_ERR(mvm, "Invalid WoWLAN status response!\n");
1674 goto out_free_resp; 1672 goto out_free_resp;
1675 } 1673 }
@@ -1704,8 +1702,7 @@ static bool iwl_mvm_query_wakeup_reasons(struct iwl_mvm *mvm,
1704 status.wake_packet = status_v4->wake_packet; 1702 status.wake_packet = status_v4->wake_packet;
1705 } 1703 }
1706 1704
1707 if (len - sizeof(struct iwl_cmd_header) != 1705 if (len != status_size + ALIGN(status.wake_packet_bufsize, 4)) {
1708 status_size + ALIGN(status.wake_packet_bufsize, 4)) {
1709 IWL_ERR(mvm, "Invalid WoWLAN status response!\n"); 1706 IWL_ERR(mvm, "Invalid WoWLAN status response!\n");
1710 goto out_free_resp; 1707 goto out_free_resp;
1711 } 1708 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
index 76cdce9edf55..369d4c90e669 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
@@ -135,7 +135,7 @@ static ssize_t iwl_dbgfs_sram_read(struct file *file, char __user *user_buf,
135 ofs = img->sec[IWL_UCODE_SECTION_DATA].offset; 135 ofs = img->sec[IWL_UCODE_SECTION_DATA].offset;
136 len = img->sec[IWL_UCODE_SECTION_DATA].len; 136 len = img->sec[IWL_UCODE_SECTION_DATA].len;
137 137
138 if (!mvm->dbgfs_sram_offset && !mvm->dbgfs_sram_len) { 138 if (mvm->dbgfs_sram_len) {
139 ofs = mvm->dbgfs_sram_offset; 139 ofs = mvm->dbgfs_sram_offset;
140 len = mvm->dbgfs_sram_len; 140 len = mvm->dbgfs_sram_len;
141 } 141 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-sta.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-sta.h
index 6bbbad453a3b..1b60fdff6a56 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-sta.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-sta.h
@@ -97,9 +97,6 @@ enum iwl_sta_flags {
97 STA_FLG_FLG_ANT_B), 97 STA_FLG_FLG_ANT_B),
98 98
99 STA_FLG_PS = BIT(8), 99 STA_FLG_PS = BIT(8),
100 STA_FLG_INVALID = BIT(9),
101 STA_FLG_DLP_EN = BIT(10),
102 STA_FLG_SET_ALL_KEYS = BIT(11),
103 STA_FLG_DRAIN_FLOW = BIT(12), 100 STA_FLG_DRAIN_FLOW = BIT(12),
104 STA_FLG_PAN = BIT(13), 101 STA_FLG_PAN = BIT(13),
105 STA_FLG_CLASS_AUTH = BIT(14), 102 STA_FLG_CLASS_AUTH = BIT(14),
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index b41177eb4888..c49b5073c251 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -262,9 +262,9 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
262 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD; 262 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
263 263
264 /* currently FW API supports only one optional cipher scheme */ 264 /* currently FW API supports only one optional cipher scheme */
265 if (mvm->fw->cs->cipher) { 265 if (mvm->fw->cs[0].cipher) {
266 mvm->hw->n_cipher_schemes = 1; 266 mvm->hw->n_cipher_schemes = 1;
267 mvm->hw->cipher_schemes = mvm->fw->cs; 267 mvm->hw->cipher_schemes = &mvm->fw->cs[0];
268 } 268 }
269 269
270#ifdef CONFIG_PM_SLEEP 270#ifdef CONFIG_PM_SLEEP
@@ -944,6 +944,8 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
944 IWL_ERR(mvm, "failed to update power mode\n"); 944 IWL_ERR(mvm, "failed to update power mode\n");
945 } 945 }
946 iwl_mvm_bt_coex_vif_change(mvm); 946 iwl_mvm_bt_coex_vif_change(mvm);
947 iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_TT,
948 IEEE80211_SMPS_AUTOMATIC);
947 } else if (changes & BSS_CHANGED_BEACON_INFO) { 949 } else if (changes & BSS_CHANGED_BEACON_INFO) {
948 /* 950 /*
949 * We received a beacon _after_ association so 951 * We received a beacon _after_ association so
@@ -1012,9 +1014,16 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
1012 if (ret) 1014 if (ret)
1013 goto out_unbind; 1015 goto out_unbind;
1014 1016
1017 /* must be set before quota calculations */
1018 mvmvif->ap_ibss_active = true;
1019
1020 /* power updated needs to be done before quotas */
1021 mvm->bound_vif_cnt++;
1022 iwl_mvm_power_update_binding(mvm, vif, true);
1023
1015 ret = iwl_mvm_update_quotas(mvm, vif); 1024 ret = iwl_mvm_update_quotas(mvm, vif);
1016 if (ret) 1025 if (ret)
1017 goto out_rm_bcast; 1026 goto out_quota_failed;
1018 1027
1019 /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */ 1028 /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */
1020 if (vif->p2p && mvm->p2p_device_vif) 1029 if (vif->p2p && mvm->p2p_device_vif)
@@ -1025,7 +1034,10 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
1025 mutex_unlock(&mvm->mutex); 1034 mutex_unlock(&mvm->mutex);
1026 return 0; 1035 return 0;
1027 1036
1028out_rm_bcast: 1037out_quota_failed:
1038 mvm->bound_vif_cnt--;
1039 iwl_mvm_power_update_binding(mvm, vif, false);
1040 mvmvif->ap_ibss_active = false;
1029 iwl_mvm_send_rm_bcast_sta(mvm, &mvmvif->bcast_sta); 1041 iwl_mvm_send_rm_bcast_sta(mvm, &mvmvif->bcast_sta);
1030out_unbind: 1042out_unbind:
1031 iwl_mvm_binding_remove_vif(mvm, vif); 1043 iwl_mvm_binding_remove_vif(mvm, vif);
@@ -1057,6 +1069,10 @@ static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
1057 iwl_mvm_update_quotas(mvm, NULL); 1069 iwl_mvm_update_quotas(mvm, NULL);
1058 iwl_mvm_send_rm_bcast_sta(mvm, &mvmvif->bcast_sta); 1070 iwl_mvm_send_rm_bcast_sta(mvm, &mvmvif->bcast_sta);
1059 iwl_mvm_binding_remove_vif(mvm, vif); 1071 iwl_mvm_binding_remove_vif(mvm, vif);
1072
1073 mvm->bound_vif_cnt--;
1074 iwl_mvm_power_update_binding(mvm, vif, false);
1075
1060 iwl_mvm_mac_ctxt_remove(mvm, vif); 1076 iwl_mvm_mac_ctxt_remove(mvm, vif);
1061 1077
1062 mutex_unlock(&mvm->mutex); 1078 mutex_unlock(&mvm->mutex);
@@ -1790,11 +1806,11 @@ static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw,
1790 } 1806 }
1791 1807
1792 iwl_mvm_binding_remove_vif(mvm, vif); 1808 iwl_mvm_binding_remove_vif(mvm, vif);
1793out_unlock:
1794 mvmvif->phy_ctxt = NULL;
1795 mvm->bound_vif_cnt--; 1809 mvm->bound_vif_cnt--;
1796 iwl_mvm_power_update_binding(mvm, vif, false); 1810 iwl_mvm_power_update_binding(mvm, vif, false);
1797 1811
1812out_unlock:
1813 mvmvif->phy_ctxt = NULL;
1798 mutex_unlock(&mvm->mutex); 1814 mutex_unlock(&mvm->mutex);
1799} 1815}
1800 1816
diff --git a/drivers/net/wireless/iwlwifi/mvm/nvm.c b/drivers/net/wireless/iwlwifi/mvm/nvm.c
index c6beb0f842d5..35b71af78d02 100644
--- a/drivers/net/wireless/iwlwifi/mvm/nvm.c
+++ b/drivers/net/wireless/iwlwifi/mvm/nvm.c
@@ -392,17 +392,16 @@ out:
392/* Loads the NVM data stored in mvm->nvm_sections into the NIC */ 392/* Loads the NVM data stored in mvm->nvm_sections into the NIC */
393int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm) 393int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm)
394{ 394{
395 int i, ret; 395 int i, ret = 0;
396 u16 section_id;
397 struct iwl_nvm_section *sections = mvm->nvm_sections; 396 struct iwl_nvm_section *sections = mvm->nvm_sections;
398 397
399 IWL_DEBUG_EEPROM(mvm->trans->dev, "'Write to NVM\n"); 398 IWL_DEBUG_EEPROM(mvm->trans->dev, "'Write to NVM\n");
400 399
401 for (i = 0; i < ARRAY_SIZE(nvm_to_read); i++) { 400 for (i = 0; i < ARRAY_SIZE(mvm->nvm_sections); i++) {
402 section_id = nvm_to_read[i]; 401 if (!mvm->nvm_sections[i].data || !mvm->nvm_sections[i].length)
403 ret = iwl_nvm_write_section(mvm, section_id, 402 continue;
404 sections[section_id].data, 403 ret = iwl_nvm_write_section(mvm, i, sections[i].data,
405 sections[section_id].length); 404 sections[i].length);
406 if (ret < 0) { 405 if (ret < 0) {
407 IWL_ERR(mvm, "iwl_mvm_send_cmd failed: %d\n", ret); 406 IWL_ERR(mvm, "iwl_mvm_send_cmd failed: %d\n", ret);
408 break; 407 break;
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index 552c76a926ed..a3d43de342d7 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -309,6 +309,7 @@ static const char *iwl_mvm_cmd_strings[REPLY_MAX] = {
309 CMD(BT_PROFILE_NOTIFICATION), 309 CMD(BT_PROFILE_NOTIFICATION),
310 CMD(BT_CONFIG), 310 CMD(BT_CONFIG),
311 CMD(MCAST_FILTER_CMD), 311 CMD(MCAST_FILTER_CMD),
312 CMD(REPLY_SF_CFG_CMD),
312 CMD(REPLY_BEACON_FILTERING_CMD), 313 CMD(REPLY_BEACON_FILTERING_CMD),
313 CMD(REPLY_THERMAL_MNG_BACKOFF), 314 CMD(REPLY_THERMAL_MNG_BACKOFF),
314 CMD(MAC_PM_POWER_TABLE), 315 CMD(MAC_PM_POWER_TABLE),
@@ -472,6 +473,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
472 473
473 out_unregister: 474 out_unregister:
474 ieee80211_unregister_hw(mvm->hw); 475 ieee80211_unregister_hw(mvm->hw);
476 iwl_mvm_leds_exit(mvm);
475 out_free: 477 out_free:
476 iwl_phy_db_free(mvm->phy_db); 478 iwl_phy_db_free(mvm->phy_db);
477 kfree(mvm->scan_cmd); 479 kfree(mvm->scan_cmd);
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index ba078a3322b8..6abf74e1351f 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -356,7 +356,7 @@ static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
356 return idx; 356 return idx;
357 } 357 }
358 358
359 return -1; 359 return IWL_RATE_INVALID;
360} 360}
361 361
362static void rs_rate_scale_perform(struct iwl_mvm *mvm, 362static void rs_rate_scale_perform(struct iwl_mvm *mvm,
@@ -702,10 +702,8 @@ static int rs_rate_from_ucode_rate(const u32 ucode_rate,
702 memset(rate, 0, sizeof(*rate)); 702 memset(rate, 0, sizeof(*rate));
703 rate->index = iwl_hwrate_to_plcp_idx(ucode_rate); 703 rate->index = iwl_hwrate_to_plcp_idx(ucode_rate);
704 704
705 if (rate->index == IWL_RATE_INVALID) { 705 if (rate->index == IWL_RATE_INVALID)
706 rate->index = -1;
707 return -EINVAL; 706 return -EINVAL;
708 }
709 707
710 rate->ant = (ant_msk >> RATE_MCS_ANT_POS); 708 rate->ant = (ant_msk >> RATE_MCS_ANT_POS);
711 709
@@ -1590,6 +1588,8 @@ static int rs_switch_to_column(struct iwl_mvm *mvm,
1590 search_tbl->column = col_id; 1588 search_tbl->column = col_id;
1591 rs_set_expected_tpt_table(lq_sta, search_tbl); 1589 rs_set_expected_tpt_table(lq_sta, search_tbl);
1592 1590
1591 lq_sta->visited_columns |= BIT(col_id);
1592
1593 /* Get the best matching rate if we're changing modes. e.g. 1593 /* Get the best matching rate if we're changing modes. e.g.
1594 * SISO->MIMO, LEGACY->SISO, MIMO->SISO 1594 * SISO->MIMO, LEGACY->SISO, MIMO->SISO
1595 */ 1595 */
@@ -1613,7 +1613,6 @@ static int rs_switch_to_column(struct iwl_mvm *mvm,
1613 IWL_DEBUG_RATE(mvm, "Switched to column %d: Index %d\n", 1613 IWL_DEBUG_RATE(mvm, "Switched to column %d: Index %d\n",
1614 col_id, rate->index); 1614 col_id, rate->index);
1615 1615
1616 lq_sta->visited_columns |= BIT(col_id);
1617 return 0; 1616 return 0;
1618 1617
1619err: 1618err:
@@ -2560,7 +2559,9 @@ static int rs_pretty_print_rate(char *buf, const u32 rate)
2560 int index = iwl_hwrate_to_plcp_idx(rate); 2559 int index = iwl_hwrate_to_plcp_idx(rate);
2561 2560
2562 return sprintf(buf, "Legacy | ANT: %s Rate: %s Mbps\n", 2561 return sprintf(buf, "Legacy | ANT: %s Rate: %s Mbps\n",
2563 rs_pretty_ant(ant), iwl_rate_mcs[index].mbps); 2562 rs_pretty_ant(ant),
2563 index == IWL_RATE_INVALID ? "BAD" :
2564 iwl_rate_mcs[index].mbps);
2564 } 2565 }
2565 2566
2566 if (rate & RATE_MCS_VHT_MSK) { 2567 if (rate & RATE_MCS_VHT_MSK) {
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c
index 50f3d7f560bc..b4c2abaa297b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c
@@ -249,12 +249,12 @@ static bool iwl_mvm_time_event_response(struct iwl_notif_wait_data *notif_wait,
249 container_of(notif_wait, struct iwl_mvm, notif_wait); 249 container_of(notif_wait, struct iwl_mvm, notif_wait);
250 struct iwl_mvm_time_event_data *te_data = data; 250 struct iwl_mvm_time_event_data *te_data = data;
251 struct iwl_time_event_resp *resp; 251 struct iwl_time_event_resp *resp;
252 int resp_len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; 252 int resp_len = iwl_rx_packet_payload_len(pkt);
253 253
254 if (WARN_ON(pkt->hdr.cmd != TIME_EVENT_CMD)) 254 if (WARN_ON(pkt->hdr.cmd != TIME_EVENT_CMD))
255 return true; 255 return true;
256 256
257 if (WARN_ON_ONCE(resp_len != sizeof(pkt->hdr) + sizeof(*resp))) { 257 if (WARN_ON_ONCE(resp_len != sizeof(*resp))) {
258 IWL_ERR(mvm, "Invalid TIME_EVENT_CMD response\n"); 258 IWL_ERR(mvm, "Invalid TIME_EVENT_CMD response\n");
259 return true; 259 return true;
260 } 260 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c
index 3c575a39987b..90378c217bc7 100644
--- a/drivers/net/wireless/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
@@ -390,7 +390,6 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
390 seq_number &= IEEE80211_SCTL_SEQ; 390 seq_number &= IEEE80211_SCTL_SEQ;
391 hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG); 391 hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
392 hdr->seq_ctrl |= cpu_to_le16(seq_number); 392 hdr->seq_ctrl |= cpu_to_le16(seq_number);
393 seq_number += 0x10;
394 is_data_qos = true; 393 is_data_qos = true;
395 is_ampdu = info->flags & IEEE80211_TX_CTL_AMPDU; 394 is_ampdu = info->flags & IEEE80211_TX_CTL_AMPDU;
396 } 395 }
@@ -407,13 +406,13 @@ int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
407 } 406 }
408 407
409 IWL_DEBUG_TX(mvm, "TX to [%d|%d] Q:%d - seq: 0x%x\n", mvmsta->sta_id, 408 IWL_DEBUG_TX(mvm, "TX to [%d|%d] Q:%d - seq: 0x%x\n", mvmsta->sta_id,
410 tid, txq_id, seq_number); 409 tid, txq_id, IEEE80211_SEQ_TO_SN(seq_number));
411 410
412 if (iwl_trans_tx(mvm->trans, skb, dev_cmd, txq_id)) 411 if (iwl_trans_tx(mvm->trans, skb, dev_cmd, txq_id))
413 goto drop_unlock_sta; 412 goto drop_unlock_sta;
414 413
415 if (is_data_qos && !ieee80211_has_morefrags(fc)) 414 if (is_data_qos && !ieee80211_has_morefrags(fc))
416 mvmsta->tid_data[tid].seq_number = seq_number; 415 mvmsta->tid_data[tid].seq_number = seq_number + 0x10;
417 416
418 spin_unlock(&mvmsta->lock); 417 spin_unlock(&mvmsta->lock);
419 418
@@ -704,7 +703,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
704 */ 703 */
705 spin_lock_bh(&mvmsta->lock); 704 spin_lock_bh(&mvmsta->lock);
706 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]); 705 sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
707 if (IS_ERR_OR_NULL(sta)) { 706 if (!sta || PTR_ERR(sta) == -EBUSY) {
708 /* 707 /*
709 * Station disappeared in the meantime: 708 * Station disappeared in the meantime:
710 * so we are draining. 709 * so we are draining.
@@ -713,7 +712,7 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
713 schedule_work(&mvm->sta_drained_wk); 712 schedule_work(&mvm->sta_drained_wk);
714 } 713 }
715 spin_unlock_bh(&mvmsta->lock); 714 spin_unlock_bh(&mvmsta->lock);
716 } else if (!mvmsta) { 715 } else if (!mvmsta && PTR_ERR(sta) == -EBUSY) {
717 /* Tx response without STA, so we are draining */ 716 /* Tx response without STA, so we are draining */
718 set_bit(sta_id, mvm->sta_drained); 717 set_bit(sta_id, mvm->sta_drained);
719 schedule_work(&mvm->sta_drained_wk); 718 schedule_work(&mvm->sta_drained_wk);
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index 487d61b25359..a4a5e25623c3 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -168,8 +168,8 @@ int iwl_mvm_send_cmd_status(struct iwl_mvm *mvm, struct iwl_host_cmd *cmd,
168 goto out_free_resp; 168 goto out_free_resp;
169 } 169 }
170 170
171 resp_len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; 171 resp_len = iwl_rx_packet_payload_len(pkt);
172 if (WARN_ON_ONCE(resp_len != sizeof(pkt->hdr) + sizeof(*resp))) { 172 if (WARN_ON_ONCE(resp_len != sizeof(*resp))) {
173 ret = -EIO; 173 ret = -EIO;
174 goto out_free_resp; 174 goto out_free_resp;
175 } 175 }
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c
index 1890ea29c264..08c23d497a02 100644
--- a/drivers/net/wireless/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/rx.c
@@ -615,7 +615,7 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
615 rxcb._offset, get_cmd_string(trans_pcie, pkt->hdr.cmd), 615 rxcb._offset, get_cmd_string(trans_pcie, pkt->hdr.cmd),
616 pkt->hdr.cmd); 616 pkt->hdr.cmd);
617 617
618 len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; 618 len = iwl_rx_packet_len(pkt);
619 len += sizeof(u32); /* account for status word */ 619 len += sizeof(u32); /* account for status word */
620 trace_iwlwifi_dev_rx(trans->dev, trans, pkt, len); 620 trace_iwlwifi_dev_rx(trans->dev, trans, pkt, len);
621 trace_iwlwifi_dev_rx_data(trans->dev, trans, pkt, len); 621 trace_iwlwifi_dev_rx_data(trans->dev, trans, pkt, len);
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 16f66c1a23de..f9507807b486 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -178,6 +178,28 @@ static int iwl_pcie_apm_init(struct iwl_trans *trans)
178 goto out; 178 goto out;
179 } 179 }
180 180
181 if (trans->cfg->host_interrupt_operation_mode) {
182 /*
183 * This is a bit of an abuse - This is needed for 7260 / 3160
184 * only check host_interrupt_operation_mode even if this is
185 * not related to host_interrupt_operation_mode.
186 *
187 * Enable the oscillator to count wake up time for L1 exit. This
188 * consumes slightly more power (100uA) - but allows to be sure
189 * that we wake up from L1 on time.
190 *
191 * This looks weird: read twice the same register, discard the
192 * value, set a bit, and yet again, read that same register
193 * just to discard the value. But that's the way the hardware
194 * seems to like it.
195 */
196 iwl_read_prph(trans, OSC_CLK);
197 iwl_read_prph(trans, OSC_CLK);
198 iwl_set_bits_prph(trans, OSC_CLK, OSC_CLK_FORCE_CONTROL);
199 iwl_read_prph(trans, OSC_CLK);
200 iwl_read_prph(trans, OSC_CLK);
201 }
202
181 /* 203 /*
182 * Enable DMA clock and wait for it to stabilize. 204 * Enable DMA clock and wait for it to stabilize.
183 * 205 *
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c
index 116f4aba08d6..32f75007a825 100644
--- a/drivers/net/wireless/libertas/cfg.c
+++ b/drivers/net/wireless/libertas/cfg.c
@@ -1268,14 +1268,9 @@ static struct cfg80211_scan_request *
1268_new_connect_scan_req(struct wiphy *wiphy, struct cfg80211_connect_params *sme) 1268_new_connect_scan_req(struct wiphy *wiphy, struct cfg80211_connect_params *sme)
1269{ 1269{
1270 struct cfg80211_scan_request *creq = NULL; 1270 struct cfg80211_scan_request *creq = NULL;
1271 int i, n_channels = 0; 1271 int i, n_channels = ieee80211_get_num_supported_channels(wiphy);
1272 enum ieee80211_band band; 1272 enum ieee80211_band band;
1273 1273
1274 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
1275 if (wiphy->bands[band])
1276 n_channels += wiphy->bands[band]->n_channels;
1277 }
1278
1279 creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) + 1274 creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
1280 n_channels * sizeof(void *), 1275 n_channels * sizeof(void *),
1281 GFP_ATOMIC); 1276 GFP_ATOMIC);
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index fa41a773b79b..69d4c3179d04 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -163,6 +163,11 @@ static const struct ieee80211_regdomain hwsim_world_regdom_custom_02 = {
163 } 163 }
164}; 164};
165 165
166static const struct ieee80211_regdomain *hwsim_world_regdom_custom[] = {
167 &hwsim_world_regdom_custom_01,
168 &hwsim_world_regdom_custom_02,
169};
170
166struct hwsim_vif_priv { 171struct hwsim_vif_priv {
167 u32 magic; 172 u32 magic;
168 u8 bssid[ETH_ALEN]; 173 u8 bssid[ETH_ALEN];
@@ -321,8 +326,52 @@ static const struct ieee80211_rate hwsim_rates[] = {
321 { .bitrate = 540 } 326 { .bitrate = 540 }
322}; 327};
323 328
329static const struct ieee80211_iface_limit hwsim_if_limits[] = {
330 { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
331 { .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) |
332 BIT(NL80211_IFTYPE_P2P_CLIENT) |
333#ifdef CONFIG_MAC80211_MESH
334 BIT(NL80211_IFTYPE_MESH_POINT) |
335#endif
336 BIT(NL80211_IFTYPE_AP) |
337 BIT(NL80211_IFTYPE_P2P_GO) },
338 { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_DEVICE) },
339};
340
341static const struct ieee80211_iface_limit hwsim_if_dfs_limits[] = {
342 { .max = 8, .types = BIT(NL80211_IFTYPE_AP) },
343};
344
345static const struct ieee80211_iface_combination hwsim_if_comb[] = {
346 {
347 .limits = hwsim_if_limits,
348 .n_limits = ARRAY_SIZE(hwsim_if_limits),
349 .max_interfaces = 2048,
350 .num_different_channels = 1,
351 },
352 {
353 .limits = hwsim_if_dfs_limits,
354 .n_limits = ARRAY_SIZE(hwsim_if_dfs_limits),
355 .max_interfaces = 8,
356 .num_different_channels = 1,
357 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
358 BIT(NL80211_CHAN_WIDTH_20) |
359 BIT(NL80211_CHAN_WIDTH_40) |
360 BIT(NL80211_CHAN_WIDTH_80) |
361 BIT(NL80211_CHAN_WIDTH_160),
362 }
363};
364
324static spinlock_t hwsim_radio_lock; 365static spinlock_t hwsim_radio_lock;
325static struct list_head hwsim_radios; 366static struct list_head hwsim_radios;
367static int hwsim_radio_idx;
368
369static struct platform_driver mac80211_hwsim_driver = {
370 .driver = {
371 .name = "mac80211_hwsim",
372 .owner = THIS_MODULE,
373 },
374};
326 375
327struct mac80211_hwsim_data { 376struct mac80211_hwsim_data {
328 struct list_head list; 377 struct list_head list;
@@ -332,8 +381,10 @@ struct mac80211_hwsim_data {
332 struct ieee80211_channel channels_2ghz[ARRAY_SIZE(hwsim_channels_2ghz)]; 381 struct ieee80211_channel channels_2ghz[ARRAY_SIZE(hwsim_channels_2ghz)];
333 struct ieee80211_channel channels_5ghz[ARRAY_SIZE(hwsim_channels_5ghz)]; 382 struct ieee80211_channel channels_5ghz[ARRAY_SIZE(hwsim_channels_5ghz)];
334 struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)]; 383 struct ieee80211_rate rates[ARRAY_SIZE(hwsim_rates)];
384 struct ieee80211_iface_combination if_combination;
335 385
336 struct mac_address addresses[2]; 386 struct mac_address addresses[2];
387 int channels, idx;
337 388
338 struct ieee80211_channel *tmp_chan; 389 struct ieee80211_channel *tmp_chan;
339 struct delayed_work roc_done; 390 struct delayed_work roc_done;
@@ -401,21 +452,179 @@ static struct genl_family hwsim_genl_family = {
401/* MAC80211_HWSIM netlink policy */ 452/* MAC80211_HWSIM netlink policy */
402 453
403static struct nla_policy hwsim_genl_policy[HWSIM_ATTR_MAX + 1] = { 454static struct nla_policy hwsim_genl_policy[HWSIM_ATTR_MAX + 1] = {
404 [HWSIM_ATTR_ADDR_RECEIVER] = { .type = NLA_UNSPEC, 455 [HWSIM_ATTR_ADDR_RECEIVER] = { .type = NLA_UNSPEC, .len = ETH_ALEN },
405 .len = 6*sizeof(u8) }, 456 [HWSIM_ATTR_ADDR_TRANSMITTER] = { .type = NLA_UNSPEC, .len = ETH_ALEN },
406 [HWSIM_ATTR_ADDR_TRANSMITTER] = { .type = NLA_UNSPEC,
407 .len = 6*sizeof(u8) },
408 [HWSIM_ATTR_FRAME] = { .type = NLA_BINARY, 457 [HWSIM_ATTR_FRAME] = { .type = NLA_BINARY,
409 .len = IEEE80211_MAX_DATA_LEN }, 458 .len = IEEE80211_MAX_DATA_LEN },
410 [HWSIM_ATTR_FLAGS] = { .type = NLA_U32 }, 459 [HWSIM_ATTR_FLAGS] = { .type = NLA_U32 },
411 [HWSIM_ATTR_RX_RATE] = { .type = NLA_U32 }, 460 [HWSIM_ATTR_RX_RATE] = { .type = NLA_U32 },
412 [HWSIM_ATTR_SIGNAL] = { .type = NLA_U32 }, 461 [HWSIM_ATTR_SIGNAL] = { .type = NLA_U32 },
413 [HWSIM_ATTR_TX_INFO] = { .type = NLA_UNSPEC, 462 [HWSIM_ATTR_TX_INFO] = { .type = NLA_UNSPEC,
414 .len = IEEE80211_TX_MAX_RATES*sizeof( 463 .len = IEEE80211_TX_MAX_RATES *
415 struct hwsim_tx_rate)}, 464 sizeof(struct hwsim_tx_rate)},
416 [HWSIM_ATTR_COOKIE] = { .type = NLA_U64 }, 465 [HWSIM_ATTR_COOKIE] = { .type = NLA_U64 },
466 [HWSIM_ATTR_CHANNELS] = { .type = NLA_U32 },
467 [HWSIM_ATTR_RADIO_ID] = { .type = NLA_U32 },
468 [HWSIM_ATTR_REG_HINT_ALPHA2] = { .type = NLA_STRING, .len = 2 },
469 [HWSIM_ATTR_REG_CUSTOM_REG] = { .type = NLA_U32 },
470 [HWSIM_ATTR_REG_STRICT_REG] = { .type = NLA_FLAG },
417}; 471};
418 472
473static void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
474 struct sk_buff *skb,
475 struct ieee80211_channel *chan);
476
477/* sysfs attributes */
478static void hwsim_send_ps_poll(void *dat, u8 *mac, struct ieee80211_vif *vif)
479{
480 struct mac80211_hwsim_data *data = dat;
481 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
482 struct sk_buff *skb;
483 struct ieee80211_pspoll *pspoll;
484
485 if (!vp->assoc)
486 return;
487
488 wiphy_debug(data->hw->wiphy,
489 "%s: send PS-Poll to %pM for aid %d\n",
490 __func__, vp->bssid, vp->aid);
491
492 skb = dev_alloc_skb(sizeof(*pspoll));
493 if (!skb)
494 return;
495 pspoll = (void *) skb_put(skb, sizeof(*pspoll));
496 pspoll->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL |
497 IEEE80211_STYPE_PSPOLL |
498 IEEE80211_FCTL_PM);
499 pspoll->aid = cpu_to_le16(0xc000 | vp->aid);
500 memcpy(pspoll->bssid, vp->bssid, ETH_ALEN);
501 memcpy(pspoll->ta, mac, ETH_ALEN);
502
503 rcu_read_lock();
504 mac80211_hwsim_tx_frame(data->hw, skb,
505 rcu_dereference(vif->chanctx_conf)->def.chan);
506 rcu_read_unlock();
507}
508
509static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac,
510 struct ieee80211_vif *vif, int ps)
511{
512 struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
513 struct sk_buff *skb;
514 struct ieee80211_hdr *hdr;
515
516 if (!vp->assoc)
517 return;
518
519 wiphy_debug(data->hw->wiphy,
520 "%s: send data::nullfunc to %pM ps=%d\n",
521 __func__, vp->bssid, ps);
522
523 skb = dev_alloc_skb(sizeof(*hdr));
524 if (!skb)
525 return;
526 hdr = (void *) skb_put(skb, sizeof(*hdr) - ETH_ALEN);
527 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
528 IEEE80211_STYPE_NULLFUNC |
529 (ps ? IEEE80211_FCTL_PM : 0));
530 hdr->duration_id = cpu_to_le16(0);
531 memcpy(hdr->addr1, vp->bssid, ETH_ALEN);
532 memcpy(hdr->addr2, mac, ETH_ALEN);
533 memcpy(hdr->addr3, vp->bssid, ETH_ALEN);
534
535 rcu_read_lock();
536 mac80211_hwsim_tx_frame(data->hw, skb,
537 rcu_dereference(vif->chanctx_conf)->def.chan);
538 rcu_read_unlock();
539}
540
541
542static void hwsim_send_nullfunc_ps(void *dat, u8 *mac,
543 struct ieee80211_vif *vif)
544{
545 struct mac80211_hwsim_data *data = dat;
546 hwsim_send_nullfunc(data, mac, vif, 1);
547}
548
549static void hwsim_send_nullfunc_no_ps(void *dat, u8 *mac,
550 struct ieee80211_vif *vif)
551{
552 struct mac80211_hwsim_data *data = dat;
553 hwsim_send_nullfunc(data, mac, vif, 0);
554}
555
556static int hwsim_fops_ps_read(void *dat, u64 *val)
557{
558 struct mac80211_hwsim_data *data = dat;
559 *val = data->ps;
560 return 0;
561}
562
563static int hwsim_fops_ps_write(void *dat, u64 val)
564{
565 struct mac80211_hwsim_data *data = dat;
566 enum ps_mode old_ps;
567
568 if (val != PS_DISABLED && val != PS_ENABLED && val != PS_AUTO_POLL &&
569 val != PS_MANUAL_POLL)
570 return -EINVAL;
571
572 old_ps = data->ps;
573 data->ps = val;
574
575 if (val == PS_MANUAL_POLL) {
576 ieee80211_iterate_active_interfaces(data->hw,
577 IEEE80211_IFACE_ITER_NORMAL,
578 hwsim_send_ps_poll, data);
579 data->ps_poll_pending = true;
580 } else if (old_ps == PS_DISABLED && val != PS_DISABLED) {
581 ieee80211_iterate_active_interfaces(data->hw,
582 IEEE80211_IFACE_ITER_NORMAL,
583 hwsim_send_nullfunc_ps,
584 data);
585 } else if (old_ps != PS_DISABLED && val == PS_DISABLED) {
586 ieee80211_iterate_active_interfaces(data->hw,
587 IEEE80211_IFACE_ITER_NORMAL,
588 hwsim_send_nullfunc_no_ps,
589 data);
590 }
591
592 return 0;
593}
594
595DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_ps, hwsim_fops_ps_read, hwsim_fops_ps_write,
596 "%llu\n");
597
598static int hwsim_write_simulate_radar(void *dat, u64 val)
599{
600 struct mac80211_hwsim_data *data = dat;
601
602 ieee80211_radar_detected(data->hw);
603
604 return 0;
605}
606
607DEFINE_SIMPLE_ATTRIBUTE(hwsim_simulate_radar, NULL,
608 hwsim_write_simulate_radar, "%llu\n");
609
610static int hwsim_fops_group_read(void *dat, u64 *val)
611{
612 struct mac80211_hwsim_data *data = dat;
613 *val = data->group;
614 return 0;
615}
616
617static int hwsim_fops_group_write(void *dat, u64 val)
618{
619 struct mac80211_hwsim_data *data = dat;
620 data->group = val;
621 return 0;
622}
623
624DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_group,
625 hwsim_fops_group_read, hwsim_fops_group_write,
626 "%llx\n");
627
419static netdev_tx_t hwsim_mon_xmit(struct sk_buff *skb, 628static netdev_tx_t hwsim_mon_xmit(struct sk_buff *skb,
420 struct net_device *dev) 629 struct net_device *dev)
421{ 630{
@@ -639,7 +848,7 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
639 } 848 }
640 849
641 if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER, 850 if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER,
642 sizeof(struct mac_address), data->addresses[1].addr)) 851 ETH_ALEN, data->addresses[1].addr))
643 goto nla_put_failure; 852 goto nla_put_failure;
644 853
645 /* We get the skb->data */ 854 /* We get the skb->data */
@@ -878,7 +1087,7 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
878 return; 1087 return;
879 } 1088 }
880 1089
881 if (channels == 1) { 1090 if (data->channels == 1) {
882 channel = data->channel; 1091 channel = data->channel;
883 } else if (txi->hw_queue == 4) { 1092 } else if (txi->hw_queue == 4) {
884 channel = data->tmp_chan; 1093 channel = data->tmp_chan;
@@ -906,7 +1115,7 @@ static void mac80211_hwsim_tx(struct ieee80211_hw *hw,
906 if (control->sta) 1115 if (control->sta)
907 hwsim_check_sta_magic(control->sta); 1116 hwsim_check_sta_magic(control->sta);
908 1117
909 if (rctbl) 1118 if (hw->flags & IEEE80211_HW_SUPPORTS_RC_TABLE)
910 ieee80211_get_tx_rates(txi->control.vif, control->sta, skb, 1119 ieee80211_get_tx_rates(txi->control.vif, control->sta, skb,
911 txi->control.rates, 1120 txi->control.rates,
912 ARRAY_SIZE(txi->control.rates)); 1121 ARRAY_SIZE(txi->control.rates));
@@ -1013,7 +1222,7 @@ static void mac80211_hwsim_tx_frame(struct ieee80211_hw *hw,
1013{ 1222{
1014 u32 _pid = ACCESS_ONCE(wmediumd_portid); 1223 u32 _pid = ACCESS_ONCE(wmediumd_portid);
1015 1224
1016 if (rctbl) { 1225 if (hw->flags & IEEE80211_HW_SUPPORTS_RC_TABLE) {
1017 struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb); 1226 struct ieee80211_tx_info *txi = IEEE80211_SKB_CB(skb);
1018 ieee80211_get_tx_rates(txi->control.vif, NULL, skb, 1227 ieee80211_get_tx_rates(txi->control.vif, NULL, skb,
1019 txi->control.rates, 1228 txi->control.rates,
@@ -1050,7 +1259,7 @@ static void mac80211_hwsim_beacon_tx(void *arg, u8 *mac,
1050 if (skb == NULL) 1259 if (skb == NULL)
1051 return; 1260 return;
1052 info = IEEE80211_SKB_CB(skb); 1261 info = IEEE80211_SKB_CB(skb);
1053 if (rctbl) 1262 if (hw->flags & IEEE80211_HW_SUPPORTS_RC_TABLE)
1054 ieee80211_get_tx_rates(vif, NULL, skb, 1263 ieee80211_get_tx_rates(vif, NULL, skb,
1055 info->control.rates, 1264 info->control.rates,
1056 ARRAY_SIZE(info->control.rates)); 1265 ARRAY_SIZE(info->control.rates));
@@ -1141,7 +1350,7 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
1141 1350
1142 data->channel = conf->chandef.chan; 1351 data->channel = conf->chandef.chan;
1143 1352
1144 WARN_ON(data->channel && channels > 1); 1353 WARN_ON(data->channel && data->channels > 1);
1145 1354
1146 data->power_level = conf->power_level; 1355 data->power_level = conf->power_level;
1147 if (!data->started || !data->beacon_int) 1356 if (!data->started || !data->beacon_int)
@@ -1388,8 +1597,6 @@ static const struct nla_policy hwsim_testmode_policy[HWSIM_TM_ATTR_MAX + 1] = {
1388 [HWSIM_TM_ATTR_PS] = { .type = NLA_U32 }, 1597 [HWSIM_TM_ATTR_PS] = { .type = NLA_U32 },
1389}; 1598};
1390 1599
1391static int hwsim_fops_ps_write(void *dat, u64 val);
1392
1393static int mac80211_hwsim_testmode_cmd(struct ieee80211_hw *hw, 1600static int mac80211_hwsim_testmode_cmd(struct ieee80211_hw *hw,
1394 struct ieee80211_vif *vif, 1601 struct ieee80211_vif *vif,
1395 void *data, int len) 1602 void *data, int len)
@@ -1700,8 +1907,7 @@ static void mac80211_hwsim_unassign_vif_chanctx(struct ieee80211_hw *hw,
1700 hwsim_check_chanctx_magic(ctx); 1907 hwsim_check_chanctx_magic(ctx);
1701} 1908}
1702 1909
1703static struct ieee80211_ops mac80211_hwsim_ops = 1910static const struct ieee80211_ops mac80211_hwsim_ops = {
1704{
1705 .tx = mac80211_hwsim_tx, 1911 .tx = mac80211_hwsim_tx,
1706 .start = mac80211_hwsim_start, 1912 .start = mac80211_hwsim_start,
1707 .stop = mac80211_hwsim_stop, 1913 .stop = mac80211_hwsim_stop,
@@ -1726,217 +1932,290 @@ static struct ieee80211_ops mac80211_hwsim_ops =
1726 .set_tsf = mac80211_hwsim_set_tsf, 1932 .set_tsf = mac80211_hwsim_set_tsf,
1727}; 1933};
1728 1934
1935static struct ieee80211_ops mac80211_hwsim_mchan_ops;
1729 1936
1730static void mac80211_hwsim_free(void) 1937static int mac80211_hwsim_create_radio(int channels, const char *reg_alpha2,
1938 const struct ieee80211_regdomain *regd,
1939 bool reg_strict)
1731{ 1940{
1732 struct list_head tmplist, *i, *tmp; 1941 int err;
1733 struct mac80211_hwsim_data *data, *tmpdata; 1942 u8 addr[ETH_ALEN];
1734 1943 struct mac80211_hwsim_data *data;
1735 INIT_LIST_HEAD(&tmplist); 1944 struct ieee80211_hw *hw;
1945 enum ieee80211_band band;
1946 const struct ieee80211_ops *ops = &mac80211_hwsim_ops;
1947 int idx;
1736 1948
1737 spin_lock_bh(&hwsim_radio_lock); 1949 spin_lock_bh(&hwsim_radio_lock);
1738 list_for_each_safe(i, tmp, &hwsim_radios) 1950 idx = hwsim_radio_idx++;
1739 list_move(i, &tmplist);
1740 spin_unlock_bh(&hwsim_radio_lock); 1951 spin_unlock_bh(&hwsim_radio_lock);
1741 1952
1742 list_for_each_entry_safe(data, tmpdata, &tmplist, list) { 1953 if (channels > 1)
1743 debugfs_remove_recursive(data->debugfs); 1954 ops = &mac80211_hwsim_mchan_ops;
1744 ieee80211_unregister_hw(data->hw); 1955 hw = ieee80211_alloc_hw(sizeof(*data), ops);
1745 device_release_driver(data->dev); 1956 if (!hw) {
1746 device_unregister(data->dev); 1957 printk(KERN_DEBUG "mac80211_hwsim: ieee80211_alloc_hw failed\n");
1747 ieee80211_free_hw(data->hw); 1958 err = -ENOMEM;
1959 goto failed;
1960 }
1961 data = hw->priv;
1962 data->hw = hw;
1963
1964 data->dev = device_create(hwsim_class, NULL, 0, hw, "hwsim%d", idx);
1965 if (IS_ERR(data->dev)) {
1966 printk(KERN_DEBUG
1967 "mac80211_hwsim: device_create failed (%ld)\n",
1968 PTR_ERR(data->dev));
1969 err = -ENOMEM;
1970 goto failed_drvdata;
1971 }
1972 data->dev->driver = &mac80211_hwsim_driver.driver;
1973 err = device_bind_driver(data->dev);
1974 if (err != 0) {
1975 printk(KERN_DEBUG "mac80211_hwsim: device_bind_driver failed (%d)\n",
1976 err);
1977 goto failed_hw;
1748 } 1978 }
1749 class_destroy(hwsim_class);
1750}
1751
1752static struct platform_driver mac80211_hwsim_driver = {
1753 .driver = {
1754 .name = "mac80211_hwsim",
1755 .owner = THIS_MODULE,
1756 },
1757};
1758
1759static const struct net_device_ops hwsim_netdev_ops = {
1760 .ndo_start_xmit = hwsim_mon_xmit,
1761 .ndo_change_mtu = eth_change_mtu,
1762 .ndo_set_mac_address = eth_mac_addr,
1763 .ndo_validate_addr = eth_validate_addr,
1764};
1765
1766static void hwsim_mon_setup(struct net_device *dev)
1767{
1768 dev->netdev_ops = &hwsim_netdev_ops;
1769 dev->destructor = free_netdev;
1770 ether_setup(dev);
1771 dev->tx_queue_len = 0;
1772 dev->type = ARPHRD_IEEE80211_RADIOTAP;
1773 memset(dev->dev_addr, 0, ETH_ALEN);
1774 dev->dev_addr[0] = 0x12;
1775}
1776 1979
1980 skb_queue_head_init(&data->pending);
1777 1981
1778static void hwsim_send_ps_poll(void *dat, u8 *mac, struct ieee80211_vif *vif) 1982 SET_IEEE80211_DEV(hw, data->dev);
1779{ 1983 memset(addr, 0, ETH_ALEN);
1780 struct mac80211_hwsim_data *data = dat; 1984 addr[0] = 0x02;
1781 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; 1985 addr[3] = idx >> 8;
1782 struct sk_buff *skb; 1986 addr[4] = idx;
1783 struct ieee80211_pspoll *pspoll; 1987 memcpy(data->addresses[0].addr, addr, ETH_ALEN);
1988 memcpy(data->addresses[1].addr, addr, ETH_ALEN);
1989 data->addresses[1].addr[0] |= 0x40;
1990 hw->wiphy->n_addresses = 2;
1991 hw->wiphy->addresses = data->addresses;
1992
1993 data->channels = channels;
1994 data->idx = idx;
1995
1996 if (data->channels > 1) {
1997 hw->wiphy->max_scan_ssids = 255;
1998 hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
1999 hw->wiphy->max_remain_on_channel_duration = 1000;
2000 /* For channels > 1 DFS is not allowed */
2001 hw->wiphy->n_iface_combinations = 1;
2002 hw->wiphy->iface_combinations = &data->if_combination;
2003 data->if_combination = hwsim_if_comb[0];
2004 data->if_combination.num_different_channels = data->channels;
2005 } else {
2006 hw->wiphy->iface_combinations = hwsim_if_comb;
2007 hw->wiphy->n_iface_combinations = ARRAY_SIZE(hwsim_if_comb);
2008 }
1784 2009
1785 if (!vp->assoc) 2010 INIT_DELAYED_WORK(&data->roc_done, hw_roc_done);
1786 return; 2011 INIT_DELAYED_WORK(&data->hw_scan, hw_scan_work);
2012
2013 hw->queues = 5;
2014 hw->offchannel_tx_hw_queue = 4;
2015 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
2016 BIT(NL80211_IFTYPE_AP) |
2017 BIT(NL80211_IFTYPE_P2P_CLIENT) |
2018 BIT(NL80211_IFTYPE_P2P_GO) |
2019 BIT(NL80211_IFTYPE_ADHOC) |
2020 BIT(NL80211_IFTYPE_MESH_POINT) |
2021 BIT(NL80211_IFTYPE_P2P_DEVICE);
2022
2023 hw->flags = IEEE80211_HW_MFP_CAPABLE |
2024 IEEE80211_HW_SIGNAL_DBM |
2025 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
2026 IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
2027 IEEE80211_HW_AMPDU_AGGREGATION |
2028 IEEE80211_HW_WANT_MONITOR_VIF |
2029 IEEE80211_HW_QUEUE_CONTROL |
2030 IEEE80211_HW_SUPPORTS_HT_CCK_RATES;
2031 if (rctbl)
2032 hw->flags |= IEEE80211_HW_SUPPORTS_RC_TABLE;
2033
2034 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS |
2035 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
2036 WIPHY_FLAG_AP_UAPSD;
2037 hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
2038
2039 /* ask mac80211 to reserve space for magic */
2040 hw->vif_data_size = sizeof(struct hwsim_vif_priv);
2041 hw->sta_data_size = sizeof(struct hwsim_sta_priv);
2042 hw->chanctx_data_size = sizeof(struct hwsim_chanctx_priv);
2043
2044 memcpy(data->channels_2ghz, hwsim_channels_2ghz,
2045 sizeof(hwsim_channels_2ghz));
2046 memcpy(data->channels_5ghz, hwsim_channels_5ghz,
2047 sizeof(hwsim_channels_5ghz));
2048 memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates));
2049
2050 for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) {
2051 struct ieee80211_supported_band *sband = &data->bands[band];
2052 switch (band) {
2053 case IEEE80211_BAND_2GHZ:
2054 sband->channels = data->channels_2ghz;
2055 sband->n_channels = ARRAY_SIZE(hwsim_channels_2ghz);
2056 sband->bitrates = data->rates;
2057 sband->n_bitrates = ARRAY_SIZE(hwsim_rates);
2058 break;
2059 case IEEE80211_BAND_5GHZ:
2060 sband->channels = data->channels_5ghz;
2061 sband->n_channels = ARRAY_SIZE(hwsim_channels_5ghz);
2062 sband->bitrates = data->rates + 4;
2063 sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4;
2064 break;
2065 default:
2066 continue;
2067 }
1787 2068
1788 wiphy_debug(data->hw->wiphy, 2069 sband->ht_cap.ht_supported = true;
1789 "%s: send PS-Poll to %pM for aid %d\n", 2070 sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
1790 __func__, vp->bssid, vp->aid); 2071 IEEE80211_HT_CAP_GRN_FLD |
2072 IEEE80211_HT_CAP_SGI_40 |
2073 IEEE80211_HT_CAP_DSSSCCK40;
2074 sband->ht_cap.ampdu_factor = 0x3;
2075 sband->ht_cap.ampdu_density = 0x6;
2076 memset(&sband->ht_cap.mcs, 0,
2077 sizeof(sband->ht_cap.mcs));
2078 sband->ht_cap.mcs.rx_mask[0] = 0xff;
2079 sband->ht_cap.mcs.rx_mask[1] = 0xff;
2080 sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
2081
2082 hw->wiphy->bands[band] = sband;
2083
2084 sband->vht_cap.vht_supported = true;
2085 sband->vht_cap.cap =
2086 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
2087 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ |
2088 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
2089 IEEE80211_VHT_CAP_RXLDPC |
2090 IEEE80211_VHT_CAP_SHORT_GI_80 |
2091 IEEE80211_VHT_CAP_SHORT_GI_160 |
2092 IEEE80211_VHT_CAP_TXSTBC |
2093 IEEE80211_VHT_CAP_RXSTBC_1 |
2094 IEEE80211_VHT_CAP_RXSTBC_2 |
2095 IEEE80211_VHT_CAP_RXSTBC_3 |
2096 IEEE80211_VHT_CAP_RXSTBC_4 |
2097 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
2098 sband->vht_cap.vht_mcs.rx_mcs_map =
2099 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_8 << 0 |
2100 IEEE80211_VHT_MCS_SUPPORT_0_8 << 2 |
2101 IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
2102 IEEE80211_VHT_MCS_SUPPORT_0_8 << 6 |
2103 IEEE80211_VHT_MCS_SUPPORT_0_8 << 8 |
2104 IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 |
2105 IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 |
2106 IEEE80211_VHT_MCS_SUPPORT_0_8 << 14);
2107 sband->vht_cap.vht_mcs.tx_mcs_map =
2108 sband->vht_cap.vht_mcs.rx_mcs_map;
2109 }
1791 2110
1792 skb = dev_alloc_skb(sizeof(*pspoll)); 2111 /* By default all radios belong to the first group */
1793 if (!skb) 2112 data->group = 1;
1794 return; 2113 mutex_init(&data->mutex);
1795 pspoll = (void *) skb_put(skb, sizeof(*pspoll));
1796 pspoll->frame_control = cpu_to_le16(IEEE80211_FTYPE_CTL |
1797 IEEE80211_STYPE_PSPOLL |
1798 IEEE80211_FCTL_PM);
1799 pspoll->aid = cpu_to_le16(0xc000 | vp->aid);
1800 memcpy(pspoll->bssid, vp->bssid, ETH_ALEN);
1801 memcpy(pspoll->ta, mac, ETH_ALEN);
1802 2114
1803 rcu_read_lock(); 2115 /* Enable frame retransmissions for lossy channels */
1804 mac80211_hwsim_tx_frame(data->hw, skb, 2116 hw->max_rates = 4;
1805 rcu_dereference(vif->chanctx_conf)->def.chan); 2117 hw->max_rate_tries = 11;
1806 rcu_read_unlock();
1807}
1808 2118
1809static void hwsim_send_nullfunc(struct mac80211_hwsim_data *data, u8 *mac, 2119 if (reg_strict)
1810 struct ieee80211_vif *vif, int ps) 2120 hw->wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
1811{ 2121 if (regd) {
1812 struct hwsim_vif_priv *vp = (void *)vif->drv_priv; 2122 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
1813 struct sk_buff *skb; 2123 wiphy_apply_custom_regulatory(hw->wiphy, regd);
1814 struct ieee80211_hdr *hdr; 2124 /* give the regulatory workqueue a chance to run */
2125 schedule_timeout_interruptible(1);
2126 }
1815 2127
1816 if (!vp->assoc) 2128 err = ieee80211_register_hw(hw);
1817 return; 2129 if (err < 0) {
2130 printk(KERN_DEBUG "mac80211_hwsim: ieee80211_register_hw failed (%d)\n",
2131 err);
2132 goto failed_hw;
2133 }
1818 2134
1819 wiphy_debug(data->hw->wiphy, 2135 wiphy_debug(hw->wiphy, "hwaddr %pM registered\n", hw->wiphy->perm_addr);
1820 "%s: send data::nullfunc to %pM ps=%d\n",
1821 __func__, vp->bssid, ps);
1822 2136
1823 skb = dev_alloc_skb(sizeof(*hdr)); 2137 if (reg_alpha2)
1824 if (!skb) 2138 regulatory_hint(hw->wiphy, reg_alpha2);
1825 return;
1826 hdr = (void *) skb_put(skb, sizeof(*hdr) - ETH_ALEN);
1827 hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
1828 IEEE80211_STYPE_NULLFUNC |
1829 (ps ? IEEE80211_FCTL_PM : 0));
1830 hdr->duration_id = cpu_to_le16(0);
1831 memcpy(hdr->addr1, vp->bssid, ETH_ALEN);
1832 memcpy(hdr->addr2, mac, ETH_ALEN);
1833 memcpy(hdr->addr3, vp->bssid, ETH_ALEN);
1834 2139
1835 rcu_read_lock(); 2140 data->debugfs = debugfs_create_dir("hwsim", hw->wiphy->debugfsdir);
1836 mac80211_hwsim_tx_frame(data->hw, skb, 2141 debugfs_create_file("ps", 0666, data->debugfs, data, &hwsim_fops_ps);
1837 rcu_dereference(vif->chanctx_conf)->def.chan); 2142 debugfs_create_file("group", 0666, data->debugfs, data,
1838 rcu_read_unlock(); 2143 &hwsim_fops_group);
1839} 2144 if (data->channels == 1)
2145 debugfs_create_file("dfs_simulate_radar", 0222,
2146 data->debugfs,
2147 data, &hwsim_simulate_radar);
1840 2148
2149 tasklet_hrtimer_init(&data->beacon_timer,
2150 mac80211_hwsim_beacon,
2151 CLOCK_MONOTONIC_RAW, HRTIMER_MODE_ABS);
1841 2152
1842static void hwsim_send_nullfunc_ps(void *dat, u8 *mac, 2153 spin_lock_bh(&hwsim_radio_lock);
1843 struct ieee80211_vif *vif) 2154 list_add_tail(&data->list, &hwsim_radios);
1844{ 2155 spin_unlock_bh(&hwsim_radio_lock);
1845 struct mac80211_hwsim_data *data = dat;
1846 hwsim_send_nullfunc(data, mac, vif, 1);
1847}
1848 2156
2157 return idx;
1849 2158
1850static void hwsim_send_nullfunc_no_ps(void *dat, u8 *mac, 2159failed_hw:
1851 struct ieee80211_vif *vif) 2160 device_unregister(data->dev);
1852{ 2161failed_drvdata:
1853 struct mac80211_hwsim_data *data = dat; 2162 ieee80211_free_hw(hw);
1854 hwsim_send_nullfunc(data, mac, vif, 0); 2163failed:
2164 return err;
1855} 2165}
1856 2166
1857 2167static void mac80211_hwsim_destroy_radio(struct mac80211_hwsim_data *data)
1858static int hwsim_fops_ps_read(void *dat, u64 *val)
1859{ 2168{
1860 struct mac80211_hwsim_data *data = dat; 2169 debugfs_remove_recursive(data->debugfs);
1861 *val = data->ps; 2170 ieee80211_unregister_hw(data->hw);
1862 return 0; 2171 device_release_driver(data->dev);
2172 device_unregister(data->dev);
2173 ieee80211_free_hw(data->hw);
1863} 2174}
1864 2175
1865static int hwsim_fops_ps_write(void *dat, u64 val) 2176static void mac80211_hwsim_free(void)
1866{ 2177{
1867 struct mac80211_hwsim_data *data = dat; 2178 struct mac80211_hwsim_data *data;
1868 enum ps_mode old_ps;
1869
1870 if (val != PS_DISABLED && val != PS_ENABLED && val != PS_AUTO_POLL &&
1871 val != PS_MANUAL_POLL)
1872 return -EINVAL;
1873
1874 old_ps = data->ps;
1875 data->ps = val;
1876 2179
1877 if (val == PS_MANUAL_POLL) { 2180 spin_lock_bh(&hwsim_radio_lock);
1878 ieee80211_iterate_active_interfaces(data->hw, 2181 while ((data = list_first_entry_or_null(&hwsim_radios,
1879 IEEE80211_IFACE_ITER_NORMAL, 2182 struct mac80211_hwsim_data,
1880 hwsim_send_ps_poll, data); 2183 list))) {
1881 data->ps_poll_pending = true; 2184 list_del(&data->list);
1882 } else if (old_ps == PS_DISABLED && val != PS_DISABLED) { 2185 spin_unlock_bh(&hwsim_radio_lock);
1883 ieee80211_iterate_active_interfaces(data->hw, 2186 mac80211_hwsim_destroy_radio(data);
1884 IEEE80211_IFACE_ITER_NORMAL, 2187 spin_lock_bh(&hwsim_radio_lock);
1885 hwsim_send_nullfunc_ps,
1886 data);
1887 } else if (old_ps != PS_DISABLED && val == PS_DISABLED) {
1888 ieee80211_iterate_active_interfaces(data->hw,
1889 IEEE80211_IFACE_ITER_NORMAL,
1890 hwsim_send_nullfunc_no_ps,
1891 data);
1892 } 2188 }
1893 2189 spin_unlock_bh(&hwsim_radio_lock);
1894 return 0; 2190 class_destroy(hwsim_class);
1895}
1896
1897DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_ps, hwsim_fops_ps_read, hwsim_fops_ps_write,
1898 "%llu\n");
1899
1900static int hwsim_write_simulate_radar(void *dat, u64 val)
1901{
1902 struct mac80211_hwsim_data *data = dat;
1903
1904 ieee80211_radar_detected(data->hw);
1905
1906 return 0;
1907} 2191}
1908 2192
1909DEFINE_SIMPLE_ATTRIBUTE(hwsim_simulate_radar, NULL, 2193static const struct net_device_ops hwsim_netdev_ops = {
1910 hwsim_write_simulate_radar, "%llu\n"); 2194 .ndo_start_xmit = hwsim_mon_xmit,
1911 2195 .ndo_change_mtu = eth_change_mtu,
1912static int hwsim_fops_group_read(void *dat, u64 *val) 2196 .ndo_set_mac_address = eth_mac_addr,
1913{ 2197 .ndo_validate_addr = eth_validate_addr,
1914 struct mac80211_hwsim_data *data = dat; 2198};
1915 *val = data->group;
1916 return 0;
1917}
1918 2199
1919static int hwsim_fops_group_write(void *dat, u64 val) 2200static void hwsim_mon_setup(struct net_device *dev)
1920{ 2201{
1921 struct mac80211_hwsim_data *data = dat; 2202 dev->netdev_ops = &hwsim_netdev_ops;
1922 data->group = val; 2203 dev->destructor = free_netdev;
1923 return 0; 2204 ether_setup(dev);
2205 dev->tx_queue_len = 0;
2206 dev->type = ARPHRD_IEEE80211_RADIOTAP;
2207 memset(dev->dev_addr, 0, ETH_ALEN);
2208 dev->dev_addr[0] = 0x12;
1924} 2209}
1925 2210
1926DEFINE_SIMPLE_ATTRIBUTE(hwsim_fops_group, 2211static struct mac80211_hwsim_data *get_hwsim_data_ref_from_addr(const u8 *addr)
1927 hwsim_fops_group_read, hwsim_fops_group_write,
1928 "%llx\n");
1929
1930static struct mac80211_hwsim_data *get_hwsim_data_ref_from_addr(
1931 struct mac_address *addr)
1932{ 2212{
1933 struct mac80211_hwsim_data *data; 2213 struct mac80211_hwsim_data *data;
1934 bool _found = false; 2214 bool _found = false;
1935 2215
1936 spin_lock_bh(&hwsim_radio_lock); 2216 spin_lock_bh(&hwsim_radio_lock);
1937 list_for_each_entry(data, &hwsim_radios, list) { 2217 list_for_each_entry(data, &hwsim_radios, list) {
1938 if (memcmp(data->addresses[1].addr, addr, 2218 if (memcmp(data->addresses[1].addr, addr, ETH_ALEN) == 0) {
1939 sizeof(struct mac_address)) == 0) {
1940 _found = true; 2219 _found = true;
1941 break; 2220 break;
1942 } 2221 }
@@ -1959,27 +2238,26 @@ static int hwsim_tx_info_frame_received_nl(struct sk_buff *skb_2,
1959 struct hwsim_tx_rate *tx_attempts; 2238 struct hwsim_tx_rate *tx_attempts;
1960 unsigned long ret_skb_ptr; 2239 unsigned long ret_skb_ptr;
1961 struct sk_buff *skb, *tmp; 2240 struct sk_buff *skb, *tmp;
1962 struct mac_address *src; 2241 const u8 *src;
1963 unsigned int hwsim_flags; 2242 unsigned int hwsim_flags;
1964
1965 int i; 2243 int i;
1966 bool found = false; 2244 bool found = false;
1967 2245
2246 if (info->snd_portid != wmediumd_portid)
2247 return -EINVAL;
2248
1968 if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER] || 2249 if (!info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER] ||
1969 !info->attrs[HWSIM_ATTR_FLAGS] || 2250 !info->attrs[HWSIM_ATTR_FLAGS] ||
1970 !info->attrs[HWSIM_ATTR_COOKIE] || 2251 !info->attrs[HWSIM_ATTR_COOKIE] ||
1971 !info->attrs[HWSIM_ATTR_TX_INFO]) 2252 !info->attrs[HWSIM_ATTR_TX_INFO])
1972 goto out; 2253 goto out;
1973 2254
1974 src = (struct mac_address *)nla_data( 2255 src = (void *)nla_data(info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER]);
1975 info->attrs[HWSIM_ATTR_ADDR_TRANSMITTER]);
1976 hwsim_flags = nla_get_u32(info->attrs[HWSIM_ATTR_FLAGS]); 2256 hwsim_flags = nla_get_u32(info->attrs[HWSIM_ATTR_FLAGS]);
1977
1978 ret_skb_ptr = nla_get_u64(info->attrs[HWSIM_ATTR_COOKIE]); 2257 ret_skb_ptr = nla_get_u64(info->attrs[HWSIM_ATTR_COOKIE]);
1979 2258
1980 data2 = get_hwsim_data_ref_from_addr(src); 2259 data2 = get_hwsim_data_ref_from_addr(src);
1981 2260 if (!data2)
1982 if (data2 == NULL)
1983 goto out; 2261 goto out;
1984 2262
1985 /* look for the skb matching the cookie passed back from user */ 2263 /* look for the skb matching the cookie passed back from user */
@@ -2036,38 +2314,37 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
2036 2314
2037 struct mac80211_hwsim_data *data2; 2315 struct mac80211_hwsim_data *data2;
2038 struct ieee80211_rx_status rx_status; 2316 struct ieee80211_rx_status rx_status;
2039 struct mac_address *dst; 2317 const u8 *dst;
2040 int frame_data_len; 2318 int frame_data_len;
2041 char *frame_data; 2319 void *frame_data;
2042 struct sk_buff *skb = NULL; 2320 struct sk_buff *skb = NULL;
2043 2321
2322 if (info->snd_portid != wmediumd_portid)
2323 return -EINVAL;
2324
2044 if (!info->attrs[HWSIM_ATTR_ADDR_RECEIVER] || 2325 if (!info->attrs[HWSIM_ATTR_ADDR_RECEIVER] ||
2045 !info->attrs[HWSIM_ATTR_FRAME] || 2326 !info->attrs[HWSIM_ATTR_FRAME] ||
2046 !info->attrs[HWSIM_ATTR_RX_RATE] || 2327 !info->attrs[HWSIM_ATTR_RX_RATE] ||
2047 !info->attrs[HWSIM_ATTR_SIGNAL]) 2328 !info->attrs[HWSIM_ATTR_SIGNAL])
2048 goto out; 2329 goto out;
2049 2330
2050 dst = (struct mac_address *)nla_data( 2331 dst = (void *)nla_data(info->attrs[HWSIM_ATTR_ADDR_RECEIVER]);
2051 info->attrs[HWSIM_ATTR_ADDR_RECEIVER]);
2052
2053 frame_data_len = nla_len(info->attrs[HWSIM_ATTR_FRAME]); 2332 frame_data_len = nla_len(info->attrs[HWSIM_ATTR_FRAME]);
2054 frame_data = (char *)nla_data(info->attrs[HWSIM_ATTR_FRAME]); 2333 frame_data = (void *)nla_data(info->attrs[HWSIM_ATTR_FRAME]);
2055 2334
2056 /* Allocate new skb here */ 2335 /* Allocate new skb here */
2057 skb = alloc_skb(frame_data_len, GFP_KERNEL); 2336 skb = alloc_skb(frame_data_len, GFP_KERNEL);
2058 if (skb == NULL) 2337 if (skb == NULL)
2059 goto err; 2338 goto err;
2060 2339
2061 if (frame_data_len <= IEEE80211_MAX_DATA_LEN) { 2340 if (frame_data_len > IEEE80211_MAX_DATA_LEN)
2062 /* Copy the data */
2063 memcpy(skb_put(skb, frame_data_len), frame_data,
2064 frame_data_len);
2065 } else
2066 goto err; 2341 goto err;
2067 2342
2068 data2 = get_hwsim_data_ref_from_addr(dst); 2343 /* Copy the data */
2344 memcpy(skb_put(skb, frame_data_len), frame_data, frame_data_len);
2069 2345
2070 if (data2 == NULL) 2346 data2 = get_hwsim_data_ref_from_addr(dst);
2347 if (!data2)
2071 goto out; 2348 goto out;
2072 2349
2073 /* check if radio is configured properly */ 2350 /* check if radio is configured properly */
@@ -2075,7 +2352,7 @@ static int hwsim_cloned_frame_received_nl(struct sk_buff *skb_2,
2075 if (data2->idle || !data2->started) 2352 if (data2->idle || !data2->started)
2076 goto out; 2353 goto out;
2077 2354
2078 /*A frame is received from user space*/ 2355 /* A frame is received from user space */
2079 memset(&rx_status, 0, sizeof(rx_status)); 2356 memset(&rx_status, 0, sizeof(rx_status));
2080 rx_status.freq = data2->channel->center_freq; 2357 rx_status.freq = data2->channel->center_freq;
2081 rx_status.band = data2->channel->band; 2358 rx_status.band = data2->channel->band;
@@ -2097,8 +2374,24 @@ out:
2097static int hwsim_register_received_nl(struct sk_buff *skb_2, 2374static int hwsim_register_received_nl(struct sk_buff *skb_2,
2098 struct genl_info *info) 2375 struct genl_info *info)
2099{ 2376{
2100 if (info == NULL) 2377 struct mac80211_hwsim_data *data;
2101 goto out; 2378 int chans = 1;
2379
2380 spin_lock_bh(&hwsim_radio_lock);
2381 list_for_each_entry(data, &hwsim_radios, list)
2382 chans = max(chans, data->channels);
2383 spin_unlock_bh(&hwsim_radio_lock);
2384
2385 /* In the future we should revise the userspace API and allow it
2386 * to set a flag that it does support multi-channel, then we can
2387 * let this pass conditionally on the flag.
2388 * For current userspace, prohibit it since it won't work right.
2389 */
2390 if (chans > 1)
2391 return -EOPNOTSUPP;
2392
2393 if (wmediumd_portid)
2394 return -EBUSY;
2102 2395
2103 wmediumd_portid = info->snd_portid; 2396 wmediumd_portid = info->snd_portid;
2104 2397
@@ -2106,9 +2399,53 @@ static int hwsim_register_received_nl(struct sk_buff *skb_2,
2106 "switching to wmediumd mode with pid %d\n", info->snd_portid); 2399 "switching to wmediumd mode with pid %d\n", info->snd_portid);
2107 2400
2108 return 0; 2401 return 0;
2109out: 2402}
2110 printk(KERN_DEBUG "mac80211_hwsim: error occurred in %s\n", __func__); 2403
2111 return -EINVAL; 2404static int hwsim_create_radio_nl(struct sk_buff *msg, struct genl_info *info)
2405{
2406 unsigned int chans = channels;
2407 const char *alpha2 = NULL;
2408 const struct ieee80211_regdomain *regd = NULL;
2409 bool reg_strict = info->attrs[HWSIM_ATTR_REG_STRICT_REG];
2410
2411 if (info->attrs[HWSIM_ATTR_CHANNELS])
2412 chans = nla_get_u32(info->attrs[HWSIM_ATTR_CHANNELS]);
2413
2414 if (info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2])
2415 alpha2 = nla_data(info->attrs[HWSIM_ATTR_REG_HINT_ALPHA2]);
2416
2417 if (info->attrs[HWSIM_ATTR_REG_CUSTOM_REG]) {
2418 u32 idx = nla_get_u32(info->attrs[HWSIM_ATTR_REG_CUSTOM_REG]);
2419
2420 if (idx >= ARRAY_SIZE(hwsim_world_regdom_custom))
2421 return -EINVAL;
2422 regd = hwsim_world_regdom_custom[idx];
2423 }
2424
2425 return mac80211_hwsim_create_radio(chans, alpha2, regd, reg_strict);
2426}
2427
2428static int hwsim_destroy_radio_nl(struct sk_buff *msg, struct genl_info *info)
2429{
2430 struct mac80211_hwsim_data *data;
2431 int idx;
2432
2433 if (!info->attrs[HWSIM_ATTR_RADIO_ID])
2434 return -EINVAL;
2435 idx = nla_get_u32(info->attrs[HWSIM_ATTR_RADIO_ID]);
2436
2437 spin_lock_bh(&hwsim_radio_lock);
2438 list_for_each_entry(data, &hwsim_radios, list) {
2439 if (data->idx != idx)
2440 continue;
2441 list_del(&data->list);
2442 spin_unlock_bh(&hwsim_radio_lock);
2443 mac80211_hwsim_destroy_radio(data);
2444 return 0;
2445 }
2446 spin_unlock_bh(&hwsim_radio_lock);
2447
2448 return -ENODEV;
2112} 2449}
2113 2450
2114/* Generic Netlink operations array */ 2451/* Generic Netlink operations array */
@@ -2129,6 +2466,18 @@ static const struct genl_ops hwsim_ops[] = {
2129 .policy = hwsim_genl_policy, 2466 .policy = hwsim_genl_policy,
2130 .doit = hwsim_tx_info_frame_received_nl, 2467 .doit = hwsim_tx_info_frame_received_nl,
2131 }, 2468 },
2469 {
2470 .cmd = HWSIM_CMD_CREATE_RADIO,
2471 .policy = hwsim_genl_policy,
2472 .doit = hwsim_create_radio_nl,
2473 .flags = GENL_ADMIN_PERM,
2474 },
2475 {
2476 .cmd = HWSIM_CMD_DESTROY_RADIO,
2477 .policy = hwsim_genl_policy,
2478 .doit = hwsim_destroy_radio_nl,
2479 .flags = GENL_ADMIN_PERM,
2480 },
2132}; 2481};
2133 2482
2134static int mac80211_hwsim_netlink_notify(struct notifier_block *nb, 2483static int mac80211_hwsim_netlink_notify(struct notifier_block *nb,
@@ -2157,10 +2506,6 @@ static int hwsim_init_netlink(void)
2157{ 2506{
2158 int rc; 2507 int rc;
2159 2508
2160 /* userspace test API hasn't been adjusted for multi-channel */
2161 if (channels > 1)
2162 return 0;
2163
2164 printk(KERN_INFO "mac80211_hwsim: initializing netlink\n"); 2509 printk(KERN_INFO "mac80211_hwsim: initializing netlink\n");
2165 2510
2166 rc = genl_register_family_with_ops(&hwsim_genl_family, hwsim_ops); 2511 rc = genl_register_family_with_ops(&hwsim_genl_family, hwsim_ops);
@@ -2180,94 +2525,36 @@ failure:
2180 2525
2181static void hwsim_exit_netlink(void) 2526static void hwsim_exit_netlink(void)
2182{ 2527{
2183 int ret;
2184
2185 /* userspace test API hasn't been adjusted for multi-channel */
2186 if (channels > 1)
2187 return;
2188
2189 printk(KERN_INFO "mac80211_hwsim: closing netlink\n");
2190 /* unregister the notifier */ 2528 /* unregister the notifier */
2191 netlink_unregister_notifier(&hwsim_netlink_notifier); 2529 netlink_unregister_notifier(&hwsim_netlink_notifier);
2192 /* unregister the family */ 2530 /* unregister the family */
2193 ret = genl_unregister_family(&hwsim_genl_family); 2531 genl_unregister_family(&hwsim_genl_family);
2194 if (ret)
2195 printk(KERN_DEBUG "mac80211_hwsim: "
2196 "unregister family %i\n", ret);
2197} 2532}
2198 2533
2199static const struct ieee80211_iface_limit hwsim_if_limits[] = {
2200 { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
2201 { .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) |
2202 BIT(NL80211_IFTYPE_P2P_CLIENT) |
2203#ifdef CONFIG_MAC80211_MESH
2204 BIT(NL80211_IFTYPE_MESH_POINT) |
2205#endif
2206 BIT(NL80211_IFTYPE_AP) |
2207 BIT(NL80211_IFTYPE_P2P_GO) },
2208 { .max = 1, .types = BIT(NL80211_IFTYPE_P2P_DEVICE) },
2209};
2210
2211static const struct ieee80211_iface_limit hwsim_if_dfs_limits[] = {
2212 { .max = 8, .types = BIT(NL80211_IFTYPE_AP) },
2213};
2214
2215static struct ieee80211_iface_combination hwsim_if_comb[] = {
2216 {
2217 .limits = hwsim_if_limits,
2218 .n_limits = ARRAY_SIZE(hwsim_if_limits),
2219 .max_interfaces = 2048,
2220 .num_different_channels = 1,
2221 },
2222 {
2223 .limits = hwsim_if_dfs_limits,
2224 .n_limits = ARRAY_SIZE(hwsim_if_dfs_limits),
2225 .max_interfaces = 8,
2226 .num_different_channels = 1,
2227 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
2228 BIT(NL80211_CHAN_WIDTH_20) |
2229 BIT(NL80211_CHAN_WIDTH_40) |
2230 BIT(NL80211_CHAN_WIDTH_80) |
2231 BIT(NL80211_CHAN_WIDTH_160),
2232 }
2233};
2234
2235static int __init init_mac80211_hwsim(void) 2534static int __init init_mac80211_hwsim(void)
2236{ 2535{
2237 int i, err = 0; 2536 int i, err;
2238 u8 addr[ETH_ALEN];
2239 struct mac80211_hwsim_data *data;
2240 struct ieee80211_hw *hw;
2241 enum ieee80211_band band;
2242 2537
2243 if (radios < 1 || radios > 100) 2538 if (radios < 0 || radios > 100)
2244 return -EINVAL; 2539 return -EINVAL;
2245 2540
2246 if (channels < 1) 2541 if (channels < 1)
2247 return -EINVAL; 2542 return -EINVAL;
2248 2543
2249 if (channels > 1) { 2544 mac80211_hwsim_mchan_ops = mac80211_hwsim_ops;
2250 hwsim_if_comb[0].num_different_channels = channels; 2545 mac80211_hwsim_mchan_ops.hw_scan = mac80211_hwsim_hw_scan;
2251 mac80211_hwsim_ops.hw_scan = mac80211_hwsim_hw_scan; 2546 mac80211_hwsim_mchan_ops.cancel_hw_scan = mac80211_hwsim_cancel_hw_scan;
2252 mac80211_hwsim_ops.cancel_hw_scan = 2547 mac80211_hwsim_mchan_ops.sw_scan_start = NULL;
2253 mac80211_hwsim_cancel_hw_scan; 2548 mac80211_hwsim_mchan_ops.sw_scan_complete = NULL;
2254 mac80211_hwsim_ops.sw_scan_start = NULL; 2549 mac80211_hwsim_mchan_ops.remain_on_channel = mac80211_hwsim_roc;
2255 mac80211_hwsim_ops.sw_scan_complete = NULL; 2550 mac80211_hwsim_mchan_ops.cancel_remain_on_channel = mac80211_hwsim_croc;
2256 mac80211_hwsim_ops.remain_on_channel = 2551 mac80211_hwsim_mchan_ops.add_chanctx = mac80211_hwsim_add_chanctx;
2257 mac80211_hwsim_roc; 2552 mac80211_hwsim_mchan_ops.remove_chanctx = mac80211_hwsim_remove_chanctx;
2258 mac80211_hwsim_ops.cancel_remain_on_channel = 2553 mac80211_hwsim_mchan_ops.change_chanctx = mac80211_hwsim_change_chanctx;
2259 mac80211_hwsim_croc; 2554 mac80211_hwsim_mchan_ops.assign_vif_chanctx =
2260 mac80211_hwsim_ops.add_chanctx = 2555 mac80211_hwsim_assign_vif_chanctx;
2261 mac80211_hwsim_add_chanctx; 2556 mac80211_hwsim_mchan_ops.unassign_vif_chanctx =
2262 mac80211_hwsim_ops.remove_chanctx = 2557 mac80211_hwsim_unassign_vif_chanctx;
2263 mac80211_hwsim_remove_chanctx;
2264 mac80211_hwsim_ops.change_chanctx =
2265 mac80211_hwsim_change_chanctx;
2266 mac80211_hwsim_ops.assign_vif_chanctx =
2267 mac80211_hwsim_assign_vif_chanctx;
2268 mac80211_hwsim_ops.unassign_vif_chanctx =
2269 mac80211_hwsim_unassign_vif_chanctx;
2270 }
2271 2558
2272 spin_lock_init(&hwsim_radio_lock); 2559 spin_lock_init(&hwsim_radio_lock);
2273 INIT_LIST_HEAD(&hwsim_radios); 2560 INIT_LIST_HEAD(&hwsim_radios);
@@ -2279,361 +2566,116 @@ static int __init init_mac80211_hwsim(void)
2279 hwsim_class = class_create(THIS_MODULE, "mac80211_hwsim"); 2566 hwsim_class = class_create(THIS_MODULE, "mac80211_hwsim");
2280 if (IS_ERR(hwsim_class)) { 2567 if (IS_ERR(hwsim_class)) {
2281 err = PTR_ERR(hwsim_class); 2568 err = PTR_ERR(hwsim_class);
2282 goto failed_unregister_driver; 2569 goto out_unregister_driver;
2283 } 2570 }
2284 2571
2285 memset(addr, 0, ETH_ALEN);
2286 addr[0] = 0x02;
2287
2288 for (i = 0; i < radios; i++) { 2572 for (i = 0; i < radios; i++) {
2289 printk(KERN_DEBUG "mac80211_hwsim: Initializing radio %d\n", 2573 const char *reg_alpha2 = NULL;
2290 i); 2574 const struct ieee80211_regdomain *regd = NULL;
2291 hw = ieee80211_alloc_hw(sizeof(*data), &mac80211_hwsim_ops); 2575 bool reg_strict = false;
2292 if (!hw) {
2293 printk(KERN_DEBUG "mac80211_hwsim: ieee80211_alloc_hw "
2294 "failed\n");
2295 err = -ENOMEM;
2296 goto failed;
2297 }
2298 data = hw->priv;
2299 data->hw = hw;
2300
2301 data->dev = device_create(hwsim_class, NULL, 0, hw,
2302 "hwsim%d", i);
2303 if (IS_ERR(data->dev)) {
2304 printk(KERN_DEBUG
2305 "mac80211_hwsim: device_create failed (%ld)\n",
2306 PTR_ERR(data->dev));
2307 err = -ENOMEM;
2308 goto failed_drvdata;
2309 }
2310 data->dev->driver = &mac80211_hwsim_driver.driver;
2311 err = device_bind_driver(data->dev);
2312 if (err != 0) {
2313 printk(KERN_DEBUG
2314 "mac80211_hwsim: device_bind_driver failed (%d)\n",
2315 err);
2316 goto failed_hw;
2317 }
2318
2319 skb_queue_head_init(&data->pending);
2320
2321 SET_IEEE80211_DEV(hw, data->dev);
2322 addr[3] = i >> 8;
2323 addr[4] = i;
2324 memcpy(data->addresses[0].addr, addr, ETH_ALEN);
2325 memcpy(data->addresses[1].addr, addr, ETH_ALEN);
2326 data->addresses[1].addr[0] |= 0x40;
2327 hw->wiphy->n_addresses = 2;
2328 hw->wiphy->addresses = data->addresses;
2329
2330 hw->wiphy->iface_combinations = hwsim_if_comb;
2331 hw->wiphy->n_iface_combinations = ARRAY_SIZE(hwsim_if_comb);
2332
2333 if (channels > 1) {
2334 hw->wiphy->max_scan_ssids = 255;
2335 hw->wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
2336 hw->wiphy->max_remain_on_channel_duration = 1000;
2337 /* For channels > 1 DFS is not allowed */
2338 hw->wiphy->n_iface_combinations = 1;
2339 }
2340
2341 INIT_DELAYED_WORK(&data->roc_done, hw_roc_done);
2342 INIT_DELAYED_WORK(&data->hw_scan, hw_scan_work);
2343
2344 hw->channel_change_time = 1;
2345 hw->queues = 5;
2346 hw->offchannel_tx_hw_queue = 4;
2347 hw->wiphy->interface_modes =
2348 BIT(NL80211_IFTYPE_STATION) |
2349 BIT(NL80211_IFTYPE_AP) |
2350 BIT(NL80211_IFTYPE_P2P_CLIENT) |
2351 BIT(NL80211_IFTYPE_P2P_GO) |
2352 BIT(NL80211_IFTYPE_ADHOC) |
2353 BIT(NL80211_IFTYPE_MESH_POINT) |
2354 BIT(NL80211_IFTYPE_P2P_DEVICE);
2355
2356 hw->flags = IEEE80211_HW_MFP_CAPABLE |
2357 IEEE80211_HW_SIGNAL_DBM |
2358 IEEE80211_HW_SUPPORTS_STATIC_SMPS |
2359 IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
2360 IEEE80211_HW_AMPDU_AGGREGATION |
2361 IEEE80211_HW_WANT_MONITOR_VIF |
2362 IEEE80211_HW_QUEUE_CONTROL |
2363 IEEE80211_HW_SUPPORTS_HT_CCK_RATES;
2364 if (rctbl)
2365 hw->flags |= IEEE80211_HW_SUPPORTS_RC_TABLE;
2366
2367 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS |
2368 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
2369 WIPHY_FLAG_AP_UAPSD;
2370 hw->wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
2371
2372 /* ask mac80211 to reserve space for magic */
2373 hw->vif_data_size = sizeof(struct hwsim_vif_priv);
2374 hw->sta_data_size = sizeof(struct hwsim_sta_priv);
2375 hw->chanctx_data_size = sizeof(struct hwsim_chanctx_priv);
2376
2377 memcpy(data->channels_2ghz, hwsim_channels_2ghz,
2378 sizeof(hwsim_channels_2ghz));
2379 memcpy(data->channels_5ghz, hwsim_channels_5ghz,
2380 sizeof(hwsim_channels_5ghz));
2381 memcpy(data->rates, hwsim_rates, sizeof(hwsim_rates));
2382
2383 for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) {
2384 struct ieee80211_supported_band *sband = &data->bands[band];
2385 switch (band) {
2386 case IEEE80211_BAND_2GHZ:
2387 sband->channels = data->channels_2ghz;
2388 sband->n_channels =
2389 ARRAY_SIZE(hwsim_channels_2ghz);
2390 sband->bitrates = data->rates;
2391 sband->n_bitrates = ARRAY_SIZE(hwsim_rates);
2392 break;
2393 case IEEE80211_BAND_5GHZ:
2394 sband->channels = data->channels_5ghz;
2395 sband->n_channels =
2396 ARRAY_SIZE(hwsim_channels_5ghz);
2397 sband->bitrates = data->rates + 4;
2398 sband->n_bitrates = ARRAY_SIZE(hwsim_rates) - 4;
2399 break;
2400 default:
2401 continue;
2402 }
2403
2404 sband->ht_cap.ht_supported = true;
2405 sband->ht_cap.cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
2406 IEEE80211_HT_CAP_GRN_FLD |
2407 IEEE80211_HT_CAP_SGI_40 |
2408 IEEE80211_HT_CAP_DSSSCCK40;
2409 sband->ht_cap.ampdu_factor = 0x3;
2410 sband->ht_cap.ampdu_density = 0x6;
2411 memset(&sband->ht_cap.mcs, 0,
2412 sizeof(sband->ht_cap.mcs));
2413 sband->ht_cap.mcs.rx_mask[0] = 0xff;
2414 sband->ht_cap.mcs.rx_mask[1] = 0xff;
2415 sband->ht_cap.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
2416
2417 hw->wiphy->bands[band] = sband;
2418
2419 sband->vht_cap.vht_supported = true;
2420 sband->vht_cap.cap =
2421 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
2422 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ |
2423 IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ |
2424 IEEE80211_VHT_CAP_RXLDPC |
2425 IEEE80211_VHT_CAP_SHORT_GI_80 |
2426 IEEE80211_VHT_CAP_SHORT_GI_160 |
2427 IEEE80211_VHT_CAP_TXSTBC |
2428 IEEE80211_VHT_CAP_RXSTBC_1 |
2429 IEEE80211_VHT_CAP_RXSTBC_2 |
2430 IEEE80211_VHT_CAP_RXSTBC_3 |
2431 IEEE80211_VHT_CAP_RXSTBC_4 |
2432 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK;
2433 sband->vht_cap.vht_mcs.rx_mcs_map =
2434 cpu_to_le16(IEEE80211_VHT_MCS_SUPPORT_0_8 << 0 |
2435 IEEE80211_VHT_MCS_SUPPORT_0_8 << 2 |
2436 IEEE80211_VHT_MCS_SUPPORT_0_9 << 4 |
2437 IEEE80211_VHT_MCS_SUPPORT_0_8 << 6 |
2438 IEEE80211_VHT_MCS_SUPPORT_0_8 << 8 |
2439 IEEE80211_VHT_MCS_SUPPORT_0_9 << 10 |
2440 IEEE80211_VHT_MCS_SUPPORT_0_9 << 12 |
2441 IEEE80211_VHT_MCS_SUPPORT_0_8 << 14);
2442 sband->vht_cap.vht_mcs.tx_mcs_map =
2443 sband->vht_cap.vht_mcs.rx_mcs_map;
2444 }
2445 /* By default all radios are belonging to the first group */
2446 data->group = 1;
2447 mutex_init(&data->mutex);
2448
2449 /* Enable frame retransmissions for lossy channels */
2450 hw->max_rates = 4;
2451 hw->max_rate_tries = 11;
2452 2576
2453 /* Work to be done prior to ieee80211_register_hw() */
2454 switch (regtest) { 2577 switch (regtest) {
2455 case HWSIM_REGTEST_DISABLED:
2456 case HWSIM_REGTEST_DRIVER_REG_FOLLOW:
2457 case HWSIM_REGTEST_DRIVER_REG_ALL:
2458 case HWSIM_REGTEST_DIFF_COUNTRY: 2578 case HWSIM_REGTEST_DIFF_COUNTRY:
2459 /* 2579 if (i < ARRAY_SIZE(hwsim_alpha2s))
2460 * Nothing to be done for driver regulatory domain 2580 reg_alpha2 = hwsim_alpha2s[i];
2461 * hints prior to ieee80211_register_hw()
2462 */
2463 break;
2464 case HWSIM_REGTEST_WORLD_ROAM:
2465 if (i == 0) {
2466 hw->wiphy->regulatory_flags |=
2467 REGULATORY_CUSTOM_REG;
2468 wiphy_apply_custom_regulatory(hw->wiphy,
2469 &hwsim_world_regdom_custom_01);
2470 }
2471 break;
2472 case HWSIM_REGTEST_CUSTOM_WORLD:
2473 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
2474 wiphy_apply_custom_regulatory(hw->wiphy,
2475 &hwsim_world_regdom_custom_01);
2476 break;
2477 case HWSIM_REGTEST_CUSTOM_WORLD_2:
2478 if (i == 0) {
2479 hw->wiphy->regulatory_flags |=
2480 REGULATORY_CUSTOM_REG;
2481 wiphy_apply_custom_regulatory(hw->wiphy,
2482 &hwsim_world_regdom_custom_01);
2483 } else if (i == 1) {
2484 hw->wiphy->regulatory_flags |=
2485 REGULATORY_CUSTOM_REG;
2486 wiphy_apply_custom_regulatory(hw->wiphy,
2487 &hwsim_world_regdom_custom_02);
2488 }
2489 break;
2490 case HWSIM_REGTEST_STRICT_ALL:
2491 hw->wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
2492 break;
2493 case HWSIM_REGTEST_STRICT_FOLLOW:
2494 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG:
2495 if (i == 0)
2496 hw->wiphy->regulatory_flags |=
2497 REGULATORY_STRICT_REG;
2498 break;
2499 case HWSIM_REGTEST_ALL:
2500 if (i == 0) {
2501 hw->wiphy->regulatory_flags |=
2502 REGULATORY_CUSTOM_REG;
2503 wiphy_apply_custom_regulatory(hw->wiphy,
2504 &hwsim_world_regdom_custom_01);
2505 } else if (i == 1) {
2506 hw->wiphy->regulatory_flags |=
2507 REGULATORY_CUSTOM_REG;
2508 wiphy_apply_custom_regulatory(hw->wiphy,
2509 &hwsim_world_regdom_custom_02);
2510 } else if (i == 4)
2511 hw->wiphy->regulatory_flags |=
2512 REGULATORY_STRICT_REG;
2513 break;
2514 default:
2515 break;
2516 }
2517
2518 /* give the regulatory workqueue a chance to run */
2519 if (regtest)
2520 schedule_timeout_interruptible(1);
2521 err = ieee80211_register_hw(hw);
2522 if (err < 0) {
2523 printk(KERN_DEBUG "mac80211_hwsim: "
2524 "ieee80211_register_hw failed (%d)\n", err);
2525 goto failed_hw;
2526 }
2527
2528 /* Work to be done after to ieee80211_register_hw() */
2529 switch (regtest) {
2530 case HWSIM_REGTEST_WORLD_ROAM:
2531 case HWSIM_REGTEST_DISABLED:
2532 break; 2581 break;
2533 case HWSIM_REGTEST_DRIVER_REG_FOLLOW: 2582 case HWSIM_REGTEST_DRIVER_REG_FOLLOW:
2534 if (!i) 2583 if (!i)
2535 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]); 2584 reg_alpha2 = hwsim_alpha2s[0];
2536 break; 2585 break;
2537 case HWSIM_REGTEST_DRIVER_REG_ALL:
2538 case HWSIM_REGTEST_STRICT_ALL: 2586 case HWSIM_REGTEST_STRICT_ALL:
2539 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]); 2587 reg_strict = true;
2588 case HWSIM_REGTEST_DRIVER_REG_ALL:
2589 reg_alpha2 = hwsim_alpha2s[0];
2540 break; 2590 break;
2541 case HWSIM_REGTEST_DIFF_COUNTRY: 2591 case HWSIM_REGTEST_WORLD_ROAM:
2542 if (i < ARRAY_SIZE(hwsim_alpha2s)) 2592 if (i == 0)
2543 regulatory_hint(hw->wiphy, hwsim_alpha2s[i]); 2593 regd = &hwsim_world_regdom_custom_01;
2544 break; 2594 break;
2545 case HWSIM_REGTEST_CUSTOM_WORLD: 2595 case HWSIM_REGTEST_CUSTOM_WORLD:
2596 regd = &hwsim_world_regdom_custom_01;
2597 break;
2546 case HWSIM_REGTEST_CUSTOM_WORLD_2: 2598 case HWSIM_REGTEST_CUSTOM_WORLD_2:
2547 /* 2599 if (i == 0)
2548 * Nothing to be done for custom world regulatory 2600 regd = &hwsim_world_regdom_custom_01;
2549 * domains after to ieee80211_register_hw 2601 else if (i == 1)
2550 */ 2602 regd = &hwsim_world_regdom_custom_02;
2551 break; 2603 break;
2552 case HWSIM_REGTEST_STRICT_FOLLOW: 2604 case HWSIM_REGTEST_STRICT_FOLLOW:
2553 if (i == 0) 2605 if (i == 0) {
2554 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]); 2606 reg_strict = true;
2607 reg_alpha2 = hwsim_alpha2s[0];
2608 }
2555 break; 2609 break;
2556 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG: 2610 case HWSIM_REGTEST_STRICT_AND_DRIVER_REG:
2557 if (i == 0) 2611 if (i == 0) {
2558 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]); 2612 reg_strict = true;
2559 else if (i == 1) 2613 reg_alpha2 = hwsim_alpha2s[0];
2560 regulatory_hint(hw->wiphy, hwsim_alpha2s[1]); 2614 } else if (i == 1) {
2615 reg_alpha2 = hwsim_alpha2s[1];
2616 }
2561 break; 2617 break;
2562 case HWSIM_REGTEST_ALL: 2618 case HWSIM_REGTEST_ALL:
2563 if (i == 2) 2619 switch (i) {
2564 regulatory_hint(hw->wiphy, hwsim_alpha2s[0]); 2620 case 0:
2565 else if (i == 3) 2621 regd = &hwsim_world_regdom_custom_01;
2566 regulatory_hint(hw->wiphy, hwsim_alpha2s[1]); 2622 break;
2567 else if (i == 4) 2623 case 1:
2568 regulatory_hint(hw->wiphy, hwsim_alpha2s[2]); 2624 regd = &hwsim_world_regdom_custom_02;
2625 break;
2626 case 2:
2627 reg_alpha2 = hwsim_alpha2s[0];
2628 break;
2629 case 3:
2630 reg_alpha2 = hwsim_alpha2s[1];
2631 break;
2632 case 4:
2633 reg_strict = true;
2634 reg_alpha2 = hwsim_alpha2s[2];
2635 break;
2636 }
2569 break; 2637 break;
2570 default: 2638 default:
2571 break; 2639 break;
2572 } 2640 }
2573 2641
2574 wiphy_debug(hw->wiphy, "hwaddr %pm registered\n", 2642 err = mac80211_hwsim_create_radio(channels, reg_alpha2,
2575 hw->wiphy->perm_addr); 2643 regd, reg_strict);
2576 2644 if (err < 0)
2577 data->debugfs = debugfs_create_dir("hwsim", 2645 goto out_free_radios;
2578 hw->wiphy->debugfsdir);
2579 debugfs_create_file("ps", 0666, data->debugfs, data,
2580 &hwsim_fops_ps);
2581 debugfs_create_file("group", 0666, data->debugfs, data,
2582 &hwsim_fops_group);
2583 if (channels == 1)
2584 debugfs_create_file("dfs_simulate_radar", 0222,
2585 data->debugfs,
2586 data, &hwsim_simulate_radar);
2587
2588 tasklet_hrtimer_init(&data->beacon_timer,
2589 mac80211_hwsim_beacon,
2590 CLOCK_MONOTONIC_RAW, HRTIMER_MODE_ABS);
2591
2592 list_add_tail(&data->list, &hwsim_radios);
2593 } 2646 }
2594 2647
2595 hwsim_mon = alloc_netdev(0, "hwsim%d", hwsim_mon_setup); 2648 hwsim_mon = alloc_netdev(0, "hwsim%d", hwsim_mon_setup);
2596 if (hwsim_mon == NULL) { 2649 if (hwsim_mon == NULL) {
2597 err = -ENOMEM; 2650 err = -ENOMEM;
2598 goto failed; 2651 goto out_free_radios;
2599 } 2652 }
2600 2653
2601 rtnl_lock(); 2654 rtnl_lock();
2602
2603 err = dev_alloc_name(hwsim_mon, hwsim_mon->name); 2655 err = dev_alloc_name(hwsim_mon, hwsim_mon->name);
2604 if (err < 0) 2656 if (err < 0) {
2605 goto failed_mon; 2657 rtnl_unlock();
2606 2658 goto out_free_radios;
2659 }
2607 2660
2608 err = register_netdevice(hwsim_mon); 2661 err = register_netdevice(hwsim_mon);
2609 if (err < 0) 2662 if (err < 0) {
2610 goto failed_mon; 2663 rtnl_unlock();
2611 2664 goto out_free_mon;
2665 }
2612 rtnl_unlock(); 2666 rtnl_unlock();
2613 2667
2614 err = hwsim_init_netlink(); 2668 err = hwsim_init_netlink();
2615 if (err < 0) 2669 if (err < 0)
2616 goto failed_nl; 2670 goto out_free_mon;
2617 2671
2618 return 0; 2672 return 0;
2619 2673
2620failed_nl: 2674out_free_mon:
2621 printk(KERN_DEBUG "mac_80211_hwsim: failed initializing netlink\n");
2622 return err;
2623
2624failed_mon:
2625 rtnl_unlock();
2626 free_netdev(hwsim_mon); 2675 free_netdev(hwsim_mon);
2676out_free_radios:
2627 mac80211_hwsim_free(); 2677 mac80211_hwsim_free();
2628 return err; 2678out_unregister_driver:
2629
2630failed_hw:
2631 device_unregister(data->dev);
2632failed_drvdata:
2633 ieee80211_free_hw(hw);
2634failed:
2635 mac80211_hwsim_free();
2636failed_unregister_driver:
2637 platform_driver_unregister(&mac80211_hwsim_driver); 2679 platform_driver_unregister(&mac80211_hwsim_driver);
2638 return err; 2680 return err;
2639} 2681}
diff --git a/drivers/net/wireless/mac80211_hwsim.h b/drivers/net/wireless/mac80211_hwsim.h
index afaad5a443b6..2747cce5a269 100644
--- a/drivers/net/wireless/mac80211_hwsim.h
+++ b/drivers/net/wireless/mac80211_hwsim.h
@@ -65,6 +65,9 @@ enum hwsim_tx_control_flags {
65 * kernel, uses: 65 * kernel, uses:
66 * %HWSIM_ATTR_ADDR_TRANSMITTER, %HWSIM_ATTR_FLAGS, 66 * %HWSIM_ATTR_ADDR_TRANSMITTER, %HWSIM_ATTR_FLAGS,
67 * %HWSIM_ATTR_TX_INFO, %HWSIM_ATTR_SIGNAL, %HWSIM_ATTR_COOKIE 67 * %HWSIM_ATTR_TX_INFO, %HWSIM_ATTR_SIGNAL, %HWSIM_ATTR_COOKIE
68 * @HWSIM_CMD_CREATE_RADIO: create a new radio with the given parameters,
69 * returns the radio ID (>= 0) or negative on errors
70 * @HWSIM_CMD_DESTROY_RADIO: destroy a radio
68 * @__HWSIM_CMD_MAX: enum limit 71 * @__HWSIM_CMD_MAX: enum limit
69 */ 72 */
70enum { 73enum {
@@ -72,6 +75,8 @@ enum {
72 HWSIM_CMD_REGISTER, 75 HWSIM_CMD_REGISTER,
73 HWSIM_CMD_FRAME, 76 HWSIM_CMD_FRAME,
74 HWSIM_CMD_TX_INFO_FRAME, 77 HWSIM_CMD_TX_INFO_FRAME,
78 HWSIM_CMD_CREATE_RADIO,
79 HWSIM_CMD_DESTROY_RADIO,
75 __HWSIM_CMD_MAX, 80 __HWSIM_CMD_MAX,
76}; 81};
77#define HWSIM_CMD_MAX (_HWSIM_CMD_MAX - 1) 82#define HWSIM_CMD_MAX (_HWSIM_CMD_MAX - 1)
@@ -94,6 +99,14 @@ enum {
94 space 99 space
95 * @HWSIM_ATTR_TX_INFO: ieee80211_tx_rate array 100 * @HWSIM_ATTR_TX_INFO: ieee80211_tx_rate array
96 * @HWSIM_ATTR_COOKIE: sk_buff cookie to identify the frame 101 * @HWSIM_ATTR_COOKIE: sk_buff cookie to identify the frame
102 * @HWSIM_ATTR_CHANNELS: u32 attribute used with the %HWSIM_CMD_CREATE_RADIO
103 * command giving the number of channels supported by the new radio
104 * @HWSIM_ATTR_RADIO_ID: u32 attribute used with %HWSIM_CMD_DESTROY_RADIO
105 * only to destroy a radio
106 * @HWSIM_ATTR_REG_HINT_ALPHA2: alpha2 for regulatoro driver hint
107 * (nla string, length 2)
108 * @HWSIM_ATTR_REG_CUSTOM_REG: custom regulatory domain index (u32 attribute)
109 * @HWSIM_ATTR_REG_STRICT_REG: request REGULATORY_STRICT_REG (flag attribute)
97 * @__HWSIM_ATTR_MAX: enum limit 110 * @__HWSIM_ATTR_MAX: enum limit
98 */ 111 */
99 112
@@ -108,6 +121,11 @@ enum {
108 HWSIM_ATTR_SIGNAL, 121 HWSIM_ATTR_SIGNAL,
109 HWSIM_ATTR_TX_INFO, 122 HWSIM_ATTR_TX_INFO,
110 HWSIM_ATTR_COOKIE, 123 HWSIM_ATTR_COOKIE,
124 HWSIM_ATTR_CHANNELS,
125 HWSIM_ATTR_RADIO_ID,
126 HWSIM_ATTR_REG_HINT_ALPHA2,
127 HWSIM_ATTR_REG_CUSTOM_REG,
128 HWSIM_ATTR_REG_STRICT_REG,
111 __HWSIM_ATTR_MAX, 129 __HWSIM_ATTR_MAX,
112}; 130};
113#define HWSIM_ATTR_MAX (__HWSIM_ATTR_MAX - 1) 131#define HWSIM_ATTR_MAX (__HWSIM_ATTR_MAX - 1)
diff --git a/drivers/net/wireless/mwifiex/Kconfig b/drivers/net/wireless/mwifiex/Kconfig
index f7ff4725506a..ecdf34505b54 100644
--- a/drivers/net/wireless/mwifiex/Kconfig
+++ b/drivers/net/wireless/mwifiex/Kconfig
@@ -31,12 +31,12 @@ config MWIFIEX_PCIE
31 mwifiex_pcie. 31 mwifiex_pcie.
32 32
33config MWIFIEX_USB 33config MWIFIEX_USB
34 tristate "Marvell WiFi-Ex Driver for USB8797" 34 tristate "Marvell WiFi-Ex Driver for USB8797/8897"
35 depends on MWIFIEX && USB 35 depends on MWIFIEX && USB
36 select FW_LOADER 36 select FW_LOADER
37 ---help--- 37 ---help---
38 This adds support for wireless adapters based on Marvell 38 This adds support for wireless adapters based on Marvell
39 Avastar 88W8797 chipset with USB interface. 39 8797/8897 chipset with USB interface.
40 40
41 If you choose to build it as a module, it will be called 41 If you choose to build it as a module, it will be called
42 mwifiex_usb. 42 mwifiex_usb.
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index e7c81abf108e..f37b403e83d0 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -2677,6 +2677,7 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
2677 struct wiphy *wiphy; 2677 struct wiphy *wiphy;
2678 struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_TYPE_STA]; 2678 struct mwifiex_private *priv = adapter->priv[MWIFIEX_BSS_TYPE_STA];
2679 u8 *country_code; 2679 u8 *country_code;
2680 u32 thr, retry;
2680 2681
2681 /* create a new wiphy for use with cfg80211 */ 2682 /* create a new wiphy for use with cfg80211 */
2682 wiphy = wiphy_new(&mwifiex_cfg80211_ops, 2683 wiphy = wiphy_new(&mwifiex_cfg80211_ops,
@@ -2766,6 +2767,19 @@ int mwifiex_register_cfg80211(struct mwifiex_adapter *adapter)
2766 country_code); 2767 country_code);
2767 } 2768 }
2768 2769
2770 mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
2771 HostCmd_ACT_GEN_GET, FRAG_THRESH_I, &thr);
2772 wiphy->frag_threshold = thr;
2773 mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
2774 HostCmd_ACT_GEN_GET, RTS_THRESH_I, &thr);
2775 wiphy->rts_threshold = thr;
2776 mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
2777 HostCmd_ACT_GEN_GET, SHORT_RETRY_LIM_I, &retry);
2778 wiphy->retry_short = (u8) retry;
2779 mwifiex_send_cmd_sync(priv, HostCmd_CMD_802_11_SNMP_MIB,
2780 HostCmd_ACT_GEN_GET, LONG_RETRY_LIM_I, &retry);
2781 wiphy->retry_long = (u8) retry;
2782
2769 adapter->wiphy = wiphy; 2783 adapter->wiphy = wiphy;
2770 return ret; 2784 return ret;
2771} 2785}
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h
index 4cee6ceb7e9e..5fa932d5f905 100644
--- a/drivers/net/wireless/mwifiex/fw.h
+++ b/drivers/net/wireless/mwifiex/fw.h
@@ -226,7 +226,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
226 226
227/* HW_SPEC fw_cap_info */ 227/* HW_SPEC fw_cap_info */
228 228
229#define ISSUPP_11ACENABLED(fw_cap_info) (fw_cap_info & (BIT(13)|BIT(14))) 229#define ISSUPP_11ACENABLED(fw_cap_info) (fw_cap_info & (BIT(12)|BIT(13)))
230 230
231#define GET_VHTCAP_CHWDSET(vht_cap_info) ((vht_cap_info >> 2) & 0x3) 231#define GET_VHTCAP_CHWDSET(vht_cap_info) ((vht_cap_info >> 2) & 0x3)
232#define GET_VHTNSSMCS(mcs_mapset, nss) ((mcs_mapset >> (2 * (nss - 1))) & 0x3) 232#define GET_VHTNSSMCS(mcs_mapset, nss) ((mcs_mapset >> (2 * (nss - 1))) & 0x3)
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c
index 0ed06646f19a..0a8a26e10f01 100644
--- a/drivers/net/wireless/mwifiex/scan.c
+++ b/drivers/net/wireless/mwifiex/scan.c
@@ -1681,7 +1681,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
1681 const u8 *ie_buf; 1681 const u8 *ie_buf;
1682 size_t ie_len; 1682 size_t ie_len;
1683 u16 channel = 0; 1683 u16 channel = 0;
1684 u64 fw_tsf = 0; 1684 __le64 fw_tsf = 0;
1685 u16 beacon_size = 0; 1685 u16 beacon_size = 0;
1686 u32 curr_bcn_bytes; 1686 u32 curr_bcn_bytes;
1687 u32 freq; 1687 u32 freq;
@@ -1815,7 +1815,7 @@ int mwifiex_ret_802_11_scan(struct mwifiex_private *priv,
1815 ie_buf, ie_len, rssi, GFP_KERNEL); 1815 ie_buf, ie_len, rssi, GFP_KERNEL);
1816 bss_priv = (struct mwifiex_bss_priv *)bss->priv; 1816 bss_priv = (struct mwifiex_bss_priv *)bss->priv;
1817 bss_priv->band = band; 1817 bss_priv->band = band;
1818 bss_priv->fw_tsf = fw_tsf; 1818 bss_priv->fw_tsf = le64_to_cpu(fw_tsf);
1819 if (priv->media_connected && 1819 if (priv->media_connected &&
1820 !memcmp(bssid, 1820 !memcmp(bssid,
1821 priv->curr_bss_params.bss_descriptor 1821 priv->curr_bss_params.bss_descriptor
diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c
index a9240a2083f2..e8ebbd4bc3cd 100644
--- a/drivers/net/wireless/mwifiex/usb.c
+++ b/drivers/net/wireless/mwifiex/usb.c
@@ -22,15 +22,21 @@
22 22
23#define USB_VERSION "1.0" 23#define USB_VERSION "1.0"
24 24
25static const char usbdriver_name[] = "usb8797"; 25static const char usbdriver_name[] = "usb8xxx";
26 26
27static struct mwifiex_if_ops usb_ops; 27static struct mwifiex_if_ops usb_ops;
28static struct semaphore add_remove_card_sem; 28static struct semaphore add_remove_card_sem;
29static struct usb_card_rec *usb_card; 29static struct usb_card_rec *usb_card;
30 30
31static struct usb_device_id mwifiex_usb_table[] = { 31static struct usb_device_id mwifiex_usb_table[] = {
32 {USB_DEVICE(USB8797_VID, USB8797_PID_1)}, 32 /* 8797 */
33 {USB_DEVICE_AND_INTERFACE_INFO(USB8797_VID, USB8797_PID_2, 33 {USB_DEVICE(USB8XXX_VID, USB8797_PID_1)},
34 {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID, USB8797_PID_2,
35 USB_CLASS_VENDOR_SPEC,
36 USB_SUBCLASS_VENDOR_SPEC, 0xff)},
37 /* 8897 */
38 {USB_DEVICE(USB8XXX_VID, USB8897_PID_1)},
39 {USB_DEVICE_AND_INTERFACE_INFO(USB8XXX_VID, USB8897_PID_2,
34 USB_CLASS_VENDOR_SPEC, 40 USB_CLASS_VENDOR_SPEC,
35 USB_SUBCLASS_VENDOR_SPEC, 0xff)}, 41 USB_SUBCLASS_VENDOR_SPEC, 0xff)},
36 { } /* Terminating entry */ 42 { } /* Terminating entry */
@@ -343,10 +349,20 @@ static int mwifiex_usb_probe(struct usb_interface *intf,
343 id_vendor, id_product, bcd_device); 349 id_vendor, id_product, bcd_device);
344 350
345 /* PID_1 is used for firmware downloading only */ 351 /* PID_1 is used for firmware downloading only */
346 if (id_product == USB8797_PID_1) 352 switch (id_product) {
347 card->usb_boot_state = USB8797_FW_DNLD; 353 case USB8797_PID_1:
348 else 354 case USB8897_PID_1:
349 card->usb_boot_state = USB8797_FW_READY; 355 card->usb_boot_state = USB8XXX_FW_DNLD;
356 break;
357 case USB8797_PID_2:
358 case USB8897_PID_2:
359 card->usb_boot_state = USB8XXX_FW_READY;
360 break;
361 default:
362 pr_warning("unknown id_product %#x\n", id_product);
363 card->usb_boot_state = USB8XXX_FW_DNLD;
364 break;
365 }
350 366
351 card->udev = udev; 367 card->udev = udev;
352 card->intf = intf; 368 card->intf = intf;
@@ -755,9 +771,20 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
755 771
756 card->adapter = adapter; 772 card->adapter = adapter;
757 adapter->dev = &card->udev->dev; 773 adapter->dev = &card->udev->dev;
758 strcpy(adapter->fw_name, USB8797_DEFAULT_FW_NAME);
759 usb_card = card; 774 usb_card = card;
760 775
776 switch (le16_to_cpu(card->udev->descriptor.idProduct)) {
777 case USB8897_PID_1:
778 case USB8897_PID_2:
779 strcpy(adapter->fw_name, USB8897_DEFAULT_FW_NAME);
780 break;
781 case USB8797_PID_1:
782 case USB8797_PID_2:
783 default:
784 strcpy(adapter->fw_name, USB8797_DEFAULT_FW_NAME);
785 break;
786 }
787
761 return 0; 788 return 0;
762} 789}
763 790
@@ -773,7 +800,7 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
773{ 800{
774 int ret = 0; 801 int ret = 0;
775 u8 *firmware = fw->fw_buf, *recv_buff; 802 u8 *firmware = fw->fw_buf, *recv_buff;
776 u32 retries = USB8797_FW_MAX_RETRY, dlen; 803 u32 retries = USB8XXX_FW_MAX_RETRY, dlen;
777 u32 fw_seqnum = 0, tlen = 0, dnld_cmd = 0; 804 u32 fw_seqnum = 0, tlen = 0, dnld_cmd = 0;
778 struct fw_data *fwdata; 805 struct fw_data *fwdata;
779 struct fw_sync_header sync_fw; 806 struct fw_sync_header sync_fw;
@@ -875,7 +902,7 @@ static int mwifiex_prog_fw_w_helper(struct mwifiex_adapter *adapter,
875 continue; 902 continue;
876 } 903 }
877 904
878 retries = USB8797_FW_MAX_RETRY; 905 retries = USB8XXX_FW_MAX_RETRY;
879 break; 906 break;
880 } 907 }
881 fw_seqnum++; 908 fw_seqnum++;
@@ -899,13 +926,13 @@ static int mwifiex_usb_dnld_fw(struct mwifiex_adapter *adapter,
899 int ret; 926 int ret;
900 struct usb_card_rec *card = (struct usb_card_rec *)adapter->card; 927 struct usb_card_rec *card = (struct usb_card_rec *)adapter->card;
901 928
902 if (card->usb_boot_state == USB8797_FW_DNLD) { 929 if (card->usb_boot_state == USB8XXX_FW_DNLD) {
903 ret = mwifiex_prog_fw_w_helper(adapter, fw); 930 ret = mwifiex_prog_fw_w_helper(adapter, fw);
904 if (ret) 931 if (ret)
905 return -1; 932 return -1;
906 933
907 /* Boot state changes after successful firmware download */ 934 /* Boot state changes after successful firmware download */
908 if (card->usb_boot_state == USB8797_FW_DNLD) 935 if (card->usb_boot_state == USB8XXX_FW_DNLD)
909 return -1; 936 return -1;
910 } 937 }
911 938
@@ -1039,4 +1066,5 @@ MODULE_AUTHOR("Marvell International Ltd.");
1039MODULE_DESCRIPTION("Marvell WiFi-Ex USB Driver version" USB_VERSION); 1066MODULE_DESCRIPTION("Marvell WiFi-Ex USB Driver version" USB_VERSION);
1040MODULE_VERSION(USB_VERSION); 1067MODULE_VERSION(USB_VERSION);
1041MODULE_LICENSE("GPL v2"); 1068MODULE_LICENSE("GPL v2");
1042MODULE_FIRMWARE("mrvl/usb8797_uapsta.bin"); 1069MODULE_FIRMWARE(USB8797_DEFAULT_FW_NAME);
1070MODULE_FIRMWARE(USB8897_DEFAULT_FW_NAME);
diff --git a/drivers/net/wireless/mwifiex/usb.h b/drivers/net/wireless/mwifiex/usb.h
index 98c4316cd1a9..15b73d12e998 100644
--- a/drivers/net/wireless/mwifiex/usb.h
+++ b/drivers/net/wireless/mwifiex/usb.h
@@ -22,19 +22,23 @@
22 22
23#include <linux/usb.h> 23#include <linux/usb.h>
24 24
25#define USB8797_VID 0x1286 25#define USB8XXX_VID 0x1286
26
26#define USB8797_PID_1 0x2043 27#define USB8797_PID_1 0x2043
27#define USB8797_PID_2 0x2044 28#define USB8797_PID_2 0x2044
29#define USB8897_PID_1 0x2045
30#define USB8897_PID_2 0x2046
28 31
29#define USB8797_FW_DNLD 1 32#define USB8XXX_FW_DNLD 1
30#define USB8797_FW_READY 2 33#define USB8XXX_FW_READY 2
31#define USB8797_FW_MAX_RETRY 3 34#define USB8XXX_FW_MAX_RETRY 3
32 35
33#define MWIFIEX_TX_DATA_URB 6 36#define MWIFIEX_TX_DATA_URB 6
34#define MWIFIEX_RX_DATA_URB 6 37#define MWIFIEX_RX_DATA_URB 6
35#define MWIFIEX_USB_TIMEOUT 100 38#define MWIFIEX_USB_TIMEOUT 100
36 39
37#define USB8797_DEFAULT_FW_NAME "mrvl/usb8797_uapsta.bin" 40#define USB8797_DEFAULT_FW_NAME "mrvl/usb8797_uapsta.bin"
41#define USB8897_DEFAULT_FW_NAME "mrvl/usb8897_uapsta.bin"
38 42
39#define FW_DNLD_TX_BUF_SIZE 620 43#define FW_DNLD_TX_BUF_SIZE 620
40#define FW_DNLD_RX_BUF_SIZE 2048 44#define FW_DNLD_RX_BUF_SIZE 2048
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index 63dbde5c3713..4987c3f942ce 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -5892,8 +5892,6 @@ static int mwl8k_firmware_load_success(struct mwl8k_priv *priv)
5892 5892
5893 hw->extra_tx_headroom -= priv->ap_fw ? REDUCED_TX_HEADROOM : 0; 5893 hw->extra_tx_headroom -= priv->ap_fw ? REDUCED_TX_HEADROOM : 0;
5894 5894
5895 hw->channel_change_time = 10;
5896
5897 hw->queues = MWL8K_TX_WMM_QUEUES; 5895 hw->queues = MWL8K_TX_WMM_QUEUES;
5898 5896
5899 /* Set rssi values to dBm */ 5897 /* Set rssi values to dBm */
diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c
index 80d93cba5150..eede90b63f84 100644
--- a/drivers/net/wireless/p54/main.c
+++ b/drivers/net/wireless/p54/main.c
@@ -756,7 +756,6 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
756 BIT(NL80211_IFTYPE_AP) | 756 BIT(NL80211_IFTYPE_AP) |
757 BIT(NL80211_IFTYPE_MESH_POINT); 757 BIT(NL80211_IFTYPE_MESH_POINT);
758 758
759 dev->channel_change_time = 1000; /* TODO: find actual value */
760 priv->beacon_req_id = cpu_to_le32(0); 759 priv->beacon_req_id = cpu_to_le32(0);
761 priv->tx_stats[P54_QUEUE_BEACON].limit = 1; 760 priv->tx_stats[P54_QUEUE_BEACON].limit = 1;
762 priv->tx_stats[P54_QUEUE_FWSCAN].limit = 1; 761 priv->tx_stats[P54_QUEUE_FWSCAN].limit = 1;
diff --git a/drivers/net/wireless/p54/txrx.c b/drivers/net/wireless/p54/txrx.c
index 9c96831c0b5c..153c61539ec8 100644
--- a/drivers/net/wireless/p54/txrx.c
+++ b/drivers/net/wireless/p54/txrx.c
@@ -586,7 +586,7 @@ static void p54_rx_stats(struct p54_common *priv, struct sk_buff *skb)
586 chan = priv->curchan; 586 chan = priv->curchan;
587 if (chan) { 587 if (chan) {
588 struct survey_info *survey = &priv->survey[chan->hw_value]; 588 struct survey_info *survey = &priv->survey[chan->hw_value];
589 survey->noise = clamp_t(s8, priv->noise, -128, 127); 589 survey->noise = clamp(priv->noise, -128, 127);
590 survey->channel_time = priv->survey_raw.active; 590 survey->channel_time = priv->survey_raw.active;
591 survey->channel_time_tx = priv->survey_raw.tx; 591 survey->channel_time_tx = priv->survey_raw.tx;
592 survey->channel_time_busy = priv->survey_raw.tx + 592 survey->channel_time_busy = priv->survey_raw.tx +
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index d63a12cc5de8..93bb384eb001 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -353,7 +353,6 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
353 353
354 /* TODO: Correct this value for our hw */ 354 /* TODO: Correct this value for our hw */
355 /* TODO: define these hard code value */ 355 /* TODO: define these hard code value */
356 hw->channel_change_time = 100;
357 hw->max_listen_interval = 10; 356 hw->max_listen_interval = 10;
358 hw->max_rate_tries = 4; 357 hw->max_rate_tries = 4;
359 /* hw->max_rates = 1; */ 358 /* hw->max_rates = 1; */
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
index 8501954cfb44..c61311084d7e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
@@ -317,6 +317,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
317 {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ 317 {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/
318 {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ 318 {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
319 {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ 319 {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
320 {RTL_USB_DEVICE(0x0df6, 0x0077, rtl92cu_hal_cfg)}, /*Sitecom-WLA2100V2*/
320 {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/ 321 {RTL_USB_DEVICE(0x0eb0, 0x9071, rtl92cu_hal_cfg)}, /*NO Brand - Etop*/
321 {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/ 322 {RTL_USB_DEVICE(0x4856, 0x0091, rtl92cu_hal_cfg)}, /*NetweeN - Feixun*/
322 /* HP - Lite-On ,8188CUS Slim Combo */ 323 /* HP - Lite-On ,8188CUS Slim Combo */
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index 119c148f7740..757e25784a8a 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -1468,7 +1468,6 @@ int wl1251_init_ieee80211(struct wl1251 *wl)
1468 1468
1469 /* unit us */ 1469 /* unit us */
1470 /* FIXME: find a proper value */ 1470 /* FIXME: find a proper value */
1471 wl->hw->channel_change_time = 10000;
1472 1471
1473 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM | 1472 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
1474 IEEE80211_HW_SUPPORTS_PS | 1473 IEEE80211_HW_SUPPORTS_PS |
diff --git a/drivers/net/wireless/ti/wlcore/main.c b/drivers/net/wireless/ti/wlcore/main.c
index e9da47cead58..b46b3116cc55 100644
--- a/drivers/net/wireless/ti/wlcore/main.c
+++ b/drivers/net/wireless/ti/wlcore/main.c
@@ -4457,6 +4457,16 @@ static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
4457 if (ret < 0) 4457 if (ret < 0)
4458 goto out; 4458 goto out;
4459 4459
4460 if ((changed & BSS_CHANGED_TXPOWER) &&
4461 bss_conf->txpower != wlvif->power_level) {
4462
4463 ret = wl1271_acx_tx_power(wl, wlvif, bss_conf->txpower);
4464 if (ret < 0)
4465 goto out;
4466
4467 wlvif->power_level = bss_conf->txpower;
4468 }
4469
4460 if (is_ap) 4470 if (is_ap)
4461 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed); 4471 wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
4462 else 4472 else
@@ -5710,7 +5720,6 @@ static int wl1271_init_ieee80211(struct wl1271 *wl)
5710 5720
5711 /* unit us */ 5721 /* unit us */
5712 /* FIXME: find a proper value */ 5722 /* FIXME: find a proper value */
5713 wl->hw->channel_change_time = 10000;
5714 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval; 5723 wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
5715 5724
5716 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM | 5725 wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
diff --git a/drivers/nfc/Kconfig b/drivers/nfc/Kconfig
index c1fb20603338..fe20e1cc0545 100644
--- a/drivers/nfc/Kconfig
+++ b/drivers/nfc/Kconfig
@@ -58,5 +58,6 @@ config NFC_PORT100
58 58
59source "drivers/nfc/pn544/Kconfig" 59source "drivers/nfc/pn544/Kconfig"
60source "drivers/nfc/microread/Kconfig" 60source "drivers/nfc/microread/Kconfig"
61source "drivers/nfc/nfcmrvl/Kconfig"
61 62
62endmenu 63endmenu
diff --git a/drivers/nfc/Makefile b/drivers/nfc/Makefile
index c715fe8582a8..56ab822ba03d 100644
--- a/drivers/nfc/Makefile
+++ b/drivers/nfc/Makefile
@@ -9,5 +9,6 @@ obj-$(CONFIG_NFC_WILINK) += nfcwilink.o
9obj-$(CONFIG_NFC_MEI_PHY) += mei_phy.o 9obj-$(CONFIG_NFC_MEI_PHY) += mei_phy.o
10obj-$(CONFIG_NFC_SIM) += nfcsim.o 10obj-$(CONFIG_NFC_SIM) += nfcsim.o
11obj-$(CONFIG_NFC_PORT100) += port100.o 11obj-$(CONFIG_NFC_PORT100) += port100.o
12obj-$(CONFIG_NFC_MRVL) += nfcmrvl/
12 13
13ccflags-$(CONFIG_NFC_DEBUG) := -DDEBUG 14ccflags-$(CONFIG_NFC_DEBUG) := -DDEBUG
diff --git a/drivers/nfc/mei_phy.c b/drivers/nfc/mei_phy.c
index 1d7860551985..11c7cbdade66 100644
--- a/drivers/nfc/mei_phy.c
+++ b/drivers/nfc/mei_phy.c
@@ -127,7 +127,7 @@ void nfc_mei_event_cb(struct mei_cl_device *device, u32 events, void *context)
127 127
128 reply_size = mei_cl_recv(device, skb->data, MEI_NFC_MAX_READ); 128 reply_size = mei_cl_recv(device, skb->data, MEI_NFC_MAX_READ);
129 if (reply_size < MEI_NFC_HEADER_SIZE) { 129 if (reply_size < MEI_NFC_HEADER_SIZE) {
130 kfree(skb); 130 kfree_skb(skb);
131 return; 131 return;
132 } 132 }
133 133
diff --git a/drivers/nfc/nfcmrvl/Kconfig b/drivers/nfc/nfcmrvl/Kconfig
new file mode 100644
index 000000000000..5e18afd9abe2
--- /dev/null
+++ b/drivers/nfc/nfcmrvl/Kconfig
@@ -0,0 +1,23 @@
1config NFC_MRVL
2 tristate "Marvell NFC driver support"
3 depends on NFC_NCI
4 help
5 The core driver to support Marvell NFC devices.
6
7 This driver is required if you want to support
8 Marvell NFC device 8897.
9
10 Say Y here to compile Marvell NFC driver into the kernel or
11 say M to compile it as module.
12
13config NFC_MRVL_USB
14 tristate "Marvell NFC-over-USB driver"
15 depends on NFC_MRVL && USB
16 help
17 Marvell NFC-over-USB driver.
18
19 This driver provides support for Marvell NFC-over-USB devices:
20 8897.
21
22 Say Y here to compile support for Marvell NFC-over-USB driver
23 into the kernel or say M to compile it as module.
diff --git a/drivers/nfc/nfcmrvl/Makefile b/drivers/nfc/nfcmrvl/Makefile
new file mode 100644
index 000000000000..97a0de72dc01
--- /dev/null
+++ b/drivers/nfc/nfcmrvl/Makefile
@@ -0,0 +1,9 @@
1#
2# Makefile for NFCMRVL NCI based NFC driver
3#
4
5nfcmrvl-y += main.o
6obj-$(CONFIG_NFC_MRVL) += nfcmrvl.o
7
8nfcmrvl_usb-y += usb.o
9obj-$(CONFIG_NFC_MRVL_USB) += nfcmrvl_usb.o
diff --git a/drivers/nfc/nfcmrvl/main.c b/drivers/nfc/nfcmrvl/main.c
new file mode 100644
index 000000000000..85e8bcf98693
--- /dev/null
+++ b/drivers/nfc/nfcmrvl/main.c
@@ -0,0 +1,165 @@
1/*
2 * Marvell NFC driver: major functions
3 *
4 * Copyright (C) 2014, Marvell International Ltd.
5 *
6 * This software file (the "File") is distributed by Marvell International
7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8 * (the "License"). You may use, redistribute and/or modify this File in
9 * accordance with the terms and conditions of the License, a copy of which
10 * is available on the worldwide web at
11 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12 *
13 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
14 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
15 * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
16 * this warranty disclaimer.
17 */
18
19#include <linux/module.h>
20#include <linux/nfc.h>
21#include <net/nfc/nci.h>
22#include <net/nfc/nci_core.h>
23#include "nfcmrvl.h"
24
25#define VERSION "1.0"
26
27static int nfcmrvl_nci_open(struct nci_dev *ndev)
28{
29 struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
30 int err;
31
32 if (test_and_set_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
33 return 0;
34
35 err = priv->if_ops->nci_open(priv);
36
37 if (err)
38 clear_bit(NFCMRVL_NCI_RUNNING, &priv->flags);
39
40 return err;
41}
42
43static int nfcmrvl_nci_close(struct nci_dev *ndev)
44{
45 struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
46
47 if (!test_and_clear_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
48 return 0;
49
50 priv->if_ops->nci_close(priv);
51
52 return 0;
53}
54
55static int nfcmrvl_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
56{
57 struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
58
59 nfc_info(priv->dev, "send entry, len %d\n", skb->len);
60
61 skb->dev = (void *)ndev;
62
63 if (!test_bit(NFCMRVL_NCI_RUNNING, &priv->flags))
64 return -EBUSY;
65
66 return priv->if_ops->nci_send(priv, skb);
67}
68
69static int nfcmrvl_nci_setup(struct nci_dev *ndev)
70{
71 __u8 val;
72
73 val = NFCMRVL_GPIO_PIN_NFC_NOT_ALLOWED;
74 nci_set_config(ndev, NFCMRVL_NOT_ALLOWED_ID, 1, &val);
75 val = NFCMRVL_GPIO_PIN_NFC_ACTIVE;
76 nci_set_config(ndev, NFCMRVL_ACTIVE_ID, 1, &val);
77 val = NFCMRVL_EXT_COEX_ENABLE;
78 nci_set_config(ndev, NFCMRVL_EXT_COEX_ID, 1, &val);
79
80 return 0;
81}
82
83static struct nci_ops nfcmrvl_nci_ops = {
84 .open = nfcmrvl_nci_open,
85 .close = nfcmrvl_nci_close,
86 .send = nfcmrvl_nci_send,
87 .setup = nfcmrvl_nci_setup,
88};
89
90struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
91 struct nfcmrvl_if_ops *ops,
92 struct device *dev)
93{
94 struct nfcmrvl_private *priv;
95 int rc;
96 u32 protocols;
97
98 priv = kzalloc(sizeof(*priv), GFP_KERNEL);
99 if (!priv)
100 return ERR_PTR(-ENOMEM);
101
102 priv->drv_data = drv_data;
103 priv->if_ops = ops;
104 priv->dev = dev;
105
106 protocols = NFC_PROTO_JEWEL_MASK
107 | NFC_PROTO_MIFARE_MASK | NFC_PROTO_FELICA_MASK
108 | NFC_PROTO_ISO14443_MASK
109 | NFC_PROTO_ISO14443_B_MASK
110 | NFC_PROTO_NFC_DEP_MASK;
111
112 priv->ndev = nci_allocate_device(&nfcmrvl_nci_ops, protocols, 0, 0);
113 if (!priv->ndev) {
114 nfc_err(dev, "nci_allocate_device failed");
115 rc = -ENOMEM;
116 goto error;
117 }
118
119 nci_set_drvdata(priv->ndev, priv);
120
121 rc = nci_register_device(priv->ndev);
122 if (rc) {
123 nfc_err(dev, "nci_register_device failed %d", rc);
124 nci_free_device(priv->ndev);
125 goto error;
126 }
127
128 nfc_info(dev, "registered with nci successfully\n");
129 return priv;
130
131error:
132 kfree(priv);
133 return ERR_PTR(rc);
134}
135EXPORT_SYMBOL_GPL(nfcmrvl_nci_register_dev);
136
137void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv)
138{
139 struct nci_dev *ndev = priv->ndev;
140
141 nci_unregister_device(ndev);
142 nci_free_device(ndev);
143 kfree(priv);
144}
145EXPORT_SYMBOL_GPL(nfcmrvl_nci_unregister_dev);
146
147int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, void *data, int count)
148{
149 struct sk_buff *skb;
150
151 skb = nci_skb_alloc(priv->ndev, count, GFP_ATOMIC);
152 if (!skb)
153 return -ENOMEM;
154
155 memcpy(skb_put(skb, count), data, count);
156 nci_recv_frame(priv->ndev, skb);
157
158 return count;
159}
160EXPORT_SYMBOL_GPL(nfcmrvl_nci_recv_frame);
161
162MODULE_AUTHOR("Marvell International Ltd.");
163MODULE_DESCRIPTION("Marvell NFC driver ver " VERSION);
164MODULE_VERSION(VERSION);
165MODULE_LICENSE("GPL v2");
diff --git a/drivers/nfc/nfcmrvl/nfcmrvl.h b/drivers/nfc/nfcmrvl/nfcmrvl.h
new file mode 100644
index 000000000000..54c4a956bd45
--- /dev/null
+++ b/drivers/nfc/nfcmrvl/nfcmrvl.h
@@ -0,0 +1,48 @@
1/**
2 * Marvell NFC driver
3 *
4 * Copyright (C) 2014, Marvell International Ltd.
5 *
6 * This software file (the "File") is distributed by Marvell International
7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8 * (the "License"). You may use, redistribute and/or modify this File in
9 * accordance with the terms and conditions of the License, a copy of which
10 * is available on the worldwide web at
11 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12 *
13 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
14 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
15 * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
16 * this warranty disclaimer.
17 **/
18
19/* Define private flags: */
20#define NFCMRVL_NCI_RUNNING 1
21
22#define NFCMRVL_EXT_COEX_ID 0xE0
23#define NFCMRVL_NOT_ALLOWED_ID 0xE1
24#define NFCMRVL_ACTIVE_ID 0xE2
25#define NFCMRVL_EXT_COEX_ENABLE 1
26#define NFCMRVL_GPIO_PIN_NFC_NOT_ALLOWED 0xA
27#define NFCMRVL_GPIO_PIN_NFC_ACTIVE 0xB
28#define NFCMRVL_NCI_MAX_EVENT_SIZE 260
29
30struct nfcmrvl_private {
31 struct nci_dev *ndev;
32 unsigned long flags;
33 void *drv_data;
34 struct device *dev;
35 struct nfcmrvl_if_ops *if_ops;
36};
37
38struct nfcmrvl_if_ops {
39 int (*nci_open) (struct nfcmrvl_private *priv);
40 int (*nci_close) (struct nfcmrvl_private *priv);
41 int (*nci_send) (struct nfcmrvl_private *priv, struct sk_buff *skb);
42};
43
44void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private *priv);
45int nfcmrvl_nci_recv_frame(struct nfcmrvl_private *priv, void *data, int count);
46struct nfcmrvl_private *nfcmrvl_nci_register_dev(void *drv_data,
47 struct nfcmrvl_if_ops *ops,
48 struct device *dev);
diff --git a/drivers/nfc/nfcmrvl/usb.c b/drivers/nfc/nfcmrvl/usb.c
new file mode 100644
index 000000000000..3221ca37d6c9
--- /dev/null
+++ b/drivers/nfc/nfcmrvl/usb.c
@@ -0,0 +1,459 @@
1/**
2 * Marvell NFC-over-USB driver: USB interface related functions
3 *
4 * Copyright (C) 2014, Marvell International Ltd.
5 *
6 * This software file (the "File") is distributed by Marvell International
7 * Ltd. under the terms of the GNU General Public License Version 2, June 1991
8 * (the "License"). You may use, redistribute and/or modify this File in
9 * accordance with the terms and conditions of the License, a copy of which
10 * is available on the worldwide web at
11 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
12 *
13 * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE
14 * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
15 * ARE EXPRESSLY DISCLAIMED. The License provides additional details about
16 * this warranty disclaimer.
17 **/
18
19#include <linux/module.h>
20#include <linux/usb.h>
21#include <linux/nfc.h>
22#include <net/nfc/nci.h>
23#include <net/nfc/nci_core.h>
24#include "nfcmrvl.h"
25
26#define VERSION "1.0"
27
28static struct usb_device_id nfcmrvl_table[] = {
29 { USB_DEVICE_INTERFACE_CLASS(0x1286, 0x2046, 0xff) },
30 { } /* Terminating entry */
31};
32
33MODULE_DEVICE_TABLE(usb, nfcmrvl_table);
34
35#define NFCMRVL_USB_BULK_RUNNING 1
36#define NFCMRVL_USB_SUSPENDING 2
37
38struct nfcmrvl_usb_drv_data {
39 struct usb_device *udev;
40 struct usb_interface *intf;
41 unsigned long flags;
42 struct work_struct waker;
43 struct usb_anchor tx_anchor;
44 struct usb_anchor bulk_anchor;
45 struct usb_anchor deferred;
46 int tx_in_flight;
47 /* protects tx_in_flight */
48 spinlock_t txlock;
49 struct usb_endpoint_descriptor *bulk_tx_ep;
50 struct usb_endpoint_descriptor *bulk_rx_ep;
51 int suspend_count;
52 struct nfcmrvl_private *priv;
53};
54
55static int nfcmrvl_inc_tx(struct nfcmrvl_usb_drv_data *drv_data)
56{
57 unsigned long flags;
58 int rv;
59
60 spin_lock_irqsave(&drv_data->txlock, flags);
61 rv = test_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags);
62 if (!rv)
63 drv_data->tx_in_flight++;
64 spin_unlock_irqrestore(&drv_data->txlock, flags);
65
66 return rv;
67}
68
69static void nfcmrvl_bulk_complete(struct urb *urb)
70{
71 struct nfcmrvl_usb_drv_data *drv_data = urb->context;
72 int err;
73
74 dev_dbg(&drv_data->udev->dev, "urb %p status %d count %d",
75 urb, urb->status, urb->actual_length);
76
77 if (!test_bit(NFCMRVL_NCI_RUNNING, &drv_data->flags))
78 return;
79
80 if (!urb->status) {
81 if (nfcmrvl_nci_recv_frame(drv_data->priv, urb->transfer_buffer,
82 urb->actual_length) < 0)
83 nfc_err(&drv_data->udev->dev, "corrupted Rx packet");
84 }
85
86 if (!test_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags))
87 return;
88
89 usb_anchor_urb(urb, &drv_data->bulk_anchor);
90 usb_mark_last_busy(drv_data->udev);
91
92 err = usb_submit_urb(urb, GFP_ATOMIC);
93 if (err) {
94 /* -EPERM: urb is being killed;
95 * -ENODEV: device got disconnected
96 */
97 if (err != -EPERM && err != -ENODEV)
98 nfc_err(&drv_data->udev->dev,
99 "urb %p failed to resubmit (%d)", urb, -err);
100 usb_unanchor_urb(urb);
101 }
102}
103
104static int
105nfcmrvl_submit_bulk_urb(struct nfcmrvl_usb_drv_data *drv_data, gfp_t mem_flags)
106{
107 struct urb *urb;
108 unsigned char *buf;
109 unsigned int pipe;
110 int err, size = NFCMRVL_NCI_MAX_EVENT_SIZE;
111
112 if (!drv_data->bulk_rx_ep)
113 return -ENODEV;
114
115 urb = usb_alloc_urb(0, mem_flags);
116 if (!urb)
117 return -ENOMEM;
118
119 buf = kmalloc(size, mem_flags);
120 if (!buf) {
121 usb_free_urb(urb);
122 return -ENOMEM;
123 }
124
125 pipe = usb_rcvbulkpipe(drv_data->udev,
126 drv_data->bulk_rx_ep->bEndpointAddress);
127
128 usb_fill_bulk_urb(urb, drv_data->udev, pipe, buf, size,
129 nfcmrvl_bulk_complete, drv_data);
130
131 urb->transfer_flags |= URB_FREE_BUFFER;
132
133 usb_mark_last_busy(drv_data->udev);
134 usb_anchor_urb(urb, &drv_data->bulk_anchor);
135
136 err = usb_submit_urb(urb, mem_flags);
137 if (err) {
138 if (err != -EPERM && err != -ENODEV)
139 nfc_err(&drv_data->udev->dev,
140 "urb %p submission failed (%d)", urb, -err);
141 usb_unanchor_urb(urb);
142 }
143
144 usb_free_urb(urb);
145
146 return err;
147}
148
149static void nfcmrvl_tx_complete(struct urb *urb)
150{
151 struct sk_buff *skb = urb->context;
152 struct nci_dev *ndev = (struct nci_dev *)skb->dev;
153 struct nfcmrvl_private *priv = nci_get_drvdata(ndev);
154 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data;
155
156 nfc_info(priv->dev, "urb %p status %d count %d",
157 urb, urb->status, urb->actual_length);
158
159 spin_lock(&drv_data->txlock);
160 drv_data->tx_in_flight--;
161 spin_unlock(&drv_data->txlock);
162
163 kfree(urb->setup_packet);
164 kfree_skb(skb);
165}
166
167static int nfcmrvl_usb_nci_open(struct nfcmrvl_private *priv)
168{
169 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data;
170 int err;
171
172 err = usb_autopm_get_interface(drv_data->intf);
173 if (err)
174 return err;
175
176 drv_data->intf->needs_remote_wakeup = 1;
177
178 err = nfcmrvl_submit_bulk_urb(drv_data, GFP_KERNEL);
179 if (err)
180 goto failed;
181
182 set_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags);
183 nfcmrvl_submit_bulk_urb(drv_data, GFP_KERNEL);
184
185 usb_autopm_put_interface(drv_data->intf);
186 return 0;
187
188failed:
189 usb_autopm_put_interface(drv_data->intf);
190 return err;
191}
192
193static void nfcmrvl_usb_stop_traffic(struct nfcmrvl_usb_drv_data *drv_data)
194{
195 usb_kill_anchored_urbs(&drv_data->bulk_anchor);
196}
197
198static int nfcmrvl_usb_nci_close(struct nfcmrvl_private *priv)
199{
200 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data;
201 int err;
202
203 cancel_work_sync(&drv_data->waker);
204
205 clear_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags);
206
207 nfcmrvl_usb_stop_traffic(drv_data);
208 usb_kill_anchored_urbs(&drv_data->tx_anchor);
209 err = usb_autopm_get_interface(drv_data->intf);
210 if (err)
211 goto failed;
212
213 drv_data->intf->needs_remote_wakeup = 0;
214 usb_autopm_put_interface(drv_data->intf);
215
216failed:
217 usb_scuttle_anchored_urbs(&drv_data->deferred);
218 return 0;
219}
220
221static int nfcmrvl_usb_nci_send(struct nfcmrvl_private *priv,
222 struct sk_buff *skb)
223{
224 struct nfcmrvl_usb_drv_data *drv_data = priv->drv_data;
225 struct urb *urb;
226 unsigned int pipe;
227 int err;
228
229 if (!drv_data->bulk_tx_ep)
230 return -ENODEV;
231
232 urb = usb_alloc_urb(0, GFP_ATOMIC);
233 if (!urb)
234 return -ENOMEM;
235
236 pipe = usb_sndbulkpipe(drv_data->udev,
237 drv_data->bulk_tx_ep->bEndpointAddress);
238
239 usb_fill_bulk_urb(urb, drv_data->udev, pipe, skb->data, skb->len,
240 nfcmrvl_tx_complete, skb);
241
242 err = nfcmrvl_inc_tx(drv_data);
243 if (err) {
244 usb_anchor_urb(urb, &drv_data->deferred);
245 schedule_work(&drv_data->waker);
246 err = 0;
247 goto done;
248 }
249
250 usb_anchor_urb(urb, &drv_data->tx_anchor);
251
252 err = usb_submit_urb(urb, GFP_ATOMIC);
253 if (err) {
254 if (err != -EPERM && err != -ENODEV)
255 nfc_err(&drv_data->udev->dev,
256 "urb %p submission failed (%d)", urb, -err);
257 kfree(urb->setup_packet);
258 usb_unanchor_urb(urb);
259 } else {
260 usb_mark_last_busy(drv_data->udev);
261 }
262
263done:
264 usb_free_urb(urb);
265 return err;
266}
267
268static struct nfcmrvl_if_ops usb_ops = {
269 .nci_open = nfcmrvl_usb_nci_open,
270 .nci_close = nfcmrvl_usb_nci_close,
271 .nci_send = nfcmrvl_usb_nci_send,
272};
273
274static void nfcmrvl_waker(struct work_struct *work)
275{
276 struct nfcmrvl_usb_drv_data *drv_data =
277 container_of(work, struct nfcmrvl_usb_drv_data, waker);
278 int err;
279
280 err = usb_autopm_get_interface(drv_data->intf);
281 if (err)
282 return;
283
284 usb_autopm_put_interface(drv_data->intf);
285}
286
287static int nfcmrvl_probe(struct usb_interface *intf,
288 const struct usb_device_id *id)
289{
290 struct usb_endpoint_descriptor *ep_desc;
291 struct nfcmrvl_usb_drv_data *drv_data;
292 struct nfcmrvl_private *priv;
293 int i;
294 struct usb_device *udev = interface_to_usbdev(intf);
295
296 nfc_info(&udev->dev, "intf %p id %p", intf, id);
297
298 drv_data = devm_kzalloc(&intf->dev, sizeof(*drv_data), GFP_KERNEL);
299 if (!drv_data)
300 return -ENOMEM;
301
302 for (i = 0; i < intf->cur_altsetting->desc.bNumEndpoints; i++) {
303 ep_desc = &intf->cur_altsetting->endpoint[i].desc;
304
305 if (!drv_data->bulk_tx_ep &&
306 usb_endpoint_is_bulk_out(ep_desc)) {
307 drv_data->bulk_tx_ep = ep_desc;
308 continue;
309 }
310
311 if (!drv_data->bulk_rx_ep &&
312 usb_endpoint_is_bulk_in(ep_desc)) {
313 drv_data->bulk_rx_ep = ep_desc;
314 continue;
315 }
316 }
317
318 if (!drv_data->bulk_tx_ep || !drv_data->bulk_rx_ep)
319 return -ENODEV;
320
321 drv_data->udev = udev;
322 drv_data->intf = intf;
323
324 INIT_WORK(&drv_data->waker, nfcmrvl_waker);
325 spin_lock_init(&drv_data->txlock);
326
327 init_usb_anchor(&drv_data->tx_anchor);
328 init_usb_anchor(&drv_data->bulk_anchor);
329 init_usb_anchor(&drv_data->deferred);
330
331 priv = nfcmrvl_nci_register_dev(drv_data, &usb_ops,
332 &drv_data->udev->dev);
333 if (IS_ERR(priv))
334 return PTR_ERR(priv);
335
336 drv_data->priv = priv;
337 priv->dev = &drv_data->udev->dev;
338
339 usb_set_intfdata(intf, drv_data);
340
341 return 0;
342}
343
344static void nfcmrvl_disconnect(struct usb_interface *intf)
345{
346 struct nfcmrvl_usb_drv_data *drv_data = usb_get_intfdata(intf);
347
348 if (!drv_data)
349 return;
350
351 nfc_info(&drv_data->udev->dev, "intf %p", intf);
352
353 nfcmrvl_nci_unregister_dev(drv_data->priv);
354
355 usb_set_intfdata(drv_data->intf, NULL);
356}
357
358#ifdef CONFIG_PM
359static int nfcmrvl_suspend(struct usb_interface *intf, pm_message_t message)
360{
361 struct nfcmrvl_usb_drv_data *drv_data = usb_get_intfdata(intf);
362
363 nfc_info(&drv_data->udev->dev, "intf %p", intf);
364
365 if (drv_data->suspend_count++)
366 return 0;
367
368 spin_lock_irq(&drv_data->txlock);
369 if (!(PMSG_IS_AUTO(message) && drv_data->tx_in_flight)) {
370 set_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags);
371 spin_unlock_irq(&drv_data->txlock);
372 } else {
373 spin_unlock_irq(&drv_data->txlock);
374 drv_data->suspend_count--;
375 return -EBUSY;
376 }
377
378 nfcmrvl_usb_stop_traffic(drv_data);
379 usb_kill_anchored_urbs(&drv_data->tx_anchor);
380
381 return 0;
382}
383
384static void nfcmrvl_play_deferred(struct nfcmrvl_usb_drv_data *drv_data)
385{
386 struct urb *urb;
387 int err;
388
389 while ((urb = usb_get_from_anchor(&drv_data->deferred))) {
390 err = usb_submit_urb(urb, GFP_ATOMIC);
391 if (err)
392 break;
393
394 drv_data->tx_in_flight++;
395 }
396 usb_scuttle_anchored_urbs(&drv_data->deferred);
397}
398
399static int nfcmrvl_resume(struct usb_interface *intf)
400{
401 struct nfcmrvl_usb_drv_data *drv_data = usb_get_intfdata(intf);
402 int err = 0;
403
404 nfc_info(&drv_data->udev->dev, "intf %p", intf);
405
406 if (--drv_data->suspend_count)
407 return 0;
408
409 if (!test_bit(NFCMRVL_NCI_RUNNING, &drv_data->flags))
410 goto done;
411
412 if (test_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags)) {
413 err = nfcmrvl_submit_bulk_urb(drv_data, GFP_NOIO);
414 if (err) {
415 clear_bit(NFCMRVL_USB_BULK_RUNNING, &drv_data->flags);
416 goto failed;
417 }
418
419 nfcmrvl_submit_bulk_urb(drv_data, GFP_NOIO);
420 }
421
422 spin_lock_irq(&drv_data->txlock);
423 nfcmrvl_play_deferred(drv_data);
424 clear_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags);
425 spin_unlock_irq(&drv_data->txlock);
426
427 return 0;
428
429failed:
430 usb_scuttle_anchored_urbs(&drv_data->deferred);
431done:
432 spin_lock_irq(&drv_data->txlock);
433 clear_bit(NFCMRVL_USB_SUSPENDING, &drv_data->flags);
434 spin_unlock_irq(&drv_data->txlock);
435
436 return err;
437}
438#endif
439
440static struct usb_driver nfcmrvl_usb_driver = {
441 .name = "nfcmrvl",
442 .probe = nfcmrvl_probe,
443 .disconnect = nfcmrvl_disconnect,
444#ifdef CONFIG_PM
445 .suspend = nfcmrvl_suspend,
446 .resume = nfcmrvl_resume,
447 .reset_resume = nfcmrvl_resume,
448#endif
449 .id_table = nfcmrvl_table,
450 .supports_autosuspend = 1,
451 .disable_hub_initiated_lpm = 1,
452 .soft_unbind = 1,
453};
454module_usb_driver(nfcmrvl_usb_driver);
455
456MODULE_AUTHOR("Marvell International Ltd.");
457MODULE_DESCRIPTION("Marvell NFC-over-USB driver ver " VERSION);
458MODULE_VERSION(VERSION);
459MODULE_LICENSE("GPL v2");
diff --git a/drivers/nfc/pn533.c b/drivers/nfc/pn533.c
index 3df19e657bc1..cf1a87bb74f8 100644
--- a/drivers/nfc/pn533.c
+++ b/drivers/nfc/pn533.c
@@ -521,6 +521,9 @@ static bool pn533_acr122_is_rx_frame_valid(void *_frame, struct pn533 *dev)
521 if (frame->ccid.type != 0x83) 521 if (frame->ccid.type != 0x83)
522 return false; 522 return false;
523 523
524 if (!frame->ccid.datalen)
525 return false;
526
524 if (frame->data[frame->ccid.datalen - 2] == 0x63) 527 if (frame->data[frame->ccid.datalen - 2] == 0x63)
525 return false; 528 return false;
526 529
diff --git a/drivers/nfc/pn544/pn544.c b/drivers/nfc/pn544/pn544.c
index 51e21a87cd84..3df4a109cfad 100644
--- a/drivers/nfc/pn544/pn544.c
+++ b/drivers/nfc/pn544/pn544.c
@@ -195,42 +195,42 @@ static int pn544_hci_ready(struct nfc_hci_dev *hdev)
195 195
196 {{0x9e, 0xaa}, 0x01}, 196 {{0x9e, 0xaa}, 0x01},
197 197
198 {{0x9b, 0xd1}, 0x0d}, 198 {{0x9b, 0xd1}, 0x17},
199 {{0x9b, 0xd2}, 0x24}, 199 {{0x9b, 0xd2}, 0x58},
200 {{0x9b, 0xd3}, 0x0a}, 200 {{0x9b, 0xd3}, 0x10},
201 {{0x9b, 0xd4}, 0x22}, 201 {{0x9b, 0xd4}, 0x47},
202 {{0x9b, 0xd5}, 0x08}, 202 {{0x9b, 0xd5}, 0x0c},
203 {{0x9b, 0xd6}, 0x1e}, 203 {{0x9b, 0xd6}, 0x37},
204 {{0x9b, 0xdd}, 0x1c}, 204 {{0x9b, 0xdd}, 0x33},
205 205
206 {{0x9b, 0x84}, 0x13}, 206 {{0x9b, 0x84}, 0x00},
207 {{0x99, 0x81}, 0x7f}, 207 {{0x99, 0x81}, 0x79},
208 {{0x99, 0x31}, 0x70}, 208 {{0x99, 0x31}, 0x79},
209 209
210 {{0x98, 0x00}, 0x3f}, 210 {{0x98, 0x00}, 0x3f},
211 211
212 {{0x9f, 0x09}, 0x00}, 212 {{0x9f, 0x09}, 0x02},
213 213
214 {{0x9f, 0x0a}, 0x05}, 214 {{0x9f, 0x0a}, 0x05},
215 215
216 {{0x9e, 0xd1}, 0xa1}, 216 {{0x9e, 0xd1}, 0xa1},
217 {{0x99, 0x23}, 0x00}, 217 {{0x99, 0x23}, 0x01},
218
219 {{0x9e, 0x74}, 0x80},
220 218
219 {{0x9e, 0x74}, 0x00},
220 {{0x9e, 0x90}, 0x00},
221 {{0x9f, 0x28}, 0x10}, 221 {{0x9f, 0x28}, 0x10},
222 222
223 {{0x9f, 0x35}, 0x14}, 223 {{0x9f, 0x35}, 0x04},
224 224
225 {{0x9f, 0x36}, 0x60}, 225 {{0x9f, 0x36}, 0x11},
226 226
227 {{0x9c, 0x31}, 0x00}, 227 {{0x9c, 0x31}, 0x00},
228 228
229 {{0x9c, 0x32}, 0xc8}, 229 {{0x9c, 0x32}, 0x00},
230 230
231 {{0x9c, 0x19}, 0x40}, 231 {{0x9c, 0x19}, 0x0a},
232 232
233 {{0x9c, 0x1a}, 0x40}, 233 {{0x9c, 0x1a}, 0x0a},
234 234
235 {{0x9c, 0x0c}, 0x00}, 235 {{0x9c, 0x0c}, 0x00},
236 236
@@ -240,13 +240,13 @@ static int pn544_hci_ready(struct nfc_hci_dev *hdev)
240 240
241 {{0x9c, 0x13}, 0x00}, 241 {{0x9c, 0x13}, 0x00},
242 242
243 {{0x98, 0xa2}, 0x0e}, 243 {{0x98, 0xa2}, 0x09},
244 244
245 {{0x98, 0x93}, 0x40}, 245 {{0x98, 0x93}, 0x00},
246 246
247 {{0x98, 0x7d}, 0x02}, 247 {{0x98, 0x7d}, 0x08},
248 {{0x98, 0x7e}, 0x00}, 248 {{0x98, 0x7e}, 0x00},
249 {{0x9f, 0xc8}, 0x01}, 249 {{0x9f, 0xc8}, 0x00},
250 }; 250 };
251 struct hw_config *p = hw_config; 251 struct hw_config *p = hw_config;
252 int count = ARRAY_SIZE(hw_config); 252 int count = ARRAY_SIZE(hw_config);
diff --git a/drivers/nfc/port100.c b/drivers/nfc/port100.c
index 8a0571eb2627..a8555f81cbba 100644
--- a/drivers/nfc/port100.c
+++ b/drivers/nfc/port100.c
@@ -1509,6 +1509,7 @@ static void port100_disconnect(struct usb_interface *interface)
1509 1509
1510 usb_free_urb(dev->in_urb); 1510 usb_free_urb(dev->in_urb);
1511 usb_free_urb(dev->out_urb); 1511 usb_free_urb(dev->out_urb);
1512 usb_put_dev(dev->udev);
1512 1513
1513 kfree(dev->cmd); 1514 kfree(dev->cmd);
1514 1515
diff --git a/drivers/staging/winbond/wbusb.c b/drivers/staging/winbond/wbusb.c
index 07891a3e316e..0d29624416c3 100644
--- a/drivers/staging/winbond/wbusb.c
+++ b/drivers/staging/winbond/wbusb.c
@@ -788,7 +788,6 @@ static int wb35_probe(struct usb_interface *intf,
788 dev->flags = IEEE80211_HW_SIGNAL_UNSPEC; 788 dev->flags = IEEE80211_HW_SIGNAL_UNSPEC;
789 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); 789 dev->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
790 790
791 dev->channel_change_time = 1000;
792 dev->max_signal = 100; 791 dev->max_signal = 100;
793 dev->queues = 1; 792 dev->queues = 1;
794 793
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h
index 776cbb80d098..e526a8cecb70 100644
--- a/include/linux/ieee80211.h
+++ b/include/linux/ieee80211.h
@@ -1857,6 +1857,7 @@ enum ieee80211_key_len {
1857 WLAN_KEY_LEN_CCMP = 16, 1857 WLAN_KEY_LEN_CCMP = 16,
1858 WLAN_KEY_LEN_TKIP = 32, 1858 WLAN_KEY_LEN_TKIP = 32,
1859 WLAN_KEY_LEN_AES_CMAC = 16, 1859 WLAN_KEY_LEN_AES_CMAC = 16,
1860 WLAN_KEY_LEN_SMS4 = 32,
1860}; 1861};
1861 1862
1862#define IEEE80211_WEP_IV_LEN 4 1863#define IEEE80211_WEP_IV_LEN 4
@@ -1902,6 +1903,7 @@ enum ieee80211_tdls_actioncode {
1902#define WLAN_EXT_CAPA5_TDLS_PROHIBITED BIT(6) 1903#define WLAN_EXT_CAPA5_TDLS_PROHIBITED BIT(6)
1903 1904
1904#define WLAN_EXT_CAPA8_OPMODE_NOTIF BIT(6) 1905#define WLAN_EXT_CAPA8_OPMODE_NOTIF BIT(6)
1906#define WLAN_EXT_CAPA8_TDLS_WIDE_BW_ENABLED BIT(7)
1905 1907
1906/* TDLS specific payload type in the LLC/SNAP header */ 1908/* TDLS specific payload type in the LLC/SNAP header */
1907#define WLAN_TDLS_SNAP_RFTYPE 0x2 1909#define WLAN_TDLS_SNAP_RFTYPE 0x2
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
index 56c597793d6d..b1f84b05c67e 100644
--- a/include/net/cfg80211.h
+++ b/include/net/cfg80211.h
@@ -4640,6 +4640,14 @@ void cfg80211_report_wowlan_wakeup(struct wireless_dev *wdev,
4640 */ 4640 */
4641void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp); 4641void cfg80211_crit_proto_stopped(struct wireless_dev *wdev, gfp_t gfp);
4642 4642
4643/**
4644 * ieee80211_get_num_supported_channels - get number of channels device has
4645 * @wiphy: the wiphy
4646 *
4647 * Return: the number of channels supported by the device.
4648 */
4649unsigned int ieee80211_get_num_supported_channels(struct wiphy *wiphy);
4650
4643/* Logging, debugging and troubleshooting/diagnostic helpers. */ 4651/* Logging, debugging and troubleshooting/diagnostic helpers. */
4644 4652
4645/* wiphy_printk helpers, similar to dev_printk */ 4653/* wiphy_printk helpers, similar to dev_printk */
diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index f838af816b56..f4ab2fb4d50c 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -1616,8 +1616,6 @@ enum ieee80211_hw_flags {
1616 * @extra_beacon_tailroom: tailroom to reserve in each beacon tx skb. 1616 * @extra_beacon_tailroom: tailroom to reserve in each beacon tx skb.
1617 * Can be used by drivers to add extra IEs. 1617 * Can be used by drivers to add extra IEs.
1618 * 1618 *
1619 * @channel_change_time: time (in microseconds) it takes to change channels.
1620 *
1621 * @max_signal: Maximum value for signal (rssi) in RX information, used 1619 * @max_signal: Maximum value for signal (rssi) in RX information, used
1622 * only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB 1620 * only when @IEEE80211_HW_SIGNAL_UNSPEC or @IEEE80211_HW_SIGNAL_DB
1623 * 1621 *
@@ -1699,7 +1697,6 @@ struct ieee80211_hw {
1699 u32 flags; 1697 u32 flags;
1700 unsigned int extra_tx_headroom; 1698 unsigned int extra_tx_headroom;
1701 unsigned int extra_beacon_tailroom; 1699 unsigned int extra_beacon_tailroom;
1702 int channel_change_time;
1703 int vif_data_size; 1700 int vif_data_size;
1704 int sta_data_size; 1701 int sta_data_size;
1705 int chanctx_data_size; 1702 int chanctx_data_size;
@@ -2122,6 +2119,11 @@ void ieee80211_free_txskb(struct ieee80211_hw *hw, struct sk_buff *skb);
2122 * appropriately (only the last frame may have %IEEE80211_TX_STATUS_EOSP) 2119 * appropriately (only the last frame may have %IEEE80211_TX_STATUS_EOSP)
2123 * and also take care of the EOSP and MORE_DATA bits in the frame. 2120 * and also take care of the EOSP and MORE_DATA bits in the frame.
2124 * The driver may also use ieee80211_sta_eosp() in this case. 2121 * The driver may also use ieee80211_sta_eosp() in this case.
2122 *
2123 * Note that if the driver ever buffers frames other than QoS-data
2124 * frames, it must take care to never send a non-QoS-data frame as
2125 * the last frame in a service period, adding a QoS-nulldata frame
2126 * after a non-QoS-data frame if needed.
2125 */ 2127 */
2126 2128
2127/** 2129/**
diff --git a/include/net/nfc/digital.h b/include/net/nfc/digital.h
index 36acecd5f06c..81af21e9bcd4 100644
--- a/include/net/nfc/digital.h
+++ b/include/net/nfc/digital.h
@@ -122,6 +122,16 @@ typedef void (*nfc_digital_cmd_complete_t)(struct nfc_digital_dev *ddev,
122 * switch_rf to turn the radio on. A call to in|tg_configure_hw must turn 122 * switch_rf to turn the radio on. A call to in|tg_configure_hw must turn
123 * the device radio on. 123 * the device radio on.
124 * @abort_cmd: Discard the last sent command. 124 * @abort_cmd: Discard the last sent command.
125 *
126 * Notes: Asynchronous functions have a timeout parameter. It is the driver
127 * responsibility to call the digital stack back through the
128 * nfc_digital_cmd_complete_t callback when no RF respsonse has been
129 * received within the specified time (in milliseconds). In that case the
130 * driver must set the resp sk_buff to ERR_PTR(-ETIMEDOUT).
131 * Since the digital stack serializes commands to be sent, it's mandatory
132 * for the driver to handle the timeout correctly. Otherwise the stack
133 * would not be able to send new commands, waiting for the reply of the
134 * current one.
125 */ 135 */
126struct nfc_digital_ops { 136struct nfc_digital_ops {
127 int (*in_configure_hw)(struct nfc_digital_dev *ddev, int type, 137 int (*in_configure_hw)(struct nfc_digital_dev *ddev, int type,
diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h
index 0ff070e8f8de..1f9a0f5272fe 100644
--- a/include/net/nfc/nci_core.h
+++ b/include/net/nfc/nci_core.h
@@ -67,6 +67,7 @@ struct nci_ops {
67 int (*open)(struct nci_dev *ndev); 67 int (*open)(struct nci_dev *ndev);
68 int (*close)(struct nci_dev *ndev); 68 int (*close)(struct nci_dev *ndev);
69 int (*send)(struct nci_dev *ndev, struct sk_buff *skb); 69 int (*send)(struct nci_dev *ndev, struct sk_buff *skb);
70 int (*setup)(struct nci_dev *ndev);
70}; 71};
71 72
72#define NCI_MAX_SUPPORTED_RF_INTERFACES 4 73#define NCI_MAX_SUPPORTED_RF_INTERFACES 4
@@ -153,6 +154,7 @@ void nci_free_device(struct nci_dev *ndev);
153int nci_register_device(struct nci_dev *ndev); 154int nci_register_device(struct nci_dev *ndev);
154void nci_unregister_device(struct nci_dev *ndev); 155void nci_unregister_device(struct nci_dev *ndev);
155int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb); 156int nci_recv_frame(struct nci_dev *ndev, struct sk_buff *skb);
157int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val);
156 158
157static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev, 159static inline struct sk_buff *nci_skb_alloc(struct nci_dev *ndev,
158 unsigned int len, 160 unsigned int len,
diff --git a/include/net/regulatory.h b/include/net/regulatory.h
index c96a0b86f342..b07cdc9fa454 100644
--- a/include/net/regulatory.h
+++ b/include/net/regulatory.h
@@ -96,6 +96,10 @@ struct regulatory_request {
96 * initiator is %REGDOM_SET_BY_CORE). Drivers that use 96 * initiator is %REGDOM_SET_BY_CORE). Drivers that use
97 * wiphy_apply_custom_regulatory() should have this flag set 97 * wiphy_apply_custom_regulatory() should have this flag set
98 * or the regulatory core will set it for the wiphy. 98 * or the regulatory core will set it for the wiphy.
99 * If you use regulatory_hint() *after* using
100 * wiphy_apply_custom_regulatory() the wireless core will
101 * clear the REGULATORY_CUSTOM_REG for your wiphy as it would be
102 * implied that the device somehow gained knowledge of its region.
99 * @REGULATORY_STRICT_REG: tells us that the wiphy for this device 103 * @REGULATORY_STRICT_REG: tells us that the wiphy for this device
100 * has regulatory domain that it wishes to be considered as the 104 * has regulatory domain that it wishes to be considered as the
101 * superset for regulatory rules. After this device gets its regulatory 105 * superset for regulatory rules. After this device gets its regulatory
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index 09d2e58a2ba7..f9ae9b85d4c1 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -1035,6 +1035,7 @@ static int ieee80211_start_ap(struct wiphy *wiphy, struct net_device *dev,
1035 return err; 1035 return err;
1036 } 1036 }
1037 1037
1038 ieee80211_recalc_dtim(local, sdata);
1038 ieee80211_bss_info_change_notify(sdata, changed); 1039 ieee80211_bss_info_change_notify(sdata, changed);
1039 1040
1040 netif_carrier_on(dev); 1041 netif_carrier_on(dev);
@@ -3854,7 +3855,7 @@ static int ieee80211_set_qos_map(struct wiphy *wiphy,
3854 new_qos_map = NULL; 3855 new_qos_map = NULL;
3855 } 3856 }
3856 3857
3857 old_qos_map = rtnl_dereference(sdata->qos_map); 3858 old_qos_map = sdata_dereference(sdata->qos_map, sdata);
3858 rcu_assign_pointer(sdata->qos_map, new_qos_map); 3859 rcu_assign_pointer(sdata->qos_map, new_qos_map);
3859 if (old_qos_map) 3860 if (old_qos_map)
3860 kfree_rcu(old_qos_map, rcu_head); 3861 kfree_rcu(old_qos_map, rcu_head);
diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c
index 04b5a14c8a05..ebf80f3abd83 100644
--- a/net/mac80211/debugfs_netdev.c
+++ b/net/mac80211/debugfs_netdev.c
@@ -133,7 +133,15 @@ static ssize_t ieee80211_if_fmt_##name( \
133 jiffies_to_msecs(sdata->field)); \ 133 jiffies_to_msecs(sdata->field)); \
134} 134}
135 135
136#define __IEEE80211_IF_FILE(name, _write) \ 136#define _IEEE80211_IF_FILE_OPS(name, _read, _write) \
137static const struct file_operations name##_ops = { \
138 .read = (_read), \
139 .write = (_write), \
140 .open = simple_open, \
141 .llseek = generic_file_llseek, \
142}
143
144#define _IEEE80211_IF_FILE_R_FN(name) \
137static ssize_t ieee80211_if_read_##name(struct file *file, \ 145static ssize_t ieee80211_if_read_##name(struct file *file, \
138 char __user *userbuf, \ 146 char __user *userbuf, \
139 size_t count, loff_t *ppos) \ 147 size_t count, loff_t *ppos) \
@@ -141,28 +149,34 @@ static ssize_t ieee80211_if_read_##name(struct file *file, \
141 return ieee80211_if_read(file->private_data, \ 149 return ieee80211_if_read(file->private_data, \
142 userbuf, count, ppos, \ 150 userbuf, count, ppos, \
143 ieee80211_if_fmt_##name); \ 151 ieee80211_if_fmt_##name); \
144} \
145static const struct file_operations name##_ops = { \
146 .read = ieee80211_if_read_##name, \
147 .write = (_write), \
148 .open = simple_open, \
149 .llseek = generic_file_llseek, \
150} 152}
151 153
152#define __IEEE80211_IF_FILE_W(name) \ 154#define _IEEE80211_IF_FILE_W_FN(name) \
153static ssize_t ieee80211_if_write_##name(struct file *file, \ 155static ssize_t ieee80211_if_write_##name(struct file *file, \
154 const char __user *userbuf, \ 156 const char __user *userbuf, \
155 size_t count, loff_t *ppos) \ 157 size_t count, loff_t *ppos) \
156{ \ 158{ \
157 return ieee80211_if_write(file->private_data, userbuf, count, \ 159 return ieee80211_if_write(file->private_data, userbuf, count, \
158 ppos, ieee80211_if_parse_##name); \ 160 ppos, ieee80211_if_parse_##name); \
159} \ 161}
160__IEEE80211_IF_FILE(name, ieee80211_if_write_##name) 162
163#define IEEE80211_IF_FILE_R(name) \
164 _IEEE80211_IF_FILE_R_FN(name) \
165 _IEEE80211_IF_FILE_OPS(name, ieee80211_if_read_##name, NULL)
166
167#define IEEE80211_IF_FILE_W(name) \
168 _IEEE80211_IF_FILE_W_FN(name) \
169 _IEEE80211_IF_FILE_OPS(name, NULL, ieee80211_if_write_##name)
161 170
171#define IEEE80211_IF_FILE_RW(name) \
172 _IEEE80211_IF_FILE_R_FN(name) \
173 _IEEE80211_IF_FILE_W_FN(name) \
174 _IEEE80211_IF_FILE_OPS(name, ieee80211_if_read_##name, \
175 ieee80211_if_write_##name)
162 176
163#define IEEE80211_IF_FILE(name, field, format) \ 177#define IEEE80211_IF_FILE(name, field, format) \
164 IEEE80211_IF_FMT_##format(name, field) \ 178 IEEE80211_IF_FMT_##format(name, field) \
165 __IEEE80211_IF_FILE(name, NULL) 179 IEEE80211_IF_FILE_R(name)
166 180
167/* common attributes */ 181/* common attributes */
168IEEE80211_IF_FILE(drop_unencrypted, drop_unencrypted, DEC); 182IEEE80211_IF_FILE(drop_unencrypted, drop_unencrypted, DEC);
@@ -199,7 +213,7 @@ ieee80211_if_fmt_hw_queues(const struct ieee80211_sub_if_data *sdata,
199 213
200 return len; 214 return len;
201} 215}
202__IEEE80211_IF_FILE(hw_queues, NULL); 216IEEE80211_IF_FILE_R(hw_queues);
203 217
204/* STA attributes */ 218/* STA attributes */
205IEEE80211_IF_FILE(bssid, u.mgd.bssid, MAC); 219IEEE80211_IF_FILE(bssid, u.mgd.bssid, MAC);
@@ -275,14 +289,7 @@ static ssize_t ieee80211_if_parse_smps(struct ieee80211_sub_if_data *sdata,
275 289
276 return -EINVAL; 290 return -EINVAL;
277} 291}
278 292IEEE80211_IF_FILE_RW(smps);
279__IEEE80211_IF_FILE_W(smps);
280
281static ssize_t ieee80211_if_fmt_tkip_mic_test(
282 const struct ieee80211_sub_if_data *sdata, char *buf, int buflen)
283{
284 return -EOPNOTSUPP;
285}
286 293
287static ssize_t ieee80211_if_parse_tkip_mic_test( 294static ssize_t ieee80211_if_parse_tkip_mic_test(
288 struct ieee80211_sub_if_data *sdata, const char *buf, int buflen) 295 struct ieee80211_sub_if_data *sdata, const char *buf, int buflen)
@@ -349,8 +356,7 @@ static ssize_t ieee80211_if_parse_tkip_mic_test(
349 356
350 return buflen; 357 return buflen;
351} 358}
352 359IEEE80211_IF_FILE_W(tkip_mic_test);
353__IEEE80211_IF_FILE_W(tkip_mic_test);
354 360
355static ssize_t ieee80211_if_fmt_uapsd_queues( 361static ssize_t ieee80211_if_fmt_uapsd_queues(
356 const struct ieee80211_sub_if_data *sdata, char *buf, int buflen) 362 const struct ieee80211_sub_if_data *sdata, char *buf, int buflen)
@@ -378,7 +384,7 @@ static ssize_t ieee80211_if_parse_uapsd_queues(
378 384
379 return buflen; 385 return buflen;
380} 386}
381__IEEE80211_IF_FILE_W(uapsd_queues); 387IEEE80211_IF_FILE_RW(uapsd_queues);
382 388
383static ssize_t ieee80211_if_fmt_uapsd_max_sp_len( 389static ssize_t ieee80211_if_fmt_uapsd_max_sp_len(
384 const struct ieee80211_sub_if_data *sdata, char *buf, int buflen) 390 const struct ieee80211_sub_if_data *sdata, char *buf, int buflen)
@@ -406,7 +412,7 @@ static ssize_t ieee80211_if_parse_uapsd_max_sp_len(
406 412
407 return buflen; 413 return buflen;
408} 414}
409__IEEE80211_IF_FILE_W(uapsd_max_sp_len); 415IEEE80211_IF_FILE_RW(uapsd_max_sp_len);
410 416
411/* AP attributes */ 417/* AP attributes */
412IEEE80211_IF_FILE(num_mcast_sta, u.ap.num_mcast_sta, ATOMIC); 418IEEE80211_IF_FILE(num_mcast_sta, u.ap.num_mcast_sta, ATOMIC);
@@ -419,7 +425,7 @@ static ssize_t ieee80211_if_fmt_num_buffered_multicast(
419 return scnprintf(buf, buflen, "%u\n", 425 return scnprintf(buf, buflen, "%u\n",
420 skb_queue_len(&sdata->u.ap.ps.bc_buf)); 426 skb_queue_len(&sdata->u.ap.ps.bc_buf));
421} 427}
422__IEEE80211_IF_FILE(num_buffered_multicast, NULL); 428IEEE80211_IF_FILE_R(num_buffered_multicast);
423 429
424/* IBSS attributes */ 430/* IBSS attributes */
425static ssize_t ieee80211_if_fmt_tsf( 431static ssize_t ieee80211_if_fmt_tsf(
@@ -468,9 +474,10 @@ static ssize_t ieee80211_if_parse_tsf(
468 } 474 }
469 } 475 }
470 476
477 ieee80211_recalc_dtim(local, sdata);
471 return buflen; 478 return buflen;
472} 479}
473__IEEE80211_IF_FILE_W(tsf); 480IEEE80211_IF_FILE_RW(tsf);
474 481
475 482
476/* WDS attributes */ 483/* WDS attributes */
diff --git a/net/mac80211/ht.c b/net/mac80211/ht.c
index 9a8be8f69224..fab7b91923e0 100644
--- a/net/mac80211/ht.c
+++ b/net/mac80211/ht.c
@@ -479,10 +479,9 @@ void ieee80211_request_smps(struct ieee80211_vif *vif,
479 vif->type != NL80211_IFTYPE_AP)) 479 vif->type != NL80211_IFTYPE_AP))
480 return; 480 return;
481 481
482 if (WARN_ON(smps_mode == IEEE80211_SMPS_OFF))
483 smps_mode = IEEE80211_SMPS_AUTOMATIC;
484
485 if (vif->type == NL80211_IFTYPE_STATION) { 482 if (vif->type == NL80211_IFTYPE_STATION) {
483 if (WARN_ON(smps_mode == IEEE80211_SMPS_OFF))
484 smps_mode = IEEE80211_SMPS_AUTOMATIC;
486 if (sdata->u.mgd.driver_smps_mode == smps_mode) 485 if (sdata->u.mgd.driver_smps_mode == smps_mode)
487 return; 486 return;
488 sdata->u.mgd.driver_smps_mode = smps_mode; 487 sdata->u.mgd.driver_smps_mode = smps_mode;
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
index 953b9e294547..3701930c6649 100644
--- a/net/mac80211/ieee80211_i.h
+++ b/net/mac80211/ieee80211_i.h
@@ -1800,6 +1800,8 @@ ieee80211_cs_get(struct ieee80211_local *local, u32 cipher,
1800int ieee80211_cs_headroom(struct ieee80211_local *local, 1800int ieee80211_cs_headroom(struct ieee80211_local *local,
1801 struct cfg80211_crypto_settings *crypto, 1801 struct cfg80211_crypto_settings *crypto,
1802 enum nl80211_iftype iftype); 1802 enum nl80211_iftype iftype);
1803void ieee80211_recalc_dtim(struct ieee80211_local *local,
1804 struct ieee80211_sub_if_data *sdata);
1803 1805
1804#ifdef CONFIG_MAC80211_NOINLINE 1806#ifdef CONFIG_MAC80211_NOINLINE
1805#define debug_noinline noinline 1807#define debug_noinline noinline
diff --git a/net/mac80211/main.c b/net/mac80211/main.c
index 2bd5b552b2f6..d767cfb9b45f 100644
--- a/net/mac80211/main.c
+++ b/net/mac80211/main.c
@@ -846,17 +846,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
846 /* TODO: consider VHT for RX chains, hopefully it's the same */ 846 /* TODO: consider VHT for RX chains, hopefully it's the same */
847 } 847 }
848 848
849 local->int_scan_req = kzalloc(sizeof(*local->int_scan_req) +
850 sizeof(void *) * channels, GFP_KERNEL);
851 if (!local->int_scan_req)
852 return -ENOMEM;
853
854 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
855 if (!local->hw.wiphy->bands[band])
856 continue;
857 local->int_scan_req->rates[band] = (u32) -1;
858 }
859
860 /* if low-level driver supports AP, we also support VLAN */ 849 /* if low-level driver supports AP, we also support VLAN */
861 if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) { 850 if (local->hw.wiphy->interface_modes & BIT(NL80211_IFTYPE_AP)) {
862 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN); 851 hw->wiphy->interface_modes |= BIT(NL80211_IFTYPE_AP_VLAN);
@@ -880,6 +869,17 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
880 return -EINVAL; 869 return -EINVAL;
881 } 870 }
882 871
872 local->int_scan_req = kzalloc(sizeof(*local->int_scan_req) +
873 sizeof(void *) * channels, GFP_KERNEL);
874 if (!local->int_scan_req)
875 return -ENOMEM;
876
877 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
878 if (!local->hw.wiphy->bands[band])
879 continue;
880 local->int_scan_req->rates[band] = (u32) -1;
881 }
882
883#ifndef CONFIG_MAC80211_MESH 883#ifndef CONFIG_MAC80211_MESH
884 /* mesh depends on Kconfig, but drivers should set it if they want */ 884 /* mesh depends on Kconfig, but drivers should set it if they want */
885 local->hw.wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MESH_POINT); 885 local->hw.wiphy->interface_modes &= ~BIT(NL80211_IFTYPE_MESH_POINT);
diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c
index 5a74b249ba35..5b919cab1de0 100644
--- a/net/mac80211/mesh.c
+++ b/net/mac80211/mesh.c
@@ -807,6 +807,7 @@ int ieee80211_start_mesh(struct ieee80211_sub_if_data *sdata)
807 return -ENOMEM; 807 return -ENOMEM;
808 } 808 }
809 809
810 ieee80211_recalc_dtim(local, sdata);
810 ieee80211_bss_info_change_notify(sdata, changed); 811 ieee80211_bss_info_change_notify(sdata, changed);
811 812
812 netif_carrier_on(sdata->dev); 813 netif_carrier_on(sdata->dev);
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c
index cf83217103f9..e8f60aa2e848 100644
--- a/net/mac80211/mesh_plink.c
+++ b/net/mac80211/mesh_plink.c
@@ -437,6 +437,7 @@ __mesh_sta_info_alloc(struct ieee80211_sub_if_data *sdata, u8 *hw_addr)
437 sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED); 437 sta_info_pre_move_state(sta, IEEE80211_STA_AUTHORIZED);
438 438
439 set_sta_flag(sta, WLAN_STA_WME); 439 set_sta_flag(sta, WLAN_STA_WME);
440 sta->sta.wme = true;
440 441
441 return sta; 442 return sta;
442} 443}
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
index 5a2afe9583a8..c24ca0d0f469 100644
--- a/net/mac80211/rx.c
+++ b/net/mac80211/rx.c
@@ -3076,8 +3076,8 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
3076 3076
3077/* main receive path */ 3077/* main receive path */
3078 3078
3079static int prepare_for_handlers(struct ieee80211_rx_data *rx, 3079static bool prepare_for_handlers(struct ieee80211_rx_data *rx,
3080 struct ieee80211_hdr *hdr) 3080 struct ieee80211_hdr *hdr)
3081{ 3081{
3082 struct ieee80211_sub_if_data *sdata = rx->sdata; 3082 struct ieee80211_sub_if_data *sdata = rx->sdata;
3083 struct sk_buff *skb = rx->skb; 3083 struct sk_buff *skb = rx->skb;
@@ -3088,29 +3088,29 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
3088 switch (sdata->vif.type) { 3088 switch (sdata->vif.type) {
3089 case NL80211_IFTYPE_STATION: 3089 case NL80211_IFTYPE_STATION:
3090 if (!bssid && !sdata->u.mgd.use_4addr) 3090 if (!bssid && !sdata->u.mgd.use_4addr)
3091 return 0; 3091 return false;
3092 if (!multicast && 3092 if (!multicast &&
3093 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { 3093 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
3094 if (!(sdata->dev->flags & IFF_PROMISC) || 3094 if (!(sdata->dev->flags & IFF_PROMISC) ||
3095 sdata->u.mgd.use_4addr) 3095 sdata->u.mgd.use_4addr)
3096 return 0; 3096 return false;
3097 status->rx_flags &= ~IEEE80211_RX_RA_MATCH; 3097 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
3098 } 3098 }
3099 break; 3099 break;
3100 case NL80211_IFTYPE_ADHOC: 3100 case NL80211_IFTYPE_ADHOC:
3101 if (!bssid) 3101 if (!bssid)
3102 return 0; 3102 return false;
3103 if (ether_addr_equal(sdata->vif.addr, hdr->addr2) || 3103 if (ether_addr_equal(sdata->vif.addr, hdr->addr2) ||
3104 ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2)) 3104 ether_addr_equal(sdata->u.ibss.bssid, hdr->addr2))
3105 return 0; 3105 return false;
3106 if (ieee80211_is_beacon(hdr->frame_control)) { 3106 if (ieee80211_is_beacon(hdr->frame_control)) {
3107 return 1; 3107 return true;
3108 } else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) { 3108 } else if (!ieee80211_bssid_match(bssid, sdata->u.ibss.bssid)) {
3109 return 0; 3109 return false;
3110 } else if (!multicast && 3110 } else if (!multicast &&
3111 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { 3111 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
3112 if (!(sdata->dev->flags & IFF_PROMISC)) 3112 if (!(sdata->dev->flags & IFF_PROMISC))
3113 return 0; 3113 return false;
3114 status->rx_flags &= ~IEEE80211_RX_RA_MATCH; 3114 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
3115 } else if (!rx->sta) { 3115 } else if (!rx->sta) {
3116 int rate_idx; 3116 int rate_idx;
@@ -3126,7 +3126,7 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
3126 if (!multicast && 3126 if (!multicast &&
3127 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) { 3127 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) {
3128 if (!(sdata->dev->flags & IFF_PROMISC)) 3128 if (!(sdata->dev->flags & IFF_PROMISC))
3129 return 0; 3129 return false;
3130 3130
3131 status->rx_flags &= ~IEEE80211_RX_RA_MATCH; 3131 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
3132 } 3132 }
@@ -3135,7 +3135,7 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
3135 case NL80211_IFTYPE_AP: 3135 case NL80211_IFTYPE_AP:
3136 if (!bssid) { 3136 if (!bssid) {
3137 if (!ether_addr_equal(sdata->vif.addr, hdr->addr1)) 3137 if (!ether_addr_equal(sdata->vif.addr, hdr->addr1))
3138 return 0; 3138 return false;
3139 } else if (!ieee80211_bssid_match(bssid, sdata->vif.addr)) { 3139 } else if (!ieee80211_bssid_match(bssid, sdata->vif.addr)) {
3140 /* 3140 /*
3141 * Accept public action frames even when the 3141 * Accept public action frames even when the
@@ -3145,26 +3145,26 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
3145 */ 3145 */
3146 if (!multicast && 3146 if (!multicast &&
3147 !ether_addr_equal(sdata->vif.addr, hdr->addr1)) 3147 !ether_addr_equal(sdata->vif.addr, hdr->addr1))
3148 return 0; 3148 return false;
3149 if (ieee80211_is_public_action(hdr, skb->len)) 3149 if (ieee80211_is_public_action(hdr, skb->len))
3150 return 1; 3150 return true;
3151 if (!ieee80211_is_beacon(hdr->frame_control)) 3151 if (!ieee80211_is_beacon(hdr->frame_control))
3152 return 0; 3152 return false;
3153 status->rx_flags &= ~IEEE80211_RX_RA_MATCH; 3153 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
3154 } 3154 }
3155 break; 3155 break;
3156 case NL80211_IFTYPE_WDS: 3156 case NL80211_IFTYPE_WDS:
3157 if (bssid || !ieee80211_is_data(hdr->frame_control)) 3157 if (bssid || !ieee80211_is_data(hdr->frame_control))
3158 return 0; 3158 return false;
3159 if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2)) 3159 if (!ether_addr_equal(sdata->u.wds.remote_addr, hdr->addr2))
3160 return 0; 3160 return false;
3161 break; 3161 break;
3162 case NL80211_IFTYPE_P2P_DEVICE: 3162 case NL80211_IFTYPE_P2P_DEVICE:
3163 if (!ieee80211_is_public_action(hdr, skb->len) && 3163 if (!ieee80211_is_public_action(hdr, skb->len) &&
3164 !ieee80211_is_probe_req(hdr->frame_control) && 3164 !ieee80211_is_probe_req(hdr->frame_control) &&
3165 !ieee80211_is_probe_resp(hdr->frame_control) && 3165 !ieee80211_is_probe_resp(hdr->frame_control) &&
3166 !ieee80211_is_beacon(hdr->frame_control)) 3166 !ieee80211_is_beacon(hdr->frame_control))
3167 return 0; 3167 return false;
3168 if (!ether_addr_equal(sdata->vif.addr, hdr->addr1) && 3168 if (!ether_addr_equal(sdata->vif.addr, hdr->addr1) &&
3169 !multicast) 3169 !multicast)
3170 status->rx_flags &= ~IEEE80211_RX_RA_MATCH; 3170 status->rx_flags &= ~IEEE80211_RX_RA_MATCH;
@@ -3175,7 +3175,7 @@ static int prepare_for_handlers(struct ieee80211_rx_data *rx,
3175 break; 3175 break;
3176 } 3176 }
3177 3177
3178 return 1; 3178 return true;
3179} 3179}
3180 3180
3181/* 3181/*
@@ -3191,13 +3191,11 @@ static bool ieee80211_prepare_and_rx_handle(struct ieee80211_rx_data *rx,
3191 struct ieee80211_sub_if_data *sdata = rx->sdata; 3191 struct ieee80211_sub_if_data *sdata = rx->sdata;
3192 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb); 3192 struct ieee80211_rx_status *status = IEEE80211_SKB_RXCB(skb);
3193 struct ieee80211_hdr *hdr = (void *)skb->data; 3193 struct ieee80211_hdr *hdr = (void *)skb->data;
3194 int prepares;
3195 3194
3196 rx->skb = skb; 3195 rx->skb = skb;
3197 status->rx_flags |= IEEE80211_RX_RA_MATCH; 3196 status->rx_flags |= IEEE80211_RX_RA_MATCH;
3198 prepares = prepare_for_handlers(rx, hdr);
3199 3197
3200 if (!prepares) 3198 if (!prepare_for_handlers(rx, hdr))
3201 return false; 3199 return false;
3202 3200
3203 if (!consume) { 3201 if (!consume) {
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
index 4576ba0ff221..decd30c1e290 100644
--- a/net/mac80211/sta_info.c
+++ b/net/mac80211/sta_info.c
@@ -300,6 +300,35 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
300 if (!sta) 300 if (!sta)
301 return NULL; 301 return NULL;
302 302
303 rcu_read_lock();
304 tx_latency = rcu_dereference(local->tx_latency);
305 /* init stations Tx latency statistics && TID bins */
306 if (tx_latency) {
307 sta->tx_lat = kzalloc(IEEE80211_NUM_TIDS *
308 sizeof(struct ieee80211_tx_latency_stat),
309 GFP_ATOMIC);
310 if (!sta->tx_lat) {
311 rcu_read_unlock();
312 goto free;
313 }
314
315 if (tx_latency->n_ranges) {
316 for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
317 /* size of bins is size of the ranges +1 */
318 sta->tx_lat[i].bin_count =
319 tx_latency->n_ranges + 1;
320 sta->tx_lat[i].bins =
321 kcalloc(sta->tx_lat[i].bin_count,
322 sizeof(u32), GFP_ATOMIC);
323 if (!sta->tx_lat[i].bins) {
324 rcu_read_unlock();
325 goto free;
326 }
327 }
328 }
329 }
330 rcu_read_unlock();
331
303 spin_lock_init(&sta->lock); 332 spin_lock_init(&sta->lock);
304 INIT_WORK(&sta->drv_unblock_wk, sta_unblock); 333 INIT_WORK(&sta->drv_unblock_wk, sta_unblock);
305 INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work); 334 INIT_WORK(&sta->ampdu_mlme.work, ieee80211_ba_session_work);
@@ -324,10 +353,8 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
324 for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++) 353 for (i = 0; i < ARRAY_SIZE(sta->chain_signal_avg); i++)
325 ewma_init(&sta->chain_signal_avg[i], 1024, 8); 354 ewma_init(&sta->chain_signal_avg[i], 1024, 8);
326 355
327 if (sta_prepare_rate_control(local, sta, gfp)) { 356 if (sta_prepare_rate_control(local, sta, gfp))
328 kfree(sta); 357 goto free;
329 return NULL;
330 }
331 358
332 for (i = 0; i < IEEE80211_NUM_TIDS; i++) { 359 for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
333 /* 360 /*
@@ -371,34 +398,17 @@ struct sta_info *sta_info_alloc(struct ieee80211_sub_if_data *sdata,
371 } 398 }
372 } 399 }
373 400
374 rcu_read_lock();
375
376 tx_latency = rcu_dereference(local->tx_latency);
377 /* init stations Tx latency statistics && TID bins */
378 if (tx_latency)
379 sta->tx_lat = kzalloc(IEEE80211_NUM_TIDS *
380 sizeof(struct ieee80211_tx_latency_stat),
381 GFP_ATOMIC);
382
383 /*
384 * if Tx latency and bins are enabled and the previous allocation
385 * succeeded
386 */
387 if (tx_latency && tx_latency->n_ranges && sta->tx_lat)
388 for (i = 0; i < IEEE80211_NUM_TIDS; i++) {
389 /* size of bins is size of the ranges +1 */
390 sta->tx_lat[i].bin_count =
391 tx_latency->n_ranges + 1;
392 sta->tx_lat[i].bins = kcalloc(sta->tx_lat[i].bin_count,
393 sizeof(u32),
394 GFP_ATOMIC);
395 }
396
397 rcu_read_unlock();
398
399 sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr); 401 sta_dbg(sdata, "Allocated STA %pM\n", sta->sta.addr);
400
401 return sta; 402 return sta;
403
404free:
405 if (sta->tx_lat) {
406 for (i = 0; i < IEEE80211_NUM_TIDS; i++)
407 kfree(sta->tx_lat[i].bins);
408 kfree(sta->tx_lat);
409 }
410 kfree(sta);
411 return NULL;
402} 412}
403 413
404static int sta_info_insert_check(struct sta_info *sta) 414static int sta_info_insert_check(struct sta_info *sta)
@@ -1143,7 +1153,8 @@ void ieee80211_sta_ps_deliver_wakeup(struct sta_info *sta)
1143 1153
1144static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata, 1154static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata,
1145 struct sta_info *sta, int tid, 1155 struct sta_info *sta, int tid,
1146 enum ieee80211_frame_release_type reason) 1156 enum ieee80211_frame_release_type reason,
1157 bool call_driver)
1147{ 1158{
1148 struct ieee80211_local *local = sdata->local; 1159 struct ieee80211_local *local = sdata->local;
1149 struct ieee80211_qos_hdr *nullfunc; 1160 struct ieee80211_qos_hdr *nullfunc;
@@ -1201,7 +1212,9 @@ static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata,
1201 IEEE80211_TX_STATUS_EOSP | 1212 IEEE80211_TX_STATUS_EOSP |
1202 IEEE80211_TX_CTL_REQ_TX_STATUS; 1213 IEEE80211_TX_CTL_REQ_TX_STATUS;
1203 1214
1204 drv_allow_buffered_frames(local, sta, BIT(tid), 1, reason, false); 1215 if (call_driver)
1216 drv_allow_buffered_frames(local, sta, BIT(tid), 1,
1217 reason, false);
1205 1218
1206 skb->dev = sdata->dev; 1219 skb->dev = sdata->dev;
1207 1220
@@ -1217,6 +1230,17 @@ static void ieee80211_send_null_response(struct ieee80211_sub_if_data *sdata,
1217 rcu_read_unlock(); 1230 rcu_read_unlock();
1218} 1231}
1219 1232
1233static int find_highest_prio_tid(unsigned long tids)
1234{
1235 /* lower 3 TIDs aren't ordered perfectly */
1236 if (tids & 0xF8)
1237 return fls(tids) - 1;
1238 /* TID 0 is BE just like TID 3 */
1239 if (tids & BIT(0))
1240 return 0;
1241 return fls(tids) - 1;
1242}
1243
1220static void 1244static void
1221ieee80211_sta_ps_deliver_response(struct sta_info *sta, 1245ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1222 int n_frames, u8 ignored_acs, 1246 int n_frames, u8 ignored_acs,
@@ -1224,7 +1248,6 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1224{ 1248{
1225 struct ieee80211_sub_if_data *sdata = sta->sdata; 1249 struct ieee80211_sub_if_data *sdata = sta->sdata;
1226 struct ieee80211_local *local = sdata->local; 1250 struct ieee80211_local *local = sdata->local;
1227 bool found = false;
1228 bool more_data = false; 1251 bool more_data = false;
1229 int ac; 1252 int ac;
1230 unsigned long driver_release_tids = 0; 1253 unsigned long driver_release_tids = 0;
@@ -1235,9 +1258,7 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1235 1258
1236 __skb_queue_head_init(&frames); 1259 __skb_queue_head_init(&frames);
1237 1260
1238 /* 1261 /* Get response frame(s) and more data bit for the last one. */
1239 * Get response frame(s) and more data bit for it.
1240 */
1241 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { 1262 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1242 unsigned long tids; 1263 unsigned long tids;
1243 1264
@@ -1246,43 +1267,48 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1246 1267
1247 tids = ieee80211_tids_for_ac(ac); 1268 tids = ieee80211_tids_for_ac(ac);
1248 1269
1249 if (!found) { 1270 /* if we already have frames from software, then we can't also
1250 driver_release_tids = sta->driver_buffered_tids & tids; 1271 * release from hardware queues
1251 if (driver_release_tids) { 1272 */
1252 found = true; 1273 if (skb_queue_empty(&frames))
1253 } else { 1274 driver_release_tids |= sta->driver_buffered_tids & tids;
1254 struct sk_buff *skb;
1255
1256 while (n_frames > 0) {
1257 skb = skb_dequeue(&sta->tx_filtered[ac]);
1258 if (!skb) {
1259 skb = skb_dequeue(
1260 &sta->ps_tx_buf[ac]);
1261 if (skb)
1262 local->total_ps_buffered--;
1263 }
1264 if (!skb)
1265 break;
1266 n_frames--;
1267 found = true;
1268 __skb_queue_tail(&frames, skb);
1269 }
1270 }
1271 1275
1272 /* 1276 if (driver_release_tids) {
1273 * If the driver has data on more than one TID then 1277 /* If the driver has data on more than one TID then
1274 * certainly there's more data if we release just a 1278 * certainly there's more data if we release just a
1275 * single frame now (from a single TID). 1279 * single frame now (from a single TID). This will
1280 * only happen for PS-Poll.
1276 */ 1281 */
1277 if (reason == IEEE80211_FRAME_RELEASE_PSPOLL && 1282 if (reason == IEEE80211_FRAME_RELEASE_PSPOLL &&
1278 hweight16(driver_release_tids) > 1) { 1283 hweight16(driver_release_tids) > 1) {
1279 more_data = true; 1284 more_data = true;
1280 driver_release_tids = 1285 driver_release_tids =
1281 BIT(ffs(driver_release_tids) - 1); 1286 BIT(find_highest_prio_tid(
1287 driver_release_tids));
1282 break; 1288 break;
1283 } 1289 }
1290 } else {
1291 struct sk_buff *skb;
1292
1293 while (n_frames > 0) {
1294 skb = skb_dequeue(&sta->tx_filtered[ac]);
1295 if (!skb) {
1296 skb = skb_dequeue(
1297 &sta->ps_tx_buf[ac]);
1298 if (skb)
1299 local->total_ps_buffered--;
1300 }
1301 if (!skb)
1302 break;
1303 n_frames--;
1304 __skb_queue_tail(&frames, skb);
1305 }
1284 } 1306 }
1285 1307
1308 /* If we have more frames buffered on this AC, then set the
1309 * more-data bit and abort the loop since we can't send more
1310 * data from other ACs before the buffered frames from this.
1311 */
1286 if (!skb_queue_empty(&sta->tx_filtered[ac]) || 1312 if (!skb_queue_empty(&sta->tx_filtered[ac]) ||
1287 !skb_queue_empty(&sta->ps_tx_buf[ac])) { 1313 !skb_queue_empty(&sta->ps_tx_buf[ac])) {
1288 more_data = true; 1314 more_data = true;
@@ -1290,7 +1316,7 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1290 } 1316 }
1291 } 1317 }
1292 1318
1293 if (!found) { 1319 if (skb_queue_empty(&frames) && !driver_release_tids) {
1294 int tid; 1320 int tid;
1295 1321
1296 /* 1322 /*
@@ -1311,15 +1337,13 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1311 /* This will evaluate to 1, 3, 5 or 7. */ 1337 /* This will evaluate to 1, 3, 5 or 7. */
1312 tid = 7 - ((ffs(~ignored_acs) - 1) << 1); 1338 tid = 7 - ((ffs(~ignored_acs) - 1) << 1);
1313 1339
1314 ieee80211_send_null_response(sdata, sta, tid, reason); 1340 ieee80211_send_null_response(sdata, sta, tid, reason, true);
1315 return; 1341 } else if (!driver_release_tids) {
1316 }
1317
1318 if (!driver_release_tids) {
1319 struct sk_buff_head pending; 1342 struct sk_buff_head pending;
1320 struct sk_buff *skb; 1343 struct sk_buff *skb;
1321 int num = 0; 1344 int num = 0;
1322 u16 tids = 0; 1345 u16 tids = 0;
1346 bool need_null = false;
1323 1347
1324 skb_queue_head_init(&pending); 1348 skb_queue_head_init(&pending);
1325 1349
@@ -1353,22 +1377,57 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1353 ieee80211_is_qos_nullfunc(hdr->frame_control)) 1377 ieee80211_is_qos_nullfunc(hdr->frame_control))
1354 qoshdr = ieee80211_get_qos_ctl(hdr); 1378 qoshdr = ieee80211_get_qos_ctl(hdr);
1355 1379
1356 /* end service period after last frame */ 1380 tids |= BIT(skb->priority);
1357 if (skb_queue_empty(&frames)) { 1381
1358 if (reason == IEEE80211_FRAME_RELEASE_UAPSD && 1382 __skb_queue_tail(&pending, skb);
1359 qoshdr) 1383
1360 *qoshdr |= IEEE80211_QOS_CTL_EOSP; 1384 /* end service period after last frame or add one */
1385 if (!skb_queue_empty(&frames))
1386 continue;
1361 1387
1388 if (reason != IEEE80211_FRAME_RELEASE_UAPSD) {
1389 /* for PS-Poll, there's only one frame */
1362 info->flags |= IEEE80211_TX_STATUS_EOSP | 1390 info->flags |= IEEE80211_TX_STATUS_EOSP |
1363 IEEE80211_TX_CTL_REQ_TX_STATUS; 1391 IEEE80211_TX_CTL_REQ_TX_STATUS;
1392 break;
1364 } 1393 }
1365 1394
1366 if (qoshdr) 1395 /* For uAPSD, things are a bit more complicated. If the
1367 tids |= BIT(*qoshdr & IEEE80211_QOS_CTL_TID_MASK); 1396 * last frame has a QoS header (i.e. is a QoS-data or
1368 else 1397 * QoS-nulldata frame) then just set the EOSP bit there
1369 tids |= BIT(0); 1398 * and be done.
1399 * If the frame doesn't have a QoS header (which means
1400 * it should be a bufferable MMPDU) then we can't set
1401 * the EOSP bit in the QoS header; add a QoS-nulldata
1402 * frame to the list to send it after the MMPDU.
1403 *
1404 * Note that this code is only in the mac80211-release
1405 * code path, we assume that the driver will not buffer
1406 * anything but QoS-data frames, or if it does, will
1407 * create the QoS-nulldata frame by itself if needed.
1408 *
1409 * Cf. 802.11-2012 10.2.1.10 (c).
1410 */
1411 if (qoshdr) {
1412 *qoshdr |= IEEE80211_QOS_CTL_EOSP;
1370 1413
1371 __skb_queue_tail(&pending, skb); 1414 info->flags |= IEEE80211_TX_STATUS_EOSP |
1415 IEEE80211_TX_CTL_REQ_TX_STATUS;
1416 } else {
1417 /* The standard isn't completely clear on this
1418 * as it says the more-data bit should be set
1419 * if there are more BUs. The QoS-Null frame
1420 * we're about to send isn't buffered yet, we
1421 * only create it below, but let's pretend it
1422 * was buffered just in case some clients only
1423 * expect more-data=0 when eosp=1.
1424 */
1425 hdr->frame_control |=
1426 cpu_to_le16(IEEE80211_FCTL_MOREDATA);
1427 need_null = true;
1428 num++;
1429 }
1430 break;
1372 } 1431 }
1373 1432
1374 drv_allow_buffered_frames(local, sta, tids, num, 1433 drv_allow_buffered_frames(local, sta, tids, num,
@@ -1376,17 +1435,22 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1376 1435
1377 ieee80211_add_pending_skbs(local, &pending); 1436 ieee80211_add_pending_skbs(local, &pending);
1378 1437
1438 if (need_null)
1439 ieee80211_send_null_response(
1440 sdata, sta, find_highest_prio_tid(tids),
1441 reason, false);
1442
1379 sta_info_recalc_tim(sta); 1443 sta_info_recalc_tim(sta);
1380 } else { 1444 } else {
1381 /* 1445 /*
1382 * We need to release a frame that is buffered somewhere in the 1446 * We need to release a frame that is buffered somewhere in the
1383 * driver ... it'll have to handle that. 1447 * driver ... it'll have to handle that.
1384 * Note that, as per the comment above, it'll also have to see 1448 * Note that the driver also has to check the number of frames
1385 * if there is more than just one frame on the specific TID that 1449 * on the TIDs we're releasing from - if there are more than
1386 * we're releasing from, and it needs to set the more-data bit 1450 * n_frames it has to set the more-data bit (if we didn't ask
1387 * accordingly if we tell it that there's no more data. If we do 1451 * it to set it anyway due to other buffered frames); if there
1388 * tell it there's more data, then of course the more-data bit 1452 * are fewer than n_frames it has to make sure to adjust that
1389 * needs to be set anyway. 1453 * to allow the service period to end properly.
1390 */ 1454 */
1391 drv_release_buffered_frames(local, sta, driver_release_tids, 1455 drv_release_buffered_frames(local, sta, driver_release_tids,
1392 n_frames, reason, more_data); 1456 n_frames, reason, more_data);
@@ -1394,9 +1458,9 @@ ieee80211_sta_ps_deliver_response(struct sta_info *sta,
1394 /* 1458 /*
1395 * Note that we don't recalculate the TIM bit here as it would 1459 * Note that we don't recalculate the TIM bit here as it would
1396 * most likely have no effect at all unless the driver told us 1460 * most likely have no effect at all unless the driver told us
1397 * that the TID became empty before returning here from the 1461 * that the TID(s) became empty before returning here from the
1398 * release function. 1462 * release function.
1399 * Either way, however, when the driver tells us that the TID 1463 * Either way, however, when the driver tells us that the TID(s)
1400 * became empty we'll do the TIM recalculation. 1464 * became empty we'll do the TIM recalculation.
1401 */ 1465 */
1402 } 1466 }
@@ -1485,6 +1549,8 @@ void ieee80211_sta_set_buffered(struct ieee80211_sta *pubsta,
1485 if (WARN_ON(tid >= IEEE80211_NUM_TIDS)) 1549 if (WARN_ON(tid >= IEEE80211_NUM_TIDS))
1486 return; 1550 return;
1487 1551
1552 trace_api_sta_set_buffered(sta->local, pubsta, tid, buffered);
1553
1488 if (buffered) 1554 if (buffered)
1489 set_bit(tid, &sta->driver_buffered_tids); 1555 set_bit(tid, &sta->driver_buffered_tids);
1490 else 1556 else
diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h
index da9366632f37..a0b0aea76525 100644
--- a/net/mac80211/trace.h
+++ b/net/mac80211/trace.h
@@ -1835,6 +1835,33 @@ TRACE_EVENT(api_eosp,
1835 ) 1835 )
1836); 1836);
1837 1837
1838TRACE_EVENT(api_sta_set_buffered,
1839 TP_PROTO(struct ieee80211_local *local,
1840 struct ieee80211_sta *sta,
1841 u8 tid, bool buffered),
1842
1843 TP_ARGS(local, sta, tid, buffered),
1844
1845 TP_STRUCT__entry(
1846 LOCAL_ENTRY
1847 STA_ENTRY
1848 __field(u8, tid)
1849 __field(bool, buffered)
1850 ),
1851
1852 TP_fast_assign(
1853 LOCAL_ASSIGN;
1854 STA_ASSIGN;
1855 __entry->tid = tid;
1856 __entry->buffered = buffered;
1857 ),
1858
1859 TP_printk(
1860 LOCAL_PR_FMT STA_PR_FMT " tid:%d buffered:%d",
1861 LOCAL_PR_ARG, STA_PR_ARG, __entry->tid, __entry->buffered
1862 )
1863);
1864
1838/* 1865/*
1839 * Tracing for internal functions 1866 * Tracing for internal functions
1840 * (which may also be called in response to driver calls) 1867 * (which may also be called in response to driver calls)
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
index ef3555e16cf9..27c990bf2320 100644
--- a/net/mac80211/tx.c
+++ b/net/mac80211/tx.c
@@ -490,6 +490,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx)
490 info->control.jiffies = jiffies; 490 info->control.jiffies = jiffies;
491 info->control.vif = &tx->sdata->vif; 491 info->control.vif = &tx->sdata->vif;
492 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 492 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
493 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
493 skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb); 494 skb_queue_tail(&sta->ps_tx_buf[ac], tx->skb);
494 495
495 if (!timer_pending(&local->sta_cleanup)) 496 if (!timer_pending(&local->sta_cleanup))
@@ -1076,6 +1077,7 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx,
1076 queued = true; 1077 queued = true;
1077 info->control.vif = &tx->sdata->vif; 1078 info->control.vif = &tx->sdata->vif;
1078 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; 1079 info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING;
1080 info->flags &= ~IEEE80211_TX_TEMPORARY_FLAGS;
1079 __skb_queue_tail(&tid_tx->pending, skb); 1081 __skb_queue_tail(&tid_tx->pending, skb);
1080 if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER) 1082 if (skb_queue_len(&tid_tx->pending) > STA_MAX_TX_BUFFER)
1081 purge_skb = __skb_dequeue(&tid_tx->pending); 1083 purge_skb = __skb_dequeue(&tid_tx->pending);
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index df00f1978a77..676dc0967f37 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2734,3 +2734,44 @@ int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr,
2734 return ret; 2734 return ret;
2735} 2735}
2736EXPORT_SYMBOL(ieee80211_parse_p2p_noa); 2736EXPORT_SYMBOL(ieee80211_parse_p2p_noa);
2737
2738void ieee80211_recalc_dtim(struct ieee80211_local *local,
2739 struct ieee80211_sub_if_data *sdata)
2740{
2741 u64 tsf = drv_get_tsf(local, sdata);
2742 u64 dtim_count = 0;
2743 u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024;
2744 u8 dtim_period = sdata->vif.bss_conf.dtim_period;
2745 struct ps_data *ps;
2746 u8 bcns_from_dtim;
2747
2748 if (tsf == -1ULL || !beacon_int || !dtim_period)
2749 return;
2750
2751 if (sdata->vif.type == NL80211_IFTYPE_AP ||
2752 sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
2753 if (!sdata->bss)
2754 return;
2755
2756 ps = &sdata->bss->ps;
2757 } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
2758 ps = &sdata->u.mesh.ps;
2759 } else {
2760 return;
2761 }
2762
2763 /*
2764 * actually finds last dtim_count, mac80211 will update in
2765 * __beacon_add_tim().
2766 * dtim_count = dtim_period - (tsf / bcn_int) % dtim_period
2767 */
2768 do_div(tsf, beacon_int);
2769 bcns_from_dtim = do_div(tsf, dtim_period);
2770 /* just had a DTIM */
2771 if (!bcns_from_dtim)
2772 dtim_count = 0;
2773 else
2774 dtim_count = dtim_period - bcns_from_dtim;
2775
2776 ps->dtim_count = dtim_count;
2777}
diff --git a/net/mac80211/wpa.c b/net/mac80211/wpa.c
index 7313d379c0d3..21448d629b15 100644
--- a/net/mac80211/wpa.c
+++ b/net/mac80211/wpa.c
@@ -127,7 +127,7 @@ ieee80211_rx_h_michael_mic_verify(struct ieee80211_rx_data *rx)
127 * APs with pairwise keys should never receive Michael MIC 127 * APs with pairwise keys should never receive Michael MIC
128 * errors for non-zero keyidx because these are reserved for 128 * errors for non-zero keyidx because these are reserved for
129 * group keys and only the AP is sending real multicast 129 * group keys and only the AP is sending real multicast
130 * frames in the BSS. ( 130 * frames in the BSS.
131 */ 131 */
132 return RX_DROP_UNUSABLE; 132 return RX_DROP_UNUSABLE;
133 } 133 }
diff --git a/net/nfc/core.c b/net/nfc/core.c
index b675fa4a6f19..ca1e65f4b133 100644
--- a/net/nfc/core.c
+++ b/net/nfc/core.c
@@ -133,11 +133,8 @@ int nfc_dev_up(struct nfc_dev *dev)
133 dev->dev_up = true; 133 dev->dev_up = true;
134 134
135 /* We have to enable the device before discovering SEs */ 135 /* We have to enable the device before discovering SEs */
136 if (dev->ops->discover_se) { 136 if (dev->ops->discover_se && dev->ops->discover_se(dev))
137 rc = dev->ops->discover_se(dev); 137 pr_err("SE discovery failed\n");
138 if (rc)
139 pr_warn("SE discovery failed\n");
140 }
141 138
142error: 139error:
143 device_unlock(&dev->dev); 140 device_unlock(&dev->dev);
diff --git a/net/nfc/digital_core.c b/net/nfc/digital_core.c
index 09fc95439955..c129d1571ca6 100644
--- a/net/nfc/digital_core.c
+++ b/net/nfc/digital_core.c
@@ -339,7 +339,6 @@ int digital_target_found(struct nfc_digital_dev *ddev,
339 pr_debug("rf_tech=%d, protocol=%d\n", rf_tech, protocol); 339 pr_debug("rf_tech=%d, protocol=%d\n", rf_tech, protocol);
340 340
341 ddev->curr_rf_tech = rf_tech; 341 ddev->curr_rf_tech = rf_tech;
342 ddev->curr_protocol = protocol;
343 342
344 if (DIGITAL_DRV_CAPS_IN_CRC(ddev)) { 343 if (DIGITAL_DRV_CAPS_IN_CRC(ddev)) {
345 ddev->skb_add_crc = digital_skb_add_crc_none; 344 ddev->skb_add_crc = digital_skb_add_crc_none;
@@ -541,8 +540,14 @@ static int digital_dep_link_up(struct nfc_dev *nfc_dev,
541 __u8 comm_mode, __u8 *gb, size_t gb_len) 540 __u8 comm_mode, __u8 *gb, size_t gb_len)
542{ 541{
543 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); 542 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
543 int rc;
544
545 rc = digital_in_send_atr_req(ddev, target, comm_mode, gb, gb_len);
544 546
545 return digital_in_send_atr_req(ddev, target, comm_mode, gb, gb_len); 547 if (!rc)
548 ddev->curr_protocol = NFC_PROTO_NFC_DEP;
549
550 return rc;
546} 551}
547 552
548static int digital_dep_link_down(struct nfc_dev *nfc_dev) 553static int digital_dep_link_down(struct nfc_dev *nfc_dev)
@@ -557,6 +562,20 @@ static int digital_dep_link_down(struct nfc_dev *nfc_dev)
557static int digital_activate_target(struct nfc_dev *nfc_dev, 562static int digital_activate_target(struct nfc_dev *nfc_dev,
558 struct nfc_target *target, __u32 protocol) 563 struct nfc_target *target, __u32 protocol)
559{ 564{
565 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
566
567 if (ddev->poll_tech_count) {
568 pr_err("Can't activate a target while polling\n");
569 return -EBUSY;
570 }
571
572 if (ddev->curr_protocol) {
573 pr_err("A target is already active\n");
574 return -EBUSY;
575 }
576
577 ddev->curr_protocol = protocol;
578
560 return 0; 579 return 0;
561} 580}
562 581
@@ -565,6 +584,11 @@ static void digital_deactivate_target(struct nfc_dev *nfc_dev,
565{ 584{
566 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev); 585 struct nfc_digital_dev *ddev = nfc_get_drvdata(nfc_dev);
567 586
587 if (!ddev->curr_protocol) {
588 pr_err("No active target\n");
589 return;
590 }
591
568 ddev->curr_protocol = 0; 592 ddev->curr_protocol = 0;
569} 593}
570 594
diff --git a/net/nfc/digital_dep.c b/net/nfc/digital_dep.c
index 07bbc24fb4c7..43e450f78d0a 100644
--- a/net/nfc/digital_dep.c
+++ b/net/nfc/digital_dep.c
@@ -32,7 +32,6 @@
32#define DIGITAL_ATR_REQ_MIN_SIZE 16 32#define DIGITAL_ATR_REQ_MIN_SIZE 16
33#define DIGITAL_ATR_REQ_MAX_SIZE 64 33#define DIGITAL_ATR_REQ_MAX_SIZE 64
34 34
35#define DIGITAL_NFCID3_LEN ((u8)8)
36#define DIGITAL_LR_BITS_PAYLOAD_SIZE_254B 0x30 35#define DIGITAL_LR_BITS_PAYLOAD_SIZE_254B 0x30
37#define DIGITAL_GB_BIT 0x02 36#define DIGITAL_GB_BIT 0x02
38 37
@@ -206,10 +205,9 @@ int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
206 atr_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT; 205 atr_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
207 atr_req->cmd = DIGITAL_CMD_ATR_REQ; 206 atr_req->cmd = DIGITAL_CMD_ATR_REQ;
208 if (target->nfcid2_len) 207 if (target->nfcid2_len)
209 memcpy(atr_req->nfcid3, target->nfcid2, 208 memcpy(atr_req->nfcid3, target->nfcid2, NFC_NFCID2_MAXSIZE);
210 max(target->nfcid2_len, DIGITAL_NFCID3_LEN));
211 else 209 else
212 get_random_bytes(atr_req->nfcid3, DIGITAL_NFCID3_LEN); 210 get_random_bytes(atr_req->nfcid3, NFC_NFCID3_MAXSIZE);
213 211
214 atr_req->did = 0; 212 atr_req->did = 0;
215 atr_req->bs = 0; 213 atr_req->bs = 0;
@@ -382,6 +380,33 @@ int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
382 data_exch); 380 data_exch);
383} 381}
384 382
383static void digital_tg_set_rf_tech(struct nfc_digital_dev *ddev, u8 rf_tech)
384{
385 ddev->curr_rf_tech = rf_tech;
386
387 ddev->skb_add_crc = digital_skb_add_crc_none;
388 ddev->skb_check_crc = digital_skb_check_crc_none;
389
390 if (DIGITAL_DRV_CAPS_TG_CRC(ddev))
391 return;
392
393 switch (ddev->curr_rf_tech) {
394 case NFC_DIGITAL_RF_TECH_106A:
395 ddev->skb_add_crc = digital_skb_add_crc_a;
396 ddev->skb_check_crc = digital_skb_check_crc_a;
397 break;
398
399 case NFC_DIGITAL_RF_TECH_212F:
400 case NFC_DIGITAL_RF_TECH_424F:
401 ddev->skb_add_crc = digital_skb_add_crc_f;
402 ddev->skb_check_crc = digital_skb_check_crc_f;
403 break;
404
405 default:
406 break;
407 }
408}
409
385static void digital_tg_recv_dep_req(struct nfc_digital_dev *ddev, void *arg, 410static void digital_tg_recv_dep_req(struct nfc_digital_dev *ddev, void *arg,
386 struct sk_buff *resp) 411 struct sk_buff *resp)
387{ 412{
@@ -472,11 +497,13 @@ int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb)
472static void digital_tg_send_psl_res_complete(struct nfc_digital_dev *ddev, 497static void digital_tg_send_psl_res_complete(struct nfc_digital_dev *ddev,
473 void *arg, struct sk_buff *resp) 498 void *arg, struct sk_buff *resp)
474{ 499{
475 u8 rf_tech = PTR_ERR(arg); 500 u8 rf_tech = (unsigned long)arg;
476 501
477 if (IS_ERR(resp)) 502 if (IS_ERR(resp))
478 return; 503 return;
479 504
505 digital_tg_set_rf_tech(ddev, rf_tech);
506
480 digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech); 507 digital_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH, rf_tech);
481 508
482 digital_tg_listen(ddev, 1500, digital_tg_recv_dep_req, NULL); 509 digital_tg_listen(ddev, 1500, digital_tg_recv_dep_req, NULL);
@@ -508,7 +535,7 @@ static int digital_tg_send_psl_res(struct nfc_digital_dev *ddev, u8 did,
508 ddev->skb_add_crc(skb); 535 ddev->skb_add_crc(skb);
509 536
510 rc = digital_tg_send_cmd(ddev, skb, 0, digital_tg_send_psl_res_complete, 537 rc = digital_tg_send_cmd(ddev, skb, 0, digital_tg_send_psl_res_complete,
511 ERR_PTR(rf_tech)); 538 (void *)(unsigned long)rf_tech);
512 539
513 if (rc) 540 if (rc)
514 kfree_skb(skb); 541 kfree_skb(skb);
@@ -661,16 +688,10 @@ void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
661 688
662 if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB) { 689 if (resp->data[0] == DIGITAL_NFC_DEP_NFCA_SOD_SB) {
663 min_size = DIGITAL_ATR_REQ_MIN_SIZE + 2; 690 min_size = DIGITAL_ATR_REQ_MIN_SIZE + 2;
664 691 digital_tg_set_rf_tech(ddev, NFC_DIGITAL_RF_TECH_106A);
665 ddev->curr_rf_tech = NFC_DIGITAL_RF_TECH_106A;
666 ddev->skb_add_crc = digital_skb_add_crc_a;
667 ddev->skb_check_crc = digital_skb_check_crc_a;
668 } else { 692 } else {
669 min_size = DIGITAL_ATR_REQ_MIN_SIZE + 1; 693 min_size = DIGITAL_ATR_REQ_MIN_SIZE + 1;
670 694 digital_tg_set_rf_tech(ddev, NFC_DIGITAL_RF_TECH_212F);
671 ddev->curr_rf_tech = NFC_DIGITAL_RF_TECH_212F;
672 ddev->skb_add_crc = digital_skb_add_crc_f;
673 ddev->skb_check_crc = digital_skb_check_crc_f;
674 } 695 }
675 696
676 if (resp->len < min_size) { 697 if (resp->len < min_size) {
@@ -678,10 +699,7 @@ void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
678 goto exit; 699 goto exit;
679 } 700 }
680 701
681 if (DIGITAL_DRV_CAPS_TG_CRC(ddev)) { 702 ddev->curr_protocol = NFC_PROTO_NFC_DEP_MASK;
682 ddev->skb_add_crc = digital_skb_add_crc_none;
683 ddev->skb_check_crc = digital_skb_check_crc_none;
684 }
685 703
686 rc = ddev->skb_check_crc(resp); 704 rc = ddev->skb_check_crc(resp);
687 if (rc) { 705 if (rc) {
diff --git a/net/nfc/hci/core.c b/net/nfc/hci/core.c
index 3b9610031baa..d45b638e77c7 100644
--- a/net/nfc/hci/core.c
+++ b/net/nfc/hci/core.c
@@ -335,11 +335,8 @@ exit:
335 kfree_skb(skb); 335 kfree_skb(skb);
336 336
337exit_noskb: 337exit_noskb:
338 if (r) { 338 if (r)
339 /* TODO: There was an error dispatching the event, 339 nfc_hci_driver_failure(hdev, r);
340 * how to propagate up to nfc core?
341 */
342 }
343} 340}
344 341
345static void nfc_hci_cmd_timeout(unsigned long data) 342static void nfc_hci_cmd_timeout(unsigned long data)
diff --git a/net/nfc/llcp_commands.c b/net/nfc/llcp_commands.c
index 693cd1aad582..bec6ed15f503 100644
--- a/net/nfc/llcp_commands.c
+++ b/net/nfc/llcp_commands.c
@@ -675,7 +675,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
675 675
676 do { 676 do {
677 remote_miu = sock->remote_miu > LLCP_MAX_MIU ? 677 remote_miu = sock->remote_miu > LLCP_MAX_MIU ?
678 local->remote_miu : sock->remote_miu; 678 LLCP_DEFAULT_MIU : sock->remote_miu;
679 679
680 frag_len = min_t(size_t, remote_miu, remaining_len); 680 frag_len = min_t(size_t, remote_miu, remaining_len);
681 681
@@ -684,8 +684,10 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock,
684 684
685 pdu = llcp_allocate_pdu(sock, LLCP_PDU_I, 685 pdu = llcp_allocate_pdu(sock, LLCP_PDU_I,
686 frag_len + LLCP_SEQUENCE_SIZE); 686 frag_len + LLCP_SEQUENCE_SIZE);
687 if (pdu == NULL) 687 if (pdu == NULL) {
688 kfree(msg_data);
688 return -ENOMEM; 689 return -ENOMEM;
690 }
689 691
690 skb_put(pdu, LLCP_SEQUENCE_SIZE); 692 skb_put(pdu, LLCP_SEQUENCE_SIZE);
691 693
diff --git a/net/nfc/llcp_core.c b/net/nfc/llcp_core.c
index 1349074e1ffc..6184bd1fba3a 100644
--- a/net/nfc/llcp_core.c
+++ b/net/nfc/llcp_core.c
@@ -943,7 +943,6 @@ static void nfc_llcp_recv_connect(struct nfc_llcp_local *local,
943 new_sock->local = nfc_llcp_local_get(local); 943 new_sock->local = nfc_llcp_local_get(local);
944 new_sock->rw = sock->rw; 944 new_sock->rw = sock->rw;
945 new_sock->miux = sock->miux; 945 new_sock->miux = sock->miux;
946 new_sock->remote_miu = local->remote_miu;
947 new_sock->nfc_protocol = sock->nfc_protocol; 946 new_sock->nfc_protocol = sock->nfc_protocol;
948 new_sock->dsap = ssap; 947 new_sock->dsap = ssap;
949 new_sock->target_idx = local->target_idx; 948 new_sock->target_idx = local->target_idx;
diff --git a/net/nfc/llcp_sock.c b/net/nfc/llcp_sock.c
index 69fbc8dadba7..4a53bb58a463 100644
--- a/net/nfc/llcp_sock.c
+++ b/net/nfc/llcp_sock.c
@@ -700,7 +700,6 @@ static int llcp_sock_connect(struct socket *sock, struct sockaddr *_addr,
700 700
701 llcp_sock->dev = dev; 701 llcp_sock->dev = dev;
702 llcp_sock->local = nfc_llcp_local_get(local); 702 llcp_sock->local = nfc_llcp_local_get(local);
703 llcp_sock->remote_miu = llcp_sock->local->remote_miu;
704 llcp_sock->ssap = nfc_llcp_get_local_ssap(local); 703 llcp_sock->ssap = nfc_llcp_get_local_ssap(local);
705 if (llcp_sock->ssap == LLCP_SAP_MAX) { 704 if (llcp_sock->ssap == LLCP_SAP_MAX) {
706 ret = -ENOMEM; 705 ret = -ENOMEM;
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index f0e955e3a385..46bda010bf11 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -301,6 +301,9 @@ static int nci_open_device(struct nci_dev *ndev)
301 rc = __nci_request(ndev, nci_reset_req, 0, 301 rc = __nci_request(ndev, nci_reset_req, 0,
302 msecs_to_jiffies(NCI_RESET_TIMEOUT)); 302 msecs_to_jiffies(NCI_RESET_TIMEOUT));
303 303
304 if (ndev->ops->setup(ndev))
305 ndev->ops->setup(ndev);
306
304 if (!rc) { 307 if (!rc) {
305 rc = __nci_request(ndev, nci_init_req, 0, 308 rc = __nci_request(ndev, nci_init_req, 0,
306 msecs_to_jiffies(NCI_INIT_TIMEOUT)); 309 msecs_to_jiffies(NCI_INIT_TIMEOUT));
@@ -361,6 +364,8 @@ static int nci_close_device(struct nci_dev *ndev)
361 msecs_to_jiffies(NCI_RESET_TIMEOUT)); 364 msecs_to_jiffies(NCI_RESET_TIMEOUT));
362 clear_bit(NCI_INIT, &ndev->flags); 365 clear_bit(NCI_INIT, &ndev->flags);
363 366
367 del_timer_sync(&ndev->cmd_timer);
368
364 /* Flush cmd wq */ 369 /* Flush cmd wq */
365 flush_workqueue(ndev->cmd_wq); 370 flush_workqueue(ndev->cmd_wq);
366 371
@@ -408,12 +413,26 @@ static int nci_dev_down(struct nfc_dev *nfc_dev)
408 return nci_close_device(ndev); 413 return nci_close_device(ndev);
409} 414}
410 415
416int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, __u8 *val)
417{
418 struct nci_set_config_param param;
419
420 if (!val || !len)
421 return 0;
422
423 param.id = id;
424 param.len = len;
425 param.val = val;
426
427 return __nci_request(ndev, nci_set_config_req, (unsigned long)&param,
428 msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
429}
430EXPORT_SYMBOL(nci_set_config);
431
411static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev) 432static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev)
412{ 433{
413 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev); 434 struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
414 struct nci_set_config_param param; 435 struct nci_set_config_param param;
415 __u8 local_gb[NFC_MAX_GT_LEN];
416 int i;
417 436
418 param.val = nfc_get_local_general_bytes(nfc_dev, &param.len); 437 param.val = nfc_get_local_general_bytes(nfc_dev, &param.len);
419 if ((param.val == NULL) || (param.len == 0)) 438 if ((param.val == NULL) || (param.len == 0))
@@ -422,11 +441,7 @@ static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev)
422 if (param.len > NFC_MAX_GT_LEN) 441 if (param.len > NFC_MAX_GT_LEN)
423 return -EINVAL; 442 return -EINVAL;
424 443
425 for (i = 0; i < param.len; i++)
426 local_gb[param.len-1-i] = param.val[i];
427
428 param.id = NCI_PN_ATR_REQ_GEN_BYTES; 444 param.id = NCI_PN_ATR_REQ_GEN_BYTES;
429 param.val = local_gb;
430 445
431 return nci_request(ndev, nci_set_config_req, (unsigned long)&param, 446 return nci_request(ndev, nci_set_config_req, (unsigned long)&param,
432 msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT)); 447 msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 4fa555e4dedc..7a742594916e 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -5257,12 +5257,7 @@ static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
5257 goto unlock; 5257 goto unlock;
5258 } 5258 }
5259 } else { 5259 } else {
5260 enum ieee80211_band band; 5260 n_channels = ieee80211_get_num_supported_channels(wiphy);
5261 n_channels = 0;
5262
5263 for (band = 0; band < IEEE80211_NUM_BANDS; band++)
5264 if (wiphy->bands[band])
5265 n_channels += wiphy->bands[band]->n_channels;
5266 } 5261 }
5267 5262
5268 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 5263 if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
@@ -5470,11 +5465,7 @@ static int nl80211_start_sched_scan(struct sk_buff *skb,
5470 if (!n_channels) 5465 if (!n_channels)
5471 return -EINVAL; 5466 return -EINVAL;
5472 } else { 5467 } else {
5473 n_channels = 0; 5468 n_channels = ieee80211_get_num_supported_channels(wiphy);
5474
5475 for (band = 0; band < IEEE80211_NUM_BANDS; band++)
5476 if (wiphy->bands[band])
5477 n_channels += wiphy->bands[band]->n_channels;
5478 } 5469 }
5479 5470
5480 if (info->attrs[NL80211_ATTR_SCAN_SSIDS]) 5471 if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
@@ -6767,6 +6758,55 @@ __cfg80211_alloc_vendor_skb(struct cfg80211_registered_device *rdev,
6767 return NULL; 6758 return NULL;
6768} 6759}
6769 6760
6761struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
6762 enum nl80211_commands cmd,
6763 enum nl80211_attrs attr,
6764 int vendor_event_idx,
6765 int approxlen, gfp_t gfp)
6766{
6767 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
6768 const struct nl80211_vendor_cmd_info *info;
6769
6770 switch (cmd) {
6771 case NL80211_CMD_TESTMODE:
6772 if (WARN_ON(vendor_event_idx != -1))
6773 return NULL;
6774 info = NULL;
6775 break;
6776 case NL80211_CMD_VENDOR:
6777 if (WARN_ON(vendor_event_idx < 0 ||
6778 vendor_event_idx >= wiphy->n_vendor_events))
6779 return NULL;
6780 info = &wiphy->vendor_events[vendor_event_idx];
6781 break;
6782 default:
6783 WARN_ON(1);
6784 return NULL;
6785 }
6786
6787 return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0,
6788 cmd, attr, info, gfp);
6789}
6790EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
6791
6792void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
6793{
6794 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
6795 void *hdr = ((void **)skb->cb)[1];
6796 struct nlattr *data = ((void **)skb->cb)[2];
6797 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
6798
6799 nla_nest_end(skb, data);
6800 genlmsg_end(skb, hdr);
6801
6802 if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
6803 mcgrp = NL80211_MCGRP_VENDOR;
6804
6805 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
6806 mcgrp, gfp);
6807}
6808EXPORT_SYMBOL(__cfg80211_send_event_skb);
6809
6770#ifdef CONFIG_NL80211_TESTMODE 6810#ifdef CONFIG_NL80211_TESTMODE
6771static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info) 6811static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
6772{ 6812{
@@ -6893,55 +6933,6 @@ static int nl80211_testmode_dump(struct sk_buff *skb,
6893 rtnl_unlock(); 6933 rtnl_unlock();
6894 return err; 6934 return err;
6895} 6935}
6896
6897struct sk_buff *__cfg80211_alloc_event_skb(struct wiphy *wiphy,
6898 enum nl80211_commands cmd,
6899 enum nl80211_attrs attr,
6900 int vendor_event_idx,
6901 int approxlen, gfp_t gfp)
6902{
6903 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
6904 const struct nl80211_vendor_cmd_info *info;
6905
6906 switch (cmd) {
6907 case NL80211_CMD_TESTMODE:
6908 if (WARN_ON(vendor_event_idx != -1))
6909 return NULL;
6910 info = NULL;
6911 break;
6912 case NL80211_CMD_VENDOR:
6913 if (WARN_ON(vendor_event_idx < 0 ||
6914 vendor_event_idx >= wiphy->n_vendor_events))
6915 return NULL;
6916 info = &wiphy->vendor_events[vendor_event_idx];
6917 break;
6918 default:
6919 WARN_ON(1);
6920 return NULL;
6921 }
6922
6923 return __cfg80211_alloc_vendor_skb(rdev, approxlen, 0, 0,
6924 cmd, attr, info, gfp);
6925}
6926EXPORT_SYMBOL(__cfg80211_alloc_event_skb);
6927
6928void __cfg80211_send_event_skb(struct sk_buff *skb, gfp_t gfp)
6929{
6930 struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0];
6931 void *hdr = ((void **)skb->cb)[1];
6932 struct nlattr *data = ((void **)skb->cb)[2];
6933 enum nl80211_multicast_groups mcgrp = NL80211_MCGRP_TESTMODE;
6934
6935 nla_nest_end(skb, data);
6936 genlmsg_end(skb, hdr);
6937
6938 if (data->nla_type == NL80211_ATTR_VENDOR_DATA)
6939 mcgrp = NL80211_MCGRP_VENDOR;
6940
6941 genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), skb, 0,
6942 mcgrp, gfp);
6943}
6944EXPORT_SYMBOL(__cfg80211_send_event_skb);
6945#endif 6936#endif
6946 6937
6947static int nl80211_connect(struct sk_buff *skb, struct genl_info *info) 6938static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
diff --git a/net/wireless/reg.c b/net/wireless/reg.c
index 7d20d844ca60..9b897fca7487 100644
--- a/net/wireless/reg.c
+++ b/net/wireless/reg.c
@@ -1853,6 +1853,8 @@ int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
1853 if (WARN_ON(!alpha2 || !wiphy)) 1853 if (WARN_ON(!alpha2 || !wiphy))
1854 return -EINVAL; 1854 return -EINVAL;
1855 1855
1856 wiphy->regulatory_flags &= ~REGULATORY_CUSTOM_REG;
1857
1856 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL); 1858 request = kzalloc(sizeof(struct regulatory_request), GFP_KERNEL);
1857 if (!request) 1859 if (!request)
1858 return -ENOMEM; 1860 return -ENOMEM;
diff --git a/net/wireless/scan.c b/net/wireless/scan.c
index a32d52a04c27..b528e31da2cf 100644
--- a/net/wireless/scan.c
+++ b/net/wireless/scan.c
@@ -1089,11 +1089,8 @@ int cfg80211_wext_siwscan(struct net_device *dev,
1089 /* Determine number of channels, needed to allocate creq */ 1089 /* Determine number of channels, needed to allocate creq */
1090 if (wreq && wreq->num_channels) 1090 if (wreq && wreq->num_channels)
1091 n_channels = wreq->num_channels; 1091 n_channels = wreq->num_channels;
1092 else { 1092 else
1093 for (band = 0; band < IEEE80211_NUM_BANDS; band++) 1093 n_channels = ieee80211_get_num_supported_channels(wiphy);
1094 if (wiphy->bands[band])
1095 n_channels += wiphy->bands[band]->n_channels;
1096 }
1097 1094
1098 creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) + 1095 creq = kzalloc(sizeof(*creq) + sizeof(struct cfg80211_ssid) +
1099 n_channels * sizeof(void *), 1096 n_channels * sizeof(void *),
diff --git a/net/wireless/sme.c b/net/wireless/sme.c
index 5d6e7bb2fc89..a63509118508 100644
--- a/net/wireless/sme.c
+++ b/net/wireless/sme.c
@@ -70,18 +70,11 @@ static int cfg80211_conn_scan(struct wireless_dev *wdev)
70 if (rdev->scan_req) 70 if (rdev->scan_req)
71 return -EBUSY; 71 return -EBUSY;
72 72
73 if (wdev->conn->params.channel) { 73 if (wdev->conn->params.channel)
74 n_channels = 1; 74 n_channels = 1;
75 } else { 75 else
76 enum ieee80211_band band; 76 n_channels = ieee80211_get_num_supported_channels(wdev->wiphy);
77 n_channels = 0;
78 77
79 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
80 if (!wdev->wiphy->bands[band])
81 continue;
82 n_channels += wdev->wiphy->bands[band]->n_channels;
83 }
84 }
85 request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) + 78 request = kzalloc(sizeof(*request) + sizeof(request->ssids[0]) +
86 sizeof(request->channels[0]) * n_channels, 79 sizeof(request->channels[0]) * n_channels,
87 GFP_KERNEL); 80 GFP_KERNEL);
diff --git a/net/wireless/util.c b/net/wireless/util.c
index 5618888853b2..d39c37104ae2 100644
--- a/net/wireless/util.c
+++ b/net/wireless/util.c
@@ -879,7 +879,9 @@ int cfg80211_change_iface(struct cfg80211_registered_device *rdev,
879 879
880 dev->ieee80211_ptr->use_4addr = false; 880 dev->ieee80211_ptr->use_4addr = false;
881 dev->ieee80211_ptr->mesh_id_up_len = 0; 881 dev->ieee80211_ptr->mesh_id_up_len = 0;
882 wdev_lock(dev->ieee80211_ptr);
882 rdev_set_qos_map(rdev, dev, NULL); 883 rdev_set_qos_map(rdev, dev, NULL);
884 wdev_unlock(dev->ieee80211_ptr);
883 885
884 switch (otype) { 886 switch (otype) {
885 case NL80211_IFTYPE_AP: 887 case NL80211_IFTYPE_AP:
@@ -1479,6 +1481,19 @@ int ieee80211_get_ratemask(struct ieee80211_supported_band *sband,
1479 return 0; 1481 return 0;
1480} 1482}
1481 1483
1484unsigned int ieee80211_get_num_supported_channels(struct wiphy *wiphy)
1485{
1486 enum ieee80211_band band;
1487 unsigned int n_channels = 0;
1488
1489 for (band = 0; band < IEEE80211_NUM_BANDS; band++)
1490 if (wiphy->bands[band])
1491 n_channels += wiphy->bands[band]->n_channels;
1492
1493 return n_channels;
1494}
1495EXPORT_SYMBOL(ieee80211_get_num_supported_channels);
1496
1482/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */ 1497/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
1483/* Ethernet-II snap header (RFC1042 for most EtherTypes) */ 1498/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
1484const unsigned char rfc1042_header[] __aligned(2) = 1499const unsigned char rfc1042_header[] __aligned(2) =
diff --git a/net/wireless/wext-compat.c b/net/wireless/wext-compat.c
index e7c6e862580d..5661a54ac7ee 100644
--- a/net/wireless/wext-compat.c
+++ b/net/wireless/wext-compat.c
@@ -370,7 +370,7 @@ static int cfg80211_wext_siwretry(struct net_device *dev,
370 u8 oshort = wdev->wiphy->retry_short; 370 u8 oshort = wdev->wiphy->retry_short;
371 int err; 371 int err;
372 372
373 if (retry->disabled || 373 if (retry->disabled || retry->value < 1 || retry->value > 255 ||
374 (retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT) 374 (retry->flags & IW_RETRY_TYPE) != IW_RETRY_LIMIT)
375 return -EINVAL; 375 return -EINVAL;
376 376
@@ -412,9 +412,9 @@ int cfg80211_wext_giwretry(struct net_device *dev,
412 * First return short value, iwconfig will ask long value 412 * First return short value, iwconfig will ask long value
413 * later if needed 413 * later if needed
414 */ 414 */
415 retry->flags |= IW_RETRY_LIMIT; 415 retry->flags |= IW_RETRY_LIMIT | IW_RETRY_SHORT;
416 retry->value = wdev->wiphy->retry_short; 416 retry->value = wdev->wiphy->retry_short;
417 if (wdev->wiphy->retry_long != wdev->wiphy->retry_short) 417 if (wdev->wiphy->retry_long == wdev->wiphy->retry_short)
418 retry->flags |= IW_RETRY_LONG; 418 retry->flags |= IW_RETRY_LONG;
419 419
420 return 0; 420 return 0;