aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-01-17 20:30:55 -0500
committerDavid S. Miller <davem@davemloft.net>2014-01-17 20:30:55 -0500
commitd037c4d70fb281cd54efb03254b51c7452750491 (patch)
tree119c5bb9e513c8205efed485c2dc7b8271123326
parentcf84eb0b09c0f09b4c70a648b9dfeec78be61f07 (diff)
parent7916a075571f0ccd0830cf3da293188a8b6045e3 (diff)
Merge branch 'for-davem' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says: ==================== Please pull this batch of updates for the 3.14 stream! For the mac80211 bits, Johannes says: "This time I have uAPSD fixes since I was working on that, hwsim improvements to make dynamic radios possible for the test suite, the evidently long-overdue channel_change_time removal and a few other small collected fix and improvements." For the iwlwifi bits, Emmanuel says: "Besides a few trivial patches, I have an important workaround for a HW issue that has kept me busy for a long time. Along with it, a fix that prevents an error from being printed. Eyal fixes our behavior against SISO APs and Ilan fixes an issue with multiple interface scenarios. Eliad fixes an error path in our init flow. We also have a few 'static analyzers' fix." For the NFC bits, Samuel says: "It includes: * A new NFC driver for Marvell's 8897, and a few NCI fixes and improvements needed to support this chipset. * An LLCP fix for how we were setting the default MIU on a p2p link. If there is no explicit MIU extension announced at connection time, we must use the default one and not the one announced at LLCP link establishement time. * A pn544 EEPROM config update. Some of the currently EEPROM configured values are overwriting the firmware ones while other should not be set by the driver itself. * Some NFC digital stack fixes and improvements. Asynchronous functions are better documented, RF technologies and CRC functions are set upon PSL_REQ reception, and a few minor bugs are fixed. * Minor and miscelaneous pn533, mei_phy and port100 fixes." For the ath bits, Kalle says: "Janusz added Kconfig option for DFS. The DFS code was there already, but after fixes to mac80211 we can now enable it. Bartosz added a runtime firmware feature flag to disable P2P. Our 10.1 firmware branch doesn't support P2P and ath10k can now disable that. He also added a limit for how many clients can connect to ath10k AP. Michal fixed WEP shared authentication, in case someone still uses it. And I added firmware debug log to help the firmware engineers." Along with that is a small batch of ath9k updates and a few other bits here and there. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-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;