aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2015-04-15 12:00:47 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-15 12:00:47 -0400
commit6c373ca89399c5a3f7ef210ad8f63dc3437da345 (patch)
tree74d1ec65087df1da1021b43ac51acc1ee8601809 /drivers/net/wireless
parentbb0fd7ab0986105765d11baa82e619c618a235aa (diff)
parent9f9151412dd7aae0e3f51a89ae4a1f8755fdb4d0 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Miller: 1) Add BQL support to via-rhine, from Tino Reichardt. 2) Integrate SWITCHDEV layer support into the DSA layer, so DSA drivers can support hw switch offloading. From Floria Fainelli. 3) Allow 'ip address' commands to initiate multicast group join/leave, from Madhu Challa. 4) Many ipv4 FIB lookup optimizations from Alexander Duyck. 5) Support EBPF in cls_bpf classifier and act_bpf action, from Daniel Borkmann. 6) Remove the ugly compat support in ARP for ugly layers like ax25, rose, etc. And use this to clean up the neigh layer, then use it to implement MPLS support. All from Eric Biederman. 7) Support L3 forwarding offloading in switches, from Scott Feldman. 8) Collapse the LOCAL and MAIN ipv4 FIB tables when possible, to speed up route lookups even further. From Alexander Duyck. 9) Many improvements and bug fixes to the rhashtable implementation, from Herbert Xu and Thomas Graf. In particular, in the case where an rhashtable user bulk adds a large number of items into an empty table, we expand the table much more sanely. 10) Don't make the tcp_metrics hash table per-namespace, from Eric Biederman. 11) Extend EBPF to access SKB fields, from Alexei Starovoitov. 12) Split out new connection request sockets so that they can be established in the main hash table. Much less false sharing since hash lookups go direct to the request sockets instead of having to go first to the listener then to the request socks hashed underneath. From Eric Dumazet. 13) Add async I/O support for crytpo AF_ALG sockets, from Tadeusz Struk. 14) Support stable privacy address generation for RFC7217 in IPV6. From Hannes Frederic Sowa. 15) Hash network namespace into IP frag IDs, also from Hannes Frederic Sowa. 16) Convert PTP get/set methods to use 64-bit time, from Richard Cochran. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (1816 commits) fm10k: Bump driver version to 0.15.2 fm10k: corrected VF multicast update fm10k: mbx_update_max_size does not drop all oversized messages fm10k: reset head instead of calling update_max_size fm10k: renamed mbx_tx_dropped to mbx_tx_oversized fm10k: update xcast mode before synchronizing multicast addresses fm10k: start service timer on probe fm10k: fix function header comment fm10k: comment next_vf_mbx flow fm10k: don't handle mailbox events in iov_event path and always process mailbox fm10k: use separate workqueue for fm10k driver fm10k: Set PF queues to unlimited bandwidth during virtualization fm10k: expose tx_timeout_count as an ethtool stat fm10k: only increment tx_timeout_count in Tx hang path fm10k: remove extraneous "Reset interface" message fm10k: separate PF only stats so that VF does not display them fm10k: use hw->mac.max_queues for stats fm10k: only show actual queues, not the maximum in hardware fm10k: allow creation of VLAN on default vid fm10k: fix unused warnings ...
Diffstat (limited to 'drivers/net/wireless')
-rw-r--r--drivers/net/wireless/airo.c4
-rw-r--r--drivers/net/wireless/at76c50x-usb.c6
-rw-r--r--drivers/net/wireless/ath/ar5523/ar5523.c9
-rw-r--r--drivers/net/wireless/ath/ar5523/ar5523.h1
-rw-r--r--drivers/net/wireless/ath/ath.h3
-rw-r--r--drivers/net/wireless/ath/ath10k/ce.h2
-rw-r--r--drivers/net/wireless/ath/ath10k/core.c8
-rw-r--r--drivers/net/wireless/ath/ath10k/core.h27
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.c101
-rw-r--r--drivers/net/wireless/ath/ath10k/htt_rx.c2
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c169
-rw-r--r--drivers/net/wireless/ath/ath10k/pci.c4
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi-ops.h7
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi-tlv.c132
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi-tlv.h15
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c27
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.h18
-rw-r--r--drivers/net/wireless/ath/ath5k/ath5k.h1
-rw-r--r--drivers/net/wireless/ath/ath5k/base.c33
-rw-r--r--drivers/net/wireless/ath/ath5k/reset.c24
-rw-r--r--drivers/net/wireless/ath/ath6kl/cfg80211.c17
-rw-r--r--drivers/net/wireless/ath/ath6kl/cfg80211.h1
-rw-r--r--drivers/net/wireless/ath/ath6kl/core.c4
-rw-r--r--drivers/net/wireless/ath/ath6kl/main.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/Makefile3
-rw-r--r--drivers/net/wireless/ath/ath9k/ani.c20
-rw-r--r--drivers/net/wireless/ath/ath9k/ar5008_phy.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9002_calib.c77
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_aic.c599
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_aic.h61
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_hw.c84
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mci.c178
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mci.h61
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_phy.h25
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_rtt.c6
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_wow.c61
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h3
-rw-r--r--drivers/net/wireless/ath/ath9k/btcoex.c43
-rw-r--r--drivers/net/wireless/ath/ath9k/btcoex.h13
-rw-r--r--drivers/net/wireless/ath/ath9k/calib.c19
-rw-r--r--drivers/net/wireless/ath/ath9k/debug.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/dfs.c44
-rw-r--r--drivers/net/wireless/ath/ath9k/eeprom.c7
-rw-r--r--drivers/net/wireless/ath/ath9k/eeprom_4k.c36
-rw-r--r--drivers/net/wireless/ath/ath9k/eeprom_def.c34
-rw-r--r--drivers/net/wireless/ath/ath9k/gpio.c103
-rw-r--r--drivers/net/wireless/ath/ath9k/hif_usb.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/htc.h5
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_init.c142
-rw-r--r--drivers/net/wireless/ath/ath9k/htc_drv_main.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/hw-ops.h8
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c54
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h33
-rw-r--r--drivers/net/wireless/ath/ath9k/init.c23
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c56
-rw-r--r--drivers/net/wireless/ath/ath9k/mci.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/reg.h279
-rw-r--r--drivers/net/wireless/ath/ath9k/reg_aic.h168
-rw-r--r--drivers/net/wireless/ath/ath9k/reg_mci.h310
-rw-r--r--drivers/net/wireless/ath/ath9k/reg_wow.h10
-rw-r--r--drivers/net/wireless/ath/ath9k/wmi.c15
-rw-r--r--drivers/net/wireless/ath/ath9k/wmi.h18
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c42
-rw-r--r--drivers/net/wireless/ath/dfs_pattern_detector.c2
-rw-r--r--drivers/net/wireless/ath/wil6210/cfg80211.c68
-rw-r--r--drivers/net/wireless/ath/wil6210/debugfs.c37
-rw-r--r--drivers/net/wireless/ath/wil6210/ethtool.c34
-rw-r--r--drivers/net/wireless/ath/wil6210/fw.c3
-rw-r--r--drivers/net/wireless/ath/wil6210/fw_inc.c4
-rw-r--r--drivers/net/wireless/ath/wil6210/interrupt.c70
-rw-r--r--drivers/net/wireless/ath/wil6210/main.c202
-rw-r--r--drivers/net/wireless/ath/wil6210/netdev.c4
-rw-r--r--drivers/net/wireless/ath/wil6210/pcie_bus.c24
-rw-r--r--drivers/net/wireless/ath/wil6210/txrx.c417
-rw-r--r--drivers/net/wireless/ath/wil6210/wil6210.h42
-rw-r--r--drivers/net/wireless/ath/wil6210/wmi.c25
-rw-r--r--drivers/net/wireless/ath/wil6210/wmi.h23
-rw-r--r--drivers/net/wireless/atmel.c16
-rw-r--r--drivers/net/wireless/b43/dma.c12
-rw-r--r--drivers/net/wireless/b43/main.c14
-rw-r--r--drivers/net/wireless/b43legacy/dma.c6
-rw-r--r--drivers/net/wireless/b43legacy/main.c8
-rw-r--r--drivers/net/wireless/b43legacy/rfkill.c8
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c174
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c28
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/chip.c310
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/chip.h12
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/core.c30
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/flowring.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c5
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h8
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/p2p.c5
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/p2p.h1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/pcie.c24
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio.c308
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/sdio.h47
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/main.c10
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c11
-rw-r--r--drivers/net/wireless/brcm80211/include/brcm_hw_ids.h2
-rw-r--r--drivers/net/wireless/brcm80211/include/chipcommon.h9
-rw-r--r--drivers/net/wireless/cw1200/cw1200_spi.c11
-rw-r--r--drivers/net/wireless/cw1200/sta.c6
-rw-r--r--drivers/net/wireless/cw1200/txrx.c2
-rw-r--r--drivers/net/wireless/hostap/hostap_80211_tx.c4
-rw-r--r--drivers/net/wireless/hostap/hostap_ap.c8
-rw-r--r--drivers/net/wireless/hostap/hostap_info.c2
-rw-r--r--drivers/net/wireless/hostap/hostap_main.c5
-rw-r--r--drivers/net/wireless/hostap/hostap_wlan.h33
-rw-r--r--drivers/net/wireless/ipw2x00/Kconfig2
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2100.c8
-rw-r--r--drivers/net/wireless/ipw2x00/ipw2200.c6
-rw-r--r--drivers/net/wireless/iwlegacy/4965-rs.c2
-rw-r--r--drivers/net/wireless/iwlegacy/common.c2
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/mac80211.c15
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/main.c2
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/rs.c7
-rw-r--r--drivers/net/wireless/iwlwifi/dvm/tx.c6
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-7000.c12
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-8000.c18
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-config.h10
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-debug.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-devtrace-iwlwifi.h18
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-drv.c132
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-drv.h4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h1
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-eeprom-read.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fh.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw-error-dump.h54
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw-file.h242
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw.h53
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-io.c15
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-modparams.h2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-nvm-parse.c410
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-nvm-parse.h18
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-op-mode.h4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-phy-db.c4
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-prph.h53
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-trans.h31
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/coex.c226
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/coex_legacy.c75
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/d3.c32
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c55
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs.c63
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-coex.h47
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-mac.h3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h205
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-stats.h64
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api.h134
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw.c160
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c41
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c514
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h206
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/nvm.c327
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c81
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c6
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/power.c9
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/quota.c3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c289
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.h7
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rx.c150
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/scan.c671
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sf.c67
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.c33
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.h6
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/time-event.c101
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/time-event.h4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/tx.c12
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/utils.c281
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/drv.c27
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/internal.h4
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/rx.c8
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c219
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/tx.c63
-rw-r--r--drivers/net/wireless/libertas/cfg.c6
-rw-r--r--drivers/net/wireless/libertas/debugfs.c3
-rw-r--r--drivers/net/wireless/libertas/main.c4
-rw-r--r--drivers/net/wireless/libertas_tf/if_usb.c2
-rw-r--r--drivers/net/wireless/libertas_tf/main.c4
-rw-r--r--drivers/net/wireless/mac80211_hwsim.c109
-rw-r--r--drivers/net/wireless/mwifiex/11n.c18
-rw-r--r--drivers/net/wireless/mwifiex/11n.h32
-rw-r--r--drivers/net/wireless/mwifiex/11n_aggr.c16
-rw-r--r--drivers/net/wireless/mwifiex/11n_rxreorder.c7
-rw-r--r--drivers/net/wireless/mwifiex/cfg80211.c202
-rw-r--r--drivers/net/wireless/mwifiex/decl.h11
-rw-r--r--drivers/net/wireless/mwifiex/fw.h11
-rw-r--r--drivers/net/wireless/mwifiex/init.c31
-rw-r--r--drivers/net/wireless/mwifiex/main.c98
-rw-r--r--drivers/net/wireless/mwifiex/main.h34
-rw-r--r--drivers/net/wireless/mwifiex/pcie.c33
-rw-r--r--drivers/net/wireless/mwifiex/pcie.h6
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c233
-rw-r--r--drivers/net/wireless/mwifiex/sdio.h74
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmd.c61
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmdresp.c21
-rw-r--r--drivers/net/wireless/mwifiex/sta_event.c6
-rw-r--r--drivers/net/wireless/mwifiex/txrx.c136
-rw-r--r--drivers/net/wireless/mwifiex/usb.c6
-rw-r--r--drivers/net/wireless/mwifiex/util.c30
-rw-r--r--drivers/net/wireless/mwifiex/wmm.c50
-rw-r--r--drivers/net/wireless/mwifiex/wmm.h2
-rw-r--r--drivers/net/wireless/mwl8k.c2
-rw-r--r--drivers/net/wireless/orinoco/Kconfig2
-rw-r--r--drivers/net/wireless/orinoco/airport.c2
-rw-r--r--drivers/net/wireless/orinoco/wext.c2
-rw-r--r--drivers/net/wireless/p54/fwio.c2
-rw-r--r--drivers/net/wireless/p54/main.c8
-rw-r--r--drivers/net/wireless/ray_cs.c2
-rw-r--r--drivers/net/wireless/rndis_wlan.c28
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.c13
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00usb.h4
-rw-r--r--drivers/net/wireless/rtlwifi/base.c7
-rw-r--r--drivers/net/wireless/rtlwifi/base.h10
-rw-r--r--drivers/net/wireless/rtlwifi/cam.h2
-rw-r--r--drivers/net/wireless/rtlwifi/core.c6
-rw-r--r--drivers/net/wireless/rtlwifi/core.h2
-rw-r--r--drivers/net/wireless/rtlwifi/efuse.h6
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rc.c5
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/def.h41
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/hw.c7
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/phy.c3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/rf.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/def.h41
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/hw.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/rf.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/hw.c11
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/hw.h2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/mac.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/rf.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/sw.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/def.h39
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/hw.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/hw.c4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/rf.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/def.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/hw.c4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/def.h41
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hw.c4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/rf.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/hw.c4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/rf.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/def.h41
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/hw.c8
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/rf.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/trx.c16
-rw-r--r--drivers/net/wireless/rtlwifi/stats.c24
-rw-r--r--drivers/net/wireless/rtlwifi/stats.h1
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c11
-rw-r--r--drivers/net/wireless/ti/wl1251/main.c6
-rw-r--r--drivers/net/wireless/ti/wl18xx/debugfs.c2
-rw-r--r--drivers/net/wireless/ti/wl18xx/event.c4
-rw-r--r--drivers/net/wireless/ti/wlcore/cmd.c4
-rw-r--r--drivers/net/wireless/ti/wlcore/debugfs.h4
257 files changed, 8421 insertions, 3959 deletions
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index b97367d50717..d0c97c220026 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -2676,7 +2676,7 @@ static void wifi_setup(struct net_device *dev)
2676 dev->addr_len = ETH_ALEN; 2676 dev->addr_len = ETH_ALEN;
2677 dev->tx_queue_len = 100; 2677 dev->tx_queue_len = 100;
2678 2678
2679 memset(dev->broadcast,0xFF, ETH_ALEN); 2679 eth_broadcast_addr(dev->broadcast);
2680 2680
2681 dev->flags = IFF_BROADCAST|IFF_MULTICAST; 2681 dev->flags = IFF_BROADCAST|IFF_MULTICAST;
2682} 2682}
@@ -3273,7 +3273,7 @@ static void airo_handle_link(struct airo_info *ai)
3273 } 3273 }
3274 3274
3275 /* Send event to user space */ 3275 /* Send event to user space */
3276 memset(wrqu.ap_addr.sa_data, '\0', ETH_ALEN); 3276 eth_zero_addr(wrqu.ap_addr.sa_data);
3277 wrqu.ap_addr.sa_family = ARPHRD_ETHER; 3277 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
3278 wireless_send_event(ai->dev, SIOCGIWAP, &wrqu, NULL); 3278 wireless_send_event(ai->dev, SIOCGIWAP, &wrqu, NULL);
3279 } 3279 }
diff --git a/drivers/net/wireless/at76c50x-usb.c b/drivers/net/wireless/at76c50x-usb.c
index da92bfa76b7c..49219c508963 100644
--- a/drivers/net/wireless/at76c50x-usb.c
+++ b/drivers/net/wireless/at76c50x-usb.c
@@ -1166,7 +1166,7 @@ static int at76_start_monitor(struct at76_priv *priv)
1166 int ret; 1166 int ret;
1167 1167
1168 memset(&scan, 0, sizeof(struct at76_req_scan)); 1168 memset(&scan, 0, sizeof(struct at76_req_scan));
1169 memset(scan.bssid, 0xff, ETH_ALEN); 1169 eth_broadcast_addr(scan.bssid);
1170 1170
1171 scan.channel = priv->channel; 1171 scan.channel = priv->channel;
1172 scan.scan_type = SCAN_TYPE_PASSIVE; 1172 scan.scan_type = SCAN_TYPE_PASSIVE;
@@ -1427,7 +1427,7 @@ static int at76_startup_device(struct at76_priv *priv)
1427 at76_wait_completion(priv, CMD_STARTUP); 1427 at76_wait_completion(priv, CMD_STARTUP);
1428 1428
1429 /* remove BSSID from previous run */ 1429 /* remove BSSID from previous run */
1430 memset(priv->bssid, 0, ETH_ALEN); 1430 eth_zero_addr(priv->bssid);
1431 1431
1432 priv->scanning = false; 1432 priv->scanning = false;
1433 1433
@@ -1973,7 +1973,7 @@ static int at76_hw_scan(struct ieee80211_hw *hw,
1973 ieee80211_stop_queues(hw); 1973 ieee80211_stop_queues(hw);
1974 1974
1975 memset(&scan, 0, sizeof(struct at76_req_scan)); 1975 memset(&scan, 0, sizeof(struct at76_req_scan));
1976 memset(scan.bssid, 0xFF, ETH_ALEN); 1976 eth_broadcast_addr(scan.bssid);
1977 1977
1978 if (req->n_ssids) { 1978 if (req->n_ssids) {
1979 scan.scan_type = SCAN_TYPE_ACTIVE; 1979 scan.scan_type = SCAN_TYPE_ACTIVE;
diff --git a/drivers/net/wireless/ath/ar5523/ar5523.c b/drivers/net/wireless/ath/ar5523/ar5523.c
index f92050617ae6..5147ebe4cd05 100644
--- a/drivers/net/wireless/ath/ar5523/ar5523.c
+++ b/drivers/net/wireless/ath/ar5523/ar5523.c
@@ -779,8 +779,6 @@ static void ar5523_tx(struct ieee80211_hw *hw,
779 ieee80211_stop_queues(hw); 779 ieee80211_stop_queues(hw);
780 } 780 }
781 781
782 data->skb = skb;
783
784 spin_lock_irqsave(&ar->tx_data_list_lock, flags); 782 spin_lock_irqsave(&ar->tx_data_list_lock, flags);
785 list_add_tail(&data->list, &ar->tx_queue_pending); 783 list_add_tail(&data->list, &ar->tx_queue_pending);
786 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags); 784 spin_unlock_irqrestore(&ar->tx_data_list_lock, flags);
@@ -817,10 +815,13 @@ static void ar5523_tx_work_locked(struct ar5523 *ar)
817 if (!data) 815 if (!data)
818 break; 816 break;
819 817
820 skb = data->skb; 818 txi = container_of((void *)data, struct ieee80211_tx_info,
819 driver_data);
821 txqid = 0; 820 txqid = 0;
822 txi = IEEE80211_SKB_CB(skb); 821
822 skb = container_of((void *)txi, struct sk_buff, cb);
823 paylen = skb->len; 823 paylen = skb->len;
824
824 urb = usb_alloc_urb(0, GFP_KERNEL); 825 urb = usb_alloc_urb(0, GFP_KERNEL);
825 if (!urb) { 826 if (!urb) {
826 ar5523_err(ar, "Failed to allocate TX urb\n"); 827 ar5523_err(ar, "Failed to allocate TX urb\n");
diff --git a/drivers/net/wireless/ath/ar5523/ar5523.h b/drivers/net/wireless/ath/ar5523/ar5523.h
index 00c6fd346d48..9a322a65cdb5 100644
--- a/drivers/net/wireless/ath/ar5523/ar5523.h
+++ b/drivers/net/wireless/ath/ar5523/ar5523.h
@@ -74,7 +74,6 @@ struct ar5523_tx_cmd {
74struct ar5523_tx_data { 74struct ar5523_tx_data {
75 struct list_head list; 75 struct list_head list;
76 struct ar5523 *ar; 76 struct ar5523 *ar;
77 struct sk_buff *skb;
78 struct urb *urb; 77 struct urb *urb;
79}; 78};
80 79
diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h
index 1eebe2ea3dfb..7e9481099a8e 100644
--- a/drivers/net/wireless/ath/ath.h
+++ b/drivers/net/wireless/ath/ath.h
@@ -131,6 +131,9 @@ struct ath_ops {
131 void (*enable_write_buffer)(void *); 131 void (*enable_write_buffer)(void *);
132 void (*write_flush) (void *); 132 void (*write_flush) (void *);
133 u32 (*rmw)(void *, u32 reg_offset, u32 set, u32 clr); 133 u32 (*rmw)(void *, u32 reg_offset, u32 set, u32 clr);
134 void (*enable_rmw_buffer)(void *);
135 void (*rmw_flush) (void *);
136
134}; 137};
135 138
136struct ath_common; 139struct ath_common;
diff --git a/drivers/net/wireless/ath/ath10k/ce.h b/drivers/net/wireless/ath/ath10k/ce.h
index c18647b87f71..0eddb204d85b 100644
--- a/drivers/net/wireless/ath/ath10k/ce.h
+++ b/drivers/net/wireless/ath/ath10k/ce.h
@@ -39,7 +39,7 @@ struct ath10k_ce_pipe;
39#define CE_DESC_FLAGS_GATHER (1 << 0) 39#define CE_DESC_FLAGS_GATHER (1 << 0)
40#define CE_DESC_FLAGS_BYTE_SWAP (1 << 1) 40#define CE_DESC_FLAGS_BYTE_SWAP (1 << 1)
41#define CE_DESC_FLAGS_META_DATA_MASK 0xFFFC 41#define CE_DESC_FLAGS_META_DATA_MASK 0xFFFC
42#define CE_DESC_FLAGS_META_DATA_LSB 3 42#define CE_DESC_FLAGS_META_DATA_LSB 2
43 43
44struct ce_desc { 44struct ce_desc {
45 __le32 addr; 45 __le32 addr;
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index 310e12bc078a..c0e454bb6a8d 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -436,16 +436,16 @@ static int ath10k_download_fw(struct ath10k *ar, enum ath10k_firmware_mode mode)
436 436
437static void ath10k_core_free_firmware_files(struct ath10k *ar) 437static void ath10k_core_free_firmware_files(struct ath10k *ar)
438{ 438{
439 if (ar->board && !IS_ERR(ar->board)) 439 if (!IS_ERR(ar->board))
440 release_firmware(ar->board); 440 release_firmware(ar->board);
441 441
442 if (ar->otp && !IS_ERR(ar->otp)) 442 if (!IS_ERR(ar->otp))
443 release_firmware(ar->otp); 443 release_firmware(ar->otp);
444 444
445 if (ar->firmware && !IS_ERR(ar->firmware)) 445 if (!IS_ERR(ar->firmware))
446 release_firmware(ar->firmware); 446 release_firmware(ar->firmware);
447 447
448 if (ar->cal_file && !IS_ERR(ar->cal_file)) 448 if (!IS_ERR(ar->cal_file))
449 release_firmware(ar->cal_file); 449 release_firmware(ar->cal_file);
450 450
451 ar->board = NULL; 451 ar->board = NULL;
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index d60e46fe6d19..f65310c3ba5f 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -159,6 +159,25 @@ struct ath10k_fw_stats_peer {
159 u32 peer_rx_rate; /* 10x only */ 159 u32 peer_rx_rate; /* 10x only */
160}; 160};
161 161
162struct ath10k_fw_stats_vdev {
163 struct list_head list;
164
165 u32 vdev_id;
166 u32 beacon_snr;
167 u32 data_snr;
168 u32 num_tx_frames[4];
169 u32 num_rx_frames;
170 u32 num_tx_frames_retries[4];
171 u32 num_tx_frames_failures[4];
172 u32 num_rts_fail;
173 u32 num_rts_success;
174 u32 num_rx_err;
175 u32 num_rx_discard;
176 u32 num_tx_not_acked;
177 u32 tx_rate_history[10];
178 u32 beacon_rssi_history[10];
179};
180
162struct ath10k_fw_stats_pdev { 181struct ath10k_fw_stats_pdev {
163 struct list_head list; 182 struct list_head list;
164 183
@@ -220,6 +239,7 @@ struct ath10k_fw_stats_pdev {
220 239
221struct ath10k_fw_stats { 240struct ath10k_fw_stats {
222 struct list_head pdevs; 241 struct list_head pdevs;
242 struct list_head vdevs;
223 struct list_head peers; 243 struct list_head peers;
224}; 244};
225 245
@@ -288,6 +308,7 @@ struct ath10k_vif {
288 bool is_started; 308 bool is_started;
289 bool is_up; 309 bool is_up;
290 bool spectral_enabled; 310 bool spectral_enabled;
311 bool ps;
291 u32 aid; 312 u32 aid;
292 u8 bssid[ETH_ALEN]; 313 u8 bssid[ETH_ALEN];
293 314
@@ -413,6 +434,12 @@ enum ath10k_fw_features {
413 */ 434 */
414 ATH10K_FW_FEATURE_WMI_10_2 = 4, 435 ATH10K_FW_FEATURE_WMI_10_2 = 4,
415 436
437 /* Some firmware revisions lack proper multi-interface client powersave
438 * implementation. Enabling PS could result in connection drops,
439 * traffic stalls, etc.
440 */
441 ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT = 5,
442
416 /* keep last */ 443 /* keep last */
417 ATH10K_FW_FEATURE_COUNT, 444 ATH10K_FW_FEATURE_COUNT,
418}; 445};
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index d2281e5c2ffe..301081db1ef6 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -243,6 +243,16 @@ static void ath10k_debug_fw_stats_pdevs_free(struct list_head *head)
243 } 243 }
244} 244}
245 245
246static void ath10k_debug_fw_stats_vdevs_free(struct list_head *head)
247{
248 struct ath10k_fw_stats_vdev *i, *tmp;
249
250 list_for_each_entry_safe(i, tmp, head, list) {
251 list_del(&i->list);
252 kfree(i);
253 }
254}
255
246static void ath10k_debug_fw_stats_peers_free(struct list_head *head) 256static void ath10k_debug_fw_stats_peers_free(struct list_head *head)
247{ 257{
248 struct ath10k_fw_stats_peer *i, *tmp; 258 struct ath10k_fw_stats_peer *i, *tmp;
@@ -258,6 +268,7 @@ static void ath10k_debug_fw_stats_reset(struct ath10k *ar)
258 spin_lock_bh(&ar->data_lock); 268 spin_lock_bh(&ar->data_lock);
259 ar->debug.fw_stats_done = false; 269 ar->debug.fw_stats_done = false;
260 ath10k_debug_fw_stats_pdevs_free(&ar->debug.fw_stats.pdevs); 270 ath10k_debug_fw_stats_pdevs_free(&ar->debug.fw_stats.pdevs);
271 ath10k_debug_fw_stats_vdevs_free(&ar->debug.fw_stats.vdevs);
261 ath10k_debug_fw_stats_peers_free(&ar->debug.fw_stats.peers); 272 ath10k_debug_fw_stats_peers_free(&ar->debug.fw_stats.peers);
262 spin_unlock_bh(&ar->data_lock); 273 spin_unlock_bh(&ar->data_lock);
263} 274}
@@ -273,14 +284,27 @@ static size_t ath10k_debug_fw_stats_num_peers(struct list_head *head)
273 return num; 284 return num;
274} 285}
275 286
287static size_t ath10k_debug_fw_stats_num_vdevs(struct list_head *head)
288{
289 struct ath10k_fw_stats_vdev *i;
290 size_t num = 0;
291
292 list_for_each_entry(i, head, list)
293 ++num;
294
295 return num;
296}
297
276void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb) 298void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb)
277{ 299{
278 struct ath10k_fw_stats stats = {}; 300 struct ath10k_fw_stats stats = {};
279 bool is_start, is_started, is_end; 301 bool is_start, is_started, is_end;
280 size_t num_peers; 302 size_t num_peers;
303 size_t num_vdevs;
281 int ret; 304 int ret;
282 305
283 INIT_LIST_HEAD(&stats.pdevs); 306 INIT_LIST_HEAD(&stats.pdevs);
307 INIT_LIST_HEAD(&stats.vdevs);
284 INIT_LIST_HEAD(&stats.peers); 308 INIT_LIST_HEAD(&stats.peers);
285 309
286 spin_lock_bh(&ar->data_lock); 310 spin_lock_bh(&ar->data_lock);
@@ -308,6 +332,7 @@ void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb)
308 } 332 }
309 333
310 num_peers = ath10k_debug_fw_stats_num_peers(&ar->debug.fw_stats.peers); 334 num_peers = ath10k_debug_fw_stats_num_peers(&ar->debug.fw_stats.peers);
335 num_vdevs = ath10k_debug_fw_stats_num_vdevs(&ar->debug.fw_stats.vdevs);
311 is_start = (list_empty(&ar->debug.fw_stats.pdevs) && 336 is_start = (list_empty(&ar->debug.fw_stats.pdevs) &&
312 !list_empty(&stats.pdevs)); 337 !list_empty(&stats.pdevs));
313 is_end = (!list_empty(&ar->debug.fw_stats.pdevs) && 338 is_end = (!list_empty(&ar->debug.fw_stats.pdevs) &&
@@ -330,7 +355,13 @@ void ath10k_debug_fw_stats_process(struct ath10k *ar, struct sk_buff *skb)
330 goto free; 355 goto free;
331 } 356 }
332 357
358 if (num_vdevs >= BITS_PER_LONG) {
359 ath10k_warn(ar, "dropping fw vdev stats\n");
360 goto free;
361 }
362
333 list_splice_tail_init(&stats.peers, &ar->debug.fw_stats.peers); 363 list_splice_tail_init(&stats.peers, &ar->debug.fw_stats.peers);
364 list_splice_tail_init(&stats.vdevs, &ar->debug.fw_stats.vdevs);
334 } 365 }
335 366
336 complete(&ar->debug.fw_stats_complete); 367 complete(&ar->debug.fw_stats_complete);
@@ -340,6 +371,7 @@ free:
340 * resources if that is not the case. 371 * resources if that is not the case.
341 */ 372 */
342 ath10k_debug_fw_stats_pdevs_free(&stats.pdevs); 373 ath10k_debug_fw_stats_pdevs_free(&stats.pdevs);
374 ath10k_debug_fw_stats_vdevs_free(&stats.vdevs);
343 ath10k_debug_fw_stats_peers_free(&stats.peers); 375 ath10k_debug_fw_stats_peers_free(&stats.peers);
344 376
345unlock: 377unlock:
@@ -363,7 +395,10 @@ static int ath10k_debug_fw_stats_request(struct ath10k *ar)
363 395
364 reinit_completion(&ar->debug.fw_stats_complete); 396 reinit_completion(&ar->debug.fw_stats_complete);
365 397
366 ret = ath10k_wmi_request_stats(ar, WMI_REQUEST_PEER_STAT); 398 ret = ath10k_wmi_request_stats(ar,
399 WMI_STAT_PDEV |
400 WMI_STAT_VDEV |
401 WMI_STAT_PEER);
367 if (ret) { 402 if (ret) {
368 ath10k_warn(ar, "could not request stats (%d)\n", ret); 403 ath10k_warn(ar, "could not request stats (%d)\n", ret);
369 return ret; 404 return ret;
@@ -395,8 +430,11 @@ static void ath10k_fw_stats_fill(struct ath10k *ar,
395 unsigned int len = 0; 430 unsigned int len = 0;
396 unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE; 431 unsigned int buf_len = ATH10K_FW_STATS_BUF_SIZE;
397 const struct ath10k_fw_stats_pdev *pdev; 432 const struct ath10k_fw_stats_pdev *pdev;
433 const struct ath10k_fw_stats_vdev *vdev;
398 const struct ath10k_fw_stats_peer *peer; 434 const struct ath10k_fw_stats_peer *peer;
399 size_t num_peers; 435 size_t num_peers;
436 size_t num_vdevs;
437 int i;
400 438
401 spin_lock_bh(&ar->data_lock); 439 spin_lock_bh(&ar->data_lock);
402 440
@@ -408,6 +446,7 @@ static void ath10k_fw_stats_fill(struct ath10k *ar,
408 } 446 }
409 447
410 num_peers = ath10k_debug_fw_stats_num_peers(&fw_stats->peers); 448 num_peers = ath10k_debug_fw_stats_num_peers(&fw_stats->peers);
449 num_vdevs = ath10k_debug_fw_stats_num_vdevs(&fw_stats->vdevs);
411 450
412 len += scnprintf(buf + len, buf_len - len, "\n"); 451 len += scnprintf(buf + len, buf_len - len, "\n");
413 len += scnprintf(buf + len, buf_len - len, "%30s\n", 452 len += scnprintf(buf + len, buf_len - len, "%30s\n",
@@ -531,6 +570,65 @@ static void ath10k_fw_stats_fill(struct ath10k *ar,
531 570
532 len += scnprintf(buf + len, buf_len - len, "\n"); 571 len += scnprintf(buf + len, buf_len - len, "\n");
533 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n", 572 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
573 "ath10k VDEV stats", num_vdevs);
574 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
575 "=================");
576
577 list_for_each_entry(vdev, &fw_stats->vdevs, list) {
578 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
579 "vdev id", vdev->vdev_id);
580 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
581 "beacon snr", vdev->beacon_snr);
582 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
583 "data snr", vdev->data_snr);
584 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
585 "num rx frames", vdev->num_rx_frames);
586 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
587 "num rts fail", vdev->num_rts_fail);
588 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
589 "num rts success", vdev->num_rts_success);
590 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
591 "num rx err", vdev->num_rx_err);
592 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
593 "num rx discard", vdev->num_rx_discard);
594 len += scnprintf(buf + len, buf_len - len, "%30s %u\n",
595 "num tx not acked", vdev->num_tx_not_acked);
596
597 for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames); i++)
598 len += scnprintf(buf + len, buf_len - len,
599 "%25s [%02d] %u\n",
600 "num tx frames", i,
601 vdev->num_tx_frames[i]);
602
603 for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_retries); i++)
604 len += scnprintf(buf + len, buf_len - len,
605 "%25s [%02d] %u\n",
606 "num tx frames retries", i,
607 vdev->num_tx_frames_retries[i]);
608
609 for (i = 0 ; i < ARRAY_SIZE(vdev->num_tx_frames_failures); i++)
610 len += scnprintf(buf + len, buf_len - len,
611 "%25s [%02d] %u\n",
612 "num tx frames failures", i,
613 vdev->num_tx_frames_failures[i]);
614
615 for (i = 0 ; i < ARRAY_SIZE(vdev->tx_rate_history); i++)
616 len += scnprintf(buf + len, buf_len - len,
617 "%25s [%02d] 0x%08x\n",
618 "tx rate history", i,
619 vdev->tx_rate_history[i]);
620
621 for (i = 0 ; i < ARRAY_SIZE(vdev->beacon_rssi_history); i++)
622 len += scnprintf(buf + len, buf_len - len,
623 "%25s [%02d] %u\n",
624 "beacon rssi history", i,
625 vdev->beacon_rssi_history[i]);
626
627 len += scnprintf(buf + len, buf_len - len, "\n");
628 }
629
630 len += scnprintf(buf + len, buf_len - len, "\n");
631 len += scnprintf(buf + len, buf_len - len, "%30s (%zu)\n",
534 "ath10k PEER stats", num_peers); 632 "ath10k PEER stats", num_peers);
535 len += scnprintf(buf + len, buf_len - len, "%30s\n\n", 633 len += scnprintf(buf + len, buf_len - len, "%30s\n\n",
536 "================="); 634 "=================");
@@ -1900,6 +1998,7 @@ int ath10k_debug_create(struct ath10k *ar)
1900 return -ENOMEM; 1998 return -ENOMEM;
1901 1999
1902 INIT_LIST_HEAD(&ar->debug.fw_stats.pdevs); 2000 INIT_LIST_HEAD(&ar->debug.fw_stats.pdevs);
2001 INIT_LIST_HEAD(&ar->debug.fw_stats.vdevs);
1903 INIT_LIST_HEAD(&ar->debug.fw_stats.peers); 2002 INIT_LIST_HEAD(&ar->debug.fw_stats.peers);
1904 2003
1905 return 0; 2004 return 0;
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index c1da44f65a4d..01a2b384f358 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -176,7 +176,7 @@ static void ath10k_htt_rx_msdu_buff_replenish(struct ath10k_htt *htt)
176 * automatically balances load wrt to CPU power. 176 * automatically balances load wrt to CPU power.
177 * 177 *
178 * This probably comes at a cost of lower maximum throughput but 178 * This probably comes at a cost of lower maximum throughput but
179 * improves the avarage and stability. */ 179 * improves the average and stability. */
180 spin_lock_bh(&htt->rx_ring.lock); 180 spin_lock_bh(&htt->rx_ring.lock);
181 num_deficit = htt->rx_ring.fill_level - htt->rx_ring.fill_cnt; 181 num_deficit = htt->rx_ring.fill_level - htt->rx_ring.fill_cnt;
182 num_to_fill = min(ATH10K_HTT_MAX_NUM_REFILL, num_deficit); 182 num_to_fill = min(ATH10K_HTT_MAX_NUM_REFILL, num_deficit);
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 4ce433f1c1fb..973485bd4121 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -611,7 +611,7 @@ static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
611 611
612 ret = ath10k_vdev_setup_sync(ar); 612 ret = ath10k_vdev_setup_sync(ar);
613 if (ret) { 613 if (ret) {
614 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i: %d\n", 614 ath10k_warn(ar, "failed to synchronize setup for monitor vdev %i start: %d\n",
615 vdev_id, ret); 615 vdev_id, ret);
616 return ret; 616 return ret;
617 } 617 }
@@ -658,7 +658,7 @@ static int ath10k_monitor_vdev_stop(struct ath10k *ar)
658 658
659 ret = ath10k_vdev_setup_sync(ar); 659 ret = ath10k_vdev_setup_sync(ar);
660 if (ret) 660 if (ret)
661 ath10k_warn(ar, "failed to synchronise monitor vdev %i: %d\n", 661 ath10k_warn(ar, "failed to synchronize monitor vdev %i stop: %d\n",
662 ar->monitor_vdev_id, ret); 662 ar->monitor_vdev_id, ret);
663 663
664 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n", 664 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor vdev %i stopped\n",
@@ -927,8 +927,9 @@ static int ath10k_vdev_start_restart(struct ath10k_vif *arvif, bool restart)
927 927
928 ret = ath10k_vdev_setup_sync(ar); 928 ret = ath10k_vdev_setup_sync(ar);
929 if (ret) { 929 if (ret) {
930 ath10k_warn(ar, "failed to synchronise setup for vdev %i: %d\n", 930 ath10k_warn(ar,
931 arg.vdev_id, ret); 931 "failed to synchronize setup for vdev %i restart %d: %d\n",
932 arg.vdev_id, restart, ret);
932 return ret; 933 return ret;
933 } 934 }
934 935
@@ -966,7 +967,7 @@ static int ath10k_vdev_stop(struct ath10k_vif *arvif)
966 967
967 ret = ath10k_vdev_setup_sync(ar); 968 ret = ath10k_vdev_setup_sync(ar);
968 if (ret) { 969 if (ret) {
969 ath10k_warn(ar, "failed to syncronise setup for vdev %i: %d\n", 970 ath10k_warn(ar, "failed to synchronize setup for vdev %i stop: %d\n",
970 arvif->vdev_id, ret); 971 arvif->vdev_id, ret);
971 return ret; 972 return ret;
972 } 973 }
@@ -1182,7 +1183,7 @@ static void ath10k_control_ibss(struct ath10k_vif *arvif,
1182 if (is_zero_ether_addr(arvif->bssid)) 1183 if (is_zero_ether_addr(arvif->bssid))
1183 return; 1184 return;
1184 1185
1185 memset(arvif->bssid, 0, ETH_ALEN); 1186 eth_zero_addr(arvif->bssid);
1186 1187
1187 return; 1188 return;
1188 } 1189 }
@@ -1253,6 +1254,20 @@ static int ath10k_mac_vif_recalc_ps_poll_count(struct ath10k_vif *arvif)
1253 return 0; 1254 return 0;
1254} 1255}
1255 1256
1257static int ath10k_mac_ps_vif_count(struct ath10k *ar)
1258{
1259 struct ath10k_vif *arvif;
1260 int num = 0;
1261
1262 lockdep_assert_held(&ar->conf_mutex);
1263
1264 list_for_each_entry(arvif, &ar->arvifs, list)
1265 if (arvif->ps)
1266 num++;
1267
1268 return num;
1269}
1270
1256static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif) 1271static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1257{ 1272{
1258 struct ath10k *ar = arvif->ar; 1273 struct ath10k *ar = arvif->ar;
@@ -1262,13 +1277,24 @@ static int ath10k_mac_vif_setup_ps(struct ath10k_vif *arvif)
1262 enum wmi_sta_ps_mode psmode; 1277 enum wmi_sta_ps_mode psmode;
1263 int ret; 1278 int ret;
1264 int ps_timeout; 1279 int ps_timeout;
1280 bool enable_ps;
1265 1281
1266 lockdep_assert_held(&arvif->ar->conf_mutex); 1282 lockdep_assert_held(&arvif->ar->conf_mutex);
1267 1283
1268 if (arvif->vif->type != NL80211_IFTYPE_STATION) 1284 if (arvif->vif->type != NL80211_IFTYPE_STATION)
1269 return 0; 1285 return 0;
1270 1286
1271 if (vif->bss_conf.ps) { 1287 enable_ps = arvif->ps;
1288
1289 if (enable_ps && ath10k_mac_ps_vif_count(ar) > 1 &&
1290 !test_bit(ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT,
1291 ar->fw_features)) {
1292 ath10k_warn(ar, "refusing to enable ps on vdev %i: not supported by fw\n",
1293 arvif->vdev_id);
1294 enable_ps = false;
1295 }
1296
1297 if (enable_ps) {
1272 psmode = WMI_STA_PS_MODE_ENABLED; 1298 psmode = WMI_STA_PS_MODE_ENABLED;
1273 param = WMI_STA_PS_PARAM_INACTIVITY_TIME; 1299 param = WMI_STA_PS_PARAM_INACTIVITY_TIME;
1274 1300
@@ -1386,7 +1412,8 @@ static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1386 lockdep_assert_held(&ar->conf_mutex); 1412 lockdep_assert_held(&ar->conf_mutex);
1387 1413
1388 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan, 1414 bss = cfg80211_get_bss(ar->hw->wiphy, ar->hw->conf.chandef.chan,
1389 info->bssid, NULL, 0, 0, 0); 1415 info->bssid, NULL, 0, IEEE80211_BSS_TYPE_ANY,
1416 IEEE80211_PRIVACY_ANY);
1390 if (bss) { 1417 if (bss) {
1391 const struct cfg80211_bss_ies *ies; 1418 const struct cfg80211_bss_ies *ies;
1392 1419
@@ -1781,6 +1808,68 @@ static int ath10k_setup_peer_smps(struct ath10k *ar, struct ath10k_vif *arvif,
1781 ath10k_smps_map[smps]); 1808 ath10k_smps_map[smps]);
1782} 1809}
1783 1810
1811static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
1812 struct ieee80211_vif *vif,
1813 struct ieee80211_sta_vht_cap vht_cap)
1814{
1815 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1816 int ret;
1817 u32 param;
1818 u32 value;
1819
1820 if (!(ar->vht_cap_info &
1821 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
1822 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE |
1823 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
1824 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
1825 return 0;
1826
1827 param = ar->wmi.vdev_param->txbf;
1828 value = 0;
1829
1830 if (WARN_ON(param == WMI_VDEV_PARAM_UNSUPPORTED))
1831 return 0;
1832
1833 /* The following logic is correct. If a remote STA advertises support
1834 * for being a beamformer then we should enable us being a beamformee.
1835 */
1836
1837 if (ar->vht_cap_info &
1838 (IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
1839 IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)) {
1840 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)
1841 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
1842
1843 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)
1844 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFEE;
1845 }
1846
1847 if (ar->vht_cap_info &
1848 (IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
1849 IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) {
1850 if (vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE)
1851 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
1852
1853 if (vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE)
1854 value |= WMI_VDEV_PARAM_TXBF_MU_TX_BFER;
1855 }
1856
1857 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFEE)
1858 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFEE;
1859
1860 if (value & WMI_VDEV_PARAM_TXBF_MU_TX_BFER)
1861 value |= WMI_VDEV_PARAM_TXBF_SU_TX_BFER;
1862
1863 ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, param, value);
1864 if (ret) {
1865 ath10k_warn(ar, "failed to submit vdev param txbf 0x%x: %d\n",
1866 value, ret);
1867 return ret;
1868 }
1869
1870 return 0;
1871}
1872
1784/* can be called only in mac80211 callbacks due to `key_count` usage */ 1873/* can be called only in mac80211 callbacks due to `key_count` usage */
1785static void ath10k_bss_assoc(struct ieee80211_hw *hw, 1874static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1786 struct ieee80211_vif *vif, 1875 struct ieee80211_vif *vif,
@@ -1789,6 +1878,7 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1789 struct ath10k *ar = hw->priv; 1878 struct ath10k *ar = hw->priv;
1790 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 1879 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1791 struct ieee80211_sta_ht_cap ht_cap; 1880 struct ieee80211_sta_ht_cap ht_cap;
1881 struct ieee80211_sta_vht_cap vht_cap;
1792 struct wmi_peer_assoc_complete_arg peer_arg; 1882 struct wmi_peer_assoc_complete_arg peer_arg;
1793 struct ieee80211_sta *ap_sta; 1883 struct ieee80211_sta *ap_sta;
1794 int ret; 1884 int ret;
@@ -1811,6 +1901,7 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1811 /* ap_sta must be accessed only within rcu section which must be left 1901 /* ap_sta must be accessed only within rcu section which must be left
1812 * before calling ath10k_setup_peer_smps() which might sleep. */ 1902 * before calling ath10k_setup_peer_smps() which might sleep. */
1813 ht_cap = ap_sta->ht_cap; 1903 ht_cap = ap_sta->ht_cap;
1904 vht_cap = ap_sta->vht_cap;
1814 1905
1815 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg); 1906 ret = ath10k_peer_assoc_prepare(ar, vif, ap_sta, &peer_arg);
1816 if (ret) { 1907 if (ret) {
@@ -1836,6 +1927,13 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1836 return; 1927 return;
1837 } 1928 }
1838 1929
1930 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
1931 if (ret) {
1932 ath10k_warn(ar, "failed to recalc txbf for vdev %i on bss %pM: %d\n",
1933 arvif->vdev_id, bss_conf->bssid, ret);
1934 return;
1935 }
1936
1839 ath10k_dbg(ar, ATH10K_DBG_MAC, 1937 ath10k_dbg(ar, ATH10K_DBG_MAC,
1840 "mac vdev %d up (associated) bssid %pM aid %d\n", 1938 "mac vdev %d up (associated) bssid %pM aid %d\n",
1841 arvif->vdev_id, bss_conf->bssid, bss_conf->aid); 1939 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
@@ -1853,6 +1951,18 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1853 } 1951 }
1854 1952
1855 arvif->is_up = true; 1953 arvif->is_up = true;
1954
1955 /* Workaround: Some firmware revisions (tested with qca6174
1956 * WLAN.RM.2.0-00073) have buggy powersave state machine and must be
1957 * poked with peer param command.
1958 */
1959 ret = ath10k_wmi_peer_set_param(ar, arvif->vdev_id, arvif->bssid,
1960 WMI_PEER_DUMMY_VAR, 1);
1961 if (ret) {
1962 ath10k_warn(ar, "failed to poke peer %pM param for ps workaround on vdev %i: %d\n",
1963 arvif->bssid, arvif->vdev_id, ret);
1964 return;
1965 }
1856} 1966}
1857 1967
1858static void ath10k_bss_disassoc(struct ieee80211_hw *hw, 1968static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
@@ -1860,6 +1970,7 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1860{ 1970{
1861 struct ath10k *ar = hw->priv; 1971 struct ath10k *ar = hw->priv;
1862 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 1972 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
1973 struct ieee80211_sta_vht_cap vht_cap = {};
1863 int ret; 1974 int ret;
1864 1975
1865 lockdep_assert_held(&ar->conf_mutex); 1976 lockdep_assert_held(&ar->conf_mutex);
@@ -1874,6 +1985,13 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
1874 1985
1875 arvif->def_wep_key_idx = -1; 1986 arvif->def_wep_key_idx = -1;
1876 1987
1988 ret = ath10k_mac_vif_recalc_txbf(ar, vif, vht_cap);
1989 if (ret) {
1990 ath10k_warn(ar, "failed to recalc txbf for vdev %i: %d\n",
1991 arvif->vdev_id, ret);
1992 return;
1993 }
1994
1877 arvif->is_up = false; 1995 arvif->is_up = false;
1878} 1996}
1879 1997
@@ -2554,6 +2672,17 @@ static int ath10k_start_scan(struct ath10k *ar,
2554 return -ETIMEDOUT; 2672 return -ETIMEDOUT;
2555 } 2673 }
2556 2674
2675 /* If we failed to start the scan, return error code at
2676 * this point. This is probably due to some issue in the
2677 * firmware, but no need to wedge the driver due to that...
2678 */
2679 spin_lock_bh(&ar->data_lock);
2680 if (ar->scan.state == ATH10K_SCAN_IDLE) {
2681 spin_unlock_bh(&ar->data_lock);
2682 return -EINVAL;
2683 }
2684 spin_unlock_bh(&ar->data_lock);
2685
2557 /* Add a 200ms margin to account for event/command processing */ 2686 /* Add a 200ms margin to account for event/command processing */
2558 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout, 2687 ieee80211_queue_delayed_work(ar->hw, &ar->scan.timeout,
2559 msecs_to_jiffies(arg->max_scan_time+200)); 2688 msecs_to_jiffies(arg->max_scan_time+200));
@@ -3323,9 +3452,10 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
3323 list_del(&arvif->list); 3452 list_del(&arvif->list);
3324 3453
3325 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) { 3454 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3326 ret = ath10k_peer_delete(arvif->ar, arvif->vdev_id, vif->addr); 3455 ret = ath10k_wmi_peer_delete(arvif->ar, arvif->vdev_id,
3456 vif->addr);
3327 if (ret) 3457 if (ret)
3328 ath10k_warn(ar, "failed to remove peer for AP vdev %i: %d\n", 3458 ath10k_warn(ar, "failed to submit AP self-peer removal on vdev %i: %d\n",
3329 arvif->vdev_id, ret); 3459 arvif->vdev_id, ret);
3330 3460
3331 kfree(arvif->u.ap.noa_data); 3461 kfree(arvif->u.ap.noa_data);
@@ -3339,6 +3469,21 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
3339 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n", 3469 ath10k_warn(ar, "failed to delete WMI vdev %i: %d\n",
3340 arvif->vdev_id, ret); 3470 arvif->vdev_id, ret);
3341 3471
3472 /* Some firmware revisions don't notify host about self-peer removal
3473 * until after associated vdev is deleted.
3474 */
3475 if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
3476 ret = ath10k_wait_for_peer_deleted(ar, arvif->vdev_id,
3477 vif->addr);
3478 if (ret)
3479 ath10k_warn(ar, "failed to remove AP self-peer on vdev %i: %d\n",
3480 arvif->vdev_id, ret);
3481
3482 spin_lock_bh(&ar->data_lock);
3483 ar->num_peers--;
3484 spin_unlock_bh(&ar->data_lock);
3485 }
3486
3342 ath10k_peer_cleanup(ar, arvif->vdev_id); 3487 ath10k_peer_cleanup(ar, arvif->vdev_id);
3343 3488
3344 mutex_unlock(&ar->conf_mutex); 3489 mutex_unlock(&ar->conf_mutex);
@@ -3534,7 +3679,9 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3534 } 3679 }
3535 3680
3536 if (changed & BSS_CHANGED_PS) { 3681 if (changed & BSS_CHANGED_PS) {
3537 ret = ath10k_mac_vif_setup_ps(arvif); 3682 arvif->ps = vif->bss_conf.ps;
3683
3684 ret = ath10k_config_ps(ar);
3538 if (ret) 3685 if (ret)
3539 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n", 3686 ath10k_warn(ar, "failed to setup ps on vdev %i: %d\n",
3540 arvif->vdev_id, ret); 3687 arvif->vdev_id, ret);
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index e6972b09333e..7681237fe298 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -104,7 +104,7 @@ static const struct ce_attr host_ce_config_wlan[] = {
104 { 104 {
105 .flags = CE_ATTR_FLAGS, 105 .flags = CE_ATTR_FLAGS,
106 .src_nentries = 0, 106 .src_nentries = 0,
107 .src_sz_max = 512, 107 .src_sz_max = 2048,
108 .dest_nentries = 512, 108 .dest_nentries = 512,
109 }, 109 },
110 110
@@ -174,7 +174,7 @@ static const struct ce_pipe_config target_ce_config_wlan[] = {
174 .pipenum = __cpu_to_le32(1), 174 .pipenum = __cpu_to_le32(1),
175 .pipedir = __cpu_to_le32(PIPEDIR_IN), 175 .pipedir = __cpu_to_le32(PIPEDIR_IN),
176 .nentries = __cpu_to_le32(32), 176 .nentries = __cpu_to_le32(32),
177 .nbytes_max = __cpu_to_le32(512), 177 .nbytes_max = __cpu_to_le32(2048),
178 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 178 .flags = __cpu_to_le32(CE_ATTR_FLAGS),
179 .reserved = __cpu_to_le32(0), 179 .reserved = __cpu_to_le32(0),
180 }, 180 },
diff --git a/drivers/net/wireless/ath/ath10k/wmi-ops.h b/drivers/net/wireless/ath/ath10k/wmi-ops.h
index 04dc4b9db04e..c8b64e7a6089 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-ops.h
+++ b/drivers/net/wireless/ath/ath10k/wmi-ops.h
@@ -110,8 +110,7 @@ struct wmi_ops {
110 bool deliver_cab); 110 bool deliver_cab);
111 struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar, 111 struct sk_buff *(*gen_pdev_set_wmm)(struct ath10k *ar,
112 const struct wmi_wmm_params_all_arg *arg); 112 const struct wmi_wmm_params_all_arg *arg);
113 struct sk_buff *(*gen_request_stats)(struct ath10k *ar, 113 struct sk_buff *(*gen_request_stats)(struct ath10k *ar, u32 stats_mask);
114 enum wmi_stats_id stats_id);
115 struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar, 114 struct sk_buff *(*gen_force_fw_hang)(struct ath10k *ar,
116 enum wmi_force_fw_hang_type type, 115 enum wmi_force_fw_hang_type type,
117 u32 delay_ms); 116 u32 delay_ms);
@@ -816,14 +815,14 @@ ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
816} 815}
817 816
818static inline int 817static inline int
819ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id) 818ath10k_wmi_request_stats(struct ath10k *ar, u32 stats_mask)
820{ 819{
821 struct sk_buff *skb; 820 struct sk_buff *skb;
822 821
823 if (!ar->wmi.ops->gen_request_stats) 822 if (!ar->wmi.ops->gen_request_stats)
824 return -EOPNOTSUPP; 823 return -EOPNOTSUPP;
825 824
826 skb = ar->wmi.ops->gen_request_stats(ar, stats_id); 825 skb = ar->wmi.ops->gen_request_stats(ar, stats_mask);
827 if (IS_ERR(skb)) 826 if (IS_ERR(skb))
828 return PTR_ERR(skb); 827 return PTR_ERR(skb);
829 828
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
index 71614ba1b145..ee0c5f602e29 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
@@ -869,16 +869,57 @@ static int ath10k_wmi_tlv_op_pull_rdy_ev(struct ath10k *ar,
869 return 0; 869 return 0;
870} 870}
871 871
872static void ath10k_wmi_tlv_pull_vdev_stats(const struct wmi_tlv_vdev_stats *src,
873 struct ath10k_fw_stats_vdev *dst)
874{
875 int i;
876
877 dst->vdev_id = __le32_to_cpu(src->vdev_id);
878 dst->beacon_snr = __le32_to_cpu(src->beacon_snr);
879 dst->data_snr = __le32_to_cpu(src->data_snr);
880 dst->num_rx_frames = __le32_to_cpu(src->num_rx_frames);
881 dst->num_rts_fail = __le32_to_cpu(src->num_rts_fail);
882 dst->num_rts_success = __le32_to_cpu(src->num_rts_success);
883 dst->num_rx_err = __le32_to_cpu(src->num_rx_err);
884 dst->num_rx_discard = __le32_to_cpu(src->num_rx_discard);
885 dst->num_tx_not_acked = __le32_to_cpu(src->num_tx_not_acked);
886
887 for (i = 0; i < ARRAY_SIZE(src->num_tx_frames); i++)
888 dst->num_tx_frames[i] =
889 __le32_to_cpu(src->num_tx_frames[i]);
890
891 for (i = 0; i < ARRAY_SIZE(src->num_tx_frames_retries); i++)
892 dst->num_tx_frames_retries[i] =
893 __le32_to_cpu(src->num_tx_frames_retries[i]);
894
895 for (i = 0; i < ARRAY_SIZE(src->num_tx_frames_failures); i++)
896 dst->num_tx_frames_failures[i] =
897 __le32_to_cpu(src->num_tx_frames_failures[i]);
898
899 for (i = 0; i < ARRAY_SIZE(src->tx_rate_history); i++)
900 dst->tx_rate_history[i] =
901 __le32_to_cpu(src->tx_rate_history[i]);
902
903 for (i = 0; i < ARRAY_SIZE(src->beacon_rssi_history); i++)
904 dst->beacon_rssi_history[i] =
905 __le32_to_cpu(src->beacon_rssi_history[i]);
906}
907
872static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar, 908static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar,
873 struct sk_buff *skb, 909 struct sk_buff *skb,
874 struct ath10k_fw_stats *stats) 910 struct ath10k_fw_stats *stats)
875{ 911{
876 const void **tb; 912 const void **tb;
877 const struct wmi_stats_event *ev; 913 const struct wmi_tlv_stats_ev *ev;
878 const void *data; 914 const void *data;
879 u32 num_pdev_stats, num_vdev_stats, num_peer_stats; 915 u32 num_pdev_stats;
916 u32 num_vdev_stats;
917 u32 num_peer_stats;
918 u32 num_bcnflt_stats;
919 u32 num_chan_stats;
880 size_t data_len; 920 size_t data_len;
881 int ret; 921 int ret;
922 int i;
882 923
883 tb = ath10k_wmi_tlv_parse_alloc(ar, skb->data, skb->len, GFP_ATOMIC); 924 tb = ath10k_wmi_tlv_parse_alloc(ar, skb->data, skb->len, GFP_ATOMIC);
884 if (IS_ERR(tb)) { 925 if (IS_ERR(tb)) {
@@ -899,8 +940,73 @@ static int ath10k_wmi_tlv_op_pull_fw_stats(struct ath10k *ar,
899 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats); 940 num_pdev_stats = __le32_to_cpu(ev->num_pdev_stats);
900 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats); 941 num_vdev_stats = __le32_to_cpu(ev->num_vdev_stats);
901 num_peer_stats = __le32_to_cpu(ev->num_peer_stats); 942 num_peer_stats = __le32_to_cpu(ev->num_peer_stats);
943 num_bcnflt_stats = __le32_to_cpu(ev->num_bcnflt_stats);
944 num_chan_stats = __le32_to_cpu(ev->num_chan_stats);
945
946 ath10k_dbg(ar, ATH10K_DBG_WMI,
947 "wmi tlv stats update pdev %i vdev %i peer %i bcnflt %i chan %i\n",
948 num_pdev_stats, num_vdev_stats, num_peer_stats,
949 num_bcnflt_stats, num_chan_stats);
950
951 for (i = 0; i < num_pdev_stats; i++) {
952 const struct wmi_pdev_stats *src;
953 struct ath10k_fw_stats_pdev *dst;
954
955 src = data;
956 if (data_len < sizeof(*src))
957 return -EPROTO;
958
959 data += sizeof(*src);
960 data_len -= sizeof(*src);
961
962 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
963 if (!dst)
964 continue;
965
966 ath10k_wmi_pull_pdev_stats_base(&src->base, dst);
967 ath10k_wmi_pull_pdev_stats_tx(&src->tx, dst);
968 ath10k_wmi_pull_pdev_stats_rx(&src->rx, dst);
969 list_add_tail(&dst->list, &stats->pdevs);
970 }
971
972 for (i = 0; i < num_vdev_stats; i++) {
973 const struct wmi_tlv_vdev_stats *src;
974 struct ath10k_fw_stats_vdev *dst;
975
976 src = data;
977 if (data_len < sizeof(*src))
978 return -EPROTO;
979
980 data += sizeof(*src);
981 data_len -= sizeof(*src);
982
983 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
984 if (!dst)
985 continue;
902 986
903 WARN_ON(1); /* FIXME: not implemented yet */ 987 ath10k_wmi_tlv_pull_vdev_stats(src, dst);
988 list_add_tail(&dst->list, &stats->vdevs);
989 }
990
991 for (i = 0; i < num_peer_stats; i++) {
992 const struct wmi_10x_peer_stats *src;
993 struct ath10k_fw_stats_peer *dst;
994
995 src = data;
996 if (data_len < sizeof(*src))
997 return -EPROTO;
998
999 data += sizeof(*src);
1000 data_len -= sizeof(*src);
1001
1002 dst = kzalloc(sizeof(*dst), GFP_ATOMIC);
1003 if (!dst)
1004 continue;
1005
1006 ath10k_wmi_pull_peer_stats(&src->old, dst);
1007 dst->peer_rx_rate = __le32_to_cpu(src->peer_rx_rate);
1008 list_add_tail(&dst->list, &stats->peers);
1009 }
904 1010
905 kfree(tb); 1011 kfree(tb);
906 return 0; 1012 return 0;
@@ -1604,14 +1710,12 @@ ath10k_wmi_tlv_op_gen_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id,
1604 const struct wmi_wmm_params_all_arg *arg) 1710 const struct wmi_wmm_params_all_arg *arg)
1605{ 1711{
1606 struct wmi_tlv_vdev_set_wmm_cmd *cmd; 1712 struct wmi_tlv_vdev_set_wmm_cmd *cmd;
1607 struct wmi_wmm_params *wmm;
1608 struct wmi_tlv *tlv; 1713 struct wmi_tlv *tlv;
1609 struct sk_buff *skb; 1714 struct sk_buff *skb;
1610 size_t len; 1715 size_t len;
1611 void *ptr; 1716 void *ptr;
1612 1717
1613 len = (sizeof(*tlv) + sizeof(*cmd)) + 1718 len = sizeof(*tlv) + sizeof(*cmd);
1614 (4 * (sizeof(*tlv) + sizeof(*wmm)));
1615 skb = ath10k_wmi_alloc_skb(ar, len); 1719 skb = ath10k_wmi_alloc_skb(ar, len);
1616 if (!skb) 1720 if (!skb)
1617 return ERR_PTR(-ENOMEM); 1721 return ERR_PTR(-ENOMEM);
@@ -1623,13 +1727,10 @@ ath10k_wmi_tlv_op_gen_vdev_wmm_conf(struct ath10k *ar, u32 vdev_id,
1623 cmd = (void *)tlv->value; 1727 cmd = (void *)tlv->value;
1624 cmd->vdev_id = __cpu_to_le32(vdev_id); 1728 cmd->vdev_id = __cpu_to_le32(vdev_id);
1625 1729
1626 ptr += sizeof(*tlv); 1730 ath10k_wmi_set_wmm_param(&cmd->vdev_wmm_params[0].params, &arg->ac_be);
1627 ptr += sizeof(*cmd); 1731 ath10k_wmi_set_wmm_param(&cmd->vdev_wmm_params[1].params, &arg->ac_bk);
1628 1732 ath10k_wmi_set_wmm_param(&cmd->vdev_wmm_params[2].params, &arg->ac_vi);
1629 ptr = ath10k_wmi_tlv_put_wmm(ptr, &arg->ac_be); 1733 ath10k_wmi_set_wmm_param(&cmd->vdev_wmm_params[3].params, &arg->ac_vo);
1630 ptr = ath10k_wmi_tlv_put_wmm(ptr, &arg->ac_bk);
1631 ptr = ath10k_wmi_tlv_put_wmm(ptr, &arg->ac_vi);
1632 ptr = ath10k_wmi_tlv_put_wmm(ptr, &arg->ac_vo);
1633 1734
1634 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv vdev wmm conf\n"); 1735 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv vdev wmm conf\n");
1635 return skb; 1736 return skb;
@@ -2080,8 +2181,7 @@ ath10k_wmi_tlv_op_gen_pdev_set_wmm(struct ath10k *ar,
2080} 2181}
2081 2182
2082static struct sk_buff * 2183static struct sk_buff *
2083ath10k_wmi_tlv_op_gen_request_stats(struct ath10k *ar, 2184ath10k_wmi_tlv_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
2084 enum wmi_stats_id stats_id)
2085{ 2185{
2086 struct wmi_request_stats_cmd *cmd; 2186 struct wmi_request_stats_cmd *cmd;
2087 struct wmi_tlv *tlv; 2187 struct wmi_tlv *tlv;
@@ -2095,7 +2195,7 @@ ath10k_wmi_tlv_op_gen_request_stats(struct ath10k *ar,
2095 tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_REQUEST_STATS_CMD); 2195 tlv->tag = __cpu_to_le16(WMI_TLV_TAG_STRUCT_REQUEST_STATS_CMD);
2096 tlv->len = __cpu_to_le16(sizeof(*cmd)); 2196 tlv->len = __cpu_to_le16(sizeof(*cmd));
2097 cmd = (void *)tlv->value; 2197 cmd = (void *)tlv->value;
2098 cmd->stats_id = __cpu_to_le32(stats_id); 2198 cmd->stats_id = __cpu_to_le32(stats_mask);
2099 2199
2100 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv request stats\n"); 2200 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi tlv request stats\n");
2101 return skb; 2201 return skb;
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.h b/drivers/net/wireless/ath/ath10k/wmi-tlv.h
index de68fe76eae6..a6c8280cc4b1 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.h
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.h
@@ -1302,8 +1302,14 @@ struct wmi_tlv_pdev_set_wmm_cmd {
1302 __le32 dg_type; /* no idea.. */ 1302 __le32 dg_type; /* no idea.. */
1303} __packed; 1303} __packed;
1304 1304
1305struct wmi_tlv_vdev_wmm_params {
1306 __le32 dummy;
1307 struct wmi_wmm_params params;
1308} __packed;
1309
1305struct wmi_tlv_vdev_set_wmm_cmd { 1310struct wmi_tlv_vdev_set_wmm_cmd {
1306 __le32 vdev_id; 1311 __le32 vdev_id;
1312 struct wmi_tlv_vdev_wmm_params vdev_wmm_params[4];
1307} __packed; 1313} __packed;
1308 1314
1309struct wmi_tlv_phyerr_ev { 1315struct wmi_tlv_phyerr_ev {
@@ -1439,6 +1445,15 @@ struct wmi_tlv_sta_keepalive_cmd {
1439 __le32 interval; /* in seconds */ 1445 __le32 interval; /* in seconds */
1440} __packed; 1446} __packed;
1441 1447
1448struct wmi_tlv_stats_ev {
1449 __le32 stats_id; /* WMI_STAT_ */
1450 __le32 num_pdev_stats;
1451 __le32 num_vdev_stats;
1452 __le32 num_peer_stats;
1453 __le32 num_bcnflt_stats;
1454 __le32 num_chan_stats;
1455} __packed;
1456
1442void ath10k_wmi_tlv_attach(struct ath10k *ar); 1457void ath10k_wmi_tlv_attach(struct ath10k *ar);
1443 1458
1444#endif 1459#endif
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index aeea1c793943..c7ea77edce24 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -1125,6 +1125,25 @@ static void ath10k_wmi_event_scan_started(struct ath10k *ar)
1125 } 1125 }
1126} 1126}
1127 1127
1128static void ath10k_wmi_event_scan_start_failed(struct ath10k *ar)
1129{
1130 lockdep_assert_held(&ar->data_lock);
1131
1132 switch (ar->scan.state) {
1133 case ATH10K_SCAN_IDLE:
1134 case ATH10K_SCAN_RUNNING:
1135 case ATH10K_SCAN_ABORTING:
1136 ath10k_warn(ar, "received scan start failed event in an invalid scan state: %s (%d)\n",
1137 ath10k_scan_state_str(ar->scan.state),
1138 ar->scan.state);
1139 break;
1140 case ATH10K_SCAN_STARTING:
1141 complete(&ar->scan.started);
1142 __ath10k_scan_finish(ar);
1143 break;
1144 }
1145}
1146
1128static void ath10k_wmi_event_scan_completed(struct ath10k *ar) 1147static void ath10k_wmi_event_scan_completed(struct ath10k *ar)
1129{ 1148{
1130 lockdep_assert_held(&ar->data_lock); 1149 lockdep_assert_held(&ar->data_lock);
@@ -1292,6 +1311,7 @@ int ath10k_wmi_event_scan(struct ath10k *ar, struct sk_buff *skb)
1292 break; 1311 break;
1293 case WMI_SCAN_EVENT_START_FAILED: 1312 case WMI_SCAN_EVENT_START_FAILED:
1294 ath10k_warn(ar, "received scan start failure event\n"); 1313 ath10k_warn(ar, "received scan start failure event\n");
1314 ath10k_wmi_event_scan_start_failed(ar);
1295 break; 1315 break;
1296 case WMI_SCAN_EVENT_DEQUEUED: 1316 case WMI_SCAN_EVENT_DEQUEUED:
1297 case WMI_SCAN_EVENT_PREEMPTED: 1317 case WMI_SCAN_EVENT_PREEMPTED:
@@ -4954,7 +4974,7 @@ ath10k_wmi_op_gen_pdev_set_wmm(struct ath10k *ar,
4954} 4974}
4955 4975
4956static struct sk_buff * 4976static struct sk_buff *
4957ath10k_wmi_op_gen_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id) 4977ath10k_wmi_op_gen_request_stats(struct ath10k *ar, u32 stats_mask)
4958{ 4978{
4959 struct wmi_request_stats_cmd *cmd; 4979 struct wmi_request_stats_cmd *cmd;
4960 struct sk_buff *skb; 4980 struct sk_buff *skb;
@@ -4964,9 +4984,10 @@ ath10k_wmi_op_gen_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id)
4964 return ERR_PTR(-ENOMEM); 4984 return ERR_PTR(-ENOMEM);
4965 4985
4966 cmd = (struct wmi_request_stats_cmd *)skb->data; 4986 cmd = (struct wmi_request_stats_cmd *)skb->data;
4967 cmd->stats_id = __cpu_to_le32(stats_id); 4987 cmd->stats_id = __cpu_to_le32(stats_mask);
4968 4988
4969 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats %d\n", (int)stats_id); 4989 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi request stats 0x%08x\n",
4990 stats_mask);
4970 return skb; 4991 return skb;
4971} 4992}
4972 4993
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 20ce3603e64b..adf935bf0580 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -3057,8 +3057,12 @@ struct wmi_pdev_stats_peer {
3057} __packed; 3057} __packed;
3058 3058
3059enum wmi_stats_id { 3059enum wmi_stats_id {
3060 WMI_REQUEST_PEER_STAT = 0x01, 3060 WMI_STAT_PEER = BIT(0),
3061 WMI_REQUEST_AP_STAT = 0x02 3061 WMI_STAT_AP = BIT(1),
3062 WMI_STAT_PDEV = BIT(2),
3063 WMI_STAT_VDEV = BIT(3),
3064 WMI_STAT_BCNFLT = BIT(4),
3065 WMI_STAT_VDEV_RATE = BIT(5),
3062}; 3066};
3063 3067
3064struct wlan_inst_rssi_args { 3068struct wlan_inst_rssi_args {
@@ -3093,7 +3097,7 @@ struct wmi_pdev_suspend_cmd {
3093} __packed; 3097} __packed;
3094 3098
3095struct wmi_stats_event { 3099struct wmi_stats_event {
3096 __le32 stats_id; /* %WMI_REQUEST_ */ 3100 __le32 stats_id; /* WMI_STAT_ */
3097 /* 3101 /*
3098 * number of pdev stats event structures 3102 * number of pdev stats event structures
3099 * (wmi_pdev_stats) 0 or 1 3103 * (wmi_pdev_stats) 0 or 1
@@ -3745,6 +3749,11 @@ enum wmi_10x_vdev_param {
3745 WMI_10X_VDEV_PARAM_VHT80_RATEMASK, 3749 WMI_10X_VDEV_PARAM_VHT80_RATEMASK,
3746}; 3750};
3747 3751
3752#define WMI_VDEV_PARAM_TXBF_SU_TX_BFEE BIT(0)
3753#define WMI_VDEV_PARAM_TXBF_MU_TX_BFEE BIT(1)
3754#define WMI_VDEV_PARAM_TXBF_SU_TX_BFER BIT(2)
3755#define WMI_VDEV_PARAM_TXBF_MU_TX_BFER BIT(3)
3756
3748/* slot time long */ 3757/* slot time long */
3749#define WMI_VDEV_SLOT_TIME_LONG 0x1 3758#define WMI_VDEV_SLOT_TIME_LONG 0x1
3750/* slot time short */ 3759/* slot time short */
@@ -4436,7 +4445,8 @@ enum wmi_peer_param {
4436 WMI_PEER_AUTHORIZE = 0x3, 4445 WMI_PEER_AUTHORIZE = 0x3,
4437 WMI_PEER_CHAN_WIDTH = 0x4, 4446 WMI_PEER_CHAN_WIDTH = 0x4,
4438 WMI_PEER_NSS = 0x5, 4447 WMI_PEER_NSS = 0x5,
4439 WMI_PEER_USE_4ADDR = 0x6 4448 WMI_PEER_USE_4ADDR = 0x6,
4449 WMI_PEER_DUMMY_VAR = 0xff, /* dummy parameter for STA PS workaround */
4440}; 4450};
4441 4451
4442struct wmi_peer_set_param_cmd { 4452struct wmi_peer_set_param_cmd {
diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
index 1ed7a88aeea9..7ca0d6f930fd 100644
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
@@ -1283,6 +1283,7 @@ struct ath5k_hw {
1283#define ATH_STAT_PROMISC 1 1283#define ATH_STAT_PROMISC 1
1284#define ATH_STAT_LEDSOFT 2 /* enable LED gpio status */ 1284#define ATH_STAT_LEDSOFT 2 /* enable LED gpio status */
1285#define ATH_STAT_STARTED 3 /* opened & irqs enabled */ 1285#define ATH_STAT_STARTED 3 /* opened & irqs enabled */
1286#define ATH_STAT_RESET 4 /* hw reset */
1286 1287
1287 unsigned int filter_flags; /* HW flags, AR5K_RX_FILTER_* */ 1288 unsigned int filter_flags; /* HW flags, AR5K_RX_FILTER_* */
1288 unsigned int fif_filter_flags; /* Current FIF_* filter flags */ 1289 unsigned int fif_filter_flags; /* Current FIF_* filter flags */
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index bc9cb356fa69..a6131825c9f6 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -528,7 +528,7 @@ ath5k_update_bssid_mask_and_opmode(struct ath5k_hw *ah,
528 * together with the BSSID mask when matching addresses. 528 * together with the BSSID mask when matching addresses.
529 */ 529 */
530 iter_data.hw_macaddr = common->macaddr; 530 iter_data.hw_macaddr = common->macaddr;
531 memset(&iter_data.mask, 0xff, ETH_ALEN); 531 eth_broadcast_addr(iter_data.mask);
532 iter_data.found_active = false; 532 iter_data.found_active = false;
533 iter_data.need_set_hw_addr = true; 533 iter_data.need_set_hw_addr = true;
534 iter_data.opmode = NL80211_IFTYPE_UNSPECIFIED; 534 iter_data.opmode = NL80211_IFTYPE_UNSPECIFIED;
@@ -1523,6 +1523,9 @@ ath5k_set_current_imask(struct ath5k_hw *ah)
1523 enum ath5k_int imask; 1523 enum ath5k_int imask;
1524 unsigned long flags; 1524 unsigned long flags;
1525 1525
1526 if (test_bit(ATH_STAT_RESET, ah->status))
1527 return;
1528
1526 spin_lock_irqsave(&ah->irqlock, flags); 1529 spin_lock_irqsave(&ah->irqlock, flags);
1527 imask = ah->imask; 1530 imask = ah->imask;
1528 if (ah->rx_pending) 1531 if (ah->rx_pending)
@@ -2858,10 +2861,12 @@ ath5k_reset(struct ath5k_hw *ah, struct ieee80211_channel *chan,
2858{ 2861{
2859 struct ath_common *common = ath5k_hw_common(ah); 2862 struct ath_common *common = ath5k_hw_common(ah);
2860 int ret, ani_mode; 2863 int ret, ani_mode;
2861 bool fast; 2864 bool fast = chan && modparam_fastchanswitch ? 1 : 0;
2862 2865
2863 ATH5K_DBG(ah, ATH5K_DEBUG_RESET, "resetting\n"); 2866 ATH5K_DBG(ah, ATH5K_DEBUG_RESET, "resetting\n");
2864 2867
2868 __set_bit(ATH_STAT_RESET, ah->status);
2869
2865 ath5k_hw_set_imr(ah, 0); 2870 ath5k_hw_set_imr(ah, 0);
2866 synchronize_irq(ah->irq); 2871 synchronize_irq(ah->irq);
2867 ath5k_stop_tasklets(ah); 2872 ath5k_stop_tasklets(ah);
@@ -2876,11 +2881,29 @@ ath5k_reset(struct ath5k_hw *ah, struct ieee80211_channel *chan,
2876 * so we should also free any remaining 2881 * so we should also free any remaining
2877 * tx buffers */ 2882 * tx buffers */
2878 ath5k_drain_tx_buffs(ah); 2883 ath5k_drain_tx_buffs(ah);
2884
2885 /* Stop PCU */
2886 ath5k_hw_stop_rx_pcu(ah);
2887
2888 /* Stop DMA
2889 *
2890 * Note: If DMA didn't stop continue
2891 * since only a reset will fix it.
2892 */
2893 ret = ath5k_hw_dma_stop(ah);
2894
2895 /* RF Bus grant won't work if we have pending
2896 * frames
2897 */
2898 if (ret && fast) {
2899 ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
2900 "DMA didn't stop, falling back to normal reset\n");
2901 fast = false;
2902 }
2903
2879 if (chan) 2904 if (chan)
2880 ah->curchan = chan; 2905 ah->curchan = chan;
2881 2906
2882 fast = ((chan != NULL) && modparam_fastchanswitch) ? 1 : 0;
2883
2884 ret = ath5k_hw_reset(ah, ah->opmode, ah->curchan, fast, skip_pcu); 2907 ret = ath5k_hw_reset(ah, ah->opmode, ah->curchan, fast, skip_pcu);
2885 if (ret) { 2908 if (ret) {
2886 ATH5K_ERR(ah, "can't reset hardware (%d)\n", ret); 2909 ATH5K_ERR(ah, "can't reset hardware (%d)\n", ret);
@@ -2934,6 +2957,8 @@ ath5k_reset(struct ath5k_hw *ah, struct ieee80211_channel *chan,
2934 */ 2957 */
2935/* ath5k_chan_change(ah, c); */ 2958/* ath5k_chan_change(ah, c); */
2936 2959
2960 __clear_bit(ATH_STAT_RESET, ah->status);
2961
2937 ath5k_beacon_config(ah); 2962 ath5k_beacon_config(ah);
2938 /* intrs are enabled by ath5k_beacon_config */ 2963 /* intrs are enabled by ath5k_beacon_config */
2939 2964
diff --git a/drivers/net/wireless/ath/ath5k/reset.c b/drivers/net/wireless/ath/ath5k/reset.c
index b9b651ea9851..99e62f99a182 100644
--- a/drivers/net/wireless/ath/ath5k/reset.c
+++ b/drivers/net/wireless/ath/ath5k/reset.c
@@ -1169,30 +1169,6 @@ ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
1169 if (ah->ah_version == AR5K_AR5212) 1169 if (ah->ah_version == AR5K_AR5212)
1170 ath5k_hw_set_sleep_clock(ah, false); 1170 ath5k_hw_set_sleep_clock(ah, false);
1171 1171
1172 /*
1173 * Stop PCU
1174 */
1175 ath5k_hw_stop_rx_pcu(ah);
1176
1177 /*
1178 * Stop DMA
1179 *
1180 * Note: If DMA didn't stop continue
1181 * since only a reset will fix it.
1182 */
1183 ret = ath5k_hw_dma_stop(ah);
1184
1185 /* RF Bus grant won't work if we have pending
1186 * frames */
1187 if (ret && fast) {
1188 ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
1189 "DMA didn't stop, falling back to normal reset\n");
1190 fast = false;
1191 /* Non fatal, just continue with
1192 * normal reset */
1193 ret = 0;
1194 }
1195
1196 mode = channel->hw_value; 1172 mode = channel->hw_value;
1197 switch (mode) { 1173 switch (mode) {
1198 case AR5K_MODE_11A: 1174 case AR5K_MODE_11A:
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c
index 85da63a67faf..cce4625a53ad 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
@@ -686,20 +686,21 @@ ath6kl_add_bss_if_needed(struct ath6kl_vif *vif,
686{ 686{
687 struct ath6kl *ar = vif->ar; 687 struct ath6kl *ar = vif->ar;
688 struct cfg80211_bss *bss; 688 struct cfg80211_bss *bss;
689 u16 cap_mask, cap_val; 689 u16 cap_val;
690 enum ieee80211_bss_type bss_type;
690 u8 *ie; 691 u8 *ie;
691 692
692 if (nw_type & ADHOC_NETWORK) { 693 if (nw_type & ADHOC_NETWORK) {
693 cap_mask = WLAN_CAPABILITY_IBSS;
694 cap_val = WLAN_CAPABILITY_IBSS; 694 cap_val = WLAN_CAPABILITY_IBSS;
695 bss_type = IEEE80211_BSS_TYPE_IBSS;
695 } else { 696 } else {
696 cap_mask = WLAN_CAPABILITY_ESS;
697 cap_val = WLAN_CAPABILITY_ESS; 697 cap_val = WLAN_CAPABILITY_ESS;
698 bss_type = IEEE80211_BSS_TYPE_ESS;
698 } 699 }
699 700
700 bss = cfg80211_get_bss(ar->wiphy, chan, bssid, 701 bss = cfg80211_get_bss(ar->wiphy, chan, bssid,
701 vif->ssid, vif->ssid_len, 702 vif->ssid, vif->ssid_len,
702 cap_mask, cap_val); 703 bss_type, IEEE80211_PRIVACY_ANY);
703 if (bss == NULL) { 704 if (bss == NULL) {
704 /* 705 /*
705 * Since cfg80211 may not yet know about the BSS, 706 * Since cfg80211 may not yet know about the BSS,
@@ -1495,6 +1496,7 @@ static int ath6kl_cfg80211_set_power_mgmt(struct wiphy *wiphy,
1495 1496
1496static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy, 1497static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,
1497 const char *name, 1498 const char *name,
1499 unsigned char name_assign_type,
1498 enum nl80211_iftype type, 1500 enum nl80211_iftype type,
1499 u32 *flags, 1501 u32 *flags,
1500 struct vif_params *params) 1502 struct vif_params *params)
@@ -1513,7 +1515,7 @@ static struct wireless_dev *ath6kl_cfg80211_add_iface(struct wiphy *wiphy,
1513 return ERR_PTR(-EINVAL); 1515 return ERR_PTR(-EINVAL);
1514 } 1516 }
1515 1517
1516 wdev = ath6kl_interface_add(ar, name, type, if_idx, nw_type); 1518 wdev = ath6kl_interface_add(ar, name, name_assign_type, type, if_idx, nw_type);
1517 if (!wdev) 1519 if (!wdev)
1518 return ERR_PTR(-ENOMEM); 1520 return ERR_PTR(-ENOMEM);
1519 1521
@@ -2033,7 +2035,7 @@ static int ath6kl_wow_sta(struct ath6kl *ar, struct ath6kl_vif *vif)
2033 int ret; 2035 int ret;
2034 2036
2035 /* Setup unicast pkt pattern */ 2037 /* Setup unicast pkt pattern */
2036 memset(mac_mask, 0xff, ETH_ALEN); 2038 eth_broadcast_addr(mac_mask);
2037 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi, 2039 ret = ath6kl_wmi_add_wow_pattern_cmd(ar->wmi,
2038 vif->fw_vif_idx, WOW_LIST_ID, 2040 vif->fw_vif_idx, WOW_LIST_ID,
2039 ETH_ALEN, 0, ndev->dev_addr, 2041 ETH_ALEN, 0, ndev->dev_addr,
@@ -3633,13 +3635,14 @@ void ath6kl_cfg80211_vif_cleanup(struct ath6kl_vif *vif)
3633} 3635}
3634 3636
3635struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name, 3637struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name,
3638 unsigned char name_assign_type,
3636 enum nl80211_iftype type, 3639 enum nl80211_iftype type,
3637 u8 fw_vif_idx, u8 nw_type) 3640 u8 fw_vif_idx, u8 nw_type)
3638{ 3641{
3639 struct net_device *ndev; 3642 struct net_device *ndev;
3640 struct ath6kl_vif *vif; 3643 struct ath6kl_vif *vif;
3641 3644
3642 ndev = alloc_netdev(sizeof(*vif), name, NET_NAME_UNKNOWN, ether_setup); 3645 ndev = alloc_netdev(sizeof(*vif), name, name_assign_type, ether_setup);
3643 if (!ndev) 3646 if (!ndev)
3644 return NULL; 3647 return NULL;
3645 3648
diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.h b/drivers/net/wireless/ath/ath6kl/cfg80211.h
index b59becd91aea..5aa57a7639bf 100644
--- a/drivers/net/wireless/ath/ath6kl/cfg80211.h
+++ b/drivers/net/wireless/ath/ath6kl/cfg80211.h
@@ -25,6 +25,7 @@ enum ath6kl_cfg_suspend_mode {
25}; 25};
26 26
27struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name, 27struct wireless_dev *ath6kl_interface_add(struct ath6kl *ar, const char *name,
28 unsigned char name_assign_type,
28 enum nl80211_iftype type, 29 enum nl80211_iftype type,
29 u8 fw_vif_idx, u8 nw_type); 30 u8 fw_vif_idx, u8 nw_type);
30void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq, 31void ath6kl_cfg80211_ch_switch_notify(struct ath6kl_vif *vif, int freq,
diff --git a/drivers/net/wireless/ath/ath6kl/core.c b/drivers/net/wireless/ath/ath6kl/core.c
index 0df74b245af4..4ec02cea0f43 100644
--- a/drivers/net/wireless/ath/ath6kl/core.c
+++ b/drivers/net/wireless/ath/ath6kl/core.c
@@ -211,8 +211,8 @@ int ath6kl_core_init(struct ath6kl *ar, enum ath6kl_htc_type htc_type)
211 rtnl_lock(); 211 rtnl_lock();
212 212
213 /* Add an initial station interface */ 213 /* Add an initial station interface */
214 wdev = ath6kl_interface_add(ar, "wlan%d", NL80211_IFTYPE_STATION, 0, 214 wdev = ath6kl_interface_add(ar, "wlan%d", NET_NAME_ENUM,
215 INFRA_NETWORK); 215 NL80211_IFTYPE_STATION, 0, INFRA_NETWORK);
216 216
217 rtnl_unlock(); 217 rtnl_unlock();
218 218
diff --git a/drivers/net/wireless/ath/ath6kl/main.c b/drivers/net/wireless/ath/ath6kl/main.c
index b42ba46b5030..1af3fed5a72c 100644
--- a/drivers/net/wireless/ath/ath6kl/main.c
+++ b/drivers/net/wireless/ath/ath6kl/main.c
@@ -105,7 +105,7 @@ static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
105 105
106 memset(&ar->ap_stats.sta[sta->aid - 1], 0, 106 memset(&ar->ap_stats.sta[sta->aid - 1], 0,
107 sizeof(struct wmi_per_sta_stat)); 107 sizeof(struct wmi_per_sta_stat));
108 memset(sta->mac, 0, ETH_ALEN); 108 eth_zero_addr(sta->mac);
109 memset(sta->wpa_ie, 0, ATH6KL_MAX_IE); 109 memset(sta->wpa_ie, 0, ATH6KL_MAX_IE);
110 sta->aid = 0; 110 sta->aid = 0;
111 sta->sta_flags = 0; 111 sta->sta_flags = 0;
diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile
index 473972288a84..ecda613c2d54 100644
--- a/drivers/net/wireless/ath/ath9k/Makefile
+++ b/drivers/net/wireless/ath/ath9k/Makefile
@@ -46,7 +46,8 @@ ath9k_hw-y:= \
46ath9k_hw-$(CONFIG_ATH9K_WOW) += ar9003_wow.o 46ath9k_hw-$(CONFIG_ATH9K_WOW) += ar9003_wow.o
47 47
48ath9k_hw-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \ 48ath9k_hw-$(CONFIG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \
49 ar9003_mci.o 49 ar9003_mci.o \
50 ar9003_aic.o
50 51
51ath9k_hw-$(CONFIG_ATH9K_PCOEM) += ar9003_rtt.o 52ath9k_hw-$(CONFIG_ATH9K_PCOEM) += ar9003_rtt.o
52 53
diff --git a/drivers/net/wireless/ath/ath9k/ani.c b/drivers/net/wireless/ath/ath9k/ani.c
index ca01d17d130f..25e45e4d1a60 100644
--- a/drivers/net/wireless/ath/ath9k/ani.c
+++ b/drivers/net/wireless/ath/ath9k/ani.c
@@ -107,11 +107,21 @@ static const struct ani_cck_level_entry cck_level_table[] = {
107static void ath9k_hw_update_mibstats(struct ath_hw *ah, 107static void ath9k_hw_update_mibstats(struct ath_hw *ah,
108 struct ath9k_mib_stats *stats) 108 struct ath9k_mib_stats *stats)
109{ 109{
110 stats->ackrcv_bad += REG_READ(ah, AR_ACK_FAIL); 110 u32 addr[5] = {AR_RTS_OK, AR_RTS_FAIL, AR_ACK_FAIL,
111 stats->rts_bad += REG_READ(ah, AR_RTS_FAIL); 111 AR_FCS_FAIL, AR_BEACON_CNT};
112 stats->fcs_bad += REG_READ(ah, AR_FCS_FAIL); 112 u32 data[5];
113 stats->rts_good += REG_READ(ah, AR_RTS_OK); 113
114 stats->beacons += REG_READ(ah, AR_BEACON_CNT); 114 REG_READ_MULTI(ah, &addr[0], &data[0], 5);
115 /* AR_RTS_OK */
116 stats->rts_good += data[0];
117 /* AR_RTS_FAIL */
118 stats->rts_bad += data[1];
119 /* AR_ACK_FAIL */
120 stats->ackrcv_bad += data[2];
121 /* AR_FCS_FAIL */
122 stats->fcs_bad += data[3];
123 /* AR_BEACON_CNT */
124 stats->beacons += data[4];
115} 125}
116 126
117static void ath9k_ani_restart(struct ath_hw *ah) 127static void ath9k_ani_restart(struct ath_hw *ah)
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
index f273427fdd29..6c23d279525f 100644
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
@@ -681,12 +681,13 @@ static void ar5008_hw_set_channel_regs(struct ath_hw *ah,
681 phymode |= AR_PHY_FC_DYN2040_PRI_CH; 681 phymode |= AR_PHY_FC_DYN2040_PRI_CH;
682 682
683 } 683 }
684 ENABLE_REGWRITE_BUFFER(ah);
684 REG_WRITE(ah, AR_PHY_TURBO, phymode); 685 REG_WRITE(ah, AR_PHY_TURBO, phymode);
685 686
687 /* This function do only REG_WRITE, so
688 * we can include it to REGWRITE_BUFFER. */
686 ath9k_hw_set11nmac2040(ah, chan); 689 ath9k_hw_set11nmac2040(ah, chan);
687 690
688 ENABLE_REGWRITE_BUFFER(ah);
689
690 REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S); 691 REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S);
691 REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S); 692 REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S);
692 693
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
index 42190b67c671..50fcd343c41a 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
@@ -430,46 +430,43 @@ static void ar9271_hw_pa_cal(struct ath_hw *ah, bool is_reset)
430 u32 regVal; 430 u32 regVal;
431 unsigned int i; 431 unsigned int i;
432 u32 regList[][2] = { 432 u32 regList[][2] = {
433 { 0x786c, 0 }, 433 { AR9285_AN_TOP3, 0 },
434 { 0x7854, 0 }, 434 { AR9285_AN_RXTXBB1, 0 },
435 { 0x7820, 0 }, 435 { AR9285_AN_RF2G1, 0 },
436 { 0x7824, 0 }, 436 { AR9285_AN_RF2G2, 0 },
437 { 0x7868, 0 }, 437 { AR9285_AN_TOP2, 0 },
438 { 0x783c, 0 }, 438 { AR9285_AN_RF2G8, 0 },
439 { 0x7838, 0 } , 439 { AR9285_AN_RF2G7, 0 },
440 { 0x7828, 0 } , 440 { AR9285_AN_RF2G3, 0 },
441 }; 441 };
442 442
443 for (i = 0; i < ARRAY_SIZE(regList); i++) 443 REG_READ_ARRAY(ah, regList, ARRAY_SIZE(regList));
444 regList[i][1] = REG_READ(ah, regList[i][0]);
445
446 regVal = REG_READ(ah, 0x7834);
447 regVal &= (~(0x1));
448 REG_WRITE(ah, 0x7834, regVal);
449 regVal = REG_READ(ah, 0x9808);
450 regVal |= (0x1 << 27);
451 REG_WRITE(ah, 0x9808, regVal);
452 444
445 ENABLE_REG_RMW_BUFFER(ah);
446 /* 7834, b1=0 */
447 REG_CLR_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
448 /* 9808, b27=1 */
449 REG_SET_BIT(ah, 0x9808, 1 << 27);
453 /* 786c,b23,1, pwddac=1 */ 450 /* 786c,b23,1, pwddac=1 */
454 REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1); 451 REG_SET_BIT(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC);
455 /* 7854, b5,1, pdrxtxbb=1 */ 452 /* 7854, b5,1, pdrxtxbb=1 */
456 REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1); 453 REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1);
457 /* 7854, b7,1, pdv2i=1 */ 454 /* 7854, b7,1, pdv2i=1 */
458 REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1); 455 REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I);
459 /* 7854, b8,1, pddacinterface=1 */ 456 /* 7854, b8,1, pddacinterface=1 */
460 REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1); 457 REG_SET_BIT(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF);
461 /* 7824,b12,0, offcal=0 */ 458 /* 7824,b12,0, offcal=0 */
462 REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); 459 REG_CLR_BIT(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL);
463 /* 7838, b1,0, pwddb=0 */ 460 /* 7838, b1,0, pwddb=0 */
464 REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); 461 REG_CLR_BIT(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB);
465 /* 7820,b11,0, enpacal=0 */ 462 /* 7820,b11,0, enpacal=0 */
466 REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); 463 REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL);
467 /* 7820,b25,1, pdpadrv1=0 */ 464 /* 7820,b25,1, pdpadrv1=0 */
468 REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0); 465 REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1);
469 /* 7820,b24,0, pdpadrv2=0 */ 466 /* 7820,b24,0, pdpadrv2=0 */
470 REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0); 467 REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2);
471 /* 7820,b23,0, pdpaout=0 */ 468 /* 7820,b23,0, pdpaout=0 */
472 REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); 469 REG_CLR_BIT(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT);
473 /* 783c,b14-16,7, padrvgn2tab_0=7 */ 470 /* 783c,b14-16,7, padrvgn2tab_0=7 */
474 REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7); 471 REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7);
475 /* 472 /*
@@ -477,8 +474,9 @@ static void ar9271_hw_pa_cal(struct ath_hw *ah, bool is_reset)
477 * does not matter since we turn it off 474 * does not matter since we turn it off
478 */ 475 */
479 REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0); 476 REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0);
480 477 /* 7828, b0-11, ccom=fff */
481 REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff); 478 REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff);
479 REG_RMW_BUFFER_FLUSH(ah);
482 480
483 /* Set: 481 /* Set:
484 * localmode=1,bmode=1,bmoderxtx=1,synthon=1, 482 * localmode=1,bmode=1,bmoderxtx=1,synthon=1,
@@ -490,15 +488,16 @@ static void ar9271_hw_pa_cal(struct ath_hw *ah, bool is_reset)
490 488
491 /* find off_6_1; */ 489 /* find off_6_1; */
492 for (i = 6; i > 0; i--) { 490 for (i = 6; i > 0; i--) {
493 regVal = REG_READ(ah, 0x7834); 491 regVal = REG_READ(ah, AR9285_AN_RF2G6);
494 regVal |= (1 << (20 + i)); 492 regVal |= (1 << (20 + i));
495 REG_WRITE(ah, 0x7834, regVal); 493 REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
496 udelay(1); 494 udelay(1);
497 /* regVal = REG_READ(ah, 0x7834); */ 495 /* regVal = REG_READ(ah, 0x7834); */
498 regVal &= (~(0x1 << (20 + i))); 496 regVal &= (~(0x1 << (20 + i)));
499 regVal |= (MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9) 497 regVal |= (MS(REG_READ(ah, AR9285_AN_RF2G9),
498 AR9285_AN_RXTXBB1_SPARE9)
500 << (20 + i)); 499 << (20 + i));
501 REG_WRITE(ah, 0x7834, regVal); 500 REG_WRITE(ah, AR9285_AN_RF2G6, regVal);
502 } 501 }
503 502
504 regVal = (regVal >> 20) & 0x7f; 503 regVal = (regVal >> 20) & 0x7f;
@@ -515,15 +514,15 @@ static void ar9271_hw_pa_cal(struct ath_hw *ah, bool is_reset)
515 ah->pacal_info.prev_offset = regVal; 514 ah->pacal_info.prev_offset = regVal;
516 } 515 }
517 516
518 ENABLE_REGWRITE_BUFFER(ah);
519 517
520 regVal = REG_READ(ah, 0x7834); 518 ENABLE_REG_RMW_BUFFER(ah);
521 regVal |= 0x1; 519 /* 7834, b1=1 */
522 REG_WRITE(ah, 0x7834, regVal); 520 REG_SET_BIT(ah, AR9285_AN_RF2G6, 1 << 0);
523 regVal = REG_READ(ah, 0x9808); 521 /* 9808, b27=0 */
524 regVal &= (~(0x1 << 27)); 522 REG_CLR_BIT(ah, 0x9808, 1 << 27);
525 REG_WRITE(ah, 0x9808, regVal); 523 REG_RMW_BUFFER_FLUSH(ah);
526 524
525 ENABLE_REGWRITE_BUFFER(ah);
527 for (i = 0; i < ARRAY_SIZE(regList); i++) 526 for (i = 0; i < ARRAY_SIZE(regList); i++)
528 REG_WRITE(ah, regList[i][0], regList[i][1]); 527 REG_WRITE(ah, regList[i][0], regList[i][1]);
529 528
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_aic.c b/drivers/net/wireless/ath/ath9k/ar9003_aic.c
new file mode 100644
index 000000000000..1db119d77783
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/ar9003_aic.c
@@ -0,0 +1,599 @@
1/*
2 * Copyright (c) 2015 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 "hw.h"
18#include "hw-ops.h"
19#include "ar9003_mci.h"
20#include "ar9003_aic.h"
21#include "ar9003_phy.h"
22#include "reg_aic.h"
23
24static const u8 com_att_db_table[ATH_AIC_MAX_COM_ATT_DB_TABLE] = {
25 0, 3, 9, 15, 21, 27
26};
27
28static const u16 aic_lin_table[ATH_AIC_MAX_AIC_LIN_TABLE] = {
29 8191, 7300, 6506, 5799, 5168, 4606, 4105, 3659,
30 3261, 2906, 2590, 2309, 2057, 1834, 1634, 1457,
31 1298, 1157, 1031, 919, 819, 730, 651, 580,
32 517, 461, 411, 366, 326, 291, 259, 231,
33 206, 183, 163, 146, 130, 116, 103, 92,
34 82, 73, 65, 58, 52, 46, 41, 37,
35 33, 29, 26, 23, 21, 18, 16, 15,
36 13, 12, 10, 9, 8, 7, 7, 6,
37 5, 5, 4, 4, 3
38};
39
40static bool ar9003_hw_is_aic_enabled(struct ath_hw *ah)
41{
42 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
43
44 /*
45 * Disable AIC for now, until we have all the
46 * HW code and the driver-layer support ready.
47 */
48 return false;
49
50 if (mci_hw->config & ATH_MCI_CONFIG_DISABLE_AIC)
51 return false;
52
53 return true;
54}
55
56static int16_t ar9003_aic_find_valid(struct ath_aic_sram_info *cal_sram,
57 bool dir, u8 index)
58{
59 int16_t i;
60
61 if (dir) {
62 for (i = index + 1; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
63 if (cal_sram[i].valid)
64 break;
65 }
66 } else {
67 for (i = index - 1; i >= 0; i--) {
68 if (cal_sram[i].valid)
69 break;
70 }
71 }
72
73 if ((i >= ATH_AIC_MAX_BT_CHANNEL) || (i < 0))
74 i = -1;
75
76 return i;
77}
78
79/*
80 * type 0: aic_lin_table, 1: com_att_db_table
81 */
82static int16_t ar9003_aic_find_index(u8 type, int16_t value)
83{
84 int16_t i = -1;
85
86 if (type == 0) {
87 for (i = ATH_AIC_MAX_AIC_LIN_TABLE - 1; i >= 0; i--) {
88 if (aic_lin_table[i] >= value)
89 break;
90 }
91 } else if (type == 1) {
92 for (i = 0; i < ATH_AIC_MAX_COM_ATT_DB_TABLE; i++) {
93 if (com_att_db_table[i] > value) {
94 i--;
95 break;
96 }
97 }
98
99 if (i >= ATH_AIC_MAX_COM_ATT_DB_TABLE)
100 i = -1;
101 }
102
103 return i;
104}
105
106static void ar9003_aic_gain_table(struct ath_hw *ah)
107{
108 u32 aic_atten_word[19], i;
109
110 /* Config LNA gain difference */
111 REG_WRITE(ah, AR_PHY_BT_COEX_4, 0x2c200a00);
112 REG_WRITE(ah, AR_PHY_BT_COEX_5, 0x5c4e4438);
113
114 /* Program gain table */
115 aic_atten_word[0] = (0x1 & 0xf) << 14 | (0x1f & 0x1f) << 9 | (0x0 & 0xf) << 5 |
116 (0x1f & 0x1f); /* -01 dB: 4'd1, 5'd31, 00 dB: 4'd0, 5'd31 */
117 aic_atten_word[1] = (0x3 & 0xf) << 14 | (0x1f & 0x1f) << 9 | (0x2 & 0xf) << 5 |
118 (0x1f & 0x1f); /* -03 dB: 4'd3, 5'd31, -02 dB: 4'd2, 5'd31 */
119 aic_atten_word[2] = (0x5 & 0xf) << 14 | (0x1f & 0x1f) << 9 | (0x4 & 0xf) << 5 |
120 (0x1f & 0x1f); /* -05 dB: 4'd5, 5'd31, -04 dB: 4'd4, 5'd31 */
121 aic_atten_word[3] = (0x1 & 0xf) << 14 | (0x1e & 0x1f) << 9 | (0x0 & 0xf) << 5 |
122 (0x1e & 0x1f); /* -07 dB: 4'd1, 5'd30, -06 dB: 4'd0, 5'd30 */
123 aic_atten_word[4] = (0x3 & 0xf) << 14 | (0x1e & 0x1f) << 9 | (0x2 & 0xf) << 5 |
124 (0x1e & 0x1f); /* -09 dB: 4'd3, 5'd30, -08 dB: 4'd2, 5'd30 */
125 aic_atten_word[5] = (0x5 & 0xf) << 14 | (0x1e & 0x1f) << 9 | (0x4 & 0xf) << 5 |
126 (0x1e & 0x1f); /* -11 dB: 4'd5, 5'd30, -10 dB: 4'd4, 5'd30 */
127 aic_atten_word[6] = (0x1 & 0xf) << 14 | (0xf & 0x1f) << 9 | (0x0 & 0xf) << 5 |
128 (0xf & 0x1f); /* -13 dB: 4'd1, 5'd15, -12 dB: 4'd0, 5'd15 */
129 aic_atten_word[7] = (0x3 & 0xf) << 14 | (0xf & 0x1f) << 9 | (0x2 & 0xf) << 5 |
130 (0xf & 0x1f); /* -15 dB: 4'd3, 5'd15, -14 dB: 4'd2, 5'd15 */
131 aic_atten_word[8] = (0x5 & 0xf) << 14 | (0xf & 0x1f) << 9 | (0x4 & 0xf) << 5 |
132 (0xf & 0x1f); /* -17 dB: 4'd5, 5'd15, -16 dB: 4'd4, 5'd15 */
133 aic_atten_word[9] = (0x1 & 0xf) << 14 | (0x7 & 0x1f) << 9 | (0x0 & 0xf) << 5 |
134 (0x7 & 0x1f); /* -19 dB: 4'd1, 5'd07, -18 dB: 4'd0, 5'd07 */
135 aic_atten_word[10] = (0x3 & 0xf) << 14 | (0x7 & 0x1f) << 9 | (0x2 & 0xf) << 5 |
136 (0x7 & 0x1f); /* -21 dB: 4'd3, 5'd07, -20 dB: 4'd2, 5'd07 */
137 aic_atten_word[11] = (0x5 & 0xf) << 14 | (0x7 & 0x1f) << 9 | (0x4 & 0xf) << 5 |
138 (0x7 & 0x1f); /* -23 dB: 4'd5, 5'd07, -22 dB: 4'd4, 5'd07 */
139 aic_atten_word[12] = (0x7 & 0xf) << 14 | (0x7 & 0x1f) << 9 | (0x6 & 0xf) << 5 |
140 (0x7 & 0x1f); /* -25 dB: 4'd7, 5'd07, -24 dB: 4'd6, 5'd07 */
141 aic_atten_word[13] = (0x3 & 0xf) << 14 | (0x3 & 0x1f) << 9 | (0x2 & 0xf) << 5 |
142 (0x3 & 0x1f); /* -27 dB: 4'd3, 5'd03, -26 dB: 4'd2, 5'd03 */
143 aic_atten_word[14] = (0x5 & 0xf) << 14 | (0x3 & 0x1f) << 9 | (0x4 & 0xf) << 5 |
144 (0x3 & 0x1f); /* -29 dB: 4'd5, 5'd03, -28 dB: 4'd4, 5'd03 */
145 aic_atten_word[15] = (0x1 & 0xf) << 14 | (0x1 & 0x1f) << 9 | (0x0 & 0xf) << 5 |
146 (0x1 & 0x1f); /* -31 dB: 4'd1, 5'd01, -30 dB: 4'd0, 5'd01 */
147 aic_atten_word[16] = (0x3 & 0xf) << 14 | (0x1 & 0x1f) << 9 | (0x2 & 0xf) << 5 |
148 (0x1 & 0x1f); /* -33 dB: 4'd3, 5'd01, -32 dB: 4'd2, 5'd01 */
149 aic_atten_word[17] = (0x5 & 0xf) << 14 | (0x1 & 0x1f) << 9 | (0x4 & 0xf) << 5 |
150 (0x1 & 0x1f); /* -35 dB: 4'd5, 5'd01, -34 dB: 4'd4, 5'd01 */
151 aic_atten_word[18] = (0x7 & 0xf) << 14 | (0x1 & 0x1f) << 9 | (0x6 & 0xf) << 5 |
152 (0x1 & 0x1f); /* -37 dB: 4'd7, 5'd01, -36 dB: 4'd6, 5'd01 */
153
154 /* Write to Gain table with auto increment enabled. */
155 REG_WRITE(ah, (AR_PHY_AIC_SRAM_ADDR_B0 + 0x3000),
156 (ATH_AIC_SRAM_AUTO_INCREMENT |
157 ATH_AIC_SRAM_GAIN_TABLE_OFFSET));
158
159 for (i = 0; i < 19; i++) {
160 REG_WRITE(ah, (AR_PHY_AIC_SRAM_DATA_B0 + 0x3000),
161 aic_atten_word[i]);
162 }
163}
164
165static u8 ar9003_aic_cal_start(struct ath_hw *ah, u8 min_valid_count)
166{
167 struct ath9k_hw_aic *aic = &ah->btcoex_hw.aic;
168 int i;
169
170 /* Write to Gain table with auto increment enabled. */
171 REG_WRITE(ah, (AR_PHY_AIC_SRAM_ADDR_B0 + 0x3000),
172 (ATH_AIC_SRAM_AUTO_INCREMENT |
173 ATH_AIC_SRAM_CAL_OFFSET));
174
175 for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
176 REG_WRITE(ah, (AR_PHY_AIC_SRAM_DATA_B0 + 0x3000), 0);
177 aic->aic_sram[i] = 0;
178 }
179
180 REG_WRITE(ah, AR_PHY_AIC_CTRL_0_B0,
181 (SM(0, AR_PHY_AIC_MON_ENABLE) |
182 SM(127, AR_PHY_AIC_CAL_MAX_HOP_COUNT) |
183 SM(min_valid_count, AR_PHY_AIC_CAL_MIN_VALID_COUNT) |
184 SM(37, AR_PHY_AIC_F_WLAN) |
185 SM(1, AR_PHY_AIC_CAL_CH_VALID_RESET) |
186 SM(0, AR_PHY_AIC_CAL_ENABLE) |
187 SM(0x40, AR_PHY_AIC_BTTX_PWR_THR) |
188 SM(0, AR_PHY_AIC_ENABLE)));
189
190 REG_WRITE(ah, AR_PHY_AIC_CTRL_0_B1,
191 (SM(0, AR_PHY_AIC_MON_ENABLE) |
192 SM(1, AR_PHY_AIC_CAL_CH_VALID_RESET) |
193 SM(0, AR_PHY_AIC_CAL_ENABLE) |
194 SM(0x40, AR_PHY_AIC_BTTX_PWR_THR) |
195 SM(0, AR_PHY_AIC_ENABLE)));
196
197 REG_WRITE(ah, AR_PHY_AIC_CTRL_1_B0,
198 (SM(8, AR_PHY_AIC_CAL_BT_REF_DELAY) |
199 SM(0, AR_PHY_AIC_BT_IDLE_CFG) |
200 SM(1, AR_PHY_AIC_STDBY_COND) |
201 SM(37, AR_PHY_AIC_STDBY_ROT_ATT_DB) |
202 SM(5, AR_PHY_AIC_STDBY_COM_ATT_DB) |
203 SM(15, AR_PHY_AIC_RSSI_MAX) |
204 SM(0, AR_PHY_AIC_RSSI_MIN)));
205
206 REG_WRITE(ah, AR_PHY_AIC_CTRL_1_B1,
207 (SM(15, AR_PHY_AIC_RSSI_MAX) |
208 SM(0, AR_PHY_AIC_RSSI_MIN)));
209
210 REG_WRITE(ah, AR_PHY_AIC_CTRL_2_B0,
211 (SM(44, AR_PHY_AIC_RADIO_DELAY) |
212 SM(8, AR_PHY_AIC_CAL_STEP_SIZE_CORR) |
213 SM(12, AR_PHY_AIC_CAL_ROT_IDX_CORR) |
214 SM(2, AR_PHY_AIC_CAL_CONV_CHECK_FACTOR) |
215 SM(5, AR_PHY_AIC_ROT_IDX_COUNT_MAX) |
216 SM(0, AR_PHY_AIC_CAL_SYNTH_TOGGLE) |
217 SM(0, AR_PHY_AIC_CAL_SYNTH_AFTER_BTRX) |
218 SM(200, AR_PHY_AIC_CAL_SYNTH_SETTLING)));
219
220 REG_WRITE(ah, AR_PHY_AIC_CTRL_3_B0,
221 (SM(2, AR_PHY_AIC_MON_MAX_HOP_COUNT) |
222 SM(1, AR_PHY_AIC_MON_MIN_STALE_COUNT) |
223 SM(1, AR_PHY_AIC_MON_PWR_EST_LONG) |
224 SM(2, AR_PHY_AIC_MON_PD_TALLY_SCALING) |
225 SM(10, AR_PHY_AIC_MON_PERF_THR) |
226 SM(2, AR_PHY_AIC_CAL_TARGET_MAG_SETTING) |
227 SM(1, AR_PHY_AIC_CAL_PERF_CHECK_FACTOR) |
228 SM(1, AR_PHY_AIC_CAL_PWR_EST_LONG)));
229
230 REG_WRITE(ah, AR_PHY_AIC_CTRL_4_B0,
231 (SM(2, AR_PHY_AIC_CAL_ROT_ATT_DB_EST_ISO) |
232 SM(3, AR_PHY_AIC_CAL_COM_ATT_DB_EST_ISO) |
233 SM(0, AR_PHY_AIC_CAL_ISO_EST_INIT_SETTING) |
234 SM(2, AR_PHY_AIC_CAL_COM_ATT_DB_BACKOFF) |
235 SM(1, AR_PHY_AIC_CAL_COM_ATT_DB_FIXED)));
236
237 REG_WRITE(ah, AR_PHY_AIC_CTRL_4_B1,
238 (SM(2, AR_PHY_AIC_CAL_ROT_ATT_DB_EST_ISO) |
239 SM(3, AR_PHY_AIC_CAL_COM_ATT_DB_EST_ISO) |
240 SM(0, AR_PHY_AIC_CAL_ISO_EST_INIT_SETTING) |
241 SM(2, AR_PHY_AIC_CAL_COM_ATT_DB_BACKOFF) |
242 SM(1, AR_PHY_AIC_CAL_COM_ATT_DB_FIXED)));
243
244 ar9003_aic_gain_table(ah);
245
246 /* Need to enable AIC reference signal in BT modem. */
247 REG_WRITE(ah, ATH_AIC_BT_JUPITER_CTRL,
248 (REG_READ(ah, ATH_AIC_BT_JUPITER_CTRL) |
249 ATH_AIC_BT_AIC_ENABLE));
250
251 aic->aic_cal_start_time = REG_READ(ah, AR_TSF_L32);
252
253 /* Start calibration */
254 REG_CLR_BIT(ah, AR_PHY_AIC_CTRL_0_B1, AR_PHY_AIC_CAL_ENABLE);
255 REG_SET_BIT(ah, AR_PHY_AIC_CTRL_0_B1, AR_PHY_AIC_CAL_CH_VALID_RESET);
256 REG_SET_BIT(ah, AR_PHY_AIC_CTRL_0_B1, AR_PHY_AIC_CAL_ENABLE);
257
258 aic->aic_caled_chan = 0;
259 aic->aic_cal_state = AIC_CAL_STATE_STARTED;
260
261 return aic->aic_cal_state;
262}
263
264static bool ar9003_aic_cal_post_process(struct ath_hw *ah)
265{
266 struct ath9k_hw_aic *aic = &ah->btcoex_hw.aic;
267 struct ath_aic_sram_info cal_sram[ATH_AIC_MAX_BT_CHANNEL];
268 struct ath_aic_out_info aic_sram[ATH_AIC_MAX_BT_CHANNEL];
269 u32 dir_path_gain_idx, quad_path_gain_idx, value;
270 u32 fixed_com_att_db;
271 int8_t dir_path_sign, quad_path_sign;
272 int16_t i;
273 bool ret = true;
274
275 memset(&cal_sram, 0, sizeof(cal_sram));
276 memset(&aic_sram, 0, sizeof(aic_sram));
277
278 for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
279 value = aic->aic_sram[i];
280
281 cal_sram[i].valid =
282 MS(value, AR_PHY_AIC_SRAM_VALID);
283 cal_sram[i].rot_quad_att_db =
284 MS(value, AR_PHY_AIC_SRAM_ROT_QUAD_ATT_DB);
285 cal_sram[i].vga_quad_sign =
286 MS(value, AR_PHY_AIC_SRAM_VGA_QUAD_SIGN);
287 cal_sram[i].rot_dir_att_db =
288 MS(value, AR_PHY_AIC_SRAM_ROT_DIR_ATT_DB);
289 cal_sram[i].vga_dir_sign =
290 MS(value, AR_PHY_AIC_SRAM_VGA_DIR_SIGN);
291 cal_sram[i].com_att_6db =
292 MS(value, AR_PHY_AIC_SRAM_COM_ATT_6DB);
293
294 if (cal_sram[i].valid) {
295 dir_path_gain_idx = cal_sram[i].rot_dir_att_db +
296 com_att_db_table[cal_sram[i].com_att_6db];
297 quad_path_gain_idx = cal_sram[i].rot_quad_att_db +
298 com_att_db_table[cal_sram[i].com_att_6db];
299
300 dir_path_sign = (cal_sram[i].vga_dir_sign) ? 1 : -1;
301 quad_path_sign = (cal_sram[i].vga_quad_sign) ? 1 : -1;
302
303 aic_sram[i].dir_path_gain_lin = dir_path_sign *
304 aic_lin_table[dir_path_gain_idx];
305 aic_sram[i].quad_path_gain_lin = quad_path_sign *
306 aic_lin_table[quad_path_gain_idx];
307 }
308 }
309
310 for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
311 int16_t start_idx, end_idx;
312
313 if (cal_sram[i].valid)
314 continue;
315
316 start_idx = ar9003_aic_find_valid(cal_sram, 0, i);
317 end_idx = ar9003_aic_find_valid(cal_sram, 1, i);
318
319 if (start_idx < 0) {
320 /* extrapolation */
321 start_idx = end_idx;
322 end_idx = ar9003_aic_find_valid(cal_sram, 1, start_idx);
323
324 if (end_idx < 0) {
325 ret = false;
326 break;
327 }
328
329 aic_sram[i].dir_path_gain_lin =
330 ((aic_sram[start_idx].dir_path_gain_lin -
331 aic_sram[end_idx].dir_path_gain_lin) *
332 (start_idx - i) + ((end_idx - i) >> 1)) /
333 (end_idx - i) +
334 aic_sram[start_idx].dir_path_gain_lin;
335 aic_sram[i].quad_path_gain_lin =
336 ((aic_sram[start_idx].quad_path_gain_lin -
337 aic_sram[end_idx].quad_path_gain_lin) *
338 (start_idx - i) + ((end_idx - i) >> 1)) /
339 (end_idx - i) +
340 aic_sram[start_idx].quad_path_gain_lin;
341 }
342
343 if (end_idx < 0) {
344 /* extrapolation */
345 end_idx = ar9003_aic_find_valid(cal_sram, 0, start_idx);
346
347 if (end_idx < 0) {
348 ret = false;
349 break;
350 }
351
352 aic_sram[i].dir_path_gain_lin =
353 ((aic_sram[start_idx].dir_path_gain_lin -
354 aic_sram[end_idx].dir_path_gain_lin) *
355 (i - start_idx) + ((start_idx - end_idx) >> 1)) /
356 (start_idx - end_idx) +
357 aic_sram[start_idx].dir_path_gain_lin;
358 aic_sram[i].quad_path_gain_lin =
359 ((aic_sram[start_idx].quad_path_gain_lin -
360 aic_sram[end_idx].quad_path_gain_lin) *
361 (i - start_idx) + ((start_idx - end_idx) >> 1)) /
362 (start_idx - end_idx) +
363 aic_sram[start_idx].quad_path_gain_lin;
364
365 } else if (start_idx >= 0){
366 /* interpolation */
367 aic_sram[i].dir_path_gain_lin =
368 (((end_idx - i) * aic_sram[start_idx].dir_path_gain_lin) +
369 ((i - start_idx) * aic_sram[end_idx].dir_path_gain_lin) +
370 ((end_idx - start_idx) >> 1)) /
371 (end_idx - start_idx);
372 aic_sram[i].quad_path_gain_lin =
373 (((end_idx - i) * aic_sram[start_idx].quad_path_gain_lin) +
374 ((i - start_idx) * aic_sram[end_idx].quad_path_gain_lin) +
375 ((end_idx - start_idx) >> 1))/
376 (end_idx - start_idx);
377 }
378 }
379
380 /* From dir/quad_path_gain_lin to sram. */
381 i = ar9003_aic_find_valid(cal_sram, 1, 0);
382 if (i < 0) {
383 i = 0;
384 ret = false;
385 }
386 fixed_com_att_db = com_att_db_table[cal_sram[i].com_att_6db];
387
388 for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
389 int16_t rot_dir_path_att_db, rot_quad_path_att_db;
390
391 aic_sram[i].sram.vga_dir_sign =
392 (aic_sram[i].dir_path_gain_lin >= 0) ? 1 : 0;
393 aic_sram[i].sram.vga_quad_sign=
394 (aic_sram[i].quad_path_gain_lin >= 0) ? 1 : 0;
395
396 rot_dir_path_att_db =
397 ar9003_aic_find_index(0, abs(aic_sram[i].dir_path_gain_lin)) -
398 fixed_com_att_db;
399 rot_quad_path_att_db =
400 ar9003_aic_find_index(0, abs(aic_sram[i].quad_path_gain_lin)) -
401 fixed_com_att_db;
402
403 aic_sram[i].sram.com_att_6db =
404 ar9003_aic_find_index(1, fixed_com_att_db);
405
406 aic_sram[i].sram.valid = 1;
407
408 aic_sram[i].sram.rot_dir_att_db =
409 min(max(rot_dir_path_att_db,
410 (int16_t)ATH_AIC_MIN_ROT_DIR_ATT_DB),
411 ATH_AIC_MAX_ROT_DIR_ATT_DB);
412 aic_sram[i].sram.rot_quad_att_db =
413 min(max(rot_quad_path_att_db,
414 (int16_t)ATH_AIC_MIN_ROT_QUAD_ATT_DB),
415 ATH_AIC_MAX_ROT_QUAD_ATT_DB);
416 }
417
418 for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
419 aic->aic_sram[i] = (SM(aic_sram[i].sram.vga_dir_sign,
420 AR_PHY_AIC_SRAM_VGA_DIR_SIGN) |
421 SM(aic_sram[i].sram.vga_quad_sign,
422 AR_PHY_AIC_SRAM_VGA_QUAD_SIGN) |
423 SM(aic_sram[i].sram.com_att_6db,
424 AR_PHY_AIC_SRAM_COM_ATT_6DB) |
425 SM(aic_sram[i].sram.valid,
426 AR_PHY_AIC_SRAM_VALID) |
427 SM(aic_sram[i].sram.rot_dir_att_db,
428 AR_PHY_AIC_SRAM_ROT_DIR_ATT_DB) |
429 SM(aic_sram[i].sram.rot_quad_att_db,
430 AR_PHY_AIC_SRAM_ROT_QUAD_ATT_DB));
431 }
432
433 return ret;
434}
435
436static void ar9003_aic_cal_done(struct ath_hw *ah)
437{
438 struct ath9k_hw_aic *aic = &ah->btcoex_hw.aic;
439
440 /* Disable AIC reference signal in BT modem. */
441 REG_WRITE(ah, ATH_AIC_BT_JUPITER_CTRL,
442 (REG_READ(ah, ATH_AIC_BT_JUPITER_CTRL) &
443 ~ATH_AIC_BT_AIC_ENABLE));
444
445 if (ar9003_aic_cal_post_process(ah))
446 aic->aic_cal_state = AIC_CAL_STATE_DONE;
447 else
448 aic->aic_cal_state = AIC_CAL_STATE_ERROR;
449}
450
451static u8 ar9003_aic_cal_continue(struct ath_hw *ah, bool cal_once)
452{
453 struct ath_common *common = ath9k_hw_common(ah);
454 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
455 struct ath9k_hw_aic *aic = &ah->btcoex_hw.aic;
456 int i, num_chan;
457
458 num_chan = MS(mci_hw->config, ATH_MCI_CONFIG_AIC_CAL_NUM_CHAN);
459
460 if (!num_chan) {
461 aic->aic_cal_state = AIC_CAL_STATE_ERROR;
462 return aic->aic_cal_state;
463 }
464
465 if (cal_once) {
466 for (i = 0; i < 10000; i++) {
467 if ((REG_READ(ah, AR_PHY_AIC_CTRL_0_B1) &
468 AR_PHY_AIC_CAL_ENABLE) == 0)
469 break;
470
471 udelay(100);
472 }
473 }
474
475 /*
476 * Use AR_PHY_AIC_CAL_ENABLE bit instead of AR_PHY_AIC_CAL_DONE.
477 * Sometimes CAL_DONE bit is not asserted.
478 */
479 if ((REG_READ(ah, AR_PHY_AIC_CTRL_0_B1) &
480 AR_PHY_AIC_CAL_ENABLE) != 0) {
481 ath_dbg(common, MCI, "AIC cal is not done after 40ms");
482 goto exit;
483 }
484
485 REG_WRITE(ah, AR_PHY_AIC_SRAM_ADDR_B1,
486 (ATH_AIC_SRAM_CAL_OFFSET | ATH_AIC_SRAM_AUTO_INCREMENT));
487
488 for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
489 u32 value;
490
491 value = REG_READ(ah, AR_PHY_AIC_SRAM_DATA_B1);
492
493 if (value & 0x01) {
494 if (aic->aic_sram[i] == 0)
495 aic->aic_caled_chan++;
496
497 aic->aic_sram[i] = value;
498
499 if (!cal_once)
500 break;
501 }
502 }
503
504 if ((aic->aic_caled_chan >= num_chan) || cal_once) {
505 ar9003_aic_cal_done(ah);
506 } else {
507 /* Start calibration */
508 REG_CLR_BIT(ah, AR_PHY_AIC_CTRL_0_B1, AR_PHY_AIC_CAL_ENABLE);
509 REG_SET_BIT(ah, AR_PHY_AIC_CTRL_0_B1,
510 AR_PHY_AIC_CAL_CH_VALID_RESET);
511 REG_SET_BIT(ah, AR_PHY_AIC_CTRL_0_B1, AR_PHY_AIC_CAL_ENABLE);
512 }
513exit:
514 return aic->aic_cal_state;
515
516}
517
518u8 ar9003_aic_calibration(struct ath_hw *ah)
519{
520 struct ath9k_hw_aic *aic = &ah->btcoex_hw.aic;
521 u8 cal_ret = AIC_CAL_STATE_ERROR;
522
523 switch (aic->aic_cal_state) {
524 case AIC_CAL_STATE_IDLE:
525 cal_ret = ar9003_aic_cal_start(ah, 1);
526 break;
527 case AIC_CAL_STATE_STARTED:
528 cal_ret = ar9003_aic_cal_continue(ah, false);
529 break;
530 case AIC_CAL_STATE_DONE:
531 cal_ret = AIC_CAL_STATE_DONE;
532 break;
533 default:
534 break;
535 }
536
537 return cal_ret;
538}
539
540u8 ar9003_aic_start_normal(struct ath_hw *ah)
541{
542 struct ath9k_hw_aic *aic = &ah->btcoex_hw.aic;
543 int16_t i;
544
545 if (aic->aic_cal_state != AIC_CAL_STATE_DONE)
546 return 1;
547
548 ar9003_aic_gain_table(ah);
549
550 REG_WRITE(ah, AR_PHY_AIC_SRAM_ADDR_B1, ATH_AIC_SRAM_AUTO_INCREMENT);
551
552 for (i = 0; i < ATH_AIC_MAX_BT_CHANNEL; i++) {
553 REG_WRITE(ah, AR_PHY_AIC_SRAM_DATA_B1, aic->aic_sram[i]);
554 }
555
556 /* FIXME: Replace these with proper register names */
557 REG_WRITE(ah, 0xa6b0, 0x80);
558 REG_WRITE(ah, 0xa6b4, 0x5b2df0);
559 REG_WRITE(ah, 0xa6b8, 0x10762cc8);
560 REG_WRITE(ah, 0xa6bc, 0x1219a4b);
561 REG_WRITE(ah, 0xa6c0, 0x1e01);
562 REG_WRITE(ah, 0xb6b4, 0xf0);
563 REG_WRITE(ah, 0xb6c0, 0x1e01);
564 REG_WRITE(ah, 0xb6b0, 0x81);
565 REG_WRITE(ah, AR_PHY_65NM_CH1_RXTX4, 0x40000000);
566
567 aic->aic_enabled = true;
568
569 return 0;
570}
571
572u8 ar9003_aic_cal_reset(struct ath_hw *ah)
573{
574 struct ath9k_hw_aic *aic = &ah->btcoex_hw.aic;
575
576 aic->aic_cal_state = AIC_CAL_STATE_IDLE;
577 return aic->aic_cal_state;
578}
579
580u8 ar9003_aic_calibration_single(struct ath_hw *ah)
581{
582 struct ath9k_hw_mci *mci_hw = &ah->btcoex_hw.mci;
583 u8 cal_ret;
584 int num_chan;
585
586 num_chan = MS(mci_hw->config, ATH_MCI_CONFIG_AIC_CAL_NUM_CHAN);
587
588 (void) ar9003_aic_cal_start(ah, num_chan);
589 cal_ret = ar9003_aic_cal_continue(ah, true);
590
591 return cal_ret;
592}
593
594void ar9003_hw_attach_aic_ops(struct ath_hw *ah)
595{
596 struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
597
598 priv_ops->is_aic_enabled = ar9003_hw_is_aic_enabled;
599}
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_aic.h b/drivers/net/wireless/ath/ath9k/ar9003_aic.h
new file mode 100644
index 000000000000..86f40644be43
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/ar9003_aic.h
@@ -0,0 +1,61 @@
1/*
2 * Copyright (c) 2015 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#ifndef AR9003_AIC_H
18#define AR9003_AIC_H
19
20#define ATH_AIC_MAX_COM_ATT_DB_TABLE 6
21#define ATH_AIC_MAX_AIC_LIN_TABLE 69
22#define ATH_AIC_MIN_ROT_DIR_ATT_DB 0
23#define ATH_AIC_MIN_ROT_QUAD_ATT_DB 0
24#define ATH_AIC_MAX_ROT_DIR_ATT_DB 37
25#define ATH_AIC_MAX_ROT_QUAD_ATT_DB 37
26#define ATH_AIC_SRAM_AUTO_INCREMENT 0x80000000
27#define ATH_AIC_SRAM_GAIN_TABLE_OFFSET 0x280
28#define ATH_AIC_SRAM_CAL_OFFSET 0x140
29#define ATH_AIC_SRAM_OFFSET 0x00
30#define ATH_AIC_MEAS_MAG_THRESH 20
31#define ATH_AIC_BT_JUPITER_CTRL 0x66820
32#define ATH_AIC_BT_AIC_ENABLE 0x02
33
34enum aic_cal_state {
35 AIC_CAL_STATE_IDLE = 0,
36 AIC_CAL_STATE_STARTED,
37 AIC_CAL_STATE_DONE,
38 AIC_CAL_STATE_ERROR
39};
40
41struct ath_aic_sram_info {
42 bool valid:1;
43 bool vga_quad_sign:1;
44 bool vga_dir_sign:1;
45 u8 rot_quad_att_db;
46 u8 rot_dir_att_db;
47 u8 com_att_6db;
48};
49
50struct ath_aic_out_info {
51 int16_t dir_path_gain_lin;
52 int16_t quad_path_gain_lin;
53 struct ath_aic_sram_info sram;
54};
55
56u8 ar9003_aic_calibration(struct ath_hw *ah);
57u8 ar9003_aic_start_normal(struct ath_hw *ah);
58u8 ar9003_aic_cal_reset(struct ath_hw *ah);
59u8 ar9003_aic_calibration_single(struct ath_hw *ah);
60
61#endif /* AR9003_AIC_H */
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
index 4335ccbe7d7e..79fd3b2dcbde 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
@@ -195,16 +195,16 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
195 INIT_INI_ARRAY(&ah->iniCckfirJapan2484, 195 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
196 ar9485_1_1_baseband_core_txfir_coeff_japan_2484); 196 ar9485_1_1_baseband_core_txfir_coeff_japan_2484);
197 197
198 if (ah->config.no_pll_pwrsave) { 198 if (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) {
199 INIT_INI_ARRAY(&ah->iniPcieSerdes, 199 INIT_INI_ARRAY(&ah->iniPcieSerdes,
200 ar9485_1_1_pcie_phy_clkreq_disable_L1); 200 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
201 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 201 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
202 ar9485_1_1_pcie_phy_clkreq_disable_L1); 202 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
203 } else { 203 } else {
204 INIT_INI_ARRAY(&ah->iniPcieSerdes, 204 INIT_INI_ARRAY(&ah->iniPcieSerdes,
205 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1); 205 ar9485_1_1_pcie_phy_clkreq_disable_L1);
206 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 206 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
207 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1); 207 ar9485_1_1_pcie_phy_clkreq_disable_L1);
208 } 208 }
209 } else if (AR_SREV_9462_21(ah)) { 209 } else if (AR_SREV_9462_21(ah)) {
210 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], 210 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
@@ -231,10 +231,20 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
231 ar9462_2p1_modes_fast_clock); 231 ar9462_2p1_modes_fast_clock);
232 INIT_INI_ARRAY(&ah->iniCckfirJapan2484, 232 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
233 ar9462_2p1_baseband_core_txfir_coeff_japan_2484); 233 ar9462_2p1_baseband_core_txfir_coeff_japan_2484);
234 INIT_INI_ARRAY(&ah->iniPcieSerdes, 234
235 ar9462_2p1_pciephy_clkreq_disable_L1); 235 /* Awake -> Sleep Setting */
236 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 236 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
237 ar9462_2p1_pciephy_clkreq_disable_L1); 237 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
238 INIT_INI_ARRAY(&ah->iniPcieSerdes,
239 ar9462_2p1_pciephy_clkreq_disable_L1);
240 }
241
242 /* Sleep -> Awake Setting */
243 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
244 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
245 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
246 ar9462_2p1_pciephy_clkreq_disable_L1);
247 }
238 } else if (AR_SREV_9462_20(ah)) { 248 } else if (AR_SREV_9462_20(ah)) {
239 249
240 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core); 250 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core);
@@ -262,11 +272,18 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
262 ar9462_2p0_common_rx_gain); 272 ar9462_2p0_common_rx_gain);
263 273
264 /* Awake -> Sleep Setting */ 274 /* Awake -> Sleep Setting */
265 INIT_INI_ARRAY(&ah->iniPcieSerdes, 275 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
266 ar9462_2p0_pciephy_clkreq_disable_L1); 276 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
277 INIT_INI_ARRAY(&ah->iniPcieSerdes,
278 ar9462_2p0_pciephy_clkreq_disable_L1);
279 }
280
267 /* Sleep -> Awake Setting */ 281 /* Sleep -> Awake Setting */
268 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 282 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
269 ar9462_2p0_pciephy_clkreq_disable_L1); 283 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
284 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
285 ar9462_2p0_pciephy_clkreq_disable_L1);
286 }
270 287
271 /* Fast clock modal settings */ 288 /* Fast clock modal settings */
272 INIT_INI_ARRAY(&ah->iniModesFastClock, 289 INIT_INI_ARRAY(&ah->iniModesFastClock,
@@ -456,10 +473,19 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
456 INIT_INI_ARRAY(&ah->iniModesTxGain, 473 INIT_INI_ARRAY(&ah->iniModesTxGain,
457 ar9565_1p1_Modes_lowest_ob_db_tx_gain_table); 474 ar9565_1p1_Modes_lowest_ob_db_tx_gain_table);
458 475
459 INIT_INI_ARRAY(&ah->iniPcieSerdes, 476 /* Awake -> Sleep Setting */
460 ar9565_1p1_pciephy_clkreq_disable_L1); 477 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
461 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 478 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
462 ar9565_1p1_pciephy_clkreq_disable_L1); 479 INIT_INI_ARRAY(&ah->iniPcieSerdes,
480 ar9565_1p1_pciephy_clkreq_disable_L1);
481 }
482
483 /* Sleep -> Awake Setting */
484 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
485 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
486 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
487 ar9565_1p1_pciephy_clkreq_disable_L1);
488 }
463 489
464 INIT_INI_ARRAY(&ah->iniModesFastClock, 490 INIT_INI_ARRAY(&ah->iniModesFastClock,
465 ar9565_1p1_modes_fast_clock); 491 ar9565_1p1_modes_fast_clock);
@@ -491,10 +517,19 @@ static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
491 INIT_INI_ARRAY(&ah->iniModesTxGain, 517 INIT_INI_ARRAY(&ah->iniModesTxGain,
492 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table); 518 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table);
493 519
494 INIT_INI_ARRAY(&ah->iniPcieSerdes, 520 /* Awake -> Sleep Setting */
495 ar9565_1p0_pciephy_clkreq_disable_L1); 521 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
496 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, 522 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D3)) {
497 ar9565_1p0_pciephy_clkreq_disable_L1); 523 INIT_INI_ARRAY(&ah->iniPcieSerdes,
524 ar9565_1p0_pciephy_clkreq_disable_L1);
525 }
526
527 /* Sleep -> Awake Setting */
528 if ((ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_CONTROL) &&
529 (ah->config.pll_pwrsave & AR_PCIE_PLL_PWRSAVE_ON_D0)) {
530 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
531 ar9565_1p0_pciephy_clkreq_disable_L1);
532 }
498 533
499 INIT_INI_ARRAY(&ah->iniModesFastClock, 534 INIT_INI_ARRAY(&ah->iniModesFastClock,
500 ar9565_1p0_modes_fast_clock); 535 ar9565_1p0_modes_fast_clock);
@@ -1130,6 +1165,12 @@ void ar9003_hw_attach_ops(struct ath_hw *ah)
1130 struct ath_hw_ops *ops = ath9k_hw_ops(ah); 1165 struct ath_hw_ops *ops = ath9k_hw_ops(ah);
1131 1166
1132 ar9003_hw_init_mode_regs(ah); 1167 ar9003_hw_init_mode_regs(ah);
1168
1169 if (AR_SREV_9003_PCOEM(ah)) {
1170 WARN_ON(!ah->iniPcieSerdes.ia_array);
1171 WARN_ON(!ah->iniPcieSerdesLowPower.ia_array);
1172 }
1173
1133 priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs; 1174 priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
1134 priv_ops->init_hang_checks = ar9003_hw_init_hang_checks; 1175 priv_ops->init_hang_checks = ar9003_hw_init_hang_checks;
1135 priv_ops->detect_mac_hang = ar9003_hw_detect_mac_hang; 1176 priv_ops->detect_mac_hang = ar9003_hw_detect_mac_hang;
@@ -1139,4 +1180,5 @@ void ar9003_hw_attach_ops(struct ath_hw *ah)
1139 ar9003_hw_attach_phy_ops(ah); 1180 ar9003_hw_attach_phy_ops(ah);
1140 ar9003_hw_attach_calib_ops(ah); 1181 ar9003_hw_attach_calib_ops(ah);
1141 ar9003_hw_attach_mac_ops(ah); 1182 ar9003_hw_attach_mac_ops(ah);
1183 ar9003_hw_attach_aic_ops(ah);
1142} 1184}
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.c b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
index 7b94a6c7db3d..af5ee416a560 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
@@ -19,6 +19,7 @@
19#include "hw-ops.h" 19#include "hw-ops.h"
20#include "ar9003_phy.h" 20#include "ar9003_phy.h"
21#include "ar9003_mci.h" 21#include "ar9003_mci.h"
22#include "ar9003_aic.h"
22 23
23static void ar9003_mci_reset_req_wakeup(struct ath_hw *ah) 24static void ar9003_mci_reset_req_wakeup(struct ath_hw *ah)
24{ 25{
@@ -284,12 +285,12 @@ static void ar9003_mci_prep_interface(struct ath_hw *ah)
284 AR_MCI_INTERRUPT_RX_MSG_CONT_RST); 285 AR_MCI_INTERRUPT_RX_MSG_CONT_RST);
285 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_BT_PRI); 286 REG_WRITE(ah, AR_MCI_INTERRUPT_RAW, AR_MCI_INTERRUPT_BT_PRI);
286 287
287 if (mci->is_2g) { 288 if (mci->is_2g && MCI_ANT_ARCH_PA_LNA_SHARED(mci)) {
288 ar9003_mci_send_lna_transfer(ah, true); 289 ar9003_mci_send_lna_transfer(ah, true);
289 udelay(5); 290 udelay(5);
290 } 291 }
291 292
292 if ((mci->is_2g && !mci->update_2g5g)) { 293 if (mci->is_2g && !mci->update_2g5g && MCI_ANT_ARCH_PA_LNA_SHARED(mci)) {
293 if (ar9003_mci_wait_for_interrupt(ah, 294 if (ar9003_mci_wait_for_interrupt(ah,
294 AR_MCI_INTERRUPT_RX_MSG_RAW, 295 AR_MCI_INTERRUPT_RX_MSG_RAW,
295 AR_MCI_INTERRUPT_RX_MSG_LNA_INFO, 296 AR_MCI_INTERRUPT_RX_MSG_LNA_INFO,
@@ -593,7 +594,7 @@ static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,
593 if (!time_out) 594 if (!time_out)
594 break; 595 break;
595 596
596 offset = ar9003_mci_get_next_gpm_offset(ah, false, &more_data); 597 offset = ar9003_mci_get_next_gpm_offset(ah, &more_data);
597 598
598 if (offset == MCI_GPM_INVALID) 599 if (offset == MCI_GPM_INVALID)
599 continue; 600 continue;
@@ -657,7 +658,7 @@ static u32 ar9003_mci_wait_for_gpm(struct ath_hw *ah, u8 gpm_type,
657 time_out = 0; 658 time_out = 0;
658 659
659 while (more_data == MCI_GPM_MORE) { 660 while (more_data == MCI_GPM_MORE) {
660 offset = ar9003_mci_get_next_gpm_offset(ah, false, &more_data); 661 offset = ar9003_mci_get_next_gpm_offset(ah, &more_data);
661 if (offset == MCI_GPM_INVALID) 662 if (offset == MCI_GPM_INVALID)
662 break; 663 break;
663 664
@@ -771,8 +772,14 @@ exit:
771 772
772static void ar9003_mci_mute_bt(struct ath_hw *ah) 773static void ar9003_mci_mute_bt(struct ath_hw *ah)
773{ 774{
775 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
776
774 /* disable all MCI messages */ 777 /* disable all MCI messages */
775 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xffff0000); 778 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 0xffff0000);
779 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS0, 0xffffffff);
780 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS1, 0xffffffff);
781 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS2, 0xffffffff);
782 REG_WRITE(ah, AR_BTCOEX_WL_WEIGHTS3, 0xffffffff);
776 REG_SET_BIT(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); 783 REG_SET_BIT(ah, AR_MCI_TX_CTRL, AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
777 784
778 /* wait pending HW messages to flush out */ 785 /* wait pending HW messages to flush out */
@@ -783,9 +790,10 @@ static void ar9003_mci_mute_bt(struct ath_hw *ah)
783 * 1. reset not after resuming from full sleep 790 * 1. reset not after resuming from full sleep
784 * 2. before reset MCI RX, to quiet BT and avoid MCI RX misalignment 791 * 2. before reset MCI RX, to quiet BT and avoid MCI RX misalignment
785 */ 792 */
786 ar9003_mci_send_lna_take(ah, true); 793 if (MCI_ANT_ARCH_PA_LNA_SHARED(mci)) {
787 794 ar9003_mci_send_lna_take(ah, true);
788 udelay(5); 795 udelay(5);
796 }
789 797
790 ar9003_mci_send_sys_sleeping(ah, true); 798 ar9003_mci_send_sys_sleeping(ah, true);
791} 799}
@@ -821,6 +829,80 @@ static void ar9003_mci_osla_setup(struct ath_hw *ah, bool enable)
821 AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN, 1); 829 AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN, 1);
822} 830}
823 831
832static void ar9003_mci_stat_setup(struct ath_hw *ah)
833{
834 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
835
836 if (!AR_SREV_9565(ah))
837 return;
838
839 if (mci->config & ATH_MCI_CONFIG_MCI_STAT_DBG) {
840 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL,
841 AR_MCI_DBG_CNT_CTRL_ENABLE, 1);
842 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL,
843 AR_MCI_DBG_CNT_CTRL_BT_LINKID,
844 MCI_STAT_ALL_BT_LINKID);
845 } else {
846 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL,
847 AR_MCI_DBG_CNT_CTRL_ENABLE, 0);
848 }
849}
850
851static void ar9003_mci_set_btcoex_ctrl_9565_1ANT(struct ath_hw *ah)
852{
853 u32 regval;
854
855 regval = SM(1, AR_BTCOEX_CTRL_AR9462_MODE) |
856 SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) |
857 SM(1, AR_BTCOEX_CTRL_PA_SHARED) |
858 SM(1, AR_BTCOEX_CTRL_LNA_SHARED) |
859 SM(1, AR_BTCOEX_CTRL_NUM_ANTENNAS) |
860 SM(1, AR_BTCOEX_CTRL_RX_CHAIN_MASK) |
861 SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) |
862 SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) |
863 SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
864
865 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2,
866 AR_BTCOEX_CTRL2_TX_CHAIN_MASK, 0x1);
867 REG_WRITE(ah, AR_BTCOEX_CTRL, regval);
868}
869
870static void ar9003_mci_set_btcoex_ctrl_9565_2ANT(struct ath_hw *ah)
871{
872 u32 regval;
873
874 regval = SM(1, AR_BTCOEX_CTRL_AR9462_MODE) |
875 SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) |
876 SM(0, AR_BTCOEX_CTRL_PA_SHARED) |
877 SM(0, AR_BTCOEX_CTRL_LNA_SHARED) |
878 SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) |
879 SM(1, AR_BTCOEX_CTRL_RX_CHAIN_MASK) |
880 SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) |
881 SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) |
882 SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
883
884 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2,
885 AR_BTCOEX_CTRL2_TX_CHAIN_MASK, 0x0);
886 REG_WRITE(ah, AR_BTCOEX_CTRL, regval);
887}
888
889static void ar9003_mci_set_btcoex_ctrl_9462(struct ath_hw *ah)
890{
891 u32 regval;
892
893 regval = SM(1, AR_BTCOEX_CTRL_AR9462_MODE) |
894 SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) |
895 SM(1, AR_BTCOEX_CTRL_PA_SHARED) |
896 SM(1, AR_BTCOEX_CTRL_LNA_SHARED) |
897 SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) |
898 SM(3, AR_BTCOEX_CTRL_RX_CHAIN_MASK) |
899 SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) |
900 SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) |
901 SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
902
903 REG_WRITE(ah, AR_BTCOEX_CTRL, regval);
904}
905
824int ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g, 906int ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
825 bool is_full_sleep) 907 bool is_full_sleep)
826{ 908{
@@ -831,11 +913,6 @@ int ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
831 ath_dbg(common, MCI, "MCI Reset (full_sleep = %d, is_2g = %d)\n", 913 ath_dbg(common, MCI, "MCI Reset (full_sleep = %d, is_2g = %d)\n",
832 is_full_sleep, is_2g); 914 is_full_sleep, is_2g);
833 915
834 if (!mci->gpm_addr && !mci->sched_addr) {
835 ath_err(common, "MCI GPM and schedule buffers are not allocated\n");
836 return -ENOMEM;
837 }
838
839 if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) { 916 if (REG_READ(ah, AR_BTCOEX_CTRL) == 0xdeadbeef) {
840 ath_err(common, "BTCOEX control register is dead\n"); 917 ath_err(common, "BTCOEX control register is dead\n");
841 return -EINVAL; 918 return -EINVAL;
@@ -850,26 +927,17 @@ int ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
850 * To avoid MCI state machine be affected by incoming remote MCI msgs, 927 * To avoid MCI state machine be affected by incoming remote MCI msgs,
851 * MCI mode will be enabled later, right before reset the MCI TX and RX. 928 * MCI mode will be enabled later, right before reset the MCI TX and RX.
852 */ 929 */
853
854 regval = SM(1, AR_BTCOEX_CTRL_AR9462_MODE) |
855 SM(1, AR_BTCOEX_CTRL_WBTIMER_EN) |
856 SM(1, AR_BTCOEX_CTRL_PA_SHARED) |
857 SM(1, AR_BTCOEX_CTRL_LNA_SHARED) |
858 SM(0, AR_BTCOEX_CTRL_1_CHAIN_ACK) |
859 SM(0, AR_BTCOEX_CTRL_1_CHAIN_BCN) |
860 SM(0, AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN);
861 if (AR_SREV_9565(ah)) { 930 if (AR_SREV_9565(ah)) {
862 regval |= SM(1, AR_BTCOEX_CTRL_NUM_ANTENNAS) | 931 u8 ant = MS(mci->config, ATH_MCI_CONFIG_ANT_ARCH);
863 SM(1, AR_BTCOEX_CTRL_RX_CHAIN_MASK); 932
864 REG_RMW_FIELD(ah, AR_BTCOEX_CTRL2, 933 if (ant == ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_SHARED)
865 AR_BTCOEX_CTRL2_TX_CHAIN_MASK, 0x1); 934 ar9003_mci_set_btcoex_ctrl_9565_1ANT(ah);
935 else
936 ar9003_mci_set_btcoex_ctrl_9565_2ANT(ah);
866 } else { 937 } else {
867 regval |= SM(2, AR_BTCOEX_CTRL_NUM_ANTENNAS) | 938 ar9003_mci_set_btcoex_ctrl_9462(ah);
868 SM(3, AR_BTCOEX_CTRL_RX_CHAIN_MASK);
869 } 939 }
870 940
871 REG_WRITE(ah, AR_BTCOEX_CTRL, regval);
872
873 if (is_2g && !(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA)) 941 if (is_2g && !(mci->config & ATH_MCI_CONFIG_DISABLE_OSLA))
874 ar9003_mci_osla_setup(ah, true); 942 ar9003_mci_osla_setup(ah, true);
875 else 943 else
@@ -926,26 +994,32 @@ int ar9003_mci_reset(struct ath_hw *ah, bool en_int, bool is_2g,
926 regval &= ~SM(1, AR_MCI_COMMAND2_RESET_RX); 994 regval &= ~SM(1, AR_MCI_COMMAND2_RESET_RX);
927 REG_WRITE(ah, AR_MCI_COMMAND2, regval); 995 REG_WRITE(ah, AR_MCI_COMMAND2, regval);
928 996
929 ar9003_mci_get_next_gpm_offset(ah, true, NULL); 997 /* Init GPM offset after MCI Reset Rx */
998 ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET);
930 999
931 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE, 1000 REG_WRITE(ah, AR_MCI_MSG_ATTRIBUTES_TABLE,
932 (SM(0xe801, AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR) | 1001 (SM(0xe801, AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR) |
933 SM(0x0000, AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM))); 1002 SM(0x0000, AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM)));
934 1003
935 REG_CLR_BIT(ah, AR_MCI_TX_CTRL, 1004 if (MCI_ANT_ARCH_PA_LNA_SHARED(mci))
936 AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE); 1005 REG_CLR_BIT(ah, AR_MCI_TX_CTRL,
1006 AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
1007 else
1008 REG_SET_BIT(ah, AR_MCI_TX_CTRL,
1009 AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE);
937 1010
938 ar9003_mci_observation_set_up(ah); 1011 ar9003_mci_observation_set_up(ah);
939 1012
940 mci->ready = true; 1013 mci->ready = true;
941 ar9003_mci_prep_interface(ah); 1014 ar9003_mci_prep_interface(ah);
1015 ar9003_mci_stat_setup(ah);
942 1016
943 if (AR_SREV_9565(ah))
944 REG_RMW_FIELD(ah, AR_MCI_DBG_CNT_CTRL,
945 AR_MCI_DBG_CNT_CTRL_ENABLE, 0);
946 if (en_int) 1017 if (en_int)
947 ar9003_mci_enable_interrupt(ah); 1018 ar9003_mci_enable_interrupt(ah);
948 1019
1020 if (ath9k_hw_is_aic_enabled(ah))
1021 ar9003_aic_start_normal(ah);
1022
949 return 0; 1023 return 0;
950} 1024}
951 1025
@@ -1218,6 +1292,14 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
1218 } 1292 }
1219 value &= AR_BTCOEX_CTRL_MCI_MODE_EN; 1293 value &= AR_BTCOEX_CTRL_MCI_MODE_EN;
1220 break; 1294 break;
1295 case MCI_STATE_INIT_GPM_OFFSET:
1296 value = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR);
1297
1298 if (value < mci->gpm_len)
1299 mci->gpm_idx = value;
1300 else
1301 mci->gpm_idx = 0;
1302 break;
1221 case MCI_STATE_LAST_SCHD_MSG_OFFSET: 1303 case MCI_STATE_LAST_SCHD_MSG_OFFSET:
1222 value = MS(REG_READ(ah, AR_MCI_RX_STATUS), 1304 value = MS(REG_READ(ah, AR_MCI_RX_STATUS),
1223 AR_MCI_RX_LAST_SCHD_MSG_INDEX); 1305 AR_MCI_RX_LAST_SCHD_MSG_INDEX);
@@ -1284,6 +1366,22 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
1284 value = (!mci->unhalt_bt_gpm && mci->need_flush_btinfo) ? 1 : 0; 1366 value = (!mci->unhalt_bt_gpm && mci->need_flush_btinfo) ? 1 : 0;
1285 mci->need_flush_btinfo = false; 1367 mci->need_flush_btinfo = false;
1286 break; 1368 break;
1369 case MCI_STATE_AIC_CAL:
1370 if (ath9k_hw_is_aic_enabled(ah))
1371 value = ar9003_aic_calibration(ah);
1372 break;
1373 case MCI_STATE_AIC_START:
1374 if (ath9k_hw_is_aic_enabled(ah))
1375 ar9003_aic_start_normal(ah);
1376 break;
1377 case MCI_STATE_AIC_CAL_RESET:
1378 if (ath9k_hw_is_aic_enabled(ah))
1379 value = ar9003_aic_cal_reset(ah);
1380 break;
1381 case MCI_STATE_AIC_CAL_SINGLE:
1382 if (ath9k_hw_is_aic_enabled(ah))
1383 value = ar9003_aic_calibration_single(ah);
1384 break;
1287 default: 1385 default:
1288 break; 1386 break;
1289 } 1387 }
@@ -1364,21 +1462,11 @@ void ar9003_mci_check_gpm_offset(struct ath_hw *ah)
1364 mci->gpm_idx = 0; 1462 mci->gpm_idx = 0;
1365} 1463}
1366 1464
1367u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, bool first, u32 *more) 1465u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, u32 *more)
1368{ 1466{
1369 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; 1467 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
1370 u32 offset, more_gpm = 0, gpm_ptr; 1468 u32 offset, more_gpm = 0, gpm_ptr;
1371 1469
1372 if (first) {
1373 gpm_ptr = MS(REG_READ(ah, AR_MCI_GPM_1), AR_MCI_GPM_WRITE_PTR);
1374
1375 if (gpm_ptr >= mci->gpm_len)
1376 gpm_ptr = 0;
1377
1378 mci->gpm_idx = gpm_ptr;
1379 return gpm_ptr;
1380 }
1381
1382 /* 1470 /*
1383 * This could be useful to avoid new GPM message interrupt which 1471 * This could be useful to avoid new GPM message interrupt which
1384 * may lead to spurious interrupt after power sleep, or multiple 1472 * may lead to spurious interrupt after power sleep, or multiple
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.h b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
index 66d7ab9f920d..e288611c12d5 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.h
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
@@ -92,14 +92,36 @@ enum mci_gpm_coex_bt_update_flags_op {
92#define ATH_MCI_CONFIG_CLK_DIV 0x00003000 92#define ATH_MCI_CONFIG_CLK_DIV 0x00003000
93#define ATH_MCI_CONFIG_CLK_DIV_S 12 93#define ATH_MCI_CONFIG_CLK_DIV_S 12
94#define ATH_MCI_CONFIG_DISABLE_TUNING 0x00004000 94#define ATH_MCI_CONFIG_DISABLE_TUNING 0x00004000
95#define ATH_MCI_CONFIG_DISABLE_AIC 0x00008000
96#define ATH_MCI_CONFIG_AIC_CAL_NUM_CHAN 0x007f0000
97#define ATH_MCI_CONFIG_AIC_CAL_NUM_CHAN_S 16
98#define ATH_MCI_CONFIG_NO_QUIET_ACK 0x00800000
99#define ATH_MCI_CONFIG_NO_QUIET_ACK_S 23
100#define ATH_MCI_CONFIG_ANT_ARCH 0x07000000
101#define ATH_MCI_CONFIG_ANT_ARCH_S 24
102#define ATH_MCI_CONFIG_FORCE_QUIET_ACK 0x08000000
103#define ATH_MCI_CONFIG_FORCE_QUIET_ACK_S 27
104#define ATH_MCI_CONFIG_FORCE_2CHAIN_ACK 0x10000000
105#define ATH_MCI_CONFIG_MCI_STAT_DBG 0x20000000
95#define ATH_MCI_CONFIG_MCI_WEIGHT_DBG 0x40000000 106#define ATH_MCI_CONFIG_MCI_WEIGHT_DBG 0x40000000
96#define ATH_MCI_CONFIG_DISABLE_MCI 0x80000000 107#define ATH_MCI_CONFIG_DISABLE_MCI 0x80000000
97 108
98#define ATH_MCI_CONFIG_MCI_OBS_MASK (ATH_MCI_CONFIG_MCI_OBS_MCI | \ 109#define ATH_MCI_CONFIG_MCI_OBS_MASK (ATH_MCI_CONFIG_MCI_OBS_MCI | \
99 ATH_MCI_CONFIG_MCI_OBS_TXRX | \ 110 ATH_MCI_CONFIG_MCI_OBS_TXRX | \
100 ATH_MCI_CONFIG_MCI_OBS_BT) 111 ATH_MCI_CONFIG_MCI_OBS_BT)
112
101#define ATH_MCI_CONFIG_MCI_OBS_GPIO 0x0000002F 113#define ATH_MCI_CONFIG_MCI_OBS_GPIO 0x0000002F
102 114
115#define ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_NON_SHARED 0x00
116#define ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_SHARED 0x01
117#define ATH_MCI_ANT_ARCH_2_ANT_PA_LNA_NON_SHARED 0x02
118#define ATH_MCI_ANT_ARCH_2_ANT_PA_LNA_SHARED 0x03
119#define ATH_MCI_ANT_ARCH_3_ANT 0x04
120
121#define MCI_ANT_ARCH_PA_LNA_SHARED(mci) \
122 ((MS(mci->config, ATH_MCI_CONFIG_ANT_ARCH) == ATH_MCI_ANT_ARCH_1_ANT_PA_LNA_SHARED) || \
123 (MS(mci->config, ATH_MCI_CONFIG_ANT_ARCH) == ATH_MCI_ANT_ARCH_2_ANT_PA_LNA_SHARED))
124
103enum mci_message_header { /* length of payload */ 125enum mci_message_header { /* length of payload */
104 MCI_LNA_CTRL = 0x10, /* len = 0 */ 126 MCI_LNA_CTRL = 0x10, /* len = 0 */
105 MCI_CONT_NACK = 0x20, /* len = 0 */ 127 MCI_CONT_NACK = 0x20, /* len = 0 */
@@ -188,20 +210,55 @@ enum mci_bt_state {
188 MCI_BT_CAL 210 MCI_BT_CAL
189}; 211};
190 212
213enum mci_ps_state {
214 MCI_PS_DISABLE,
215 MCI_PS_ENABLE,
216 MCI_PS_ENABLE_OFF,
217 MCI_PS_ENABLE_ON
218};
219
191/* Type of state query */ 220/* Type of state query */
192enum mci_state_type { 221enum mci_state_type {
193 MCI_STATE_ENABLE, 222 MCI_STATE_ENABLE,
223 MCI_STATE_INIT_GPM_OFFSET,
224 MCI_STATE_CHECK_GPM_OFFSET,
225 MCI_STATE_NEXT_GPM_OFFSET,
226 MCI_STATE_LAST_GPM_OFFSET,
227 MCI_STATE_BT,
228 MCI_STATE_SET_BT_SLEEP,
194 MCI_STATE_SET_BT_AWAKE, 229 MCI_STATE_SET_BT_AWAKE,
230 MCI_STATE_SET_BT_CAL_START,
231 MCI_STATE_SET_BT_CAL,
195 MCI_STATE_LAST_SCHD_MSG_OFFSET, 232 MCI_STATE_LAST_SCHD_MSG_OFFSET,
196 MCI_STATE_REMOTE_SLEEP, 233 MCI_STATE_REMOTE_SLEEP,
234 MCI_STATE_CONT_STATUS,
197 MCI_STATE_RESET_REQ_WAKE, 235 MCI_STATE_RESET_REQ_WAKE,
198 MCI_STATE_SEND_WLAN_COEX_VERSION, 236 MCI_STATE_SEND_WLAN_COEX_VERSION,
237 MCI_STATE_SET_BT_COEX_VERSION,
238 MCI_STATE_SEND_WLAN_CHANNELS,
199 MCI_STATE_SEND_VERSION_QUERY, 239 MCI_STATE_SEND_VERSION_QUERY,
200 MCI_STATE_SEND_STATUS_QUERY, 240 MCI_STATE_SEND_STATUS_QUERY,
241 MCI_STATE_NEED_FLUSH_BT_INFO,
242 MCI_STATE_SET_CONCUR_TX_PRI,
201 MCI_STATE_RECOVER_RX, 243 MCI_STATE_RECOVER_RX,
202 MCI_STATE_NEED_FTP_STOMP, 244 MCI_STATE_NEED_FTP_STOMP,
245 MCI_STATE_NEED_TUNING,
246 MCI_STATE_NEED_STAT_DEBUG,
247 MCI_STATE_SHARED_CHAIN_CONCUR_TX,
248 MCI_STATE_AIC_CAL,
249 MCI_STATE_AIC_START,
250 MCI_STATE_AIC_CAL_RESET,
251 MCI_STATE_AIC_CAL_SINGLE,
252 MCI_STATE_IS_AR9462,
253 MCI_STATE_IS_AR9565_1ANT,
254 MCI_STATE_IS_AR9565_2ANT,
255 MCI_STATE_WLAN_WEAK_SIGNAL,
256 MCI_STATE_SET_WLAN_PS_STATE,
257 MCI_STATE_GET_WLAN_PS_STATE,
203 MCI_STATE_DEBUG, 258 MCI_STATE_DEBUG,
204 MCI_STATE_NEED_FLUSH_BT_INFO, 259 MCI_STATE_STAT_DEBUG,
260 MCI_STATE_ALLOW_FCS,
261 MCI_STATE_SET_2G_CONTENTION,
205 MCI_STATE_MAX 262 MCI_STATE_MAX
206}; 263};
207 264
@@ -255,7 +312,7 @@ int ar9003_mci_setup(struct ath_hw *ah, u32 gpm_addr, void *gpm_buf,
255void ar9003_mci_cleanup(struct ath_hw *ah); 312void ar9003_mci_cleanup(struct ath_hw *ah);
256void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr, 313void ar9003_mci_get_interrupt(struct ath_hw *ah, u32 *raw_intr,
257 u32 *rx_msg_intr); 314 u32 *rx_msg_intr);
258u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, bool first, u32 *more); 315u32 ar9003_mci_get_next_gpm_offset(struct ath_hw *ah, u32 *more);
259void ar9003_mci_set_bt_version(struct ath_hw *ah, u8 major, u8 minor); 316void ar9003_mci_set_bt_version(struct ath_hw *ah, u8 major, u8 minor);
260void ar9003_mci_send_wlan_channels(struct ath_hw *ah); 317void ar9003_mci_send_wlan_channels(struct ath_hw *ah);
261/* 318/*
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
index c311b2bfdb00..fc595b92ac56 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
@@ -640,16 +640,6 @@
640#define AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE 0x0000ff00 640#define AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE 0x0000ff00
641#define AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE_S 8 641#define AR_PHY_BB_THERM_ADC_4_LATEST_VOLT_VALUE_S 8
642 642
643/* AIC Registers */
644#define AR_PHY_AIC_CTRL_0_B0 (AR_SM_BASE + 0x4b0)
645#define AR_PHY_AIC_CTRL_1_B0 (AR_SM_BASE + 0x4b4)
646#define AR_PHY_AIC_CTRL_2_B0 (AR_SM_BASE + 0x4b8)
647#define AR_PHY_AIC_CTRL_3_B0 (AR_SM_BASE + 0x4bc)
648#define AR_PHY_AIC_STAT_0_B0 (AR_SM_BASE + 0x4c4))
649#define AR_PHY_AIC_STAT_1_B0 (AR_SM_BASE + 0x4c8))
650#define AR_PHY_AIC_CTRL_4_B0 (AR_SM_BASE + 0x4c0)
651#define AR_PHY_AIC_STAT_2_B0 (AR_SM_BASE + 0x4cc)
652
653#define AR_PHY_65NM_CH0_TXRF3 0x16048 643#define AR_PHY_65NM_CH0_TXRF3 0x16048
654#define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G 0x0000001e 644#define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G 0x0000001e
655#define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G_S 1 645#define AR_PHY_65NM_CH0_TXRF3_CAPDIV2G_S 1
@@ -989,21 +979,6 @@
989#define AR_PHY_TX_IQCAL_STATUS_B1 (AR_SM1_BASE + 0x48c) 979#define AR_PHY_TX_IQCAL_STATUS_B1 (AR_SM1_BASE + 0x48c)
990#define AR_PHY_TX_IQCAL_CORR_COEFF_B1(_i) (AR_SM1_BASE + 0x450 + ((_i) << 2)) 980#define AR_PHY_TX_IQCAL_CORR_COEFF_B1(_i) (AR_SM1_BASE + 0x450 + ((_i) << 2))
991 981
992/* SM 1 AIC Registers */
993
994#define AR_PHY_AIC_CTRL_0_B1 (AR_SM1_BASE + 0x4b0)
995#define AR_PHY_AIC_CTRL_1_B1 (AR_SM1_BASE + 0x4b4)
996#define AR_PHY_AIC_CTRL_2_B1 (AR_SM1_BASE + 0x4b8)
997#define AR_PHY_AIC_STAT_0_B1 (AR_SM1_BASE + (AR_SREV_9462_10(ah) ? \
998 0x4c0 : 0x4c4))
999#define AR_PHY_AIC_STAT_1_B1 (AR_SM1_BASE + (AR_SREV_9462_10(ah) ? \
1000 0x4c4 : 0x4c8))
1001#define AR_PHY_AIC_CTRL_4_B1 (AR_SM1_BASE + 0x4c0)
1002#define AR_PHY_AIC_STAT_2_B1 (AR_SM1_BASE + 0x4cc)
1003
1004#define AR_PHY_AIC_SRAM_ADDR_B1 (AR_SM1_BASE + 0x5f0)
1005#define AR_PHY_AIC_SRAM_DATA_B1 (AR_SM1_BASE + 0x5f4)
1006
1007#define AR_PHY_RTT_TABLE_SW_INTF_B(i) (0x384 + ((i) ? \ 982#define AR_PHY_RTT_TABLE_SW_INTF_B(i) (0x384 + ((i) ? \
1008 AR_SM1_BASE : AR_SM_BASE)) 983 AR_SM1_BASE : AR_SM_BASE))
1009#define AR_PHY_RTT_TABLE_SW_INTF_1_B(i) (0x388 + ((i) ? \ 984#define AR_PHY_RTT_TABLE_SW_INTF_1_B(i) (0x388 + ((i) ? \
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_rtt.c b/drivers/net/wireless/ath/ath9k/ar9003_rtt.c
index 934418872e8e..e4d11fa7fe8c 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_rtt.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_rtt.c
@@ -106,7 +106,7 @@ void ar9003_hw_rtt_load_hist(struct ath_hw *ah)
106 int chain, i; 106 int chain, i;
107 107
108 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { 108 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
109 if (!(ah->rxchainmask & (1 << chain))) 109 if (!(ah->caps.rx_chainmask & (1 << chain)))
110 continue; 110 continue;
111 for (i = 0; i < MAX_RTT_TABLE_ENTRY; i++) { 111 for (i = 0; i < MAX_RTT_TABLE_ENTRY; i++) {
112 ar9003_hw_rtt_load_hist_entry(ah, chain, i, 112 ar9003_hw_rtt_load_hist_entry(ah, chain, i,
@@ -171,7 +171,7 @@ void ar9003_hw_rtt_fill_hist(struct ath_hw *ah)
171 int chain, i; 171 int chain, i;
172 172
173 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { 173 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
174 if (!(ah->rxchainmask & (1 << chain))) 174 if (!(ah->caps.rx_chainmask & (1 << chain)))
175 continue; 175 continue;
176 for (i = 0; i < MAX_RTT_TABLE_ENTRY; i++) { 176 for (i = 0; i < MAX_RTT_TABLE_ENTRY; i++) {
177 ah->caldata->rtt_table[chain][i] = 177 ah->caldata->rtt_table[chain][i] =
@@ -193,7 +193,7 @@ void ar9003_hw_rtt_clear_hist(struct ath_hw *ah)
193 int chain, i; 193 int chain, i;
194 194
195 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) { 195 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
196 if (!(ah->rxchainmask & (1 << chain))) 196 if (!(ah->caps.rx_chainmask & (1 << chain)))
197 continue; 197 continue;
198 for (i = 0; i < MAX_RTT_TABLE_ENTRY; i++) 198 for (i = 0; i < MAX_RTT_TABLE_ENTRY; i++)
199 ar9003_hw_rtt_load_hist_entry(ah, chain, i, 0); 199 ar9003_hw_rtt_load_hist_entry(ah, chain, i, 0);
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_wow.c b/drivers/net/wireless/ath/ath9k/ar9003_wow.c
index 86bfc9604dca..bea41df9fbd7 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_wow.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_wow.c
@@ -20,11 +20,25 @@
20#include "reg_wow.h" 20#include "reg_wow.h"
21#include "hw-ops.h" 21#include "hw-ops.h"
22 22
23static void ath9k_hw_set_sta_powersave(struct ath_hw *ah)
24{
25 if (!ath9k_hw_mci_is_enabled(ah))
26 goto set;
27 /*
28 * If MCI is being used, set PWR_SAV only when MCI's
29 * PS state is disabled.
30 */
31 if (ar9003_mci_state(ah, MCI_STATE_GET_WLAN_PS_STATE) != MCI_PS_DISABLE)
32 return;
33set:
34 REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
35}
36
23static void ath9k_hw_set_powermode_wow_sleep(struct ath_hw *ah) 37static void ath9k_hw_set_powermode_wow_sleep(struct ath_hw *ah)
24{ 38{
25 struct ath_common *common = ath9k_hw_common(ah); 39 struct ath_common *common = ath9k_hw_common(ah);
26 40
27 REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); 41 ath9k_hw_set_sta_powersave(ah);
28 42
29 /* set rx disable bit */ 43 /* set rx disable bit */
30 REG_WRITE(ah, AR_CR, AR_CR_RXD); 44 REG_WRITE(ah, AR_CR, AR_CR_RXD);
@@ -44,6 +58,9 @@ static void ath9k_hw_set_powermode_wow_sleep(struct ath_hw *ah)
44 REG_CLR_BIT(ah, AR_DIRECT_CONNECT, AR_DC_TSF2_ENABLE); 58 REG_CLR_BIT(ah, AR_DIRECT_CONNECT, AR_DC_TSF2_ENABLE);
45 } 59 }
46 60
61 if (ath9k_hw_mci_is_enabled(ah))
62 REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);
63
47 REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_ON_INT); 64 REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_ON_INT);
48} 65}
49 66
@@ -74,8 +91,6 @@ static void ath9k_wow_create_keep_alive_pattern(struct ath_hw *ah)
74 for (i = 0; i < KAL_NUM_DESC_WORDS; i++) 91 for (i = 0; i < KAL_NUM_DESC_WORDS; i++)
75 REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]); 92 REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]);
76 93
77 REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]);
78
79 data_word[0] = (KAL_FRAME_TYPE << 2) | (KAL_FRAME_SUB_TYPE << 4) | 94 data_word[0] = (KAL_FRAME_TYPE << 2) | (KAL_FRAME_SUB_TYPE << 4) |
80 (KAL_TO_DS << 8) | (KAL_DURATION_ID << 16); 95 (KAL_TO_DS << 8) | (KAL_DURATION_ID << 16);
81 data_word[1] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) | 96 data_word[1] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) |
@@ -88,9 +103,11 @@ static void ath9k_wow_create_keep_alive_pattern(struct ath_hw *ah)
88 (ap_mac_addr[1] << 8) | (ap_mac_addr[0]); 103 (ap_mac_addr[1] << 8) | (ap_mac_addr[0]);
89 data_word[5] = (ap_mac_addr[5] << 8) | (ap_mac_addr[4]); 104 data_word[5] = (ap_mac_addr[5] << 8) | (ap_mac_addr[4]);
90 105
91 if (AR_SREV_9462_20(ah)) { 106 if (AR_SREV_9462_20_OR_LATER(ah) || AR_SREV_9565(ah)) {
92 /* AR9462 2.0 has an extra descriptor word (time based 107 /*
93 * discard) compared to other chips */ 108 * AR9462 2.0 and AR9565 have an extra descriptor word
109 * (time based discard) compared to other chips.
110 */
94 REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + (12 * 4)), 0); 111 REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + (12 * 4)), 0);
95 wow_ka_data_word0 = AR_WOW_TXBUF(13); 112 wow_ka_data_word0 = AR_WOW_TXBUF(13);
96 } else { 113 } else {
@@ -99,7 +116,6 @@ static void ath9k_wow_create_keep_alive_pattern(struct ath_hw *ah)
99 116
100 for (i = 0; i < KAL_NUM_DATA_WORDS; i++) 117 for (i = 0; i < KAL_NUM_DATA_WORDS; i++)
101 REG_WRITE(ah, (wow_ka_data_word0 + i*4), data_word[i]); 118 REG_WRITE(ah, (wow_ka_data_word0 + i*4), data_word[i]);
102
103} 119}
104 120
105int ath9k_hw_wow_apply_pattern(struct ath_hw *ah, u8 *user_pattern, 121int ath9k_hw_wow_apply_pattern(struct ath_hw *ah, u8 *user_pattern,
@@ -170,18 +186,17 @@ u32 ath9k_hw_wow_wakeup(struct ath_hw *ah)
170 u32 val = 0, rval; 186 u32 val = 0, rval;
171 187
172 /* 188 /*
173 * read the WoW status register to know 189 * Read the WoW status register to know
174 * the wakeup reason 190 * the wakeup reason.
175 */ 191 */
176 rval = REG_READ(ah, AR_WOW_PATTERN); 192 rval = REG_READ(ah, AR_WOW_PATTERN);
177 val = AR_WOW_STATUS(rval); 193 val = AR_WOW_STATUS(rval);
178 194
179 /* 195 /*
180 * mask only the WoW events that we have enabled. Sometimes 196 * Mask only the WoW events that we have enabled. Sometimes
181 * we have spurious WoW events from the AR_WOW_PATTERN 197 * we have spurious WoW events from the AR_WOW_PATTERN
182 * register. This mask will clean it up. 198 * register. This mask will clean it up.
183 */ 199 */
184
185 val &= ah->wow.wow_event_mask; 200 val &= ah->wow.wow_event_mask;
186 201
187 if (val) { 202 if (val) {
@@ -195,6 +210,15 @@ u32 ath9k_hw_wow_wakeup(struct ath_hw *ah)
195 wow_status |= AH_WOW_BEACON_MISS; 210 wow_status |= AH_WOW_BEACON_MISS;
196 } 211 }
197 212
213 rval = REG_READ(ah, AR_MAC_PCU_WOW4);
214 val = AR_WOW_STATUS2(rval);
215 val &= ah->wow.wow_event_mask2;
216
217 if (val) {
218 if (AR_WOW2_PATTERN_FOUND(val))
219 wow_status |= AH_WOW_USER_PATTERN_EN;
220 }
221
198 /* 222 /*
199 * set and clear WOW_PME_CLEAR registers for the chip to 223 * set and clear WOW_PME_CLEAR registers for the chip to
200 * generate next wow signal. 224 * generate next wow signal.
@@ -206,10 +230,12 @@ u32 ath9k_hw_wow_wakeup(struct ath_hw *ah)
206 AR_PMCTRL_PWR_STATE_D1D3); 230 AR_PMCTRL_PWR_STATE_D1D3);
207 231
208 /* 232 /*
209 * clear all events 233 * Clear all events.
210 */ 234 */
211 REG_WRITE(ah, AR_WOW_PATTERN, 235 REG_WRITE(ah, AR_WOW_PATTERN,
212 AR_WOW_CLEAR_EVENTS(REG_READ(ah, AR_WOW_PATTERN))); 236 AR_WOW_CLEAR_EVENTS(REG_READ(ah, AR_WOW_PATTERN)));
237 REG_WRITE(ah, AR_MAC_PCU_WOW4,
238 AR_WOW_CLEAR_EVENTS2(REG_READ(ah, AR_MAC_PCU_WOW4)));
213 239
214 /* 240 /*
215 * restore the beacon threshold to init value 241 * restore the beacon threshold to init value
@@ -226,7 +252,15 @@ u32 ath9k_hw_wow_wakeup(struct ath_hw *ah)
226 if (ah->is_pciexpress) 252 if (ah->is_pciexpress)
227 ath9k_hw_configpcipowersave(ah, false); 253 ath9k_hw_configpcipowersave(ah, false);
228 254
255 if (AR_SREV_9462(ah) || AR_SREV_9565(ah) || AR_SREV_9485(ah)) {
256 u32 dc = REG_READ(ah, AR_DIRECT_CONNECT);
257
258 if (!(dc & AR_DC_TSF2_ENABLE))
259 ath9k_hw_gen_timer_start_tsf2(ah);
260 }
261
229 ah->wow.wow_event_mask = 0; 262 ah->wow.wow_event_mask = 0;
263 ah->wow.wow_event_mask2 = 0;
230 264
231 return wow_status; 265 return wow_status;
232} 266}
@@ -408,6 +442,9 @@ void ath9k_hw_wow_enable(struct ath_hw *ah, u32 pattern_enable)
408 442
409 ath9k_hw_wow_set_arwr_reg(ah); 443 ath9k_hw_wow_set_arwr_reg(ah);
410 444
445 if (ath9k_hw_mci_is_enabled(ah))
446 REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);
447
411 /* HW WoW */ 448 /* HW WoW */
412 REG_CLR_BIT(ah, AR_PCU_MISC_MODE3, BIT(5)); 449 REG_CLR_BIT(ah, AR_PCU_MISC_MODE3, BIT(5));
413 450
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 0f8e9464e4ab..a7a81b3969ce 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -184,12 +184,12 @@ struct ath_frame_info {
184 struct ath_buf *bf; 184 struct ath_buf *bf;
185 u16 framelen; 185 u16 framelen;
186 s8 txq; 186 s8 txq;
187 enum ath9k_key_type keytype;
188 u8 keyix; 187 u8 keyix;
189 u8 rtscts_rate; 188 u8 rtscts_rate;
190 u8 retries : 7; 189 u8 retries : 7;
191 u8 baw_tracked : 1; 190 u8 baw_tracked : 1;
192 u8 tx_power; 191 u8 tx_power;
192 enum ath9k_key_type keytype:2;
193}; 193};
194 194
195struct ath_rxbuf { 195struct ath_rxbuf {
@@ -645,6 +645,7 @@ void ath9k_calculate_iter_data(struct ath_softc *sc,
645 struct ath9k_vif_iter_data *iter_data); 645 struct ath9k_vif_iter_data *iter_data);
646void ath9k_calculate_summary_state(struct ath_softc *sc, 646void ath9k_calculate_summary_state(struct ath_softc *sc,
647 struct ath_chanctx *ctx); 647 struct ath_chanctx *ctx);
648void ath9k_set_txpower(struct ath_softc *sc, struct ieee80211_vif *vif);
648 649
649/*******************/ 650/*******************/
650/* Beacon Handling */ 651/* Beacon Handling */
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.c b/drivers/net/wireless/ath/ath9k/btcoex.c
index 3dfc2c7f1f07..5a084d94ed90 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.c
+++ b/drivers/net/wireless/ath/ath9k/btcoex.c
@@ -103,7 +103,9 @@ void ath9k_hw_btcoex_init_scheme(struct ath_hw *ah)
103 return; 103 return;
104 } 104 }
105 105
106 if (AR_SREV_9300_20_OR_LATER(ah)) { 106 if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) {
107 btcoex_hw->scheme = ATH_BTCOEX_CFG_MCI;
108 } else if (AR_SREV_9300_20_OR_LATER(ah)) {
107 btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE; 109 btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
108 btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9300; 110 btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9300;
109 btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9300; 111 btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9300;
@@ -307,6 +309,18 @@ static void ath9k_hw_btcoex_enable_mci(struct ath_hw *ah)
307 btcoex->enabled = true; 309 btcoex->enabled = true;
308} 310}
309 311
312static void ath9k_hw_btcoex_disable_mci(struct ath_hw *ah)
313{
314 struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
315 int i;
316
317 ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE);
318
319 for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++)
320 REG_WRITE(ah, AR_MCI_COEX_WL_WEIGHTS(i),
321 btcoex_hw->wlan_weight[i]);
322}
323
310void ath9k_hw_btcoex_enable(struct ath_hw *ah) 324void ath9k_hw_btcoex_enable(struct ath_hw *ah)
311{ 325{
312 struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw; 326 struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
@@ -318,17 +332,18 @@ void ath9k_hw_btcoex_enable(struct ath_hw *ah)
318 ath9k_hw_btcoex_enable_2wire(ah); 332 ath9k_hw_btcoex_enable_2wire(ah);
319 break; 333 break;
320 case ATH_BTCOEX_CFG_3WIRE: 334 case ATH_BTCOEX_CFG_3WIRE:
321 if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
322 ath9k_hw_btcoex_enable_mci(ah);
323 return;
324 }
325 ath9k_hw_btcoex_enable_3wire(ah); 335 ath9k_hw_btcoex_enable_3wire(ah);
326 break; 336 break;
337 case ATH_BTCOEX_CFG_MCI:
338 ath9k_hw_btcoex_enable_mci(ah);
339 break;
327 } 340 }
328 341
329 REG_RMW(ah, AR_GPIO_PDPU, 342 if (ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_MCI) {
330 (0x2 << (btcoex_hw->btactive_gpio * 2)), 343 REG_RMW(ah, AR_GPIO_PDPU,
331 (0x3 << (btcoex_hw->btactive_gpio * 2))); 344 (0x2 << (btcoex_hw->btactive_gpio * 2)),
345 (0x3 << (btcoex_hw->btactive_gpio * 2)));
346 }
332 347
333 ah->btcoex_hw.enabled = true; 348 ah->btcoex_hw.enabled = true;
334} 349}
@@ -340,14 +355,14 @@ void ath9k_hw_btcoex_disable(struct ath_hw *ah)
340 int i; 355 int i;
341 356
342 btcoex_hw->enabled = false; 357 btcoex_hw->enabled = false;
343 if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) { 358
344 ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE); 359 if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_MCI) {
345 for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++) 360 ath9k_hw_btcoex_disable_mci(ah);
346 REG_WRITE(ah, AR_MCI_COEX_WL_WEIGHTS(i),
347 btcoex_hw->wlan_weight[i]);
348 return; 361 return;
349 } 362 }
350 ath9k_hw_set_gpio(ah, btcoex_hw->wlanactive_gpio, 0); 363
364 if (!AR_SREV_9300_20_OR_LATER(ah))
365 ath9k_hw_set_gpio(ah, btcoex_hw->wlanactive_gpio, 0);
351 366
352 ath9k_hw_cfg_output(ah, btcoex_hw->wlanactive_gpio, 367 ath9k_hw_cfg_output(ah, btcoex_hw->wlanactive_gpio,
353 AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 368 AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h
index 6de26ea5d5fa..cd2f0a2373cb 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.h
+++ b/drivers/net/wireless/ath/ath9k/btcoex.h
@@ -44,6 +44,9 @@
44 44
45#define AR9300_NUM_BT_WEIGHTS 4 45#define AR9300_NUM_BT_WEIGHTS 4
46#define AR9300_NUM_WLAN_WEIGHTS 4 46#define AR9300_NUM_WLAN_WEIGHTS 4
47
48#define ATH_AIC_MAX_BT_CHANNEL 79
49
47/* Defines the BT AR_BT_COEX_WGHT used */ 50/* Defines the BT AR_BT_COEX_WGHT used */
48enum ath_stomp_type { 51enum ath_stomp_type {
49 ATH_BTCOEX_STOMP_ALL, 52 ATH_BTCOEX_STOMP_ALL,
@@ -58,6 +61,7 @@ enum ath_btcoex_scheme {
58 ATH_BTCOEX_CFG_NONE, 61 ATH_BTCOEX_CFG_NONE,
59 ATH_BTCOEX_CFG_2WIRE, 62 ATH_BTCOEX_CFG_2WIRE,
60 ATH_BTCOEX_CFG_3WIRE, 63 ATH_BTCOEX_CFG_3WIRE,
64 ATH_BTCOEX_CFG_MCI,
61}; 65};
62 66
63struct ath9k_hw_mci { 67struct ath9k_hw_mci {
@@ -92,9 +96,18 @@ struct ath9k_hw_mci {
92 u32 last_recovery; 96 u32 last_recovery;
93}; 97};
94 98
99struct ath9k_hw_aic {
100 bool aic_enabled;
101 u8 aic_cal_state;
102 u8 aic_caled_chan;
103 u32 aic_sram[ATH_AIC_MAX_BT_CHANNEL];
104 u32 aic_cal_start_time;
105};
106
95struct ath_btcoex_hw { 107struct ath_btcoex_hw {
96 enum ath_btcoex_scheme scheme; 108 enum ath_btcoex_scheme scheme;
97 struct ath9k_hw_mci mci; 109 struct ath9k_hw_mci mci;
110 struct ath9k_hw_aic aic;
98 bool enabled; 111 bool enabled;
99 u8 wlanactive_gpio; 112 u8 wlanactive_gpio;
100 u8 btactive_gpio; 113 u8 btactive_gpio;
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c
index e200a6e3aca5..3e2e24e4843f 100644
--- a/drivers/net/wireless/ath/ath9k/calib.c
+++ b/drivers/net/wireless/ath/ath9k/calib.c
@@ -238,7 +238,6 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
238{ 238{
239 struct ath9k_nfcal_hist *h = NULL; 239 struct ath9k_nfcal_hist *h = NULL;
240 unsigned i, j; 240 unsigned i, j;
241 int32_t val;
242 u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask; 241 u8 chainmask = (ah->rxchainmask << 3) | ah->rxchainmask;
243 struct ath_common *common = ath9k_hw_common(ah); 242 struct ath_common *common = ath9k_hw_common(ah);
244 s16 default_nf = ath9k_hw_get_default_nf(ah, chan); 243 s16 default_nf = ath9k_hw_get_default_nf(ah, chan);
@@ -246,6 +245,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
246 if (ah->caldata) 245 if (ah->caldata)
247 h = ah->caldata->nfCalHist; 246 h = ah->caldata->nfCalHist;
248 247
248 ENABLE_REG_RMW_BUFFER(ah);
249 for (i = 0; i < NUM_NF_READINGS; i++) { 249 for (i = 0; i < NUM_NF_READINGS; i++) {
250 if (chainmask & (1 << i)) { 250 if (chainmask & (1 << i)) {
251 s16 nfval; 251 s16 nfval;
@@ -258,10 +258,8 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
258 else 258 else
259 nfval = default_nf; 259 nfval = default_nf;
260 260
261 val = REG_READ(ah, ah->nf_regs[i]); 261 REG_RMW(ah, ah->nf_regs[i],
262 val &= 0xFFFFFE00; 262 (((u32) nfval << 1) & 0x1ff), 0x1ff);
263 val |= (((u32) nfval << 1) & 0x1ff);
264 REG_WRITE(ah, ah->nf_regs[i], val);
265 } 263 }
266 } 264 }
267 265
@@ -274,6 +272,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
274 REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, 272 REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL,
275 AR_PHY_AGC_CONTROL_NO_UPDATE_NF); 273 AR_PHY_AGC_CONTROL_NO_UPDATE_NF);
276 REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); 274 REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF);
275 REG_RMW_BUFFER_FLUSH(ah);
277 276
278 /* 277 /*
279 * Wait for load to complete, should be fast, a few 10s of us. 278 * Wait for load to complete, should be fast, a few 10s of us.
@@ -309,19 +308,17 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
309 * by the median we just loaded. This will be initial (and max) value 308 * by the median we just loaded. This will be initial (and max) value
310 * of next noise floor calibration the baseband does. 309 * of next noise floor calibration the baseband does.
311 */ 310 */
312 ENABLE_REGWRITE_BUFFER(ah); 311 ENABLE_REG_RMW_BUFFER(ah);
313 for (i = 0; i < NUM_NF_READINGS; i++) { 312 for (i = 0; i < NUM_NF_READINGS; i++) {
314 if (chainmask & (1 << i)) { 313 if (chainmask & (1 << i)) {
315 if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan)) 314 if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan))
316 continue; 315 continue;
317 316
318 val = REG_READ(ah, ah->nf_regs[i]); 317 REG_RMW(ah, ah->nf_regs[i],
319 val &= 0xFFFFFE00; 318 (((u32) (-50) << 1) & 0x1ff), 0x1ff);
320 val |= (((u32) (-50) << 1) & 0x1ff);
321 REG_WRITE(ah, ah->nf_regs[i], val);
322 } 319 }
323 } 320 }
324 REGWRITE_BUFFER_FLUSH(ah); 321 REG_RMW_BUFFER_FLUSH(ah);
325 322
326 return 0; 323 return 0;
327} 324}
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c
index 50a2e0ac3b8b..dbf8f4959642 100644
--- a/drivers/net/wireless/ath/ath9k/debug.c
+++ b/drivers/net/wireless/ath/ath9k/debug.c
@@ -1156,7 +1156,10 @@ static ssize_t write_file_tpc(struct file *file, const char __user *user_buf,
1156 1156
1157 if (tpc_enabled != ah->tpc_enabled) { 1157 if (tpc_enabled != ah->tpc_enabled) {
1158 ah->tpc_enabled = tpc_enabled; 1158 ah->tpc_enabled = tpc_enabled;
1159 ath9k_hw_set_txpowerlimit(ah, sc->cur_chan->txpower, false); 1159
1160 mutex_lock(&sc->mutex);
1161 ath9k_set_txpower(sc, NULL);
1162 mutex_unlock(&sc->mutex);
1160 } 1163 }
1161 1164
1162 return count; 1165 return count;
diff --git a/drivers/net/wireless/ath/ath9k/dfs.c b/drivers/net/wireless/ath/ath9k/dfs.c
index 726271c7c330..e98a9eaba7ff 100644
--- a/drivers/net/wireless/ath/ath9k/dfs.c
+++ b/drivers/net/wireless/ath/ath9k/dfs.c
@@ -126,8 +126,19 @@ ath9k_postprocess_radar_event(struct ath_softc *sc,
126 DFS_STAT_INC(sc, pulses_detected); 126 DFS_STAT_INC(sc, pulses_detected);
127 return true; 127 return true;
128} 128}
129#undef PRI_CH_RADAR_FOUND 129
130#undef EXT_CH_RADAR_FOUND 130static void
131ath9k_dfs_process_radar_pulse(struct ath_softc *sc, struct pulse_event *pe)
132{
133 struct dfs_pattern_detector *pd = sc->dfs_detector;
134 DFS_STAT_INC(sc, pulses_processed);
135 if (pd == NULL)
136 return;
137 if (!pd->add_pulse(pd, pe))
138 return;
139 DFS_STAT_INC(sc, radar_detected);
140 ieee80211_radar_detected(sc->hw);
141}
131 142
132/* 143/*
133 * DFS: check PHY-error for radar pulse and feed the detector 144 * DFS: check PHY-error for radar pulse and feed the detector
@@ -176,18 +187,21 @@ void ath9k_dfs_process_phyerr(struct ath_softc *sc, void *data,
176 ard.pulse_length_pri = vdata_end[-3]; 187 ard.pulse_length_pri = vdata_end[-3];
177 pe.freq = ah->curchan->channel; 188 pe.freq = ah->curchan->channel;
178 pe.ts = mactime; 189 pe.ts = mactime;
179 if (ath9k_postprocess_radar_event(sc, &ard, &pe)) { 190 if (!ath9k_postprocess_radar_event(sc, &ard, &pe))
180 struct dfs_pattern_detector *pd = sc->dfs_detector; 191 return;
181 ath_dbg(common, DFS, 192
182 "ath9k_dfs_process_phyerr: channel=%d, ts=%llu, " 193 ath_dbg(common, DFS,
183 "width=%d, rssi=%d, delta_ts=%llu\n", 194 "ath9k_dfs_process_phyerr: type=%d, freq=%d, ts=%llu, "
184 pe.freq, pe.ts, pe.width, pe.rssi, 195 "width=%d, rssi=%d, delta_ts=%llu\n",
185 pe.ts - sc->dfs_prev_pulse_ts); 196 ard.pulse_bw_info, pe.freq, pe.ts, pe.width, pe.rssi,
186 sc->dfs_prev_pulse_ts = pe.ts; 197 pe.ts - sc->dfs_prev_pulse_ts);
187 DFS_STAT_INC(sc, pulses_processed); 198 sc->dfs_prev_pulse_ts = pe.ts;
188 if (pd != NULL && pd->add_pulse(pd, &pe)) { 199 if (ard.pulse_bw_info & PRI_CH_RADAR_FOUND)
189 DFS_STAT_INC(sc, radar_detected); 200 ath9k_dfs_process_radar_pulse(sc, &pe);
190 ieee80211_radar_detected(sc->hw); 201 if (ard.pulse_bw_info & EXT_CH_RADAR_FOUND) {
191 } 202 pe.freq += IS_CHAN_HT40PLUS(ah->curchan) ? 20 : -20;
203 ath9k_dfs_process_radar_pulse(sc, &pe);
192 } 204 }
193} 205}
206#undef PRI_CH_RADAR_FOUND
207#undef EXT_CH_RADAR_FOUND
diff --git a/drivers/net/wireless/ath/ath9k/eeprom.c b/drivers/net/wireless/ath/ath9k/eeprom.c
index 971d770722cf..cc81482c934d 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom.c
+++ b/drivers/net/wireless/ath/ath9k/eeprom.c
@@ -27,12 +27,7 @@ void ath9k_hw_analog_shift_regwrite(struct ath_hw *ah, u32 reg, u32 val)
27void ath9k_hw_analog_shift_rmw(struct ath_hw *ah, u32 reg, u32 mask, 27void ath9k_hw_analog_shift_rmw(struct ath_hw *ah, u32 reg, u32 mask,
28 u32 shift, u32 val) 28 u32 shift, u32 val)
29{ 29{
30 u32 regVal; 30 REG_RMW(ah, reg, ((val << shift) & mask), mask);
31
32 regVal = REG_READ(ah, reg) & ~mask;
33 regVal |= (val << shift) & mask;
34
35 REG_WRITE(ah, reg, regVal);
36 31
37 if (ah->config.analog_shiftreg) 32 if (ah->config.analog_shiftreg)
38 udelay(100); 33 udelay(100);
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_4k.c b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
index e5a78d4fd66e..4773da6dc6f2 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
@@ -389,6 +389,7 @@ static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah,
389 } 389 }
390 } 390 }
391 391
392 ENABLE_REG_RMW_BUFFER(ah);
392 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN, 393 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_NUM_PD_GAIN,
393 (numXpdGain - 1) & 0x3); 394 (numXpdGain - 1) & 0x3);
394 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1, 395 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_1,
@@ -396,6 +397,7 @@ static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah,
396 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2, 397 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_2,
397 xpdGainValues[1]); 398 xpdGainValues[1]);
398 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, 0); 399 REG_RMW_FIELD(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_GAIN_3, 0);
400 REG_RMW_BUFFER_FLUSH(ah);
399 401
400 for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) { 402 for (i = 0; i < AR5416_EEP4K_MAX_CHAINS; i++) {
401 regChainOffset = i * 0x1000; 403 regChainOffset = i * 0x1000;
@@ -770,15 +772,14 @@ static void ath9k_hw_4k_set_gain(struct ath_hw *ah,
770 struct ar5416_eeprom_4k *eep, 772 struct ar5416_eeprom_4k *eep,
771 u8 txRxAttenLocal) 773 u8 txRxAttenLocal)
772{ 774{
773 REG_WRITE(ah, AR_PHY_SWITCH_CHAIN_0, 775 ENABLE_REG_RMW_BUFFER(ah);
774 pModal->antCtrlChain[0]); 776 REG_RMW(ah, AR_PHY_SWITCH_CHAIN_0,
777 pModal->antCtrlChain[0], 0);
775 778
776 REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0), 779 REG_RMW(ah, AR_PHY_TIMING_CTRL4(0),
777 (REG_READ(ah, AR_PHY_TIMING_CTRL4(0)) & 780 SM(pModal->iqCalICh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) |
778 ~(AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | 781 SM(pModal->iqCalQCh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF),
779 AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF)) | 782 AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF);
780 SM(pModal->iqCalICh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF) |
781 SM(pModal->iqCalQCh[0], AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF));
782 783
783 if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >= 784 if ((eep->baseEepHeader.version & AR5416_EEP_VER_MINOR_MASK) >=
784 AR5416_EEP_MINOR_VER_3) { 785 AR5416_EEP_MINOR_VER_3) {
@@ -817,6 +818,7 @@ static void ath9k_hw_4k_set_gain(struct ath_hw *ah,
817 AR9280_PHY_RXGAIN_TXRX_ATTEN, txRxAttenLocal); 818 AR9280_PHY_RXGAIN_TXRX_ATTEN, txRxAttenLocal);
818 REG_RMW_FIELD(ah, AR_PHY_RXGAIN + 0x1000, 819 REG_RMW_FIELD(ah, AR_PHY_RXGAIN + 0x1000,
819 AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[0]); 820 AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[0]);
821 REG_RMW_BUFFER_FLUSH(ah);
820} 822}
821 823
822/* 824/*
@@ -928,6 +930,7 @@ static void ath9k_hw_4k_set_board_values(struct ath_hw *ah,
928 } 930 }
929 } 931 }
930 932
933 ENABLE_REG_RMW_BUFFER(ah);
931 if (AR_SREV_9271(ah)) { 934 if (AR_SREV_9271(ah)) {
932 ath9k_hw_analog_shift_rmw(ah, 935 ath9k_hw_analog_shift_rmw(ah,
933 AR9285_AN_RF2G3, 936 AR9285_AN_RF2G3,
@@ -1032,18 +1035,19 @@ static void ath9k_hw_4k_set_board_values(struct ath_hw *ah,
1032 AR9285_AN_RF2G4_DB2_4_S, 1035 AR9285_AN_RF2G4_DB2_4_S,
1033 db2[4]); 1036 db2[4]);
1034 } 1037 }
1038 REG_RMW_BUFFER_FLUSH(ah);
1035 1039
1036 1040 ENABLE_REG_RMW_BUFFER(ah);
1037 REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH, 1041 REG_RMW_FIELD(ah, AR_PHY_SETTLING, AR_PHY_SETTLING_SWITCH,
1038 pModal->switchSettling); 1042 pModal->switchSettling);
1039 REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_ADC, 1043 REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, AR_PHY_DESIRED_SZ_ADC,
1040 pModal->adcDesiredSize); 1044 pModal->adcDesiredSize);
1041 1045
1042 REG_WRITE(ah, AR_PHY_RF_CTL4, 1046 REG_RMW(ah, AR_PHY_RF_CTL4,
1043 SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAA_OFF) | 1047 SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAA_OFF) |
1044 SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAB_OFF) | 1048 SM(pModal->txEndToXpaOff, AR_PHY_RF_CTL4_TX_END_XPAB_OFF) |
1045 SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAA_ON) | 1049 SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAA_ON) |
1046 SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAB_ON)); 1050 SM(pModal->txFrameToXpaOn, AR_PHY_RF_CTL4_FRAME_XPAB_ON), 0);
1047 1051
1048 REG_RMW_FIELD(ah, AR_PHY_RF_CTL3, AR_PHY_TX_END_TO_A2_RX_ON, 1052 REG_RMW_FIELD(ah, AR_PHY_RF_CTL3, AR_PHY_TX_END_TO_A2_RX_ON,
1049 pModal->txEndToRxOn); 1053 pModal->txEndToRxOn);
@@ -1072,6 +1076,8 @@ static void ath9k_hw_4k_set_board_values(struct ath_hw *ah,
1072 pModal->swSettleHt40); 1076 pModal->swSettleHt40);
1073 } 1077 }
1074 1078
1079 REG_RMW_BUFFER_FLUSH(ah);
1080
1075 bb_desired_scale = (pModal->bb_scale_smrt_antenna & 1081 bb_desired_scale = (pModal->bb_scale_smrt_antenna &
1076 EEP_4K_BB_DESIRED_SCALE_MASK); 1082 EEP_4K_BB_DESIRED_SCALE_MASK);
1077 if ((pBase->txGainType == 0) && (bb_desired_scale != 0)) { 1083 if ((pBase->txGainType == 0) && (bb_desired_scale != 0)) {
@@ -1080,6 +1086,7 @@ static void ath9k_hw_4k_set_board_values(struct ath_hw *ah,
1080 mask = BIT(0)|BIT(5)|BIT(10)|BIT(15)|BIT(20)|BIT(25); 1086 mask = BIT(0)|BIT(5)|BIT(10)|BIT(15)|BIT(20)|BIT(25);
1081 pwrctrl = mask * bb_desired_scale; 1087 pwrctrl = mask * bb_desired_scale;
1082 clr = mask * 0x1f; 1088 clr = mask * 0x1f;
1089 ENABLE_REG_RMW_BUFFER(ah);
1083 REG_RMW(ah, AR_PHY_TX_PWRCTRL8, pwrctrl, clr); 1090 REG_RMW(ah, AR_PHY_TX_PWRCTRL8, pwrctrl, clr);
1084 REG_RMW(ah, AR_PHY_TX_PWRCTRL10, pwrctrl, clr); 1091 REG_RMW(ah, AR_PHY_TX_PWRCTRL10, pwrctrl, clr);
1085 REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL12, pwrctrl, clr); 1092 REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL12, pwrctrl, clr);
@@ -1094,6 +1101,7 @@ static void ath9k_hw_4k_set_board_values(struct ath_hw *ah,
1094 clr = mask * 0x1f; 1101 clr = mask * 0x1f;
1095 REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL11, pwrctrl, clr); 1102 REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL11, pwrctrl, clr);
1096 REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL13, pwrctrl, clr); 1103 REG_RMW(ah, AR_PHY_CH0_TX_PWRCTRL13, pwrctrl, clr);
1104 REG_RMW_BUFFER_FLUSH(ah);
1097 } 1105 }
1098} 1106}
1099 1107
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_def.c b/drivers/net/wireless/ath/ath9k/eeprom_def.c
index 098059039351..056f516bf017 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
+++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
@@ -466,6 +466,7 @@ static void ath9k_hw_def_set_gain(struct ath_hw *ah,
466 struct ar5416_eeprom_def *eep, 466 struct ar5416_eeprom_def *eep,
467 u8 txRxAttenLocal, int regChainOffset, int i) 467 u8 txRxAttenLocal, int regChainOffset, int i)
468{ 468{
469 ENABLE_REG_RMW_BUFFER(ah);
469 if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_3) { 470 if (AR5416_VER_MASK >= AR5416_EEP_MINOR_VER_3) {
470 txRxAttenLocal = pModal->txRxAttenCh[i]; 471 txRxAttenLocal = pModal->txRxAttenCh[i];
471 472
@@ -483,16 +484,12 @@ static void ath9k_hw_def_set_gain(struct ath_hw *ah,
483 AR_PHY_GAIN_2GHZ_XATTEN2_DB, 484 AR_PHY_GAIN_2GHZ_XATTEN2_DB,
484 pModal->xatten2Db[i]); 485 pModal->xatten2Db[i]);
485 } else { 486 } else {
486 REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset, 487 REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
487 (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) & 488 SM(pModal-> bswMargin[i], AR_PHY_GAIN_2GHZ_BSW_MARGIN),
488 ~AR_PHY_GAIN_2GHZ_BSW_MARGIN) 489 AR_PHY_GAIN_2GHZ_BSW_MARGIN);
489 | SM(pModal-> bswMargin[i], 490 REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
490 AR_PHY_GAIN_2GHZ_BSW_MARGIN)); 491 SM(pModal->bswAtten[i], AR_PHY_GAIN_2GHZ_BSW_ATTEN),
491 REG_WRITE(ah, AR_PHY_GAIN_2GHZ + regChainOffset, 492 AR_PHY_GAIN_2GHZ_BSW_ATTEN);
492 (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
493 ~AR_PHY_GAIN_2GHZ_BSW_ATTEN)
494 | SM(pModal->bswAtten[i],
495 AR_PHY_GAIN_2GHZ_BSW_ATTEN));
496 } 493 }
497 } 494 }
498 495
@@ -504,17 +501,14 @@ static void ath9k_hw_def_set_gain(struct ath_hw *ah,
504 AR_PHY_RXGAIN + regChainOffset, 501 AR_PHY_RXGAIN + regChainOffset,
505 AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[i]); 502 AR9280_PHY_RXGAIN_TXRX_MARGIN, pModal->rxTxMarginCh[i]);
506 } else { 503 } else {
507 REG_WRITE(ah, 504 REG_RMW(ah, AR_PHY_RXGAIN + regChainOffset,
508 AR_PHY_RXGAIN + regChainOffset, 505 SM(txRxAttenLocal, AR_PHY_RXGAIN_TXRX_ATTEN),
509 (REG_READ(ah, AR_PHY_RXGAIN + regChainOffset) & 506 AR_PHY_RXGAIN_TXRX_ATTEN);
510 ~AR_PHY_RXGAIN_TXRX_ATTEN) 507 REG_RMW(ah, AR_PHY_GAIN_2GHZ + regChainOffset,
511 | SM(txRxAttenLocal, AR_PHY_RXGAIN_TXRX_ATTEN)); 508 SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN),
512 REG_WRITE(ah, 509 AR_PHY_GAIN_2GHZ_RXTX_MARGIN);
513 AR_PHY_GAIN_2GHZ + regChainOffset,
514 (REG_READ(ah, AR_PHY_GAIN_2GHZ + regChainOffset) &
515 ~AR_PHY_GAIN_2GHZ_RXTX_MARGIN) |
516 SM(pModal->rxTxMarginCh[i], AR_PHY_GAIN_2GHZ_RXTX_MARGIN));
517 } 510 }
511 REG_RMW_BUFFER_FLUSH(ah);
518} 512}
519 513
520static void ath9k_hw_def_set_board_values(struct ath_hw *ah, 514static void ath9k_hw_def_set_board_values(struct ath_hw *ah,
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c
index da344b27326c..284706798c71 100644
--- a/drivers/net/wireless/ath/ath9k/gpio.c
+++ b/drivers/net/wireless/ath/ath9k/gpio.c
@@ -69,9 +69,15 @@ void ath_fill_led_pin(struct ath_softc *sc)
69{ 69{
70 struct ath_hw *ah = sc->sc_ah; 70 struct ath_hw *ah = sc->sc_ah;
71 71
72 if (AR_SREV_9100(ah) || (ah->led_pin >= 0)) 72 if (AR_SREV_9100(ah))
73 return; 73 return;
74 74
75 if (ah->led_pin >= 0) {
76 if (!((1 << ah->led_pin) & AR_GPIO_OE_OUT_MASK))
77 ath9k_hw_request_gpio(ah, ah->led_pin, "ath9k-led");
78 return;
79 }
80
75 if (AR_SREV_9287(ah)) 81 if (AR_SREV_9287(ah))
76 ah->led_pin = ATH_LED_PIN_9287; 82 ah->led_pin = ATH_LED_PIN_9287;
77 else if (AR_SREV_9485(sc->sc_ah)) 83 else if (AR_SREV_9485(sc->sc_ah))
@@ -202,17 +208,16 @@ static void ath_btcoex_period_timer(unsigned long data)
202 } 208 }
203 spin_unlock_irqrestore(&sc->sc_pm_lock, flags); 209 spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
204 210
205 ath9k_mci_update_rssi(sc);
206
207 ath9k_ps_wakeup(sc); 211 ath9k_ps_wakeup(sc);
212 spin_lock_bh(&btcoex->btcoex_lock);
208 213
209 if (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI)) 214 if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI) {
210 ath_detect_bt_priority(sc); 215 ath9k_mci_update_rssi(sc);
211
212 if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI)
213 ath_mci_ftp_adjust(sc); 216 ath_mci_ftp_adjust(sc);
217 }
214 218
215 spin_lock_bh(&btcoex->btcoex_lock); 219 if (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI))
220 ath_detect_bt_priority(sc);
216 221
217 stomp_type = btcoex->bt_stomp_type; 222 stomp_type = btcoex->bt_stomp_type;
218 timer_period = btcoex->btcoex_no_stomp; 223 timer_period = btcoex->btcoex_no_stomp;
@@ -252,9 +257,6 @@ static void ath_btcoex_no_stomp_timer(unsigned long arg)
252 struct ath_softc *sc = (struct ath_softc *)arg; 257 struct ath_softc *sc = (struct ath_softc *)arg;
253 struct ath_hw *ah = sc->sc_ah; 258 struct ath_hw *ah = sc->sc_ah;
254 struct ath_btcoex *btcoex = &sc->btcoex; 259 struct ath_btcoex *btcoex = &sc->btcoex;
255 struct ath_common *common = ath9k_hw_common(ah);
256
257 ath_dbg(common, BTCOEX, "no stomp timer running\n");
258 260
259 ath9k_ps_wakeup(sc); 261 ath9k_ps_wakeup(sc);
260 spin_lock_bh(&btcoex->btcoex_lock); 262 spin_lock_bh(&btcoex->btcoex_lock);
@@ -271,7 +273,7 @@ static void ath_btcoex_no_stomp_timer(unsigned long arg)
271 ath9k_ps_restore(sc); 273 ath9k_ps_restore(sc);
272} 274}
273 275
274static int ath_init_btcoex_timer(struct ath_softc *sc) 276static void ath_init_btcoex_timer(struct ath_softc *sc)
275{ 277{
276 struct ath_btcoex *btcoex = &sc->btcoex; 278 struct ath_btcoex *btcoex = &sc->btcoex;
277 279
@@ -280,6 +282,7 @@ static int ath_init_btcoex_timer(struct ath_softc *sc)
280 btcoex->btcoex_period / 100; 282 btcoex->btcoex_period / 100;
281 btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * 283 btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) *
282 btcoex->btcoex_period / 100; 284 btcoex->btcoex_period / 100;
285 btcoex->bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
283 286
284 setup_timer(&btcoex->period_timer, ath_btcoex_period_timer, 287 setup_timer(&btcoex->period_timer, ath_btcoex_period_timer,
285 (unsigned long) sc); 288 (unsigned long) sc);
@@ -287,8 +290,6 @@ static int ath_init_btcoex_timer(struct ath_softc *sc)
287 (unsigned long) sc); 290 (unsigned long) sc);
288 291
289 spin_lock_init(&btcoex->btcoex_lock); 292 spin_lock_init(&btcoex->btcoex_lock);
290
291 return 0;
292} 293}
293 294
294/* 295/*
@@ -299,6 +300,10 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)
299 struct ath_btcoex *btcoex = &sc->btcoex; 300 struct ath_btcoex *btcoex = &sc->btcoex;
300 struct ath_hw *ah = sc->sc_ah; 301 struct ath_hw *ah = sc->sc_ah;
301 302
303 if (ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_3WIRE &&
304 ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_MCI)
305 return;
306
302 ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n"); 307 ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n");
303 308
304 /* make sure duty cycle timer is also stopped when resuming */ 309 /* make sure duty cycle timer is also stopped when resuming */
@@ -312,13 +317,19 @@ void ath9k_btcoex_timer_resume(struct ath_softc *sc)
312 mod_timer(&btcoex->period_timer, jiffies); 317 mod_timer(&btcoex->period_timer, jiffies);
313} 318}
314 319
315
316/* 320/*
317 * Pause btcoex timer and bt duty cycle timer 321 * Pause btcoex timer and bt duty cycle timer
318 */ 322 */
319void ath9k_btcoex_timer_pause(struct ath_softc *sc) 323void ath9k_btcoex_timer_pause(struct ath_softc *sc)
320{ 324{
321 struct ath_btcoex *btcoex = &sc->btcoex; 325 struct ath_btcoex *btcoex = &sc->btcoex;
326 struct ath_hw *ah = sc->sc_ah;
327
328 if (ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_3WIRE &&
329 ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_MCI)
330 return;
331
332 ath_dbg(ath9k_hw_common(ah), BTCOEX, "Stopping btcoex timers\n");
322 333
323 del_timer_sync(&btcoex->period_timer); 334 del_timer_sync(&btcoex->period_timer);
324 del_timer_sync(&btcoex->no_stomp_timer); 335 del_timer_sync(&btcoex->no_stomp_timer);
@@ -356,33 +367,33 @@ void ath9k_start_btcoex(struct ath_softc *sc)
356{ 367{
357 struct ath_hw *ah = sc->sc_ah; 368 struct ath_hw *ah = sc->sc_ah;
358 369
359 if ((ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) && 370 if (ah->btcoex_hw.enabled ||
360 !ah->btcoex_hw.enabled) { 371 ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
361 if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_MCI)) 372 return;
362 ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
363 AR_STOMP_LOW_WLAN_WGHT, 0);
364 else
365 ath9k_hw_btcoex_set_weight(ah, 0, 0,
366 ATH_BTCOEX_STOMP_NONE);
367 ath9k_hw_btcoex_enable(ah);
368 373
369 if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE) 374 if (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI))
370 ath9k_btcoex_timer_resume(sc); 375 ath9k_hw_btcoex_set_weight(ah, AR_BT_COEX_WGHT,
371 } 376 AR_STOMP_LOW_WLAN_WGHT, 0);
377 else
378 ath9k_hw_btcoex_set_weight(ah, 0, 0,
379 ATH_BTCOEX_STOMP_NONE);
380 ath9k_hw_btcoex_enable(ah);
381 ath9k_btcoex_timer_resume(sc);
372} 382}
373 383
374void ath9k_stop_btcoex(struct ath_softc *sc) 384void ath9k_stop_btcoex(struct ath_softc *sc)
375{ 385{
376 struct ath_hw *ah = sc->sc_ah; 386 struct ath_hw *ah = sc->sc_ah;
377 387
378 if (ah->btcoex_hw.enabled && 388 if (!ah->btcoex_hw.enabled ||
379 ath9k_hw_get_btcoex_scheme(ah) != ATH_BTCOEX_CFG_NONE) { 389 ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_NONE)
380 if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE) 390 return;
381 ath9k_btcoex_timer_pause(sc); 391
382 ath9k_hw_btcoex_disable(ah); 392 ath9k_btcoex_timer_pause(sc);
383 if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) 393 ath9k_hw_btcoex_disable(ah);
384 ath_mci_flush_profile(&sc->btcoex.mci); 394
385 } 395 if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI)
396 ath_mci_flush_profile(&sc->btcoex.mci);
386} 397}
387 398
388void ath9k_deinit_btcoex(struct ath_softc *sc) 399void ath9k_deinit_btcoex(struct ath_softc *sc)
@@ -409,22 +420,20 @@ int ath9k_init_btcoex(struct ath_softc *sc)
409 break; 420 break;
410 case ATH_BTCOEX_CFG_3WIRE: 421 case ATH_BTCOEX_CFG_3WIRE:
411 ath9k_hw_btcoex_init_3wire(sc->sc_ah); 422 ath9k_hw_btcoex_init_3wire(sc->sc_ah);
412 r = ath_init_btcoex_timer(sc); 423 ath_init_btcoex_timer(sc);
413 if (r)
414 return -1;
415 txq = sc->tx.txq_map[IEEE80211_AC_BE]; 424 txq = sc->tx.txq_map[IEEE80211_AC_BE];
416 ath9k_hw_init_btcoex_hw(sc->sc_ah, txq->axq_qnum); 425 ath9k_hw_init_btcoex_hw(sc->sc_ah, txq->axq_qnum);
417 sc->btcoex.bt_stomp_type = ATH_BTCOEX_STOMP_LOW; 426 break;
418 if (ath9k_hw_mci_is_enabled(ah)) { 427 case ATH_BTCOEX_CFG_MCI:
419 sc->btcoex.duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE; 428 ath_init_btcoex_timer(sc);
420 INIT_LIST_HEAD(&sc->btcoex.mci.info);
421 429
422 r = ath_mci_setup(sc); 430 sc->btcoex.duty_cycle = ATH_BTCOEX_DEF_DUTY_CYCLE;
423 if (r) 431 INIT_LIST_HEAD(&sc->btcoex.mci.info);
424 return r; 432 ath9k_hw_btcoex_init_mci(ah);
425 433
426 ath9k_hw_btcoex_init_mci(ah); 434 r = ath_mci_setup(sc);
427 } 435 if (r)
436 return r;
428 437
429 break; 438 break;
430 default: 439 default:
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c
index 8e7153b186ed..10c02f5cbc5e 100644
--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
+++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
@@ -40,6 +40,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = {
40 { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */ 40 { USB_DEVICE(0x0cf3, 0xb003) }, /* Ubiquiti WifiStation Ext */
41 { USB_DEVICE(0x0cf3, 0xb002) }, /* Ubiquiti WifiStation */ 41 { USB_DEVICE(0x0cf3, 0xb002) }, /* Ubiquiti WifiStation */
42 { USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */ 42 { USB_DEVICE(0x057c, 0x8403) }, /* AVM FRITZ!WLAN 11N v2 USB */
43 { USB_DEVICE(0x0471, 0x209e) }, /* Philips (or NXP) PTA01 */
43 44
44 { USB_DEVICE(0x0cf3, 0x7015), 45 { USB_DEVICE(0x0cf3, 0x7015),
45 .driver_info = AR9287_USB }, /* Atheros */ 46 .driver_info = AR9287_USB }, /* Atheros */
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h
index 300d3671d0ef..e82a0d4ce23f 100644
--- a/drivers/net/wireless/ath/ath9k/htc.h
+++ b/drivers/net/wireless/ath/ath9k/htc.h
@@ -444,6 +444,10 @@ static inline void ath9k_htc_stop_btcoex(struct ath9k_htc_priv *priv)
444#define OP_BT_SCAN BIT(4) 444#define OP_BT_SCAN BIT(4)
445#define OP_TSF_RESET BIT(6) 445#define OP_TSF_RESET BIT(6)
446 446
447enum htc_op_flags {
448 HTC_FWFLAG_NO_RMW,
449};
450
447struct ath9k_htc_priv { 451struct ath9k_htc_priv {
448 struct device *dev; 452 struct device *dev;
449 struct ieee80211_hw *hw; 453 struct ieee80211_hw *hw;
@@ -482,6 +486,7 @@ struct ath9k_htc_priv {
482 bool reconfig_beacon; 486 bool reconfig_beacon;
483 unsigned int rxfilter; 487 unsigned int rxfilter;
484 unsigned long op_flags; 488 unsigned long op_flags;
489 unsigned long fw_flags;
485 490
486 struct ath9k_hw_cal_data caldata; 491 struct ath9k_hw_cal_data caldata;
487 struct ath_spec_scan_priv spec_priv; 492 struct ath_spec_scan_priv spec_priv;
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
index fd229409f676..d7beefe60683 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c
@@ -376,17 +376,139 @@ static void ath9k_regwrite_flush(void *hw_priv)
376 mutex_unlock(&priv->wmi->multi_write_mutex); 376 mutex_unlock(&priv->wmi->multi_write_mutex);
377} 377}
378 378
379static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr) 379static void ath9k_reg_rmw_buffer(void *hw_priv,
380 u32 reg_offset, u32 set, u32 clr)
381{
382 struct ath_hw *ah = (struct ath_hw *) hw_priv;
383 struct ath_common *common = ath9k_hw_common(ah);
384 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
385 u32 rsp_status;
386 int r;
387
388 mutex_lock(&priv->wmi->multi_rmw_mutex);
389
390 /* Store the register/value */
391 priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].reg =
392 cpu_to_be32(reg_offset);
393 priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].set =
394 cpu_to_be32(set);
395 priv->wmi->multi_rmw[priv->wmi->multi_rmw_idx].clr =
396 cpu_to_be32(clr);
397
398 priv->wmi->multi_rmw_idx++;
399
400 /* If the buffer is full, send it out. */
401 if (priv->wmi->multi_rmw_idx == MAX_RMW_CMD_NUMBER) {
402 r = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
403 (u8 *) &priv->wmi->multi_rmw,
404 sizeof(struct register_write) * priv->wmi->multi_rmw_idx,
405 (u8 *) &rsp_status, sizeof(rsp_status),
406 100);
407 if (unlikely(r)) {
408 ath_dbg(common, WMI,
409 "REGISTER RMW FAILED, multi len: %d\n",
410 priv->wmi->multi_rmw_idx);
411 }
412 priv->wmi->multi_rmw_idx = 0;
413 }
414
415 mutex_unlock(&priv->wmi->multi_rmw_mutex);
416}
417
418static void ath9k_reg_rmw_flush(void *hw_priv)
380{ 419{
381 u32 val; 420 struct ath_hw *ah = (struct ath_hw *) hw_priv;
421 struct ath_common *common = ath9k_hw_common(ah);
422 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
423 u32 rsp_status;
424 int r;
425
426 if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags))
427 return;
428
429 atomic_dec(&priv->wmi->m_rmw_cnt);
382 430
383 val = ath9k_regread(hw_priv, reg_offset); 431 mutex_lock(&priv->wmi->multi_rmw_mutex);
384 val &= ~clr; 432
385 val |= set; 433 if (priv->wmi->multi_rmw_idx) {
386 ath9k_regwrite(hw_priv, val, reg_offset); 434 r = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
435 (u8 *) &priv->wmi->multi_rmw,
436 sizeof(struct register_rmw) * priv->wmi->multi_rmw_idx,
437 (u8 *) &rsp_status, sizeof(rsp_status),
438 100);
439 if (unlikely(r)) {
440 ath_dbg(common, WMI,
441 "REGISTER RMW FAILED, multi len: %d\n",
442 priv->wmi->multi_rmw_idx);
443 }
444 priv->wmi->multi_rmw_idx = 0;
445 }
446
447 mutex_unlock(&priv->wmi->multi_rmw_mutex);
448}
449
450static void ath9k_enable_rmw_buffer(void *hw_priv)
451{
452 struct ath_hw *ah = (struct ath_hw *) hw_priv;
453 struct ath_common *common = ath9k_hw_common(ah);
454 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
455
456 if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags))
457 return;
458
459 atomic_inc(&priv->wmi->m_rmw_cnt);
460}
461
462static u32 ath9k_reg_rmw_single(void *hw_priv,
463 u32 reg_offset, u32 set, u32 clr)
464{
465 struct ath_hw *ah = (struct ath_hw *) hw_priv;
466 struct ath_common *common = ath9k_hw_common(ah);
467 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
468 struct register_rmw buf, buf_ret;
469 int ret;
470 u32 val = 0;
471
472 buf.reg = cpu_to_be32(reg_offset);
473 buf.set = cpu_to_be32(set);
474 buf.clr = cpu_to_be32(clr);
475
476 ret = ath9k_wmi_cmd(priv->wmi, WMI_REG_RMW_CMDID,
477 (u8 *) &buf, sizeof(buf),
478 (u8 *) &buf_ret, sizeof(buf_ret),
479 100);
480 if (unlikely(ret)) {
481 ath_dbg(common, WMI, "REGISTER RMW FAILED:(0x%04x, %d)\n",
482 reg_offset, ret);
483 }
387 return val; 484 return val;
388} 485}
389 486
487static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
488{
489 struct ath_hw *ah = (struct ath_hw *) hw_priv;
490 struct ath_common *common = ath9k_hw_common(ah);
491 struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
492
493 if (test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags)) {
494 u32 val;
495
496 val = REG_READ(ah, reg_offset);
497 val &= ~clr;
498 val |= set;
499 REG_WRITE(ah, reg_offset, val);
500
501 return 0;
502 }
503
504 if (atomic_read(&priv->wmi->m_rmw_cnt))
505 ath9k_reg_rmw_buffer(hw_priv, reg_offset, set, clr);
506 else
507 ath9k_reg_rmw_single(hw_priv, reg_offset, set, clr);
508
509 return 0;
510}
511
390static void ath_usb_read_cachesize(struct ath_common *common, int *csz) 512static void ath_usb_read_cachesize(struct ath_common *common, int *csz)
391{ 513{
392 *csz = L1_CACHE_BYTES >> 2; 514 *csz = L1_CACHE_BYTES >> 2;
@@ -501,6 +623,8 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
501 ah->reg_ops.write = ath9k_regwrite; 623 ah->reg_ops.write = ath9k_regwrite;
502 ah->reg_ops.enable_write_buffer = ath9k_enable_regwrite_buffer; 624 ah->reg_ops.enable_write_buffer = ath9k_enable_regwrite_buffer;
503 ah->reg_ops.write_flush = ath9k_regwrite_flush; 625 ah->reg_ops.write_flush = ath9k_regwrite_flush;
626 ah->reg_ops.enable_rmw_buffer = ath9k_enable_rmw_buffer;
627 ah->reg_ops.rmw_flush = ath9k_reg_rmw_flush;
504 ah->reg_ops.rmw = ath9k_reg_rmw; 628 ah->reg_ops.rmw = ath9k_reg_rmw;
505 priv->ah = ah; 629 priv->ah = ah;
506 630
@@ -686,6 +810,12 @@ static int ath9k_init_firmware_version(struct ath9k_htc_priv *priv)
686 return -EINVAL; 810 return -EINVAL;
687 } 811 }
688 812
813 if (priv->fw_version_major == 1 && priv->fw_version_minor < 4)
814 set_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags);
815
816 dev_info(priv->dev, "FW RMW support: %s\n",
817 test_bit(HTC_FWFLAG_NO_RMW, &priv->fw_flags) ? "Off" : "On");
818
689 return 0; 819 return 0;
690} 820}
691 821
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
index 92d5a6c5a225..564923c0df87 100644
--- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c
+++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c
@@ -149,7 +149,7 @@ static void ath9k_htc_set_mac_bssid_mask(struct ath9k_htc_priv *priv,
149 * when matching addresses. 149 * when matching addresses.
150 */ 150 */
151 iter_data.hw_macaddr = NULL; 151 iter_data.hw_macaddr = NULL;
152 memset(&iter_data.mask, 0xff, ETH_ALEN); 152 eth_broadcast_addr(iter_data.mask);
153 153
154 if (vif) 154 if (vif)
155 ath9k_htc_bssid_iter(&iter_data, vif->addr, vif); 155 ath9k_htc_bssid_iter(&iter_data, vif->addr, vif);
diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h
index 88769b64b20b..232339b05540 100644
--- a/drivers/net/wireless/ath/ath9k/hw-ops.h
+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
@@ -108,6 +108,14 @@ static inline void ath9k_hw_set_bt_ant_diversity(struct ath_hw *ah, bool enable)
108 ath9k_hw_ops(ah)->set_bt_ant_diversity(ah, enable); 108 ath9k_hw_ops(ah)->set_bt_ant_diversity(ah, enable);
109} 109}
110 110
111static inline bool ath9k_hw_is_aic_enabled(struct ath_hw *ah)
112{
113 if (ath9k_hw_private_ops(ah)->is_aic_enabled)
114 return ath9k_hw_private_ops(ah)->is_aic_enabled(ah);
115
116 return false;
117}
118
111#endif 119#endif
112 120
113/* Private hardware call ops */ 121/* Private hardware call ops */
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 8529014e1a5e..5e15e8e10ed3 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -20,6 +20,7 @@
20#include <linux/time.h> 20#include <linux/time.h>
21#include <linux/bitops.h> 21#include <linux/bitops.h>
22#include <linux/etherdevice.h> 22#include <linux/etherdevice.h>
23#include <linux/gpio.h>
23#include <asm/unaligned.h> 24#include <asm/unaligned.h>
24 25
25#include "hw.h" 26#include "hw.h"
@@ -121,6 +122,36 @@ void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
121 REGWRITE_BUFFER_FLUSH(ah); 122 REGWRITE_BUFFER_FLUSH(ah);
122} 123}
123 124
125void ath9k_hw_read_array(struct ath_hw *ah, u32 array[][2], int size)
126{
127 u32 *tmp_reg_list, *tmp_data;
128 int i;
129
130 tmp_reg_list = kmalloc(size * sizeof(u32), GFP_KERNEL);
131 if (!tmp_reg_list) {
132 dev_err(ah->dev, "%s: tmp_reg_list: alloc filed\n", __func__);
133 return;
134 }
135
136 tmp_data = kmalloc(size * sizeof(u32), GFP_KERNEL);
137 if (!tmp_data) {
138 dev_err(ah->dev, "%s tmp_data: alloc filed\n", __func__);
139 goto error_tmp_data;
140 }
141
142 for (i = 0; i < size; i++)
143 tmp_reg_list[i] = array[i][0];
144
145 REG_READ_MULTI(ah, tmp_reg_list, tmp_data, size);
146
147 for (i = 0; i < size; i++)
148 array[i][1] = tmp_data[i];
149
150 kfree(tmp_data);
151error_tmp_data:
152 kfree(tmp_reg_list);
153}
154
124u32 ath9k_hw_reverse_bits(u32 val, u32 n) 155u32 ath9k_hw_reverse_bits(u32 val, u32 n)
125{ 156{
126 u32 retval; 157 u32 retval;
@@ -366,6 +397,9 @@ static void ath9k_hw_init_config(struct ath_hw *ah)
366 ah->config.rimt_first = 700; 397 ah->config.rimt_first = 700;
367 } 398 }
368 399
400 if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
401 ah->config.pll_pwrsave = 7;
402
369 /* 403 /*
370 * We need this for PCI devices only (Cardbus, PCI, miniPCI) 404 * We need this for PCI devices only (Cardbus, PCI, miniPCI)
371 * _and_ if on non-uniprocessor systems (Multiprocessor/HT). 405 * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
@@ -1197,6 +1231,7 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
1197 u32 mask = AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC; 1231 u32 mask = AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC;
1198 u32 set = AR_STA_ID1_KSRCH_MODE; 1232 u32 set = AR_STA_ID1_KSRCH_MODE;
1199 1233
1234 ENABLE_REG_RMW_BUFFER(ah);
1200 switch (opmode) { 1235 switch (opmode) {
1201 case NL80211_IFTYPE_ADHOC: 1236 case NL80211_IFTYPE_ADHOC:
1202 if (!AR_SREV_9340_13(ah)) { 1237 if (!AR_SREV_9340_13(ah)) {
@@ -1218,6 +1253,7 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
1218 break; 1253 break;
1219 } 1254 }
1220 REG_RMW(ah, AR_STA_ID1, set, mask); 1255 REG_RMW(ah, AR_STA_ID1, set, mask);
1256 REG_RMW_BUFFER_FLUSH(ah);
1221} 1257}
1222 1258
1223void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled, 1259void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
@@ -1930,6 +1966,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1930 if (!ath9k_hw_mci_is_enabled(ah)) 1966 if (!ath9k_hw_mci_is_enabled(ah))
1931 REG_WRITE(ah, AR_OBS, 8); 1967 REG_WRITE(ah, AR_OBS, 8);
1932 1968
1969 ENABLE_REG_RMW_BUFFER(ah);
1933 if (ah->config.rx_intr_mitigation) { 1970 if (ah->config.rx_intr_mitigation) {
1934 REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, ah->config.rimt_last); 1971 REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, ah->config.rimt_last);
1935 REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, ah->config.rimt_first); 1972 REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, ah->config.rimt_first);
@@ -1939,6 +1976,7 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1939 REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300); 1976 REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300);
1940 REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750); 1977 REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750);
1941 } 1978 }
1979 REG_RMW_BUFFER_FLUSH(ah);
1942 1980
1943 ath9k_hw_init_bb(ah, chan); 1981 ath9k_hw_init_bb(ah, chan);
1944 1982
@@ -2674,11 +2712,23 @@ void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)
2674 if (AR_SREV_9271(ah)) 2712 if (AR_SREV_9271(ah))
2675 val = ~val; 2713 val = ~val;
2676 2714
2677 REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio), 2715 if ((1 << gpio) & AR_GPIO_OE_OUT_MASK)
2678 AR_GPIO_BIT(gpio)); 2716 REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio),
2717 AR_GPIO_BIT(gpio));
2718 else
2719 gpio_set_value(gpio, val & 1);
2679} 2720}
2680EXPORT_SYMBOL(ath9k_hw_set_gpio); 2721EXPORT_SYMBOL(ath9k_hw_set_gpio);
2681 2722
2723void ath9k_hw_request_gpio(struct ath_hw *ah, u32 gpio, const char *label)
2724{
2725 if (gpio >= ah->caps.num_gpio_pins)
2726 return;
2727
2728 gpio_request_one(gpio, GPIOF_DIR_OUT | GPIOF_INIT_LOW, label);
2729}
2730EXPORT_SYMBOL(ath9k_hw_request_gpio);
2731
2682void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna) 2732void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna)
2683{ 2733{
2684 REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7)); 2734 REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7));
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index e82e570de330..c1d2d0340feb 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -27,6 +27,7 @@
27#include "eeprom.h" 27#include "eeprom.h"
28#include "calib.h" 28#include "calib.h"
29#include "reg.h" 29#include "reg.h"
30#include "reg_mci.h"
30#include "phy.h" 31#include "phy.h"
31#include "btcoex.h" 32#include "btcoex.h"
32#include "dynack.h" 33#include "dynack.h"
@@ -99,6 +100,18 @@
99 (_ah)->reg_ops.write_flush((_ah)); \ 100 (_ah)->reg_ops.write_flush((_ah)); \
100 } while (0) 101 } while (0)
101 102
103#define ENABLE_REG_RMW_BUFFER(_ah) \
104 do { \
105 if ((_ah)->reg_ops.enable_rmw_buffer) \
106 (_ah)->reg_ops.enable_rmw_buffer((_ah)); \
107 } while (0)
108
109#define REG_RMW_BUFFER_FLUSH(_ah) \
110 do { \
111 if ((_ah)->reg_ops.rmw_flush) \
112 (_ah)->reg_ops.rmw_flush((_ah)); \
113 } while (0)
114
102#define PR_EEP(_s, _val) \ 115#define PR_EEP(_s, _val) \
103 do { \ 116 do { \
104 len += scnprintf(buf + len, size - len, "%20s : %10d\n",\ 117 len += scnprintf(buf + len, size - len, "%20s : %10d\n",\
@@ -125,6 +138,8 @@
125 138
126#define REG_WRITE_ARRAY(iniarray, column, regWr) \ 139#define REG_WRITE_ARRAY(iniarray, column, regWr) \
127 ath9k_hw_write_array(ah, iniarray, column, &(regWr)) 140 ath9k_hw_write_array(ah, iniarray, column, &(regWr))
141#define REG_READ_ARRAY(ah, array, size) \
142 ath9k_hw_read_array(ah, array, size)
128 143
129#define AR_GPIO_OUTPUT_MUX_AS_OUTPUT 0 144#define AR_GPIO_OUTPUT_MUX_AS_OUTPUT 0
130#define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1 145#define AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED 1
@@ -308,6 +323,12 @@ enum ath9k_hw_hang_checks {
308 HW_MAC_HANG = BIT(5), 323 HW_MAC_HANG = BIT(5),
309}; 324};
310 325
326#define AR_PCIE_PLL_PWRSAVE_CONTROL BIT(0)
327#define AR_PCIE_PLL_PWRSAVE_ON_D3 BIT(1)
328#define AR_PCIE_PLL_PWRSAVE_ON_D0 BIT(2)
329#define AR_PCIE_CDR_PWRSAVE_ON_D3 BIT(3)
330#define AR_PCIE_CDR_PWRSAVE_ON_D0 BIT(4)
331
311struct ath9k_ops_config { 332struct ath9k_ops_config {
312 int dma_beacon_response_time; 333 int dma_beacon_response_time;
313 int sw_beacon_response_time; 334 int sw_beacon_response_time;
@@ -334,7 +355,7 @@ struct ath9k_ops_config {
334 u32 ant_ctrl_comm2g_switch_enable; 355 u32 ant_ctrl_comm2g_switch_enable;
335 bool xatten_margin_cfg; 356 bool xatten_margin_cfg;
336 bool alt_mingainidx; 357 bool alt_mingainidx;
337 bool no_pll_pwrsave; 358 u8 pll_pwrsave;
338 bool tx_gain_buffalo; 359 bool tx_gain_buffalo;
339 bool led_active_high; 360 bool led_active_high;
340}; 361};
@@ -646,6 +667,10 @@ struct ath_hw_private_ops {
646 667
647 /* ANI */ 668 /* ANI */
648 void (*ani_cache_ini_regs)(struct ath_hw *ah); 669 void (*ani_cache_ini_regs)(struct ath_hw *ah);
670
671#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
672 bool (*is_aic_enabled)(struct ath_hw *ah);
673#endif /* CONFIG_ATH9K_BTCOEX_SUPPORT */
649}; 674};
650 675
651/** 676/**
@@ -999,6 +1024,7 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio);
999void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio, 1024void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
1000 u32 ah_signal_type); 1025 u32 ah_signal_type);
1001void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val); 1026void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val);
1027void ath9k_hw_request_gpio(struct ath_hw *ah, u32 gpio, const char *label);
1002void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna); 1028void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna);
1003 1029
1004/* General Operation */ 1030/* General Operation */
@@ -1007,6 +1033,7 @@ void ath9k_hw_synth_delay(struct ath_hw *ah, struct ath9k_channel *chan,
1007bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout); 1033bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout);
1008void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array, 1034void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
1009 int column, unsigned int *writecnt); 1035 int column, unsigned int *writecnt);
1036void ath9k_hw_read_array(struct ath_hw *ah, u32 array[][2], int size);
1010u32 ath9k_hw_reverse_bits(u32 val, u32 n); 1037u32 ath9k_hw_reverse_bits(u32 val, u32 n);
1011u16 ath9k_hw_computetxtime(struct ath_hw *ah, 1038u16 ath9k_hw_computetxtime(struct ath_hw *ah,
1012 u8 phy, int kbps, 1039 u8 phy, int kbps,
@@ -1116,6 +1143,7 @@ void ath9k_hw_set_cts_timeout(struct ath_hw *ah, u32 us);
1116void ath9k_hw_setslottime(struct ath_hw *ah, u32 us); 1143void ath9k_hw_setslottime(struct ath_hw *ah, u32 us);
1117 1144
1118#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT 1145#ifdef CONFIG_ATH9K_BTCOEX_SUPPORT
1146void ar9003_hw_attach_aic_ops(struct ath_hw *ah);
1119static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah) 1147static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah)
1120{ 1148{
1121 return ah->btcoex_hw.enabled; 1149 return ah->btcoex_hw.enabled;
@@ -1133,6 +1161,9 @@ ath9k_hw_get_btcoex_scheme(struct ath_hw *ah)
1133 return ah->btcoex_hw.scheme; 1161 return ah->btcoex_hw.scheme;
1134} 1162}
1135#else 1163#else
1164static inline void ar9003_hw_attach_aic_ops(struct ath_hw *ah)
1165{
1166}
1136static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah) 1167static inline bool ath9k_hw_btcoex_is_enabled(struct ath_hw *ah)
1137{ 1168{
1138 return false; 1169 return false;
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c
index 6c6e88495394..f8d11efa7b0f 100644
--- a/drivers/net/wireless/ath/ath9k/init.c
+++ b/drivers/net/wireless/ath/ath9k/init.c
@@ -141,6 +141,16 @@ static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
141 return val; 141 return val;
142} 142}
143 143
144static void ath9k_multi_ioread32(void *hw_priv, u32 *addr,
145 u32 *val, u16 count)
146{
147 int i;
148
149 for (i = 0; i < count; i++)
150 val[i] = ath9k_ioread32(hw_priv, addr[i]);
151}
152
153
144static unsigned int __ath9k_reg_rmw(struct ath_softc *sc, u32 reg_offset, 154static unsigned int __ath9k_reg_rmw(struct ath_softc *sc, u32 reg_offset,
145 u32 set, u32 clr) 155 u32 set, u32 clr)
146{ 156{
@@ -437,8 +447,15 @@ static void ath9k_init_pcoem_platform(struct ath_softc *sc)
437 ath_info(common, "Enable WAR for ASPM D3/L1\n"); 447 ath_info(common, "Enable WAR for ASPM D3/L1\n");
438 } 448 }
439 449
450 /*
451 * The default value of pll_pwrsave is 1.
452 * For certain AR9485 cards, it is set to 0.
453 * For AR9462, AR9565 it's set to 7.
454 */
455 ah->config.pll_pwrsave = 1;
456
440 if (sc->driver_data & ATH9K_PCI_NO_PLL_PWRSAVE) { 457 if (sc->driver_data & ATH9K_PCI_NO_PLL_PWRSAVE) {
441 ah->config.no_pll_pwrsave = true; 458 ah->config.pll_pwrsave = 0;
442 ath_info(common, "Disable PLL PowerSave\n"); 459 ath_info(common, "Disable PLL PowerSave\n");
443 } 460 }
444 461
@@ -530,6 +547,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
530 ah->hw = sc->hw; 547 ah->hw = sc->hw;
531 ah->hw_version.devid = devid; 548 ah->hw_version.devid = devid;
532 ah->reg_ops.read = ath9k_ioread32; 549 ah->reg_ops.read = ath9k_ioread32;
550 ah->reg_ops.multi_read = ath9k_multi_ioread32;
533 ah->reg_ops.write = ath9k_iowrite32; 551 ah->reg_ops.write = ath9k_iowrite32;
534 ah->reg_ops.rmw = ath9k_reg_rmw; 552 ah->reg_ops.rmw = ath9k_reg_rmw;
535 pCap = &ah->caps; 553 pCap = &ah->caps;
@@ -763,7 +781,8 @@ static const struct ieee80211_iface_combination if_comb[] = {
763 .num_different_channels = 1, 781 .num_different_channels = 1,
764 .beacon_int_infra_match = true, 782 .beacon_int_infra_match = true,
765 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) | 783 .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
766 BIT(NL80211_CHAN_WIDTH_20), 784 BIT(NL80211_CHAN_WIDTH_20) |
785 BIT(NL80211_CHAN_WIDTH_40),
767 } 786 }
768#endif 787#endif
769}; 788};
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index 9ede991b8d76..b0badef71ce7 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -994,7 +994,7 @@ void ath9k_calculate_iter_data(struct ath_softc *sc,
994 * BSSID mask when matching addresses. 994 * BSSID mask when matching addresses.
995 */ 995 */
996 memset(iter_data, 0, sizeof(*iter_data)); 996 memset(iter_data, 0, sizeof(*iter_data));
997 memset(&iter_data->mask, 0xff, ETH_ALEN); 997 eth_broadcast_addr(iter_data->mask);
998 iter_data->slottime = ATH9K_SLOT_TIME_9; 998 iter_data->slottime = ATH9K_SLOT_TIME_9;
999 999
1000 list_for_each_entry(avp, &ctx->vifs, list) 1000 list_for_each_entry(avp, &ctx->vifs, list)
@@ -1139,7 +1139,7 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
1139 ctx->primary_sta = iter_data.primary_sta; 1139 ctx->primary_sta = iter_data.primary_sta;
1140 } else { 1140 } else {
1141 ctx->primary_sta = NULL; 1141 ctx->primary_sta = NULL;
1142 memset(common->curbssid, 0, ETH_ALEN); 1142 eth_zero_addr(common->curbssid);
1143 common->curaid = 0; 1143 common->curaid = 0;
1144 ath9k_hw_write_associd(sc->sc_ah); 1144 ath9k_hw_write_associd(sc->sc_ah);
1145 if (ath9k_hw_mci_is_enabled(sc->sc_ah)) 1145 if (ath9k_hw_mci_is_enabled(sc->sc_ah))
@@ -1172,6 +1172,38 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
1172 ath9k_ps_restore(sc); 1172 ath9k_ps_restore(sc);
1173} 1173}
1174 1174
1175static void ath9k_tpc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
1176{
1177 int *power = (int *)data;
1178
1179 if (*power < vif->bss_conf.txpower)
1180 *power = vif->bss_conf.txpower;
1181}
1182
1183/* Called with sc->mutex held. */
1184void ath9k_set_txpower(struct ath_softc *sc, struct ieee80211_vif *vif)
1185{
1186 int power;
1187 struct ath_hw *ah = sc->sc_ah;
1188 struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
1189
1190 ath9k_ps_wakeup(sc);
1191 if (ah->tpc_enabled) {
1192 power = (vif) ? vif->bss_conf.txpower : -1;
1193 ieee80211_iterate_active_interfaces_atomic(
1194 sc->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
1195 ath9k_tpc_vif_iter, &power);
1196 if (power == -1)
1197 power = sc->hw->conf.power_level;
1198 } else {
1199 power = sc->hw->conf.power_level;
1200 }
1201 sc->cur_chan->txpower = 2 * power;
1202 ath9k_hw_set_txpowerlimit(ah, sc->cur_chan->txpower, false);
1203 sc->cur_chan->cur_txpower = reg->max_power_level;
1204 ath9k_ps_restore(sc);
1205}
1206
1175static void ath9k_assign_hw_queues(struct ieee80211_hw *hw, 1207static void ath9k_assign_hw_queues(struct ieee80211_hw *hw,
1176 struct ieee80211_vif *vif) 1208 struct ieee80211_vif *vif)
1177{ 1209{
@@ -1225,6 +1257,8 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
1225 1257
1226 ath9k_assign_hw_queues(hw, vif); 1258 ath9k_assign_hw_queues(hw, vif);
1227 1259
1260 ath9k_set_txpower(sc, vif);
1261
1228 an->sc = sc; 1262 an->sc = sc;
1229 an->sta = NULL; 1263 an->sta = NULL;
1230 an->vif = vif; 1264 an->vif = vif;
@@ -1265,6 +1299,8 @@ static int ath9k_change_interface(struct ieee80211_hw *hw,
1265 ath9k_assign_hw_queues(hw, vif); 1299 ath9k_assign_hw_queues(hw, vif);
1266 ath9k_calculate_summary_state(sc, avp->chanctx); 1300 ath9k_calculate_summary_state(sc, avp->chanctx);
1267 1301
1302 ath9k_set_txpower(sc, vif);
1303
1268 mutex_unlock(&sc->mutex); 1304 mutex_unlock(&sc->mutex);
1269 return 0; 1305 return 0;
1270} 1306}
@@ -1294,6 +1330,8 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
1294 1330
1295 ath9k_calculate_summary_state(sc, avp->chanctx); 1331 ath9k_calculate_summary_state(sc, avp->chanctx);
1296 1332
1333 ath9k_set_txpower(sc, NULL);
1334
1297 mutex_unlock(&sc->mutex); 1335 mutex_unlock(&sc->mutex);
1298} 1336}
1299 1337
@@ -1397,14 +1435,6 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
1397 ath_chanctx_set_channel(sc, ctx, &hw->conf.chandef); 1435 ath_chanctx_set_channel(sc, ctx, &hw->conf.chandef);
1398 } 1436 }
1399 1437
1400 if (changed & IEEE80211_CONF_CHANGE_POWER) {
1401 ath_dbg(common, CONFIG, "Set power: %d\n", conf->power_level);
1402 sc->cur_chan->txpower = 2 * conf->power_level;
1403 ath9k_cmn_update_txpow(ah, sc->cur_chan->cur_txpower,
1404 sc->cur_chan->txpower,
1405 &sc->cur_chan->cur_txpower);
1406 }
1407
1408 mutex_unlock(&sc->mutex); 1438 mutex_unlock(&sc->mutex);
1409 ath9k_ps_restore(sc); 1439 ath9k_ps_restore(sc);
1410 1440
@@ -1764,6 +1794,12 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
1764 if (changed & CHECK_ANI) 1794 if (changed & CHECK_ANI)
1765 ath_check_ani(sc); 1795 ath_check_ani(sc);
1766 1796
1797 if (changed & BSS_CHANGED_TXPOWER) {
1798 ath_dbg(common, CONFIG, "vif %pM power %d dbm power_type %d\n",
1799 vif->addr, bss_conf->txpower, bss_conf->txpower_type);
1800 ath9k_set_txpower(sc, vif);
1801 }
1802
1767 mutex_unlock(&sc->mutex); 1803 mutex_unlock(&sc->mutex);
1768 ath9k_ps_restore(sc); 1804 ath9k_ps_restore(sc);
1769 1805
diff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c
index 3f7a11edb82a..66596b95273f 100644
--- a/drivers/net/wireless/ath/ath9k/mci.c
+++ b/drivers/net/wireless/ath/ath9k/mci.c
@@ -495,7 +495,7 @@ void ath_mci_intr(struct ath_softc *sc)
495 ar9003_mci_get_interrupt(sc->sc_ah, &mci_int, &mci_int_rxmsg); 495 ar9003_mci_get_interrupt(sc->sc_ah, &mci_int, &mci_int_rxmsg);
496 496
497 if (ar9003_mci_state(ah, MCI_STATE_ENABLE) == 0) { 497 if (ar9003_mci_state(ah, MCI_STATE_ENABLE) == 0) {
498 ar9003_mci_get_next_gpm_offset(ah, true, NULL); 498 ar9003_mci_state(ah, MCI_STATE_INIT_GPM_OFFSET);
499 return; 499 return;
500 } 500 }
501 501
@@ -559,8 +559,7 @@ void ath_mci_intr(struct ath_softc *sc)
559 return; 559 return;
560 560
561 pgpm = mci->gpm_buf.bf_addr; 561 pgpm = mci->gpm_buf.bf_addr;
562 offset = ar9003_mci_get_next_gpm_offset(ah, false, 562 offset = ar9003_mci_get_next_gpm_offset(ah, &more_data);
563 &more_data);
564 563
565 if (offset == MCI_GPM_INVALID) 564 if (offset == MCI_GPM_INVALID)
566 break; 565 break;
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
index 9587ec655680..caba54ddad25 100644
--- a/drivers/net/wireless/ath/ath9k/reg.h
+++ b/drivers/net/wireless/ath/ath9k/reg.h
@@ -958,6 +958,8 @@
958 958
959#define AR_SREV_9550(_ah) \ 959#define AR_SREV_9550(_ah) \
960 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9550)) 960 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9550))
961#define AR_SREV_9550_OR_LATER(_ah) \
962 (((_ah)->hw_version.macVersion >= AR_SREV_VERSION_9550))
961 963
962#define AR_SREV_9580(_ah) \ 964#define AR_SREV_9580(_ah) \
963 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9580) && \ 965 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9580) && \
@@ -1128,6 +1130,8 @@ enum {
1128 1130
1129#define AR_GPIO_OE_OUT (AR_SREV_9340(ah) ? 0x4030 : \ 1131#define AR_GPIO_OE_OUT (AR_SREV_9340(ah) ? 0x4030 : \
1130 (AR_SREV_9300_20_OR_LATER(ah) ? 0x4050 : 0x404c)) 1132 (AR_SREV_9300_20_OR_LATER(ah) ? 0x4050 : 0x404c))
1133#define AR_GPIO_OE_OUT_MASK (AR_SREV_9550_OR_LATER(ah) ? \
1134 0x0000000F : 0xFFFFFFFF)
1131#define AR_GPIO_OE_OUT_DRV 0x3 1135#define AR_GPIO_OE_OUT_DRV 0x3
1132#define AR_GPIO_OE_OUT_DRV_NO 0x0 1136#define AR_GPIO_OE_OUT_DRV_NO 0x0
1133#define AR_GPIO_OE_OUT_DRV_LOW 0x1 1137#define AR_GPIO_OE_OUT_DRV_LOW 0x1
@@ -2044,279 +2048,4 @@ enum {
2044#define AR_PHY_AGC_CONTROL_YCOK_MAX 0x000003c0 2048#define AR_PHY_AGC_CONTROL_YCOK_MAX 0x000003c0
2045#define AR_PHY_AGC_CONTROL_YCOK_MAX_S 6 2049#define AR_PHY_AGC_CONTROL_YCOK_MAX_S 6
2046 2050
2047/* MCI Registers */
2048
2049#define AR_MCI_COMMAND0 0x1800
2050#define AR_MCI_COMMAND0_HEADER 0xFF
2051#define AR_MCI_COMMAND0_HEADER_S 0
2052#define AR_MCI_COMMAND0_LEN 0x1f00
2053#define AR_MCI_COMMAND0_LEN_S 8
2054#define AR_MCI_COMMAND0_DISABLE_TIMESTAMP 0x2000
2055#define AR_MCI_COMMAND0_DISABLE_TIMESTAMP_S 13
2056
2057#define AR_MCI_COMMAND1 0x1804
2058
2059#define AR_MCI_COMMAND2 0x1808
2060#define AR_MCI_COMMAND2_RESET_TX 0x01
2061#define AR_MCI_COMMAND2_RESET_TX_S 0
2062#define AR_MCI_COMMAND2_RESET_RX 0x02
2063#define AR_MCI_COMMAND2_RESET_RX_S 1
2064#define AR_MCI_COMMAND2_RESET_RX_NUM_CYCLES 0x3FC
2065#define AR_MCI_COMMAND2_RESET_RX_NUM_CYCLES_S 2
2066#define AR_MCI_COMMAND2_RESET_REQ_WAKEUP 0x400
2067#define AR_MCI_COMMAND2_RESET_REQ_WAKEUP_S 10
2068
2069#define AR_MCI_RX_CTRL 0x180c
2070
2071#define AR_MCI_TX_CTRL 0x1810
2072/* 0 = no division, 1 = divide by 2, 2 = divide by 4, 3 = divide by 8 */
2073#define AR_MCI_TX_CTRL_CLK_DIV 0x03
2074#define AR_MCI_TX_CTRL_CLK_DIV_S 0
2075#define AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE 0x04
2076#define AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE_S 2
2077#define AR_MCI_TX_CTRL_GAIN_UPDATE_FREQ 0xFFFFF8
2078#define AR_MCI_TX_CTRL_GAIN_UPDATE_FREQ_S 3
2079#define AR_MCI_TX_CTRL_GAIN_UPDATE_NUM 0xF000000
2080#define AR_MCI_TX_CTRL_GAIN_UPDATE_NUM_S 24
2081
2082#define AR_MCI_MSG_ATTRIBUTES_TABLE 0x1814
2083#define AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM 0xFFFF
2084#define AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM_S 0
2085#define AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR 0xFFFF0000
2086#define AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR_S 16
2087
2088#define AR_MCI_SCHD_TABLE_0 0x1818
2089#define AR_MCI_SCHD_TABLE_1 0x181c
2090#define AR_MCI_GPM_0 0x1820
2091#define AR_MCI_GPM_1 0x1824
2092#define AR_MCI_GPM_WRITE_PTR 0xFFFF0000
2093#define AR_MCI_GPM_WRITE_PTR_S 16
2094#define AR_MCI_GPM_BUF_LEN 0x0000FFFF
2095#define AR_MCI_GPM_BUF_LEN_S 0
2096
2097#define AR_MCI_INTERRUPT_RAW 0x1828
2098#define AR_MCI_INTERRUPT_EN 0x182c
2099#define AR_MCI_INTERRUPT_SW_MSG_DONE 0x00000001
2100#define AR_MCI_INTERRUPT_SW_MSG_DONE_S 0
2101#define AR_MCI_INTERRUPT_CPU_INT_MSG 0x00000002
2102#define AR_MCI_INTERRUPT_CPU_INT_MSG_S 1
2103#define AR_MCI_INTERRUPT_RX_CKSUM_FAIL 0x00000004
2104#define AR_MCI_INTERRUPT_RX_CKSUM_FAIL_S 2
2105#define AR_MCI_INTERRUPT_RX_INVALID_HDR 0x00000008
2106#define AR_MCI_INTERRUPT_RX_INVALID_HDR_S 3
2107#define AR_MCI_INTERRUPT_RX_HW_MSG_FAIL 0x00000010
2108#define AR_MCI_INTERRUPT_RX_HW_MSG_FAIL_S 4
2109#define AR_MCI_INTERRUPT_RX_SW_MSG_FAIL 0x00000020
2110#define AR_MCI_INTERRUPT_RX_SW_MSG_FAIL_S 5
2111#define AR_MCI_INTERRUPT_TX_HW_MSG_FAIL 0x00000080
2112#define AR_MCI_INTERRUPT_TX_HW_MSG_FAIL_S 7
2113#define AR_MCI_INTERRUPT_TX_SW_MSG_FAIL 0x00000100
2114#define AR_MCI_INTERRUPT_TX_SW_MSG_FAIL_S 8
2115#define AR_MCI_INTERRUPT_RX_MSG 0x00000200
2116#define AR_MCI_INTERRUPT_RX_MSG_S 9
2117#define AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE 0x00000400
2118#define AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE_S 10
2119#define AR_MCI_INTERRUPT_BT_PRI 0x07fff800
2120#define AR_MCI_INTERRUPT_BT_PRI_S 11
2121#define AR_MCI_INTERRUPT_BT_PRI_THRESH 0x08000000
2122#define AR_MCI_INTERRUPT_BT_PRI_THRESH_S 27
2123#define AR_MCI_INTERRUPT_BT_FREQ 0x10000000
2124#define AR_MCI_INTERRUPT_BT_FREQ_S 28
2125#define AR_MCI_INTERRUPT_BT_STOMP 0x20000000
2126#define AR_MCI_INTERRUPT_BT_STOMP_S 29
2127#define AR_MCI_INTERRUPT_BB_AIC_IRQ 0x40000000
2128#define AR_MCI_INTERRUPT_BB_AIC_IRQ_S 30
2129#define AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT 0x80000000
2130#define AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT_S 31
2131
2132#define AR_MCI_INTERRUPT_DEFAULT (AR_MCI_INTERRUPT_SW_MSG_DONE | \
2133 AR_MCI_INTERRUPT_RX_INVALID_HDR | \
2134 AR_MCI_INTERRUPT_RX_HW_MSG_FAIL | \
2135 AR_MCI_INTERRUPT_RX_SW_MSG_FAIL | \
2136 AR_MCI_INTERRUPT_TX_HW_MSG_FAIL | \
2137 AR_MCI_INTERRUPT_TX_SW_MSG_FAIL | \
2138 AR_MCI_INTERRUPT_RX_MSG | \
2139 AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE | \
2140 AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)
2141
2142#define AR_MCI_INTERRUPT_MSG_FAIL_MASK (AR_MCI_INTERRUPT_RX_HW_MSG_FAIL | \
2143 AR_MCI_INTERRUPT_RX_SW_MSG_FAIL | \
2144 AR_MCI_INTERRUPT_TX_HW_MSG_FAIL | \
2145 AR_MCI_INTERRUPT_TX_SW_MSG_FAIL)
2146
2147#define AR_MCI_REMOTE_CPU_INT 0x1830
2148#define AR_MCI_REMOTE_CPU_INT_EN 0x1834
2149#define AR_MCI_INTERRUPT_RX_MSG_RAW 0x1838
2150#define AR_MCI_INTERRUPT_RX_MSG_EN 0x183c
2151#define AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET 0x00000001
2152#define AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET_S 0
2153#define AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL 0x00000002
2154#define AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL_S 1
2155#define AR_MCI_INTERRUPT_RX_MSG_CONT_NACK 0x00000004
2156#define AR_MCI_INTERRUPT_RX_MSG_CONT_NACK_S 2
2157#define AR_MCI_INTERRUPT_RX_MSG_CONT_INFO 0x00000008
2158#define AR_MCI_INTERRUPT_RX_MSG_CONT_INFO_S 3
2159#define AR_MCI_INTERRUPT_RX_MSG_CONT_RST 0x00000010
2160#define AR_MCI_INTERRUPT_RX_MSG_CONT_RST_S 4
2161#define AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO 0x00000020
2162#define AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO_S 5
2163#define AR_MCI_INTERRUPT_RX_MSG_CPU_INT 0x00000040
2164#define AR_MCI_INTERRUPT_RX_MSG_CPU_INT_S 6
2165#define AR_MCI_INTERRUPT_RX_MSG_GPM 0x00000100
2166#define AR_MCI_INTERRUPT_RX_MSG_GPM_S 8
2167#define AR_MCI_INTERRUPT_RX_MSG_LNA_INFO 0x00000200
2168#define AR_MCI_INTERRUPT_RX_MSG_LNA_INFO_S 9
2169#define AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING 0x00000400
2170#define AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING_S 10
2171#define AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING 0x00000800
2172#define AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING_S 11
2173#define AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE 0x00001000
2174#define AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE_S 12
2175#define AR_MCI_INTERRUPT_RX_HW_MSG_MASK (AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO | \
2176 AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL| \
2177 AR_MCI_INTERRUPT_RX_MSG_LNA_INFO | \
2178 AR_MCI_INTERRUPT_RX_MSG_CONT_NACK | \
2179 AR_MCI_INTERRUPT_RX_MSG_CONT_INFO | \
2180 AR_MCI_INTERRUPT_RX_MSG_CONT_RST)
2181
2182#define AR_MCI_INTERRUPT_RX_MSG_DEFAULT (AR_MCI_INTERRUPT_RX_MSG_GPM | \
2183 AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET| \
2184 AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING | \
2185 AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING| \
2186 AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)
2187
2188#define AR_MCI_CPU_INT 0x1840
2189
2190#define AR_MCI_RX_STATUS 0x1844
2191#define AR_MCI_RX_LAST_SCHD_MSG_INDEX 0x00000F00
2192#define AR_MCI_RX_LAST_SCHD_MSG_INDEX_S 8
2193#define AR_MCI_RX_REMOTE_SLEEP 0x00001000
2194#define AR_MCI_RX_REMOTE_SLEEP_S 12
2195#define AR_MCI_RX_MCI_CLK_REQ 0x00002000
2196#define AR_MCI_RX_MCI_CLK_REQ_S 13
2197
2198#define AR_MCI_CONT_STATUS 0x1848
2199#define AR_MCI_CONT_RSSI_POWER 0x000000FF
2200#define AR_MCI_CONT_RSSI_POWER_S 0
2201#define AR_MCI_CONT_PRIORITY 0x0000FF00
2202#define AR_MCI_CONT_PRIORITY_S 8
2203#define AR_MCI_CONT_TXRX 0x00010000
2204#define AR_MCI_CONT_TXRX_S 16
2205
2206#define AR_MCI_BT_PRI0 0x184c
2207#define AR_MCI_BT_PRI1 0x1850
2208#define AR_MCI_BT_PRI2 0x1854
2209#define AR_MCI_BT_PRI3 0x1858
2210#define AR_MCI_BT_PRI 0x185c
2211#define AR_MCI_WL_FREQ0 0x1860
2212#define AR_MCI_WL_FREQ1 0x1864
2213#define AR_MCI_WL_FREQ2 0x1868
2214#define AR_MCI_GAIN 0x186c
2215#define AR_MCI_WBTIMER1 0x1870
2216#define AR_MCI_WBTIMER2 0x1874
2217#define AR_MCI_WBTIMER3 0x1878
2218#define AR_MCI_WBTIMER4 0x187c
2219#define AR_MCI_MAXGAIN 0x1880
2220#define AR_MCI_HW_SCHD_TBL_CTL 0x1884
2221#define AR_MCI_HW_SCHD_TBL_D0 0x1888
2222#define AR_MCI_HW_SCHD_TBL_D1 0x188c
2223#define AR_MCI_HW_SCHD_TBL_D2 0x1890
2224#define AR_MCI_HW_SCHD_TBL_D3 0x1894
2225#define AR_MCI_TX_PAYLOAD0 0x1898
2226#define AR_MCI_TX_PAYLOAD1 0x189c
2227#define AR_MCI_TX_PAYLOAD2 0x18a0
2228#define AR_MCI_TX_PAYLOAD3 0x18a4
2229#define AR_BTCOEX_WBTIMER 0x18a8
2230
2231#define AR_BTCOEX_CTRL 0x18ac
2232#define AR_BTCOEX_CTRL_AR9462_MODE 0x00000001
2233#define AR_BTCOEX_CTRL_AR9462_MODE_S 0
2234#define AR_BTCOEX_CTRL_WBTIMER_EN 0x00000002
2235#define AR_BTCOEX_CTRL_WBTIMER_EN_S 1
2236#define AR_BTCOEX_CTRL_MCI_MODE_EN 0x00000004
2237#define AR_BTCOEX_CTRL_MCI_MODE_EN_S 2
2238#define AR_BTCOEX_CTRL_LNA_SHARED 0x00000008
2239#define AR_BTCOEX_CTRL_LNA_SHARED_S 3
2240#define AR_BTCOEX_CTRL_PA_SHARED 0x00000010
2241#define AR_BTCOEX_CTRL_PA_SHARED_S 4
2242#define AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN 0x00000020
2243#define AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN_S 5
2244#define AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN 0x00000040
2245#define AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN_S 6
2246#define AR_BTCOEX_CTRL_NUM_ANTENNAS 0x00000180
2247#define AR_BTCOEX_CTRL_NUM_ANTENNAS_S 7
2248#define AR_BTCOEX_CTRL_RX_CHAIN_MASK 0x00000E00
2249#define AR_BTCOEX_CTRL_RX_CHAIN_MASK_S 9
2250#define AR_BTCOEX_CTRL_AGGR_THRESH 0x00007000
2251#define AR_BTCOEX_CTRL_AGGR_THRESH_S 12
2252#define AR_BTCOEX_CTRL_1_CHAIN_BCN 0x00080000
2253#define AR_BTCOEX_CTRL_1_CHAIN_BCN_S 19
2254#define AR_BTCOEX_CTRL_1_CHAIN_ACK 0x00100000
2255#define AR_BTCOEX_CTRL_1_CHAIN_ACK_S 20
2256#define AR_BTCOEX_CTRL_WAIT_BA_MARGIN 0x1FE00000
2257#define AR_BTCOEX_CTRL_WAIT_BA_MARGIN_S 28
2258#define AR_BTCOEX_CTRL_REDUCE_TXPWR 0x20000000
2259#define AR_BTCOEX_CTRL_REDUCE_TXPWR_S 29
2260#define AR_BTCOEX_CTRL_SPDT_ENABLE_10 0x40000000
2261#define AR_BTCOEX_CTRL_SPDT_ENABLE_10_S 30
2262#define AR_BTCOEX_CTRL_SPDT_POLARITY 0x80000000
2263#define AR_BTCOEX_CTRL_SPDT_POLARITY_S 31
2264
2265#define AR_BTCOEX_MAX_TXPWR(_x) (0x18c0 + ((_x) << 2))
2266#define AR_BTCOEX_WL_LNA 0x1940
2267#define AR_BTCOEX_RFGAIN_CTRL 0x1944
2268#define AR_BTCOEX_WL_LNA_TIMEOUT 0x003FFFFF
2269#define AR_BTCOEX_WL_LNA_TIMEOUT_S 0
2270
2271#define AR_BTCOEX_CTRL2 0x1948
2272#define AR_BTCOEX_CTRL2_TXPWR_THRESH 0x0007F800
2273#define AR_BTCOEX_CTRL2_TXPWR_THRESH_S 11
2274#define AR_BTCOEX_CTRL2_TX_CHAIN_MASK 0x00380000
2275#define AR_BTCOEX_CTRL2_TX_CHAIN_MASK_S 19
2276#define AR_BTCOEX_CTRL2_RX_DEWEIGHT 0x00400000
2277#define AR_BTCOEX_CTRL2_RX_DEWEIGHT_S 22
2278#define AR_BTCOEX_CTRL2_GPIO_OBS_SEL 0x00800000
2279#define AR_BTCOEX_CTRL2_GPIO_OBS_SEL_S 23
2280#define AR_BTCOEX_CTRL2_MAC_BB_OBS_SEL 0x01000000
2281#define AR_BTCOEX_CTRL2_MAC_BB_OBS_SEL_S 24
2282#define AR_BTCOEX_CTRL2_DESC_BASED_TXPWR_ENABLE 0x02000000
2283#define AR_BTCOEX_CTRL2_DESC_BASED_TXPWR_ENABLE_S 25
2284
2285#define AR_BTCOEX_CTRL_SPDT_ENABLE 0x00000001
2286#define AR_BTCOEX_CTRL_SPDT_ENABLE_S 0
2287#define AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL 0x00000002
2288#define AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL_S 1
2289#define AR_BTCOEX_CTRL_USE_LATCHED_BT_ANT 0x00000004
2290#define AR_BTCOEX_CTRL_USE_LATCHED_BT_ANT_S 2
2291#define AR_GLB_WLAN_UART_INTF_EN 0x00020000
2292#define AR_GLB_WLAN_UART_INTF_EN_S 17
2293#define AR_GLB_DS_JTAG_DISABLE 0x00040000
2294#define AR_GLB_DS_JTAG_DISABLE_S 18
2295
2296#define AR_BTCOEX_RC 0x194c
2297#define AR_BTCOEX_MAX_RFGAIN(_x) (0x1950 + ((_x) << 2))
2298#define AR_BTCOEX_DBG 0x1a50
2299#define AR_MCI_LAST_HW_MSG_HDR 0x1a54
2300#define AR_MCI_LAST_HW_MSG_BDY 0x1a58
2301
2302#define AR_MCI_SCHD_TABLE_2 0x1a5c
2303#define AR_MCI_SCHD_TABLE_2_MEM_BASED 0x00000001
2304#define AR_MCI_SCHD_TABLE_2_MEM_BASED_S 0
2305#define AR_MCI_SCHD_TABLE_2_HW_BASED 0x00000002
2306#define AR_MCI_SCHD_TABLE_2_HW_BASED_S 1
2307
2308#define AR_BTCOEX_CTRL3 0x1a60
2309#define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT 0x00000fff
2310#define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT_S 0
2311
2312#define AR_GLB_SWREG_DISCONT_MODE 0x2002c
2313#define AR_GLB_SWREG_DISCONT_EN_BT_WLAN 0x3
2314
2315#define AR_MCI_MISC 0x1a74
2316#define AR_MCI_MISC_HW_FIX_EN 0x00000001
2317#define AR_MCI_MISC_HW_FIX_EN_S 0
2318#define AR_MCI_DBG_CNT_CTRL 0x1a78
2319#define AR_MCI_DBG_CNT_CTRL_ENABLE 0x00000001
2320#define AR_MCI_DBG_CNT_CTRL_ENABLE_S 0
2321
2322#endif 2051#endif
diff --git a/drivers/net/wireless/ath/ath9k/reg_aic.h b/drivers/net/wireless/ath/ath9k/reg_aic.h
new file mode 100644
index 000000000000..955147ab48a2
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/reg_aic.h
@@ -0,0 +1,168 @@
1/*
2 * Copyright (c) 2015 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#ifndef REG_AIC_H
18#define REG_AIC_H
19
20#define AR_SM_BASE 0xa200
21#define AR_SM1_BASE 0xb200
22#define AR_AGC_BASE 0x9e00
23
24#define AR_PHY_AIC_CTRL_0_B0 (AR_SM_BASE + 0x4b0)
25#define AR_PHY_AIC_CTRL_1_B0 (AR_SM_BASE + 0x4b4)
26#define AR_PHY_AIC_CTRL_2_B0 (AR_SM_BASE + 0x4b8)
27#define AR_PHY_AIC_CTRL_3_B0 (AR_SM_BASE + 0x4bc)
28#define AR_PHY_AIC_CTRL_4_B0 (AR_SM_BASE + 0x4c0)
29
30#define AR_PHY_AIC_STAT_0_B0 (AR_SM_BASE + 0x4c4)
31#define AR_PHY_AIC_STAT_1_B0 (AR_SM_BASE + 0x4c8)
32#define AR_PHY_AIC_STAT_2_B0 (AR_SM_BASE + 0x4cc)
33
34#define AR_PHY_AIC_CTRL_0_B1 (AR_SM1_BASE + 0x4b0)
35#define AR_PHY_AIC_CTRL_1_B1 (AR_SM1_BASE + 0x4b4)
36#define AR_PHY_AIC_CTRL_4_B1 (AR_SM1_BASE + 0x4c0)
37
38#define AR_PHY_AIC_STAT_0_B1 (AR_SM1_BASE + 0x4c4)
39#define AR_PHY_AIC_STAT_1_B1 (AR_SM1_BASE + 0x4c8)
40#define AR_PHY_AIC_STAT_2_B1 (AR_SM1_BASE + 0x4cc)
41
42#define AR_PHY_AIC_SRAM_ADDR_B0 (AR_SM_BASE + 0x5f0)
43#define AR_PHY_AIC_SRAM_DATA_B0 (AR_SM_BASE + 0x5f4)
44
45#define AR_PHY_AIC_SRAM_ADDR_B1 (AR_SM1_BASE + 0x5f0)
46#define AR_PHY_AIC_SRAM_DATA_B1 (AR_SM1_BASE + 0x5f4)
47
48#define AR_PHY_BT_COEX_4 (AR_AGC_BASE + 0x60)
49#define AR_PHY_BT_COEX_5 (AR_AGC_BASE + 0x64)
50
51/* AIC fields */
52#define AR_PHY_AIC_MON_ENABLE 0x80000000
53#define AR_PHY_AIC_MON_ENABLE_S 31
54#define AR_PHY_AIC_CAL_MAX_HOP_COUNT 0x7F000000
55#define AR_PHY_AIC_CAL_MAX_HOP_COUNT_S 24
56#define AR_PHY_AIC_CAL_MIN_VALID_COUNT 0x00FE0000
57#define AR_PHY_AIC_CAL_MIN_VALID_COUNT_S 17
58#define AR_PHY_AIC_F_WLAN 0x0001FC00
59#define AR_PHY_AIC_F_WLAN_S 10
60#define AR_PHY_AIC_CAL_CH_VALID_RESET 0x00000200
61#define AR_PHY_AIC_CAL_CH_VALID_RESET_S 9
62#define AR_PHY_AIC_CAL_ENABLE 0x00000100
63#define AR_PHY_AIC_CAL_ENABLE_S 8
64#define AR_PHY_AIC_BTTX_PWR_THR 0x000000FE
65#define AR_PHY_AIC_BTTX_PWR_THR_S 1
66#define AR_PHY_AIC_ENABLE 0x00000001
67#define AR_PHY_AIC_ENABLE_S 0
68#define AR_PHY_AIC_CAL_BT_REF_DELAY 0x00F00000
69#define AR_PHY_AIC_CAL_BT_REF_DELAY_S 20
70#define AR_PHY_AIC_BT_IDLE_CFG 0x00080000
71#define AR_PHY_AIC_BT_IDLE_CFG_S 19
72#define AR_PHY_AIC_STDBY_COND 0x00060000
73#define AR_PHY_AIC_STDBY_COND_S 17
74#define AR_PHY_AIC_STDBY_ROT_ATT_DB 0x0001F800
75#define AR_PHY_AIC_STDBY_ROT_ATT_DB_S 11
76#define AR_PHY_AIC_STDBY_COM_ATT_DB 0x00000700
77#define AR_PHY_AIC_STDBY_COM_ATT_DB_S 8
78#define AR_PHY_AIC_RSSI_MAX 0x000000F0
79#define AR_PHY_AIC_RSSI_MAX_S 4
80#define AR_PHY_AIC_RSSI_MIN 0x0000000F
81#define AR_PHY_AIC_RSSI_MIN_S 0
82#define AR_PHY_AIC_RADIO_DELAY 0x7F000000
83#define AR_PHY_AIC_RADIO_DELAY_S 24
84#define AR_PHY_AIC_CAL_STEP_SIZE_CORR 0x00F00000
85#define AR_PHY_AIC_CAL_STEP_SIZE_CORR_S 20
86#define AR_PHY_AIC_CAL_ROT_IDX_CORR 0x000F8000
87#define AR_PHY_AIC_CAL_ROT_IDX_CORR_S 15
88#define AR_PHY_AIC_CAL_CONV_CHECK_FACTOR 0x00006000
89#define AR_PHY_AIC_CAL_CONV_CHECK_FACTOR_S 13
90#define AR_PHY_AIC_ROT_IDX_COUNT_MAX 0x00001C00
91#define AR_PHY_AIC_ROT_IDX_COUNT_MAX_S 10
92#define AR_PHY_AIC_CAL_SYNTH_TOGGLE 0x00000200
93#define AR_PHY_AIC_CAL_SYNTH_TOGGLE_S 9
94#define AR_PHY_AIC_CAL_SYNTH_AFTER_BTRX 0x00000100
95#define AR_PHY_AIC_CAL_SYNTH_AFTER_BTRX_S 8
96#define AR_PHY_AIC_CAL_SYNTH_SETTLING 0x000000FF
97#define AR_PHY_AIC_CAL_SYNTH_SETTLING_S 0
98#define AR_PHY_AIC_MON_MAX_HOP_COUNT 0x07F00000
99#define AR_PHY_AIC_MON_MAX_HOP_COUNT_S 20
100#define AR_PHY_AIC_MON_MIN_STALE_COUNT 0x000FE000
101#define AR_PHY_AIC_MON_MIN_STALE_COUNT_S 13
102#define AR_PHY_AIC_MON_PWR_EST_LONG 0x00001000
103#define AR_PHY_AIC_MON_PWR_EST_LONG_S 12
104#define AR_PHY_AIC_MON_PD_TALLY_SCALING 0x00000C00
105#define AR_PHY_AIC_MON_PD_TALLY_SCALING_S 10
106#define AR_PHY_AIC_MON_PERF_THR 0x000003E0
107#define AR_PHY_AIC_MON_PERF_THR_S 5
108#define AR_PHY_AIC_CAL_TARGET_MAG_SETTING 0x00000018
109#define AR_PHY_AIC_CAL_TARGET_MAG_SETTING_S 3
110#define AR_PHY_AIC_CAL_PERF_CHECK_FACTOR 0x00000006
111#define AR_PHY_AIC_CAL_PERF_CHECK_FACTOR_S 1
112#define AR_PHY_AIC_CAL_PWR_EST_LONG 0x00000001
113#define AR_PHY_AIC_CAL_PWR_EST_LONG_S 0
114#define AR_PHY_AIC_MON_DONE 0x80000000
115#define AR_PHY_AIC_MON_DONE_S 31
116#define AR_PHY_AIC_MON_ACTIVE 0x40000000
117#define AR_PHY_AIC_MON_ACTIVE_S 30
118#define AR_PHY_AIC_MEAS_COUNT 0x3F000000
119#define AR_PHY_AIC_MEAS_COUNT_S 24
120#define AR_PHY_AIC_CAL_ANT_ISO_EST 0x00FC0000
121#define AR_PHY_AIC_CAL_ANT_ISO_EST_S 18
122#define AR_PHY_AIC_CAL_HOP_COUNT 0x0003F800
123#define AR_PHY_AIC_CAL_HOP_COUNT_S 11
124#define AR_PHY_AIC_CAL_VALID_COUNT 0x000007F0
125#define AR_PHY_AIC_CAL_VALID_COUNT_S 4
126#define AR_PHY_AIC_CAL_BT_TOO_WEAK_ERR 0x00000008
127#define AR_PHY_AIC_CAL_BT_TOO_WEAK_ERR_S 3
128#define AR_PHY_AIC_CAL_BT_TOO_STRONG_ERR 0x00000004
129#define AR_PHY_AIC_CAL_BT_TOO_STRONG_ERR_S 2
130#define AR_PHY_AIC_CAL_DONE 0x00000002
131#define AR_PHY_AIC_CAL_DONE_S 1
132#define AR_PHY_AIC_CAL_ACTIVE 0x00000001
133#define AR_PHY_AIC_CAL_ACTIVE_S 0
134
135#define AR_PHY_AIC_MEAS_MAG_MIN 0xFFC00000
136#define AR_PHY_AIC_MEAS_MAG_MIN_S 22
137#define AR_PHY_AIC_MON_STALE_COUNT 0x003F8000
138#define AR_PHY_AIC_MON_STALE_COUNT_S 15
139#define AR_PHY_AIC_MON_HOP_COUNT 0x00007F00
140#define AR_PHY_AIC_MON_HOP_COUNT_S 8
141#define AR_PHY_AIC_CAL_AIC_SM 0x000000F8
142#define AR_PHY_AIC_CAL_AIC_SM_S 3
143#define AR_PHY_AIC_SM 0x00000007
144#define AR_PHY_AIC_SM_S 0
145#define AR_PHY_AIC_SRAM_VALID 0x00000001
146#define AR_PHY_AIC_SRAM_VALID_S 0
147#define AR_PHY_AIC_SRAM_ROT_QUAD_ATT_DB 0x0000007E
148#define AR_PHY_AIC_SRAM_ROT_QUAD_ATT_DB_S 1
149#define AR_PHY_AIC_SRAM_VGA_QUAD_SIGN 0x00000080
150#define AR_PHY_AIC_SRAM_VGA_QUAD_SIGN_S 7
151#define AR_PHY_AIC_SRAM_ROT_DIR_ATT_DB 0x00003F00
152#define AR_PHY_AIC_SRAM_ROT_DIR_ATT_DB_S 8
153#define AR_PHY_AIC_SRAM_VGA_DIR_SIGN 0x00004000
154#define AR_PHY_AIC_SRAM_VGA_DIR_SIGN_S 14
155#define AR_PHY_AIC_SRAM_COM_ATT_6DB 0x00038000
156#define AR_PHY_AIC_SRAM_COM_ATT_6DB_S 15
157#define AR_PHY_AIC_CAL_ROT_ATT_DB_EST_ISO 0x0000E000
158#define AR_PHY_AIC_CAL_ROT_ATT_DB_EST_ISO_S 13
159#define AR_PHY_AIC_CAL_COM_ATT_DB_EST_ISO 0x00001E00
160#define AR_PHY_AIC_CAL_COM_ATT_DB_EST_ISO_S 9
161#define AR_PHY_AIC_CAL_ISO_EST_INIT_SETTING 0x000001F8
162#define AR_PHY_AIC_CAL_ISO_EST_INIT_SETTING_S 3
163#define AR_PHY_AIC_CAL_COM_ATT_DB_BACKOFF 0x00000006
164#define AR_PHY_AIC_CAL_COM_ATT_DB_BACKOFF_S 1
165#define AR_PHY_AIC_CAL_COM_ATT_DB_FIXED 0x00000001
166#define AR_PHY_AIC_CAL_COM_ATT_DB_FIXED_S 0
167
168#endif /* REG_AIC_H */
diff --git a/drivers/net/wireless/ath/ath9k/reg_mci.h b/drivers/net/wireless/ath/ath9k/reg_mci.h
new file mode 100644
index 000000000000..6251310704e3
--- /dev/null
+++ b/drivers/net/wireless/ath/ath9k/reg_mci.h
@@ -0,0 +1,310 @@
1/*
2 * Copyright (c) 2015 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#ifndef REG_MCI_H
18#define REG_MCI_H
19
20#define AR_MCI_COMMAND0 0x1800
21#define AR_MCI_COMMAND0_HEADER 0xFF
22#define AR_MCI_COMMAND0_HEADER_S 0
23#define AR_MCI_COMMAND0_LEN 0x1f00
24#define AR_MCI_COMMAND0_LEN_S 8
25#define AR_MCI_COMMAND0_DISABLE_TIMESTAMP 0x2000
26#define AR_MCI_COMMAND0_DISABLE_TIMESTAMP_S 13
27
28#define AR_MCI_COMMAND1 0x1804
29
30#define AR_MCI_COMMAND2 0x1808
31#define AR_MCI_COMMAND2_RESET_TX 0x01
32#define AR_MCI_COMMAND2_RESET_TX_S 0
33#define AR_MCI_COMMAND2_RESET_RX 0x02
34#define AR_MCI_COMMAND2_RESET_RX_S 1
35#define AR_MCI_COMMAND2_RESET_RX_NUM_CYCLES 0x3FC
36#define AR_MCI_COMMAND2_RESET_RX_NUM_CYCLES_S 2
37#define AR_MCI_COMMAND2_RESET_REQ_WAKEUP 0x400
38#define AR_MCI_COMMAND2_RESET_REQ_WAKEUP_S 10
39
40#define AR_MCI_RX_CTRL 0x180c
41
42#define AR_MCI_TX_CTRL 0x1810
43/*
44 * 0 = no division,
45 * 1 = divide by 2,
46 * 2 = divide by 4,
47 * 3 = divide by 8
48 */
49#define AR_MCI_TX_CTRL_CLK_DIV 0x03
50#define AR_MCI_TX_CTRL_CLK_DIV_S 0
51#define AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE 0x04
52#define AR_MCI_TX_CTRL_DISABLE_LNA_UPDATE_S 2
53#define AR_MCI_TX_CTRL_GAIN_UPDATE_FREQ 0xFFFFF8
54#define AR_MCI_TX_CTRL_GAIN_UPDATE_FREQ_S 3
55#define AR_MCI_TX_CTRL_GAIN_UPDATE_NUM 0xF000000
56#define AR_MCI_TX_CTRL_GAIN_UPDATE_NUM_S 24
57
58#define AR_MCI_MSG_ATTRIBUTES_TABLE 0x1814
59#define AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM 0xFFFF
60#define AR_MCI_MSG_ATTRIBUTES_TABLE_CHECKSUM_S 0
61#define AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR 0xFFFF0000
62#define AR_MCI_MSG_ATTRIBUTES_TABLE_INVALID_HDR_S 16
63
64#define AR_MCI_SCHD_TABLE_0 0x1818
65#define AR_MCI_SCHD_TABLE_1 0x181c
66#define AR_MCI_GPM_0 0x1820
67#define AR_MCI_GPM_1 0x1824
68#define AR_MCI_GPM_WRITE_PTR 0xFFFF0000
69#define AR_MCI_GPM_WRITE_PTR_S 16
70#define AR_MCI_GPM_BUF_LEN 0x0000FFFF
71#define AR_MCI_GPM_BUF_LEN_S 0
72
73#define AR_MCI_INTERRUPT_RAW 0x1828
74
75#define AR_MCI_INTERRUPT_EN 0x182c
76#define AR_MCI_INTERRUPT_SW_MSG_DONE 0x00000001
77#define AR_MCI_INTERRUPT_SW_MSG_DONE_S 0
78#define AR_MCI_INTERRUPT_CPU_INT_MSG 0x00000002
79#define AR_MCI_INTERRUPT_CPU_INT_MSG_S 1
80#define AR_MCI_INTERRUPT_RX_CKSUM_FAIL 0x00000004
81#define AR_MCI_INTERRUPT_RX_CKSUM_FAIL_S 2
82#define AR_MCI_INTERRUPT_RX_INVALID_HDR 0x00000008
83#define AR_MCI_INTERRUPT_RX_INVALID_HDR_S 3
84#define AR_MCI_INTERRUPT_RX_HW_MSG_FAIL 0x00000010
85#define AR_MCI_INTERRUPT_RX_HW_MSG_FAIL_S 4
86#define AR_MCI_INTERRUPT_RX_SW_MSG_FAIL 0x00000020
87#define AR_MCI_INTERRUPT_RX_SW_MSG_FAIL_S 5
88#define AR_MCI_INTERRUPT_TX_HW_MSG_FAIL 0x00000080
89#define AR_MCI_INTERRUPT_TX_HW_MSG_FAIL_S 7
90#define AR_MCI_INTERRUPT_TX_SW_MSG_FAIL 0x00000100
91#define AR_MCI_INTERRUPT_TX_SW_MSG_FAIL_S 8
92#define AR_MCI_INTERRUPT_RX_MSG 0x00000200
93#define AR_MCI_INTERRUPT_RX_MSG_S 9
94#define AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE 0x00000400
95#define AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE_S 10
96#define AR_MCI_INTERRUPT_BT_PRI 0x07fff800
97#define AR_MCI_INTERRUPT_BT_PRI_S 11
98#define AR_MCI_INTERRUPT_BT_PRI_THRESH 0x08000000
99#define AR_MCI_INTERRUPT_BT_PRI_THRESH_S 27
100#define AR_MCI_INTERRUPT_BT_FREQ 0x10000000
101#define AR_MCI_INTERRUPT_BT_FREQ_S 28
102#define AR_MCI_INTERRUPT_BT_STOMP 0x20000000
103#define AR_MCI_INTERRUPT_BT_STOMP_S 29
104#define AR_MCI_INTERRUPT_BB_AIC_IRQ 0x40000000
105#define AR_MCI_INTERRUPT_BB_AIC_IRQ_S 30
106#define AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT 0x80000000
107#define AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT_S 31
108
109#define AR_MCI_REMOTE_CPU_INT 0x1830
110#define AR_MCI_REMOTE_CPU_INT_EN 0x1834
111#define AR_MCI_INTERRUPT_RX_MSG_RAW 0x1838
112#define AR_MCI_INTERRUPT_RX_MSG_EN 0x183c
113#define AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET 0x00000001
114#define AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET_S 0
115#define AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL 0x00000002
116#define AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL_S 1
117#define AR_MCI_INTERRUPT_RX_MSG_CONT_NACK 0x00000004
118#define AR_MCI_INTERRUPT_RX_MSG_CONT_NACK_S 2
119#define AR_MCI_INTERRUPT_RX_MSG_CONT_INFO 0x00000008
120#define AR_MCI_INTERRUPT_RX_MSG_CONT_INFO_S 3
121#define AR_MCI_INTERRUPT_RX_MSG_CONT_RST 0x00000010
122#define AR_MCI_INTERRUPT_RX_MSG_CONT_RST_S 4
123#define AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO 0x00000020
124#define AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO_S 5
125#define AR_MCI_INTERRUPT_RX_MSG_CPU_INT 0x00000040
126#define AR_MCI_INTERRUPT_RX_MSG_CPU_INT_S 6
127#define AR_MCI_INTERRUPT_RX_MSG_GPM 0x00000100
128#define AR_MCI_INTERRUPT_RX_MSG_GPM_S 8
129#define AR_MCI_INTERRUPT_RX_MSG_LNA_INFO 0x00000200
130#define AR_MCI_INTERRUPT_RX_MSG_LNA_INFO_S 9
131#define AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING 0x00000400
132#define AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING_S 10
133#define AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING 0x00000800
134#define AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING_S 11
135#define AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE 0x00001000
136#define AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE_S 12
137
138#define AR_MCI_CPU_INT 0x1840
139
140#define AR_MCI_RX_STATUS 0x1844
141#define AR_MCI_RX_LAST_SCHD_MSG_INDEX 0x00000F00
142#define AR_MCI_RX_LAST_SCHD_MSG_INDEX_S 8
143#define AR_MCI_RX_REMOTE_SLEEP 0x00001000
144#define AR_MCI_RX_REMOTE_SLEEP_S 12
145#define AR_MCI_RX_MCI_CLK_REQ 0x00002000
146#define AR_MCI_RX_MCI_CLK_REQ_S 13
147
148#define AR_MCI_CONT_STATUS 0x1848
149#define AR_MCI_CONT_RSSI_POWER 0x000000FF
150#define AR_MCI_CONT_RSSI_POWER_S 0
151#define AR_MCI_CONT_PRIORITY 0x0000FF00
152#define AR_MCI_CONT_PRIORITY_S 8
153#define AR_MCI_CONT_TXRX 0x00010000
154#define AR_MCI_CONT_TXRX_S 16
155
156#define AR_MCI_BT_PRI0 0x184c
157#define AR_MCI_BT_PRI1 0x1850
158#define AR_MCI_BT_PRI2 0x1854
159#define AR_MCI_BT_PRI3 0x1858
160#define AR_MCI_BT_PRI 0x185c
161#define AR_MCI_WL_FREQ0 0x1860
162#define AR_MCI_WL_FREQ1 0x1864
163#define AR_MCI_WL_FREQ2 0x1868
164#define AR_MCI_GAIN 0x186c
165#define AR_MCI_WBTIMER1 0x1870
166#define AR_MCI_WBTIMER2 0x1874
167#define AR_MCI_WBTIMER3 0x1878
168#define AR_MCI_WBTIMER4 0x187c
169#define AR_MCI_MAXGAIN 0x1880
170#define AR_MCI_HW_SCHD_TBL_CTL 0x1884
171#define AR_MCI_HW_SCHD_TBL_D0 0x1888
172#define AR_MCI_HW_SCHD_TBL_D1 0x188c
173#define AR_MCI_HW_SCHD_TBL_D2 0x1890
174#define AR_MCI_HW_SCHD_TBL_D3 0x1894
175#define AR_MCI_TX_PAYLOAD0 0x1898
176#define AR_MCI_TX_PAYLOAD1 0x189c
177#define AR_MCI_TX_PAYLOAD2 0x18a0
178#define AR_MCI_TX_PAYLOAD3 0x18a4
179#define AR_BTCOEX_WBTIMER 0x18a8
180
181#define AR_BTCOEX_CTRL 0x18ac
182#define AR_BTCOEX_CTRL_AR9462_MODE 0x00000001
183#define AR_BTCOEX_CTRL_AR9462_MODE_S 0
184#define AR_BTCOEX_CTRL_WBTIMER_EN 0x00000002
185#define AR_BTCOEX_CTRL_WBTIMER_EN_S 1
186#define AR_BTCOEX_CTRL_MCI_MODE_EN 0x00000004
187#define AR_BTCOEX_CTRL_MCI_MODE_EN_S 2
188#define AR_BTCOEX_CTRL_LNA_SHARED 0x00000008
189#define AR_BTCOEX_CTRL_LNA_SHARED_S 3
190#define AR_BTCOEX_CTRL_PA_SHARED 0x00000010
191#define AR_BTCOEX_CTRL_PA_SHARED_S 4
192#define AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN 0x00000020
193#define AR_BTCOEX_CTRL_ONE_STEP_LOOK_AHEAD_EN_S 5
194#define AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN 0x00000040
195#define AR_BTCOEX_CTRL_TIME_TO_NEXT_BT_THRESH_EN_S 6
196#define AR_BTCOEX_CTRL_NUM_ANTENNAS 0x00000180
197#define AR_BTCOEX_CTRL_NUM_ANTENNAS_S 7
198#define AR_BTCOEX_CTRL_RX_CHAIN_MASK 0x00000E00
199#define AR_BTCOEX_CTRL_RX_CHAIN_MASK_S 9
200#define AR_BTCOEX_CTRL_AGGR_THRESH 0x00007000
201#define AR_BTCOEX_CTRL_AGGR_THRESH_S 12
202#define AR_BTCOEX_CTRL_1_CHAIN_BCN 0x00080000
203#define AR_BTCOEX_CTRL_1_CHAIN_BCN_S 19
204#define AR_BTCOEX_CTRL_1_CHAIN_ACK 0x00100000
205#define AR_BTCOEX_CTRL_1_CHAIN_ACK_S 20
206#define AR_BTCOEX_CTRL_WAIT_BA_MARGIN 0x1FE00000
207#define AR_BTCOEX_CTRL_WAIT_BA_MARGIN_S 28
208#define AR_BTCOEX_CTRL_REDUCE_TXPWR 0x20000000
209#define AR_BTCOEX_CTRL_REDUCE_TXPWR_S 29
210#define AR_BTCOEX_CTRL_SPDT_ENABLE_10 0x40000000
211#define AR_BTCOEX_CTRL_SPDT_ENABLE_10_S 30
212#define AR_BTCOEX_CTRL_SPDT_POLARITY 0x80000000
213#define AR_BTCOEX_CTRL_SPDT_POLARITY_S 31
214
215#define AR_BTCOEX_WL_WEIGHTS0 0x18b0
216#define AR_BTCOEX_WL_WEIGHTS1 0x18b4
217#define AR_BTCOEX_WL_WEIGHTS2 0x18b8
218#define AR_BTCOEX_WL_WEIGHTS3 0x18bc
219
220#define AR_BTCOEX_MAX_TXPWR(_x) (0x18c0 + ((_x) << 2))
221#define AR_BTCOEX_WL_LNA 0x1940
222#define AR_BTCOEX_RFGAIN_CTRL 0x1944
223#define AR_BTCOEX_WL_LNA_TIMEOUT 0x003FFFFF
224#define AR_BTCOEX_WL_LNA_TIMEOUT_S 0
225
226#define AR_BTCOEX_CTRL2 0x1948
227#define AR_BTCOEX_CTRL2_TXPWR_THRESH 0x0007F800
228#define AR_BTCOEX_CTRL2_TXPWR_THRESH_S 11
229#define AR_BTCOEX_CTRL2_TX_CHAIN_MASK 0x00380000
230#define AR_BTCOEX_CTRL2_TX_CHAIN_MASK_S 19
231#define AR_BTCOEX_CTRL2_RX_DEWEIGHT 0x00400000
232#define AR_BTCOEX_CTRL2_RX_DEWEIGHT_S 22
233#define AR_BTCOEX_CTRL2_GPIO_OBS_SEL 0x00800000
234#define AR_BTCOEX_CTRL2_GPIO_OBS_SEL_S 23
235#define AR_BTCOEX_CTRL2_MAC_BB_OBS_SEL 0x01000000
236#define AR_BTCOEX_CTRL2_MAC_BB_OBS_SEL_S 24
237#define AR_BTCOEX_CTRL2_DESC_BASED_TXPWR_ENABLE 0x02000000
238#define AR_BTCOEX_CTRL2_DESC_BASED_TXPWR_ENABLE_S 25
239
240#define AR_BTCOEX_CTRL_SPDT_ENABLE 0x00000001
241#define AR_BTCOEX_CTRL_SPDT_ENABLE_S 0
242#define AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL 0x00000002
243#define AR_BTCOEX_CTRL_BT_OWN_SPDT_CTRL_S 1
244#define AR_BTCOEX_CTRL_USE_LATCHED_BT_ANT 0x00000004
245#define AR_BTCOEX_CTRL_USE_LATCHED_BT_ANT_S 2
246#define AR_GLB_WLAN_UART_INTF_EN 0x00020000
247#define AR_GLB_WLAN_UART_INTF_EN_S 17
248#define AR_GLB_DS_JTAG_DISABLE 0x00040000
249#define AR_GLB_DS_JTAG_DISABLE_S 18
250
251#define AR_BTCOEX_RC 0x194c
252#define AR_BTCOEX_MAX_RFGAIN(_x) (0x1950 + ((_x) << 2))
253#define AR_BTCOEX_DBG 0x1a50
254#define AR_MCI_LAST_HW_MSG_HDR 0x1a54
255#define AR_MCI_LAST_HW_MSG_BDY 0x1a58
256
257#define AR_MCI_SCHD_TABLE_2 0x1a5c
258#define AR_MCI_SCHD_TABLE_2_MEM_BASED 0x00000001
259#define AR_MCI_SCHD_TABLE_2_MEM_BASED_S 0
260#define AR_MCI_SCHD_TABLE_2_HW_BASED 0x00000002
261#define AR_MCI_SCHD_TABLE_2_HW_BASED_S 1
262
263#define AR_BTCOEX_CTRL3 0x1a60
264#define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT 0x00000fff
265#define AR_BTCOEX_CTRL3_CONT_INFO_TIMEOUT_S 0
266
267#define AR_GLB_SWREG_DISCONT_MODE 0x2002c
268#define AR_GLB_SWREG_DISCONT_EN_BT_WLAN 0x3
269
270#define AR_MCI_MISC 0x1a74
271#define AR_MCI_MISC_HW_FIX_EN 0x00000001
272#define AR_MCI_MISC_HW_FIX_EN_S 0
273
274#define AR_MCI_DBG_CNT_CTRL 0x1a78
275#define AR_MCI_DBG_CNT_CTRL_ENABLE 0x00000001
276#define AR_MCI_DBG_CNT_CTRL_ENABLE_S 0
277#define AR_MCI_DBG_CNT_CTRL_BT_LINKID 0x000007f8
278#define AR_MCI_DBG_CNT_CTRL_BT_LINKID_S 3
279
280#define MCI_STAT_ALL_BT_LINKID 0xffff
281
282#define AR_MCI_INTERRUPT_DEFAULT (AR_MCI_INTERRUPT_SW_MSG_DONE | \
283 AR_MCI_INTERRUPT_RX_INVALID_HDR | \
284 AR_MCI_INTERRUPT_RX_HW_MSG_FAIL | \
285 AR_MCI_INTERRUPT_RX_SW_MSG_FAIL | \
286 AR_MCI_INTERRUPT_TX_HW_MSG_FAIL | \
287 AR_MCI_INTERRUPT_TX_SW_MSG_FAIL | \
288 AR_MCI_INTERRUPT_RX_MSG | \
289 AR_MCI_INTERRUPT_REMOTE_SLEEP_UPDATE | \
290 AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)
291
292#define AR_MCI_INTERRUPT_MSG_FAIL_MASK (AR_MCI_INTERRUPT_RX_HW_MSG_FAIL | \
293 AR_MCI_INTERRUPT_RX_SW_MSG_FAIL | \
294 AR_MCI_INTERRUPT_TX_HW_MSG_FAIL | \
295 AR_MCI_INTERRUPT_TX_SW_MSG_FAIL)
296
297#define AR_MCI_INTERRUPT_RX_HW_MSG_MASK (AR_MCI_INTERRUPT_RX_MSG_SCHD_INFO | \
298 AR_MCI_INTERRUPT_RX_MSG_LNA_CONTROL | \
299 AR_MCI_INTERRUPT_RX_MSG_LNA_INFO | \
300 AR_MCI_INTERRUPT_RX_MSG_CONT_NACK | \
301 AR_MCI_INTERRUPT_RX_MSG_CONT_INFO | \
302 AR_MCI_INTERRUPT_RX_MSG_CONT_RST)
303
304#define AR_MCI_INTERRUPT_RX_MSG_DEFAULT (AR_MCI_INTERRUPT_RX_MSG_GPM | \
305 AR_MCI_INTERRUPT_RX_MSG_REMOTE_RESET | \
306 AR_MCI_INTERRUPT_RX_MSG_SYS_WAKING | \
307 AR_MCI_INTERRUPT_RX_MSG_SYS_SLEEPING | \
308 AR_MCI_INTERRUPT_RX_MSG_REQ_WAKE)
309
310#endif /* REG_MCI_H */
diff --git a/drivers/net/wireless/ath/ath9k/reg_wow.h b/drivers/net/wireless/ath/ath9k/reg_wow.h
index 3abfca56ca58..453054078cc4 100644
--- a/drivers/net/wireless/ath/ath9k/reg_wow.h
+++ b/drivers/net/wireless/ath/ath9k/reg_wow.h
@@ -72,7 +72,7 @@
72#define AR_WOW_MAC_INTR_EN 0x00040000 72#define AR_WOW_MAC_INTR_EN 0x00040000
73#define AR_WOW_MAGIC_EN 0x00010000 73#define AR_WOW_MAGIC_EN 0x00010000
74#define AR_WOW_PATTERN_EN(x) (x & 0xff) 74#define AR_WOW_PATTERN_EN(x) (x & 0xff)
75#define AR_WOW_PAT_FOUND_SHIFT 8 75#define AR_WOW_PAT_FOUND_SHIFT 8
76#define AR_WOW_PATTERN_FOUND(x) (x & (0xff << AR_WOW_PAT_FOUND_SHIFT)) 76#define AR_WOW_PATTERN_FOUND(x) (x & (0xff << AR_WOW_PAT_FOUND_SHIFT))
77#define AR_WOW_PATTERN_FOUND_MASK ((0xff) << AR_WOW_PAT_FOUND_SHIFT) 77#define AR_WOW_PATTERN_FOUND_MASK ((0xff) << AR_WOW_PAT_FOUND_SHIFT)
78#define AR_WOW_MAGIC_PAT_FOUND 0x00020000 78#define AR_WOW_MAGIC_PAT_FOUND 0x00020000
@@ -90,6 +90,14 @@
90 AR_WOW_BEACON_FAIL | \ 90 AR_WOW_BEACON_FAIL | \
91 AR_WOW_KEEP_ALIVE_FAIL)) 91 AR_WOW_KEEP_ALIVE_FAIL))
92 92
93#define AR_WOW2_PATTERN_EN(x) ((x & 0xff) << 0)
94#define AR_WOW2_PATTERN_FOUND_SHIFT 8
95#define AR_WOW2_PATTERN_FOUND(x) (x & (0xff << AR_WOW2_PATTERN_FOUND_SHIFT))
96#define AR_WOW2_PATTERN_FOUND_MASK ((0xff) << AR_WOW2_PATTERN_FOUND_SHIFT)
97
98#define AR_WOW_STATUS2(x) (x & AR_WOW2_PATTERN_FOUND_MASK)
99#define AR_WOW_CLEAR_EVENTS2(x) (x & ~(AR_WOW2_PATTERN_EN(0xff)))
100
93#define AR_WOW_AIFS_CNT(x) (x & 0xff) 101#define AR_WOW_AIFS_CNT(x) (x & 0xff)
94#define AR_WOW_SLOT_CNT(x) ((x & 0xff) << 8) 102#define AR_WOW_SLOT_CNT(x) ((x & 0xff) << 8)
95#define AR_WOW_KEEP_ALIVE_CNT(x) ((x & 0xff) << 16) 103#define AR_WOW_KEEP_ALIVE_CNT(x) ((x & 0xff) << 16)
diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c
index 65c8894c5f81..ca533b4321bd 100644
--- a/drivers/net/wireless/ath/ath9k/wmi.c
+++ b/drivers/net/wireless/ath/ath9k/wmi.c
@@ -61,6 +61,8 @@ static const char *wmi_cmd_to_name(enum wmi_cmd_id wmi_cmd)
61 return "WMI_REG_READ_CMDID"; 61 return "WMI_REG_READ_CMDID";
62 case WMI_REG_WRITE_CMDID: 62 case WMI_REG_WRITE_CMDID:
63 return "WMI_REG_WRITE_CMDID"; 63 return "WMI_REG_WRITE_CMDID";
64 case WMI_REG_RMW_CMDID:
65 return "WMI_REG_RMW_CMDID";
64 case WMI_RC_STATE_CHANGE_CMDID: 66 case WMI_RC_STATE_CHANGE_CMDID:
65 return "WMI_RC_STATE_CHANGE_CMDID"; 67 return "WMI_RC_STATE_CHANGE_CMDID";
66 case WMI_RC_RATE_UPDATE_CMDID: 68 case WMI_RC_RATE_UPDATE_CMDID:
@@ -101,6 +103,7 @@ struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv)
101 spin_lock_init(&wmi->event_lock); 103 spin_lock_init(&wmi->event_lock);
102 mutex_init(&wmi->op_mutex); 104 mutex_init(&wmi->op_mutex);
103 mutex_init(&wmi->multi_write_mutex); 105 mutex_init(&wmi->multi_write_mutex);
106 mutex_init(&wmi->multi_rmw_mutex);
104 init_completion(&wmi->cmd_wait); 107 init_completion(&wmi->cmd_wait);
105 INIT_LIST_HEAD(&wmi->pending_tx_events); 108 INIT_LIST_HEAD(&wmi->pending_tx_events);
106 tasklet_init(&wmi->wmi_event_tasklet, ath9k_wmi_event_tasklet, 109 tasklet_init(&wmi->wmi_event_tasklet, ath9k_wmi_event_tasklet,
@@ -224,7 +227,7 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
224 227
225 /* Check if there has been a timeout. */ 228 /* Check if there has been a timeout. */
226 spin_lock(&wmi->wmi_lock); 229 spin_lock(&wmi->wmi_lock);
227 if (cmd_id != wmi->last_cmd_id) { 230 if (be16_to_cpu(hdr->seq_no) != wmi->last_seq_id) {
228 spin_unlock(&wmi->wmi_lock); 231 spin_unlock(&wmi->wmi_lock);
229 goto free_skb; 232 goto free_skb;
230 } 233 }
@@ -272,11 +275,16 @@ static int ath9k_wmi_cmd_issue(struct wmi *wmi,
272 enum wmi_cmd_id cmd, u16 len) 275 enum wmi_cmd_id cmd, u16 len)
273{ 276{
274 struct wmi_cmd_hdr *hdr; 277 struct wmi_cmd_hdr *hdr;
278 unsigned long flags;
275 279
276 hdr = (struct wmi_cmd_hdr *) skb_push(skb, sizeof(struct wmi_cmd_hdr)); 280 hdr = (struct wmi_cmd_hdr *) skb_push(skb, sizeof(struct wmi_cmd_hdr));
277 hdr->command_id = cpu_to_be16(cmd); 281 hdr->command_id = cpu_to_be16(cmd);
278 hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id); 282 hdr->seq_no = cpu_to_be16(++wmi->tx_seq_id);
279 283
284 spin_lock_irqsave(&wmi->wmi_lock, flags);
285 wmi->last_seq_id = wmi->tx_seq_id;
286 spin_unlock_irqrestore(&wmi->wmi_lock, flags);
287
280 return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid); 288 return htc_send_epid(wmi->htc, skb, wmi->ctrl_epid);
281} 289}
282 290
@@ -292,7 +300,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
292 struct sk_buff *skb; 300 struct sk_buff *skb;
293 u8 *data; 301 u8 *data;
294 int time_left, ret = 0; 302 int time_left, ret = 0;
295 unsigned long flags;
296 303
297 if (ah->ah_flags & AH_UNPLUGGED) 304 if (ah->ah_flags & AH_UNPLUGGED)
298 return 0; 305 return 0;
@@ -320,10 +327,6 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id,
320 wmi->cmd_rsp_buf = rsp_buf; 327 wmi->cmd_rsp_buf = rsp_buf;
321 wmi->cmd_rsp_len = rsp_len; 328 wmi->cmd_rsp_len = rsp_len;
322 329
323 spin_lock_irqsave(&wmi->wmi_lock, flags);
324 wmi->last_cmd_id = cmd_id;
325 spin_unlock_irqrestore(&wmi->wmi_lock, flags);
326
327 ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len); 330 ret = ath9k_wmi_cmd_issue(wmi, skb, cmd_id, cmd_len);
328 if (ret) 331 if (ret)
329 goto out; 332 goto out;
diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h
index 0db37f230018..380175d5ecd7 100644
--- a/drivers/net/wireless/ath/ath9k/wmi.h
+++ b/drivers/net/wireless/ath/ath9k/wmi.h
@@ -112,6 +112,7 @@ enum wmi_cmd_id {
112 WMI_TX_STATS_CMDID, 112 WMI_TX_STATS_CMDID,
113 WMI_RX_STATS_CMDID, 113 WMI_RX_STATS_CMDID,
114 WMI_BITRATE_MASK_CMDID, 114 WMI_BITRATE_MASK_CMDID,
115 WMI_REG_RMW_CMDID,
115}; 116};
116 117
117enum wmi_event_id { 118enum wmi_event_id {
@@ -125,12 +126,19 @@ enum wmi_event_id {
125}; 126};
126 127
127#define MAX_CMD_NUMBER 62 128#define MAX_CMD_NUMBER 62
129#define MAX_RMW_CMD_NUMBER 15
128 130
129struct register_write { 131struct register_write {
130 __be32 reg; 132 __be32 reg;
131 __be32 val; 133 __be32 val;
132}; 134};
133 135
136struct register_rmw {
137 __be32 reg;
138 __be32 set;
139 __be32 clr;
140} __packed;
141
134struct ath9k_htc_tx_event { 142struct ath9k_htc_tx_event {
135 int count; 143 int count;
136 struct __wmi_event_txstatus txs; 144 struct __wmi_event_txstatus txs;
@@ -143,7 +151,7 @@ struct wmi {
143 enum htc_endpoint_id ctrl_epid; 151 enum htc_endpoint_id ctrl_epid;
144 struct mutex op_mutex; 152 struct mutex op_mutex;
145 struct completion cmd_wait; 153 struct completion cmd_wait;
146 enum wmi_cmd_id last_cmd_id; 154 u16 last_seq_id;
147 struct sk_buff_head wmi_event_queue; 155 struct sk_buff_head wmi_event_queue;
148 struct tasklet_struct wmi_event_tasklet; 156 struct tasklet_struct wmi_event_tasklet;
149 u16 tx_seq_id; 157 u16 tx_seq_id;
@@ -156,10 +164,18 @@ struct wmi {
156 164
157 spinlock_t wmi_lock; 165 spinlock_t wmi_lock;
158 166
167 /* multi write section */
159 atomic_t mwrite_cnt; 168 atomic_t mwrite_cnt;
160 struct register_write multi_write[MAX_CMD_NUMBER]; 169 struct register_write multi_write[MAX_CMD_NUMBER];
161 u32 multi_write_idx; 170 u32 multi_write_idx;
162 struct mutex multi_write_mutex; 171 struct mutex multi_write_mutex;
172
173 /* multi rmw section */
174 atomic_t m_rmw_cnt;
175 struct register_rmw multi_rmw[MAX_RMW_CMD_NUMBER];
176 u32 multi_rmw_idx;
177 struct mutex multi_rmw_mutex;
178
163}; 179};
164 180
165struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv); 181struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv);
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 1b8e75c4d2c2..0acd079ba96b 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -1103,14 +1103,28 @@ static u8 ath_get_rate_txpower(struct ath_softc *sc, struct ath_buf *bf,
1103 struct sk_buff *skb; 1103 struct sk_buff *skb;
1104 struct ath_frame_info *fi; 1104 struct ath_frame_info *fi;
1105 struct ieee80211_tx_info *info; 1105 struct ieee80211_tx_info *info;
1106 struct ieee80211_vif *vif;
1106 struct ath_hw *ah = sc->sc_ah; 1107 struct ath_hw *ah = sc->sc_ah;
1107 1108
1108 if (sc->tx99_state || !ah->tpc_enabled) 1109 if (sc->tx99_state || !ah->tpc_enabled)
1109 return MAX_RATE_POWER; 1110 return MAX_RATE_POWER;
1110 1111
1111 skb = bf->bf_mpdu; 1112 skb = bf->bf_mpdu;
1112 fi = get_frame_info(skb);
1113 info = IEEE80211_SKB_CB(skb); 1113 info = IEEE80211_SKB_CB(skb);
1114 vif = info->control.vif;
1115
1116 if (!vif) {
1117 max_power = sc->cur_chan->cur_txpower;
1118 goto out;
1119 }
1120
1121 if (vif->bss_conf.txpower_type != NL80211_TX_POWER_LIMITED) {
1122 max_power = min_t(u8, sc->cur_chan->cur_txpower,
1123 2 * vif->bss_conf.txpower);
1124 goto out;
1125 }
1126
1127 fi = get_frame_info(skb);
1114 1128
1115 if (!AR_SREV_9300_20_OR_LATER(ah)) { 1129 if (!AR_SREV_9300_20_OR_LATER(ah)) {
1116 int txpower = fi->tx_power; 1130 int txpower = fi->tx_power;
@@ -1147,25 +1161,25 @@ static u8 ath_get_rate_txpower(struct ath_softc *sc, struct ath_buf *bf,
1147 txpower -= 2; 1161 txpower -= 2;
1148 1162
1149 txpower = max(txpower, 0); 1163 txpower = max(txpower, 0);
1150 max_power = min_t(u8, ah->tx_power[rateidx], txpower); 1164 max_power = min_t(u8, ah->tx_power[rateidx],
1151 1165 2 * vif->bss_conf.txpower);
1152 /* XXX: clamp minimum TX power at 1 for AR9160 since if 1166 max_power = min_t(u8, max_power, txpower);
1153 * max_power is set to 0, frames are transmitted at max
1154 * TX power
1155 */
1156 if (!max_power && !AR_SREV_9280_20_OR_LATER(ah))
1157 max_power = 1;
1158 } else if (!bf->bf_state.bfs_paprd) { 1167 } else if (!bf->bf_state.bfs_paprd) {
1159 if (rateidx < 8 && (info->flags & IEEE80211_TX_CTL_STBC)) 1168 if (rateidx < 8 && (info->flags & IEEE80211_TX_CTL_STBC))
1160 max_power = min(ah->tx_power_stbc[rateidx], 1169 max_power = min_t(u8, ah->tx_power_stbc[rateidx],
1161 fi->tx_power); 1170 2 * vif->bss_conf.txpower);
1162 else 1171 else
1163 max_power = min(ah->tx_power[rateidx], fi->tx_power); 1172 max_power = min_t(u8, ah->tx_power[rateidx],
1173 2 * vif->bss_conf.txpower);
1174 max_power = min(max_power, fi->tx_power);
1164 } else { 1175 } else {
1165 max_power = ah->paprd_training_power; 1176 max_power = ah->paprd_training_power;
1166 } 1177 }
1167 1178out:
1168 return max_power; 1179 /* XXX: clamp minimum TX power at 1 for AR9160 since if max_power
1180 * is set to 0, frames are transmitted at max TX power
1181 */
1182 return (!max_power && !AR_SREV_9280_20_OR_LATER(ah)) ? 1 : max_power;
1169} 1183}
1170 1184
1171static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf, 1185static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf,
diff --git a/drivers/net/wireless/ath/dfs_pattern_detector.c b/drivers/net/wireless/ath/dfs_pattern_detector.c
index 3d57f8772389..c657ca26a71a 100644
--- a/drivers/net/wireless/ath/dfs_pattern_detector.c
+++ b/drivers/net/wireless/ath/dfs_pattern_detector.c
@@ -289,7 +289,7 @@ dpd_add_pulse(struct dfs_pattern_detector *dpd, struct pulse_event *event)
289 "count=%d, count_false=%d\n", 289 "count=%d, count_false=%d\n",
290 event->freq, pd->rs->type_id, 290 event->freq, pd->rs->type_id,
291 ps->pri, ps->count, ps->count_falses); 291 ps->pri, ps->count, ps->count_falses);
292 channel_detector_reset(dpd, cd); 292 pd->reset(pd, dpd->last_pulse_ts);
293 return true; 293 return true;
294 } 294 }
295 } 295 }
diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
index 2d5ea21be47e..b97172667bc7 100644
--- a/drivers/net/wireless/ath/wil6210/cfg80211.c
+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
@@ -14,6 +14,7 @@
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */ 15 */
16 16
17#include <linux/etherdevice.h>
17#include "wil6210.h" 18#include "wil6210.h"
18#include "wmi.h" 19#include "wmi.h"
19 20
@@ -217,7 +218,7 @@ static int wil_cfg80211_dump_station(struct wiphy *wiphy,
217 if (cid < 0) 218 if (cid < 0)
218 return -ENOENT; 219 return -ENOENT;
219 220
220 memcpy(mac, wil->sta[cid].addr, ETH_ALEN); 221 ether_addr_copy(mac, wil->sta[cid].addr);
221 wil_dbg_misc(wil, "%s(%pM) CID %d\n", __func__, mac, cid); 222 wil_dbg_misc(wil, "%s(%pM) CID %d\n", __func__, mac, cid);
222 223
223 rc = wil_cid_fill_sinfo(wil, cid, sinfo); 224 rc = wil_cid_fill_sinfo(wil, cid, sinfo);
@@ -387,15 +388,29 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
387 int ch; 388 int ch;
388 int rc = 0; 389 int rc = 0;
389 390
391 wil_print_connect_params(wil, sme);
392
390 if (test_bit(wil_status_fwconnecting, wil->status) || 393 if (test_bit(wil_status_fwconnecting, wil->status) ||
391 test_bit(wil_status_fwconnected, wil->status)) 394 test_bit(wil_status_fwconnected, wil->status))
392 return -EALREADY; 395 return -EALREADY;
393 396
394 wil_print_connect_params(wil, sme); 397 if (sme->ie_len > WMI_MAX_IE_LEN) {
398 wil_err(wil, "IE too large (%td bytes)\n", sme->ie_len);
399 return -ERANGE;
400 }
401
402 rsn_eid = sme->ie ?
403 cfg80211_find_ie(WLAN_EID_RSN, sme->ie, sme->ie_len) :
404 NULL;
405
406 if (sme->privacy && !rsn_eid) {
407 wil_err(wil, "Missing RSN IE for secure connection\n");
408 return -EINVAL;
409 }
395 410
396 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid, 411 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid,
397 sme->ssid, sme->ssid_len, 412 sme->ssid, sme->ssid_len,
398 WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); 413 IEEE80211_BSS_TYPE_ESS, IEEE80211_PRIVACY_ANY);
399 if (!bss) { 414 if (!bss) {
400 wil_err(wil, "Unable to find BSS\n"); 415 wil_err(wil, "Unable to find BSS\n");
401 return -ENOENT; 416 return -ENOENT;
@@ -407,17 +422,9 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
407 rc = -ENOENT; 422 rc = -ENOENT;
408 goto out; 423 goto out;
409 } 424 }
425 wil->privacy = sme->privacy;
410 426
411 rsn_eid = sme->ie ? 427 if (wil->privacy) {
412 cfg80211_find_ie(WLAN_EID_RSN, sme->ie, sme->ie_len) :
413 NULL;
414 if (rsn_eid) {
415 if (sme->ie_len > WMI_MAX_IE_LEN) {
416 rc = -ERANGE;
417 wil_err(wil, "IE too large (%td bytes)\n",
418 sme->ie_len);
419 goto out;
420 }
421 /* For secure assoc, send WMI_DELETE_CIPHER_KEY_CMD */ 428 /* For secure assoc, send WMI_DELETE_CIPHER_KEY_CMD */
422 rc = wmi_del_cipher_key(wil, 0, bss->bssid); 429 rc = wmi_del_cipher_key(wil, 0, bss->bssid);
423 if (rc) { 430 if (rc) {
@@ -450,7 +457,7 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
450 bss->capability); 457 bss->capability);
451 goto out; 458 goto out;
452 } 459 }
453 if (rsn_eid) { 460 if (wil->privacy) {
454 conn.dot11_auth_mode = WMI_AUTH11_SHARED; 461 conn.dot11_auth_mode = WMI_AUTH11_SHARED;
455 conn.auth_mode = WMI_AUTH_WPA2_PSK; 462 conn.auth_mode = WMI_AUTH_WPA2_PSK;
456 conn.pairwise_crypto_type = WMI_CRYPT_AES_GCMP; 463 conn.pairwise_crypto_type = WMI_CRYPT_AES_GCMP;
@@ -472,8 +479,8 @@ static int wil_cfg80211_connect(struct wiphy *wiphy,
472 } 479 }
473 conn.channel = ch - 1; 480 conn.channel = ch - 1;
474 481
475 memcpy(conn.bssid, bss->bssid, ETH_ALEN); 482 ether_addr_copy(conn.bssid, bss->bssid);
476 memcpy(conn.dst_mac, bss->bssid, ETH_ALEN); 483 ether_addr_copy(conn.dst_mac, bss->bssid);
477 484
478 set_bit(wil_status_fwconnecting, wil->status); 485 set_bit(wil_status_fwconnecting, wil->status);
479 486
@@ -769,15 +776,24 @@ static int wil_cfg80211_start_ap(struct wiphy *wiphy,
769 wmi_set_ie(wil, WMI_FRAME_ASSOC_RESP, bcon->assocresp_ies_len, 776 wmi_set_ie(wil, WMI_FRAME_ASSOC_RESP, bcon->assocresp_ies_len,
770 bcon->assocresp_ies); 777 bcon->assocresp_ies);
771 778
772 wil->secure_pcp = info->privacy; 779 wil->privacy = info->privacy;
773 780
774 netif_carrier_on(ndev); 781 netif_carrier_on(ndev);
775 782
776 rc = wmi_pcp_start(wil, info->beacon_interval, wmi_nettype, 783 rc = wmi_pcp_start(wil, info->beacon_interval, wmi_nettype,
777 channel->hw_value); 784 channel->hw_value);
778 if (rc) 785 if (rc)
779 netif_carrier_off(ndev); 786 goto err_pcp_start;
787
788 rc = wil_bcast_init(wil);
789 if (rc)
790 goto err_bcast;
780 791
792 goto out; /* success */
793err_bcast:
794 wmi_pcp_stop(wil);
795err_pcp_start:
796 netif_carrier_off(ndev);
781out: 797out:
782 mutex_unlock(&wil->mutex); 798 mutex_unlock(&wil->mutex);
783 return rc; 799 return rc;
@@ -911,6 +927,21 @@ static int wil_cfg80211_probe_client(struct wiphy *wiphy,
911 return 0; 927 return 0;
912} 928}
913 929
930static int wil_cfg80211_change_bss(struct wiphy *wiphy,
931 struct net_device *dev,
932 struct bss_parameters *params)
933{
934 struct wil6210_priv *wil = wiphy_to_wil(wiphy);
935
936 if (params->ap_isolate >= 0) {
937 wil_dbg_misc(wil, "%s(ap_isolate %d => %d)\n", __func__,
938 wil->ap_isolate, params->ap_isolate);
939 wil->ap_isolate = params->ap_isolate;
940 }
941
942 return 0;
943}
944
914static struct cfg80211_ops wil_cfg80211_ops = { 945static struct cfg80211_ops wil_cfg80211_ops = {
915 .scan = wil_cfg80211_scan, 946 .scan = wil_cfg80211_scan,
916 .connect = wil_cfg80211_connect, 947 .connect = wil_cfg80211_connect,
@@ -931,6 +962,7 @@ static struct cfg80211_ops wil_cfg80211_ops = {
931 .stop_ap = wil_cfg80211_stop_ap, 962 .stop_ap = wil_cfg80211_stop_ap,
932 .del_station = wil_cfg80211_del_station, 963 .del_station = wil_cfg80211_del_station,
933 .probe_client = wil_cfg80211_probe_client, 964 .probe_client = wil_cfg80211_probe_client,
965 .change_bss = wil_cfg80211_change_bss,
934}; 966};
935 967
936static void wil_wiphy_init(struct wiphy *wiphy) 968static void wil_wiphy_init(struct wiphy *wiphy)
diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c
index 45c3558ec804..bbc22d88f78f 100644
--- a/drivers/net/wireless/ath/wil6210/debugfs.c
+++ b/drivers/net/wireless/ath/wil6210/debugfs.c
@@ -29,6 +29,7 @@
29static u32 mem_addr; 29static u32 mem_addr;
30static u32 dbg_txdesc_index; 30static u32 dbg_txdesc_index;
31static u32 dbg_vring_index; /* 24+ for Rx, 0..23 for Tx */ 31static u32 dbg_vring_index; /* 24+ for Rx, 0..23 for Tx */
32u32 vring_idle_trsh = 16; /* HW fetches up to 16 descriptors at once */
32 33
33enum dbg_off_type { 34enum dbg_off_type {
34 doff_u32 = 0, 35 doff_u32 = 0,
@@ -102,23 +103,36 @@ static int wil_vring_debugfs_show(struct seq_file *s, void *data)
102 % vring->size; 103 % vring->size;
103 int avail = vring->size - used - 1; 104 int avail = vring->size - used - 1;
104 char name[10]; 105 char name[10];
106 char sidle[10];
105 /* performance monitoring */ 107 /* performance monitoring */
106 cycles_t now = get_cycles(); 108 cycles_t now = get_cycles();
107 uint64_t idle = txdata->idle * 100; 109 uint64_t idle = txdata->idle * 100;
108 uint64_t total = now - txdata->begin; 110 uint64_t total = now - txdata->begin;
109 111
110 do_div(idle, total); 112 if (total != 0) {
113 do_div(idle, total);
114 snprintf(sidle, sizeof(sidle), "%3d%%",
115 (int)idle);
116 } else {
117 snprintf(sidle, sizeof(sidle), "N/A");
118 }
111 txdata->begin = now; 119 txdata->begin = now;
112 txdata->idle = 0ULL; 120 txdata->idle = 0ULL;
113 121
114 snprintf(name, sizeof(name), "tx_%2d", i); 122 snprintf(name, sizeof(name), "tx_%2d", i);
115 123
116 seq_printf(s, 124 if (cid < WIL6210_MAX_CID)
117 "\n%pM CID %d TID %d BACK([%d] %d TU A%s) [%3d|%3d] idle %3d%%\n", 125 seq_printf(s,
118 wil->sta[cid].addr, cid, tid, 126 "\n%pM CID %d TID %d BACK([%u] %u TU A%s) [%3d|%3d] idle %s\n",
119 txdata->agg_wsize, txdata->agg_timeout, 127 wil->sta[cid].addr, cid, tid,
120 txdata->agg_amsdu ? "+" : "-", 128 txdata->agg_wsize,
121 used, avail, (int)idle); 129 txdata->agg_timeout,
130 txdata->agg_amsdu ? "+" : "-",
131 used, avail, sidle);
132 else
133 seq_printf(s,
134 "\nBroadcast [%3d|%3d] idle %s\n",
135 used, avail, sidle);
122 136
123 wil_print_vring(s, wil, name, vring, '_', 'H'); 137 wil_print_vring(s, wil, name, vring, '_', 'H');
124 } 138 }
@@ -549,7 +563,7 @@ static ssize_t wil_write_file_reset(struct file *file, const char __user *buf,
549 dev_close(ndev); 563 dev_close(ndev);
550 ndev->flags &= ~IFF_UP; 564 ndev->flags &= ~IFF_UP;
551 rtnl_unlock(); 565 rtnl_unlock();
552 wil_reset(wil); 566 wil_reset(wil, true);
553 567
554 return len; 568 return len;
555} 569}
@@ -618,7 +632,7 @@ static ssize_t wil_write_back(struct file *file, const char __user *buf,
618 struct wil6210_priv *wil = file->private_data; 632 struct wil6210_priv *wil = file->private_data;
619 int rc; 633 int rc;
620 char *kbuf = kmalloc(len + 1, GFP_KERNEL); 634 char *kbuf = kmalloc(len + 1, GFP_KERNEL);
621 char cmd[8]; 635 char cmd[9];
622 int p1, p2, p3; 636 int p1, p2, p3;
623 637
624 if (!kbuf) 638 if (!kbuf)
@@ -1392,11 +1406,12 @@ static void wil6210_debugfs_init_isr(struct wil6210_priv *wil,
1392 1406
1393/* fields in struct wil6210_priv */ 1407/* fields in struct wil6210_priv */
1394static const struct dbg_off dbg_wil_off[] = { 1408static const struct dbg_off dbg_wil_off[] = {
1395 WIL_FIELD(secure_pcp, S_IRUGO | S_IWUSR, doff_u32), 1409 WIL_FIELD(privacy, S_IRUGO, doff_u32),
1396 WIL_FIELD(status[0], S_IRUGO | S_IWUSR, doff_ulong), 1410 WIL_FIELD(status[0], S_IRUGO | S_IWUSR, doff_ulong),
1397 WIL_FIELD(fw_version, S_IRUGO, doff_u32), 1411 WIL_FIELD(fw_version, S_IRUGO, doff_u32),
1398 WIL_FIELD(hw_version, S_IRUGO, doff_x32), 1412 WIL_FIELD(hw_version, S_IRUGO, doff_x32),
1399 WIL_FIELD(recovery_count, S_IRUGO, doff_u32), 1413 WIL_FIELD(recovery_count, S_IRUGO, doff_u32),
1414 WIL_FIELD(ap_isolate, S_IRUGO, doff_u32),
1400 {}, 1415 {},
1401}; 1416};
1402 1417
@@ -1412,6 +1427,8 @@ static const struct dbg_off dbg_statics[] = {
1412 {"desc_index", S_IRUGO | S_IWUSR, (ulong)&dbg_txdesc_index, doff_u32}, 1427 {"desc_index", S_IRUGO | S_IWUSR, (ulong)&dbg_txdesc_index, doff_u32},
1413 {"vring_index", S_IRUGO | S_IWUSR, (ulong)&dbg_vring_index, doff_u32}, 1428 {"vring_index", S_IRUGO | S_IWUSR, (ulong)&dbg_vring_index, doff_u32},
1414 {"mem_addr", S_IRUGO | S_IWUSR, (ulong)&mem_addr, doff_u32}, 1429 {"mem_addr", S_IRUGO | S_IWUSR, (ulong)&mem_addr, doff_u32},
1430 {"vring_idle_trsh", S_IRUGO | S_IWUSR, (ulong)&vring_idle_trsh,
1431 doff_u32},
1415 {}, 1432 {},
1416}; 1433};
1417 1434
diff --git a/drivers/net/wireless/ath/wil6210/ethtool.c b/drivers/net/wireless/ath/wil6210/ethtool.c
index 4c44a82c34d7..0ea695ff98ad 100644
--- a/drivers/net/wireless/ath/wil6210/ethtool.c
+++ b/drivers/net/wireless/ath/wil6210/ethtool.c
@@ -50,27 +50,19 @@ static int wil_ethtoolops_get_coalesce(struct net_device *ndev,
50 50
51 wil_dbg_misc(wil, "%s()\n", __func__); 51 wil_dbg_misc(wil, "%s()\n", __func__);
52 52
53 if (test_bit(hw_capability_advanced_itr_moderation, 53 tx_itr_en = ioread32(wil->csr +
54 wil->hw_capabilities)) { 54 HOSTADDR(RGF_DMA_ITR_TX_CNT_CTL));
55 tx_itr_en = ioread32(wil->csr + 55 if (tx_itr_en & BIT_DMA_ITR_TX_CNT_CTL_EN)
56 HOSTADDR(RGF_DMA_ITR_TX_CNT_CTL)); 56 tx_itr_val =
57 if (tx_itr_en & BIT_DMA_ITR_TX_CNT_CTL_EN) 57 ioread32(wil->csr +
58 tx_itr_val = 58 HOSTADDR(RGF_DMA_ITR_TX_CNT_TRSH));
59 ioread32(wil->csr + 59
60 HOSTADDR(RGF_DMA_ITR_TX_CNT_TRSH)); 60 rx_itr_en = ioread32(wil->csr +
61 61 HOSTADDR(RGF_DMA_ITR_RX_CNT_CTL));
62 rx_itr_en = ioread32(wil->csr + 62 if (rx_itr_en & BIT_DMA_ITR_RX_CNT_CTL_EN)
63 HOSTADDR(RGF_DMA_ITR_RX_CNT_CTL)); 63 rx_itr_val =
64 if (rx_itr_en & BIT_DMA_ITR_RX_CNT_CTL_EN) 64 ioread32(wil->csr +
65 rx_itr_val = 65 HOSTADDR(RGF_DMA_ITR_RX_CNT_TRSH));
66 ioread32(wil->csr +
67 HOSTADDR(RGF_DMA_ITR_RX_CNT_TRSH));
68 } else {
69 rx_itr_en = ioread32(wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL));
70 if (rx_itr_en & BIT_DMA_ITR_CNT_CRL_EN)
71 rx_itr_val = ioread32(wil->csr +
72 HOSTADDR(RGF_DMA_ITR_CNT_TRSH));
73 }
74 66
75 cp->tx_coalesce_usecs = tx_itr_val; 67 cp->tx_coalesce_usecs = tx_itr_val;
76 cp->rx_coalesce_usecs = rx_itr_val; 68 cp->rx_coalesce_usecs = rx_itr_val;
diff --git a/drivers/net/wireless/ath/wil6210/fw.c b/drivers/net/wireless/ath/wil6210/fw.c
index 93c5cc16c515..4428345e5a47 100644
--- a/drivers/net/wireless/ath/wil6210/fw.c
+++ b/drivers/net/wireless/ath/wil6210/fw.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2014 Qualcomm Atheros, Inc. 2 * Copyright (c) 2014-2015 Qualcomm Atheros, Inc.
3 * 3 *
4 * Permission to use, copy, modify, and/or distribute this software for any 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 5 * purpose with or without fee is hereby granted, provided that the above
@@ -20,6 +20,7 @@
20#include "fw.h" 20#include "fw.h"
21 21
22MODULE_FIRMWARE(WIL_FW_NAME); 22MODULE_FIRMWARE(WIL_FW_NAME);
23MODULE_FIRMWARE(WIL_FW2_NAME);
23 24
24/* target operations */ 25/* target operations */
25/* register read */ 26/* register read */
diff --git a/drivers/net/wireless/ath/wil6210/fw_inc.c b/drivers/net/wireless/ath/wil6210/fw_inc.c
index d4acf93a9a02..157f5ef384e0 100644
--- a/drivers/net/wireless/ath/wil6210/fw_inc.c
+++ b/drivers/net/wireless/ath/wil6210/fw_inc.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2014 Qualcomm Atheros, Inc. 2 * Copyright (c) 2014-2015 Qualcomm Atheros, Inc.
3 * 3 *
4 * Permission to use, copy, modify, and/or distribute this software for any 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 5 * purpose with or without fee is hereby granted, provided that the above
@@ -451,8 +451,6 @@ static int wil_fw_load(struct wil6210_priv *wil, const void *data, size_t size)
451 } 451 }
452 return -EINVAL; 452 return -EINVAL;
453 } 453 }
454 /* Mark FW as loaded from host */
455 S(RGF_USER_USAGE_6, 1);
456 454
457 return rc; 455 return rc;
458} 456}
diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c
index a6f923086f31..28ffc18466c4 100644
--- a/drivers/net/wireless/ath/wil6210/interrupt.c
+++ b/drivers/net/wireless/ath/wil6210/interrupt.c
@@ -166,9 +166,16 @@ void wil_unmask_irq(struct wil6210_priv *wil)
166/* target write operation */ 166/* target write operation */
167#define W(a, v) do { iowrite32(v, wil->csr + HOSTADDR(a)); wmb(); } while (0) 167#define W(a, v) do { iowrite32(v, wil->csr + HOSTADDR(a)); wmb(); } while (0)
168 168
169static 169void wil_configure_interrupt_moderation(struct wil6210_priv *wil)
170void wil_configure_interrupt_moderation_new(struct wil6210_priv *wil)
171{ 170{
171 wil_dbg_irq(wil, "%s()\n", __func__);
172
173 /* disable interrupt moderation for monitor
174 * to get better timestamp precision
175 */
176 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR)
177 return;
178
172 /* Disable and clear tx counter before (re)configuration */ 179 /* Disable and clear tx counter before (re)configuration */
173 W(RGF_DMA_ITR_TX_CNT_CTL, BIT_DMA_ITR_TX_CNT_CTL_CLR); 180 W(RGF_DMA_ITR_TX_CNT_CTL, BIT_DMA_ITR_TX_CNT_CTL_CLR);
174 W(RGF_DMA_ITR_TX_CNT_TRSH, wil->tx_max_burst_duration); 181 W(RGF_DMA_ITR_TX_CNT_TRSH, wil->tx_max_burst_duration);
@@ -206,42 +213,8 @@ void wil_configure_interrupt_moderation_new(struct wil6210_priv *wil)
206 BIT_DMA_ITR_RX_IDL_CNT_CTL_EXT_TIC_SEL); 213 BIT_DMA_ITR_RX_IDL_CNT_CTL_EXT_TIC_SEL);
207} 214}
208 215
209static
210void wil_configure_interrupt_moderation_lgc(struct wil6210_priv *wil)
211{
212 /* disable, use usec resolution */
213 W(RGF_DMA_ITR_CNT_CRL, BIT_DMA_ITR_CNT_CRL_CLR);
214
215 wil_info(wil, "set ITR_TRSH = %d usec\n", wil->rx_max_burst_duration);
216 W(RGF_DMA_ITR_CNT_TRSH, wil->rx_max_burst_duration);
217 /* start it */
218 W(RGF_DMA_ITR_CNT_CRL,
219 BIT_DMA_ITR_CNT_CRL_EN | BIT_DMA_ITR_CNT_CRL_EXT_TICK);
220}
221
222#undef W 216#undef W
223 217
224void wil_configure_interrupt_moderation(struct wil6210_priv *wil)
225{
226 wil_dbg_irq(wil, "%s()\n", __func__);
227
228 /* disable interrupt moderation for monitor
229 * to get better timestamp precision
230 */
231 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR)
232 return;
233
234 if (test_bit(hw_capability_advanced_itr_moderation,
235 wil->hw_capabilities))
236 wil_configure_interrupt_moderation_new(wil);
237 else {
238 /* Advanced interrupt moderation is not available before
239 * Sparrow v2. Will use legacy interrupt moderation
240 */
241 wil_configure_interrupt_moderation_lgc(wil);
242 }
243}
244
245static irqreturn_t wil6210_irq_rx(int irq, void *cookie) 218static irqreturn_t wil6210_irq_rx(int irq, void *cookie)
246{ 219{
247 struct wil6210_priv *wil = cookie; 220 struct wil6210_priv *wil = cookie;
@@ -253,7 +226,7 @@ static irqreturn_t wil6210_irq_rx(int irq, void *cookie)
253 trace_wil6210_irq_rx(isr); 226 trace_wil6210_irq_rx(isr);
254 wil_dbg_irq(wil, "ISR RX 0x%08x\n", isr); 227 wil_dbg_irq(wil, "ISR RX 0x%08x\n", isr);
255 228
256 if (!isr) { 229 if (unlikely(!isr)) {
257 wil_err(wil, "spurious IRQ: RX\n"); 230 wil_err(wil, "spurious IRQ: RX\n");
258 return IRQ_NONE; 231 return IRQ_NONE;
259 } 232 }
@@ -266,17 +239,18 @@ static irqreturn_t wil6210_irq_rx(int irq, void *cookie)
266 * action is always the same - should empty the accumulated 239 * action is always the same - should empty the accumulated
267 * packets from the RX ring. 240 * packets from the RX ring.
268 */ 241 */
269 if (isr & (BIT_DMA_EP_RX_ICR_RX_DONE | BIT_DMA_EP_RX_ICR_RX_HTRSH)) { 242 if (likely(isr & (BIT_DMA_EP_RX_ICR_RX_DONE |
243 BIT_DMA_EP_RX_ICR_RX_HTRSH))) {
270 wil_dbg_irq(wil, "RX done\n"); 244 wil_dbg_irq(wil, "RX done\n");
271 245
272 if (isr & BIT_DMA_EP_RX_ICR_RX_HTRSH) 246 if (unlikely(isr & BIT_DMA_EP_RX_ICR_RX_HTRSH))
273 wil_err_ratelimited(wil, 247 wil_err_ratelimited(wil,
274 "Received \"Rx buffer is in risk of overflow\" interrupt\n"); 248 "Received \"Rx buffer is in risk of overflow\" interrupt\n");
275 249
276 isr &= ~(BIT_DMA_EP_RX_ICR_RX_DONE | 250 isr &= ~(BIT_DMA_EP_RX_ICR_RX_DONE |
277 BIT_DMA_EP_RX_ICR_RX_HTRSH); 251 BIT_DMA_EP_RX_ICR_RX_HTRSH);
278 if (test_bit(wil_status_reset_done, wil->status)) { 252 if (likely(test_bit(wil_status_reset_done, wil->status))) {
279 if (test_bit(wil_status_napi_en, wil->status)) { 253 if (likely(test_bit(wil_status_napi_en, wil->status))) {
280 wil_dbg_txrx(wil, "NAPI(Rx) schedule\n"); 254 wil_dbg_txrx(wil, "NAPI(Rx) schedule\n");
281 need_unmask = false; 255 need_unmask = false;
282 napi_schedule(&wil->napi_rx); 256 napi_schedule(&wil->napi_rx);
@@ -289,7 +263,7 @@ static irqreturn_t wil6210_irq_rx(int irq, void *cookie)
289 } 263 }
290 } 264 }
291 265
292 if (isr) 266 if (unlikely(isr))
293 wil_err(wil, "un-handled RX ISR bits 0x%08x\n", isr); 267 wil_err(wil, "un-handled RX ISR bits 0x%08x\n", isr);
294 268
295 /* Rx IRQ will be enabled when NAPI processing finished */ 269 /* Rx IRQ will be enabled when NAPI processing finished */
@@ -313,19 +287,19 @@ static irqreturn_t wil6210_irq_tx(int irq, void *cookie)
313 trace_wil6210_irq_tx(isr); 287 trace_wil6210_irq_tx(isr);
314 wil_dbg_irq(wil, "ISR TX 0x%08x\n", isr); 288 wil_dbg_irq(wil, "ISR TX 0x%08x\n", isr);
315 289
316 if (!isr) { 290 if (unlikely(!isr)) {
317 wil_err(wil, "spurious IRQ: TX\n"); 291 wil_err(wil, "spurious IRQ: TX\n");
318 return IRQ_NONE; 292 return IRQ_NONE;
319 } 293 }
320 294
321 wil6210_mask_irq_tx(wil); 295 wil6210_mask_irq_tx(wil);
322 296
323 if (isr & BIT_DMA_EP_TX_ICR_TX_DONE) { 297 if (likely(isr & BIT_DMA_EP_TX_ICR_TX_DONE)) {
324 wil_dbg_irq(wil, "TX done\n"); 298 wil_dbg_irq(wil, "TX done\n");
325 isr &= ~BIT_DMA_EP_TX_ICR_TX_DONE; 299 isr &= ~BIT_DMA_EP_TX_ICR_TX_DONE;
326 /* clear also all VRING interrupts */ 300 /* clear also all VRING interrupts */
327 isr &= ~(BIT(25) - 1UL); 301 isr &= ~(BIT(25) - 1UL);
328 if (test_bit(wil_status_reset_done, wil->status)) { 302 if (likely(test_bit(wil_status_reset_done, wil->status))) {
329 wil_dbg_txrx(wil, "NAPI(Tx) schedule\n"); 303 wil_dbg_txrx(wil, "NAPI(Tx) schedule\n");
330 need_unmask = false; 304 need_unmask = false;
331 napi_schedule(&wil->napi_tx); 305 napi_schedule(&wil->napi_tx);
@@ -334,7 +308,7 @@ static irqreturn_t wil6210_irq_tx(int irq, void *cookie)
334 } 308 }
335 } 309 }
336 310
337 if (isr) 311 if (unlikely(isr))
338 wil_err(wil, "un-handled TX ISR bits 0x%08x\n", isr); 312 wil_err(wil, "un-handled TX ISR bits 0x%08x\n", isr);
339 313
340 /* Tx IRQ will be enabled when NAPI processing finished */ 314 /* Tx IRQ will be enabled when NAPI processing finished */
@@ -523,11 +497,11 @@ static irqreturn_t wil6210_hardirq(int irq, void *cookie)
523 /** 497 /**
524 * pseudo_cause is Clear-On-Read, no need to ACK 498 * pseudo_cause is Clear-On-Read, no need to ACK
525 */ 499 */
526 if ((pseudo_cause == 0) || ((pseudo_cause & 0xff) == 0xff)) 500 if (unlikely((pseudo_cause == 0) || ((pseudo_cause & 0xff) == 0xff)))
527 return IRQ_NONE; 501 return IRQ_NONE;
528 502
529 /* FIXME: IRQ mask debug */ 503 /* FIXME: IRQ mask debug */
530 if (wil6210_debug_irq_mask(wil, pseudo_cause)) 504 if (unlikely(wil6210_debug_irq_mask(wil, pseudo_cause)))
531 return IRQ_NONE; 505 return IRQ_NONE;
532 506
533 trace_wil6210_irq_pseudo(pseudo_cause); 507 trace_wil6210_irq_pseudo(pseudo_cause);
diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c
index b04e0afdcb21..c2a238426425 100644
--- a/drivers/net/wireless/ath/wil6210/main.c
+++ b/drivers/net/wireless/ath/wil6210/main.c
@@ -29,10 +29,6 @@ bool no_fw_recovery;
29module_param(no_fw_recovery, bool, S_IRUGO | S_IWUSR); 29module_param(no_fw_recovery, bool, S_IRUGO | S_IWUSR);
30MODULE_PARM_DESC(no_fw_recovery, " disable automatic FW error recovery"); 30MODULE_PARM_DESC(no_fw_recovery, " disable automatic FW error recovery");
31 31
32static bool no_fw_load = true;
33module_param(no_fw_load, bool, S_IRUGO | S_IWUSR);
34MODULE_PARM_DESC(no_fw_load, " do not download FW, use one in on-card flash.");
35
36/* if not set via modparam, will be set to default value of 1/8 of 32/* if not set via modparam, will be set to default value of 1/8 of
37 * rx ring size during init flow 33 * rx ring size during init flow
38 */ 34 */
@@ -72,6 +68,7 @@ MODULE_PARM_DESC(mtu_max, " Max MTU value.");
72 68
73static uint rx_ring_order = WIL_RX_RING_SIZE_ORDER_DEFAULT; 69static uint rx_ring_order = WIL_RX_RING_SIZE_ORDER_DEFAULT;
74static uint tx_ring_order = WIL_TX_RING_SIZE_ORDER_DEFAULT; 70static uint tx_ring_order = WIL_TX_RING_SIZE_ORDER_DEFAULT;
71static uint bcast_ring_order = WIL_BCAST_RING_SIZE_ORDER_DEFAULT;
75 72
76static int ring_order_set(const char *val, const struct kernel_param *kp) 73static int ring_order_set(const char *val, const struct kernel_param *kp)
77{ 74{
@@ -220,6 +217,7 @@ static void _wil6210_disconnect(struct wil6210_priv *wil, const u8 *bssid,
220 switch (wdev->iftype) { 217 switch (wdev->iftype) {
221 case NL80211_IFTYPE_STATION: 218 case NL80211_IFTYPE_STATION:
222 case NL80211_IFTYPE_P2P_CLIENT: 219 case NL80211_IFTYPE_P2P_CLIENT:
220 wil_bcast_fini(wil);
223 netif_tx_stop_all_queues(ndev); 221 netif_tx_stop_all_queues(ndev);
224 netif_carrier_off(ndev); 222 netif_carrier_off(ndev);
225 223
@@ -364,6 +362,35 @@ static int wil_find_free_vring(struct wil6210_priv *wil)
364 return -EINVAL; 362 return -EINVAL;
365} 363}
366 364
365int wil_bcast_init(struct wil6210_priv *wil)
366{
367 int ri = wil->bcast_vring, rc;
368
369 if ((ri >= 0) && wil->vring_tx[ri].va)
370 return 0;
371
372 ri = wil_find_free_vring(wil);
373 if (ri < 0)
374 return ri;
375
376 rc = wil_vring_init_bcast(wil, ri, 1 << bcast_ring_order);
377 if (rc == 0)
378 wil->bcast_vring = ri;
379
380 return rc;
381}
382
383void wil_bcast_fini(struct wil6210_priv *wil)
384{
385 int ri = wil->bcast_vring;
386
387 if (ri < 0)
388 return;
389
390 wil->bcast_vring = -1;
391 wil_vring_fini_tx(wil, ri);
392}
393
367static void wil_connect_worker(struct work_struct *work) 394static void wil_connect_worker(struct work_struct *work)
368{ 395{
369 int rc; 396 int rc;
@@ -411,6 +438,7 @@ int wil_priv_init(struct wil6210_priv *wil)
411 init_completion(&wil->wmi_call); 438 init_completion(&wil->wmi_call);
412 439
413 wil->pending_connect_cid = -1; 440 wil->pending_connect_cid = -1;
441 wil->bcast_vring = -1;
414 setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil); 442 setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil);
415 setup_timer(&wil->scan_timer, wil_scan_timer_fn, (ulong)wil); 443 setup_timer(&wil->scan_timer, wil_scan_timer_fn, (ulong)wil);
416 444
@@ -520,8 +548,6 @@ static int wil_target_reset(struct wil6210_priv *wil)
520{ 548{
521 int delay = 0; 549 int delay = 0;
522 u32 x; 550 u32 x;
523 bool is_reset_v2 = test_bit(hw_capability_reset_v2,
524 wil->hw_capabilities);
525 551
526 wil_dbg_misc(wil, "Resetting \"%s\"...\n", wil->hw_name); 552 wil_dbg_misc(wil, "Resetting \"%s\"...\n", wil->hw_name);
527 553
@@ -532,82 +558,67 @@ static int wil_target_reset(struct wil6210_priv *wil)
532 558
533 wil_halt_cpu(wil); 559 wil_halt_cpu(wil);
534 560
561 /* clear all boot loader "ready" bits */
562 W(RGF_USER_BL + offsetof(struct RGF_BL, ready), 0);
535 /* Clear Fw Download notification */ 563 /* Clear Fw Download notification */
536 C(RGF_USER_USAGE_6, BIT(0)); 564 C(RGF_USER_USAGE_6, BIT(0));
537 565
538 if (is_reset_v2) { 566 S(RGF_CAF_OSC_CONTROL, BIT_CAF_OSC_XTAL_EN);
539 S(RGF_CAF_OSC_CONTROL, BIT_CAF_OSC_XTAL_EN); 567 /* XTAL stabilization should take about 3ms */
540 /* XTAL stabilization should take about 3ms */ 568 usleep_range(5000, 7000);
541 usleep_range(5000, 7000); 569 x = R(RGF_CAF_PLL_LOCK_STATUS);
542 x = R(RGF_CAF_PLL_LOCK_STATUS); 570 if (!(x & BIT_CAF_OSC_DIG_XTAL_STABLE)) {
543 if (!(x & BIT_CAF_OSC_DIG_XTAL_STABLE)) { 571 wil_err(wil, "Xtal stabilization timeout\n"
544 wil_err(wil, "Xtal stabilization timeout\n" 572 "RGF_CAF_PLL_LOCK_STATUS = 0x%08x\n", x);
545 "RGF_CAF_PLL_LOCK_STATUS = 0x%08x\n", x); 573 return -ETIME;
546 return -ETIME;
547 }
548 /* switch 10k to XTAL*/
549 C(RGF_USER_SPARROW_M_4, BIT_SPARROW_M_4_SEL_SLEEP_OR_REF);
550 /* 40 MHz */
551 C(RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_CAR_AHB_SW_SEL);
552
553 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0, 0x3ff81f);
554 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1, 0xf);
555 } 574 }
575 /* switch 10k to XTAL*/
576 C(RGF_USER_SPARROW_M_4, BIT_SPARROW_M_4_SEL_SLEEP_OR_REF);
577 /* 40 MHz */
578 C(RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_CAR_AHB_SW_SEL);
579
580 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0, 0x3ff81f);
581 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1, 0xf);
556 582
557 W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0xFE000000); 583 W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0xFE000000);
558 W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0x0000003F); 584 W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0x0000003F);
559 W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 585 W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x000000f0);
560 is_reset_v2 ? 0x000000f0 : 0x00000170);
561 W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0xFFE7FE00); 586 W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0xFFE7FE00);
562 587
563 if (is_reset_v2) { 588 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0, 0x0);
564 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_0, 0x0); 589 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1, 0x0);
565 W(RGF_USER_CLKS_CTL_EXT_SW_RST_VEC_1, 0x0);
566 }
567 590
568 W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0); 591 W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0);
569 W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0); 592 W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0);
570 W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0); 593 W(RGF_USER_CLKS_CTL_SW_RST_VEC_1, 0);
571 W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0); 594 W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0);
572 595
573 if (is_reset_v2) { 596 W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x00000003);
574 W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x00000003); 597 W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0x00008000); /* reset A2 PCIE AHB */
575 /* reset A2 PCIE AHB */
576 W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0x00008000);
577 } else {
578 W(RGF_USER_CLKS_CTL_SW_RST_VEC_3, 0x00000001);
579 W(RGF_PCIE_LOS_COUNTER_CTL, BIT(6) | BIT(8));
580 W(RGF_USER_CLKS_CTL_SW_RST_VEC_2, 0x00008000);
581 }
582 598
583 /* TODO: check order here!!! Erez code is different */
584 W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0); 599 W(RGF_USER_CLKS_CTL_SW_RST_VEC_0, 0);
585 600
586 /* wait until device ready. typical time is 200..250 msec */ 601 /* wait until device ready. typical time is 20..80 msec */
587 do { 602 do {
588 msleep(RST_DELAY); 603 msleep(RST_DELAY);
589 x = R(RGF_USER_HW_MACHINE_STATE); 604 x = R(RGF_USER_BL + offsetof(struct RGF_BL, ready));
590 if (delay++ > RST_COUNT) { 605 if (delay++ > RST_COUNT) {
591 wil_err(wil, "Reset not completed, hw_state 0x%08x\n", 606 wil_err(wil, "Reset not completed, bl.ready 0x%08x\n",
592 x); 607 x);
593 return -ETIME; 608 return -ETIME;
594 } 609 }
595 } while (x != HW_MACHINE_BOOT_DONE); 610 } while (!(x & BIT_BL_READY));
596
597 if (!is_reset_v2)
598 W(RGF_PCIE_LOS_COUNTER_CTL, BIT(8));
599 611
600 C(RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD); 612 C(RGF_USER_CLKS_CTL_0, BIT_USER_CLKS_RST_PWGD);
601 613
614 /* enable fix for HW bug related to the SA/DA swap in AP Rx */
615 S(RGF_DMA_OFUL_NID_0, BIT_DMA_OFUL_NID_0_RX_EXT_TR_EN |
616 BIT_DMA_OFUL_NID_0_RX_EXT_A3_SRC);
617
602 wil_dbg_misc(wil, "Reset completed in %d ms\n", delay * RST_DELAY); 618 wil_dbg_misc(wil, "Reset completed in %d ms\n", delay * RST_DELAY);
603 return 0; 619 return 0;
604} 620}
605 621
606#undef R
607#undef W
608#undef S
609#undef C
610
611void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r) 622void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r)
612{ 623{
613 le32_to_cpus(&r->base); 624 le32_to_cpus(&r->base);
@@ -617,6 +628,32 @@ void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r)
617 le32_to_cpus(&r->head); 628 le32_to_cpus(&r->head);
618} 629}
619 630
631static int wil_get_bl_info(struct wil6210_priv *wil)
632{
633 struct net_device *ndev = wil_to_ndev(wil);
634 struct RGF_BL bl;
635
636 wil_memcpy_fromio_32(&bl, wil->csr + HOSTADDR(RGF_USER_BL), sizeof(bl));
637 le32_to_cpus(&bl.ready);
638 le32_to_cpus(&bl.version);
639 le32_to_cpus(&bl.rf_type);
640 le32_to_cpus(&bl.baseband_type);
641
642 if (!is_valid_ether_addr(bl.mac_address)) {
643 wil_err(wil, "BL: Invalid MAC %pM\n", bl.mac_address);
644 return -EINVAL;
645 }
646
647 ether_addr_copy(ndev->perm_addr, bl.mac_address);
648 if (!is_valid_ether_addr(ndev->dev_addr))
649 ether_addr_copy(ndev->dev_addr, bl.mac_address);
650 wil_info(wil,
651 "Boot Loader: ver = %d MAC = %pM RF = 0x%08x bband = 0x%08x\n",
652 bl.version, bl.mac_address, bl.rf_type, bl.baseband_type);
653
654 return 0;
655}
656
620static int wil_wait_for_fw_ready(struct wil6210_priv *wil) 657static int wil_wait_for_fw_ready(struct wil6210_priv *wil)
621{ 658{
622 ulong to = msecs_to_jiffies(1000); 659 ulong to = msecs_to_jiffies(1000);
@@ -637,7 +674,7 @@ static int wil_wait_for_fw_ready(struct wil6210_priv *wil)
637 * After calling this routine, you're expected to reload 674 * After calling this routine, you're expected to reload
638 * the firmware. 675 * the firmware.
639 */ 676 */
640int wil_reset(struct wil6210_priv *wil) 677int wil_reset(struct wil6210_priv *wil, bool load_fw)
641{ 678{
642 int rc; 679 int rc;
643 680
@@ -651,6 +688,7 @@ int wil_reset(struct wil6210_priv *wil)
651 688
652 cancel_work_sync(&wil->disconnect_worker); 689 cancel_work_sync(&wil->disconnect_worker);
653 wil6210_disconnect(wil, NULL, WLAN_REASON_DEAUTH_LEAVING, false); 690 wil6210_disconnect(wil, NULL, WLAN_REASON_DEAUTH_LEAVING, false);
691 wil_bcast_fini(wil);
654 692
655 /* prevent NAPI from being scheduled */ 693 /* prevent NAPI from being scheduled */
656 bitmap_zero(wil->status, wil_status_last); 694 bitmap_zero(wil->status, wil_status_last);
@@ -675,46 +713,62 @@ int wil_reset(struct wil6210_priv *wil)
675 if (rc) 713 if (rc)
676 return rc; 714 return rc;
677 715
678 if (!no_fw_load) { 716 rc = wil_get_bl_info(wil);
679 wil_info(wil, "Use firmware <%s>\n", WIL_FW_NAME); 717 if (rc)
718 return rc;
719
720 if (load_fw) {
721 wil_info(wil, "Use firmware <%s> + board <%s>\n", WIL_FW_NAME,
722 WIL_FW2_NAME);
723
680 wil_halt_cpu(wil); 724 wil_halt_cpu(wil);
681 /* Loading f/w from the file */ 725 /* Loading f/w from the file */
682 rc = wil_request_firmware(wil, WIL_FW_NAME); 726 rc = wil_request_firmware(wil, WIL_FW_NAME);
683 if (rc) 727 if (rc)
684 return rc; 728 return rc;
729 rc = wil_request_firmware(wil, WIL_FW2_NAME);
730 if (rc)
731 return rc;
732
733 /* Mark FW as loaded from host */
734 S(RGF_USER_USAGE_6, 1);
685 735
686 /* clear any interrupts which on-card-firmware may have set */ 736 /* clear any interrupts which on-card-firmware
737 * may have set
738 */
687 wil6210_clear_irq(wil); 739 wil6210_clear_irq(wil);
688 { /* CAF_ICR - clear and mask */ 740 /* CAF_ICR - clear and mask */
689 u32 a = HOSTADDR(RGF_CAF_ICR) + 741 /* it is W1C, clear by writing back same value */
690 offsetof(struct RGF_ICR, ICR); 742 S(RGF_CAF_ICR + offsetof(struct RGF_ICR, ICR), 0);
691 u32 m = HOSTADDR(RGF_CAF_ICR) + 743 W(RGF_CAF_ICR + offsetof(struct RGF_ICR, IMV), ~0);
692 offsetof(struct RGF_ICR, IMV); 744
693 u32 icr = ioread32(wil->csr + a);
694
695 iowrite32(icr, wil->csr + a); /* W1C */
696 iowrite32(~0, wil->csr + m);
697 wmb(); /* wait for completion */
698 }
699 wil_release_cpu(wil); 745 wil_release_cpu(wil);
700 } else {
701 wil_info(wil, "Use firmware from on-card flash\n");
702 } 746 }
703 747
704 /* init after reset */ 748 /* init after reset */
705 wil->pending_connect_cid = -1; 749 wil->pending_connect_cid = -1;
750 wil->ap_isolate = 0;
706 reinit_completion(&wil->wmi_ready); 751 reinit_completion(&wil->wmi_ready);
707 reinit_completion(&wil->wmi_call); 752 reinit_completion(&wil->wmi_call);
708 753
709 wil_configure_interrupt_moderation(wil); 754 if (load_fw) {
710 wil_unmask_irq(wil); 755 wil_configure_interrupt_moderation(wil);
756 wil_unmask_irq(wil);
711 757
712 /* we just started MAC, wait for FW ready */ 758 /* we just started MAC, wait for FW ready */
713 rc = wil_wait_for_fw_ready(wil); 759 rc = wil_wait_for_fw_ready(wil);
760 if (rc == 0) /* check FW is responsive */
761 rc = wmi_echo(wil);
762 }
714 763
715 return rc; 764 return rc;
716} 765}
717 766
767#undef R
768#undef W
769#undef S
770#undef C
771
718void wil_fw_error_recovery(struct wil6210_priv *wil) 772void wil_fw_error_recovery(struct wil6210_priv *wil)
719{ 773{
720 wil_dbg_misc(wil, "starting fw error recovery\n"); 774 wil_dbg_misc(wil, "starting fw error recovery\n");
@@ -730,7 +784,7 @@ int __wil_up(struct wil6210_priv *wil)
730 784
731 WARN_ON(!mutex_is_locked(&wil->mutex)); 785 WARN_ON(!mutex_is_locked(&wil->mutex));
732 786
733 rc = wil_reset(wil); 787 rc = wil_reset(wil, true);
734 if (rc) 788 if (rc)
735 return rc; 789 return rc;
736 790
@@ -837,7 +891,7 @@ int __wil_down(struct wil6210_priv *wil)
837 if (!iter) 891 if (!iter)
838 wil_err(wil, "timeout waiting for idle FW/HW\n"); 892 wil_err(wil, "timeout waiting for idle FW/HW\n");
839 893
840 wil_rx_fini(wil); 894 wil_reset(wil, false);
841 895
842 return 0; 896 return 0;
843} 897}
diff --git a/drivers/net/wireless/ath/wil6210/netdev.c b/drivers/net/wireless/ath/wil6210/netdev.c
index ace30c1b5c64..f2f7ea29558e 100644
--- a/drivers/net/wireless/ath/wil6210/netdev.c
+++ b/drivers/net/wireless/ath/wil6210/netdev.c
@@ -82,7 +82,7 @@ static int wil6210_netdev_poll_rx(struct napi_struct *napi, int budget)
82 wil_rx_handle(wil, &quota); 82 wil_rx_handle(wil, &quota);
83 done = budget - quota; 83 done = budget - quota;
84 84
85 if (done <= 1) { /* burst ends - only one packet processed */ 85 if (done < budget) {
86 napi_complete(napi); 86 napi_complete(napi);
87 wil6210_unmask_irq_rx(wil); 87 wil6210_unmask_irq_rx(wil);
88 wil_dbg_txrx(wil, "NAPI RX complete\n"); 88 wil_dbg_txrx(wil, "NAPI RX complete\n");
@@ -110,7 +110,7 @@ static int wil6210_netdev_poll_tx(struct napi_struct *napi, int budget)
110 tx_done += wil_tx_complete(wil, i); 110 tx_done += wil_tx_complete(wil, i);
111 } 111 }
112 112
113 if (tx_done <= 1) { /* burst ends - only one packet processed */ 113 if (tx_done < budget) {
114 napi_complete(napi); 114 napi_complete(napi);
115 wil6210_unmask_irq_tx(wil); 115 wil6210_unmask_irq_tx(wil);
116 wil_dbg_txrx(wil, "NAPI TX complete\n"); 116 wil_dbg_txrx(wil, "NAPI TX complete\n");
diff --git a/drivers/net/wireless/ath/wil6210/pcie_bus.c b/drivers/net/wireless/ath/wil6210/pcie_bus.c
index 3dd26709ccb2..109986114abf 100644
--- a/drivers/net/wireless/ath/wil6210/pcie_bus.c
+++ b/drivers/net/wireless/ath/wil6210/pcie_bus.c
@@ -39,18 +39,6 @@ void wil_set_capabilities(struct wil6210_priv *wil)
39 bitmap_zero(wil->hw_capabilities, hw_capability_last); 39 bitmap_zero(wil->hw_capabilities, hw_capability_last);
40 40
41 switch (rev_id) { 41 switch (rev_id) {
42 case JTAG_DEV_ID_MARLON_B0:
43 wil->hw_name = "Marlon B0";
44 wil->hw_version = HW_VER_MARLON_B0;
45 break;
46 case JTAG_DEV_ID_SPARROW_A0:
47 wil->hw_name = "Sparrow A0";
48 wil->hw_version = HW_VER_SPARROW_A0;
49 break;
50 case JTAG_DEV_ID_SPARROW_A1:
51 wil->hw_name = "Sparrow A1";
52 wil->hw_version = HW_VER_SPARROW_A1;
53 break;
54 case JTAG_DEV_ID_SPARROW_B0: 42 case JTAG_DEV_ID_SPARROW_B0:
55 wil->hw_name = "Sparrow B0"; 43 wil->hw_name = "Sparrow B0";
56 wil->hw_version = HW_VER_SPARROW_B0; 44 wil->hw_version = HW_VER_SPARROW_B0;
@@ -62,13 +50,6 @@ void wil_set_capabilities(struct wil6210_priv *wil)
62 } 50 }
63 51
64 wil_info(wil, "Board hardware is %s\n", wil->hw_name); 52 wil_info(wil, "Board hardware is %s\n", wil->hw_name);
65
66 if (wil->hw_version >= HW_VER_SPARROW_A0)
67 set_bit(hw_capability_reset_v2, wil->hw_capabilities);
68
69 if (wil->hw_version >= HW_VER_SPARROW_B0)
70 set_bit(hw_capability_advanced_itr_moderation,
71 wil->hw_capabilities);
72} 53}
73 54
74void wil_disable_irq(struct wil6210_priv *wil) 55void wil_disable_irq(struct wil6210_priv *wil)
@@ -150,7 +131,7 @@ static int wil_if_pcie_enable(struct wil6210_priv *wil)
150 131
151 /* need reset here to obtain MAC */ 132 /* need reset here to obtain MAC */
152 mutex_lock(&wil->mutex); 133 mutex_lock(&wil->mutex);
153 rc = wil_reset(wil); 134 rc = wil_reset(wil, false);
154 mutex_unlock(&wil->mutex); 135 mutex_unlock(&wil->mutex);
155 if (debug_fw) 136 if (debug_fw)
156 rc = 0; 137 rc = 0;
@@ -265,8 +246,6 @@ static int wil_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
265 246
266 wil6210_debugfs_init(wil); 247 wil6210_debugfs_init(wil);
267 248
268 /* check FW is alive */
269 wmi_echo(wil);
270 249
271 return 0; 250 return 0;
272 251
@@ -305,7 +284,6 @@ static void wil_pcie_remove(struct pci_dev *pdev)
305} 284}
306 285
307static const struct pci_device_id wil6210_pcie_ids[] = { 286static const struct pci_device_id wil6210_pcie_ids[] = {
308 { PCI_DEVICE(0x1ae9, 0x0301) },
309 { PCI_DEVICE(0x1ae9, 0x0310) }, 287 { PCI_DEVICE(0x1ae9, 0x0310) },
310 { PCI_DEVICE(0x1ae9, 0x0302) }, /* same as above, firmware broken */ 288 { PCI_DEVICE(0x1ae9, 0x0302) }, /* same as above, firmware broken */
311 { /* end: all zeroes */ }, 289 { /* end: all zeroes */ },
diff --git a/drivers/net/wireless/ath/wil6210/txrx.c b/drivers/net/wireless/ath/wil6210/txrx.c
index 8439f65db259..e8bd512d81a9 100644
--- a/drivers/net/wireless/ath/wil6210/txrx.c
+++ b/drivers/net/wireless/ath/wil6210/txrx.c
@@ -33,6 +33,15 @@ module_param(rtap_include_phy_info, bool, S_IRUGO);
33MODULE_PARM_DESC(rtap_include_phy_info, 33MODULE_PARM_DESC(rtap_include_phy_info,
34 " Include PHY info in the radiotap header, default - no"); 34 " Include PHY info in the radiotap header, default - no");
35 35
36bool rx_align_2;
37module_param(rx_align_2, bool, S_IRUGO);
38MODULE_PARM_DESC(rx_align_2, " align Rx buffers on 4*n+2, default - no");
39
40static inline uint wil_rx_snaplen(void)
41{
42 return rx_align_2 ? 6 : 0;
43}
44
36static inline int wil_vring_is_empty(struct vring *vring) 45static inline int wil_vring_is_empty(struct vring *vring)
37{ 46{
38 return vring->swhead == vring->swtail; 47 return vring->swhead == vring->swtail;
@@ -53,34 +62,38 @@ static inline int wil_vring_is_full(struct vring *vring)
53 return wil_vring_next_tail(vring) == vring->swhead; 62 return wil_vring_next_tail(vring) == vring->swhead;
54} 63}
55 64
56/* 65/* Used space in Tx Vring */
57 * Available space in Tx Vring 66static inline int wil_vring_used_tx(struct vring *vring)
58 */
59static inline int wil_vring_avail_tx(struct vring *vring)
60{ 67{
61 u32 swhead = vring->swhead; 68 u32 swhead = vring->swhead;
62 u32 swtail = vring->swtail; 69 u32 swtail = vring->swtail;
63 int used = (vring->size + swhead - swtail) % vring->size; 70 return (vring->size + swhead - swtail) % vring->size;
71}
64 72
65 return vring->size - used - 1; 73/* Available space in Tx Vring */
74static inline int wil_vring_avail_tx(struct vring *vring)
75{
76 return vring->size - wil_vring_used_tx(vring) - 1;
66} 77}
67 78
68/** 79/* wil_vring_wmark_low - low watermark for available descriptor space */
69 * wil_vring_wmark_low - low watermark for available descriptor space
70 */
71static inline int wil_vring_wmark_low(struct vring *vring) 80static inline int wil_vring_wmark_low(struct vring *vring)
72{ 81{
73 return vring->size/8; 82 return vring->size/8;
74} 83}
75 84
76/** 85/* wil_vring_wmark_high - high watermark for available descriptor space */
77 * wil_vring_wmark_high - high watermark for available descriptor space
78 */
79static inline int wil_vring_wmark_high(struct vring *vring) 86static inline int wil_vring_wmark_high(struct vring *vring)
80{ 87{
81 return vring->size/4; 88 return vring->size/4;
82} 89}
83 90
91/* wil_val_in_range - check if value in [min,max) */
92static inline bool wil_val_in_range(int val, int min, int max)
93{
94 return val >= min && val < max;
95}
96
84static int wil_vring_alloc(struct wil6210_priv *wil, struct vring *vring) 97static int wil_vring_alloc(struct wil6210_priv *wil, struct vring *vring)
85{ 98{
86 struct device *dev = wil_to_dev(wil); 99 struct device *dev = wil_to_dev(wil);
@@ -98,8 +111,7 @@ static int wil_vring_alloc(struct wil6210_priv *wil, struct vring *vring)
98 vring->va = NULL; 111 vring->va = NULL;
99 return -ENOMEM; 112 return -ENOMEM;
100 } 113 }
101 /* 114 /* vring->va should be aligned on its size rounded up to power of 2
102 * vring->va should be aligned on its size rounded up to power of 2
103 * This is granted by the dma_alloc_coherent 115 * This is granted by the dma_alloc_coherent
104 */ 116 */
105 vring->va = dma_alloc_coherent(dev, sz, &vring->pa, GFP_KERNEL); 117 vring->va = dma_alloc_coherent(dev, sz, &vring->pa, GFP_KERNEL);
@@ -206,7 +218,7 @@ static int wil_vring_alloc_skb(struct wil6210_priv *wil, struct vring *vring,
206 u32 i, int headroom) 218 u32 i, int headroom)
207{ 219{
208 struct device *dev = wil_to_dev(wil); 220 struct device *dev = wil_to_dev(wil);
209 unsigned int sz = mtu_max + ETH_HLEN; 221 unsigned int sz = mtu_max + ETH_HLEN + wil_rx_snaplen();
210 struct vring_rx_desc dd, *d = &dd; 222 struct vring_rx_desc dd, *d = &dd;
211 volatile struct vring_rx_desc *_d = &vring->va[i].rx; 223 volatile struct vring_rx_desc *_d = &vring->va[i].rx;
212 dma_addr_t pa; 224 dma_addr_t pa;
@@ -346,27 +358,6 @@ static void wil_rx_add_radiotap_header(struct wil6210_priv *wil,
346 } 358 }
347} 359}
348 360
349/*
350 * Fast swap in place between 2 registers
351 */
352static void wil_swap_u16(u16 *a, u16 *b)
353{
354 *a ^= *b;
355 *b ^= *a;
356 *a ^= *b;
357}
358
359static void wil_swap_ethaddr(void *data)
360{
361 struct ethhdr *eth = data;
362 u16 *s = (u16 *)eth->h_source;
363 u16 *d = (u16 *)eth->h_dest;
364
365 wil_swap_u16(s++, d++);
366 wil_swap_u16(s++, d++);
367 wil_swap_u16(s, d);
368}
369
370/** 361/**
371 * reap 1 frame from @swhead 362 * reap 1 frame from @swhead
372 * 363 *
@@ -383,40 +374,45 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
383 struct vring_rx_desc *d; 374 struct vring_rx_desc *d;
384 struct sk_buff *skb; 375 struct sk_buff *skb;
385 dma_addr_t pa; 376 dma_addr_t pa;
386 unsigned int sz = mtu_max + ETH_HLEN; 377 unsigned int snaplen = wil_rx_snaplen();
378 unsigned int sz = mtu_max + ETH_HLEN + snaplen;
387 u16 dmalen; 379 u16 dmalen;
388 u8 ftype; 380 u8 ftype;
389 u8 ds_bits;
390 int cid; 381 int cid;
382 int i = (int)vring->swhead;
391 struct wil_net_stats *stats; 383 struct wil_net_stats *stats;
392 384
393 BUILD_BUG_ON(sizeof(struct vring_rx_desc) > sizeof(skb->cb)); 385 BUILD_BUG_ON(sizeof(struct vring_rx_desc) > sizeof(skb->cb));
394 386
395 if (wil_vring_is_empty(vring)) 387 if (unlikely(wil_vring_is_empty(vring)))
396 return NULL; 388 return NULL;
397 389
398 _d = &vring->va[vring->swhead].rx; 390 _d = &vring->va[i].rx;
399 if (!(_d->dma.status & RX_DMA_STATUS_DU)) { 391 if (unlikely(!(_d->dma.status & RX_DMA_STATUS_DU))) {
400 /* it is not error, we just reached end of Rx done area */ 392 /* it is not error, we just reached end of Rx done area */
401 return NULL; 393 return NULL;
402 } 394 }
403 395
404 skb = vring->ctx[vring->swhead].skb; 396 skb = vring->ctx[i].skb;
397 vring->ctx[i].skb = NULL;
398 wil_vring_advance_head(vring, 1);
399 if (!skb) {
400 wil_err(wil, "No Rx skb at [%d]\n", i);
401 return NULL;
402 }
405 d = wil_skb_rxdesc(skb); 403 d = wil_skb_rxdesc(skb);
406 *d = *_d; 404 *d = *_d;
407 pa = wil_desc_addr(&d->dma.addr); 405 pa = wil_desc_addr(&d->dma.addr);
408 vring->ctx[vring->swhead].skb = NULL;
409 wil_vring_advance_head(vring, 1);
410 406
411 dma_unmap_single(dev, pa, sz, DMA_FROM_DEVICE); 407 dma_unmap_single(dev, pa, sz, DMA_FROM_DEVICE);
412 dmalen = le16_to_cpu(d->dma.length); 408 dmalen = le16_to_cpu(d->dma.length);
413 409
414 trace_wil6210_rx(vring->swhead, d); 410 trace_wil6210_rx(i, d);
415 wil_dbg_txrx(wil, "Rx[%3d] : %d bytes\n", vring->swhead, dmalen); 411 wil_dbg_txrx(wil, "Rx[%3d] : %d bytes\n", i, dmalen);
416 wil_hex_dump_txrx("Rx ", DUMP_PREFIX_NONE, 32, 4, 412 wil_hex_dump_txrx("Rx ", DUMP_PREFIX_NONE, 32, 4,
417 (const void *)d, sizeof(*d), false); 413 (const void *)d, sizeof(*d), false);
418 414
419 if (dmalen > sz) { 415 if (unlikely(dmalen > sz)) {
420 wil_err(wil, "Rx size too large: %d bytes!\n", dmalen); 416 wil_err(wil, "Rx size too large: %d bytes!\n", dmalen);
421 kfree_skb(skb); 417 kfree_skb(skb);
422 return NULL; 418 return NULL;
@@ -445,14 +441,14 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
445 * in Rx descriptor. If type is not data, it is 802.11 frame as is 441 * in Rx descriptor. If type is not data, it is 802.11 frame as is
446 */ 442 */
447 ftype = wil_rxdesc_ftype(d) << 2; 443 ftype = wil_rxdesc_ftype(d) << 2;
448 if (ftype != IEEE80211_FTYPE_DATA) { 444 if (unlikely(ftype != IEEE80211_FTYPE_DATA)) {
449 wil_dbg_txrx(wil, "Non-data frame ftype 0x%08x\n", ftype); 445 wil_dbg_txrx(wil, "Non-data frame ftype 0x%08x\n", ftype);
450 /* TODO: process it */ 446 /* TODO: process it */
451 kfree_skb(skb); 447 kfree_skb(skb);
452 return NULL; 448 return NULL;
453 } 449 }
454 450
455 if (skb->len < ETH_HLEN) { 451 if (unlikely(skb->len < ETH_HLEN + snaplen)) {
456 wil_err(wil, "Short frame, len = %d\n", skb->len); 452 wil_err(wil, "Short frame, len = %d\n", skb->len);
457 /* TODO: process it (i.e. BAR) */ 453 /* TODO: process it (i.e. BAR) */
458 kfree_skb(skb); 454 kfree_skb(skb);
@@ -463,9 +459,9 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
463 * and in case of error drop the packet 459 * and in case of error drop the packet
464 * higher stack layers will handle retransmission (if required) 460 * higher stack layers will handle retransmission (if required)
465 */ 461 */
466 if (d->dma.status & RX_DMA_STATUS_L4I) { 462 if (likely(d->dma.status & RX_DMA_STATUS_L4I)) {
467 /* L4 protocol identified, csum calculated */ 463 /* L4 protocol identified, csum calculated */
468 if ((d->dma.error & RX_DMA_ERROR_L4_ERR) == 0) 464 if (likely((d->dma.error & RX_DMA_ERROR_L4_ERR) == 0))
469 skb->ip_summed = CHECKSUM_UNNECESSARY; 465 skb->ip_summed = CHECKSUM_UNNECESSARY;
470 /* If HW reports bad checksum, let IP stack re-check it 466 /* If HW reports bad checksum, let IP stack re-check it
471 * For example, HW don't understand Microsoft IP stack that 467 * For example, HW don't understand Microsoft IP stack that
@@ -474,13 +470,15 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
474 */ 470 */
475 } 471 }
476 472
477 ds_bits = wil_rxdesc_ds_bits(d); 473 if (snaplen) {
478 if (ds_bits == 1) { 474 /* Packet layout
479 /* 475 * +-------+-------+---------+------------+------+
480 * HW bug - in ToDS mode, i.e. Rx on AP side, 476 * | SA(6) | DA(6) | SNAP(6) | ETHTYPE(2) | DATA |
481 * addresses get swapped 477 * +-------+-------+---------+------------+------+
478 * Need to remove SNAP, shifting SA and DA forward
482 */ 479 */
483 wil_swap_ethaddr(skb->data); 480 memmove(skb->data + snaplen, skb->data, 2 * ETH_ALEN);
481 skb_pull(skb, snaplen);
484 } 482 }
485 483
486 return skb; 484 return skb;
@@ -503,7 +501,7 @@ static int wil_rx_refill(struct wil6210_priv *wil, int count)
503 (next_tail != v->swhead) && (count-- > 0); 501 (next_tail != v->swhead) && (count-- > 0);
504 v->swtail = next_tail) { 502 v->swtail = next_tail) {
505 rc = wil_vring_alloc_skb(wil, v, v->swtail, headroom); 503 rc = wil_vring_alloc_skb(wil, v, v->swtail, headroom);
506 if (rc) { 504 if (unlikely(rc)) {
507 wil_err(wil, "Error %d in wil_rx_refill[%d]\n", 505 wil_err(wil, "Error %d in wil_rx_refill[%d]\n",
508 rc, v->swtail); 506 rc, v->swtail);
509 break; 507 break;
@@ -520,17 +518,71 @@ static int wil_rx_refill(struct wil6210_priv *wil, int count)
520 */ 518 */
521void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev) 519void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev)
522{ 520{
523 gro_result_t rc; 521 gro_result_t rc = GRO_NORMAL;
524 struct wil6210_priv *wil = ndev_to_wil(ndev); 522 struct wil6210_priv *wil = ndev_to_wil(ndev);
523 struct wireless_dev *wdev = wil_to_wdev(wil);
525 unsigned int len = skb->len; 524 unsigned int len = skb->len;
526 struct vring_rx_desc *d = wil_skb_rxdesc(skb); 525 struct vring_rx_desc *d = wil_skb_rxdesc(skb);
527 int cid = wil_rxdesc_cid(d); 526 int cid = wil_rxdesc_cid(d); /* always 0..7, no need to check */
527 struct ethhdr *eth = (void *)skb->data;
528 /* here looking for DA, not A1, thus Rxdesc's 'mcast' indication
529 * is not suitable, need to look at data
530 */
531 int mcast = is_multicast_ether_addr(eth->h_dest);
528 struct wil_net_stats *stats = &wil->sta[cid].stats; 532 struct wil_net_stats *stats = &wil->sta[cid].stats;
533 struct sk_buff *xmit_skb = NULL;
534 static const char * const gro_res_str[] = {
535 [GRO_MERGED] = "GRO_MERGED",
536 [GRO_MERGED_FREE] = "GRO_MERGED_FREE",
537 [GRO_HELD] = "GRO_HELD",
538 [GRO_NORMAL] = "GRO_NORMAL",
539 [GRO_DROP] = "GRO_DROP",
540 };
529 541
530 skb_orphan(skb); 542 skb_orphan(skb);
531 543
532 rc = napi_gro_receive(&wil->napi_rx, skb); 544 if (wdev->iftype == NL80211_IFTYPE_AP && !wil->ap_isolate) {
545 if (mcast) {
546 /* send multicast frames both to higher layers in
547 * local net stack and back to the wireless medium
548 */
549 xmit_skb = skb_copy(skb, GFP_ATOMIC);
550 } else {
551 int xmit_cid = wil_find_cid(wil, eth->h_dest);
552
553 if (xmit_cid >= 0) {
554 /* The destination station is associated to
555 * this AP (in this VLAN), so send the frame
556 * directly to it and do not pass it to local
557 * net stack.
558 */
559 xmit_skb = skb;
560 skb = NULL;
561 }
562 }
563 }
564 if (xmit_skb) {
565 /* Send to wireless media and increase priority by 256 to
566 * keep the received priority instead of reclassifying
567 * the frame (see cfg80211_classify8021d).
568 */
569 xmit_skb->dev = ndev;
570 xmit_skb->priority += 256;
571 xmit_skb->protocol = htons(ETH_P_802_3);
572 skb_reset_network_header(xmit_skb);
573 skb_reset_mac_header(xmit_skb);
574 wil_dbg_txrx(wil, "Rx -> Tx %d bytes\n", len);
575 dev_queue_xmit(xmit_skb);
576 }
533 577
578 if (skb) { /* deliver to local stack */
579
580 skb->protocol = eth_type_trans(skb, ndev);
581 rc = napi_gro_receive(&wil->napi_rx, skb);
582 wil_dbg_txrx(wil, "Rx complete %d bytes => %s\n",
583 len, gro_res_str[rc]);
584 }
585 /* statistics. rc set to GRO_NORMAL for AP bridging */
534 if (unlikely(rc == GRO_DROP)) { 586 if (unlikely(rc == GRO_DROP)) {
535 ndev->stats.rx_dropped++; 587 ndev->stats.rx_dropped++;
536 stats->rx_dropped++; 588 stats->rx_dropped++;
@@ -540,17 +592,8 @@ void wil_netif_rx_any(struct sk_buff *skb, struct net_device *ndev)
540 stats->rx_packets++; 592 stats->rx_packets++;
541 ndev->stats.rx_bytes += len; 593 ndev->stats.rx_bytes += len;
542 stats->rx_bytes += len; 594 stats->rx_bytes += len;
543 } 595 if (mcast)
544 { 596 ndev->stats.multicast++;
545 static const char * const gro_res_str[] = {
546 [GRO_MERGED] = "GRO_MERGED",
547 [GRO_MERGED_FREE] = "GRO_MERGED_FREE",
548 [GRO_HELD] = "GRO_HELD",
549 [GRO_NORMAL] = "GRO_NORMAL",
550 [GRO_DROP] = "GRO_DROP",
551 };
552 wil_dbg_txrx(wil, "Rx complete %d bytes => %s\n",
553 len, gro_res_str[rc]);
554 } 597 }
555} 598}
556 599
@@ -565,7 +608,7 @@ void wil_rx_handle(struct wil6210_priv *wil, int *quota)
565 struct vring *v = &wil->vring_rx; 608 struct vring *v = &wil->vring_rx;
566 struct sk_buff *skb; 609 struct sk_buff *skb;
567 610
568 if (!v->va) { 611 if (unlikely(!v->va)) {
569 wil_err(wil, "Rx IRQ while Rx not yet initialized\n"); 612 wil_err(wil, "Rx IRQ while Rx not yet initialized\n");
570 return; 613 return;
571 } 614 }
@@ -581,7 +624,6 @@ void wil_rx_handle(struct wil6210_priv *wil, int *quota)
581 skb->protocol = htons(ETH_P_802_2); 624 skb->protocol = htons(ETH_P_802_2);
582 wil_netif_rx_any(skb, ndev); 625 wil_netif_rx_any(skb, ndev);
583 } else { 626 } else {
584 skb->protocol = eth_type_trans(skb, ndev);
585 wil_rx_reorder(wil, skb); 627 wil_rx_reorder(wil, skb);
586 } 628 }
587 } 629 }
@@ -707,6 +749,72 @@ int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size,
707 return rc; 749 return rc;
708} 750}
709 751
752int wil_vring_init_bcast(struct wil6210_priv *wil, int id, int size)
753{
754 int rc;
755 struct wmi_bcast_vring_cfg_cmd cmd = {
756 .action = cpu_to_le32(WMI_VRING_CMD_ADD),
757 .vring_cfg = {
758 .tx_sw_ring = {
759 .max_mpdu_size =
760 cpu_to_le16(wil_mtu2macbuf(mtu_max)),
761 .ring_size = cpu_to_le16(size),
762 },
763 .ringid = id,
764 .encap_trans_type = WMI_VRING_ENC_TYPE_802_3,
765 },
766 };
767 struct {
768 struct wil6210_mbox_hdr_wmi wmi;
769 struct wmi_vring_cfg_done_event cmd;
770 } __packed reply;
771 struct vring *vring = &wil->vring_tx[id];
772 struct vring_tx_data *txdata = &wil->vring_tx_data[id];
773
774 wil_dbg_misc(wil, "%s() max_mpdu_size %d\n", __func__,
775 cmd.vring_cfg.tx_sw_ring.max_mpdu_size);
776
777 if (vring->va) {
778 wil_err(wil, "Tx ring [%d] already allocated\n", id);
779 rc = -EINVAL;
780 goto out;
781 }
782
783 memset(txdata, 0, sizeof(*txdata));
784 spin_lock_init(&txdata->lock);
785 vring->size = size;
786 rc = wil_vring_alloc(wil, vring);
787 if (rc)
788 goto out;
789
790 wil->vring2cid_tid[id][0] = WIL6210_MAX_CID; /* CID */
791 wil->vring2cid_tid[id][1] = 0; /* TID */
792
793 cmd.vring_cfg.tx_sw_ring.ring_mem_base = cpu_to_le64(vring->pa);
794
795 rc = wmi_call(wil, WMI_BCAST_VRING_CFG_CMDID, &cmd, sizeof(cmd),
796 WMI_VRING_CFG_DONE_EVENTID, &reply, sizeof(reply), 100);
797 if (rc)
798 goto out_free;
799
800 if (reply.cmd.status != WMI_FW_STATUS_SUCCESS) {
801 wil_err(wil, "Tx config failed, status 0x%02x\n",
802 reply.cmd.status);
803 rc = -EINVAL;
804 goto out_free;
805 }
806 vring->hwtail = le32_to_cpu(reply.cmd.tx_vring_tail_ptr);
807
808 txdata->enabled = 1;
809
810 return 0;
811 out_free:
812 wil_vring_free(wil, vring, 1);
813 out:
814
815 return rc;
816}
817
710void wil_vring_fini_tx(struct wil6210_priv *wil, int id) 818void wil_vring_fini_tx(struct wil6210_priv *wil, int id)
711{ 819{
712 struct vring *vring = &wil->vring_tx[id]; 820 struct vring *vring = &wil->vring_tx[id];
@@ -730,7 +838,7 @@ void wil_vring_fini_tx(struct wil6210_priv *wil, int id)
730 memset(txdata, 0, sizeof(*txdata)); 838 memset(txdata, 0, sizeof(*txdata));
731} 839}
732 840
733static struct vring *wil_find_tx_vring(struct wil6210_priv *wil, 841static struct vring *wil_find_tx_ucast(struct wil6210_priv *wil,
734 struct sk_buff *skb) 842 struct sk_buff *skb)
735{ 843{
736 int i; 844 int i;
@@ -763,15 +871,6 @@ static struct vring *wil_find_tx_vring(struct wil6210_priv *wil,
763 return NULL; 871 return NULL;
764} 872}
765 873
766static void wil_set_da_for_vring(struct wil6210_priv *wil,
767 struct sk_buff *skb, int vring_index)
768{
769 struct ethhdr *eth = (void *)skb->data;
770 int cid = wil->vring2cid_tid[vring_index][0];
771
772 memcpy(eth->h_dest, wil->sta[cid].addr, ETH_ALEN);
773}
774
775static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring, 874static int wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
776 struct sk_buff *skb); 875 struct sk_buff *skb);
777 876
@@ -792,6 +891,9 @@ static struct vring *wil_find_tx_vring_sta(struct wil6210_priv *wil,
792 continue; 891 continue;
793 892
794 cid = wil->vring2cid_tid[i][0]; 893 cid = wil->vring2cid_tid[i][0];
894 if (cid >= WIL6210_MAX_CID) /* skip BCAST */
895 continue;
896
795 if (!wil->sta[cid].data_port_open && 897 if (!wil->sta[cid].data_port_open &&
796 (skb->protocol != cpu_to_be16(ETH_P_PAE))) 898 (skb->protocol != cpu_to_be16(ETH_P_PAE)))
797 break; 899 break;
@@ -806,17 +908,51 @@ static struct vring *wil_find_tx_vring_sta(struct wil6210_priv *wil,
806 return NULL; 908 return NULL;
807} 909}
808 910
809/* 911/* Use one of 2 strategies:
810 * Find 1-st vring and return it; set dest address for this vring in skb 912 *
811 * duplicate skb and send it to other active vrings 913 * 1. New (real broadcast):
914 * use dedicated broadcast vring
915 * 2. Old (pseudo-DMS):
916 * Find 1-st vring and return it;
917 * duplicate skb and send it to other active vrings;
918 * in all cases override dest address to unicast peer's address
919 * Use old strategy when new is not supported yet:
920 * - for PBSS
921 * - for secure link
812 */ 922 */
813static struct vring *wil_tx_bcast(struct wil6210_priv *wil, 923static struct vring *wil_find_tx_bcast_1(struct wil6210_priv *wil,
814 struct sk_buff *skb) 924 struct sk_buff *skb)
925{
926 struct vring *v;
927 int i = wil->bcast_vring;
928
929 if (i < 0)
930 return NULL;
931 v = &wil->vring_tx[i];
932 if (!v->va)
933 return NULL;
934
935 return v;
936}
937
938static void wil_set_da_for_vring(struct wil6210_priv *wil,
939 struct sk_buff *skb, int vring_index)
940{
941 struct ethhdr *eth = (void *)skb->data;
942 int cid = wil->vring2cid_tid[vring_index][0];
943
944 ether_addr_copy(eth->h_dest, wil->sta[cid].addr);
945}
946
947static struct vring *wil_find_tx_bcast_2(struct wil6210_priv *wil,
948 struct sk_buff *skb)
815{ 949{
816 struct vring *v, *v2; 950 struct vring *v, *v2;
817 struct sk_buff *skb2; 951 struct sk_buff *skb2;
818 int i; 952 int i;
819 u8 cid; 953 u8 cid;
954 struct ethhdr *eth = (void *)skb->data;
955 char *src = eth->h_source;
820 956
821 /* find 1-st vring eligible for data */ 957 /* find 1-st vring eligible for data */
822 for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) { 958 for (i = 0; i < WIL6210_MAX_TX_RINGS; i++) {
@@ -825,9 +961,15 @@ static struct vring *wil_tx_bcast(struct wil6210_priv *wil,
825 continue; 961 continue;
826 962
827 cid = wil->vring2cid_tid[i][0]; 963 cid = wil->vring2cid_tid[i][0];
964 if (cid >= WIL6210_MAX_CID) /* skip BCAST */
965 continue;
828 if (!wil->sta[cid].data_port_open) 966 if (!wil->sta[cid].data_port_open)
829 continue; 967 continue;
830 968
969 /* don't Tx back to source when re-routing Rx->Tx at the AP */
970 if (0 == memcmp(wil->sta[cid].addr, src, ETH_ALEN))
971 continue;
972
831 goto found; 973 goto found;
832 } 974 }
833 975
@@ -845,9 +987,14 @@ found:
845 if (!v2->va) 987 if (!v2->va)
846 continue; 988 continue;
847 cid = wil->vring2cid_tid[i][0]; 989 cid = wil->vring2cid_tid[i][0];
990 if (cid >= WIL6210_MAX_CID) /* skip BCAST */
991 continue;
848 if (!wil->sta[cid].data_port_open) 992 if (!wil->sta[cid].data_port_open)
849 continue; 993 continue;
850 994
995 if (0 == memcmp(wil->sta[cid].addr, src, ETH_ALEN))
996 continue;
997
851 skb2 = skb_copy(skb, GFP_ATOMIC); 998 skb2 = skb_copy(skb, GFP_ATOMIC);
852 if (skb2) { 999 if (skb2) {
853 wil_dbg_txrx(wil, "BCAST DUP -> ring %d\n", i); 1000 wil_dbg_txrx(wil, "BCAST DUP -> ring %d\n", i);
@@ -861,6 +1008,20 @@ found:
861 return v; 1008 return v;
862} 1009}
863 1010
1011static struct vring *wil_find_tx_bcast(struct wil6210_priv *wil,
1012 struct sk_buff *skb)
1013{
1014 struct wireless_dev *wdev = wil->wdev;
1015
1016 if (wdev->iftype != NL80211_IFTYPE_AP)
1017 return wil_find_tx_bcast_2(wil, skb);
1018
1019 if (wil->privacy)
1020 return wil_find_tx_bcast_2(wil, skb);
1021
1022 return wil_find_tx_bcast_1(wil, skb);
1023}
1024
864static int wil_tx_desc_map(struct vring_tx_desc *d, dma_addr_t pa, u32 len, 1025static int wil_tx_desc_map(struct vring_tx_desc *d, dma_addr_t pa, u32 len,
865 int vring_index) 1026 int vring_index)
866{ 1027{
@@ -952,13 +1113,16 @@ static int __wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
952 struct vring_tx_data *txdata = &wil->vring_tx_data[vring_index]; 1113 struct vring_tx_data *txdata = &wil->vring_tx_data[vring_index];
953 uint i = swhead; 1114 uint i = swhead;
954 dma_addr_t pa; 1115 dma_addr_t pa;
1116 int used;
1117 bool mcast = (vring_index == wil->bcast_vring);
1118 uint len = skb_headlen(skb);
955 1119
956 wil_dbg_txrx(wil, "%s()\n", __func__); 1120 wil_dbg_txrx(wil, "%s()\n", __func__);
957 1121
958 if (unlikely(!txdata->enabled)) 1122 if (unlikely(!txdata->enabled))
959 return -EINVAL; 1123 return -EINVAL;
960 1124
961 if (avail < 1 + nr_frags) { 1125 if (unlikely(avail < 1 + nr_frags)) {
962 wil_err_ratelimited(wil, 1126 wil_err_ratelimited(wil,
963 "Tx ring[%2d] full. No space for %d fragments\n", 1127 "Tx ring[%2d] full. No space for %d fragments\n",
964 vring_index, 1 + nr_frags); 1128 vring_index, 1 + nr_frags);
@@ -977,9 +1141,19 @@ static int __wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
977 return -EINVAL; 1141 return -EINVAL;
978 vring->ctx[i].mapped_as = wil_mapped_as_single; 1142 vring->ctx[i].mapped_as = wil_mapped_as_single;
979 /* 1-st segment */ 1143 /* 1-st segment */
980 wil_tx_desc_map(d, pa, skb_headlen(skb), vring_index); 1144 wil_tx_desc_map(d, pa, len, vring_index);
1145 if (unlikely(mcast)) {
1146 d->mac.d[0] |= BIT(MAC_CFG_DESC_TX_0_MCS_EN_POS); /* MCS 0 */
1147 if (unlikely(len > WIL_BCAST_MCS0_LIMIT)) {
1148 /* set MCS 1 */
1149 d->mac.d[0] |= (1 << MAC_CFG_DESC_TX_0_MCS_INDEX_POS);
1150 /* packet mode 2 */
1151 d->mac.d[1] |= BIT(MAC_CFG_DESC_TX_1_PKT_MODE_EN_POS) |
1152 (2 << MAC_CFG_DESC_TX_1_PKT_MODE_POS);
1153 }
1154 }
981 /* Process TCP/UDP checksum offloading */ 1155 /* Process TCP/UDP checksum offloading */
982 if (wil_tx_desc_offload_cksum_set(wil, d, skb)) { 1156 if (unlikely(wil_tx_desc_offload_cksum_set(wil, d, skb))) {
983 wil_err(wil, "Tx[%2d] Failed to set cksum, drop packet\n", 1157 wil_err(wil, "Tx[%2d] Failed to set cksum, drop packet\n",
984 vring_index); 1158 vring_index);
985 goto dma_error; 1159 goto dma_error;
@@ -1027,8 +1201,14 @@ static int __wil_tx_vring(struct wil6210_priv *wil, struct vring *vring,
1027 */ 1201 */
1028 vring->ctx[i].skb = skb_get(skb); 1202 vring->ctx[i].skb = skb_get(skb);
1029 1203
1030 if (wil_vring_is_empty(vring)) /* performance monitoring */ 1204 /* performance monitoring */
1205 used = wil_vring_used_tx(vring);
1206 if (wil_val_in_range(vring_idle_trsh,
1207 used, used + nr_frags + 1)) {
1031 txdata->idle += get_cycles() - txdata->last_idle; 1208 txdata->idle += get_cycles() - txdata->last_idle;
1209 wil_dbg_txrx(wil, "Ring[%2d] not idle %d -> %d\n",
1210 vring_index, used, used + nr_frags + 1);
1211 }
1032 1212
1033 /* advance swhead */ 1213 /* advance swhead */
1034 wil_vring_advance_head(vring, nr_frags + 1); 1214 wil_vring_advance_head(vring, nr_frags + 1);
@@ -1077,23 +1257,24 @@ netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1077{ 1257{
1078 struct wil6210_priv *wil = ndev_to_wil(ndev); 1258 struct wil6210_priv *wil = ndev_to_wil(ndev);
1079 struct ethhdr *eth = (void *)skb->data; 1259 struct ethhdr *eth = (void *)skb->data;
1260 bool bcast = is_multicast_ether_addr(eth->h_dest);
1080 struct vring *vring; 1261 struct vring *vring;
1081 static bool pr_once_fw; 1262 static bool pr_once_fw;
1082 int rc; 1263 int rc;
1083 1264
1084 wil_dbg_txrx(wil, "%s()\n", __func__); 1265 wil_dbg_txrx(wil, "%s()\n", __func__);
1085 if (!test_bit(wil_status_fwready, wil->status)) { 1266 if (unlikely(!test_bit(wil_status_fwready, wil->status))) {
1086 if (!pr_once_fw) { 1267 if (!pr_once_fw) {
1087 wil_err(wil, "FW not ready\n"); 1268 wil_err(wil, "FW not ready\n");
1088 pr_once_fw = true; 1269 pr_once_fw = true;
1089 } 1270 }
1090 goto drop; 1271 goto drop;
1091 } 1272 }
1092 if (!test_bit(wil_status_fwconnected, wil->status)) { 1273 if (unlikely(!test_bit(wil_status_fwconnected, wil->status))) {
1093 wil_err(wil, "FW not connected\n"); 1274 wil_err(wil, "FW not connected\n");
1094 goto drop; 1275 goto drop;
1095 } 1276 }
1096 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { 1277 if (unlikely(wil->wdev->iftype == NL80211_IFTYPE_MONITOR)) {
1097 wil_err(wil, "Xmit in monitor mode not supported\n"); 1278 wil_err(wil, "Xmit in monitor mode not supported\n");
1098 goto drop; 1279 goto drop;
1099 } 1280 }
@@ -1104,12 +1285,10 @@ netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1104 /* in STA mode (ESS), all to same VRING */ 1285 /* in STA mode (ESS), all to same VRING */
1105 vring = wil_find_tx_vring_sta(wil, skb); 1286 vring = wil_find_tx_vring_sta(wil, skb);
1106 } else { /* direct communication, find matching VRING */ 1287 } else { /* direct communication, find matching VRING */
1107 if (is_unicast_ether_addr(eth->h_dest)) 1288 vring = bcast ? wil_find_tx_bcast(wil, skb) :
1108 vring = wil_find_tx_vring(wil, skb); 1289 wil_find_tx_ucast(wil, skb);
1109 else
1110 vring = wil_tx_bcast(wil, skb);
1111 } 1290 }
1112 if (!vring) { 1291 if (unlikely(!vring)) {
1113 wil_dbg_txrx(wil, "No Tx VRING found for %pM\n", eth->h_dest); 1292 wil_dbg_txrx(wil, "No Tx VRING found for %pM\n", eth->h_dest);
1114 goto drop; 1293 goto drop;
1115 } 1294 }
@@ -1117,7 +1296,7 @@ netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
1117 rc = wil_tx_vring(wil, vring, skb); 1296 rc = wil_tx_vring(wil, vring, skb);
1118 1297
1119 /* do we still have enough room in the vring? */ 1298 /* do we still have enough room in the vring? */
1120 if (wil_vring_avail_tx(vring) < wil_vring_wmark_low(vring)) { 1299 if (unlikely(wil_vring_avail_tx(vring) < wil_vring_wmark_low(vring))) {
1121 netif_tx_stop_all_queues(wil_to_ndev(wil)); 1300 netif_tx_stop_all_queues(wil_to_ndev(wil));
1122 wil_dbg_txrx(wil, "netif_tx_stop : ring full\n"); 1301 wil_dbg_txrx(wil, "netif_tx_stop : ring full\n");
1123 } 1302 }
@@ -1170,21 +1349,28 @@ int wil_tx_complete(struct wil6210_priv *wil, int ringid)
1170 struct vring_tx_data *txdata = &wil->vring_tx_data[ringid]; 1349 struct vring_tx_data *txdata = &wil->vring_tx_data[ringid];
1171 int done = 0; 1350 int done = 0;
1172 int cid = wil->vring2cid_tid[ringid][0]; 1351 int cid = wil->vring2cid_tid[ringid][0];
1173 struct wil_net_stats *stats = &wil->sta[cid].stats; 1352 struct wil_net_stats *stats = NULL;
1174 volatile struct vring_tx_desc *_d; 1353 volatile struct vring_tx_desc *_d;
1354 int used_before_complete;
1355 int used_new;
1175 1356
1176 if (!vring->va) { 1357 if (unlikely(!vring->va)) {
1177 wil_err(wil, "Tx irq[%d]: vring not initialized\n", ringid); 1358 wil_err(wil, "Tx irq[%d]: vring not initialized\n", ringid);
1178 return 0; 1359 return 0;
1179 } 1360 }
1180 1361
1181 if (!txdata->enabled) { 1362 if (unlikely(!txdata->enabled)) {
1182 wil_info(wil, "Tx irq[%d]: vring disabled\n", ringid); 1363 wil_info(wil, "Tx irq[%d]: vring disabled\n", ringid);
1183 return 0; 1364 return 0;
1184 } 1365 }
1185 1366
1186 wil_dbg_txrx(wil, "%s(%d)\n", __func__, ringid); 1367 wil_dbg_txrx(wil, "%s(%d)\n", __func__, ringid);
1187 1368
1369 used_before_complete = wil_vring_used_tx(vring);
1370
1371 if (cid < WIL6210_MAX_CID)
1372 stats = &wil->sta[cid].stats;
1373
1188 while (!wil_vring_is_empty(vring)) { 1374 while (!wil_vring_is_empty(vring)) {
1189 int new_swtail; 1375 int new_swtail;
1190 struct wil_ctx *ctx = &vring->ctx[vring->swtail]; 1376 struct wil_ctx *ctx = &vring->ctx[vring->swtail];
@@ -1196,7 +1382,7 @@ int wil_tx_complete(struct wil6210_priv *wil, int ringid)
1196 /* TODO: check we are not past head */ 1382 /* TODO: check we are not past head */
1197 1383
1198 _d = &vring->va[lf].tx; 1384 _d = &vring->va[lf].tx;
1199 if (!(_d->dma.status & TX_DMA_STATUS_DU)) 1385 if (unlikely(!(_d->dma.status & TX_DMA_STATUS_DU)))
1200 break; 1386 break;
1201 1387
1202 new_swtail = (lf + 1) % vring->size; 1388 new_swtail = (lf + 1) % vring->size;
@@ -1224,14 +1410,17 @@ int wil_tx_complete(struct wil6210_priv *wil, int ringid)
1224 wil_txdesc_unmap(dev, d, ctx); 1410 wil_txdesc_unmap(dev, d, ctx);
1225 1411
1226 if (skb) { 1412 if (skb) {
1227 if (d->dma.error == 0) { 1413 if (likely(d->dma.error == 0)) {
1228 ndev->stats.tx_packets++; 1414 ndev->stats.tx_packets++;
1229 stats->tx_packets++;
1230 ndev->stats.tx_bytes += skb->len; 1415 ndev->stats.tx_bytes += skb->len;
1231 stats->tx_bytes += skb->len; 1416 if (stats) {
1417 stats->tx_packets++;
1418 stats->tx_bytes += skb->len;
1419 }
1232 } else { 1420 } else {
1233 ndev->stats.tx_errors++; 1421 ndev->stats.tx_errors++;
1234 stats->tx_errors++; 1422 if (stats)
1423 stats->tx_errors++;
1235 } 1424 }
1236 wil_consume_skb(skb, d->dma.error == 0); 1425 wil_consume_skb(skb, d->dma.error == 0);
1237 } 1426 }
@@ -1246,8 +1435,12 @@ int wil_tx_complete(struct wil6210_priv *wil, int ringid)
1246 } 1435 }
1247 } 1436 }
1248 1437
1249 if (wil_vring_is_empty(vring)) { /* performance monitoring */ 1438 /* performance monitoring */
1250 wil_dbg_txrx(wil, "Ring[%2d] empty\n", ringid); 1439 used_new = wil_vring_used_tx(vring);
1440 if (wil_val_in_range(vring_idle_trsh,
1441 used_new, used_before_complete)) {
1442 wil_dbg_txrx(wil, "Ring[%2d] idle %d -> %d\n",
1443 ringid, used_before_complete, used_new);
1251 txdata->last_idle = get_cycles(); 1444 txdata->last_idle = get_cycles();
1252 } 1445 }
1253 1446
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h
index 94611568fc9a..4310972c9e16 100644
--- a/drivers/net/wireless/ath/wil6210/wil6210.h
+++ b/drivers/net/wireless/ath/wil6210/wil6210.h
@@ -27,9 +27,12 @@ extern bool no_fw_recovery;
27extern unsigned int mtu_max; 27extern unsigned int mtu_max;
28extern unsigned short rx_ring_overflow_thrsh; 28extern unsigned short rx_ring_overflow_thrsh;
29extern int agg_wsize; 29extern int agg_wsize;
30extern u32 vring_idle_trsh;
31extern bool rx_align_2;
30 32
31#define WIL_NAME "wil6210" 33#define WIL_NAME "wil6210"
32#define WIL_FW_NAME "wil6210.fw" 34#define WIL_FW_NAME "wil6210.fw" /* code */
35#define WIL_FW2_NAME "wil6210.board" /* board & radio parameters */
33 36
34#define WIL_MAX_BUS_REQUEST_KBPS 800000 /* ~6.1Gbps */ 37#define WIL_MAX_BUS_REQUEST_KBPS 800000 /* ~6.1Gbps */
35 38
@@ -47,6 +50,8 @@ static inline u32 WIL_GET_BITS(u32 x, int b0, int b1)
47#define WIL_TX_Q_LEN_DEFAULT (4000) 50#define WIL_TX_Q_LEN_DEFAULT (4000)
48#define WIL_RX_RING_SIZE_ORDER_DEFAULT (10) 51#define WIL_RX_RING_SIZE_ORDER_DEFAULT (10)
49#define WIL_TX_RING_SIZE_ORDER_DEFAULT (10) 52#define WIL_TX_RING_SIZE_ORDER_DEFAULT (10)
53#define WIL_BCAST_RING_SIZE_ORDER_DEFAULT (7)
54#define WIL_BCAST_MCS0_LIMIT (1024) /* limit for MCS0 frame size */
50/* limit ring size in range [32..32k] */ 55/* limit ring size in range [32..32k] */
51#define WIL_RING_SIZE_ORDER_MIN (5) 56#define WIL_RING_SIZE_ORDER_MIN (5)
52#define WIL_RING_SIZE_ORDER_MAX (15) 57#define WIL_RING_SIZE_ORDER_MAX (15)
@@ -120,6 +125,16 @@ struct RGF_ICR {
120 u32 IMC; /* Mask Clear, write 1 to clear */ 125 u32 IMC; /* Mask Clear, write 1 to clear */
121} __packed; 126} __packed;
122 127
128struct RGF_BL {
129 u32 ready; /* 0x880A3C bit [0] */
130#define BIT_BL_READY BIT(0)
131 u32 version; /* 0x880A40 version of the BL struct */
132 u32 rf_type; /* 0x880A44 ID of the connected RF */
133 u32 baseband_type; /* 0x880A48 ID of the baseband */
134 u8 mac_address[ETH_ALEN]; /* 0x880A4C permanent MAC */
135 u8 pad[2];
136} __packed;
137
123/* registers - FW addresses */ 138/* registers - FW addresses */
124#define RGF_USER_USAGE_1 (0x880004) 139#define RGF_USER_USAGE_1 (0x880004)
125#define RGF_USER_USAGE_6 (0x880018) 140#define RGF_USER_USAGE_6 (0x880018)
@@ -130,6 +145,7 @@ struct RGF_ICR {
130#define RGF_USER_MAC_CPU_0 (0x8801fc) 145#define RGF_USER_MAC_CPU_0 (0x8801fc)
131 #define BIT_USER_MAC_CPU_MAN_RST BIT(1) /* mac_cpu_man_rst */ 146 #define BIT_USER_MAC_CPU_MAN_RST BIT(1) /* mac_cpu_man_rst */
132#define RGF_USER_USER_SCRATCH_PAD (0x8802bc) 147#define RGF_USER_USER_SCRATCH_PAD (0x8802bc)
148#define RGF_USER_BL (0x880A3C) /* Boot Loader */
133#define RGF_USER_FW_REV_ID (0x880a8c) /* chip revision */ 149#define RGF_USER_FW_REV_ID (0x880a8c) /* chip revision */
134#define RGF_USER_CLKS_CTL_0 (0x880abc) 150#define RGF_USER_CLKS_CTL_0 (0x880abc)
135 #define BIT_USER_CLKS_CAR_AHB_SW_SEL BIT(1) /* ref clk/PLL */ 151 #define BIT_USER_CLKS_CAR_AHB_SW_SEL BIT(1) /* ref clk/PLL */
@@ -169,6 +185,13 @@ struct RGF_ICR {
169 #define BIT_DMA_ITR_CNT_CRL_CLR BIT(3) 185 #define BIT_DMA_ITR_CNT_CRL_CLR BIT(3)
170 #define BIT_DMA_ITR_CNT_CRL_REACH_TRSH BIT(4) 186 #define BIT_DMA_ITR_CNT_CRL_REACH_TRSH BIT(4)
171 187
188/* Offload control (Sparrow B0+) */
189#define RGF_DMA_OFUL_NID_0 (0x881cd4)
190 #define BIT_DMA_OFUL_NID_0_RX_EXT_TR_EN BIT(0)
191 #define BIT_DMA_OFUL_NID_0_TX_EXT_TR_EN BIT(1)
192 #define BIT_DMA_OFUL_NID_0_RX_EXT_A3_SRC BIT(2)
193 #define BIT_DMA_OFUL_NID_0_TX_EXT_A3_SRC BIT(3)
194
172/* New (sparrow v2+) interrupt moderation control */ 195/* New (sparrow v2+) interrupt moderation control */
173#define RGF_DMA_ITR_TX_DESQ_NO_MOD (0x881d40) 196#define RGF_DMA_ITR_TX_DESQ_NO_MOD (0x881d40)
174#define RGF_DMA_ITR_TX_CNT_TRSH (0x881d34) 197#define RGF_DMA_ITR_TX_CNT_TRSH (0x881d34)
@@ -229,16 +252,10 @@ struct RGF_ICR {
229 #define BIT_CAF_OSC_DIG_XTAL_STABLE BIT(0) 252 #define BIT_CAF_OSC_DIG_XTAL_STABLE BIT(0)
230 253
231#define RGF_USER_JTAG_DEV_ID (0x880b34) /* device ID */ 254#define RGF_USER_JTAG_DEV_ID (0x880b34) /* device ID */
232 #define JTAG_DEV_ID_MARLON_B0 (0x0612072f)
233 #define JTAG_DEV_ID_SPARROW_A0 (0x0632072f)
234 #define JTAG_DEV_ID_SPARROW_A1 (0x1632072f)
235 #define JTAG_DEV_ID_SPARROW_B0 (0x2632072f) 255 #define JTAG_DEV_ID_SPARROW_B0 (0x2632072f)
236 256
237enum { 257enum {
238 HW_VER_UNKNOWN, 258 HW_VER_UNKNOWN,
239 HW_VER_MARLON_B0, /* JTAG_DEV_ID_MARLON_B0 */
240 HW_VER_SPARROW_A0, /* JTAG_DEV_ID_SPARROW_A0 */
241 HW_VER_SPARROW_A1, /* JTAG_DEV_ID_SPARROW_A1 */
242 HW_VER_SPARROW_B0, /* JTAG_DEV_ID_SPARROW_B0 */ 259 HW_VER_SPARROW_B0, /* JTAG_DEV_ID_SPARROW_B0 */
243}; 260};
244 261
@@ -482,8 +499,6 @@ enum {
482}; 499};
483 500
484enum { 501enum {
485 hw_capability_reset_v2 = 0,
486 hw_capability_advanced_itr_moderation = 1,
487 hw_capability_last 502 hw_capability_last
488}; 503};
489 504
@@ -528,8 +543,9 @@ struct wil6210_priv {
528 wait_queue_head_t wq; /* for all wait_event() use */ 543 wait_queue_head_t wq; /* for all wait_event() use */
529 /* profile */ 544 /* profile */
530 u32 monitor_flags; 545 u32 monitor_flags;
531 u32 secure_pcp; /* create secure PCP? */ 546 u32 privacy; /* secure connection? */
532 int sinfo_gen; 547 int sinfo_gen;
548 u32 ap_isolate; /* no intra-BSS communication */
533 /* interrupt moderation */ 549 /* interrupt moderation */
534 u32 tx_max_burst_duration; 550 u32 tx_max_burst_duration;
535 u32 tx_interframe_timeout; 551 u32 tx_interframe_timeout;
@@ -581,6 +597,7 @@ struct wil6210_priv {
581 struct vring_tx_data vring_tx_data[WIL6210_MAX_TX_RINGS]; 597 struct vring_tx_data vring_tx_data[WIL6210_MAX_TX_RINGS];
582 u8 vring2cid_tid[WIL6210_MAX_TX_RINGS][2]; /* [0] - CID, [1] - TID */ 598 u8 vring2cid_tid[WIL6210_MAX_TX_RINGS][2]; /* [0] - CID, [1] - TID */
583 struct wil_sta_info sta[WIL6210_MAX_CID]; 599 struct wil_sta_info sta[WIL6210_MAX_CID];
600 int bcast_vring;
584 /* scan */ 601 /* scan */
585 struct cfg80211_scan_request *scan_request; 602 struct cfg80211_scan_request *scan_request;
586 603
@@ -658,7 +675,7 @@ int wil_if_add(struct wil6210_priv *wil);
658void wil_if_remove(struct wil6210_priv *wil); 675void wil_if_remove(struct wil6210_priv *wil);
659int wil_priv_init(struct wil6210_priv *wil); 676int wil_priv_init(struct wil6210_priv *wil);
660void wil_priv_deinit(struct wil6210_priv *wil); 677void wil_priv_deinit(struct wil6210_priv *wil);
661int wil_reset(struct wil6210_priv *wil); 678int wil_reset(struct wil6210_priv *wil, bool no_fw);
662void wil_fw_error_recovery(struct wil6210_priv *wil); 679void wil_fw_error_recovery(struct wil6210_priv *wil);
663void wil_set_recovery_state(struct wil6210_priv *wil, int state); 680void wil_set_recovery_state(struct wil6210_priv *wil, int state);
664int wil_up(struct wil6210_priv *wil); 681int wil_up(struct wil6210_priv *wil);
@@ -743,6 +760,9 @@ void wil_rx_fini(struct wil6210_priv *wil);
743int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size, 760int wil_vring_init_tx(struct wil6210_priv *wil, int id, int size,
744 int cid, int tid); 761 int cid, int tid);
745void wil_vring_fini_tx(struct wil6210_priv *wil, int id); 762void wil_vring_fini_tx(struct wil6210_priv *wil, int id);
763int wil_vring_init_bcast(struct wil6210_priv *wil, int id, int size);
764int wil_bcast_init(struct wil6210_priv *wil);
765void wil_bcast_fini(struct wil6210_priv *wil);
746 766
747netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev); 767netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev);
748int wil_tx_complete(struct wil6210_priv *wil, int ringid); 768int wil_tx_complete(struct wil6210_priv *wil, int ringid);
diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c
index 0f3e4334c8e3..9fe2085be2c5 100644
--- a/drivers/net/wireless/ath/wil6210/wmi.c
+++ b/drivers/net/wireless/ath/wil6210/wmi.c
@@ -281,7 +281,6 @@ int wmi_send(struct wil6210_priv *wil, u16 cmdid, void *buf, u16 len)
281/*=== Event handlers ===*/ 281/*=== Event handlers ===*/
282static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len) 282static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len)
283{ 283{
284 struct net_device *ndev = wil_to_ndev(wil);
285 struct wireless_dev *wdev = wil->wdev; 284 struct wireless_dev *wdev = wil->wdev;
286 struct wmi_ready_event *evt = d; 285 struct wmi_ready_event *evt = d;
287 286
@@ -290,11 +289,7 @@ static void wmi_evt_ready(struct wil6210_priv *wil, int id, void *d, int len)
290 289
291 wil_info(wil, "FW ver. %d; MAC %pM; %d MID's\n", wil->fw_version, 290 wil_info(wil, "FW ver. %d; MAC %pM; %d MID's\n", wil->fw_version,
292 evt->mac, wil->n_mids); 291 evt->mac, wil->n_mids);
293 292 /* ignore MAC address, we already have it from the boot loader */
294 if (!is_valid_ether_addr(ndev->dev_addr)) {
295 memcpy(ndev->dev_addr, evt->mac, ETH_ALEN);
296 memcpy(ndev->perm_addr, evt->mac, ETH_ALEN);
297 }
298 snprintf(wdev->wiphy->fw_version, sizeof(wdev->wiphy->fw_version), 293 snprintf(wdev->wiphy->fw_version, sizeof(wdev->wiphy->fw_version),
299 "%d", wil->fw_version); 294 "%d", wil->fw_version);
300} 295}
@@ -471,7 +466,7 @@ static void wmi_evt_connect(struct wil6210_priv *wil, int id, void *d, int len)
471 466
472 /* FIXME FW can transmit only ucast frames to peer */ 467 /* FIXME FW can transmit only ucast frames to peer */
473 /* FIXME real ring_id instead of hard coded 0 */ 468 /* FIXME real ring_id instead of hard coded 0 */
474 memcpy(wil->sta[evt->cid].addr, evt->bssid, ETH_ALEN); 469 ether_addr_copy(wil->sta[evt->cid].addr, evt->bssid);
475 wil->sta[evt->cid].status = wil_sta_conn_pending; 470 wil->sta[evt->cid].status = wil_sta_conn_pending;
476 471
477 wil->pending_connect_cid = evt->cid; 472 wil->pending_connect_cid = evt->cid;
@@ -529,8 +524,8 @@ static void wmi_evt_eapol_rx(struct wil6210_priv *wil, int id,
529 } 524 }
530 525
531 eth = (struct ethhdr *)skb_put(skb, ETH_HLEN); 526 eth = (struct ethhdr *)skb_put(skb, ETH_HLEN);
532 memcpy(eth->h_dest, ndev->dev_addr, ETH_ALEN); 527 ether_addr_copy(eth->h_dest, ndev->dev_addr);
533 memcpy(eth->h_source, evt->src_mac, ETH_ALEN); 528 ether_addr_copy(eth->h_source, evt->src_mac);
534 eth->h_proto = cpu_to_be16(ETH_P_PAE); 529 eth->h_proto = cpu_to_be16(ETH_P_PAE);
535 memcpy(skb_put(skb, eapol_len), evt->eapol, eapol_len); 530 memcpy(skb_put(skb, eapol_len), evt->eapol, eapol_len);
536 skb->protocol = eth_type_trans(skb, ndev); 531 skb->protocol = eth_type_trans(skb, ndev);
@@ -856,7 +851,7 @@ int wmi_set_mac_address(struct wil6210_priv *wil, void *addr)
856{ 851{
857 struct wmi_set_mac_address_cmd cmd; 852 struct wmi_set_mac_address_cmd cmd;
858 853
859 memcpy(cmd.mac, addr, ETH_ALEN); 854 ether_addr_copy(cmd.mac, addr);
860 855
861 wil_dbg_wmi(wil, "Set MAC %pM\n", addr); 856 wil_dbg_wmi(wil, "Set MAC %pM\n", addr);
862 857
@@ -879,7 +874,7 @@ int wmi_pcp_start(struct wil6210_priv *wil, int bi, u8 wmi_nettype, u8 chan)
879 struct wmi_pcp_started_event evt; 874 struct wmi_pcp_started_event evt;
880 } __packed reply; 875 } __packed reply;
881 876
882 if (!wil->secure_pcp) 877 if (!wil->privacy)
883 cmd.disable_sec = 1; 878 cmd.disable_sec = 1;
884 879
885 if ((cmd.pcp_max_assoc_sta > WIL6210_MAX_CID) || 880 if ((cmd.pcp_max_assoc_sta > WIL6210_MAX_CID) ||
@@ -1114,6 +1109,11 @@ int wmi_rx_chain_add(struct wil6210_priv *wil, struct vring *vring)
1114 */ 1109 */
1115 cmd.l3_l4_ctrl |= (1 << L3_L4_CTRL_TCPIP_CHECKSUM_EN_POS); 1110 cmd.l3_l4_ctrl |= (1 << L3_L4_CTRL_TCPIP_CHECKSUM_EN_POS);
1116 } 1111 }
1112
1113 if (rx_align_2)
1114 cmd.l2_802_3_offload_ctrl |=
1115 L2_802_3_OFFLOAD_CTRL_SNAP_KEEP_MSK;
1116
1117 /* typical time for secure PCP is 840ms */ 1117 /* typical time for secure PCP is 840ms */
1118 rc = wmi_call(wil, WMI_CFG_RX_CHAIN_CMDID, &cmd, sizeof(cmd), 1118 rc = wmi_call(wil, WMI_CFG_RX_CHAIN_CMDID, &cmd, sizeof(cmd),
1119 WMI_CFG_RX_CHAIN_DONE_EVENTID, &evt, sizeof(evt), 2000); 1119 WMI_CFG_RX_CHAIN_DONE_EVENTID, &evt, sizeof(evt), 2000);
@@ -1162,7 +1162,8 @@ int wmi_disconnect_sta(struct wil6210_priv *wil, const u8 *mac, u16 reason)
1162 struct wmi_disconnect_sta_cmd cmd = { 1162 struct wmi_disconnect_sta_cmd cmd = {
1163 .disconnect_reason = cpu_to_le16(reason), 1163 .disconnect_reason = cpu_to_le16(reason),
1164 }; 1164 };
1165 memcpy(cmd.dst_mac, mac, ETH_ALEN); 1165
1166 ether_addr_copy(cmd.dst_mac, mac);
1166 1167
1167 wil_dbg_wmi(wil, "%s(%pM, reason %d)\n", __func__, mac, reason); 1168 wil_dbg_wmi(wil, "%s(%pM, reason %d)\n", __func__, mac, reason);
1168 1169
diff --git a/drivers/net/wireless/ath/wil6210/wmi.h b/drivers/net/wireless/ath/wil6210/wmi.h
index 8a4af613e191..b29055315350 100644
--- a/drivers/net/wireless/ath/wil6210/wmi.h
+++ b/drivers/net/wireless/ath/wil6210/wmi.h
@@ -70,7 +70,6 @@ enum wmi_command_id {
70 WMI_SET_UCODE_IDLE_CMDID = 0x0813, 70 WMI_SET_UCODE_IDLE_CMDID = 0x0813,
71 WMI_SET_WORK_MODE_CMDID = 0x0815, 71 WMI_SET_WORK_MODE_CMDID = 0x0815,
72 WMI_LO_LEAKAGE_CALIB_CMDID = 0x0816, 72 WMI_LO_LEAKAGE_CALIB_CMDID = 0x0816,
73 WMI_MARLON_R_ACTIVATE_CMDID = 0x0817,
74 WMI_MARLON_R_READ_CMDID = 0x0818, 73 WMI_MARLON_R_READ_CMDID = 0x0818,
75 WMI_MARLON_R_WRITE_CMDID = 0x0819, 74 WMI_MARLON_R_WRITE_CMDID = 0x0819,
76 WMI_MARLON_R_TXRX_SEL_CMDID = 0x081a, 75 WMI_MARLON_R_TXRX_SEL_CMDID = 0x081a,
@@ -80,6 +79,7 @@ enum wmi_command_id {
80 WMI_RF_RX_TEST_CMDID = 0x081e, 79 WMI_RF_RX_TEST_CMDID = 0x081e,
81 WMI_CFG_RX_CHAIN_CMDID = 0x0820, 80 WMI_CFG_RX_CHAIN_CMDID = 0x0820,
82 WMI_VRING_CFG_CMDID = 0x0821, 81 WMI_VRING_CFG_CMDID = 0x0821,
82 WMI_BCAST_VRING_CFG_CMDID = 0x0822,
83 WMI_VRING_BA_EN_CMDID = 0x0823, 83 WMI_VRING_BA_EN_CMDID = 0x0823,
84 WMI_VRING_BA_DIS_CMDID = 0x0824, 84 WMI_VRING_BA_DIS_CMDID = 0x0824,
85 WMI_RCP_ADDBA_RESP_CMDID = 0x0825, 85 WMI_RCP_ADDBA_RESP_CMDID = 0x0825,
@@ -99,6 +99,7 @@ enum wmi_command_id {
99 WMI_BF_TXSS_MGMT_CMDID = 0x0837, 99 WMI_BF_TXSS_MGMT_CMDID = 0x0837,
100 WMI_BF_SM_MGMT_CMDID = 0x0838, 100 WMI_BF_SM_MGMT_CMDID = 0x0838,
101 WMI_BF_RXSS_MGMT_CMDID = 0x0839, 101 WMI_BF_RXSS_MGMT_CMDID = 0x0839,
102 WMI_BF_TRIG_CMDID = 0x083A,
102 WMI_SET_SECTORS_CMDID = 0x0849, 103 WMI_SET_SECTORS_CMDID = 0x0849,
103 WMI_MAINTAIN_PAUSE_CMDID = 0x0850, 104 WMI_MAINTAIN_PAUSE_CMDID = 0x0850,
104 WMI_MAINTAIN_RESUME_CMDID = 0x0851, 105 WMI_MAINTAIN_RESUME_CMDID = 0x0851,
@@ -596,6 +597,22 @@ struct wmi_vring_cfg_cmd {
596} __packed; 597} __packed;
597 598
598/* 599/*
600 * WMI_BCAST_VRING_CFG_CMDID
601 */
602struct wmi_bcast_vring_cfg {
603 struct wmi_sw_ring_cfg tx_sw_ring;
604 u8 ringid; /* 0-23 vrings */
605 u8 encap_trans_type;
606 u8 ds_cfg; /* 802.3 DS cfg */
607 u8 nwifi_ds_trans_type;
608} __packed;
609
610struct wmi_bcast_vring_cfg_cmd {
611 __le32 action;
612 struct wmi_bcast_vring_cfg vring_cfg;
613} __packed;
614
615/*
599 * WMI_VRING_BA_EN_CMDID 616 * WMI_VRING_BA_EN_CMDID
600 */ 617 */
601struct wmi_vring_ba_en_cmd { 618struct wmi_vring_ba_en_cmd {
@@ -687,6 +704,9 @@ struct wmi_cfg_rx_chain_cmd {
687 #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_POS (0) 704 #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_POS (0)
688 #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_LEN (1) 705 #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_LEN (1)
689 #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_MSK (0x1) 706 #define L2_802_3_OFFLOAD_CTRL_VLAN_TAG_INSERTION_MSK (0x1)
707 #define L2_802_3_OFFLOAD_CTRL_SNAP_KEEP_POS (1)
708 #define L2_802_3_OFFLOAD_CTRL_SNAP_KEEP_LEN (1)
709 #define L2_802_3_OFFLOAD_CTRL_SNAP_KEEP_MSK (0x2)
690 u8 l2_802_3_offload_ctrl; 710 u8 l2_802_3_offload_ctrl;
691 711
692 #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_POS (0) 712 #define L2_NWIFI_OFFLOAD_CTRL_REMOVE_QOS_POS (0)
@@ -841,7 +861,6 @@ enum wmi_event_id {
841 WMI_IQ_RX_CALIB_DONE_EVENTID = 0x1812, 861 WMI_IQ_RX_CALIB_DONE_EVENTID = 0x1812,
842 WMI_SET_WORK_MODE_DONE_EVENTID = 0x1815, 862 WMI_SET_WORK_MODE_DONE_EVENTID = 0x1815,
843 WMI_LO_LEAKAGE_CALIB_DONE_EVENTID = 0x1816, 863 WMI_LO_LEAKAGE_CALIB_DONE_EVENTID = 0x1816,
844 WMI_MARLON_R_ACTIVATE_DONE_EVENTID = 0x1817,
845 WMI_MARLON_R_READ_DONE_EVENTID = 0x1818, 864 WMI_MARLON_R_READ_DONE_EVENTID = 0x1818,
846 WMI_MARLON_R_WRITE_DONE_EVENTID = 0x1819, 865 WMI_MARLON_R_WRITE_DONE_EVENTID = 0x1819,
847 WMI_MARLON_R_TXRX_SEL_DONE_EVENTID = 0x181a, 866 WMI_MARLON_R_TXRX_SEL_DONE_EVENTID = 0x181a,
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c
index 55db9f03eb2a..6a1f03c271c1 100644
--- a/drivers/net/wireless/atmel.c
+++ b/drivers/net/wireless/atmel.c
@@ -1004,7 +1004,7 @@ static void frag_rx_path(struct atmel_private *priv,
1004 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4); 1004 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4);
1005 if ((crc ^ 0xffffffff) != netcrc) { 1005 if ((crc ^ 0xffffffff) != netcrc) {
1006 priv->dev->stats.rx_crc_errors++; 1006 priv->dev->stats.rx_crc_errors++;
1007 memset(priv->frag_source, 0xff, ETH_ALEN); 1007 eth_broadcast_addr(priv->frag_source);
1008 } 1008 }
1009 } 1009 }
1010 1010
@@ -1022,7 +1022,7 @@ static void frag_rx_path(struct atmel_private *priv,
1022 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4); 1022 atmel_copy_to_host(priv->dev, (void *)&netcrc, rx_packet_loc + msdu_size, 4);
1023 if ((crc ^ 0xffffffff) != netcrc) { 1023 if ((crc ^ 0xffffffff) != netcrc) {
1024 priv->dev->stats.rx_crc_errors++; 1024 priv->dev->stats.rx_crc_errors++;
1025 memset(priv->frag_source, 0xff, ETH_ALEN); 1025 eth_broadcast_addr(priv->frag_source);
1026 more_frags = 1; /* don't send broken assembly */ 1026 more_frags = 1; /* don't send broken assembly */
1027 } 1027 }
1028 } 1028 }
@@ -1031,7 +1031,7 @@ static void frag_rx_path(struct atmel_private *priv,
1031 priv->frag_no++; 1031 priv->frag_no++;
1032 1032
1033 if (!more_frags) { /* last one */ 1033 if (!more_frags) { /* last one */
1034 memset(priv->frag_source, 0xff, ETH_ALEN); 1034 eth_broadcast_addr(priv->frag_source);
1035 if (!(skb = dev_alloc_skb(priv->frag_len + 14))) { 1035 if (!(skb = dev_alloc_skb(priv->frag_len + 14))) {
1036 priv->dev->stats.rx_dropped++; 1036 priv->dev->stats.rx_dropped++;
1037 } else { 1037 } else {
@@ -1127,7 +1127,7 @@ static void rx_done_irq(struct atmel_private *priv)
1127 atmel_copy_to_host(priv->dev, (unsigned char *)&priv->rx_buf, rx_packet_loc + 24, msdu_size); 1127 atmel_copy_to_host(priv->dev, (unsigned char *)&priv->rx_buf, rx_packet_loc + 24, msdu_size);
1128 1128
1129 /* we use the same buffer for frag reassembly and control packets */ 1129 /* we use the same buffer for frag reassembly and control packets */
1130 memset(priv->frag_source, 0xff, ETH_ALEN); 1130 eth_broadcast_addr(priv->frag_source);
1131 1131
1132 if (priv->do_rx_crc) { 1132 if (priv->do_rx_crc) {
1133 /* last 4 octets is crc */ 1133 /* last 4 octets is crc */
@@ -1379,7 +1379,7 @@ static int atmel_close(struct net_device *dev)
1379 wrqu.data.length = 0; 1379 wrqu.data.length = 0;
1380 wrqu.data.flags = 0; 1380 wrqu.data.flags = 0;
1381 wrqu.ap_addr.sa_family = ARPHRD_ETHER; 1381 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
1382 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 1382 eth_zero_addr(wrqu.ap_addr.sa_data);
1383 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); 1383 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
1384 } 1384 }
1385 1385
@@ -1555,7 +1555,7 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port,
1555 priv->last_qual = jiffies; 1555 priv->last_qual = jiffies;
1556 priv->last_beacon_timestamp = 0; 1556 priv->last_beacon_timestamp = 0;
1557 memset(priv->frag_source, 0xff, sizeof(priv->frag_source)); 1557 memset(priv->frag_source, 0xff, sizeof(priv->frag_source));
1558 memset(priv->BSSID, 0, ETH_ALEN); 1558 eth_zero_addr(priv->BSSID);
1559 priv->CurrentBSSID[0] = 0xFF; /* Initialize to something invalid.... */ 1559 priv->CurrentBSSID[0] = 0xFF; /* Initialize to something invalid.... */
1560 priv->station_was_associated = 0; 1560 priv->station_was_associated = 0;
1561 1561
@@ -2760,7 +2760,7 @@ static void atmel_scan(struct atmel_private *priv, int specific_ssid)
2760 u8 SSID_size; 2760 u8 SSID_size;
2761 } cmd; 2761 } cmd;
2762 2762
2763 memset(cmd.BSSID, 0xff, ETH_ALEN); 2763 eth_broadcast_addr(cmd.BSSID);
2764 2764
2765 if (priv->fast_scan) { 2765 if (priv->fast_scan) {
2766 cmd.SSID_size = priv->SSID_size; 2766 cmd.SSID_size = priv->SSID_size;
@@ -4049,7 +4049,7 @@ static int reset_atmel_card(struct net_device *dev)
4049 wrqu.data.length = 0; 4049 wrqu.data.length = 0;
4050 wrqu.data.flags = 0; 4050 wrqu.data.flags = 0;
4051 wrqu.ap_addr.sa_family = ARPHRD_ETHER; 4051 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
4052 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 4052 eth_zero_addr(wrqu.ap_addr.sa_data);
4053 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL); 4053 wireless_send_event(priv->dev, SIOCGIWAP, &wrqu, NULL);
4054 } 4054 }
4055 4055
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
index 1d7982afc0ad..6837064908be 100644
--- a/drivers/net/wireless/b43/dma.c
+++ b/drivers/net/wireless/b43/dma.c
@@ -553,7 +553,7 @@ static bool b43_dma_mapping_error(struct b43_dmaring *ring,
553 size_t buffersize, bool dma_to_device) 553 size_t buffersize, bool dma_to_device)
554{ 554{
555 if (unlikely(dma_mapping_error(ring->dev->dev->dma_dev, addr))) 555 if (unlikely(dma_mapping_error(ring->dev->dev->dma_dev, addr)))
556 return 1; 556 return true;
557 557
558 switch (ring->type) { 558 switch (ring->type) {
559 case B43_DMA_30BIT: 559 case B43_DMA_30BIT:
@@ -571,13 +571,13 @@ static bool b43_dma_mapping_error(struct b43_dmaring *ring,
571 } 571 }
572 572
573 /* The address is OK. */ 573 /* The address is OK. */
574 return 0; 574 return false;
575 575
576address_error: 576address_error:
577 /* We can't support this address. Unmap it again. */ 577 /* We can't support this address. Unmap it again. */
578 unmap_descbuffer(ring, addr, buffersize, dma_to_device); 578 unmap_descbuffer(ring, addr, buffersize, dma_to_device);
579 579
580 return 1; 580 return true;
581} 581}
582 582
583static bool b43_rx_buffer_is_poisoned(struct b43_dmaring *ring, struct sk_buff *skb) 583static bool b43_rx_buffer_is_poisoned(struct b43_dmaring *ring, struct sk_buff *skb)
@@ -1099,16 +1099,16 @@ static bool b43_dma_translation_in_low_word(struct b43_wldev *dev,
1099 enum b43_dmatype type) 1099 enum b43_dmatype type)
1100{ 1100{
1101 if (type != B43_DMA_64BIT) 1101 if (type != B43_DMA_64BIT)
1102 return 1; 1102 return true;
1103 1103
1104#ifdef CONFIG_B43_SSB 1104#ifdef CONFIG_B43_SSB
1105 if (dev->dev->bus_type == B43_BUS_SSB && 1105 if (dev->dev->bus_type == B43_BUS_SSB &&
1106 dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI && 1106 dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
1107 !(pci_is_pcie(dev->dev->sdev->bus->host_pci) && 1107 !(pci_is_pcie(dev->dev->sdev->bus->host_pci) &&
1108 ssb_read32(dev->dev->sdev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64)) 1108 ssb_read32(dev->dev->sdev, SSB_TMSHIGH) & SSB_TMSHIGH_DMA64))
1109 return 1; 1109 return true;
1110#endif 1110#endif
1111 return 0; 1111 return false;
1112} 1112}
1113 1113
1114int b43_dma_init(struct b43_wldev *dev) 1114int b43_dma_init(struct b43_wldev *dev)
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c
index 75345c1e8c34..b2f9521fe551 100644
--- a/drivers/net/wireless/b43/main.c
+++ b/drivers/net/wireless/b43/main.c
@@ -4132,7 +4132,7 @@ static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
4132 if (conf->bssid) 4132 if (conf->bssid)
4133 memcpy(wl->bssid, conf->bssid, ETH_ALEN); 4133 memcpy(wl->bssid, conf->bssid, ETH_ALEN);
4134 else 4134 else
4135 memset(wl->bssid, 0, ETH_ALEN); 4135 eth_zero_addr(wl->bssid);
4136 } 4136 }
4137 4137
4138 if (b43_status(dev) >= B43_STAT_INITIALIZED) { 4138 if (b43_status(dev) >= B43_STAT_INITIALIZED) {
@@ -4819,7 +4819,7 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
4819 switch (dev->dev->bus_type) { 4819 switch (dev->dev->bus_type) {
4820#ifdef CONFIG_B43_BCMA 4820#ifdef CONFIG_B43_BCMA
4821 case B43_BUS_BCMA: 4821 case B43_BUS_BCMA:
4822 bcma_core_pci_down(dev->dev->bdev->bus); 4822 bcma_host_pci_down(dev->dev->bdev->bus);
4823 break; 4823 break;
4824#endif 4824#endif
4825#ifdef CONFIG_B43_SSB 4825#ifdef CONFIG_B43_SSB
@@ -4866,9 +4866,9 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
4866 switch (dev->dev->bus_type) { 4866 switch (dev->dev->bus_type) {
4867#ifdef CONFIG_B43_BCMA 4867#ifdef CONFIG_B43_BCMA
4868 case B43_BUS_BCMA: 4868 case B43_BUS_BCMA:
4869 bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0], 4869 bcma_host_pci_irq_ctl(dev->dev->bdev->bus,
4870 dev->dev->bdev, true); 4870 dev->dev->bdev, true);
4871 bcma_core_pci_up(dev->dev->bdev->bus); 4871 bcma_host_pci_up(dev->dev->bdev->bus);
4872 break; 4872 break;
4873#endif 4873#endif
4874#ifdef CONFIG_B43_SSB 4874#ifdef CONFIG_B43_SSB
@@ -5051,7 +5051,7 @@ static void b43_op_remove_interface(struct ieee80211_hw *hw,
5051 wl->operating = false; 5051 wl->operating = false;
5052 5052
5053 b43_adjust_opmode(dev); 5053 b43_adjust_opmode(dev);
5054 memset(wl->mac_addr, 0, ETH_ALEN); 5054 eth_zero_addr(wl->mac_addr);
5055 b43_upload_card_macaddress(dev); 5055 b43_upload_card_macaddress(dev);
5056 5056
5057 mutex_unlock(&wl->mutex); 5057 mutex_unlock(&wl->mutex);
@@ -5067,8 +5067,8 @@ static int b43_op_start(struct ieee80211_hw *hw)
5067 /* Kill all old instance specific information to make sure 5067 /* Kill all old instance specific information to make sure
5068 * the card won't use it in the short timeframe between start 5068 * the card won't use it in the short timeframe between start
5069 * and mac80211 reconfiguring it. */ 5069 * and mac80211 reconfiguring it. */
5070 memset(wl->bssid, 0, ETH_ALEN); 5070 eth_zero_addr(wl->bssid);
5071 memset(wl->mac_addr, 0, ETH_ALEN); 5071 eth_zero_addr(wl->mac_addr);
5072 wl->filter_flags = 0; 5072 wl->filter_flags = 0;
5073 wl->radiotap_enabled = false; 5073 wl->radiotap_enabled = false;
5074 b43_qos_clear(wl); 5074 b43_qos_clear(wl);
diff --git a/drivers/net/wireless/b43legacy/dma.c b/drivers/net/wireless/b43legacy/dma.c
index b2ed1795130b..f9dd892b9f27 100644
--- a/drivers/net/wireless/b43legacy/dma.c
+++ b/drivers/net/wireless/b43legacy/dma.c
@@ -427,7 +427,7 @@ static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring,
427 bool dma_to_device) 427 bool dma_to_device)
428{ 428{
429 if (unlikely(dma_mapping_error(ring->dev->dev->dma_dev, addr))) 429 if (unlikely(dma_mapping_error(ring->dev->dev->dma_dev, addr)))
430 return 1; 430 return true;
431 431
432 switch (ring->type) { 432 switch (ring->type) {
433 case B43legacy_DMA_30BIT: 433 case B43legacy_DMA_30BIT:
@@ -441,13 +441,13 @@ static bool b43legacy_dma_mapping_error(struct b43legacy_dmaring *ring,
441 } 441 }
442 442
443 /* The address is OK. */ 443 /* The address is OK. */
444 return 0; 444 return false;
445 445
446address_error: 446address_error:
447 /* We can't support this address. Unmap it again. */ 447 /* We can't support this address. Unmap it again. */
448 unmap_descbuffer(ring, addr, buffersize, dma_to_device); 448 unmap_descbuffer(ring, addr, buffersize, dma_to_device);
449 449
450 return 1; 450 return true;
451} 451}
452 452
453static int setup_rx_descbuffer(struct b43legacy_dmaring *ring, 453static int setup_rx_descbuffer(struct b43legacy_dmaring *ring,
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c
index 4e58c0069830..c77b7f59505c 100644
--- a/drivers/net/wireless/b43legacy/main.c
+++ b/drivers/net/wireless/b43legacy/main.c
@@ -2866,7 +2866,7 @@ static void b43legacy_op_bss_info_changed(struct ieee80211_hw *hw,
2866 if (conf->bssid) 2866 if (conf->bssid)
2867 memcpy(wl->bssid, conf->bssid, ETH_ALEN); 2867 memcpy(wl->bssid, conf->bssid, ETH_ALEN);
2868 else 2868 else
2869 memset(wl->bssid, 0, ETH_ALEN); 2869 eth_zero_addr(wl->bssid);
2870 } 2870 }
2871 2871
2872 if (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) { 2872 if (b43legacy_status(dev) >= B43legacy_STAT_INITIALIZED) {
@@ -3470,7 +3470,7 @@ static void b43legacy_op_remove_interface(struct ieee80211_hw *hw,
3470 3470
3471 spin_lock_irqsave(&wl->irq_lock, flags); 3471 spin_lock_irqsave(&wl->irq_lock, flags);
3472 b43legacy_adjust_opmode(dev); 3472 b43legacy_adjust_opmode(dev);
3473 memset(wl->mac_addr, 0, ETH_ALEN); 3473 eth_zero_addr(wl->mac_addr);
3474 b43legacy_upload_card_macaddress(dev); 3474 b43legacy_upload_card_macaddress(dev);
3475 spin_unlock_irqrestore(&wl->irq_lock, flags); 3475 spin_unlock_irqrestore(&wl->irq_lock, flags);
3476 3476
@@ -3487,8 +3487,8 @@ static int b43legacy_op_start(struct ieee80211_hw *hw)
3487 /* Kill all old instance specific information to make sure 3487 /* Kill all old instance specific information to make sure
3488 * the card won't use it in the short timeframe between start 3488 * the card won't use it in the short timeframe between start
3489 * and mac80211 reconfiguring it. */ 3489 * and mac80211 reconfiguring it. */
3490 memset(wl->bssid, 0, ETH_ALEN); 3490 eth_zero_addr(wl->bssid);
3491 memset(wl->mac_addr, 0, ETH_ALEN); 3491 eth_zero_addr(wl->mac_addr);
3492 wl->filter_flags = 0; 3492 wl->filter_flags = 0;
3493 wl->beacon0_uploaded = false; 3493 wl->beacon0_uploaded = false;
3494 wl->beacon1_uploaded = false; 3494 wl->beacon1_uploaded = false;
diff --git a/drivers/net/wireless/b43legacy/rfkill.c b/drivers/net/wireless/b43legacy/rfkill.c
index c4559bcbc707..7c1bdbc02569 100644
--- a/drivers/net/wireless/b43legacy/rfkill.c
+++ b/drivers/net/wireless/b43legacy/rfkill.c
@@ -32,7 +32,7 @@ bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)
32 if (dev->dev->id.revision >= 3) { 32 if (dev->dev->id.revision >= 3) {
33 if (!(b43legacy_read32(dev, B43legacy_MMIO_RADIO_HWENABLED_HI) 33 if (!(b43legacy_read32(dev, B43legacy_MMIO_RADIO_HWENABLED_HI)
34 & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK)) 34 & B43legacy_MMIO_RADIO_HWENABLED_HI_MASK))
35 return 1; 35 return true;
36 } else { 36 } else {
37 /* To prevent CPU fault on PPC, do not read a register 37 /* To prevent CPU fault on PPC, do not read a register
38 * unless the interface is started; however, on resume 38 * unless the interface is started; however, on resume
@@ -40,12 +40,12 @@ bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)
40 * that happens, unconditionally return TRUE. 40 * that happens, unconditionally return TRUE.
41 */ 41 */
42 if (b43legacy_status(dev) < B43legacy_STAT_STARTED) 42 if (b43legacy_status(dev) < B43legacy_STAT_STARTED)
43 return 1; 43 return true;
44 if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO) 44 if (b43legacy_read16(dev, B43legacy_MMIO_RADIO_HWENABLED_LO)
45 & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK) 45 & B43legacy_MMIO_RADIO_HWENABLED_LO_MASK)
46 return 1; 46 return true;
47 } 47 }
48 return 0; 48 return false;
49} 49}
50 50
51/* The poll callback for the hardware button. */ 51/* The poll callback for the hardware button. */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
index 7944224e3fc9..9b508bd3b839 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/bcmsdh.c
@@ -29,6 +29,7 @@
29#include <linux/mmc/host.h> 29#include <linux/mmc/host.h>
30#include <linux/platform_device.h> 30#include <linux/platform_device.h>
31#include <linux/platform_data/brcmfmac-sdio.h> 31#include <linux/platform_data/brcmfmac-sdio.h>
32#include <linux/pm_runtime.h>
32#include <linux/suspend.h> 33#include <linux/suspend.h>
33#include <linux/errno.h> 34#include <linux/errno.h>
34#include <linux/module.h> 35#include <linux/module.h>
@@ -58,6 +59,14 @@
58#define BRCMF_DEFAULT_TXGLOM_SIZE 32 /* max tx frames in glom chain */ 59#define BRCMF_DEFAULT_TXGLOM_SIZE 32 /* max tx frames in glom chain */
59#define BRCMF_DEFAULT_RXGLOM_SIZE 32 /* max rx frames in glom chain */ 60#define BRCMF_DEFAULT_RXGLOM_SIZE 32 /* max rx frames in glom chain */
60 61
62struct brcmf_sdiod_freezer {
63 atomic_t freezing;
64 atomic_t thread_count;
65 u32 frozen_count;
66 wait_queue_head_t thread_freeze;
67 struct completion resumed;
68};
69
61static int brcmf_sdiod_txglomsz = BRCMF_DEFAULT_TXGLOM_SIZE; 70static int brcmf_sdiod_txglomsz = BRCMF_DEFAULT_TXGLOM_SIZE;
62module_param_named(txglomsz, brcmf_sdiod_txglomsz, int, 0); 71module_param_named(txglomsz, brcmf_sdiod_txglomsz, int, 0);
63MODULE_PARM_DESC(txglomsz, "maximum tx packet chain size [SDIO]"); 72MODULE_PARM_DESC(txglomsz, "maximum tx packet chain size [SDIO]");
@@ -197,6 +206,30 @@ int brcmf_sdiod_intr_unregister(struct brcmf_sdio_dev *sdiodev)
197 return 0; 206 return 0;
198} 207}
199 208
209void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
210 enum brcmf_sdiod_state state)
211{
212 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM ||
213 state == sdiodev->state)
214 return;
215
216 brcmf_dbg(TRACE, "%d -> %d\n", sdiodev->state, state);
217 switch (sdiodev->state) {
218 case BRCMF_SDIOD_DATA:
219 /* any other state means bus interface is down */
220 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
221 break;
222 case BRCMF_SDIOD_DOWN:
223 /* transition from DOWN to DATA means bus interface is up */
224 if (state == BRCMF_SDIOD_DATA)
225 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_UP);
226 break;
227 default:
228 break;
229 }
230 sdiodev->state = state;
231}
232
200static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func, 233static inline int brcmf_sdiod_f0_writeb(struct sdio_func *func,
201 uint regaddr, u8 byte) 234 uint regaddr, u8 byte)
202{ 235{
@@ -269,12 +302,6 @@ static int brcmf_sdiod_request_data(struct brcmf_sdio_dev *sdiodev, u8 fn,
269 return ret; 302 return ret;
270} 303}
271 304
272static void brcmf_sdiod_nomedium_state(struct brcmf_sdio_dev *sdiodev)
273{
274 sdiodev->state = BRCMF_STATE_NOMEDIUM;
275 brcmf_bus_change_state(sdiodev->bus_if, BRCMF_BUS_DOWN);
276}
277
278static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr, 305static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
279 u8 regsz, void *data, bool write) 306 u8 regsz, void *data, bool write)
280{ 307{
@@ -282,7 +309,7 @@ static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
282 s32 retry = 0; 309 s32 retry = 0;
283 int ret; 310 int ret;
284 311
285 if (sdiodev->state == BRCMF_STATE_NOMEDIUM) 312 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
286 return -ENOMEDIUM; 313 return -ENOMEDIUM;
287 314
288 /* 315 /*
@@ -308,7 +335,7 @@ static int brcmf_sdiod_regrw_helper(struct brcmf_sdio_dev *sdiodev, u32 addr,
308 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT); 335 retry++ < SDIOH_API_ACCESS_RETRY_LIMIT);
309 336
310 if (ret == -ENOMEDIUM) 337 if (ret == -ENOMEDIUM)
311 brcmf_sdiod_nomedium_state(sdiodev); 338 brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
312 else if (ret != 0) { 339 else if (ret != 0) {
313 /* 340 /*
314 * SleepCSR register access can fail when 341 * SleepCSR register access can fail when
@@ -331,7 +358,7 @@ brcmf_sdiod_set_sbaddr_window(struct brcmf_sdio_dev *sdiodev, u32 address)
331 int err = 0, i; 358 int err = 0, i;
332 u8 addr[3]; 359 u8 addr[3];
333 360
334 if (sdiodev->state == BRCMF_STATE_NOMEDIUM) 361 if (sdiodev->state == BRCMF_SDIOD_NOMEDIUM)
335 return -ENOMEDIUM; 362 return -ENOMEDIUM;
336 363
337 addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK; 364 addr[0] = (address >> 8) & SBSDIO_SBADDRLOW_MASK;
@@ -460,7 +487,7 @@ static int brcmf_sdiod_buffrw(struct brcmf_sdio_dev *sdiodev, uint fn,
460 err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr, 487 err = sdio_readsb(sdiodev->func[fn], ((u8 *)(pkt->data)), addr,
461 req_sz); 488 req_sz);
462 if (err == -ENOMEDIUM) 489 if (err == -ENOMEDIUM)
463 brcmf_sdiod_nomedium_state(sdiodev); 490 brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
464 return err; 491 return err;
465} 492}
466 493
@@ -595,7 +622,7 @@ static int brcmf_sdiod_sglist_rw(struct brcmf_sdio_dev *sdiodev, uint fn,
595 622
596 ret = mmc_cmd.error ? mmc_cmd.error : mmc_dat.error; 623 ret = mmc_cmd.error ? mmc_cmd.error : mmc_dat.error;
597 if (ret == -ENOMEDIUM) { 624 if (ret == -ENOMEDIUM) {
598 brcmf_sdiod_nomedium_state(sdiodev); 625 brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_NOMEDIUM);
599 break; 626 break;
600 } else if (ret != 0) { 627 } else if (ret != 0) {
601 brcmf_err("CMD53 sg block %s failed %d\n", 628 brcmf_err("CMD53 sg block %s failed %d\n",
@@ -877,6 +904,87 @@ static void brcmf_sdiod_sgtable_alloc(struct brcmf_sdio_dev *sdiodev)
877 sdiodev->txglomsz = brcmf_sdiod_txglomsz; 904 sdiodev->txglomsz = brcmf_sdiod_txglomsz;
878} 905}
879 906
907#ifdef CONFIG_PM_SLEEP
908static int brcmf_sdiod_freezer_attach(struct brcmf_sdio_dev *sdiodev)
909{
910 sdiodev->freezer = kzalloc(sizeof(*sdiodev->freezer), GFP_KERNEL);
911 if (!sdiodev->freezer)
912 return -ENOMEM;
913 atomic_set(&sdiodev->freezer->thread_count, 0);
914 atomic_set(&sdiodev->freezer->freezing, 0);
915 init_waitqueue_head(&sdiodev->freezer->thread_freeze);
916 init_completion(&sdiodev->freezer->resumed);
917 return 0;
918}
919
920static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
921{
922 if (sdiodev->freezer) {
923 WARN_ON(atomic_read(&sdiodev->freezer->freezing));
924 kfree(sdiodev->freezer);
925 }
926}
927
928static int brcmf_sdiod_freezer_on(struct brcmf_sdio_dev *sdiodev)
929{
930 atomic_t *expect = &sdiodev->freezer->thread_count;
931 int res = 0;
932
933 sdiodev->freezer->frozen_count = 0;
934 reinit_completion(&sdiodev->freezer->resumed);
935 atomic_set(&sdiodev->freezer->freezing, 1);
936 brcmf_sdio_trigger_dpc(sdiodev->bus);
937 wait_event(sdiodev->freezer->thread_freeze,
938 atomic_read(expect) == sdiodev->freezer->frozen_count);
939 sdio_claim_host(sdiodev->func[1]);
940 res = brcmf_sdio_sleep(sdiodev->bus, true);
941 sdio_release_host(sdiodev->func[1]);
942 return res;
943}
944
945static void brcmf_sdiod_freezer_off(struct brcmf_sdio_dev *sdiodev)
946{
947 sdio_claim_host(sdiodev->func[1]);
948 brcmf_sdio_sleep(sdiodev->bus, false);
949 sdio_release_host(sdiodev->func[1]);
950 atomic_set(&sdiodev->freezer->freezing, 0);
951 complete_all(&sdiodev->freezer->resumed);
952}
953
954bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev)
955{
956 return atomic_read(&sdiodev->freezer->freezing);
957}
958
959void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev)
960{
961 if (!brcmf_sdiod_freezing(sdiodev))
962 return;
963 sdiodev->freezer->frozen_count++;
964 wake_up(&sdiodev->freezer->thread_freeze);
965 wait_for_completion(&sdiodev->freezer->resumed);
966}
967
968void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev)
969{
970 atomic_inc(&sdiodev->freezer->thread_count);
971}
972
973void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
974{
975 atomic_dec(&sdiodev->freezer->thread_count);
976}
977#else
978static int brcmf_sdiod_freezer_attach(struct brcmf_sdio_dev *sdiodev)
979{
980 return 0;
981}
982
983static void brcmf_sdiod_freezer_detach(struct brcmf_sdio_dev *sdiodev)
984{
985}
986#endif /* CONFIG_PM_SLEEP */
987
880static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev) 988static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
881{ 989{
882 if (sdiodev->bus) { 990 if (sdiodev->bus) {
@@ -884,6 +992,8 @@ static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
884 sdiodev->bus = NULL; 992 sdiodev->bus = NULL;
885 } 993 }
886 994
995 brcmf_sdiod_freezer_detach(sdiodev);
996
887 /* Disable Function 2 */ 997 /* Disable Function 2 */
888 sdio_claim_host(sdiodev->func[2]); 998 sdio_claim_host(sdiodev->func[2]);
889 sdio_disable_func(sdiodev->func[2]); 999 sdio_disable_func(sdiodev->func[2]);
@@ -897,6 +1007,7 @@ static int brcmf_sdiod_remove(struct brcmf_sdio_dev *sdiodev)
897 sg_free_table(&sdiodev->sgtable); 1007 sg_free_table(&sdiodev->sgtable);
898 sdiodev->sbwad = 0; 1008 sdiodev->sbwad = 0;
899 1009
1010 pm_runtime_allow(sdiodev->func[1]->card->host->parent);
900 return 0; 1011 return 0;
901} 1012}
902 1013
@@ -955,13 +1066,17 @@ static int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)
955 */ 1066 */
956 brcmf_sdiod_sgtable_alloc(sdiodev); 1067 brcmf_sdiod_sgtable_alloc(sdiodev);
957 1068
1069 ret = brcmf_sdiod_freezer_attach(sdiodev);
1070 if (ret)
1071 goto out;
1072
958 /* try to attach to the target device */ 1073 /* try to attach to the target device */
959 sdiodev->bus = brcmf_sdio_probe(sdiodev); 1074 sdiodev->bus = brcmf_sdio_probe(sdiodev);
960 if (!sdiodev->bus) { 1075 if (!sdiodev->bus) {
961 ret = -ENODEV; 1076 ret = -ENODEV;
962 goto out; 1077 goto out;
963 } 1078 }
964 1079 pm_runtime_forbid(host->parent);
965out: 1080out:
966 if (ret) 1081 if (ret)
967 brcmf_sdiod_remove(sdiodev); 1082 brcmf_sdiod_remove(sdiodev);
@@ -983,6 +1098,8 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
983 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341), 1098 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43341),
984 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362), 1099 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43362),
985 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339), 1100 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4335_4339),
1101 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_43430),
1102 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4345),
986 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354), 1103 BRCMF_SDIO_DEVICE(SDIO_DEVICE_ID_BROADCOM_4354),
987 { /* end: all zeroes */ } 1104 { /* end: all zeroes */ }
988}; 1105};
@@ -1050,9 +1167,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
1050 bus_if->wowl_supported = true; 1167 bus_if->wowl_supported = true;
1051#endif 1168#endif
1052 1169
1053 sdiodev->sleeping = false; 1170 brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
1054 atomic_set(&sdiodev->suspend, false);
1055 init_waitqueue_head(&sdiodev->idle_wait);
1056 1171
1057 brcmf_dbg(SDIO, "F2 found, calling brcmf_sdiod_probe...\n"); 1172 brcmf_dbg(SDIO, "F2 found, calling brcmf_sdiod_probe...\n");
1058 err = brcmf_sdiod_probe(sdiodev); 1173 err = brcmf_sdiod_probe(sdiodev);
@@ -1083,7 +1198,7 @@ static void brcmf_ops_sdio_remove(struct sdio_func *func)
1083 brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device); 1198 brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
1084 brcmf_dbg(SDIO, "Function: %d\n", func->num); 1199 brcmf_dbg(SDIO, "Function: %d\n", func->num);
1085 1200
1086 if (func->num != 1 && func->num != 2) 1201 if (func->num != 1)
1087 return; 1202 return;
1088 1203
1089 bus_if = dev_get_drvdata(&func->dev); 1204 bus_if = dev_get_drvdata(&func->dev);
@@ -1114,24 +1229,22 @@ void brcmf_sdio_wowl_config(struct device *dev, bool enabled)
1114#ifdef CONFIG_PM_SLEEP 1229#ifdef CONFIG_PM_SLEEP
1115static int brcmf_ops_sdio_suspend(struct device *dev) 1230static int brcmf_ops_sdio_suspend(struct device *dev)
1116{ 1231{
1232 struct sdio_func *func;
1117 struct brcmf_bus *bus_if; 1233 struct brcmf_bus *bus_if;
1118 struct brcmf_sdio_dev *sdiodev; 1234 struct brcmf_sdio_dev *sdiodev;
1119 mmc_pm_flag_t sdio_flags; 1235 mmc_pm_flag_t sdio_flags;
1120 1236
1121 brcmf_dbg(SDIO, "Enter\n"); 1237 func = container_of(dev, struct sdio_func, dev);
1238 brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
1239 if (func->num != SDIO_FUNC_1)
1240 return 0;
1241
1122 1242
1123 bus_if = dev_get_drvdata(dev); 1243 bus_if = dev_get_drvdata(dev);
1124 sdiodev = bus_if->bus_priv.sdio; 1244 sdiodev = bus_if->bus_priv.sdio;
1125 1245
1126 /* wait for watchdog to go idle */ 1246 brcmf_sdiod_freezer_on(sdiodev);
1127 if (wait_event_timeout(sdiodev->idle_wait, sdiodev->sleeping,
1128 msecs_to_jiffies(3 * BRCMF_WD_POLL_MS)) == 0) {
1129 brcmf_err("bus still active\n");
1130 return -EBUSY;
1131 }
1132 /* disable watchdog */
1133 brcmf_sdio_wd_timer(sdiodev->bus, 0); 1247 brcmf_sdio_wd_timer(sdiodev->bus, 0);
1134 atomic_set(&sdiodev->suspend, true);
1135 1248
1136 if (sdiodev->wowl_enabled) { 1249 if (sdiodev->wowl_enabled) {
1137 sdio_flags = MMC_PM_KEEP_POWER; 1250 sdio_flags = MMC_PM_KEEP_POWER;
@@ -1149,12 +1262,13 @@ static int brcmf_ops_sdio_resume(struct device *dev)
1149{ 1262{
1150 struct brcmf_bus *bus_if = dev_get_drvdata(dev); 1263 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1151 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio; 1264 struct brcmf_sdio_dev *sdiodev = bus_if->bus_priv.sdio;
1265 struct sdio_func *func = container_of(dev, struct sdio_func, dev);
1152 1266
1153 brcmf_dbg(SDIO, "Enter\n"); 1267 brcmf_dbg(SDIO, "Enter: F%d\n", func->num);
1154 if (sdiodev->pdata && sdiodev->pdata->oob_irq_supported) 1268 if (func->num != SDIO_FUNC_2)
1155 disable_irq_wake(sdiodev->pdata->oob_irq_nr); 1269 return 0;
1156 brcmf_sdio_wd_timer(sdiodev->bus, BRCMF_WD_POLL_MS); 1270
1157 atomic_set(&sdiodev->suspend, false); 1271 brcmf_sdiod_freezer_off(sdiodev);
1158 return 0; 1272 return 0;
1159} 1273}
1160 1274
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
index b59b8c6c42ab..8a15ebbce4a3 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/cfg80211.c
@@ -625,6 +625,7 @@ static bool brcmf_is_ibssmode(struct brcmf_cfg80211_vif *vif)
625 625
626static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy, 626static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
627 const char *name, 627 const char *name,
628 unsigned char name_assign_type,
628 enum nl80211_iftype type, 629 enum nl80211_iftype type,
629 u32 *flags, 630 u32 *flags,
630 struct vif_params *params) 631 struct vif_params *params)
@@ -648,7 +649,7 @@ static struct wireless_dev *brcmf_cfg80211_add_iface(struct wiphy *wiphy,
648 case NL80211_IFTYPE_P2P_CLIENT: 649 case NL80211_IFTYPE_P2P_CLIENT:
649 case NL80211_IFTYPE_P2P_GO: 650 case NL80211_IFTYPE_P2P_GO:
650 case NL80211_IFTYPE_P2P_DEVICE: 651 case NL80211_IFTYPE_P2P_DEVICE:
651 wdev = brcmf_p2p_add_vif(wiphy, name, type, flags, params); 652 wdev = brcmf_p2p_add_vif(wiphy, name, name_assign_type, type, flags, params);
652 if (!IS_ERR(wdev)) 653 if (!IS_ERR(wdev))
653 brcmf_cfg80211_update_proto_addr_mode(wdev); 654 brcmf_cfg80211_update_proto_addr_mode(wdev);
654 return wdev; 655 return wdev;
@@ -700,7 +701,7 @@ s32 brcmf_notify_escan_complete(struct brcmf_cfg80211_info *cfg,
700 /* Do a scan abort to stop the driver's scan engine */ 701 /* Do a scan abort to stop the driver's scan engine */
701 brcmf_dbg(SCAN, "ABORT scan in firmware\n"); 702 brcmf_dbg(SCAN, "ABORT scan in firmware\n");
702 memset(&params_le, 0, sizeof(params_le)); 703 memset(&params_le, 0, sizeof(params_le));
703 memset(params_le.bssid, 0xFF, ETH_ALEN); 704 eth_broadcast_addr(params_le.bssid);
704 params_le.bss_type = DOT11_BSSTYPE_ANY; 705 params_le.bss_type = DOT11_BSSTYPE_ANY;
705 params_le.scan_type = 0; 706 params_le.scan_type = 0;
706 params_le.channel_num = cpu_to_le32(1); 707 params_le.channel_num = cpu_to_le32(1);
@@ -866,7 +867,7 @@ static void brcmf_escan_prep(struct brcmf_cfg80211_info *cfg,
866 char *ptr; 867 char *ptr;
867 struct brcmf_ssid_le ssid_le; 868 struct brcmf_ssid_le ssid_le;
868 869
869 memset(params_le->bssid, 0xFF, ETH_ALEN); 870 eth_broadcast_addr(params_le->bssid);
870 params_le->bss_type = DOT11_BSSTYPE_ANY; 871 params_le->bss_type = DOT11_BSSTYPE_ANY;
871 params_le->scan_type = 0; 872 params_le->scan_type = 0;
872 params_le->channel_num = 0; 873 params_le->channel_num = 0;
@@ -1050,10 +1051,6 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
1050 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif) 1051 if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
1051 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif; 1052 vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
1052 1053
1053 /* Arm scan timeout timer */
1054 mod_timer(&cfg->escan_timeout, jiffies +
1055 WL_ESCAN_TIMER_INTERVAL_MS * HZ / 1000);
1056
1057 escan_req = false; 1054 escan_req = false;
1058 if (request) { 1055 if (request) {
1059 /* scan bss */ 1056 /* scan bss */
@@ -1112,12 +1109,14 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
1112 } 1109 }
1113 } 1110 }
1114 1111
1112 /* Arm scan timeout timer */
1113 mod_timer(&cfg->escan_timeout, jiffies +
1114 WL_ESCAN_TIMER_INTERVAL_MS * HZ / 1000);
1115
1115 return 0; 1116 return 0;
1116 1117
1117scan_out: 1118scan_out:
1118 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status); 1119 clear_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
1119 if (timer_pending(&cfg->escan_timeout))
1120 del_timer_sync(&cfg->escan_timeout);
1121 cfg->scan_request = NULL; 1120 cfg->scan_request = NULL;
1122 return err; 1121 return err;
1123} 1122}
@@ -1375,8 +1374,8 @@ brcmf_cfg80211_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1375 BRCMF_ASSOC_PARAMS_FIXED_SIZE; 1374 BRCMF_ASSOC_PARAMS_FIXED_SIZE;
1376 memcpy(profile->bssid, params->bssid, ETH_ALEN); 1375 memcpy(profile->bssid, params->bssid, ETH_ALEN);
1377 } else { 1376 } else {
1378 memset(join_params.params_le.bssid, 0xFF, ETH_ALEN); 1377 eth_broadcast_addr(join_params.params_le.bssid);
1379 memset(profile->bssid, 0, ETH_ALEN); 1378 eth_zero_addr(profile->bssid);
1380 } 1379 }
1381 1380
1382 /* Channel */ 1381 /* Channel */
@@ -1850,7 +1849,7 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
1850 if (sme->bssid) 1849 if (sme->bssid)
1851 memcpy(&ext_join_params->assoc_le.bssid, sme->bssid, ETH_ALEN); 1850 memcpy(&ext_join_params->assoc_le.bssid, sme->bssid, ETH_ALEN);
1852 else 1851 else
1853 memset(&ext_join_params->assoc_le.bssid, 0xFF, ETH_ALEN); 1852 eth_broadcast_addr(ext_join_params->assoc_le.bssid);
1854 1853
1855 if (cfg->channel) { 1854 if (cfg->channel) {
1856 ext_join_params->assoc_le.chanspec_num = cpu_to_le32(1); 1855 ext_join_params->assoc_le.chanspec_num = cpu_to_le32(1);
@@ -1895,7 +1894,7 @@ brcmf_cfg80211_connect(struct wiphy *wiphy, struct net_device *ndev,
1895 if (sme->bssid) 1894 if (sme->bssid)
1896 memcpy(join_params.params_le.bssid, sme->bssid, ETH_ALEN); 1895 memcpy(join_params.params_le.bssid, sme->bssid, ETH_ALEN);
1897 else 1896 else
1898 memset(join_params.params_le.bssid, 0xFF, ETH_ALEN); 1897 eth_broadcast_addr(join_params.params_le.bssid);
1899 1898
1900 if (cfg->channel) { 1899 if (cfg->channel) {
1901 join_params.params_le.chanspec_list[0] = cpu_to_le16(chanspec); 1900 join_params.params_le.chanspec_list[0] = cpu_to_le16(chanspec);
@@ -2252,7 +2251,6 @@ brcmf_cfg80211_del_key(struct wiphy *wiphy, struct net_device *ndev,
2252 2251
2253 if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) { 2252 if (key_idx >= BRCMF_MAX_DEFAULT_KEYS) {
2254 /* we ignore this key index in this case */ 2253 /* we ignore this key index in this case */
2255 brcmf_err("invalid key index (%d)\n", key_idx);
2256 return -EINVAL; 2254 return -EINVAL;
2257 } 2255 }
2258 2256
@@ -4272,7 +4270,7 @@ brcmf_cfg80211_del_station(struct wiphy *wiphy, struct net_device *ndev,
4272 return -EIO; 4270 return -EIO;
4273 4271
4274 memcpy(&scbval.ea, params->mac, ETH_ALEN); 4272 memcpy(&scbval.ea, params->mac, ETH_ALEN);
4275 scbval.val = cpu_to_le32(WLAN_REASON_DEAUTH_LEAVING); 4273 scbval.val = cpu_to_le32(params->reason_code);
4276 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON, 4274 err = brcmf_fil_cmd_data_set(ifp, BRCMF_C_SCB_DEAUTHENTICATE_FOR_REASON,
4277 &scbval, sizeof(scbval)); 4275 &scbval, sizeof(scbval));
4278 if (err) 4276 if (err)
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/chip.c b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
index 04d2ca0d87d6..ab2fac8b2760 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/chip.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.c
@@ -100,9 +100,6 @@
100#define BCM4329_CORE_SOCRAM_BASE 0x18003000 100#define BCM4329_CORE_SOCRAM_BASE 0x18003000
101/* ARM Cortex M3 core, ID 0x82a */ 101/* ARM Cortex M3 core, ID 0x82a */
102#define BCM4329_CORE_ARM_BASE 0x18002000 102#define BCM4329_CORE_ARM_BASE 0x18002000
103#define BCM4329_RAMSIZE 0x48000
104/* bcm43143 */
105#define BCM43143_RAMSIZE 0x70000
106 103
107#define CORE_SB(base, field) \ 104#define CORE_SB(base, field) \
108 (base + SBCONFIGOFF + offsetof(struct sbconfig, field)) 105 (base + SBCONFIGOFF + offsetof(struct sbconfig, field))
@@ -150,6 +147,78 @@ struct sbconfig {
150 u32 sbidhigh; /* identification */ 147 u32 sbidhigh; /* identification */
151}; 148};
152 149
150/* bankidx and bankinfo reg defines corerev >= 8 */
151#define SOCRAM_BANKINFO_RETNTRAM_MASK 0x00010000
152#define SOCRAM_BANKINFO_SZMASK 0x0000007f
153#define SOCRAM_BANKIDX_ROM_MASK 0x00000100
154
155#define SOCRAM_BANKIDX_MEMTYPE_SHIFT 8
156/* socram bankinfo memtype */
157#define SOCRAM_MEMTYPE_RAM 0
158#define SOCRAM_MEMTYPE_R0M 1
159#define SOCRAM_MEMTYPE_DEVRAM 2
160
161#define SOCRAM_BANKINFO_SZBASE 8192
162#define SRCI_LSS_MASK 0x00f00000
163#define SRCI_LSS_SHIFT 20
164#define SRCI_SRNB_MASK 0xf0
165#define SRCI_SRNB_SHIFT 4
166#define SRCI_SRBSZ_MASK 0xf
167#define SRCI_SRBSZ_SHIFT 0
168#define SR_BSZ_BASE 14
169
170struct sbsocramregs {
171 u32 coreinfo;
172 u32 bwalloc;
173 u32 extracoreinfo;
174 u32 biststat;
175 u32 bankidx;
176 u32 standbyctrl;
177
178 u32 errlogstatus; /* rev 6 */
179 u32 errlogaddr; /* rev 6 */
180 /* used for patching rev 3 & 5 */
181 u32 cambankidx;
182 u32 cambankstandbyctrl;
183 u32 cambankpatchctrl;
184 u32 cambankpatchtblbaseaddr;
185 u32 cambankcmdreg;
186 u32 cambankdatareg;
187 u32 cambankmaskreg;
188 u32 PAD[1];
189 u32 bankinfo; /* corev 8 */
190 u32 bankpda;
191 u32 PAD[14];
192 u32 extmemconfig;
193 u32 extmemparitycsr;
194 u32 extmemparityerrdata;
195 u32 extmemparityerrcnt;
196 u32 extmemwrctrlandsize;
197 u32 PAD[84];
198 u32 workaround;
199 u32 pwrctl; /* corerev >= 2 */
200 u32 PAD[133];
201 u32 sr_control; /* corerev >= 15 */
202 u32 sr_status; /* corerev >= 15 */
203 u32 sr_address; /* corerev >= 15 */
204 u32 sr_data; /* corerev >= 15 */
205};
206
207#define SOCRAMREGOFFS(_f) offsetof(struct sbsocramregs, _f)
208
209#define ARMCR4_CAP (0x04)
210#define ARMCR4_BANKIDX (0x40)
211#define ARMCR4_BANKINFO (0x44)
212#define ARMCR4_BANKPDA (0x4C)
213
214#define ARMCR4_TCBBNB_MASK 0xf0
215#define ARMCR4_TCBBNB_SHIFT 4
216#define ARMCR4_TCBANB_MASK 0xf
217#define ARMCR4_TCBANB_SHIFT 0
218
219#define ARMCR4_BSZ_MASK 0x3f
220#define ARMCR4_BSZ_MULT 8192
221
153struct brcmf_core_priv { 222struct brcmf_core_priv {
154 struct brcmf_core pub; 223 struct brcmf_core pub;
155 u32 wrapbase; 224 u32 wrapbase;
@@ -419,13 +488,13 @@ static struct brcmf_core *brcmf_chip_add_core(struct brcmf_chip_priv *ci,
419 return &core->pub; 488 return &core->pub;
420} 489}
421 490
422#ifdef DEBUG
423/* safety check for chipinfo */ 491/* safety check for chipinfo */
424static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci) 492static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci)
425{ 493{
426 struct brcmf_core_priv *core; 494 struct brcmf_core_priv *core;
427 bool need_socram = false; 495 bool need_socram = false;
428 bool has_socram = false; 496 bool has_socram = false;
497 bool cpu_found = false;
429 int idx = 1; 498 int idx = 1;
430 499
431 list_for_each_entry(core, &ci->cores, list) { 500 list_for_each_entry(core, &ci->cores, list) {
@@ -435,22 +504,24 @@ static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci)
435 504
436 switch (core->pub.id) { 505 switch (core->pub.id) {
437 case BCMA_CORE_ARM_CM3: 506 case BCMA_CORE_ARM_CM3:
507 cpu_found = true;
438 need_socram = true; 508 need_socram = true;
439 break; 509 break;
440 case BCMA_CORE_INTERNAL_MEM: 510 case BCMA_CORE_INTERNAL_MEM:
441 has_socram = true; 511 has_socram = true;
442 break; 512 break;
443 case BCMA_CORE_ARM_CR4: 513 case BCMA_CORE_ARM_CR4:
444 if (ci->pub.rambase == 0) { 514 cpu_found = true;
445 brcmf_err("RAM base not provided with ARM CR4 core\n");
446 return -ENOMEM;
447 }
448 break; 515 break;
449 default: 516 default:
450 break; 517 break;
451 } 518 }
452 } 519 }
453 520
521 if (!cpu_found) {
522 brcmf_err("CPU core not detected\n");
523 return -ENXIO;
524 }
454 /* check RAM core presence for ARM CM3 core */ 525 /* check RAM core presence for ARM CM3 core */
455 if (need_socram && !has_socram) { 526 if (need_socram && !has_socram) {
456 brcmf_err("RAM core not provided with ARM CM3 core\n"); 527 brcmf_err("RAM core not provided with ARM CM3 core\n");
@@ -458,56 +529,164 @@ static int brcmf_chip_cores_check(struct brcmf_chip_priv *ci)
458 } 529 }
459 return 0; 530 return 0;
460} 531}
461#else /* DEBUG */ 532
462static inline int brcmf_chip_cores_check(struct brcmf_chip_priv *ci) 533static u32 brcmf_chip_core_read32(struct brcmf_core_priv *core, u16 reg)
463{ 534{
464 return 0; 535 return core->chip->ops->read32(core->chip->ctx, core->pub.base + reg);
465} 536}
466#endif
467 537
468static void brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci) 538static void brcmf_chip_core_write32(struct brcmf_core_priv *core,
539 u16 reg, u32 val)
469{ 540{
470 switch (ci->pub.chip) { 541 core->chip->ops->write32(core->chip->ctx, core->pub.base + reg, val);
471 case BRCM_CC_4329_CHIP_ID: 542}
472 ci->pub.ramsize = BCM4329_RAMSIZE; 543
473 break; 544static bool brcmf_chip_socram_banksize(struct brcmf_core_priv *core, u8 idx,
474 case BRCM_CC_43143_CHIP_ID: 545 u32 *banksize)
475 ci->pub.ramsize = BCM43143_RAMSIZE; 546{
476 break; 547 u32 bankinfo;
477 case BRCM_CC_43241_CHIP_ID: 548 u32 bankidx = (SOCRAM_MEMTYPE_RAM << SOCRAM_BANKIDX_MEMTYPE_SHIFT);
478 ci->pub.ramsize = 0x90000; 549
479 break; 550 bankidx |= idx;
480 case BRCM_CC_4330_CHIP_ID: 551 brcmf_chip_core_write32(core, SOCRAMREGOFFS(bankidx), bankidx);
481 ci->pub.ramsize = 0x48000; 552 bankinfo = brcmf_chip_core_read32(core, SOCRAMREGOFFS(bankinfo));
482 break; 553 *banksize = (bankinfo & SOCRAM_BANKINFO_SZMASK) + 1;
554 *banksize *= SOCRAM_BANKINFO_SZBASE;
555 return !!(bankinfo & SOCRAM_BANKINFO_RETNTRAM_MASK);
556}
557
558static void brcmf_chip_socram_ramsize(struct brcmf_core_priv *sr, u32 *ramsize,
559 u32 *srsize)
560{
561 u32 coreinfo;
562 uint nb, banksize, lss;
563 bool retent;
564 int i;
565
566 *ramsize = 0;
567 *srsize = 0;
568
569 if (WARN_ON(sr->pub.rev < 4))
570 return;
571
572 if (!brcmf_chip_iscoreup(&sr->pub))
573 brcmf_chip_resetcore(&sr->pub, 0, 0, 0);
574
575 /* Get info for determining size */
576 coreinfo = brcmf_chip_core_read32(sr, SOCRAMREGOFFS(coreinfo));
577 nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
578
579 if ((sr->pub.rev <= 7) || (sr->pub.rev == 12)) {
580 banksize = (coreinfo & SRCI_SRBSZ_MASK);
581 lss = (coreinfo & SRCI_LSS_MASK) >> SRCI_LSS_SHIFT;
582 if (lss != 0)
583 nb--;
584 *ramsize = nb * (1 << (banksize + SR_BSZ_BASE));
585 if (lss != 0)
586 *ramsize += (1 << ((lss - 1) + SR_BSZ_BASE));
587 } else {
588 nb = (coreinfo & SRCI_SRNB_MASK) >> SRCI_SRNB_SHIFT;
589 for (i = 0; i < nb; i++) {
590 retent = brcmf_chip_socram_banksize(sr, i, &banksize);
591 *ramsize += banksize;
592 if (retent)
593 *srsize += banksize;
594 }
595 }
596
597 /* hardcoded save&restore memory sizes */
598 switch (sr->chip->pub.chip) {
483 case BRCM_CC_4334_CHIP_ID: 599 case BRCM_CC_4334_CHIP_ID:
484 case BRCM_CC_43340_CHIP_ID: 600 if (sr->chip->pub.chiprev < 2)
485 ci->pub.ramsize = 0x80000; 601 *srsize = (32 * 1024);
486 break; 602 break;
487 case BRCM_CC_4335_CHIP_ID: 603 case BRCM_CC_43430_CHIP_ID:
488 ci->pub.ramsize = 0xc0000; 604 /* assume sr for now as we can not check
489 ci->pub.rambase = 0x180000; 605 * firmware sr capability at this point.
606 */
607 *srsize = (64 * 1024);
490 break; 608 break;
491 case BRCM_CC_43362_CHIP_ID: 609 default:
492 ci->pub.ramsize = 0x3c000;
493 break; 610 break;
611 }
612}
613
614/** Return the TCM-RAM size of the ARMCR4 core. */
615static u32 brcmf_chip_tcm_ramsize(struct brcmf_core_priv *cr4)
616{
617 u32 corecap;
618 u32 memsize = 0;
619 u32 nab;
620 u32 nbb;
621 u32 totb;
622 u32 bxinfo;
623 u32 idx;
624
625 corecap = brcmf_chip_core_read32(cr4, ARMCR4_CAP);
626
627 nab = (corecap & ARMCR4_TCBANB_MASK) >> ARMCR4_TCBANB_SHIFT;
628 nbb = (corecap & ARMCR4_TCBBNB_MASK) >> ARMCR4_TCBBNB_SHIFT;
629 totb = nab + nbb;
630
631 for (idx = 0; idx < totb; idx++) {
632 brcmf_chip_core_write32(cr4, ARMCR4_BANKIDX, idx);
633 bxinfo = brcmf_chip_core_read32(cr4, ARMCR4_BANKINFO);
634 memsize += ((bxinfo & ARMCR4_BSZ_MASK) + 1) * ARMCR4_BSZ_MULT;
635 }
636
637 return memsize;
638}
639
640static u32 brcmf_chip_tcm_rambase(struct brcmf_chip_priv *ci)
641{
642 switch (ci->pub.chip) {
643 case BRCM_CC_4345_CHIP_ID:
644 return 0x198000;
645 case BRCM_CC_4335_CHIP_ID:
494 case BRCM_CC_4339_CHIP_ID: 646 case BRCM_CC_4339_CHIP_ID:
495 case BRCM_CC_4354_CHIP_ID: 647 case BRCM_CC_4354_CHIP_ID:
496 case BRCM_CC_4356_CHIP_ID: 648 case BRCM_CC_4356_CHIP_ID:
497 case BRCM_CC_43567_CHIP_ID: 649 case BRCM_CC_43567_CHIP_ID:
498 case BRCM_CC_43569_CHIP_ID: 650 case BRCM_CC_43569_CHIP_ID:
499 case BRCM_CC_43570_CHIP_ID: 651 case BRCM_CC_43570_CHIP_ID:
500 ci->pub.ramsize = 0xc0000;
501 ci->pub.rambase = 0x180000;
502 break;
503 case BRCM_CC_43602_CHIP_ID: 652 case BRCM_CC_43602_CHIP_ID:
504 ci->pub.ramsize = 0xf0000; 653 return 0x180000;
505 ci->pub.rambase = 0x180000;
506 break;
507 default: 654 default:
508 brcmf_err("unknown chip: %s\n", ci->pub.name); 655 brcmf_err("unknown chip: %s\n", ci->pub.name);
509 break; 656 break;
510 } 657 }
658 return 0;
659}
660
661static int brcmf_chip_get_raminfo(struct brcmf_chip_priv *ci)
662{
663 struct brcmf_core_priv *mem_core;
664 struct brcmf_core *mem;
665
666 mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_ARM_CR4);
667 if (mem) {
668 mem_core = container_of(mem, struct brcmf_core_priv, pub);
669 ci->pub.ramsize = brcmf_chip_tcm_ramsize(mem_core);
670 ci->pub.rambase = brcmf_chip_tcm_rambase(ci);
671 if (!ci->pub.rambase) {
672 brcmf_err("RAM base not provided with ARM CR4 core\n");
673 return -EINVAL;
674 }
675 } else {
676 mem = brcmf_chip_get_core(&ci->pub, BCMA_CORE_INTERNAL_MEM);
677 mem_core = container_of(mem, struct brcmf_core_priv, pub);
678 brcmf_chip_socram_ramsize(mem_core, &ci->pub.ramsize,
679 &ci->pub.srsize);
680 }
681 brcmf_dbg(INFO, "RAM: base=0x%x size=%d (0x%x) sr=%d (0x%x)\n",
682 ci->pub.rambase, ci->pub.ramsize, ci->pub.ramsize,
683 ci->pub.srsize, ci->pub.srsize);
684
685 if (!ci->pub.ramsize) {
686 brcmf_err("RAM size is undetermined\n");
687 return -ENOMEM;
688 }
689 return 0;
511} 690}
512 691
513static u32 brcmf_chip_dmp_get_desc(struct brcmf_chip_priv *ci, u32 *eromaddr, 692static u32 brcmf_chip_dmp_get_desc(struct brcmf_chip_priv *ci, u32 *eromaddr,
@@ -660,6 +839,7 @@ static int brcmf_chip_recognition(struct brcmf_chip_priv *ci)
660 struct brcmf_core *core; 839 struct brcmf_core *core;
661 u32 regdata; 840 u32 regdata;
662 u32 socitype; 841 u32 socitype;
842 int ret;
663 843
664 /* Get CC core rev 844 /* Get CC core rev
665 * Chipid is assume to be at offset 0 from SI_ENUM_BASE 845 * Chipid is assume to be at offset 0 from SI_ENUM_BASE
@@ -712,9 +892,13 @@ static int brcmf_chip_recognition(struct brcmf_chip_priv *ci)
712 return -ENODEV; 892 return -ENODEV;
713 } 893 }
714 894
715 brcmf_chip_get_raminfo(ci); 895 ret = brcmf_chip_cores_check(ci);
896 if (ret)
897 return ret;
716 898
717 return brcmf_chip_cores_check(ci); 899 /* assure chip is passive for core access */
900 brcmf_chip_set_passive(&ci->pub);
901 return brcmf_chip_get_raminfo(ci);
718} 902}
719 903
720static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id) 904static void brcmf_chip_disable_arm(struct brcmf_chip_priv *chip, u16 id)
@@ -778,12 +962,6 @@ static int brcmf_chip_setup(struct brcmf_chip_priv *chip)
778 if (chip->ops->setup) 962 if (chip->ops->setup)
779 ret = chip->ops->setup(chip->ctx, pub); 963 ret = chip->ops->setup(chip->ctx, pub);
780 964
781 /*
782 * Make sure any on-chip ARM is off (in case strapping is wrong),
783 * or downloaded code was already running.
784 */
785 brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CM3);
786 brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CR4);
787 return ret; 965 return ret;
788} 966}
789 967
@@ -799,7 +977,7 @@ struct brcmf_chip *brcmf_chip_attach(void *ctx,
799 err = -EINVAL; 977 err = -EINVAL;
800 if (WARN_ON(!ops->prepare)) 978 if (WARN_ON(!ops->prepare))
801 err = -EINVAL; 979 err = -EINVAL;
802 if (WARN_ON(!ops->exit_dl)) 980 if (WARN_ON(!ops->activate))
803 err = -EINVAL; 981 err = -EINVAL;
804 if (err < 0) 982 if (err < 0)
805 return ERR_PTR(-EINVAL); 983 return ERR_PTR(-EINVAL);
@@ -897,9 +1075,10 @@ void brcmf_chip_resetcore(struct brcmf_core *pub, u32 prereset, u32 reset,
897} 1075}
898 1076
899static void 1077static void
900brcmf_chip_cm3_enterdl(struct brcmf_chip_priv *chip) 1078brcmf_chip_cm3_set_passive(struct brcmf_chip_priv *chip)
901{ 1079{
902 struct brcmf_core *core; 1080 struct brcmf_core *core;
1081 struct brcmf_core_priv *sr;
903 1082
904 brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CM3); 1083 brcmf_chip_disable_arm(chip, BCMA_CORE_ARM_CM3);
905 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211); 1084 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_80211);
@@ -909,9 +1088,16 @@ brcmf_chip_cm3_enterdl(struct brcmf_chip_priv *chip)
909 D11_BCMA_IOCTL_PHYCLOCKEN); 1088 D11_BCMA_IOCTL_PHYCLOCKEN);
910 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_INTERNAL_MEM); 1089 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_INTERNAL_MEM);
911 brcmf_chip_resetcore(core, 0, 0, 0); 1090 brcmf_chip_resetcore(core, 0, 0, 0);
1091
1092 /* disable bank #3 remap for this device */
1093 if (chip->pub.chip == BRCM_CC_43430_CHIP_ID) {
1094 sr = container_of(core, struct brcmf_core_priv, pub);
1095 brcmf_chip_core_write32(sr, SOCRAMREGOFFS(bankidx), 3);
1096 brcmf_chip_core_write32(sr, SOCRAMREGOFFS(bankpda), 0);
1097 }
912} 1098}
913 1099
914static bool brcmf_chip_cm3_exitdl(struct brcmf_chip_priv *chip) 1100static bool brcmf_chip_cm3_set_active(struct brcmf_chip_priv *chip)
915{ 1101{
916 struct brcmf_core *core; 1102 struct brcmf_core *core;
917 1103
@@ -921,7 +1107,7 @@ static bool brcmf_chip_cm3_exitdl(struct brcmf_chip_priv *chip)
921 return false; 1107 return false;
922 } 1108 }
923 1109
924 chip->ops->exit_dl(chip->ctx, &chip->pub, 0); 1110 chip->ops->activate(chip->ctx, &chip->pub, 0);
925 1111
926 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CM3); 1112 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CM3);
927 brcmf_chip_resetcore(core, 0, 0, 0); 1113 brcmf_chip_resetcore(core, 0, 0, 0);
@@ -930,7 +1116,7 @@ static bool brcmf_chip_cm3_exitdl(struct brcmf_chip_priv *chip)
930} 1116}
931 1117
932static inline void 1118static inline void
933brcmf_chip_cr4_enterdl(struct brcmf_chip_priv *chip) 1119brcmf_chip_cr4_set_passive(struct brcmf_chip_priv *chip)
934{ 1120{
935 struct brcmf_core *core; 1121 struct brcmf_core *core;
936 1122
@@ -943,11 +1129,11 @@ brcmf_chip_cr4_enterdl(struct brcmf_chip_priv *chip)
943 D11_BCMA_IOCTL_PHYCLOCKEN); 1129 D11_BCMA_IOCTL_PHYCLOCKEN);
944} 1130}
945 1131
946static bool brcmf_chip_cr4_exitdl(struct brcmf_chip_priv *chip, u32 rstvec) 1132static bool brcmf_chip_cr4_set_active(struct brcmf_chip_priv *chip, u32 rstvec)
947{ 1133{
948 struct brcmf_core *core; 1134 struct brcmf_core *core;
949 1135
950 chip->ops->exit_dl(chip->ctx, &chip->pub, rstvec); 1136 chip->ops->activate(chip->ctx, &chip->pub, rstvec);
951 1137
952 /* restore ARM */ 1138 /* restore ARM */
953 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CR4); 1139 core = brcmf_chip_get_core(&chip->pub, BCMA_CORE_ARM_CR4);
@@ -956,7 +1142,7 @@ static bool brcmf_chip_cr4_exitdl(struct brcmf_chip_priv *chip, u32 rstvec)
956 return true; 1142 return true;
957} 1143}
958 1144
959void brcmf_chip_enter_download(struct brcmf_chip *pub) 1145void brcmf_chip_set_passive(struct brcmf_chip *pub)
960{ 1146{
961 struct brcmf_chip_priv *chip; 1147 struct brcmf_chip_priv *chip;
962 struct brcmf_core *arm; 1148 struct brcmf_core *arm;
@@ -966,14 +1152,14 @@ void brcmf_chip_enter_download(struct brcmf_chip *pub)
966 chip = container_of(pub, struct brcmf_chip_priv, pub); 1152 chip = container_of(pub, struct brcmf_chip_priv, pub);
967 arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4); 1153 arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4);
968 if (arm) { 1154 if (arm) {
969 brcmf_chip_cr4_enterdl(chip); 1155 brcmf_chip_cr4_set_passive(chip);
970 return; 1156 return;
971 } 1157 }
972 1158
973 brcmf_chip_cm3_enterdl(chip); 1159 brcmf_chip_cm3_set_passive(chip);
974} 1160}
975 1161
976bool brcmf_chip_exit_download(struct brcmf_chip *pub, u32 rstvec) 1162bool brcmf_chip_set_active(struct brcmf_chip *pub, u32 rstvec)
977{ 1163{
978 struct brcmf_chip_priv *chip; 1164 struct brcmf_chip_priv *chip;
979 struct brcmf_core *arm; 1165 struct brcmf_core *arm;
@@ -983,9 +1169,9 @@ bool brcmf_chip_exit_download(struct brcmf_chip *pub, u32 rstvec)
983 chip = container_of(pub, struct brcmf_chip_priv, pub); 1169 chip = container_of(pub, struct brcmf_chip_priv, pub);
984 arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4); 1170 arm = brcmf_chip_get_core(pub, BCMA_CORE_ARM_CR4);
985 if (arm) 1171 if (arm)
986 return brcmf_chip_cr4_exitdl(chip, rstvec); 1172 return brcmf_chip_cr4_set_active(chip, rstvec);
987 1173
988 return brcmf_chip_cm3_exitdl(chip); 1174 return brcmf_chip_cm3_set_active(chip);
989} 1175}
990 1176
991bool brcmf_chip_sr_capable(struct brcmf_chip *pub) 1177bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
@@ -1016,6 +1202,10 @@ bool brcmf_chip_sr_capable(struct brcmf_chip *pub)
1016 addr = CORE_CC_REG(base, chipcontrol_data); 1202 addr = CORE_CC_REG(base, chipcontrol_data);
1017 reg = chip->ops->read32(chip->ctx, addr); 1203 reg = chip->ops->read32(chip->ctx, addr);
1018 return (reg & pmu_cc3_mask) != 0; 1204 return (reg & pmu_cc3_mask) != 0;
1205 case BRCM_CC_43430_CHIP_ID:
1206 addr = CORE_CC_REG(base, sr_control1);
1207 reg = chip->ops->read32(chip->ctx, addr);
1208 return reg != 0;
1019 default: 1209 default:
1020 addr = CORE_CC_REG(base, pmucapabilities_ext); 1210 addr = CORE_CC_REG(base, pmucapabilities_ext);
1021 reg = chip->ops->read32(chip->ctx, addr); 1211 reg = chip->ops->read32(chip->ctx, addr);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/chip.h b/drivers/net/wireless/brcm80211/brcmfmac/chip.h
index c32908da90c8..60dcb38fc77a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/chip.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/chip.h
@@ -30,7 +30,8 @@
30 * @pmucaps: PMU capabilities. 30 * @pmucaps: PMU capabilities.
31 * @pmurev: PMU revision. 31 * @pmurev: PMU revision.
32 * @rambase: RAM base address (only applicable for ARM CR4 chips). 32 * @rambase: RAM base address (only applicable for ARM CR4 chips).
33 * @ramsize: amount of RAM on chip. 33 * @ramsize: amount of RAM on chip including retention.
34 * @srsize: amount of retention RAM on chip.
34 * @name: string representation of the chip identifier. 35 * @name: string representation of the chip identifier.
35 */ 36 */
36struct brcmf_chip { 37struct brcmf_chip {
@@ -41,6 +42,7 @@ struct brcmf_chip {
41 u32 pmurev; 42 u32 pmurev;
42 u32 rambase; 43 u32 rambase;
43 u32 ramsize; 44 u32 ramsize;
45 u32 srsize;
44 char name[8]; 46 char name[8];
45}; 47};
46 48
@@ -64,7 +66,7 @@ struct brcmf_core {
64 * @write32: write 32-bit value over bus. 66 * @write32: write 32-bit value over bus.
65 * @prepare: prepare bus for core configuration. 67 * @prepare: prepare bus for core configuration.
66 * @setup: bus-specific core setup. 68 * @setup: bus-specific core setup.
67 * @exit_dl: exit download state. 69 * @active: chip becomes active.
68 * The callback should use the provided @rstvec when non-zero. 70 * The callback should use the provided @rstvec when non-zero.
69 */ 71 */
70struct brcmf_buscore_ops { 72struct brcmf_buscore_ops {
@@ -72,7 +74,7 @@ struct brcmf_buscore_ops {
72 void (*write32)(void *ctx, u32 addr, u32 value); 74 void (*write32)(void *ctx, u32 addr, u32 value);
73 int (*prepare)(void *ctx); 75 int (*prepare)(void *ctx);
74 int (*setup)(void *ctx, struct brcmf_chip *chip); 76 int (*setup)(void *ctx, struct brcmf_chip *chip);
75 void (*exit_dl)(void *ctx, struct brcmf_chip *chip, u32 rstvec); 77 void (*activate)(void *ctx, struct brcmf_chip *chip, u32 rstvec);
76}; 78};
77 79
78struct brcmf_chip *brcmf_chip_attach(void *ctx, 80struct brcmf_chip *brcmf_chip_attach(void *ctx,
@@ -84,8 +86,8 @@ bool brcmf_chip_iscoreup(struct brcmf_core *core);
84void brcmf_chip_coredisable(struct brcmf_core *core, u32 prereset, u32 reset); 86void brcmf_chip_coredisable(struct brcmf_core *core, u32 prereset, u32 reset);
85void brcmf_chip_resetcore(struct brcmf_core *core, u32 prereset, u32 reset, 87void brcmf_chip_resetcore(struct brcmf_core *core, u32 prereset, u32 reset,
86 u32 postreset); 88 u32 postreset);
87void brcmf_chip_enter_download(struct brcmf_chip *ci); 89void brcmf_chip_set_passive(struct brcmf_chip *ci);
88bool brcmf_chip_exit_download(struct brcmf_chip *ci, u32 rstvec); 90bool brcmf_chip_set_active(struct brcmf_chip *ci, u32 rstvec);
89bool brcmf_chip_sr_capable(struct brcmf_chip *pub); 91bool brcmf_chip_sr_capable(struct brcmf_chip *pub);
90 92
91#endif /* BRCMF_AXIDMP_H */ 93#endif /* BRCMF_AXIDMP_H */
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/core.c b/drivers/net/wireless/brcm80211/brcmfmac/core.c
index 2d6e2cc1b12c..f8f47dcfa886 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/core.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/core.c
@@ -944,6 +944,34 @@ fail:
944 return ret; 944 return ret;
945} 945}
946 946
947static int brcmf_revinfo_read(struct seq_file *s, void *data)
948{
949 struct brcmf_bus *bus_if = dev_get_drvdata(s->private);
950 struct brcmf_rev_info *ri = &bus_if->drvr->revinfo;
951 char drev[BRCMU_DOTREV_LEN];
952 char brev[BRCMU_BOARDREV_LEN];
953
954 seq_printf(s, "vendorid: 0x%04x\n", ri->vendorid);
955 seq_printf(s, "deviceid: 0x%04x\n", ri->deviceid);
956 seq_printf(s, "radiorev: %s\n", brcmu_dotrev_str(ri->radiorev, drev));
957 seq_printf(s, "chipnum: %u (%x)\n", ri->chipnum, ri->chipnum);
958 seq_printf(s, "chiprev: %u\n", ri->chiprev);
959 seq_printf(s, "chippkg: %u\n", ri->chippkg);
960 seq_printf(s, "corerev: %u\n", ri->corerev);
961 seq_printf(s, "boardid: 0x%04x\n", ri->boardid);
962 seq_printf(s, "boardvendor: 0x%04x\n", ri->boardvendor);
963 seq_printf(s, "boardrev: %s\n", brcmu_boardrev_str(ri->boardrev, brev));
964 seq_printf(s, "driverrev: %s\n", brcmu_dotrev_str(ri->driverrev, drev));
965 seq_printf(s, "ucoderev: %u\n", ri->ucoderev);
966 seq_printf(s, "bus: %u\n", ri->bus);
967 seq_printf(s, "phytype: %u\n", ri->phytype);
968 seq_printf(s, "phyrev: %u\n", ri->phyrev);
969 seq_printf(s, "anarev: %u\n", ri->anarev);
970 seq_printf(s, "nvramrev: %08x\n", ri->nvramrev);
971
972 return 0;
973}
974
947int brcmf_bus_start(struct device *dev) 975int brcmf_bus_start(struct device *dev)
948{ 976{
949 int ret = -1; 977 int ret = -1;
@@ -974,6 +1002,8 @@ int brcmf_bus_start(struct device *dev)
974 if (ret < 0) 1002 if (ret < 0)
975 goto fail; 1003 goto fail;
976 1004
1005 brcmf_debugfs_add_entry(drvr, "revinfo", brcmf_revinfo_read);
1006
977 /* assure we have chipid before feature attach */ 1007 /* assure we have chipid before feature attach */
978 if (!bus_if->chip) { 1008 if (!bus_if->chip) {
979 bus_if->chip = drvr->revinfo.chipnum; 1009 bus_if->chip = drvr->revinfo.chipnum;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
index 910fbb561469..eb1325371d3a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
@@ -236,7 +236,7 @@ void brcmf_flowring_delete(struct brcmf_flowring *flow, u8 flowid)
236 brcmf_flowring_block(flow, flowid, false); 236 brcmf_flowring_block(flow, flowid, false);
237 hash_idx = ring->hash_id; 237 hash_idx = ring->hash_id;
238 flow->hash[hash_idx].ifidx = BRCMF_FLOWRING_INVALID_IFIDX; 238 flow->hash[hash_idx].ifidx = BRCMF_FLOWRING_INVALID_IFIDX;
239 memset(flow->hash[hash_idx].mac, 0, ETH_ALEN); 239 eth_zero_addr(flow->hash[hash_idx].mac);
240 flow->rings[flowid] = NULL; 240 flow->rings[flowid] = NULL;
241 241
242 skb = skb_dequeue(&ring->skblist); 242 skb = skb_dequeue(&ring->skblist);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
index 6262612dec45..4ec9811f49c8 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
@@ -481,10 +481,9 @@ static int brcmf_msgbuf_ioctl_resp_wait(struct brcmf_msgbuf *msgbuf)
481 481
482static void brcmf_msgbuf_ioctl_resp_wake(struct brcmf_msgbuf *msgbuf) 482static void brcmf_msgbuf_ioctl_resp_wake(struct brcmf_msgbuf *msgbuf)
483{ 483{
484 if (waitqueue_active(&msgbuf->ioctl_resp_wait)) { 484 msgbuf->ctl_completed = true;
485 msgbuf->ctl_completed = true; 485 if (waitqueue_active(&msgbuf->ioctl_resp_wait))
486 wake_up(&msgbuf->ioctl_resp_wait); 486 wake_up(&msgbuf->ioctl_resp_wait);
487 }
488} 487}
489 488
490 489
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
index 77a51b8c1e12..3d513e407e3d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.h
@@ -17,11 +17,11 @@
17 17
18#ifdef CONFIG_BRCMFMAC_PROTO_MSGBUF 18#ifdef CONFIG_BRCMFMAC_PROTO_MSGBUF
19 19
20#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM 20 20#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_MAX_ITEM 64
21#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM 256 21#define BRCMF_H2D_MSGRING_RXPOST_SUBMIT_MAX_ITEM 512
22#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM 20 22#define BRCMF_D2H_MSGRING_CONTROL_COMPLETE_MAX_ITEM 64
23#define BRCMF_D2H_MSGRING_TX_COMPLETE_MAX_ITEM 1024 23#define BRCMF_D2H_MSGRING_TX_COMPLETE_MAX_ITEM 1024
24#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM 256 24#define BRCMF_D2H_MSGRING_RX_COMPLETE_MAX_ITEM 512
25#define BRCMF_H2D_TXFLOWRING_MAX_ITEM 512 25#define BRCMF_H2D_TXFLOWRING_MAX_ITEM 512
26 26
27#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE 40 27#define BRCMF_H2D_MSGRING_CONTROL_SUBMIT_ITEMSIZE 40
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
index effb48ebd864..710fbe570eb2 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
@@ -697,7 +697,7 @@ static s32 brcmf_p2p_escan(struct brcmf_p2p_info *p2p, u32 num_chans,
697 else 697 else
698 sparams->scan_type = 1; 698 sparams->scan_type = 1;
699 699
700 memset(&sparams->bssid, 0xFF, ETH_ALEN); 700 eth_broadcast_addr(sparams->bssid);
701 if (ssid.SSID_len) 701 if (ssid.SSID_len)
702 memcpy(sparams->ssid_le.SSID, ssid.SSID, ssid.SSID_len); 702 memcpy(sparams->ssid_le.SSID, ssid.SSID, ssid.SSID_len);
703 sparams->ssid_le.SSID_len = cpu_to_le32(ssid.SSID_len); 703 sparams->ssid_le.SSID_len = cpu_to_le32(ssid.SSID_len);
@@ -2246,11 +2246,13 @@ static void brcmf_p2p_delete_p2pdev(struct brcmf_p2p_info *p2p,
2246 * 2246 *
2247 * @wiphy: wiphy device of new interface. 2247 * @wiphy: wiphy device of new interface.
2248 * @name: name of the new interface. 2248 * @name: name of the new interface.
2249 * @name_assign_type: origin of the interface name
2249 * @type: nl80211 interface type. 2250 * @type: nl80211 interface type.
2250 * @flags: not used. 2251 * @flags: not used.
2251 * @params: contains mac address for P2P device. 2252 * @params: contains mac address for P2P device.
2252 */ 2253 */
2253struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, 2254struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
2255 unsigned char name_assign_type,
2254 enum nl80211_iftype type, u32 *flags, 2256 enum nl80211_iftype type, u32 *flags,
2255 struct vif_params *params) 2257 struct vif_params *params)
2256{ 2258{
@@ -2310,6 +2312,7 @@ struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
2310 } 2312 }
2311 2313
2312 strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1); 2314 strncpy(ifp->ndev->name, name, sizeof(ifp->ndev->name) - 1);
2315 ifp->ndev->name_assign_type = name_assign_type;
2313 err = brcmf_net_attach(ifp, true); 2316 err = brcmf_net_attach(ifp, true);
2314 if (err) { 2317 if (err) {
2315 brcmf_err("Registering netdevice failed\n"); 2318 brcmf_err("Registering netdevice failed\n");
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.h b/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
index 6821b26224be..872f382d9e49 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.h
@@ -149,6 +149,7 @@ struct brcmf_p2p_info {
149s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg); 149s32 brcmf_p2p_attach(struct brcmf_cfg80211_info *cfg);
150void brcmf_p2p_detach(struct brcmf_p2p_info *p2p); 150void brcmf_p2p_detach(struct brcmf_p2p_info *p2p);
151struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name, 151struct wireless_dev *brcmf_p2p_add_vif(struct wiphy *wiphy, const char *name,
152 unsigned char name_assign_type,
152 enum nl80211_iftype type, u32 *flags, 153 enum nl80211_iftype type, u32 *flags,
153 struct vif_params *params); 154 struct vif_params *params);
154int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev); 155int brcmf_p2p_del_vif(struct wiphy *wiphy, struct wireless_dev *wdev);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
index 61c053a729be..1831ecd0813e 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
@@ -47,8 +47,6 @@ enum brcmf_pcie_state {
47 47
48#define BRCMF_PCIE_43602_FW_NAME "brcm/brcmfmac43602-pcie.bin" 48#define BRCMF_PCIE_43602_FW_NAME "brcm/brcmfmac43602-pcie.bin"
49#define BRCMF_PCIE_43602_NVRAM_NAME "brcm/brcmfmac43602-pcie.txt" 49#define BRCMF_PCIE_43602_NVRAM_NAME "brcm/brcmfmac43602-pcie.txt"
50#define BRCMF_PCIE_4354_FW_NAME "brcm/brcmfmac4354-pcie.bin"
51#define BRCMF_PCIE_4354_NVRAM_NAME "brcm/brcmfmac4354-pcie.txt"
52#define BRCMF_PCIE_4356_FW_NAME "brcm/brcmfmac4356-pcie.bin" 50#define BRCMF_PCIE_4356_FW_NAME "brcm/brcmfmac4356-pcie.bin"
53#define BRCMF_PCIE_4356_NVRAM_NAME "brcm/brcmfmac4356-pcie.txt" 51#define BRCMF_PCIE_4356_NVRAM_NAME "brcm/brcmfmac4356-pcie.txt"
54#define BRCMF_PCIE_43570_FW_NAME "brcm/brcmfmac43570-pcie.bin" 52#define BRCMF_PCIE_43570_FW_NAME "brcm/brcmfmac43570-pcie.bin"
@@ -187,8 +185,8 @@ enum brcmf_pcie_state {
187 185
188MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME); 186MODULE_FIRMWARE(BRCMF_PCIE_43602_FW_NAME);
189MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME); 187MODULE_FIRMWARE(BRCMF_PCIE_43602_NVRAM_NAME);
190MODULE_FIRMWARE(BRCMF_PCIE_4354_FW_NAME); 188MODULE_FIRMWARE(BRCMF_PCIE_4356_FW_NAME);
191MODULE_FIRMWARE(BRCMF_PCIE_4354_NVRAM_NAME); 189MODULE_FIRMWARE(BRCMF_PCIE_4356_NVRAM_NAME);
192MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME); 190MODULE_FIRMWARE(BRCMF_PCIE_43570_FW_NAME);
193MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME); 191MODULE_FIRMWARE(BRCMF_PCIE_43570_NVRAM_NAME);
194 192
@@ -509,8 +507,6 @@ static void brcmf_pcie_attach(struct brcmf_pciedev_info *devinfo)
509 507
510static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo) 508static int brcmf_pcie_enter_download_state(struct brcmf_pciedev_info *devinfo)
511{ 509{
512 brcmf_chip_enter_download(devinfo->ci);
513
514 if (devinfo->ci->chip == BRCM_CC_43602_CHIP_ID) { 510 if (devinfo->ci->chip == BRCM_CC_43602_CHIP_ID) {
515 brcmf_pcie_select_core(devinfo, BCMA_CORE_ARM_CR4); 511 brcmf_pcie_select_core(devinfo, BCMA_CORE_ARM_CR4);
516 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKIDX, 512 brcmf_pcie_write_reg32(devinfo, BRCMF_PCIE_ARMCR4REG_BANKIDX,
@@ -536,7 +532,7 @@ static int brcmf_pcie_exit_download_state(struct brcmf_pciedev_info *devinfo,
536 brcmf_chip_resetcore(core, 0, 0, 0); 532 brcmf_chip_resetcore(core, 0, 0, 0);
537 } 533 }
538 534
539 return !brcmf_chip_exit_download(devinfo->ci, resetintr); 535 return !brcmf_chip_set_active(devinfo->ci, resetintr);
540} 536}
541 537
542 538
@@ -653,10 +649,9 @@ static void brcmf_pcie_bus_console_read(struct brcmf_pciedev_info *devinfo)
653 console->log_str[console->log_idx] = ch; 649 console->log_str[console->log_idx] = ch;
654 console->log_idx++; 650 console->log_idx++;
655 } 651 }
656
657 if (ch == '\n') { 652 if (ch == '\n') {
658 console->log_str[console->log_idx] = 0; 653 console->log_str[console->log_idx] = 0;
659 brcmf_dbg(PCIE, "CONSOLE: %s\n", console->log_str); 654 brcmf_dbg(PCIE, "CONSOLE: %s", console->log_str);
660 console->log_idx = 0; 655 console->log_idx = 0;
661 } 656 }
662 } 657 }
@@ -1328,10 +1323,6 @@ static int brcmf_pcie_get_fwnames(struct brcmf_pciedev_info *devinfo)
1328 fw_name = BRCMF_PCIE_43602_FW_NAME; 1323 fw_name = BRCMF_PCIE_43602_FW_NAME;
1329 nvram_name = BRCMF_PCIE_43602_NVRAM_NAME; 1324 nvram_name = BRCMF_PCIE_43602_NVRAM_NAME;
1330 break; 1325 break;
1331 case BRCM_CC_4354_CHIP_ID:
1332 fw_name = BRCMF_PCIE_4354_FW_NAME;
1333 nvram_name = BRCMF_PCIE_4354_NVRAM_NAME;
1334 break;
1335 case BRCM_CC_4356_CHIP_ID: 1326 case BRCM_CC_4356_CHIP_ID:
1336 fw_name = BRCMF_PCIE_4356_FW_NAME; 1327 fw_name = BRCMF_PCIE_4356_FW_NAME;
1337 nvram_name = BRCMF_PCIE_4356_NVRAM_NAME; 1328 nvram_name = BRCMF_PCIE_4356_NVRAM_NAME;
@@ -1566,8 +1557,8 @@ static int brcmf_pcie_buscoreprep(void *ctx)
1566} 1557}
1567 1558
1568 1559
1569static void brcmf_pcie_buscore_exitdl(void *ctx, struct brcmf_chip *chip, 1560static void brcmf_pcie_buscore_activate(void *ctx, struct brcmf_chip *chip,
1570 u32 rstvec) 1561 u32 rstvec)
1571{ 1562{
1572 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx; 1563 struct brcmf_pciedev_info *devinfo = (struct brcmf_pciedev_info *)ctx;
1573 1564
@@ -1577,7 +1568,7 @@ static void brcmf_pcie_buscore_exitdl(void *ctx, struct brcmf_chip *chip,
1577 1568
1578static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = { 1569static const struct brcmf_buscore_ops brcmf_pcie_buscore_ops = {
1579 .prepare = brcmf_pcie_buscoreprep, 1570 .prepare = brcmf_pcie_buscoreprep,
1580 .exit_dl = brcmf_pcie_buscore_exitdl, 1571 .activate = brcmf_pcie_buscore_activate,
1581 .read32 = brcmf_pcie_buscore_read32, 1572 .read32 = brcmf_pcie_buscore_read32,
1582 .write32 = brcmf_pcie_buscore_write32, 1573 .write32 = brcmf_pcie_buscore_write32,
1583}; 1574};
@@ -1856,7 +1847,6 @@ cleanup:
1856 PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 } 1847 PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_NETWORK_OTHER << 8, 0xffff00, 0 }
1857 1848
1858static struct pci_device_id brcmf_pcie_devid_table[] = { 1849static struct pci_device_id brcmf_pcie_devid_table[] = {
1859 BRCMF_PCIE_DEVICE(BRCM_PCIE_4354_DEVICE_ID),
1860 BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID), 1850 BRCMF_PCIE_DEVICE(BRCM_PCIE_4356_DEVICE_ID),
1861 BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID), 1851 BRCMF_PCIE_DEVICE(BRCM_PCIE_43567_DEVICE_ID),
1862 BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID), 1852 BRCMF_PCIE_DEVICE(BRCM_PCIE_43570_DEVICE_ID),
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
index faec35c899ec..ab0c89833013 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
@@ -432,8 +432,6 @@ struct brcmf_sdio {
432 struct brcmf_sdio_dev *sdiodev; /* sdio device handler */ 432 struct brcmf_sdio_dev *sdiodev; /* sdio device handler */
433 struct brcmf_chip *ci; /* Chip info struct */ 433 struct brcmf_chip *ci; /* Chip info struct */
434 434
435 u32 ramsize; /* Size of RAM in SOCRAM (bytes) */
436
437 u32 hostintmask; /* Copy of Host Interrupt Mask */ 435 u32 hostintmask; /* Copy of Host Interrupt Mask */
438 atomic_t intstatus; /* Intstatus bits (events) pending */ 436 atomic_t intstatus; /* Intstatus bits (events) pending */
439 atomic_t fcstate; /* State of dongle flow-control */ 437 atomic_t fcstate; /* State of dongle flow-control */
@@ -485,10 +483,9 @@ struct brcmf_sdio {
485#endif /* DEBUG */ 483#endif /* DEBUG */
486 484
487 uint clkstate; /* State of sd and backplane clock(s) */ 485 uint clkstate; /* State of sd and backplane clock(s) */
488 bool activity; /* Activity flag for clock down */
489 s32 idletime; /* Control for activity timeout */ 486 s32 idletime; /* Control for activity timeout */
490 s32 idlecount; /* Activity timeout counter */ 487 s32 idlecount; /* Activity timeout counter */
491 s32 idleclock; /* How to set bus driver when idle */ 488 s32 idleclock; /* How to set bus driver when idle */
492 bool rxflow_mode; /* Rx flow control mode */ 489 bool rxflow_mode; /* Rx flow control mode */
493 bool rxflow; /* Is rx flow control on */ 490 bool rxflow; /* Is rx flow control on */
494 bool alp_only; /* Don't use HT clock (ALP only) */ 491 bool alp_only; /* Don't use HT clock (ALP only) */
@@ -510,11 +507,13 @@ struct brcmf_sdio {
510 507
511 struct workqueue_struct *brcmf_wq; 508 struct workqueue_struct *brcmf_wq;
512 struct work_struct datawork; 509 struct work_struct datawork;
513 atomic_t dpc_tskcnt; 510 bool dpc_triggered;
511 bool dpc_running;
514 512
515 bool txoff; /* Transmit flow-controlled */ 513 bool txoff; /* Transmit flow-controlled */
516 struct brcmf_sdio_count sdcnt; 514 struct brcmf_sdio_count sdcnt;
517 bool sr_enabled; /* SaveRestore enabled */ 515 bool sr_enabled; /* SaveRestore enabled */
516 bool sleeping;
518 517
519 u8 tx_hdrlen; /* sdio bus header length for tx packet */ 518 u8 tx_hdrlen; /* sdio bus header length for tx packet */
520 bool txglom; /* host tx glomming enable flag */ 519 bool txglom; /* host tx glomming enable flag */
@@ -616,6 +615,10 @@ static const struct sdiod_drive_str sdiod_drvstr_tab2_3v3[] = {
616#define BCM43362_NVRAM_NAME "brcm/brcmfmac43362-sdio.txt" 615#define BCM43362_NVRAM_NAME "brcm/brcmfmac43362-sdio.txt"
617#define BCM4339_FIRMWARE_NAME "brcm/brcmfmac4339-sdio.bin" 616#define BCM4339_FIRMWARE_NAME "brcm/brcmfmac4339-sdio.bin"
618#define BCM4339_NVRAM_NAME "brcm/brcmfmac4339-sdio.txt" 617#define BCM4339_NVRAM_NAME "brcm/brcmfmac4339-sdio.txt"
618#define BCM43430_FIRMWARE_NAME "brcm/brcmfmac43430-sdio.bin"
619#define BCM43430_NVRAM_NAME "brcm/brcmfmac43430-sdio.txt"
620#define BCM43455_FIRMWARE_NAME "brcm/brcmfmac43455-sdio.bin"
621#define BCM43455_NVRAM_NAME "brcm/brcmfmac43455-sdio.txt"
619#define BCM4354_FIRMWARE_NAME "brcm/brcmfmac4354-sdio.bin" 622#define BCM4354_FIRMWARE_NAME "brcm/brcmfmac4354-sdio.bin"
620#define BCM4354_NVRAM_NAME "brcm/brcmfmac4354-sdio.txt" 623#define BCM4354_NVRAM_NAME "brcm/brcmfmac4354-sdio.txt"
621 624
@@ -639,6 +642,10 @@ MODULE_FIRMWARE(BCM43362_FIRMWARE_NAME);
639MODULE_FIRMWARE(BCM43362_NVRAM_NAME); 642MODULE_FIRMWARE(BCM43362_NVRAM_NAME);
640MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME); 643MODULE_FIRMWARE(BCM4339_FIRMWARE_NAME);
641MODULE_FIRMWARE(BCM4339_NVRAM_NAME); 644MODULE_FIRMWARE(BCM4339_NVRAM_NAME);
645MODULE_FIRMWARE(BCM43430_FIRMWARE_NAME);
646MODULE_FIRMWARE(BCM43430_NVRAM_NAME);
647MODULE_FIRMWARE(BCM43455_FIRMWARE_NAME);
648MODULE_FIRMWARE(BCM43455_NVRAM_NAME);
642MODULE_FIRMWARE(BCM4354_FIRMWARE_NAME); 649MODULE_FIRMWARE(BCM4354_FIRMWARE_NAME);
643MODULE_FIRMWARE(BCM4354_NVRAM_NAME); 650MODULE_FIRMWARE(BCM4354_NVRAM_NAME);
644 651
@@ -668,6 +675,8 @@ static const struct brcmf_firmware_names brcmf_fwname_data[] = {
668 { BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) }, 675 { BRCM_CC_4335_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4335) },
669 { BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) }, 676 { BRCM_CC_43362_CHIP_ID, 0xFFFFFFFE, BRCMF_FIRMWARE_NVRAM(BCM43362) },
670 { BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) }, 677 { BRCM_CC_4339_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4339) },
678 { BRCM_CC_43430_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM43430) },
679 { BRCM_CC_4345_CHIP_ID, 0xFFFFFFC0, BRCMF_FIRMWARE_NVRAM(BCM43455) },
671 { BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4354) } 680 { BRCM_CC_4354_CHIP_ID, 0xFFFFFFFF, BRCMF_FIRMWARE_NVRAM(BCM4354) }
672}; 681};
673 682
@@ -958,13 +967,8 @@ static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
958 brcmf_dbg(SDIO, "Enter\n"); 967 brcmf_dbg(SDIO, "Enter\n");
959 968
960 /* Early exit if we're already there */ 969 /* Early exit if we're already there */
961 if (bus->clkstate == target) { 970 if (bus->clkstate == target)
962 if (target == CLK_AVAIL) {
963 brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
964 bus->activity = true;
965 }
966 return 0; 971 return 0;
967 }
968 972
969 switch (target) { 973 switch (target) {
970 case CLK_AVAIL: 974 case CLK_AVAIL:
@@ -973,8 +977,6 @@ static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
973 brcmf_sdio_sdclk(bus, true); 977 brcmf_sdio_sdclk(bus, true);
974 /* Now request HT Avail on the backplane */ 978 /* Now request HT Avail on the backplane */
975 brcmf_sdio_htclk(bus, true, pendok); 979 brcmf_sdio_htclk(bus, true, pendok);
976 brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
977 bus->activity = true;
978 break; 980 break;
979 981
980 case CLK_SDONLY: 982 case CLK_SDONLY:
@@ -986,7 +988,6 @@ static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
986 else 988 else
987 brcmf_err("request for %d -> %d\n", 989 brcmf_err("request for %d -> %d\n",
988 bus->clkstate, target); 990 bus->clkstate, target);
989 brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
990 break; 991 break;
991 992
992 case CLK_NONE: 993 case CLK_NONE:
@@ -995,7 +996,6 @@ static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
995 brcmf_sdio_htclk(bus, false, false); 996 brcmf_sdio_htclk(bus, false, false);
996 /* Now remove the SD clock */ 997 /* Now remove the SD clock */
997 brcmf_sdio_sdclk(bus, false); 998 brcmf_sdio_sdclk(bus, false);
998 brcmf_sdio_wd_timer(bus, 0);
999 break; 999 break;
1000 } 1000 }
1001#ifdef DEBUG 1001#ifdef DEBUG
@@ -1013,26 +1013,16 @@ brcmf_sdio_bus_sleep(struct brcmf_sdio *bus, bool sleep, bool pendok)
1013 1013
1014 brcmf_dbg(SDIO, "Enter: request %s currently %s\n", 1014 brcmf_dbg(SDIO, "Enter: request %s currently %s\n",
1015 (sleep ? "SLEEP" : "WAKE"), 1015 (sleep ? "SLEEP" : "WAKE"),
1016 (bus->sdiodev->sleeping ? "SLEEP" : "WAKE")); 1016 (bus->sleeping ? "SLEEP" : "WAKE"));
1017 1017
1018 /* If SR is enabled control bus state with KSO */ 1018 /* If SR is enabled control bus state with KSO */
1019 if (bus->sr_enabled) { 1019 if (bus->sr_enabled) {
1020 /* Done if we're already in the requested state */ 1020 /* Done if we're already in the requested state */
1021 if (sleep == bus->sdiodev->sleeping) 1021 if (sleep == bus->sleeping)
1022 goto end; 1022 goto end;
1023 1023
1024 /* Going to sleep */ 1024 /* Going to sleep */
1025 if (sleep) { 1025 if (sleep) {
1026 /* Don't sleep if something is pending */
1027 if (atomic_read(&bus->intstatus) ||
1028 atomic_read(&bus->ipend) > 0 ||
1029 (!atomic_read(&bus->fcstate) &&
1030 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
1031 data_ok(bus))) {
1032 err = -EBUSY;
1033 goto done;
1034 }
1035
1036 clkcsr = brcmf_sdiod_regrb(bus->sdiodev, 1026 clkcsr = brcmf_sdiod_regrb(bus->sdiodev,
1037 SBSDIO_FUNC1_CHIPCLKCSR, 1027 SBSDIO_FUNC1_CHIPCLKCSR,
1038 &err); 1028 &err);
@@ -1043,11 +1033,7 @@ brcmf_sdio_bus_sleep(struct brcmf_sdio *bus, bool sleep, bool pendok)
1043 SBSDIO_ALP_AVAIL_REQ, &err); 1033 SBSDIO_ALP_AVAIL_REQ, &err);
1044 } 1034 }
1045 err = brcmf_sdio_kso_control(bus, false); 1035 err = brcmf_sdio_kso_control(bus, false);
1046 /* disable watchdog */
1047 if (!err)
1048 brcmf_sdio_wd_timer(bus, 0);
1049 } else { 1036 } else {
1050 bus->idlecount = 0;
1051 err = brcmf_sdio_kso_control(bus, true); 1037 err = brcmf_sdio_kso_control(bus, true);
1052 } 1038 }
1053 if (err) { 1039 if (err) {
@@ -1064,10 +1050,9 @@ end:
1064 brcmf_sdio_clkctl(bus, CLK_NONE, pendok); 1050 brcmf_sdio_clkctl(bus, CLK_NONE, pendok);
1065 } else { 1051 } else {
1066 brcmf_sdio_clkctl(bus, CLK_AVAIL, pendok); 1052 brcmf_sdio_clkctl(bus, CLK_AVAIL, pendok);
1053 brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
1067 } 1054 }
1068 bus->sdiodev->sleeping = sleep; 1055 bus->sleeping = sleep;
1069 if (sleep)
1070 wake_up(&bus->sdiodev->idle_wait);
1071 brcmf_dbg(SDIO, "new state %s\n", 1056 brcmf_dbg(SDIO, "new state %s\n",
1072 (sleep ? "SLEEP" : "WAKE")); 1057 (sleep ? "SLEEP" : "WAKE"));
1073done: 1058done:
@@ -1085,44 +1070,47 @@ static inline bool brcmf_sdio_valid_shared_address(u32 addr)
1085static int brcmf_sdio_readshared(struct brcmf_sdio *bus, 1070static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
1086 struct sdpcm_shared *sh) 1071 struct sdpcm_shared *sh)
1087{ 1072{
1088 u32 addr; 1073 u32 addr = 0;
1089 int rv; 1074 int rv;
1090 u32 shaddr = 0; 1075 u32 shaddr = 0;
1091 struct sdpcm_shared_le sh_le; 1076 struct sdpcm_shared_le sh_le;
1092 __le32 addr_le; 1077 __le32 addr_le;
1093 1078
1094 shaddr = bus->ci->rambase + bus->ramsize - 4; 1079 sdio_claim_host(bus->sdiodev->func[1]);
1080 brcmf_sdio_bus_sleep(bus, false, false);
1095 1081
1096 /* 1082 /*
1097 * Read last word in socram to determine 1083 * Read last word in socram to determine
1098 * address of sdpcm_shared structure 1084 * address of sdpcm_shared structure
1099 */ 1085 */
1100 sdio_claim_host(bus->sdiodev->func[1]); 1086 shaddr = bus->ci->rambase + bus->ci->ramsize - 4;
1101 brcmf_sdio_bus_sleep(bus, false, false); 1087 if (!bus->ci->rambase && brcmf_chip_sr_capable(bus->ci))
1102 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr, (u8 *)&addr_le, 4); 1088 shaddr -= bus->ci->srsize;
1103 sdio_release_host(bus->sdiodev->func[1]); 1089 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, shaddr,
1090 (u8 *)&addr_le, 4);
1104 if (rv < 0) 1091 if (rv < 0)
1105 return rv; 1092 goto fail;
1106
1107 addr = le32_to_cpu(addr_le);
1108
1109 brcmf_dbg(SDIO, "sdpcm_shared address 0x%08X\n", addr);
1110 1093
1111 /* 1094 /*
1112 * Check if addr is valid. 1095 * Check if addr is valid.
1113 * NVRAM length at the end of memory should have been overwritten. 1096 * NVRAM length at the end of memory should have been overwritten.
1114 */ 1097 */
1098 addr = le32_to_cpu(addr_le);
1115 if (!brcmf_sdio_valid_shared_address(addr)) { 1099 if (!brcmf_sdio_valid_shared_address(addr)) {
1116 brcmf_err("invalid sdpcm_shared address 0x%08X\n", 1100 brcmf_err("invalid sdpcm_shared address 0x%08X\n", addr);
1117 addr); 1101 rv = -EINVAL;
1118 return -EINVAL; 1102 goto fail;
1119 } 1103 }
1120 1104
1105 brcmf_dbg(INFO, "sdpcm_shared address 0x%08X\n", addr);
1106
1121 /* Read hndrte_shared structure */ 1107 /* Read hndrte_shared structure */
1122 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le, 1108 rv = brcmf_sdiod_ramrw(bus->sdiodev, false, addr, (u8 *)&sh_le,
1123 sizeof(struct sdpcm_shared_le)); 1109 sizeof(struct sdpcm_shared_le));
1124 if (rv < 0) 1110 if (rv < 0)
1125 return rv; 1111 goto fail;
1112
1113 sdio_release_host(bus->sdiodev->func[1]);
1126 1114
1127 /* Endianness */ 1115 /* Endianness */
1128 sh->flags = le32_to_cpu(sh_le.flags); 1116 sh->flags = le32_to_cpu(sh_le.flags);
@@ -1139,8 +1127,13 @@ static int brcmf_sdio_readshared(struct brcmf_sdio *bus,
1139 sh->flags & SDPCM_SHARED_VERSION_MASK); 1127 sh->flags & SDPCM_SHARED_VERSION_MASK);
1140 return -EPROTO; 1128 return -EPROTO;
1141 } 1129 }
1142
1143 return 0; 1130 return 0;
1131
1132fail:
1133 brcmf_err("unable to obtain sdpcm_shared info: rv=%d (addr=0x%x)\n",
1134 rv, addr);
1135 sdio_release_host(bus->sdiodev->func[1]);
1136 return rv;
1144} 1137}
1145 1138
1146static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus) 1139static void brcmf_sdio_get_console_addr(struct brcmf_sdio *bus)
@@ -1909,7 +1902,7 @@ static uint brcmf_sdio_readframes(struct brcmf_sdio *bus, uint maxframes)
1909 bus->rxpending = true; 1902 bus->rxpending = true;
1910 1903
1911 for (rd->seq_num = bus->rx_seq, rxleft = maxframes; 1904 for (rd->seq_num = bus->rx_seq, rxleft = maxframes;
1912 !bus->rxskip && rxleft && bus->sdiodev->state == BRCMF_STATE_DATA; 1905 !bus->rxskip && rxleft && bus->sdiodev->state == BRCMF_SDIOD_DATA;
1913 rd->seq_num++, rxleft--) { 1906 rd->seq_num++, rxleft--) {
1914 1907
1915 /* Handle glomming separately */ 1908 /* Handle glomming separately */
@@ -2415,7 +2408,7 @@ static uint brcmf_sdio_sendfromq(struct brcmf_sdio *bus, uint maxframes)
2415 } 2408 }
2416 2409
2417 /* Deflow-control stack if needed */ 2410 /* Deflow-control stack if needed */
2418 if ((bus->sdiodev->state == BRCMF_STATE_DATA) && 2411 if ((bus->sdiodev->state == BRCMF_SDIOD_DATA) &&
2419 bus->txoff && (pktq_len(&bus->txq) < TXLOW)) { 2412 bus->txoff && (pktq_len(&bus->txq) < TXLOW)) {
2420 bus->txoff = false; 2413 bus->txoff = false;
2421 brcmf_txflowblock(bus->sdiodev->dev, false); 2414 brcmf_txflowblock(bus->sdiodev->dev, false);
@@ -2503,7 +2496,7 @@ static void brcmf_sdio_bus_stop(struct device *dev)
2503 bus->watchdog_tsk = NULL; 2496 bus->watchdog_tsk = NULL;
2504 } 2497 }
2505 2498
2506 if (sdiodev->state != BRCMF_STATE_NOMEDIUM) { 2499 if (sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
2507 sdio_claim_host(sdiodev->func[1]); 2500 sdio_claim_host(sdiodev->func[1]);
2508 2501
2509 /* Enable clock for device interrupts */ 2502 /* Enable clock for device interrupts */
@@ -2603,21 +2596,6 @@ static int brcmf_sdio_intr_rstatus(struct brcmf_sdio *bus)
2603 return ret; 2596 return ret;
2604} 2597}
2605 2598
2606static int brcmf_sdio_pm_resume_wait(struct brcmf_sdio_dev *sdiodev)
2607{
2608#ifdef CONFIG_PM_SLEEP
2609 int retry;
2610
2611 /* Wait for possible resume to complete */
2612 retry = 0;
2613 while ((atomic_read(&sdiodev->suspend)) && (retry++ != 50))
2614 msleep(20);
2615 if (atomic_read(&sdiodev->suspend))
2616 return -EIO;
2617#endif
2618 return 0;
2619}
2620
2621static void brcmf_sdio_dpc(struct brcmf_sdio *bus) 2599static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2622{ 2600{
2623 u32 newstatus = 0; 2601 u32 newstatus = 0;
@@ -2628,9 +2606,6 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2628 2606
2629 brcmf_dbg(TRACE, "Enter\n"); 2607 brcmf_dbg(TRACE, "Enter\n");
2630 2608
2631 if (brcmf_sdio_pm_resume_wait(bus->sdiodev))
2632 return;
2633
2634 sdio_claim_host(bus->sdiodev->func[1]); 2609 sdio_claim_host(bus->sdiodev->func[1]);
2635 2610
2636 /* If waiting for HTAVAIL, check status */ 2611 /* If waiting for HTAVAIL, check status */
@@ -2739,11 +2714,14 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2739 if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) && 2714 if (bus->ctrl_frame_stat && (bus->clkstate == CLK_AVAIL) &&
2740 data_ok(bus)) { 2715 data_ok(bus)) {
2741 sdio_claim_host(bus->sdiodev->func[1]); 2716 sdio_claim_host(bus->sdiodev->func[1]);
2742 err = brcmf_sdio_tx_ctrlframe(bus, bus->ctrl_frame_buf, 2717 if (bus->ctrl_frame_stat) {
2743 bus->ctrl_frame_len); 2718 err = brcmf_sdio_tx_ctrlframe(bus, bus->ctrl_frame_buf,
2719 bus->ctrl_frame_len);
2720 bus->ctrl_frame_err = err;
2721 wmb();
2722 bus->ctrl_frame_stat = false;
2723 }
2744 sdio_release_host(bus->sdiodev->func[1]); 2724 sdio_release_host(bus->sdiodev->func[1]);
2745 bus->ctrl_frame_err = err;
2746 bus->ctrl_frame_stat = false;
2747 brcmf_sdio_wait_event_wakeup(bus); 2725 brcmf_sdio_wait_event_wakeup(bus);
2748 } 2726 }
2749 /* Send queued frames (limit 1 if rx may still be pending) */ 2727 /* Send queued frames (limit 1 if rx may still be pending) */
@@ -2755,15 +2733,25 @@ static void brcmf_sdio_dpc(struct brcmf_sdio *bus)
2755 brcmf_sdio_sendfromq(bus, framecnt); 2733 brcmf_sdio_sendfromq(bus, framecnt);
2756 } 2734 }
2757 2735
2758 if ((bus->sdiodev->state != BRCMF_STATE_DATA) || (err != 0)) { 2736 if ((bus->sdiodev->state != BRCMF_SDIOD_DATA) || (err != 0)) {
2759 brcmf_err("failed backplane access over SDIO, halting operation\n"); 2737 brcmf_err("failed backplane access over SDIO, halting operation\n");
2760 atomic_set(&bus->intstatus, 0); 2738 atomic_set(&bus->intstatus, 0);
2739 if (bus->ctrl_frame_stat) {
2740 sdio_claim_host(bus->sdiodev->func[1]);
2741 if (bus->ctrl_frame_stat) {
2742 bus->ctrl_frame_err = -ENODEV;
2743 wmb();
2744 bus->ctrl_frame_stat = false;
2745 brcmf_sdio_wait_event_wakeup(bus);
2746 }
2747 sdio_release_host(bus->sdiodev->func[1]);
2748 }
2761 } else if (atomic_read(&bus->intstatus) || 2749 } else if (atomic_read(&bus->intstatus) ||
2762 atomic_read(&bus->ipend) > 0 || 2750 atomic_read(&bus->ipend) > 0 ||
2763 (!atomic_read(&bus->fcstate) && 2751 (!atomic_read(&bus->fcstate) &&
2764 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) && 2752 brcmu_pktq_mlen(&bus->txq, ~bus->flowcontrol) &&
2765 data_ok(bus))) { 2753 data_ok(bus))) {
2766 atomic_inc(&bus->dpc_tskcnt); 2754 bus->dpc_triggered = true;
2767 } 2755 }
2768} 2756}
2769 2757
@@ -2862,11 +2850,7 @@ static int brcmf_sdio_bus_txdata(struct device *dev, struct sk_buff *pkt)
2862 qcount[prec] = pktq_plen(&bus->txq, prec); 2850 qcount[prec] = pktq_plen(&bus->txq, prec);
2863#endif 2851#endif
2864 2852
2865 if (atomic_read(&bus->dpc_tskcnt) == 0) { 2853 brcmf_sdio_trigger_dpc(bus);
2866 atomic_inc(&bus->dpc_tskcnt);
2867 queue_work(bus->brcmf_wq, &bus->datawork);
2868 }
2869
2870 return ret; 2854 return ret;
2871} 2855}
2872 2856
@@ -2963,23 +2947,27 @@ brcmf_sdio_bus_txctl(struct device *dev, unsigned char *msg, uint msglen)
2963 /* Send from dpc */ 2947 /* Send from dpc */
2964 bus->ctrl_frame_buf = msg; 2948 bus->ctrl_frame_buf = msg;
2965 bus->ctrl_frame_len = msglen; 2949 bus->ctrl_frame_len = msglen;
2950 wmb();
2966 bus->ctrl_frame_stat = true; 2951 bus->ctrl_frame_stat = true;
2967 if (atomic_read(&bus->dpc_tskcnt) == 0) {
2968 atomic_inc(&bus->dpc_tskcnt);
2969 queue_work(bus->brcmf_wq, &bus->datawork);
2970 }
2971 2952
2953 brcmf_sdio_trigger_dpc(bus);
2972 wait_event_interruptible_timeout(bus->ctrl_wait, !bus->ctrl_frame_stat, 2954 wait_event_interruptible_timeout(bus->ctrl_wait, !bus->ctrl_frame_stat,
2973 msecs_to_jiffies(CTL_DONE_TIMEOUT)); 2955 msecs_to_jiffies(CTL_DONE_TIMEOUT));
2974 2956 ret = 0;
2975 if (!bus->ctrl_frame_stat) { 2957 if (bus->ctrl_frame_stat) {
2958 sdio_claim_host(bus->sdiodev->func[1]);
2959 if (bus->ctrl_frame_stat) {
2960 brcmf_dbg(SDIO, "ctrl_frame timeout\n");
2961 bus->ctrl_frame_stat = false;
2962 ret = -ETIMEDOUT;
2963 }
2964 sdio_release_host(bus->sdiodev->func[1]);
2965 }
2966 if (!ret) {
2976 brcmf_dbg(SDIO, "ctrl_frame complete, err=%d\n", 2967 brcmf_dbg(SDIO, "ctrl_frame complete, err=%d\n",
2977 bus->ctrl_frame_err); 2968 bus->ctrl_frame_err);
2969 rmb();
2978 ret = bus->ctrl_frame_err; 2970 ret = bus->ctrl_frame_err;
2979 } else {
2980 brcmf_dbg(SDIO, "ctrl_frame timeout\n");
2981 bus->ctrl_frame_stat = false;
2982 ret = -ETIMEDOUT;
2983 } 2971 }
2984 2972
2985 if (ret) 2973 if (ret)
@@ -3383,9 +3371,6 @@ static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus,
3383 sdio_claim_host(bus->sdiodev->func[1]); 3371 sdio_claim_host(bus->sdiodev->func[1]);
3384 brcmf_sdio_clkctl(bus, CLK_AVAIL, false); 3372 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
3385 3373
3386 /* Keep arm in reset */
3387 brcmf_chip_enter_download(bus->ci);
3388
3389 rstvec = get_unaligned_le32(fw->data); 3374 rstvec = get_unaligned_le32(fw->data);
3390 brcmf_dbg(SDIO, "firmware rstvec: %x\n", rstvec); 3375 brcmf_dbg(SDIO, "firmware rstvec: %x\n", rstvec);
3391 3376
@@ -3405,13 +3390,13 @@ static int brcmf_sdio_download_firmware(struct brcmf_sdio *bus,
3405 } 3390 }
3406 3391
3407 /* Take arm out of reset */ 3392 /* Take arm out of reset */
3408 if (!brcmf_chip_exit_download(bus->ci, rstvec)) { 3393 if (!brcmf_chip_set_active(bus->ci, rstvec)) {
3409 brcmf_err("error getting out of ARM core reset\n"); 3394 brcmf_err("error getting out of ARM core reset\n");
3410 goto err; 3395 goto err;
3411 } 3396 }
3412 3397
3413 /* Allow full data communication using DPC from now on. */ 3398 /* Allow full data communication using DPC from now on. */
3414 bus->sdiodev->state = BRCMF_STATE_DATA; 3399 brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
3415 bcmerror = 0; 3400 bcmerror = 0;
3416 3401
3417err: 3402err:
@@ -3548,6 +3533,14 @@ done:
3548 return err; 3533 return err;
3549} 3534}
3550 3535
3536void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus)
3537{
3538 if (!bus->dpc_triggered) {
3539 bus->dpc_triggered = true;
3540 queue_work(bus->brcmf_wq, &bus->datawork);
3541 }
3542}
3543
3551void brcmf_sdio_isr(struct brcmf_sdio *bus) 3544void brcmf_sdio_isr(struct brcmf_sdio *bus)
3552{ 3545{
3553 brcmf_dbg(TRACE, "Enter\n"); 3546 brcmf_dbg(TRACE, "Enter\n");
@@ -3557,7 +3550,7 @@ void brcmf_sdio_isr(struct brcmf_sdio *bus)
3557 return; 3550 return;
3558 } 3551 }
3559 3552
3560 if (bus->sdiodev->state != BRCMF_STATE_DATA) { 3553 if (bus->sdiodev->state != BRCMF_SDIOD_DATA) {
3561 brcmf_err("bus is down. we have nothing to do\n"); 3554 brcmf_err("bus is down. we have nothing to do\n");
3562 return; 3555 return;
3563 } 3556 }
@@ -3574,11 +3567,11 @@ void brcmf_sdio_isr(struct brcmf_sdio *bus)
3574 if (!bus->intr) 3567 if (!bus->intr)
3575 brcmf_err("isr w/o interrupt configured!\n"); 3568 brcmf_err("isr w/o interrupt configured!\n");
3576 3569
3577 atomic_inc(&bus->dpc_tskcnt); 3570 bus->dpc_triggered = true;
3578 queue_work(bus->brcmf_wq, &bus->datawork); 3571 queue_work(bus->brcmf_wq, &bus->datawork);
3579} 3572}
3580 3573
3581static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus) 3574static void brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3582{ 3575{
3583 brcmf_dbg(TIMER, "Enter\n"); 3576 brcmf_dbg(TIMER, "Enter\n");
3584 3577
@@ -3594,7 +3587,7 @@ static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3594 if (!bus->intr || 3587 if (!bus->intr ||
3595 (bus->sdcnt.intrcount == bus->sdcnt.lastintrs)) { 3588 (bus->sdcnt.intrcount == bus->sdcnt.lastintrs)) {
3596 3589
3597 if (atomic_read(&bus->dpc_tskcnt) == 0) { 3590 if (!bus->dpc_triggered) {
3598 u8 devpend; 3591 u8 devpend;
3599 3592
3600 sdio_claim_host(bus->sdiodev->func[1]); 3593 sdio_claim_host(bus->sdiodev->func[1]);
@@ -3602,9 +3595,8 @@ static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3602 SDIO_CCCR_INTx, 3595 SDIO_CCCR_INTx,
3603 NULL); 3596 NULL);
3604 sdio_release_host(bus->sdiodev->func[1]); 3597 sdio_release_host(bus->sdiodev->func[1]);
3605 intstatus = 3598 intstatus = devpend & (INTR_STATUS_FUNC1 |
3606 devpend & (INTR_STATUS_FUNC1 | 3599 INTR_STATUS_FUNC2);
3607 INTR_STATUS_FUNC2);
3608 } 3600 }
3609 3601
3610 /* If there is something, make like the ISR and 3602 /* If there is something, make like the ISR and
@@ -3613,7 +3605,7 @@ static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3613 bus->sdcnt.pollcnt++; 3605 bus->sdcnt.pollcnt++;
3614 atomic_set(&bus->ipend, 1); 3606 atomic_set(&bus->ipend, 1);
3615 3607
3616 atomic_inc(&bus->dpc_tskcnt); 3608 bus->dpc_triggered = true;
3617 queue_work(bus->brcmf_wq, &bus->datawork); 3609 queue_work(bus->brcmf_wq, &bus->datawork);
3618 } 3610 }
3619 } 3611 }
@@ -3623,7 +3615,7 @@ static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3623 } 3615 }
3624#ifdef DEBUG 3616#ifdef DEBUG
3625 /* Poll for console output periodically */ 3617 /* Poll for console output periodically */
3626 if (bus->sdiodev->state == BRCMF_STATE_DATA && 3618 if (bus->sdiodev->state == BRCMF_SDIOD_DATA &&
3627 bus->console_interval != 0) { 3619 bus->console_interval != 0) {
3628 bus->console.count += BRCMF_WD_POLL_MS; 3620 bus->console.count += BRCMF_WD_POLL_MS;
3629 if (bus->console.count >= bus->console_interval) { 3621 if (bus->console.count >= bus->console_interval) {
@@ -3640,22 +3632,25 @@ static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
3640#endif /* DEBUG */ 3632#endif /* DEBUG */
3641 3633
3642 /* On idle timeout clear activity flag and/or turn off clock */ 3634 /* On idle timeout clear activity flag and/or turn off clock */
3643 if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) { 3635 if (!bus->dpc_triggered) {
3644 if (++bus->idlecount >= bus->idletime) { 3636 rmb();
3645 bus->idlecount = 0; 3637 if ((!bus->dpc_running) && (bus->idletime > 0) &&
3646 if (bus->activity) { 3638 (bus->clkstate == CLK_AVAIL)) {
3647 bus->activity = false; 3639 bus->idlecount++;
3648 brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS); 3640 if (bus->idlecount > bus->idletime) {
3649 } else {
3650 brcmf_dbg(SDIO, "idle\n"); 3641 brcmf_dbg(SDIO, "idle\n");
3651 sdio_claim_host(bus->sdiodev->func[1]); 3642 sdio_claim_host(bus->sdiodev->func[1]);
3643 brcmf_sdio_wd_timer(bus, 0);
3644 bus->idlecount = 0;
3652 brcmf_sdio_bus_sleep(bus, true, false); 3645 brcmf_sdio_bus_sleep(bus, true, false);
3653 sdio_release_host(bus->sdiodev->func[1]); 3646 sdio_release_host(bus->sdiodev->func[1]);
3654 } 3647 }
3648 } else {
3649 bus->idlecount = 0;
3655 } 3650 }
3651 } else {
3652 bus->idlecount = 0;
3656 } 3653 }
3657
3658 return (atomic_read(&bus->ipend) > 0);
3659} 3654}
3660 3655
3661static void brcmf_sdio_dataworker(struct work_struct *work) 3656static void brcmf_sdio_dataworker(struct work_struct *work)
@@ -3663,9 +3658,18 @@ static void brcmf_sdio_dataworker(struct work_struct *work)
3663 struct brcmf_sdio *bus = container_of(work, struct brcmf_sdio, 3658 struct brcmf_sdio *bus = container_of(work, struct brcmf_sdio,
3664 datawork); 3659 datawork);
3665 3660
3666 while (atomic_read(&bus->dpc_tskcnt)) { 3661 bus->dpc_running = true;
3667 atomic_set(&bus->dpc_tskcnt, 0); 3662 wmb();
3663 while (ACCESS_ONCE(bus->dpc_triggered)) {
3664 bus->dpc_triggered = false;
3668 brcmf_sdio_dpc(bus); 3665 brcmf_sdio_dpc(bus);
3666 bus->idlecount = 0;
3667 }
3668 bus->dpc_running = false;
3669 if (brcmf_sdiod_freezing(bus->sdiodev)) {
3670 brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DOWN);
3671 brcmf_sdiod_try_freeze(bus->sdiodev);
3672 brcmf_sdiod_change_state(bus->sdiodev, BRCMF_SDIOD_DATA);
3669 } 3673 }
3670} 3674}
3671 3675
@@ -3784,8 +3788,8 @@ static int brcmf_sdio_buscoreprep(void *ctx)
3784 return 0; 3788 return 0;
3785} 3789}
3786 3790
3787static void brcmf_sdio_buscore_exitdl(void *ctx, struct brcmf_chip *chip, 3791static void brcmf_sdio_buscore_activate(void *ctx, struct brcmf_chip *chip,
3788 u32 rstvec) 3792 u32 rstvec)
3789{ 3793{
3790 struct brcmf_sdio_dev *sdiodev = ctx; 3794 struct brcmf_sdio_dev *sdiodev = ctx;
3791 struct brcmf_core *core; 3795 struct brcmf_core *core;
@@ -3828,7 +3832,7 @@ static void brcmf_sdio_buscore_write32(void *ctx, u32 addr, u32 val)
3828 3832
3829static const struct brcmf_buscore_ops brcmf_sdio_buscore_ops = { 3833static const struct brcmf_buscore_ops brcmf_sdio_buscore_ops = {
3830 .prepare = brcmf_sdio_buscoreprep, 3834 .prepare = brcmf_sdio_buscoreprep,
3831 .exit_dl = brcmf_sdio_buscore_exitdl, 3835 .activate = brcmf_sdio_buscore_activate,
3832 .read32 = brcmf_sdio_buscore_read32, 3836 .read32 = brcmf_sdio_buscore_read32,
3833 .write32 = brcmf_sdio_buscore_write32, 3837 .write32 = brcmf_sdio_buscore_write32,
3834}; 3838};
@@ -3882,13 +3886,6 @@ brcmf_sdio_probe_attach(struct brcmf_sdio *bus)
3882 drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH; 3886 drivestrength = DEFAULT_SDIO_DRIVE_STRENGTH;
3883 brcmf_sdio_drivestrengthinit(bus->sdiodev, bus->ci, drivestrength); 3887 brcmf_sdio_drivestrengthinit(bus->sdiodev, bus->ci, drivestrength);
3884 3888
3885 /* Get info on the SOCRAM cores... */
3886 bus->ramsize = bus->ci->ramsize;
3887 if (!(bus->ramsize)) {
3888 brcmf_err("failed to find SOCRAM memory!\n");
3889 goto fail;
3890 }
3891
3892 /* Set card control so an SDIO card reset does a WLAN backplane reset */ 3889 /* Set card control so an SDIO card reset does a WLAN backplane reset */
3893 reg_val = brcmf_sdiod_regrb(bus->sdiodev, 3890 reg_val = brcmf_sdiod_regrb(bus->sdiodev,
3894 SDIO_CCCR_BRCM_CARDCTRL, &err); 3891 SDIO_CCCR_BRCM_CARDCTRL, &err);
@@ -3944,13 +3941,19 @@ static int
3944brcmf_sdio_watchdog_thread(void *data) 3941brcmf_sdio_watchdog_thread(void *data)
3945{ 3942{
3946 struct brcmf_sdio *bus = (struct brcmf_sdio *)data; 3943 struct brcmf_sdio *bus = (struct brcmf_sdio *)data;
3944 int wait;
3947 3945
3948 allow_signal(SIGTERM); 3946 allow_signal(SIGTERM);
3949 /* Run until signal received */ 3947 /* Run until signal received */
3948 brcmf_sdiod_freezer_count(bus->sdiodev);
3950 while (1) { 3949 while (1) {
3951 if (kthread_should_stop()) 3950 if (kthread_should_stop())
3952 break; 3951 break;
3953 if (!wait_for_completion_interruptible(&bus->watchdog_wait)) { 3952 brcmf_sdiod_freezer_uncount(bus->sdiodev);
3953 wait = wait_for_completion_interruptible(&bus->watchdog_wait);
3954 brcmf_sdiod_freezer_count(bus->sdiodev);
3955 brcmf_sdiod_try_freeze(bus->sdiodev);
3956 if (!wait) {
3954 brcmf_sdio_bus_watchdog(bus); 3957 brcmf_sdio_bus_watchdog(bus);
3955 /* Count the tick for reference */ 3958 /* Count the tick for reference */
3956 bus->sdcnt.tickcnt++; 3959 bus->sdcnt.tickcnt++;
@@ -3971,7 +3974,7 @@ brcmf_sdio_watchdog(unsigned long data)
3971 /* Reschedule the watchdog */ 3974 /* Reschedule the watchdog */
3972 if (bus->wd_timer_valid) 3975 if (bus->wd_timer_valid)
3973 mod_timer(&bus->timer, 3976 mod_timer(&bus->timer,
3974 jiffies + BRCMF_WD_POLL_MS * HZ / 1000); 3977 jiffies + msecs_to_jiffies(BRCMF_WD_POLL_MS));
3975 } 3978 }
3976} 3979}
3977 3980
@@ -4089,6 +4092,7 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
4089{ 4092{
4090 int ret; 4093 int ret;
4091 struct brcmf_sdio *bus; 4094 struct brcmf_sdio *bus;
4095 struct workqueue_struct *wq;
4092 4096
4093 brcmf_dbg(TRACE, "Enter\n"); 4097 brcmf_dbg(TRACE, "Enter\n");
4094 4098
@@ -4117,12 +4121,16 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
4117 bus->sgentry_align = sdiodev->pdata->sd_sgentry_align; 4121 bus->sgentry_align = sdiodev->pdata->sd_sgentry_align;
4118 } 4122 }
4119 4123
4120 INIT_WORK(&bus->datawork, brcmf_sdio_dataworker); 4124 /* single-threaded workqueue */
4121 bus->brcmf_wq = create_singlethread_workqueue("brcmf_wq"); 4125 wq = alloc_ordered_workqueue("brcmf_wq/%s", WQ_MEM_RECLAIM,
4122 if (bus->brcmf_wq == NULL) { 4126 dev_name(&sdiodev->func[1]->dev));
4127 if (!wq) {
4123 brcmf_err("insufficient memory to create txworkqueue\n"); 4128 brcmf_err("insufficient memory to create txworkqueue\n");
4124 goto fail; 4129 goto fail;
4125 } 4130 }
4131 brcmf_sdiod_freezer_count(sdiodev);
4132 INIT_WORK(&bus->datawork, brcmf_sdio_dataworker);
4133 bus->brcmf_wq = wq;
4126 4134
4127 /* attempt to attach to the dongle */ 4135 /* attempt to attach to the dongle */
4128 if (!(brcmf_sdio_probe_attach(bus))) { 4136 if (!(brcmf_sdio_probe_attach(bus))) {
@@ -4143,13 +4151,15 @@ struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev)
4143 /* Initialize watchdog thread */ 4151 /* Initialize watchdog thread */
4144 init_completion(&bus->watchdog_wait); 4152 init_completion(&bus->watchdog_wait);
4145 bus->watchdog_tsk = kthread_run(brcmf_sdio_watchdog_thread, 4153 bus->watchdog_tsk = kthread_run(brcmf_sdio_watchdog_thread,
4146 bus, "brcmf_watchdog"); 4154 bus, "brcmf_wdog/%s",
4155 dev_name(&sdiodev->func[1]->dev));
4147 if (IS_ERR(bus->watchdog_tsk)) { 4156 if (IS_ERR(bus->watchdog_tsk)) {
4148 pr_warn("brcmf_watchdog thread failed to start\n"); 4157 pr_warn("brcmf_watchdog thread failed to start\n");
4149 bus->watchdog_tsk = NULL; 4158 bus->watchdog_tsk = NULL;
4150 } 4159 }
4151 /* Initialize DPC thread */ 4160 /* Initialize DPC thread */
4152 atomic_set(&bus->dpc_tskcnt, 0); 4161 bus->dpc_triggered = false;
4162 bus->dpc_running = false;
4153 4163
4154 /* Assign bus interface call back */ 4164 /* Assign bus interface call back */
4155 bus->sdiodev->bus_if->dev = bus->sdiodev->dev; 4165 bus->sdiodev->bus_if->dev = bus->sdiodev->dev;
@@ -4242,16 +4252,16 @@ void brcmf_sdio_remove(struct brcmf_sdio *bus)
4242 destroy_workqueue(bus->brcmf_wq); 4252 destroy_workqueue(bus->brcmf_wq);
4243 4253
4244 if (bus->ci) { 4254 if (bus->ci) {
4245 if (bus->sdiodev->state != BRCMF_STATE_NOMEDIUM) { 4255 if (bus->sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
4246 sdio_claim_host(bus->sdiodev->func[1]); 4256 sdio_claim_host(bus->sdiodev->func[1]);
4257 brcmf_sdio_wd_timer(bus, 0);
4247 brcmf_sdio_clkctl(bus, CLK_AVAIL, false); 4258 brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
4248 /* Leave the device in state where it is 4259 /* Leave the device in state where it is
4249 * 'quiet'. This is done by putting it in 4260 * 'passive'. This is done by resetting all
4250 * download_state which essentially resets 4261 * necessary cores.
4251 * all necessary cores.
4252 */ 4262 */
4253 msleep(20); 4263 msleep(20);
4254 brcmf_chip_enter_download(bus->ci); 4264 brcmf_chip_set_passive(bus->ci);
4255 brcmf_sdio_clkctl(bus, CLK_NONE, false); 4265 brcmf_sdio_clkctl(bus, CLK_NONE, false);
4256 sdio_release_host(bus->sdiodev->func[1]); 4266 sdio_release_host(bus->sdiodev->func[1]);
4257 } 4267 }
@@ -4277,7 +4287,7 @@ void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick)
4277 } 4287 }
4278 4288
4279 /* don't start the wd until fw is loaded */ 4289 /* don't start the wd until fw is loaded */
4280 if (bus->sdiodev->state != BRCMF_STATE_DATA) 4290 if (bus->sdiodev->state != BRCMF_SDIOD_DATA)
4281 return; 4291 return;
4282 4292
4283 if (wdtick) { 4293 if (wdtick) {
@@ -4290,16 +4300,28 @@ void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick)
4290 dynamically changed or in the first instance 4300 dynamically changed or in the first instance
4291 */ 4301 */
4292 bus->timer.expires = 4302 bus->timer.expires =
4293 jiffies + BRCMF_WD_POLL_MS * HZ / 1000; 4303 jiffies + msecs_to_jiffies(BRCMF_WD_POLL_MS);
4294 add_timer(&bus->timer); 4304 add_timer(&bus->timer);
4295 4305
4296 } else { 4306 } else {
4297 /* Re arm the timer, at last watchdog period */ 4307 /* Re arm the timer, at last watchdog period */
4298 mod_timer(&bus->timer, 4308 mod_timer(&bus->timer,
4299 jiffies + BRCMF_WD_POLL_MS * HZ / 1000); 4309 jiffies + msecs_to_jiffies(BRCMF_WD_POLL_MS));
4300 } 4310 }
4301 4311
4302 bus->wd_timer_valid = true; 4312 bus->wd_timer_valid = true;
4303 bus->save_ms = wdtick; 4313 bus->save_ms = wdtick;
4304 } 4314 }
4305} 4315}
4316
4317int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep)
4318{
4319 int ret;
4320
4321 sdio_claim_host(bus->sdiodev->func[1]);
4322 ret = brcmf_sdio_bus_sleep(bus, sleep, false);
4323 sdio_release_host(bus->sdiodev->func[1]);
4324
4325 return ret;
4326}
4327
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/brcm80211/brcmfmac/sdio.h
index ec2586a8425c..7328478b2d7b 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.h
@@ -155,11 +155,17 @@
155/* watchdog polling interval in ms */ 155/* watchdog polling interval in ms */
156#define BRCMF_WD_POLL_MS 10 156#define BRCMF_WD_POLL_MS 10
157 157
158/* The state of the bus */ 158/**
159enum brcmf_sdio_state { 159 * enum brcmf_sdiod_state - the state of the bus.
160 BRCMF_STATE_DOWN, /* Device available, still initialising */ 160 *
161 BRCMF_STATE_DATA, /* Ready for data transfers, DPC enabled */ 161 * @BRCMF_SDIOD_DOWN: Device can be accessed, no DPC.
162 BRCMF_STATE_NOMEDIUM /* No medium access to dongle possible */ 162 * @BRCMF_SDIOD_DATA: Ready for data transfers, DPC enabled.
163 * @BRCMF_SDIOD_NOMEDIUM: No medium access to dongle possible.
164 */
165enum brcmf_sdiod_state {
166 BRCMF_SDIOD_DOWN,
167 BRCMF_SDIOD_DATA,
168 BRCMF_SDIOD_NOMEDIUM
163}; 169};
164 170
165struct brcmf_sdreg { 171struct brcmf_sdreg {
@@ -169,15 +175,13 @@ struct brcmf_sdreg {
169}; 175};
170 176
171struct brcmf_sdio; 177struct brcmf_sdio;
178struct brcmf_sdiod_freezer;
172 179
173struct brcmf_sdio_dev { 180struct brcmf_sdio_dev {
174 struct sdio_func *func[SDIO_MAX_FUNCS]; 181 struct sdio_func *func[SDIO_MAX_FUNCS];
175 u8 num_funcs; /* Supported funcs on client */ 182 u8 num_funcs; /* Supported funcs on client */
176 u32 sbwad; /* Save backplane window address */ 183 u32 sbwad; /* Save backplane window address */
177 struct brcmf_sdio *bus; 184 struct brcmf_sdio *bus;
178 atomic_t suspend; /* suspend flag */
179 bool sleeping;
180 wait_queue_head_t idle_wait;
181 struct device *dev; 185 struct device *dev;
182 struct brcmf_bus *bus_if; 186 struct brcmf_bus *bus_if;
183 struct brcmfmac_sdio_platform_data *pdata; 187 struct brcmfmac_sdio_platform_data *pdata;
@@ -194,7 +198,8 @@ struct brcmf_sdio_dev {
194 char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN]; 198 char fw_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
195 char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN]; 199 char nvram_name[BRCMF_FW_PATH_LEN + BRCMF_FW_NAME_LEN];
196 bool wowl_enabled; 200 bool wowl_enabled;
197 enum brcmf_sdio_state state; 201 enum brcmf_sdiod_state state;
202 struct brcmf_sdiod_freezer *freezer;
198}; 203};
199 204
200/* sdio core registers */ 205/* sdio core registers */
@@ -337,6 +342,28 @@ int brcmf_sdiod_ramrw(struct brcmf_sdio_dev *sdiodev, bool write, u32 address,
337 342
338/* Issue an abort to the specified function */ 343/* Issue an abort to the specified function */
339int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn); 344int brcmf_sdiod_abort(struct brcmf_sdio_dev *sdiodev, uint fn);
345void brcmf_sdiod_change_state(struct brcmf_sdio_dev *sdiodev,
346 enum brcmf_sdiod_state state);
347#ifdef CONFIG_PM_SLEEP
348bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev);
349void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev);
350void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev);
351void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev);
352#else
353static inline bool brcmf_sdiod_freezing(struct brcmf_sdio_dev *sdiodev)
354{
355 return false;
356}
357static inline void brcmf_sdiod_try_freeze(struct brcmf_sdio_dev *sdiodev)
358{
359}
360static inline void brcmf_sdiod_freezer_count(struct brcmf_sdio_dev *sdiodev)
361{
362}
363static inline void brcmf_sdiod_freezer_uncount(struct brcmf_sdio_dev *sdiodev)
364{
365}
366#endif /* CONFIG_PM_SLEEP */
340 367
341struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev); 368struct brcmf_sdio *brcmf_sdio_probe(struct brcmf_sdio_dev *sdiodev);
342void brcmf_sdio_remove(struct brcmf_sdio *bus); 369void brcmf_sdio_remove(struct brcmf_sdio *bus);
@@ -344,5 +371,7 @@ void brcmf_sdio_isr(struct brcmf_sdio *bus);
344 371
345void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick); 372void brcmf_sdio_wd_timer(struct brcmf_sdio *bus, uint wdtick);
346void brcmf_sdio_wowl_config(struct device *dev, bool enabled); 373void brcmf_sdio_wowl_config(struct device *dev, bool enabled);
374int brcmf_sdio_sleep(struct brcmf_sdio *bus, bool sleep);
375void brcmf_sdio_trigger_dpc(struct brcmf_sdio *bus);
347 376
348#endif /* BRCMFMAC_SDIO_H */ 377#endif /* BRCMFMAC_SDIO_H */
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/main.c b/drivers/net/wireless/brcm80211/brcmsmac/main.c
index eb8584a9c49a..369527e27689 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/main.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/main.c
@@ -4668,7 +4668,7 @@ static int brcms_b_attach(struct brcms_c_info *wlc, struct bcma_device *core,
4668 brcms_c_coredisable(wlc_hw); 4668 brcms_c_coredisable(wlc_hw);
4669 4669
4670 /* Match driver "down" state */ 4670 /* Match driver "down" state */
4671 bcma_core_pci_down(wlc_hw->d11core->bus); 4671 bcma_host_pci_down(wlc_hw->d11core->bus);
4672 4672
4673 /* turn off pll and xtal to match driver "down" state */ 4673 /* turn off pll and xtal to match driver "down" state */
4674 brcms_b_xtal(wlc_hw, OFF); 4674 brcms_b_xtal(wlc_hw, OFF);
@@ -4959,7 +4959,7 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
4959 * Configure pci/pcmcia here instead of in brcms_c_attach() 4959 * Configure pci/pcmcia here instead of in brcms_c_attach()
4960 * to allow mfg hotswap: down, hotswap (chip power cycle), up. 4960 * to allow mfg hotswap: down, hotswap (chip power cycle), up.
4961 */ 4961 */
4962 bcma_core_pci_irq_ctl(&wlc_hw->d11core->bus->drv_pci[0], wlc_hw->d11core, 4962 bcma_host_pci_irq_ctl(wlc_hw->d11core->bus, wlc_hw->d11core,
4963 true); 4963 true);
4964 4964
4965 /* 4965 /*
@@ -4969,12 +4969,12 @@ static int brcms_b_up_prep(struct brcms_hardware *wlc_hw)
4969 */ 4969 */
4970 if (brcms_b_radio_read_hwdisabled(wlc_hw)) { 4970 if (brcms_b_radio_read_hwdisabled(wlc_hw)) {
4971 /* put SB PCI in down state again */ 4971 /* put SB PCI in down state again */
4972 bcma_core_pci_down(wlc_hw->d11core->bus); 4972 bcma_host_pci_down(wlc_hw->d11core->bus);
4973 brcms_b_xtal(wlc_hw, OFF); 4973 brcms_b_xtal(wlc_hw, OFF);
4974 return -ENOMEDIUM; 4974 return -ENOMEDIUM;
4975 } 4975 }
4976 4976
4977 bcma_core_pci_up(wlc_hw->d11core->bus); 4977 bcma_host_pci_up(wlc_hw->d11core->bus);
4978 4978
4979 /* reset the d11 core */ 4979 /* reset the d11 core */
4980 brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS); 4980 brcms_b_corereset(wlc_hw, BRCMS_USE_COREFLAGS);
@@ -5171,7 +5171,7 @@ static int brcms_b_down_finish(struct brcms_hardware *wlc_hw)
5171 5171
5172 /* turn off primary xtal and pll */ 5172 /* turn off primary xtal and pll */
5173 if (!wlc_hw->noreset) { 5173 if (!wlc_hw->noreset) {
5174 bcma_core_pci_down(wlc_hw->d11core->bus); 5174 bcma_host_pci_down(wlc_hw->d11core->bus);
5175 brcms_b_xtal(wlc_hw, OFF); 5175 brcms_b_xtal(wlc_hw, OFF);
5176 } 5176 }
5177 } 5177 }
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
index 941b1e41f366..1c4e9dd57960 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_cmn.c
@@ -2949,5 +2949,5 @@ bool wlc_phy_txpower_ipa_ison(struct brcms_phy_pub *ppi)
2949 if (ISNPHY(pi)) 2949 if (ISNPHY(pi))
2950 return wlc_phy_n_txpower_ipa_ison(pi); 2950 return wlc_phy_n_txpower_ipa_ison(pi);
2951 else 2951 else
2952 return 0; 2952 return false;
2953} 2953}
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
index 5f1366234a0d..93d4cde0eb31 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_lcn.c
@@ -4999,7 +4999,7 @@ void wlc_2064_vco_cal(struct brcms_phy *pi)
4999bool wlc_phy_tpc_isenabled_lcnphy(struct brcms_phy *pi) 4999bool wlc_phy_tpc_isenabled_lcnphy(struct brcms_phy *pi)
5000{ 5000{
5001 if (wlc_lcnphy_tempsense_based_pwr_ctrl_enabled(pi)) 5001 if (wlc_lcnphy_tempsense_based_pwr_ctrl_enabled(pi))
5002 return 0; 5002 return false;
5003 else 5003 else
5004 return (LCNPHY_TX_PWR_CTRL_HW == 5004 return (LCNPHY_TX_PWR_CTRL_HW ==
5005 wlc_lcnphy_get_tx_pwr_ctrl((pi))); 5005 wlc_lcnphy_get_tx_pwr_ctrl((pi)));
diff --git a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
index 084f18f4f950..99dac9b8a082 100644
--- a/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
+++ b/drivers/net/wireless/brcm80211/brcmsmac/phy/phy_n.c
@@ -23041,10 +23041,7 @@ static void wlc_phy_rssi_cal_nphy_rev2(struct brcms_phy *pi, u8 rssi_type)
23041 else if (rssi_ctrl_state[0] == RADIO_2055_WBRSSI_G1_SEL) 23041 else if (rssi_ctrl_state[0] == RADIO_2055_WBRSSI_G1_SEL)
23042 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE1, 23042 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE1,
23043 NPHY_RSSI_SEL_W1); 23043 NPHY_RSSI_SEL_W1);
23044 else if (rssi_ctrl_state[0] == RADIO_2055_WBRSSI_G2_SEL) 23044 else /* RADIO_2055_WBRSSI_G2_SEL */
23045 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE1,
23046 NPHY_RSSI_SEL_W2);
23047 else
23048 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE1, 23045 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE1,
23049 NPHY_RSSI_SEL_W2); 23046 NPHY_RSSI_SEL_W2);
23050 if (rssi_ctrl_state[1] == RADIO_2055_NBRSSI_SEL) 23047 if (rssi_ctrl_state[1] == RADIO_2055_NBRSSI_SEL)
@@ -23053,13 +23050,9 @@ static void wlc_phy_rssi_cal_nphy_rev2(struct brcms_phy *pi, u8 rssi_type)
23053 else if (rssi_ctrl_state[1] == RADIO_2055_WBRSSI_G1_SEL) 23050 else if (rssi_ctrl_state[1] == RADIO_2055_WBRSSI_G1_SEL)
23054 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE2, 23051 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE2,
23055 NPHY_RSSI_SEL_W1); 23052 NPHY_RSSI_SEL_W1);
23056 else if (rssi_ctrl_state[1] == RADIO_2055_WBRSSI_G2_SEL) 23053 else /* RADIO_2055_WBRSSI_G1_SEL */
23057 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE2, 23054 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE2,
23058 NPHY_RSSI_SEL_W2); 23055 NPHY_RSSI_SEL_W2);
23059 else
23060 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_CORE2,
23061 NPHY_RSSI_SEL_W2);
23062
23063 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_OFF, rssi_type); 23056 wlc_phy_rssisel_nphy(pi, RADIO_MIMO_CORESEL_OFF, rssi_type);
23064 23057
23065 write_phy_reg(pi, 0x91, rfctrlintc_state[0]); 23058 write_phy_reg(pi, 0x91, rfctrlintc_state[0]);
diff --git a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
index 2124a17d0bfd..4efdd51af9c8 100644
--- a/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
+++ b/drivers/net/wireless/brcm80211/include/brcm_hw_ids.h
@@ -37,6 +37,8 @@
37#define BRCM_CC_43362_CHIP_ID 43362 37#define BRCM_CC_43362_CHIP_ID 43362
38#define BRCM_CC_4335_CHIP_ID 0x4335 38#define BRCM_CC_4335_CHIP_ID 0x4335
39#define BRCM_CC_4339_CHIP_ID 0x4339 39#define BRCM_CC_4339_CHIP_ID 0x4339
40#define BRCM_CC_43430_CHIP_ID 43430
41#define BRCM_CC_4345_CHIP_ID 0x4345
40#define BRCM_CC_4354_CHIP_ID 0x4354 42#define BRCM_CC_4354_CHIP_ID 0x4354
41#define BRCM_CC_4356_CHIP_ID 0x4356 43#define BRCM_CC_4356_CHIP_ID 0x4356
42#define BRCM_CC_43566_CHIP_ID 43566 44#define BRCM_CC_43566_CHIP_ID 43566
diff --git a/drivers/net/wireless/brcm80211/include/chipcommon.h b/drivers/net/wireless/brcm80211/include/chipcommon.h
index d242333b7559..e1fd499930a0 100644
--- a/drivers/net/wireless/brcm80211/include/chipcommon.h
+++ b/drivers/net/wireless/brcm80211/include/chipcommon.h
@@ -183,7 +183,14 @@ struct chipcregs {
183 u8 uart1lsr; 183 u8 uart1lsr;
184 u8 uart1msr; 184 u8 uart1msr;
185 u8 uart1scratch; 185 u8 uart1scratch;
186 u32 PAD[126]; 186 u32 PAD[62];
187
188 /* save/restore, corerev >= 48 */
189 u32 sr_capability; /* 0x500 */
190 u32 sr_control0; /* 0x504 */
191 u32 sr_control1; /* 0x508 */
192 u32 gpio_control; /* 0x50C */
193 u32 PAD[60];
187 194
188 /* PMU registers (corerev >= 20) */ 195 /* PMU registers (corerev >= 20) */
189 u32 pmucontrol; /* 0x600 */ 196 u32 pmucontrol; /* 0x600 */
diff --git a/drivers/net/wireless/cw1200/cw1200_spi.c b/drivers/net/wireless/cw1200/cw1200_spi.c
index 964b64ab7fe3..7603546d2de3 100644
--- a/drivers/net/wireless/cw1200/cw1200_spi.c
+++ b/drivers/net/wireless/cw1200/cw1200_spi.c
@@ -447,7 +447,7 @@ static int cw1200_spi_disconnect(struct spi_device *func)
447} 447}
448 448
449#ifdef CONFIG_PM 449#ifdef CONFIG_PM
450static int cw1200_spi_suspend(struct device *dev, pm_message_t state) 450static int cw1200_spi_suspend(struct device *dev)
451{ 451{
452 struct hwbus_priv *self = spi_get_drvdata(to_spi_device(dev)); 452 struct hwbus_priv *self = spi_get_drvdata(to_spi_device(dev));
453 453
@@ -458,10 +458,8 @@ static int cw1200_spi_suspend(struct device *dev, pm_message_t state)
458 return 0; 458 return 0;
459} 459}
460 460
461static int cw1200_spi_resume(struct device *dev) 461static SIMPLE_DEV_PM_OPS(cw1200_pm_ops, cw1200_spi_suspend, NULL);
462{ 462
463 return 0;
464}
465#endif 463#endif
466 464
467static struct spi_driver spi_driver = { 465static struct spi_driver spi_driver = {
@@ -472,8 +470,7 @@ static struct spi_driver spi_driver = {
472 .bus = &spi_bus_type, 470 .bus = &spi_bus_type,
473 .owner = THIS_MODULE, 471 .owner = THIS_MODULE,
474#ifdef CONFIG_PM 472#ifdef CONFIG_PM
475 .suspend = cw1200_spi_suspend, 473 .pm = &cw1200_pm_ops,
476 .resume = cw1200_spi_resume,
477#endif 474#endif
478 }, 475 },
479}; 476};
diff --git a/drivers/net/wireless/cw1200/sta.c b/drivers/net/wireless/cw1200/sta.c
index 4a47c7f8a246..b0f65fa09428 100644
--- a/drivers/net/wireless/cw1200/sta.c
+++ b/drivers/net/wireless/cw1200/sta.c
@@ -293,7 +293,7 @@ void cw1200_remove_interface(struct ieee80211_hw *dev,
293 } 293 }
294 priv->vif = NULL; 294 priv->vif = NULL;
295 priv->mode = NL80211_IFTYPE_MONITOR; 295 priv->mode = NL80211_IFTYPE_MONITOR;
296 memset(priv->mac_addr, 0, ETH_ALEN); 296 eth_zero_addr(priv->mac_addr);
297 memset(&priv->p2p_ps_modeinfo, 0, sizeof(priv->p2p_ps_modeinfo)); 297 memset(&priv->p2p_ps_modeinfo, 0, sizeof(priv->p2p_ps_modeinfo));
298 cw1200_free_keys(priv); 298 cw1200_free_keys(priv);
299 cw1200_setup_mac(priv); 299 cw1200_setup_mac(priv);
@@ -1240,8 +1240,8 @@ static void cw1200_do_join(struct cw1200_common *priv)
1240 1240
1241 bssid = priv->vif->bss_conf.bssid; 1241 bssid = priv->vif->bss_conf.bssid;
1242 1242
1243 bss = cfg80211_get_bss(priv->hw->wiphy, priv->channel, 1243 bss = cfg80211_get_bss(priv->hw->wiphy, priv->channel, bssid, NULL, 0,
1244 bssid, NULL, 0, 0, 0); 1244 IEEE80211_BSS_TYPE_ANY, IEEE80211_PRIVACY_ANY);
1245 1245
1246 if (!bss && !conf->ibss_joined) { 1246 if (!bss && !conf->ibss_joined) {
1247 wsm_unlock_tx(priv); 1247 wsm_unlock_tx(priv);
diff --git a/drivers/net/wireless/cw1200/txrx.c b/drivers/net/wireless/cw1200/txrx.c
index 0bd541175ecd..d28bd49cb5fd 100644
--- a/drivers/net/wireless/cw1200/txrx.c
+++ b/drivers/net/wireless/cw1200/txrx.c
@@ -1429,7 +1429,7 @@ void cw1200_link_id_gc_work(struct work_struct *work)
1429 priv->link_id_map &= ~mask; 1429 priv->link_id_map &= ~mask;
1430 priv->sta_asleep_mask &= ~mask; 1430 priv->sta_asleep_mask &= ~mask;
1431 priv->pspoll_mask &= ~mask; 1431 priv->pspoll_mask &= ~mask;
1432 memset(map_link.mac_addr, 0, ETH_ALEN); 1432 eth_zero_addr(map_link.mac_addr);
1433 spin_unlock_bh(&priv->ps_state_lock); 1433 spin_unlock_bh(&priv->ps_state_lock);
1434 reset.link_id = i + 1; 1434 reset.link_id = i + 1;
1435 wsm_reset(priv, &reset); 1435 wsm_reset(priv, &reset);
diff --git a/drivers/net/wireless/hostap/hostap_80211_tx.c b/drivers/net/wireless/hostap/hostap_80211_tx.c
index 8bde77689469..055e11d353ca 100644
--- a/drivers/net/wireless/hostap/hostap_80211_tx.c
+++ b/drivers/net/wireless/hostap/hostap_80211_tx.c
@@ -174,8 +174,8 @@ netdev_tx_t hostap_data_start_xmit(struct sk_buff *skb,
174 /* send broadcast and multicast frames to broadcast RA, if 174 /* send broadcast and multicast frames to broadcast RA, if
175 * configured; otherwise, use unicast RA of the WDS link */ 175 * configured; otherwise, use unicast RA of the WDS link */
176 if ((local->wds_type & HOSTAP_WDS_BROADCAST_RA) && 176 if ((local->wds_type & HOSTAP_WDS_BROADCAST_RA) &&
177 skb->data[0] & 0x01) 177 is_multicast_ether_addr(skb->data))
178 memset(&hdr.addr1, 0xff, ETH_ALEN); 178 eth_broadcast_addr(hdr.addr1);
179 else if (iface->type == HOSTAP_INTERFACE_WDS) 179 else if (iface->type == HOSTAP_INTERFACE_WDS)
180 memcpy(&hdr.addr1, iface->u.wds.remote_addr, 180 memcpy(&hdr.addr1, iface->u.wds.remote_addr,
181 ETH_ALEN); 181 ETH_ALEN);
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c
index fd8d83dd4f62..c995ace153ee 100644
--- a/drivers/net/wireless/hostap/hostap_ap.c
+++ b/drivers/net/wireless/hostap/hostap_ap.c
@@ -309,7 +309,7 @@ void hostap_deauth_all_stas(struct net_device *dev, struct ap_data *ap,
309 int i; 309 int i;
310 310
311 PDEBUG(DEBUG_AP, "%s: Deauthenticate all stations\n", dev->name); 311 PDEBUG(DEBUG_AP, "%s: Deauthenticate all stations\n", dev->name);
312 memset(addr, 0xff, ETH_ALEN); 312 eth_broadcast_addr(addr);
313 313
314 resp = cpu_to_le16(WLAN_REASON_PREV_AUTH_NOT_VALID); 314 resp = cpu_to_le16(WLAN_REASON_PREV_AUTH_NOT_VALID);
315 315
@@ -1015,8 +1015,8 @@ static void prism2_send_mgmt(struct net_device *dev,
1015 memcpy(hdr->addr3, dev->dev_addr, ETH_ALEN); /* SA */ 1015 memcpy(hdr->addr3, dev->dev_addr, ETH_ALEN); /* SA */
1016 } else if (ieee80211_is_ctl(hdr->frame_control)) { 1016 } else if (ieee80211_is_ctl(hdr->frame_control)) {
1017 /* control:ACK does not have addr2 or addr3 */ 1017 /* control:ACK does not have addr2 or addr3 */
1018 memset(hdr->addr2, 0, ETH_ALEN); 1018 eth_zero_addr(hdr->addr2);
1019 memset(hdr->addr3, 0, ETH_ALEN); 1019 eth_zero_addr(hdr->addr3);
1020 } else { 1020 } else {
1021 memcpy(hdr->addr2, dev->dev_addr, ETH_ALEN); /* SA */ 1021 memcpy(hdr->addr2, dev->dev_addr, ETH_ALEN); /* SA */
1022 memcpy(hdr->addr3, dev->dev_addr, ETH_ALEN); /* BSSID */ 1022 memcpy(hdr->addr3, dev->dev_addr, ETH_ALEN); /* BSSID */
@@ -1601,7 +1601,7 @@ static void handle_assoc(local_info_t *local, struct sk_buff *skb,
1601 memcpy(prev_ap, pos, ETH_ALEN); 1601 memcpy(prev_ap, pos, ETH_ALEN);
1602 pos++; pos++; pos++; left -= 6; 1602 pos++; pos++; pos++; left -= 6;
1603 } else 1603 } else
1604 memset(prev_ap, 0, ETH_ALEN); 1604 eth_zero_addr(prev_ap);
1605 1605
1606 if (left >= 2) { 1606 if (left >= 2) {
1607 unsigned int ileft; 1607 unsigned int ileft;
diff --git a/drivers/net/wireless/hostap/hostap_info.c b/drivers/net/wireless/hostap/hostap_info.c
index de7c4ffec309..7635ac4f6679 100644
--- a/drivers/net/wireless/hostap/hostap_info.c
+++ b/drivers/net/wireless/hostap/hostap_info.c
@@ -442,7 +442,7 @@ static void handle_info_queue_linkstatus(local_info_t *local)
442 } else { 442 } else {
443 netif_carrier_off(local->dev); 443 netif_carrier_off(local->dev);
444 netif_carrier_off(local->ddev); 444 netif_carrier_off(local->ddev);
445 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 445 eth_zero_addr(wrqu.ap_addr.sa_data);
446 } 446 }
447 wrqu.ap_addr.sa_family = ARPHRD_ETHER; 447 wrqu.ap_addr.sa_family = ARPHRD_ETHER;
448 448
diff --git a/drivers/net/wireless/hostap/hostap_main.c b/drivers/net/wireless/hostap/hostap_main.c
index 52919ad42726..01de1a3bf94e 100644
--- a/drivers/net/wireless/hostap/hostap_main.c
+++ b/drivers/net/wireless/hostap/hostap_main.c
@@ -224,7 +224,7 @@ int prism2_wds_del(local_info_t *local, u8 *remote_addr,
224 224
225 if (selected) { 225 if (selected) {
226 if (do_not_remove) 226 if (do_not_remove)
227 memset(selected->u.wds.remote_addr, 0, ETH_ALEN); 227 eth_zero_addr(selected->u.wds.remote_addr);
228 else { 228 else {
229 hostap_remove_interface(selected->dev, rtnl_locked, 0); 229 hostap_remove_interface(selected->dev, rtnl_locked, 0);
230 local->wds_connections--; 230 local->wds_connections--;
@@ -798,7 +798,6 @@ static void prism2_tx_timeout(struct net_device *dev)
798 798
799const struct header_ops hostap_80211_ops = { 799const struct header_ops hostap_80211_ops = {
800 .create = eth_header, 800 .create = eth_header,
801 .rebuild = eth_rebuild_header,
802 .cache = eth_header_cache, 801 .cache = eth_header_cache,
803 .cache_update = eth_header_cache_update, 802 .cache_update = eth_header_cache_update,
804 .parse = hostap_80211_header_parse, 803 .parse = hostap_80211_header_parse,
@@ -1088,7 +1087,7 @@ int prism2_sta_deauth(local_info_t *local, u16 reason)
1088 1087
1089 ret = prism2_sta_send_mgmt(local, local->bssid, IEEE80211_STYPE_DEAUTH, 1088 ret = prism2_sta_send_mgmt(local, local->bssid, IEEE80211_STYPE_DEAUTH,
1090 (u8 *) &val, 2); 1089 (u8 *) &val, 2);
1091 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 1090 eth_zero_addr(wrqu.ap_addr.sa_data);
1092 wireless_send_event(local->dev, SIOCGIWAP, &wrqu, NULL); 1091 wireless_send_event(local->dev, SIOCGIWAP, &wrqu, NULL);
1093 return ret; 1092 return ret;
1094} 1093}
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h
index 57904015380f..ca25283e1c92 100644
--- a/drivers/net/wireless/hostap/hostap_wlan.h
+++ b/drivers/net/wireless/hostap/hostap_wlan.h
@@ -4,6 +4,7 @@
4#include <linux/interrupt.h> 4#include <linux/interrupt.h>
5#include <linux/wireless.h> 5#include <linux/wireless.h>
6#include <linux/netdevice.h> 6#include <linux/netdevice.h>
7#include <linux/etherdevice.h>
7#include <linux/mutex.h> 8#include <linux/mutex.h>
8#include <net/iw_handler.h> 9#include <net/iw_handler.h>
9#include <net/ieee80211_radiotap.h> 10#include <net/ieee80211_radiotap.h>
@@ -85,16 +86,16 @@ struct hfa384x_rx_frame {
85 /* 802.11 */ 86 /* 802.11 */
86 __le16 frame_control; 87 __le16 frame_control;
87 __le16 duration_id; 88 __le16 duration_id;
88 u8 addr1[6]; 89 u8 addr1[ETH_ALEN];
89 u8 addr2[6]; 90 u8 addr2[ETH_ALEN];
90 u8 addr3[6]; 91 u8 addr3[ETH_ALEN];
91 __le16 seq_ctrl; 92 __le16 seq_ctrl;
92 u8 addr4[6]; 93 u8 addr4[ETH_ALEN];
93 __le16 data_len; 94 __le16 data_len;
94 95
95 /* 802.3 */ 96 /* 802.3 */
96 u8 dst_addr[6]; 97 u8 dst_addr[ETH_ALEN];
97 u8 src_addr[6]; 98 u8 src_addr[ETH_ALEN];
98 __be16 len; 99 __be16 len;
99 100
100 /* followed by frame data; max 2304 bytes */ 101 /* followed by frame data; max 2304 bytes */
@@ -114,16 +115,16 @@ struct hfa384x_tx_frame {
114 /* 802.11 */ 115 /* 802.11 */
115 __le16 frame_control; /* parts not used */ 116 __le16 frame_control; /* parts not used */
116 __le16 duration_id; 117 __le16 duration_id;
117 u8 addr1[6]; 118 u8 addr1[ETH_ALEN];
118 u8 addr2[6]; /* filled by firmware */ 119 u8 addr2[ETH_ALEN]; /* filled by firmware */
119 u8 addr3[6]; 120 u8 addr3[ETH_ALEN];
120 __le16 seq_ctrl; /* filled by firmware */ 121 __le16 seq_ctrl; /* filled by firmware */
121 u8 addr4[6]; 122 u8 addr4[ETH_ALEN];
122 __le16 data_len; 123 __le16 data_len;
123 124
124 /* 802.3 */ 125 /* 802.3 */
125 u8 dst_addr[6]; 126 u8 dst_addr[ETH_ALEN];
126 u8 src_addr[6]; 127 u8 src_addr[ETH_ALEN];
127 __be16 len; 128 __be16 len;
128 129
129 /* followed by frame data; max 2304 bytes */ 130 /* followed by frame data; max 2304 bytes */
@@ -156,7 +157,7 @@ struct hfa384x_hostscan_request {
156} __packed; 157} __packed;
157 158
158struct hfa384x_join_request { 159struct hfa384x_join_request {
159 u8 bssid[6]; 160 u8 bssid[ETH_ALEN];
160 __le16 channel; 161 __le16 channel;
161} __packed; 162} __packed;
162 163
@@ -228,7 +229,7 @@ struct hfa384x_scan_result {
228 __le16 chid; 229 __le16 chid;
229 __le16 anl; 230 __le16 anl;
230 __le16 sl; 231 __le16 sl;
231 u8 bssid[6]; 232 u8 bssid[ETH_ALEN];
232 __le16 beacon_interval; 233 __le16 beacon_interval;
233 __le16 capability; 234 __le16 capability;
234 __le16 ssid_len; 235 __le16 ssid_len;
@@ -241,7 +242,7 @@ struct hfa384x_hostscan_result {
241 __le16 chid; 242 __le16 chid;
242 __le16 anl; 243 __le16 anl;
243 __le16 sl; 244 __le16 sl;
244 u8 bssid[6]; 245 u8 bssid[ETH_ALEN];
245 __le16 beacon_interval; 246 __le16 beacon_interval;
246 __le16 capability; 247 __le16 capability;
247 __le16 ssid_len; 248 __le16 ssid_len;
@@ -824,7 +825,7 @@ struct local_info {
824#define PRISM2_INFO_PENDING_SCANRESULTS 1 825#define PRISM2_INFO_PENDING_SCANRESULTS 1
825 int prev_link_status; /* previous received LinkStatus info */ 826 int prev_link_status; /* previous received LinkStatus info */
826 int prev_linkstatus_connected; 827 int prev_linkstatus_connected;
827 u8 preferred_ap[6]; /* use this AP if possible */ 828 u8 preferred_ap[ETH_ALEN]; /* use this AP if possible */
828 829
829#ifdef PRISM2_CALLBACK 830#ifdef PRISM2_CALLBACK
830 void *callback_data; /* Can be used in callbacks; e.g., allocate 831 void *callback_data; /* Can be used in callbacks; e.g., allocate
diff --git a/drivers/net/wireless/ipw2x00/Kconfig b/drivers/net/wireless/ipw2x00/Kconfig
index 21de4fe6cf2d..d6ec44d7a391 100644
--- a/drivers/net/wireless/ipw2x00/Kconfig
+++ b/drivers/net/wireless/ipw2x00/Kconfig
@@ -66,7 +66,7 @@ config IPW2100_DEBUG
66config IPW2200 66config IPW2200
67 tristate "Intel PRO/Wireless 2200BG and 2915ABG Network Connection" 67 tristate "Intel PRO/Wireless 2200BG and 2915ABG Network Connection"
68 depends on PCI && CFG80211 68 depends on PCI && CFG80211
69 select CFG80211_WEXT 69 select CFG80211_WEXT_EXPORT
70 select WIRELESS_EXT 70 select WIRELESS_EXT
71 select WEXT_SPY 71 select WEXT_SPY
72 select WEXT_PRIV 72 select WEXT_PRIV
diff --git a/drivers/net/wireless/ipw2x00/ipw2100.c b/drivers/net/wireless/ipw2x00/ipw2100.c
index 6fabea0309dd..08eb229e7816 100644
--- a/drivers/net/wireless/ipw2x00/ipw2100.c
+++ b/drivers/net/wireless/ipw2x00/ipw2100.c
@@ -2147,8 +2147,8 @@ static void isr_indicate_association_lost(struct ipw2100_priv *priv, u32 status)
2147 return; 2147 return;
2148 } 2148 }
2149 2149
2150 memset(priv->bssid, 0, ETH_ALEN); 2150 eth_zero_addr(priv->bssid);
2151 memset(priv->ieee->bssid, 0, ETH_ALEN); 2151 eth_zero_addr(priv->ieee->bssid);
2152 2152
2153 netif_carrier_off(priv->net_dev); 2153 netif_carrier_off(priv->net_dev);
2154 netif_stop_queue(priv->net_dev); 2154 netif_stop_queue(priv->net_dev);
@@ -6956,7 +6956,7 @@ static int ipw2100_wx_get_wap(struct net_device *dev,
6956 wrqu->ap_addr.sa_family = ARPHRD_ETHER; 6956 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
6957 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); 6957 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
6958 } else 6958 } else
6959 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); 6959 eth_zero_addr(wrqu->ap_addr.sa_data);
6960 6960
6961 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data); 6961 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", wrqu->ap_addr.sa_data);
6962 return 0; 6962 return 0;
@@ -8300,7 +8300,7 @@ static void ipw2100_wx_event_work(struct work_struct *work)
8300 priv->status & STATUS_RF_KILL_MASK || 8300 priv->status & STATUS_RF_KILL_MASK ||
8301 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID, 8301 ipw2100_get_ordinal(priv, IPW_ORD_STAT_ASSN_AP_BSSID,
8302 &priv->bssid, &len)) { 8302 &priv->bssid, &len)) {
8303 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 8303 eth_zero_addr(wrqu.ap_addr.sa_data);
8304 } else { 8304 } else {
8305 /* We now have the BSSID, so can finish setting to the full 8305 /* We now have the BSSID, so can finish setting to the full
8306 * associated state */ 8306 * associated state */
diff --git a/drivers/net/wireless/ipw2x00/ipw2200.c b/drivers/net/wireless/ipw2x00/ipw2200.c
index 67cad9b05ad8..39f3e6f5cbcd 100644
--- a/drivers/net/wireless/ipw2x00/ipw2200.c
+++ b/drivers/net/wireless/ipw2x00/ipw2200.c
@@ -1964,7 +1964,7 @@ static void notify_wx_assoc_event(struct ipw_priv *priv)
1964 if (priv->status & STATUS_ASSOCIATED) 1964 if (priv->status & STATUS_ASSOCIATED)
1965 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN); 1965 memcpy(wrqu.ap_addr.sa_data, priv->bssid, ETH_ALEN);
1966 else 1966 else
1967 memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN); 1967 eth_zero_addr(wrqu.ap_addr.sa_data);
1968 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL); 1968 wireless_send_event(priv->net_dev, SIOCGIWAP, &wrqu, NULL);
1969} 1969}
1970 1970
@@ -7400,7 +7400,7 @@ static int ipw_associate_network(struct ipw_priv *priv,
7400 memcpy(priv->assoc_request.bssid, network->bssid, ETH_ALEN); 7400 memcpy(priv->assoc_request.bssid, network->bssid, ETH_ALEN);
7401 7401
7402 if (priv->ieee->iw_mode == IW_MODE_ADHOC) { 7402 if (priv->ieee->iw_mode == IW_MODE_ADHOC) {
7403 memset(&priv->assoc_request.dest, 0xFF, ETH_ALEN); 7403 eth_broadcast_addr(priv->assoc_request.dest);
7404 priv->assoc_request.atim_window = cpu_to_le16(network->atim_window); 7404 priv->assoc_request.atim_window = cpu_to_le16(network->atim_window);
7405 } else { 7405 } else {
7406 memcpy(priv->assoc_request.dest, network->bssid, ETH_ALEN); 7406 memcpy(priv->assoc_request.dest, network->bssid, ETH_ALEN);
@@ -8986,7 +8986,7 @@ static int ipw_wx_get_wap(struct net_device *dev,
8986 wrqu->ap_addr.sa_family = ARPHRD_ETHER; 8986 wrqu->ap_addr.sa_family = ARPHRD_ETHER;
8987 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN); 8987 memcpy(wrqu->ap_addr.sa_data, priv->bssid, ETH_ALEN);
8988 } else 8988 } else
8989 memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN); 8989 eth_zero_addr(wrqu->ap_addr.sa_data);
8990 8990
8991 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n", 8991 IPW_DEBUG_WX("Getting WAP BSSID: %pM\n",
8992 wrqu->ap_addr.sa_data); 8992 wrqu->ap_addr.sa_data);
diff --git a/drivers/net/wireless/iwlegacy/4965-rs.c b/drivers/net/wireless/iwlegacy/4965-rs.c
index eaaeea19d8c5..bac60b2bc3f0 100644
--- a/drivers/net/wireless/iwlegacy/4965-rs.c
+++ b/drivers/net/wireless/iwlegacy/4965-rs.c
@@ -1678,7 +1678,7 @@ il4965_rs_stay_in_table(struct il_lq_sta *lq_sta, bool force_search)
1678 lq_sta->total_success > lq_sta->max_success_limit || 1678 lq_sta->total_success > lq_sta->max_success_limit ||
1679 (!lq_sta->search_better_tbl && lq_sta->flush_timer && 1679 (!lq_sta->search_better_tbl && lq_sta->flush_timer &&
1680 flush_interval_passed)) { 1680 flush_interval_passed)) {
1681 D_RATE("LQ: stay is expired %d %d %d\n:", 1681 D_RATE("LQ: stay is expired %d %d %d\n",
1682 lq_sta->total_failed, lq_sta->total_success, 1682 lq_sta->total_failed, lq_sta->total_success,
1683 flush_interval_passed); 1683 flush_interval_passed);
1684 1684
diff --git a/drivers/net/wireless/iwlegacy/common.c b/drivers/net/wireless/iwlegacy/common.c
index 2c4fa49686ef..887114582583 100644
--- a/drivers/net/wireless/iwlegacy/common.c
+++ b/drivers/net/wireless/iwlegacy/common.c
@@ -4634,7 +4634,7 @@ il_mac_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
4634 il->vif = NULL; 4634 il->vif = NULL;
4635 il->iw_mode = NL80211_IFTYPE_UNSPECIFIED; 4635 il->iw_mode = NL80211_IFTYPE_UNSPECIFIED;
4636 il_teardown_interface(il, vif); 4636 il_teardown_interface(il, vif);
4637 memset(il->bssid, 0, ETH_ALEN); 4637 eth_zero_addr(il->bssid);
4638 4638
4639 D_MAC80211("leave\n"); 4639 D_MAC80211("leave\n");
4640 mutex_unlock(&il->mutex); 4640 mutex_unlock(&il->mutex);
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
index cceb026e0793..5abd62ed8cb4 100644
--- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c
@@ -1130,20 +1130,23 @@ done:
1130 IWL_DEBUG_MAC80211(priv, "leave\n"); 1130 IWL_DEBUG_MAC80211(priv, "leave\n");
1131} 1131}
1132 1132
1133static void iwlagn_mac_rssi_callback(struct ieee80211_hw *hw, 1133static void iwlagn_mac_event_callback(struct ieee80211_hw *hw,
1134 struct ieee80211_vif *vif, 1134 struct ieee80211_vif *vif,
1135 enum ieee80211_rssi_event rssi_event) 1135 const struct ieee80211_event *event)
1136{ 1136{
1137 struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw); 1137 struct iwl_priv *priv = IWL_MAC80211_GET_DVM(hw);
1138 1138
1139 if (event->type != RSSI_EVENT)
1140 return;
1141
1139 IWL_DEBUG_MAC80211(priv, "enter\n"); 1142 IWL_DEBUG_MAC80211(priv, "enter\n");
1140 mutex_lock(&priv->mutex); 1143 mutex_lock(&priv->mutex);
1141 1144
1142 if (priv->lib->bt_params && 1145 if (priv->lib->bt_params &&
1143 priv->lib->bt_params->advanced_bt_coexist) { 1146 priv->lib->bt_params->advanced_bt_coexist) {
1144 if (rssi_event == RSSI_EVENT_LOW) 1147 if (event->u.rssi.data == RSSI_EVENT_LOW)
1145 priv->bt_enable_pspoll = true; 1148 priv->bt_enable_pspoll = true;
1146 else if (rssi_event == RSSI_EVENT_HIGH) 1149 else if (event->u.rssi.data == RSSI_EVENT_HIGH)
1147 priv->bt_enable_pspoll = false; 1150 priv->bt_enable_pspoll = false;
1148 1151
1149 iwlagn_send_advance_bt_config(priv); 1152 iwlagn_send_advance_bt_config(priv);
@@ -1614,7 +1617,7 @@ const struct ieee80211_ops iwlagn_hw_ops = {
1614 .channel_switch = iwlagn_mac_channel_switch, 1617 .channel_switch = iwlagn_mac_channel_switch,
1615 .flush = iwlagn_mac_flush, 1618 .flush = iwlagn_mac_flush,
1616 .tx_last_beacon = iwlagn_mac_tx_last_beacon, 1619 .tx_last_beacon = iwlagn_mac_tx_last_beacon,
1617 .rssi_callback = iwlagn_mac_rssi_callback, 1620 .event_callback = iwlagn_mac_event_callback,
1618 .set_tim = iwlagn_mac_set_tim, 1621 .set_tim = iwlagn_mac_set_tim,
1619}; 1622};
1620 1623
diff --git a/drivers/net/wireless/iwlwifi/dvm/main.c b/drivers/net/wireless/iwlwifi/dvm/main.c
index c4d6dd7402d9..234e30f498b2 100644
--- a/drivers/net/wireless/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/iwlwifi/dvm/main.c
@@ -1549,7 +1549,7 @@ static void iwl_dump_nic_error_log(struct iwl_priv *priv)
1549 table.blink1, table.blink2, table.ilink1, 1549 table.blink1, table.blink2, table.ilink1,
1550 table.ilink2, table.bcon_time, table.gp1, 1550 table.ilink2, table.bcon_time, table.gp1,
1551 table.gp2, table.gp3, table.ucode_ver, 1551 table.gp2, table.gp3, table.ucode_ver,
1552 table.hw_ver, table.brd_ver); 1552 table.hw_ver, 0, table.brd_ver);
1553 IWL_ERR(priv, "0x%08X | %-28s\n", table.error_id, 1553 IWL_ERR(priv, "0x%08X | %-28s\n", table.error_id,
1554 desc_lookup(table.error_id)); 1554 desc_lookup(table.error_id));
1555 IWL_ERR(priv, "0x%08X | uPc\n", table.pc); 1555 IWL_ERR(priv, "0x%08X | uPc\n", table.pc);
diff --git a/drivers/net/wireless/iwlwifi/dvm/rs.c b/drivers/net/wireless/iwlwifi/dvm/rs.c
index 32b78a66536d..3bd7c86e90d9 100644
--- a/drivers/net/wireless/iwlwifi/dvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/dvm/rs.c
@@ -3153,12 +3153,13 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
3153 desc += sprintf(buff+desc, "lq type %s\n", 3153 desc += sprintf(buff+desc, "lq type %s\n",
3154 (is_legacy(tbl->lq_type)) ? "legacy" : "HT"); 3154 (is_legacy(tbl->lq_type)) ? "legacy" : "HT");
3155 if (is_Ht(tbl->lq_type)) { 3155 if (is_Ht(tbl->lq_type)) {
3156 desc += sprintf(buff+desc, " %s", 3156 desc += sprintf(buff + desc, " %s",
3157 (is_siso(tbl->lq_type)) ? "SISO" : 3157 (is_siso(tbl->lq_type)) ? "SISO" :
3158 ((is_mimo2(tbl->lq_type)) ? "MIMO2" : "MIMO3")); 3158 ((is_mimo2(tbl->lq_type)) ? "MIMO2" : "MIMO3"));
3159 desc += sprintf(buff+desc, " %s", 3159 desc += sprintf(buff + desc, " %s",
3160 (tbl->is_ht40) ? "40MHz" : "20MHz"); 3160 (tbl->is_ht40) ? "40MHz" : "20MHz");
3161 desc += sprintf(buff+desc, " %s %s %s\n", (tbl->is_SGI) ? "SGI" : "", 3161 desc += sprintf(buff + desc, " %s %s %s\n",
3162 (tbl->is_SGI) ? "SGI" : "",
3162 (lq_sta->is_green) ? "GF enabled" : "", 3163 (lq_sta->is_green) ? "GF enabled" : "",
3163 (lq_sta->is_agg) ? "AGG on" : ""); 3164 (lq_sta->is_agg) ? "AGG on" : "");
3164 } 3165 }
diff --git a/drivers/net/wireless/iwlwifi/dvm/tx.c b/drivers/net/wireless/iwlwifi/dvm/tx.c
index 1e40a12de077..275df12a6045 100644
--- a/drivers/net/wireless/iwlwifi/dvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/dvm/tx.c
@@ -189,9 +189,9 @@ static void iwlagn_tx_cmd_build_rate(struct iwl_priv *priv,
189 rate_flags |= RATE_MCS_CCK_MSK; 189 rate_flags |= RATE_MCS_CCK_MSK;
190 190
191 /* Set up antennas */ 191 /* Set up antennas */
192 if (priv->lib->bt_params && 192 if (priv->lib->bt_params &&
193 priv->lib->bt_params->advanced_bt_coexist && 193 priv->lib->bt_params->advanced_bt_coexist &&
194 priv->bt_full_concurrent) { 194 priv->bt_full_concurrent) {
195 /* operated as 1x1 in full concurrency mode */ 195 /* operated as 1x1 in full concurrency mode */
196 priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant, 196 priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant,
197 first_antenna(priv->nvm_data->valid_tx_ant)); 197 first_antenna(priv->nvm_data->valid_tx_ant));
diff --git a/drivers/net/wireless/iwlwifi/iwl-7000.c b/drivers/net/wireless/iwlwifi/iwl-7000.c
index 97e38d2e2983..36e786f0387b 100644
--- a/drivers/net/wireless/iwlwifi/iwl-7000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-7000.c
@@ -69,16 +69,16 @@
69#include "iwl-agn-hw.h" 69#include "iwl-agn-hw.h"
70 70
71/* Highest firmware API version supported */ 71/* Highest firmware API version supported */
72#define IWL7260_UCODE_API_MAX 12 72#define IWL7260_UCODE_API_MAX 13
73#define IWL3160_UCODE_API_MAX 12 73#define IWL3160_UCODE_API_MAX 13
74 74
75/* Oldest version we won't warn about */ 75/* Oldest version we won't warn about */
76#define IWL7260_UCODE_API_OK 10 76#define IWL7260_UCODE_API_OK 12
77#define IWL3160_UCODE_API_OK 10 77#define IWL3160_UCODE_API_OK 12
78 78
79/* Lowest firmware API version supported */ 79/* Lowest firmware API version supported */
80#define IWL7260_UCODE_API_MIN 9 80#define IWL7260_UCODE_API_MIN 10
81#define IWL3160_UCODE_API_MIN 9 81#define IWL3160_UCODE_API_MIN 10
82 82
83/* NVM versions */ 83/* NVM versions */
84#define IWL7260_NVM_VERSION 0x0a1d 84#define IWL7260_NVM_VERSION 0x0a1d
diff --git a/drivers/net/wireless/iwlwifi/iwl-8000.c b/drivers/net/wireless/iwlwifi/iwl-8000.c
index 2f7fe8167dc9..ce6321b7d241 100644
--- a/drivers/net/wireless/iwlwifi/iwl-8000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-8000.c
@@ -69,13 +69,13 @@
69#include "iwl-agn-hw.h" 69#include "iwl-agn-hw.h"
70 70
71/* Highest firmware API version supported */ 71/* Highest firmware API version supported */
72#define IWL8000_UCODE_API_MAX 12 72#define IWL8000_UCODE_API_MAX 13
73 73
74/* Oldest version we won't warn about */ 74/* Oldest version we won't warn about */
75#define IWL8000_UCODE_API_OK 10 75#define IWL8000_UCODE_API_OK 12
76 76
77/* Lowest firmware API version supported */ 77/* Lowest firmware API version supported */
78#define IWL8000_UCODE_API_MIN 9 78#define IWL8000_UCODE_API_MIN 10
79 79
80/* NVM versions */ 80/* NVM versions */
81#define IWL8000_NVM_VERSION 0x0a1d 81#define IWL8000_NVM_VERSION 0x0a1d
@@ -94,8 +94,8 @@
94 IWL8000_FW_PRE "-" __stringify(api) ".ucode" 94 IWL8000_FW_PRE "-" __stringify(api) ".ucode"
95 95
96#define NVM_HW_SECTION_NUM_FAMILY_8000 10 96#define NVM_HW_SECTION_NUM_FAMILY_8000 10
97#define DEFAULT_NVM_FILE_FAMILY_8000A "iwl_nvm_8000.bin" 97#define DEFAULT_NVM_FILE_FAMILY_8000B "nvmData-8000B"
98#define DEFAULT_NVM_FILE_FAMILY_8000 "iwl_nvm_8000B.bin" 98#define DEFAULT_NVM_FILE_FAMILY_8000C "nvmData-8000C"
99 99
100/* Max SDIO RX aggregation size of the ADDBA request/response */ 100/* Max SDIO RX aggregation size of the ADDBA request/response */
101#define MAX_RX_AGG_SIZE_8260_SDIO 28 101#define MAX_RX_AGG_SIZE_8260_SDIO 28
@@ -177,8 +177,8 @@ const struct iwl_cfg iwl8260_2ac_sdio_cfg = {
177 .ht_params = &iwl8000_ht_params, 177 .ht_params = &iwl8000_ht_params,
178 .nvm_ver = IWL8000_NVM_VERSION, 178 .nvm_ver = IWL8000_NVM_VERSION,
179 .nvm_calib_ver = IWL8000_TX_POWER_VERSION, 179 .nvm_calib_ver = IWL8000_TX_POWER_VERSION,
180 .default_nvm_file = DEFAULT_NVM_FILE_FAMILY_8000, 180 .default_nvm_file_B_step = DEFAULT_NVM_FILE_FAMILY_8000B,
181 .default_nvm_file_8000A = DEFAULT_NVM_FILE_FAMILY_8000A, 181 .default_nvm_file_C_step = DEFAULT_NVM_FILE_FAMILY_8000C,
182 .max_rx_agg_size = MAX_RX_AGG_SIZE_8260_SDIO, 182 .max_rx_agg_size = MAX_RX_AGG_SIZE_8260_SDIO,
183 .disable_dummy_notification = true, 183 .disable_dummy_notification = true,
184 .max_ht_ampdu_exponent = MAX_HT_AMPDU_EXPONENT_8260_SDIO, 184 .max_ht_ampdu_exponent = MAX_HT_AMPDU_EXPONENT_8260_SDIO,
@@ -192,8 +192,8 @@ const struct iwl_cfg iwl4165_2ac_sdio_cfg = {
192 .ht_params = &iwl8000_ht_params, 192 .ht_params = &iwl8000_ht_params,
193 .nvm_ver = IWL8000_NVM_VERSION, 193 .nvm_ver = IWL8000_NVM_VERSION,
194 .nvm_calib_ver = IWL8000_TX_POWER_VERSION, 194 .nvm_calib_ver = IWL8000_TX_POWER_VERSION,
195 .default_nvm_file = DEFAULT_NVM_FILE_FAMILY_8000, 195 .default_nvm_file_B_step = DEFAULT_NVM_FILE_FAMILY_8000B,
196 .default_nvm_file_8000A = DEFAULT_NVM_FILE_FAMILY_8000A, 196 .default_nvm_file_C_step = DEFAULT_NVM_FILE_FAMILY_8000C,
197 .max_rx_agg_size = MAX_RX_AGG_SIZE_8260_SDIO, 197 .max_rx_agg_size = MAX_RX_AGG_SIZE_8260_SDIO,
198 .bt_shared_single_ant = true, 198 .bt_shared_single_ant = true,
199 .disable_dummy_notification = true, 199 .disable_dummy_notification = true,
diff --git a/drivers/net/wireless/iwlwifi/iwl-config.h b/drivers/net/wireless/iwlwifi/iwl-config.h
index 4b190d98a1ec..3f33f753ce2f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-config.h
+++ b/drivers/net/wireless/iwlwifi/iwl-config.h
@@ -92,9 +92,9 @@ static inline bool iwl_has_secure_boot(u32 hw_rev,
92{ 92{
93 /* return 1 only for family 8000 B0 */ 93 /* return 1 only for family 8000 B0 */
94 if ((family == IWL_DEVICE_FAMILY_8000) && (hw_rev & 0xC)) 94 if ((family == IWL_DEVICE_FAMILY_8000) && (hw_rev & 0xC))
95 return 1; 95 return true;
96 96
97 return 0; 97 return false;
98} 98}
99 99
100/* 100/*
@@ -228,7 +228,7 @@ struct iwl_pwr_tx_backoff {
228 228
229/** 229/**
230 * struct iwl_cfg 230 * struct iwl_cfg
231 * @name: Offical name of the device 231 * @name: Official name of the device
232 * @fw_name_pre: Firmware filename prefix. The api version and extension 232 * @fw_name_pre: Firmware filename prefix. The api version and extension
233 * (.ucode) will be added to filename before loading from disk. The 233 * (.ucode) will be added to filename before loading from disk. The
234 * filename is constructed as fw_name_pre<api>.ucode. 234 * filename is constructed as fw_name_pre<api>.ucode.
@@ -303,8 +303,8 @@ struct iwl_cfg {
303 bool lp_xtal_workaround; 303 bool lp_xtal_workaround;
304 const struct iwl_pwr_tx_backoff *pwr_tx_backoffs; 304 const struct iwl_pwr_tx_backoff *pwr_tx_backoffs;
305 bool no_power_up_nic_in_init; 305 bool no_power_up_nic_in_init;
306 const char *default_nvm_file; 306 const char *default_nvm_file_B_step;
307 const char *default_nvm_file_8000A; 307 const char *default_nvm_file_C_step;
308 unsigned int max_rx_agg_size; 308 unsigned int max_rx_agg_size;
309 bool disable_dummy_notification; 309 bool disable_dummy_notification;
310 unsigned int max_tx_agg_size; 310 unsigned int max_tx_agg_size;
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-debug.h
index 684254553558..9bb36d79c2bd 100644
--- a/drivers/net/wireless/iwlwifi/iwl-debug.h
+++ b/drivers/net/wireless/iwlwifi/iwl-debug.h
@@ -157,6 +157,7 @@ do { \
157/* 0x0000F000 - 0x00001000 */ 157/* 0x0000F000 - 0x00001000 */
158#define IWL_DL_ASSOC 0x00001000 158#define IWL_DL_ASSOC 0x00001000
159#define IWL_DL_DROP 0x00002000 159#define IWL_DL_DROP 0x00002000
160#define IWL_DL_LAR 0x00004000
160#define IWL_DL_COEX 0x00008000 161#define IWL_DL_COEX 0x00008000
161/* 0x000F0000 - 0x00010000 */ 162/* 0x000F0000 - 0x00010000 */
162#define IWL_DL_FW 0x00010000 163#define IWL_DL_FW 0x00010000
@@ -219,5 +220,6 @@ do { \
219#define IWL_DEBUG_POWER(p, f, a...) IWL_DEBUG(p, IWL_DL_POWER, f, ## a) 220#define IWL_DEBUG_POWER(p, f, a...) IWL_DEBUG(p, IWL_DL_POWER, f, ## a)
220#define IWL_DEBUG_11H(p, f, a...) IWL_DEBUG(p, IWL_DL_11H, f, ## a) 221#define IWL_DEBUG_11H(p, f, a...) IWL_DEBUG(p, IWL_DL_11H, f, ## a)
221#define IWL_DEBUG_RPM(p, f, a...) IWL_DEBUG(p, IWL_DL_RPM, f, ## a) 222#define IWL_DEBUG_RPM(p, f, a...) IWL_DEBUG(p, IWL_DL_RPM, f, ## a)
223#define IWL_DEBUG_LAR(p, f, a...) IWL_DEBUG(p, IWL_DL_LAR, f, ## a)
222 224
223#endif 225#endif
diff --git a/drivers/net/wireless/iwlwifi/iwl-devtrace-iwlwifi.h b/drivers/net/wireless/iwlwifi/iwl-devtrace-iwlwifi.h
index 6cb66a988271..223b8752f924 100644
--- a/drivers/net/wireless/iwlwifi/iwl-devtrace-iwlwifi.h
+++ b/drivers/net/wireless/iwlwifi/iwl-devtrace-iwlwifi.h
@@ -116,11 +116,11 @@ TRACE_EVENT(iwlwifi_dev_ucode_error,
116 TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low, 116 TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low,
117 u32 data1, u32 data2, u32 line, u32 blink1, 117 u32 data1, u32 data2, u32 line, u32 blink1,
118 u32 blink2, u32 ilink1, u32 ilink2, u32 bcon_time, 118 u32 blink2, u32 ilink1, u32 ilink2, u32 bcon_time,
119 u32 gp1, u32 gp2, u32 gp3, u32 ucode_ver, u32 hw_ver, 119 u32 gp1, u32 gp2, u32 gp3, u32 major, u32 minor, u32 hw_ver,
120 u32 brd_ver), 120 u32 brd_ver),
121 TP_ARGS(dev, desc, tsf_low, data1, data2, line, 121 TP_ARGS(dev, desc, tsf_low, data1, data2, line,
122 blink1, blink2, ilink1, ilink2, bcon_time, gp1, gp2, 122 blink1, blink2, ilink1, ilink2, bcon_time, gp1, gp2,
123 gp3, ucode_ver, hw_ver, brd_ver), 123 gp3, major, minor, hw_ver, brd_ver),
124 TP_STRUCT__entry( 124 TP_STRUCT__entry(
125 DEV_ENTRY 125 DEV_ENTRY
126 __field(u32, desc) 126 __field(u32, desc)
@@ -136,7 +136,8 @@ TRACE_EVENT(iwlwifi_dev_ucode_error,
136 __field(u32, gp1) 136 __field(u32, gp1)
137 __field(u32, gp2) 137 __field(u32, gp2)
138 __field(u32, gp3) 138 __field(u32, gp3)
139 __field(u32, ucode_ver) 139 __field(u32, major)
140 __field(u32, minor)
140 __field(u32, hw_ver) 141 __field(u32, hw_ver)
141 __field(u32, brd_ver) 142 __field(u32, brd_ver)
142 ), 143 ),
@@ -155,21 +156,22 @@ TRACE_EVENT(iwlwifi_dev_ucode_error,
155 __entry->gp1 = gp1; 156 __entry->gp1 = gp1;
156 __entry->gp2 = gp2; 157 __entry->gp2 = gp2;
157 __entry->gp3 = gp3; 158 __entry->gp3 = gp3;
158 __entry->ucode_ver = ucode_ver; 159 __entry->major = major;
160 __entry->minor = minor;
159 __entry->hw_ver = hw_ver; 161 __entry->hw_ver = hw_ver;
160 __entry->brd_ver = brd_ver; 162 __entry->brd_ver = brd_ver;
161 ), 163 ),
162 TP_printk("[%s] #%02d %010u data 0x%08X 0x%08X line %u, " 164 TP_printk("[%s] #%02d %010u data 0x%08X 0x%08X line %u, "
163 "blink 0x%05X 0x%05X ilink 0x%05X 0x%05X " 165 "blink 0x%05X 0x%05X ilink 0x%05X 0x%05X "
164 "bcon_tm %010u gp 0x%08X 0x%08X 0x%08X uCode 0x%08X " 166 "bcon_tm %010u gp 0x%08X 0x%08X 0x%08X major 0x%08X "
165 "hw 0x%08X brd 0x%08X", 167 "minor 0x%08X hw 0x%08X brd 0x%08X",
166 __get_str(dev), __entry->desc, __entry->tsf_low, 168 __get_str(dev), __entry->desc, __entry->tsf_low,
167 __entry->data1, 169 __entry->data1,
168 __entry->data2, __entry->line, __entry->blink1, 170 __entry->data2, __entry->line, __entry->blink1,
169 __entry->blink2, __entry->ilink1, __entry->ilink2, 171 __entry->blink2, __entry->ilink1, __entry->ilink2,
170 __entry->bcon_time, __entry->gp1, __entry->gp2, 172 __entry->bcon_time, __entry->gp1, __entry->gp2,
171 __entry->gp3, __entry->ucode_ver, __entry->hw_ver, 173 __entry->gp3, __entry->major, __entry->minor,
172 __entry->brd_ver) 174 __entry->hw_ver, __entry->brd_ver)
173); 175);
174 176
175TRACE_EVENT(iwlwifi_dev_ucode_event, 177TRACE_EVENT(iwlwifi_dev_ucode_event,
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c
index c7154ac42c8c..7267152e7dc7 100644
--- a/drivers/net/wireless/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/iwlwifi/iwl-drv.c
@@ -145,7 +145,7 @@ static struct iwlwifi_opmode_table {
145#define IWL_DEFAULT_SCAN_CHANNELS 40 145#define IWL_DEFAULT_SCAN_CHANNELS 40
146 146
147/* 147/*
148 * struct fw_sec: Just for the image parsing proccess. 148 * struct fw_sec: Just for the image parsing process.
149 * For the fw storage we are using struct fw_desc. 149 * For the fw storage we are using struct fw_desc.
150 */ 150 */
151struct fw_sec { 151struct fw_sec {
@@ -175,6 +175,8 @@ static void iwl_dealloc_ucode(struct iwl_drv *drv)
175 kfree(drv->fw.dbg_dest_tlv); 175 kfree(drv->fw.dbg_dest_tlv);
176 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_conf_tlv); i++) 176 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_conf_tlv); i++)
177 kfree(drv->fw.dbg_conf_tlv[i]); 177 kfree(drv->fw.dbg_conf_tlv[i]);
178 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_trigger_tlv); i++)
179 kfree(drv->fw.dbg_trigger_tlv[i]);
178 180
179 for (i = 0; i < IWL_UCODE_TYPE_MAX; i++) 181 for (i = 0; i < IWL_UCODE_TYPE_MAX; i++)
180 iwl_free_fw_img(drv, drv->fw.img + i); 182 iwl_free_fw_img(drv, drv->fw.img + i);
@@ -239,16 +241,10 @@ static int iwl_request_firmware(struct iwl_drv *drv, bool first)
239 * previous name and uses the new format. 241 * previous name and uses the new format.
240 */ 242 */
241 if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) { 243 if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) {
242 char rev_step[2] = { 244 char rev_step = 'A' + CSR_HW_REV_STEP(drv->trans->hw_rev);
243 'A' + CSR_HW_REV_STEP(drv->trans->hw_rev), 0
244 };
245
246 /* A-step doesn't have an indication */
247 if (CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_A_STEP)
248 rev_step[0] = 0;
249 245
250 snprintf(drv->firmware_name, sizeof(drv->firmware_name), 246 snprintf(drv->firmware_name, sizeof(drv->firmware_name),
251 "%s%s-%s.ucode", name_pre, rev_step, tag); 247 "%s%c-%s.ucode", name_pre, rev_step, tag);
252 } 248 }
253 249
254 IWL_DEBUG_INFO(drv, "attempting to load firmware %s'%s'\n", 250 IWL_DEBUG_INFO(drv, "attempting to load firmware %s'%s'\n",
@@ -293,8 +289,10 @@ struct iwl_firmware_pieces {
293 289
294 /* FW debug data parsed for driver usage */ 290 /* FW debug data parsed for driver usage */
295 struct iwl_fw_dbg_dest_tlv *dbg_dest_tlv; 291 struct iwl_fw_dbg_dest_tlv *dbg_dest_tlv;
296 struct iwl_fw_dbg_conf_tlv *dbg_conf_tlv[FW_DBG_MAX]; 292 struct iwl_fw_dbg_conf_tlv *dbg_conf_tlv[FW_DBG_CONF_MAX];
297 size_t dbg_conf_tlv_len[FW_DBG_MAX]; 293 size_t dbg_conf_tlv_len[FW_DBG_CONF_MAX];
294 struct iwl_fw_dbg_trigger_tlv *dbg_trigger_tlv[FW_DBG_TRIGGER_MAX];
295 size_t dbg_trigger_tlv_len[FW_DBG_TRIGGER_MAX];
298}; 296};
299 297
300/* 298/*
@@ -842,6 +840,23 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
842 capa->n_scan_channels = 840 capa->n_scan_channels =
843 le32_to_cpup((__le32 *)tlv_data); 841 le32_to_cpup((__le32 *)tlv_data);
844 break; 842 break;
843 case IWL_UCODE_TLV_FW_VERSION: {
844 __le32 *ptr = (void *)tlv_data;
845 u32 major, minor;
846 u8 local_comp;
847
848 if (tlv_len != sizeof(u32) * 3)
849 goto invalid_tlv_len;
850
851 major = le32_to_cpup(ptr++);
852 minor = le32_to_cpup(ptr++);
853 local_comp = le32_to_cpup(ptr);
854
855 snprintf(drv->fw.fw_version,
856 sizeof(drv->fw.fw_version), "%u.%u.%u",
857 major, minor, local_comp);
858 break;
859 }
845 case IWL_UCODE_TLV_FW_DBG_DEST: { 860 case IWL_UCODE_TLV_FW_DBG_DEST: {
846 struct iwl_fw_dbg_dest_tlv *dest = (void *)tlv_data; 861 struct iwl_fw_dbg_dest_tlv *dest = (void *)tlv_data;
847 862
@@ -897,6 +912,31 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
897 pieces->dbg_conf_tlv_len[conf->id] = tlv_len; 912 pieces->dbg_conf_tlv_len[conf->id] = tlv_len;
898 break; 913 break;
899 } 914 }
915 case IWL_UCODE_TLV_FW_DBG_TRIGGER: {
916 struct iwl_fw_dbg_trigger_tlv *trigger =
917 (void *)tlv_data;
918 u32 trigger_id = le32_to_cpu(trigger->id);
919
920 if (trigger_id >= ARRAY_SIZE(drv->fw.dbg_trigger_tlv)) {
921 IWL_ERR(drv,
922 "Skip unknown trigger: %u\n",
923 trigger->id);
924 break;
925 }
926
927 if (pieces->dbg_trigger_tlv[trigger_id]) {
928 IWL_ERR(drv,
929 "Ignore duplicate dbg trigger %u\n",
930 trigger->id);
931 break;
932 }
933
934 IWL_INFO(drv, "Found debug trigger: %u\n", trigger->id);
935
936 pieces->dbg_trigger_tlv[trigger_id] = trigger;
937 pieces->dbg_trigger_tlv_len[trigger_id] = tlv_len;
938 break;
939 }
900 case IWL_UCODE_TLV_SEC_RT_USNIFFER: 940 case IWL_UCODE_TLV_SEC_RT_USNIFFER:
901 usniffer_images = true; 941 usniffer_images = true;
902 iwl_store_ucode_sec(pieces, tlv_data, 942 iwl_store_ucode_sec(pieces, tlv_data,
@@ -968,34 +1008,34 @@ static int validate_sec_sizes(struct iwl_drv *drv,
968 1008
969 /* Verify that uCode images will fit in card's SRAM. */ 1009 /* Verify that uCode images will fit in card's SRAM. */
970 if (get_sec_size(pieces, IWL_UCODE_REGULAR, IWL_UCODE_SECTION_INST) > 1010 if (get_sec_size(pieces, IWL_UCODE_REGULAR, IWL_UCODE_SECTION_INST) >
971 cfg->max_inst_size) { 1011 cfg->max_inst_size) {
972 IWL_ERR(drv, "uCode instr len %Zd too large to fit in\n", 1012 IWL_ERR(drv, "uCode instr len %Zd too large to fit in\n",
973 get_sec_size(pieces, IWL_UCODE_REGULAR, 1013 get_sec_size(pieces, IWL_UCODE_REGULAR,
974 IWL_UCODE_SECTION_INST)); 1014 IWL_UCODE_SECTION_INST));
975 return -1; 1015 return -1;
976 } 1016 }
977 1017
978 if (get_sec_size(pieces, IWL_UCODE_REGULAR, IWL_UCODE_SECTION_DATA) > 1018 if (get_sec_size(pieces, IWL_UCODE_REGULAR, IWL_UCODE_SECTION_DATA) >
979 cfg->max_data_size) { 1019 cfg->max_data_size) {
980 IWL_ERR(drv, "uCode data len %Zd too large to fit in\n", 1020 IWL_ERR(drv, "uCode data len %Zd too large to fit in\n",
981 get_sec_size(pieces, IWL_UCODE_REGULAR, 1021 get_sec_size(pieces, IWL_UCODE_REGULAR,
982 IWL_UCODE_SECTION_DATA)); 1022 IWL_UCODE_SECTION_DATA));
983 return -1; 1023 return -1;
984 } 1024 }
985 1025
986 if (get_sec_size(pieces, IWL_UCODE_INIT, IWL_UCODE_SECTION_INST) > 1026 if (get_sec_size(pieces, IWL_UCODE_INIT, IWL_UCODE_SECTION_INST) >
987 cfg->max_inst_size) { 1027 cfg->max_inst_size) {
988 IWL_ERR(drv, "uCode init instr len %Zd too large to fit in\n", 1028 IWL_ERR(drv, "uCode init instr len %Zd too large to fit in\n",
989 get_sec_size(pieces, IWL_UCODE_INIT, 1029 get_sec_size(pieces, IWL_UCODE_INIT,
990 IWL_UCODE_SECTION_INST)); 1030 IWL_UCODE_SECTION_INST));
991 return -1; 1031 return -1;
992 } 1032 }
993 1033
994 if (get_sec_size(pieces, IWL_UCODE_INIT, IWL_UCODE_SECTION_DATA) > 1034 if (get_sec_size(pieces, IWL_UCODE_INIT, IWL_UCODE_SECTION_DATA) >
995 cfg->max_data_size) { 1035 cfg->max_data_size) {
996 IWL_ERR(drv, "uCode init data len %Zd too large to fit in\n", 1036 IWL_ERR(drv, "uCode init data len %Zd too large to fit in\n",
997 get_sec_size(pieces, IWL_UCODE_REGULAR, 1037 get_sec_size(pieces, IWL_UCODE_REGULAR,
998 IWL_UCODE_SECTION_DATA)); 1038 IWL_UCODE_SECTION_DATA));
999 return -1; 1039 return -1;
1000 } 1040 }
1001 return 0; 1041 return 0;
@@ -1062,6 +1102,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
1062 const unsigned int api_max = drv->cfg->ucode_api_max; 1102 const unsigned int api_max = drv->cfg->ucode_api_max;
1063 unsigned int api_ok = drv->cfg->ucode_api_ok; 1103 unsigned int api_ok = drv->cfg->ucode_api_ok;
1064 const unsigned int api_min = drv->cfg->ucode_api_min; 1104 const unsigned int api_min = drv->cfg->ucode_api_min;
1105 size_t trigger_tlv_sz[FW_DBG_TRIGGER_MAX];
1065 u32 api_ver; 1106 u32 api_ver;
1066 int i; 1107 int i;
1067 bool load_module = false; 1108 bool load_module = false;
@@ -1107,7 +1148,10 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
1107 if (err) 1148 if (err)
1108 goto try_again; 1149 goto try_again;
1109 1150
1110 api_ver = IWL_UCODE_API(drv->fw.ucode_ver); 1151 if (drv->fw.ucode_capa.api[0] & IWL_UCODE_TLV_API_NEW_VERSION)
1152 api_ver = drv->fw.ucode_ver;
1153 else
1154 api_ver = IWL_UCODE_API(drv->fw.ucode_ver);
1111 1155
1112 /* 1156 /*
1113 * api_ver should match the api version forming part of the 1157 * api_ver should match the api version forming part of the
@@ -1178,6 +1222,48 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context)
1178 } 1222 }
1179 } 1223 }
1180 1224
1225 memset(&trigger_tlv_sz, 0xff, sizeof(trigger_tlv_sz));
1226
1227 trigger_tlv_sz[FW_DBG_TRIGGER_MISSED_BEACONS] =
1228 sizeof(struct iwl_fw_dbg_trigger_missed_bcon);
1229 trigger_tlv_sz[FW_DBG_TRIGGER_CHANNEL_SWITCH] = 0;
1230 trigger_tlv_sz[FW_DBG_TRIGGER_FW_NOTIF] =
1231 sizeof(struct iwl_fw_dbg_trigger_cmd);
1232 trigger_tlv_sz[FW_DBG_TRIGGER_MLME] =
1233 sizeof(struct iwl_fw_dbg_trigger_mlme);
1234 trigger_tlv_sz[FW_DBG_TRIGGER_STATS] =
1235 sizeof(struct iwl_fw_dbg_trigger_stats);
1236 trigger_tlv_sz[FW_DBG_TRIGGER_RSSI] =
1237 sizeof(struct iwl_fw_dbg_trigger_low_rssi);
1238 trigger_tlv_sz[FW_DBG_TRIGGER_TXQ_TIMERS] =
1239 sizeof(struct iwl_fw_dbg_trigger_txq_timer);
1240 trigger_tlv_sz[FW_DBG_TRIGGER_TIME_EVENT] =
1241 sizeof(struct iwl_fw_dbg_trigger_time_event);
1242
1243 for (i = 0; i < ARRAY_SIZE(drv->fw.dbg_trigger_tlv); i++) {
1244 if (pieces->dbg_trigger_tlv[i]) {
1245 /*
1246 * If the trigger isn't long enough, WARN and exit.
1247 * Someone is trying to debug something and he won't
1248 * be able to catch the bug he is trying to chase.
1249 * We'd better be noisy to be sure he knows what's
1250 * going on.
1251 */
1252 if (WARN_ON(pieces->dbg_trigger_tlv_len[i] <
1253 (trigger_tlv_sz[i] +
1254 sizeof(struct iwl_fw_dbg_trigger_tlv))))
1255 goto out_free_fw;
1256 drv->fw.dbg_trigger_tlv_len[i] =
1257 pieces->dbg_trigger_tlv_len[i];
1258 drv->fw.dbg_trigger_tlv[i] =
1259 kmemdup(pieces->dbg_trigger_tlv[i],
1260 drv->fw.dbg_trigger_tlv_len[i],
1261 GFP_KERNEL);
1262 if (!drv->fw.dbg_trigger_tlv[i])
1263 goto out_free_fw;
1264 }
1265 }
1266
1181 /* Now that we can no longer fail, copy information */ 1267 /* Now that we can no longer fail, copy information */
1182 1268
1183 /* 1269 /*
@@ -1485,6 +1571,10 @@ module_param_named(d0i3_disable, iwlwifi_mod_params.d0i3_disable,
1485 bool, S_IRUGO); 1571 bool, S_IRUGO);
1486MODULE_PARM_DESC(d0i3_disable, "disable d0i3 functionality (default: Y)"); 1572MODULE_PARM_DESC(d0i3_disable, "disable d0i3 functionality (default: Y)");
1487 1573
1574module_param_named(lar_disable, iwlwifi_mod_params.lar_disable,
1575 bool, S_IRUGO);
1576MODULE_PARM_DESC(lar_disable, "disable LAR functionality (default: N)");
1577
1488module_param_named(uapsd_disable, iwlwifi_mod_params.uapsd_disable, 1578module_param_named(uapsd_disable, iwlwifi_mod_params.uapsd_disable,
1489 bool, S_IRUGO | S_IWUSR); 1579 bool, S_IRUGO | S_IWUSR);
1490#ifdef CONFIG_IWLWIFI_UAPSD 1580#ifdef CONFIG_IWLWIFI_UAPSD
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.h b/drivers/net/wireless/iwlwifi/iwl-drv.h
index adf522c756e6..cda746b33db1 100644
--- a/drivers/net/wireless/iwlwifi/iwl-drv.h
+++ b/drivers/net/wireless/iwlwifi/iwl-drv.h
@@ -68,7 +68,7 @@
68 68
69/* for all modules */ 69/* for all modules */
70#define DRV_NAME "iwlwifi" 70#define DRV_NAME "iwlwifi"
71#define DRV_COPYRIGHT "Copyright(c) 2003- 2014 Intel Corporation" 71#define DRV_COPYRIGHT "Copyright(c) 2003- 2015 Intel Corporation"
72#define DRV_AUTHOR "<ilw@linux.intel.com>" 72#define DRV_AUTHOR "<ilw@linux.intel.com>"
73 73
74/* radio config bits (actual values from NVM definition) */ 74/* radio config bits (actual values from NVM definition) */
@@ -123,7 +123,7 @@ struct iwl_cfg;
123 * starts the driver: fetches the firmware. This should be called by bus 123 * starts the driver: fetches the firmware. This should be called by bus
124 * specific system flows implementations. For example, the bus specific probe 124 * specific system flows implementations. For example, the bus specific probe
125 * function should do bus related operations only, and then call to this 125 * function should do bus related operations only, and then call to this
126 * function. It returns the driver object or %NULL if an error occured. 126 * function. It returns the driver object or %NULL if an error occurred.
127 */ 127 */
128struct iwl_drv *iwl_drv_start(struct iwl_trans *trans, 128struct iwl_drv *iwl_drv_start(struct iwl_trans *trans,
129 const struct iwl_cfg *cfg); 129 const struct iwl_cfg *cfg);
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h b/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h
index f0548b8a64b0..5234a0bf11e4 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.h
@@ -94,6 +94,7 @@ struct iwl_nvm_data {
94 u32 nvm_version; 94 u32 nvm_version;
95 s8 max_tx_pwr_half_dbm; 95 s8 max_tx_pwr_half_dbm;
96 96
97 bool lar_enabled;
97 struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS]; 98 struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
98 struct ieee80211_channel channels[]; 99 struct ieee80211_channel channels[];
99}; 100};
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom-read.c b/drivers/net/wireless/iwlwifi/iwl-eeprom-read.c
index 25d0105741db..219ca8acca62 100644
--- a/drivers/net/wireless/iwlwifi/iwl-eeprom-read.c
+++ b/drivers/net/wireless/iwlwifi/iwl-eeprom-read.c
@@ -248,7 +248,7 @@ static int iwl_read_otp_word(struct iwl_trans *trans, u16 addr,
248 otpgp = iwl_read32(trans, CSR_OTP_GP_REG); 248 otpgp = iwl_read32(trans, CSR_OTP_GP_REG);
249 if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) { 249 if (otpgp & CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK) {
250 /* stop in this case */ 250 /* stop in this case */
251 /* set the uncorrectable OTP ECC bit for acknowledgement */ 251 /* set the uncorrectable OTP ECC bit for acknowledgment */
252 iwl_set_bit(trans, CSR_OTP_GP_REG, 252 iwl_set_bit(trans, CSR_OTP_GP_REG,
253 CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK); 253 CSR_OTP_GP_REG_ECC_UNCORR_STATUS_MSK);
254 IWL_ERR(trans, "Uncorrectable OTP ECC error, abort OTP read\n"); 254 IWL_ERR(trans, "Uncorrectable OTP ECC error, abort OTP read\n");
@@ -256,7 +256,7 @@ static int iwl_read_otp_word(struct iwl_trans *trans, u16 addr,
256 } 256 }
257 if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) { 257 if (otpgp & CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK) {
258 /* continue in this case */ 258 /* continue in this case */
259 /* set the correctable OTP ECC bit for acknowledgement */ 259 /* set the correctable OTP ECC bit for acknowledgment */
260 iwl_set_bit(trans, CSR_OTP_GP_REG, 260 iwl_set_bit(trans, CSR_OTP_GP_REG,
261 CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK); 261 CSR_OTP_GP_REG_ECC_CORR_STATUS_MSK);
262 IWL_ERR(trans, "Correctable OTP ECC error, continue read\n"); 262 IWL_ERR(trans, "Correctable OTP ECC error, continue read\n");
diff --git a/drivers/net/wireless/iwlwifi/iwl-fh.h b/drivers/net/wireless/iwlwifi/iwl-fh.h
index 1f7f15eb86da..d45dc021cda2 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fh.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fh.h
@@ -445,7 +445,7 @@ static inline unsigned int FH_MEM_CBBC_QUEUE(unsigned int chnl)
445#define RX_LOW_WATERMARK 8 445#define RX_LOW_WATERMARK 8
446 446
447/** 447/**
448 * struct iwl_rb_status - reseve buffer status 448 * struct iwl_rb_status - reserve buffer status
449 * host memory mapped FH registers 449 * host memory mapped FH registers
450 * @closed_rb_num [0:11] - Indicates the index of the RB which was closed 450 * @closed_rb_num [0:11] - Indicates the index of the RB which was closed
451 * @closed_fr_num [0:11] - Indicates the index of the RX Frame which was closed 451 * @closed_fr_num [0:11] - Indicates the index of the RX Frame which was closed
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw-error-dump.h b/drivers/net/wireless/iwlwifi/iwl-fw-error-dump.h
index 919a2548a92c..251bf8dc4a12 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw-error-dump.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw-error-dump.h
@@ -82,6 +82,8 @@
82 * sections like this in a single file. 82 * sections like this in a single file.
83 * @IWL_FW_ERROR_DUMP_FH_REGS: range of FH registers 83 * @IWL_FW_ERROR_DUMP_FH_REGS: range of FH registers
84 * @IWL_FW_ERROR_DUMP_MEM: chunk of memory 84 * @IWL_FW_ERROR_DUMP_MEM: chunk of memory
85 * @IWL_FW_ERROR_DUMP_ERROR_INFO: description of what triggered this dump.
86 * Structured as &struct iwl_fw_error_dump_trigger_desc.
85 */ 87 */
86enum iwl_fw_error_dump_type { 88enum iwl_fw_error_dump_type {
87 /* 0 is deprecated */ 89 /* 0 is deprecated */
@@ -94,6 +96,7 @@ enum iwl_fw_error_dump_type {
94 IWL_FW_ERROR_DUMP_TXF = 7, 96 IWL_FW_ERROR_DUMP_TXF = 7,
95 IWL_FW_ERROR_DUMP_FH_REGS = 8, 97 IWL_FW_ERROR_DUMP_FH_REGS = 8,
96 IWL_FW_ERROR_DUMP_MEM = 9, 98 IWL_FW_ERROR_DUMP_MEM = 9,
99 IWL_FW_ERROR_DUMP_ERROR_INFO = 10,
97 100
98 IWL_FW_ERROR_DUMP_MAX, 101 IWL_FW_ERROR_DUMP_MAX,
99}; 102};
@@ -180,7 +183,7 @@ struct iwl_fw_error_dump_info {
180 * struct iwl_fw_error_dump_fw_mon - FW monitor data 183 * struct iwl_fw_error_dump_fw_mon - FW monitor data
181 * @fw_mon_wr_ptr: the position of the write pointer in the cyclic buffer 184 * @fw_mon_wr_ptr: the position of the write pointer in the cyclic buffer
182 * @fw_mon_base_ptr: base pointer of the data 185 * @fw_mon_base_ptr: base pointer of the data
183 * @fw_mon_cycle_cnt: number of wrap arounds 186 * @fw_mon_cycle_cnt: number of wraparounds
184 * @reserved: for future use 187 * @reserved: for future use
185 * @data: captured data 188 * @data: captured data
186 */ 189 */
@@ -230,4 +233,53 @@ iwl_fw_error_next_data(struct iwl_fw_error_dump_data *data)
230 return (void *)(data->data + le32_to_cpu(data->len)); 233 return (void *)(data->data + le32_to_cpu(data->len));
231} 234}
232 235
236/**
237 * enum iwl_fw_dbg_trigger - triggers available
238 *
239 * @FW_DBG_TRIGGER_USER: trigger log collection by user
240 * This should not be defined as a trigger to the driver, but a value the
241 * driver should set to indicate that the trigger was initiated by the
242 * user.
243 * @FW_DBG_TRIGGER_FW_ASSERT: trigger log collection when the firmware asserts
244 * @FW_DBG_TRIGGER_MISSED_BEACONS: trigger log collection when beacons are
245 * missed.
246 * @FW_DBG_TRIGGER_CHANNEL_SWITCH: trigger log collection upon channel switch.
247 * @FW_DBG_TRIGGER_FW_NOTIF: trigger log collection when the firmware sends a
248 * command response or a notification.
249 * @FW_DBG_TRIGGER_MLME: trigger log collection upon MLME event.
250 * @FW_DBG_TRIGGER_STATS: trigger log collection upon statistics threshold.
251 * @FW_DBG_TRIGGER_RSSI: trigger log collection when the rssi of the beacon
252 * goes below a threshold.
253 * @FW_DBG_TRIGGER_TXQ_TIMERS: configures the timers for the Tx queue hang
254 * detection.
255 * @FW_DBG_TRIGGER_TIME_EVENT: trigger log collection upon time events related
256 * events.
257 */
258enum iwl_fw_dbg_trigger {
259 FW_DBG_TRIGGER_INVALID = 0,
260 FW_DBG_TRIGGER_USER,
261 FW_DBG_TRIGGER_FW_ASSERT,
262 FW_DBG_TRIGGER_MISSED_BEACONS,
263 FW_DBG_TRIGGER_CHANNEL_SWITCH,
264 FW_DBG_TRIGGER_FW_NOTIF,
265 FW_DBG_TRIGGER_MLME,
266 FW_DBG_TRIGGER_STATS,
267 FW_DBG_TRIGGER_RSSI,
268 FW_DBG_TRIGGER_TXQ_TIMERS,
269 FW_DBG_TRIGGER_TIME_EVENT,
270
271 /* must be last */
272 FW_DBG_TRIGGER_MAX,
273};
274
275/**
276 * struct iwl_fw_error_dump_trigger_desc - describes the trigger condition
277 * @type: %enum iwl_fw_dbg_trigger
278 * @data: raw data about what happened
279 */
280struct iwl_fw_error_dump_trigger_desc {
281 __le32 type;
282 u8 data[];
283};
284
233#endif /* __fw_error_dump_h__ */ 285#endif /* __fw_error_dump_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw-file.h b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
index 016d91384681..bfdf3faa6c47 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw-file.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw-file.h
@@ -66,6 +66,7 @@
66#define __iwl_fw_file_h__ 66#define __iwl_fw_file_h__
67 67
68#include <linux/netdevice.h> 68#include <linux/netdevice.h>
69#include <linux/nl80211.h>
69 70
70/* v1/v2 uCode file layout */ 71/* v1/v2 uCode file layout */
71struct iwl_ucode_header { 72struct iwl_ucode_header {
@@ -133,8 +134,10 @@ enum iwl_ucode_tlv_type {
133 IWL_UCODE_TLV_N_SCAN_CHANNELS = 31, 134 IWL_UCODE_TLV_N_SCAN_CHANNELS = 31,
134 IWL_UCODE_TLV_SEC_RT_USNIFFER = 34, 135 IWL_UCODE_TLV_SEC_RT_USNIFFER = 34,
135 IWL_UCODE_TLV_SDIO_ADMA_ADDR = 35, 136 IWL_UCODE_TLV_SDIO_ADMA_ADDR = 35,
137 IWL_UCODE_TLV_FW_VERSION = 36,
136 IWL_UCODE_TLV_FW_DBG_DEST = 38, 138 IWL_UCODE_TLV_FW_DBG_DEST = 38,
137 IWL_UCODE_TLV_FW_DBG_CONF = 39, 139 IWL_UCODE_TLV_FW_DBG_CONF = 39,
140 IWL_UCODE_TLV_FW_DBG_TRIGGER = 40,
138}; 141};
139 142
140struct iwl_ucode_tlv { 143struct iwl_ucode_tlv {
@@ -156,7 +159,8 @@ struct iwl_tlv_ucode_header {
156 __le32 zero; 159 __le32 zero;
157 __le32 magic; 160 __le32 magic;
158 u8 human_readable[FW_VER_HUMAN_READABLE_SZ]; 161 u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
159 __le32 ver; /* major/minor/API/serial */ 162 /* major/minor/API/serial or major in new format */
163 __le32 ver;
160 __le32 build; 164 __le32 build;
161 __le64 ignore; 165 __le64 ignore;
162 /* 166 /*
@@ -187,7 +191,7 @@ struct iwl_ucode_capa {
187 * enum iwl_ucode_tlv_flag - ucode API flags 191 * enum iwl_ucode_tlv_flag - ucode API flags
188 * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously 192 * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
189 * was a separate TLV but moved here to save space. 193 * was a separate TLV but moved here to save space.
190 * @IWL_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behaviour on hidden SSID, 194 * @IWL_UCODE_TLV_FLAGS_NEWSCAN: new uCode scan behavior on hidden SSID,
191 * treats good CRC threshold as a boolean 195 * treats good CRC threshold as a boolean
192 * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w). 196 * @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
193 * @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P. 197 * @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
@@ -236,11 +240,9 @@ enum iwl_ucode_tlv_flag {
236/** 240/**
237 * enum iwl_ucode_tlv_api - ucode api 241 * enum iwl_ucode_tlv_api - ucode api
238 * @IWL_UCODE_TLV_API_BT_COEX_SPLIT: new API for BT Coex 242 * @IWL_UCODE_TLV_API_BT_COEX_SPLIT: new API for BT Coex
239 * @IWL_UCODE_TLV_API_DISABLE_STA_TX: ucode supports tx_disable bit.
240 * @IWL_UCODE_TLV_API_LMAC_SCAN: This ucode uses LMAC unified scan API.
241 * @IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF: ucode supports disabling dummy notif.
242 * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time 243 * @IWL_UCODE_TLV_API_FRAGMENTED_SCAN: This ucode supports active dwell time
243 * longer than the passive one, which is essential for fragmented scan. 244 * longer than the passive one, which is essential for fragmented scan.
245 * @IWL_UCODE_TLV_API_WIFI_MCC_UPDATE: ucode supports MCC updates with source.
244 * IWL_UCODE_TLV_API_HDC_PHASE_0: ucode supports finer configuration of LTR 246 * IWL_UCODE_TLV_API_HDC_PHASE_0: ucode supports finer configuration of LTR
245 * @IWL_UCODE_TLV_API_BASIC_DWELL: use only basic dwell time in scan command, 247 * @IWL_UCODE_TLV_API_BASIC_DWELL: use only basic dwell time in scan command,
246 * regardless of the band or the number of the probes. FW will calculate 248 * regardless of the band or the number of the probes. FW will calculate
@@ -250,19 +252,21 @@ enum iwl_ucode_tlv_flag {
250 * @IWL_UCODE_TLV_API_SINGLE_SCAN_EBS: EBS is supported for single scans too. 252 * @IWL_UCODE_TLV_API_SINGLE_SCAN_EBS: EBS is supported for single scans too.
251 * @IWL_UCODE_TLV_API_ASYNC_DTM: Async temperature notifications are supported. 253 * @IWL_UCODE_TLV_API_ASYNC_DTM: Async temperature notifications are supported.
252 * @IWL_UCODE_TLV_API_LQ_SS_PARAMS: Configure STBC/BFER via LQ CMD ss_params 254 * @IWL_UCODE_TLV_API_LQ_SS_PARAMS: Configure STBC/BFER via LQ CMD ss_params
255 * @IWL_UCODE_TLV_API_STATS_V10: uCode supports/uses statistics API version 10
256 * @IWL_UCODE_TLV_API_NEW_VERSION: new versioning format
253 */ 257 */
254enum iwl_ucode_tlv_api { 258enum iwl_ucode_tlv_api {
255 IWL_UCODE_TLV_API_BT_COEX_SPLIT = BIT(3), 259 IWL_UCODE_TLV_API_BT_COEX_SPLIT = BIT(3),
256 IWL_UCODE_TLV_API_DISABLE_STA_TX = BIT(5),
257 IWL_UCODE_TLV_API_LMAC_SCAN = BIT(6),
258 IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF = BIT(7),
259 IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8), 260 IWL_UCODE_TLV_API_FRAGMENTED_SCAN = BIT(8),
261 IWL_UCODE_TLV_API_WIFI_MCC_UPDATE = BIT(9),
260 IWL_UCODE_TLV_API_HDC_PHASE_0 = BIT(10), 262 IWL_UCODE_TLV_API_HDC_PHASE_0 = BIT(10),
261 IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13), 263 IWL_UCODE_TLV_API_BASIC_DWELL = BIT(13),
262 IWL_UCODE_TLV_API_SCD_CFG = BIT(15), 264 IWL_UCODE_TLV_API_SCD_CFG = BIT(15),
263 IWL_UCODE_TLV_API_SINGLE_SCAN_EBS = BIT(16), 265 IWL_UCODE_TLV_API_SINGLE_SCAN_EBS = BIT(16),
264 IWL_UCODE_TLV_API_ASYNC_DTM = BIT(17), 266 IWL_UCODE_TLV_API_ASYNC_DTM = BIT(17),
265 IWL_UCODE_TLV_API_LQ_SS_PARAMS = BIT(18), 267 IWL_UCODE_TLV_API_LQ_SS_PARAMS = BIT(18),
268 IWL_UCODE_TLV_API_STATS_V10 = BIT(19),
269 IWL_UCODE_TLV_API_NEW_VERSION = BIT(20),
266}; 270};
267 271
268/** 272/**
@@ -284,6 +288,13 @@ enum iwl_ucode_tlv_api {
284 * which also implies support for the scheduler configuration command 288 * which also implies support for the scheduler configuration command
285 * @IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH: supports TDLS channel switching 289 * @IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH: supports TDLS channel switching
286 * @IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT: supports Hot Spot Command 290 * @IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT: supports Hot Spot Command
291 * @IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS: support radio and beacon statistics
292 * @IWL_UCODE_TLV_CAPA_BT_COEX_PLCR: enabled BT Coex packet level co-running
293 * @IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC: ucode supports LAR updates with different
294 * sources for the MCC. This TLV bit is a future replacement to
295 * IWL_UCODE_TLV_API_WIFI_MCC_UPDATE. When either is set, multi-source LAR
296 * is supported.
297 * @IWL_UCODE_TLV_CAPA_BT_COEX_RRC: supports BT Coex RRC
287 */ 298 */
288enum iwl_ucode_tlv_capa { 299enum iwl_ucode_tlv_capa {
289 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0), 300 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0),
@@ -298,6 +309,10 @@ enum iwl_ucode_tlv_capa {
298 IWL_UCODE_TLV_CAPA_DQA_SUPPORT = BIT(12), 309 IWL_UCODE_TLV_CAPA_DQA_SUPPORT = BIT(12),
299 IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH = BIT(13), 310 IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH = BIT(13),
300 IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT = BIT(18), 311 IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT = BIT(18),
312 IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS = BIT(22),
313 IWL_UCODE_TLV_CAPA_BT_COEX_PLCR = BIT(28),
314 IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC = BIT(29),
315 IWL_UCODE_TLV_CAPA_BT_COEX_RRC = BIT(30),
301}; 316};
302 317
303/* The default calibrate table size if not specified by firmware file */ 318/* The default calibrate table size if not specified by firmware file */
@@ -450,44 +465,207 @@ struct iwl_fw_dbg_conf_hcmd {
450} __packed; 465} __packed;
451 466
452/** 467/**
453 * struct iwl_fw_dbg_trigger - a TLV that describes a debug configuration 468 * enum iwl_fw_dbg_trigger_mode - triggers functionalities
454 * 469 *
455 * @enabled: is this trigger enabled 470 * @IWL_FW_DBG_TRIGGER_START: when trigger occurs re-conf the dbg mechanism
456 * @reserved: 471 * @IWL_FW_DBG_TRIGGER_STOP: when trigger occurs pull the dbg data
457 * @len: length, in bytes, of the %trigger field
458 * @trigger: pointer to a trigger struct
459 */ 472 */
460struct iwl_fw_dbg_trigger { 473enum iwl_fw_dbg_trigger_mode {
461 u8 enabled; 474 IWL_FW_DBG_TRIGGER_START = BIT(0),
462 u8 reserved; 475 IWL_FW_DBG_TRIGGER_STOP = BIT(1),
463 u8 len; 476};
464 u8 trigger[0]; 477
478/**
479 * enum iwl_fw_dbg_trigger_vif_type - define the VIF type for a trigger
480 * @IWL_FW_DBG_CONF_VIF_ANY: any vif type
481 * @IWL_FW_DBG_CONF_VIF_IBSS: IBSS mode
482 * @IWL_FW_DBG_CONF_VIF_STATION: BSS mode
483 * @IWL_FW_DBG_CONF_VIF_AP: AP mode
484 * @IWL_FW_DBG_CONF_VIF_P2P_CLIENT: P2P Client mode
485 * @IWL_FW_DBG_CONF_VIF_P2P_GO: P2P GO mode
486 * @IWL_FW_DBG_CONF_VIF_P2P_DEVICE: P2P device
487 */
488enum iwl_fw_dbg_trigger_vif_type {
489 IWL_FW_DBG_CONF_VIF_ANY = NL80211_IFTYPE_UNSPECIFIED,
490 IWL_FW_DBG_CONF_VIF_IBSS = NL80211_IFTYPE_ADHOC,
491 IWL_FW_DBG_CONF_VIF_STATION = NL80211_IFTYPE_STATION,
492 IWL_FW_DBG_CONF_VIF_AP = NL80211_IFTYPE_AP,
493 IWL_FW_DBG_CONF_VIF_P2P_CLIENT = NL80211_IFTYPE_P2P_CLIENT,
494 IWL_FW_DBG_CONF_VIF_P2P_GO = NL80211_IFTYPE_P2P_GO,
495 IWL_FW_DBG_CONF_VIF_P2P_DEVICE = NL80211_IFTYPE_P2P_DEVICE,
496};
497
498/**
499 * struct iwl_fw_dbg_trigger_tlv - a TLV that describes the trigger
500 * @id: %enum iwl_fw_dbg_trigger
501 * @vif_type: %enum iwl_fw_dbg_trigger_vif_type
502 * @stop_conf_ids: bitmap of configurations this trigger relates to.
503 * if the mode is %IWL_FW_DBG_TRIGGER_STOP, then if the bit corresponding
504 * to the currently running configuration is set, the data should be
505 * collected.
506 * @stop_delay: how many milliseconds to wait before collecting the data
507 * after the STOP trigger fires.
508 * @mode: %enum iwl_fw_dbg_trigger_mode - can be stop / start of both
509 * @start_conf_id: if mode is %IWL_FW_DBG_TRIGGER_START, this defines what
510 * configuration should be applied when the triggers kicks in.
511 * @occurrences: number of occurrences. 0 means the trigger will never fire.
512 */
513struct iwl_fw_dbg_trigger_tlv {
514 __le32 id;
515 __le32 vif_type;
516 __le32 stop_conf_ids;
517 __le32 stop_delay;
518 u8 mode;
519 u8 start_conf_id;
520 __le16 occurrences;
521 __le32 reserved[2];
522
523 u8 data[0];
465} __packed; 524} __packed;
466 525
526#define FW_DBG_START_FROM_ALIVE 0
527#define FW_DBG_CONF_MAX 32
528#define FW_DBG_INVALID 0xff
529
467/** 530/**
468 * enum iwl_fw_dbg_conf - configurations available 531 * struct iwl_fw_dbg_trigger_missed_bcon - configures trigger for missed beacons
469 * 532 * @stop_consec_missed_bcon: stop recording if threshold is crossed.
470 * @FW_DBG_CUSTOM: take this configuration from alive 533 * @stop_consec_missed_bcon_since_rx: stop recording if threshold is crossed.
471 * Note that the trigger is NO-OP for this configuration 534 * @start_consec_missed_bcon: start recording if threshold is crossed.
535 * @start_consec_missed_bcon_since_rx: start recording if threshold is crossed.
536 * @reserved1: reserved
537 * @reserved2: reserved
472 */ 538 */
473enum iwl_fw_dbg_conf { 539struct iwl_fw_dbg_trigger_missed_bcon {
474 FW_DBG_CUSTOM = 0, 540 __le32 stop_consec_missed_bcon;
541 __le32 stop_consec_missed_bcon_since_rx;
542 __le32 reserved2[2];
543 __le32 start_consec_missed_bcon;
544 __le32 start_consec_missed_bcon_since_rx;
545 __le32 reserved1[2];
546} __packed;
475 547
476 /* must be last */ 548/**
477 FW_DBG_MAX, 549 * struct iwl_fw_dbg_trigger_cmd - configures trigger for messages from FW.
478 FW_DBG_INVALID = 0xff, 550 * cmds: the list of commands to trigger the collection on
479}; 551 */
552struct iwl_fw_dbg_trigger_cmd {
553 struct cmd {
554 u8 cmd_id;
555 u8 group_id;
556 } __packed cmds[16];
557} __packed;
558
559/**
560 * iwl_fw_dbg_trigger_stats - configures trigger for statistics
561 * @stop_offset: the offset of the value to be monitored
562 * @stop_threshold: the threshold above which to collect
563 * @start_offset: the offset of the value to be monitored
564 * @start_threshold: the threshold above which to start recording
565 */
566struct iwl_fw_dbg_trigger_stats {
567 __le32 stop_offset;
568 __le32 stop_threshold;
569 __le32 start_offset;
570 __le32 start_threshold;
571} __packed;
572
573/**
574 * struct iwl_fw_dbg_trigger_low_rssi - trigger for low beacon RSSI
575 * @rssi: RSSI value to trigger at
576 */
577struct iwl_fw_dbg_trigger_low_rssi {
578 __le32 rssi;
579} __packed;
480 580
481/** 581/**
482 * struct iwl_fw_dbg_conf_tlv - a TLV that describes a debug configuration 582 * struct iwl_fw_dbg_trigger_mlme - configures trigger for mlme events
583 * @stop_auth_denied: number of denied authentication to collect
584 * @stop_auth_timeout: number of authentication timeout to collect
585 * @stop_rx_deauth: number of Rx deauth before to collect
586 * @stop_tx_deauth: number of Tx deauth before to collect
587 * @stop_assoc_denied: number of denied association to collect
588 * @stop_assoc_timeout: number of association timeout to collect
589 * @stop_connection_loss: number of connection loss to collect
590 * @start_auth_denied: number of denied authentication to start recording
591 * @start_auth_timeout: number of authentication timeout to start recording
592 * @start_rx_deauth: number of Rx deauth to start recording
593 * @start_tx_deauth: number of Tx deauth to start recording
594 * @start_assoc_denied: number of denied association to start recording
595 * @start_assoc_timeout: number of association timeout to start recording
596 * @start_connection_loss: number of connection loss to start recording
597 */
598struct iwl_fw_dbg_trigger_mlme {
599 u8 stop_auth_denied;
600 u8 stop_auth_timeout;
601 u8 stop_rx_deauth;
602 u8 stop_tx_deauth;
603
604 u8 stop_assoc_denied;
605 u8 stop_assoc_timeout;
606 u8 stop_connection_loss;
607 u8 reserved;
608
609 u8 start_auth_denied;
610 u8 start_auth_timeout;
611 u8 start_rx_deauth;
612 u8 start_tx_deauth;
613
614 u8 start_assoc_denied;
615 u8 start_assoc_timeout;
616 u8 start_connection_loss;
617 u8 reserved2;
618} __packed;
619
620/**
621 * struct iwl_fw_dbg_trigger_txq_timer - configures the Tx queue's timer
622 * @command_queue: timeout for the command queue in ms
623 * @bss: timeout for the queues of a BSS (except for TDLS queues) in ms
624 * @softap: timeout for the queues of a softAP in ms
625 * @p2p_go: timeout for the queues of a P2P GO in ms
626 * @p2p_client: timeout for the queues of a P2P client in ms
627 * @p2p_device: timeout for the queues of a P2P device in ms
628 * @ibss: timeout for the queues of an IBSS in ms
629 * @tdls: timeout for the queues of a TDLS station in ms
630 */
631struct iwl_fw_dbg_trigger_txq_timer {
632 __le32 command_queue;
633 __le32 bss;
634 __le32 softap;
635 __le32 p2p_go;
636 __le32 p2p_client;
637 __le32 p2p_device;
638 __le32 ibss;
639 __le32 tdls;
640 __le32 reserved[4];
641} __packed;
642
643/**
644 * struct iwl_fw_dbg_trigger_time_event - configures a time event trigger
645 * time_Events: a list of tuples <id, action_bitmap>. The driver will issue a
646 * trigger each time a time event notification that relates to time event
647 * id with one of the actions in the bitmap is received and
648 * BIT(notif->status) is set in status_bitmap.
483 * 649 *
484 * @id: %enum iwl_fw_dbg_conf 650 */
651struct iwl_fw_dbg_trigger_time_event {
652 struct {
653 __le32 id;
654 __le32 action_bitmap;
655 __le32 status_bitmap;
656 } __packed time_events[16];
657} __packed;
658
659/**
660 * struct iwl_fw_dbg_conf_tlv - a TLV that describes a debug configuration.
661 * @id: conf id
485 * @usniffer: should the uSniffer image be used 662 * @usniffer: should the uSniffer image be used
486 * @num_of_hcmds: how many HCMDs to send are present here 663 * @num_of_hcmds: how many HCMDs to send are present here
487 * @hcmd: a variable length host command to be sent to apply the configuration. 664 * @hcmd: a variable length host command to be sent to apply the configuration.
488 * If there is more than one HCMD to send, they will appear one after the 665 * If there is more than one HCMD to send, they will appear one after the
489 * other and be sent in the order that they appear in. 666 * other and be sent in the order that they appear in.
490 * This parses IWL_UCODE_TLV_FW_DBG_CONF 667 * This parses IWL_UCODE_TLV_FW_DBG_CONF. The user can add up-to
668 * %FW_DBG_CONF_MAX configuration per run.
491 */ 669 */
492struct iwl_fw_dbg_conf_tlv { 670struct iwl_fw_dbg_conf_tlv {
493 u8 id; 671 u8 id;
@@ -495,8 +673,6 @@ struct iwl_fw_dbg_conf_tlv {
495 u8 reserved; 673 u8 reserved;
496 u8 num_of_hcmds; 674 u8 num_of_hcmds;
497 struct iwl_fw_dbg_conf_hcmd hcmd; 675 struct iwl_fw_dbg_conf_hcmd hcmd;
498
499 /* struct iwl_fw_dbg_trigger sits after all variable length hcmds */
500} __packed; 676} __packed;
501 677
502#endif /* __iwl_fw_file_h__ */ 678#endif /* __iwl_fw_file_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw.h b/drivers/net/wireless/iwlwifi/iwl-fw.h
index ffd785cc67d6..cf75bafae51d 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw.h
@@ -68,6 +68,7 @@
68#include <net/mac80211.h> 68#include <net/mac80211.h>
69 69
70#include "iwl-fw-file.h" 70#include "iwl-fw-file.h"
71#include "iwl-fw-error-dump.h"
71 72
72/** 73/**
73 * enum iwl_ucode_type 74 * enum iwl_ucode_type
@@ -157,6 +158,8 @@ struct iwl_fw_cscheme_list {
157 * @dbg_dest_tlv: points to the destination TLV for debug 158 * @dbg_dest_tlv: points to the destination TLV for debug
158 * @dbg_conf_tlv: array of pointers to configuration TLVs for debug 159 * @dbg_conf_tlv: array of pointers to configuration TLVs for debug
159 * @dbg_conf_tlv_len: lengths of the @dbg_conf_tlv entries 160 * @dbg_conf_tlv_len: lengths of the @dbg_conf_tlv entries
161 * @dbg_trigger_tlv: array of pointers to triggers TLVs
162 * @dbg_trigger_tlv_len: lengths of the @dbg_trigger_tlv entries
160 * @dbg_dest_reg_num: num of reg_ops in %dbg_dest_tlv 163 * @dbg_dest_reg_num: num of reg_ops in %dbg_dest_tlv
161 */ 164 */
162struct iwl_fw { 165struct iwl_fw {
@@ -186,9 +189,10 @@ struct iwl_fw {
186 u32 sdio_adma_addr; 189 u32 sdio_adma_addr;
187 190
188 struct iwl_fw_dbg_dest_tlv *dbg_dest_tlv; 191 struct iwl_fw_dbg_dest_tlv *dbg_dest_tlv;
189 struct iwl_fw_dbg_conf_tlv *dbg_conf_tlv[FW_DBG_MAX]; 192 struct iwl_fw_dbg_conf_tlv *dbg_conf_tlv[FW_DBG_CONF_MAX];
190 size_t dbg_conf_tlv_len[FW_DBG_MAX]; 193 size_t dbg_conf_tlv_len[FW_DBG_CONF_MAX];
191 194 struct iwl_fw_dbg_trigger_tlv *dbg_trigger_tlv[FW_DBG_TRIGGER_MAX];
195 size_t dbg_trigger_tlv_len[FW_DBG_TRIGGER_MAX];
192 u8 dbg_dest_reg_num; 196 u8 dbg_dest_reg_num;
193}; 197};
194 198
@@ -206,46 +210,29 @@ static inline const char *get_fw_dbg_mode_string(int mode)
206 } 210 }
207} 211}
208 212
209static inline const struct iwl_fw_dbg_trigger * 213static inline bool
210iwl_fw_dbg_conf_get_trigger(const struct iwl_fw *fw, u8 id) 214iwl_fw_dbg_conf_usniffer(const struct iwl_fw *fw, u8 id)
211{ 215{
212 const struct iwl_fw_dbg_conf_tlv *conf_tlv = fw->dbg_conf_tlv[id]; 216 const struct iwl_fw_dbg_conf_tlv *conf_tlv = fw->dbg_conf_tlv[id];
213 u8 *ptr;
214 int i;
215 217
216 if (!conf_tlv) 218 if (!conf_tlv)
217 return NULL;
218
219 ptr = (void *)&conf_tlv->hcmd;
220 for (i = 0; i < conf_tlv->num_of_hcmds; i++) {
221 ptr += sizeof(conf_tlv->hcmd);
222 ptr += le16_to_cpu(conf_tlv->hcmd.len);
223 }
224
225 return (const struct iwl_fw_dbg_trigger *)ptr;
226}
227
228static inline bool
229iwl_fw_dbg_conf_enabled(const struct iwl_fw *fw, u8 id)
230{
231 const struct iwl_fw_dbg_trigger *trigger =
232 iwl_fw_dbg_conf_get_trigger(fw, id);
233
234 if (!trigger)
235 return false; 219 return false;
236 220
237 return trigger->enabled; 221 return conf_tlv->usniffer;
238} 222}
239 223
240static inline bool 224#define iwl_fw_dbg_trigger_enabled(fw, id) ({ \
241iwl_fw_dbg_conf_usniffer(const struct iwl_fw *fw, u8 id) 225 void *__dbg_trigger = (fw)->dbg_trigger_tlv[(id)]; \
242{ 226 unlikely(__dbg_trigger); \
243 const struct iwl_fw_dbg_conf_tlv *conf_tlv = fw->dbg_conf_tlv[id]; 227})
244 228
245 if (!conf_tlv) 229static inline struct iwl_fw_dbg_trigger_tlv*
246 return false; 230iwl_fw_dbg_get_trigger(const struct iwl_fw *fw, u8 id)
231{
232 if (WARN_ON(id >= ARRAY_SIZE(fw->dbg_trigger_tlv)))
233 return NULL;
247 234
248 return conf_tlv->usniffer; 235 return fw->dbg_trigger_tlv[id];
249} 236}
250 237
251#endif /* __iwl_fw_h__ */ 238#endif /* __iwl_fw_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-io.c b/drivers/net/wireless/iwlwifi/iwl-io.c
index 03250a45272e..27c66e477833 100644
--- a/drivers/net/wireless/iwlwifi/iwl-io.c
+++ b/drivers/net/wireless/iwlwifi/iwl-io.c
@@ -186,21 +186,16 @@ IWL_EXPORT_SYMBOL(iwl_clear_bits_prph);
186 186
187void iwl_force_nmi(struct iwl_trans *trans) 187void iwl_force_nmi(struct iwl_trans *trans)
188{ 188{
189 /* 189 if (trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) {
190 * In HW previous to the 8000 HW family, and in the 8000 HW family
191 * itself when the revision step==0, the DEVICE_SET_NMI_REG is used
192 * to force an NMI. Otherwise, a different register -
193 * DEVICE_SET_NMI_8000B_REG - is used.
194 */
195 if ((trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) ||
196 (CSR_HW_REV_STEP(trans->hw_rev) == SILICON_A_STEP)) {
197 iwl_write_prph(trans, DEVICE_SET_NMI_REG, 190 iwl_write_prph(trans, DEVICE_SET_NMI_REG,
198 DEVICE_SET_NMI_VAL_DRV); 191 DEVICE_SET_NMI_VAL_DRV);
199 iwl_write_prph(trans, DEVICE_SET_NMI_REG, 192 iwl_write_prph(trans, DEVICE_SET_NMI_REG,
200 DEVICE_SET_NMI_VAL_HW); 193 DEVICE_SET_NMI_VAL_HW);
201 } else { 194 } else {
202 iwl_write_prph(trans, DEVICE_SET_NMI_8000B_REG, 195 iwl_write_prph(trans, DEVICE_SET_NMI_8000_REG,
203 DEVICE_SET_NMI_8000B_VAL); 196 DEVICE_SET_NMI_8000_VAL);
197 iwl_write_prph(trans, DEVICE_SET_NMI_REG,
198 DEVICE_SET_NMI_VAL_DRV);
204 } 199 }
205} 200}
206IWL_EXPORT_SYMBOL(iwl_force_nmi); 201IWL_EXPORT_SYMBOL(iwl_force_nmi);
diff --git a/drivers/net/wireless/iwlwifi/iwl-modparams.h b/drivers/net/wireless/iwlwifi/iwl-modparams.h
index e8eabd21ccfe..ac2b90df8413 100644
--- a/drivers/net/wireless/iwlwifi/iwl-modparams.h
+++ b/drivers/net/wireless/iwlwifi/iwl-modparams.h
@@ -103,6 +103,7 @@ enum iwl_disable_11n {
103 * @debug_level: levels are IWL_DL_* 103 * @debug_level: levels are IWL_DL_*
104 * @ant_coupling: antenna coupling in dB, default = 0 104 * @ant_coupling: antenna coupling in dB, default = 0
105 * @d0i3_disable: disable d0i3, default = 1, 105 * @d0i3_disable: disable d0i3, default = 1,
106 * @lar_disable: disable LAR (regulatory), default = 0
106 * @fw_monitor: allow to use firmware monitor 107 * @fw_monitor: allow to use firmware monitor
107 */ 108 */
108struct iwl_mod_params { 109struct iwl_mod_params {
@@ -121,6 +122,7 @@ struct iwl_mod_params {
121 char *nvm_file; 122 char *nvm_file;
122 bool uapsd_disable; 123 bool uapsd_disable;
123 bool d0i3_disable; 124 bool d0i3_disable;
125 bool lar_disable;
124 bool fw_monitor; 126 bool fw_monitor;
125}; 127};
126 128
diff --git a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
index c74f1a4edf23..83903a5025c2 100644
--- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
+++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
@@ -99,12 +99,15 @@ enum family_8000_nvm_offsets {
99 /* NVM SW-Section offset (in words) definitions */ 99 /* NVM SW-Section offset (in words) definitions */
100 NVM_SW_SECTION_FAMILY_8000 = 0x1C0, 100 NVM_SW_SECTION_FAMILY_8000 = 0x1C0,
101 NVM_VERSION_FAMILY_8000 = 0, 101 NVM_VERSION_FAMILY_8000 = 0,
102 RADIO_CFG_FAMILY_8000 = 2, 102 RADIO_CFG_FAMILY_8000 = 0,
103 SKU_FAMILY_8000 = 4, 103 SKU_FAMILY_8000 = 2,
104 N_HW_ADDRS_FAMILY_8000 = 5, 104 N_HW_ADDRS_FAMILY_8000 = 3,
105 105
106 /* NVM REGULATORY -Section offset (in words) definitions */ 106 /* NVM REGULATORY -Section offset (in words) definitions */
107 NVM_CHANNELS_FAMILY_8000 = 0, 107 NVM_CHANNELS_FAMILY_8000 = 0,
108 NVM_LAR_OFFSET_FAMILY_8000_OLD = 0x4C7,
109 NVM_LAR_OFFSET_FAMILY_8000 = 0x507,
110 NVM_LAR_ENABLED_FAMILY_8000 = 0x7,
108 111
109 /* NVM calibration section offset (in words) definitions */ 112 /* NVM calibration section offset (in words) definitions */
110 NVM_CALIB_SECTION_FAMILY_8000 = 0x2B8, 113 NVM_CALIB_SECTION_FAMILY_8000 = 0x2B8,
@@ -146,7 +149,9 @@ static const u8 iwl_nvm_channels_family_8000[] = {
146#define NUM_2GHZ_CHANNELS_FAMILY_8000 14 149#define NUM_2GHZ_CHANNELS_FAMILY_8000 14
147#define FIRST_2GHZ_HT_MINUS 5 150#define FIRST_2GHZ_HT_MINUS 5
148#define LAST_2GHZ_HT_PLUS 9 151#define LAST_2GHZ_HT_PLUS 9
149#define LAST_5GHZ_HT 161 152#define LAST_5GHZ_HT 165
153#define LAST_5GHZ_HT_FAMILY_8000 181
154#define N_HW_ADDR_MASK 0xF
150 155
151/* rate data (static) */ 156/* rate data (static) */
152static struct ieee80211_rate iwl_cfg80211_rates[] = { 157static struct ieee80211_rate iwl_cfg80211_rates[] = {
@@ -201,9 +206,57 @@ enum iwl_nvm_channel_flags {
201#define CHECK_AND_PRINT_I(x) \ 206#define CHECK_AND_PRINT_I(x) \
202 ((ch_flags & NVM_CHANNEL_##x) ? # x " " : "") 207 ((ch_flags & NVM_CHANNEL_##x) ? # x " " : "")
203 208
209static u32 iwl_get_channel_flags(u8 ch_num, int ch_idx, bool is_5ghz,
210 u16 nvm_flags, const struct iwl_cfg *cfg)
211{
212 u32 flags = IEEE80211_CHAN_NO_HT40;
213 u32 last_5ghz_ht = LAST_5GHZ_HT;
214
215 if (cfg->device_family == IWL_DEVICE_FAMILY_8000)
216 last_5ghz_ht = LAST_5GHZ_HT_FAMILY_8000;
217
218 if (!is_5ghz && (nvm_flags & NVM_CHANNEL_40MHZ)) {
219 if (ch_num <= LAST_2GHZ_HT_PLUS)
220 flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
221 if (ch_num >= FIRST_2GHZ_HT_MINUS)
222 flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
223 } else if (ch_num <= last_5ghz_ht && (nvm_flags & NVM_CHANNEL_40MHZ)) {
224 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
225 flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
226 else
227 flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
228 }
229 if (!(nvm_flags & NVM_CHANNEL_80MHZ))
230 flags |= IEEE80211_CHAN_NO_80MHZ;
231 if (!(nvm_flags & NVM_CHANNEL_160MHZ))
232 flags |= IEEE80211_CHAN_NO_160MHZ;
233
234 if (!(nvm_flags & NVM_CHANNEL_IBSS))
235 flags |= IEEE80211_CHAN_NO_IR;
236
237 if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
238 flags |= IEEE80211_CHAN_NO_IR;
239
240 if (nvm_flags & NVM_CHANNEL_RADAR)
241 flags |= IEEE80211_CHAN_RADAR;
242
243 if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
244 flags |= IEEE80211_CHAN_INDOOR_ONLY;
245
246 /* Set the GO concurrent flag only in case that NO_IR is set.
247 * Otherwise it is meaningless
248 */
249 if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
250 (flags & IEEE80211_CHAN_NO_IR))
251 flags |= IEEE80211_CHAN_GO_CONCURRENT;
252
253 return flags;
254}
255
204static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg, 256static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
205 struct iwl_nvm_data *data, 257 struct iwl_nvm_data *data,
206 const __le16 * const nvm_ch_flags) 258 const __le16 * const nvm_ch_flags,
259 bool lar_supported)
207{ 260{
208 int ch_idx; 261 int ch_idx;
209 int n_channels = 0; 262 int n_channels = 0;
@@ -228,9 +281,14 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
228 281
229 if (ch_idx >= num_2ghz_channels && 282 if (ch_idx >= num_2ghz_channels &&
230 !data->sku_cap_band_52GHz_enable) 283 !data->sku_cap_band_52GHz_enable)
231 ch_flags &= ~NVM_CHANNEL_VALID; 284 continue;
232 285
233 if (!(ch_flags & NVM_CHANNEL_VALID)) { 286 if (!lar_supported && !(ch_flags & NVM_CHANNEL_VALID)) {
287 /*
288 * Channels might become valid later if lar is
289 * supported, hence we still want to add them to
290 * the list of supported channels to cfg80211.
291 */
234 IWL_DEBUG_EEPROM(dev, 292 IWL_DEBUG_EEPROM(dev,
235 "Ch. %d Flags %x [%sGHz] - No traffic\n", 293 "Ch. %d Flags %x [%sGHz] - No traffic\n",
236 nvm_chan[ch_idx], 294 nvm_chan[ch_idx],
@@ -250,45 +308,6 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
250 ieee80211_channel_to_frequency( 308 ieee80211_channel_to_frequency(
251 channel->hw_value, channel->band); 309 channel->hw_value, channel->band);
252 310
253 /* TODO: Need to be dependent to the NVM */
254 channel->flags = IEEE80211_CHAN_NO_HT40;
255 if (ch_idx < num_2ghz_channels &&
256 (ch_flags & NVM_CHANNEL_40MHZ)) {
257 if (nvm_chan[ch_idx] <= LAST_2GHZ_HT_PLUS)
258 channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
259 if (nvm_chan[ch_idx] >= FIRST_2GHZ_HT_MINUS)
260 channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
261 } else if (nvm_chan[ch_idx] <= LAST_5GHZ_HT &&
262 (ch_flags & NVM_CHANNEL_40MHZ)) {
263 if ((ch_idx - num_2ghz_channels) % 2 == 0)
264 channel->flags &= ~IEEE80211_CHAN_NO_HT40PLUS;
265 else
266 channel->flags &= ~IEEE80211_CHAN_NO_HT40MINUS;
267 }
268 if (!(ch_flags & NVM_CHANNEL_80MHZ))
269 channel->flags |= IEEE80211_CHAN_NO_80MHZ;
270 if (!(ch_flags & NVM_CHANNEL_160MHZ))
271 channel->flags |= IEEE80211_CHAN_NO_160MHZ;
272
273 if (!(ch_flags & NVM_CHANNEL_IBSS))
274 channel->flags |= IEEE80211_CHAN_NO_IR;
275
276 if (!(ch_flags & NVM_CHANNEL_ACTIVE))
277 channel->flags |= IEEE80211_CHAN_NO_IR;
278
279 if (ch_flags & NVM_CHANNEL_RADAR)
280 channel->flags |= IEEE80211_CHAN_RADAR;
281
282 if (ch_flags & NVM_CHANNEL_INDOOR_ONLY)
283 channel->flags |= IEEE80211_CHAN_INDOOR_ONLY;
284
285 /* Set the GO concurrent flag only in case that NO_IR is set.
286 * Otherwise it is meaningless
287 */
288 if ((ch_flags & NVM_CHANNEL_GO_CONCURRENT) &&
289 (channel->flags & IEEE80211_CHAN_NO_IR))
290 channel->flags |= IEEE80211_CHAN_GO_CONCURRENT;
291
292 /* Initialize regulatory-based run-time data */ 311 /* Initialize regulatory-based run-time data */
293 312
294 /* 313 /*
@@ -297,6 +316,15 @@ static int iwl_init_channel_map(struct device *dev, const struct iwl_cfg *cfg,
297 */ 316 */
298 channel->max_power = IWL_DEFAULT_MAX_TX_POWER; 317 channel->max_power = IWL_DEFAULT_MAX_TX_POWER;
299 is_5ghz = channel->band == IEEE80211_BAND_5GHZ; 318 is_5ghz = channel->band == IEEE80211_BAND_5GHZ;
319
320 /* don't put limitations in case we're using LAR */
321 if (!lar_supported)
322 channel->flags = iwl_get_channel_flags(nvm_chan[ch_idx],
323 ch_idx, is_5ghz,
324 ch_flags, cfg);
325 else
326 channel->flags = 0;
327
300 IWL_DEBUG_EEPROM(dev, 328 IWL_DEBUG_EEPROM(dev,
301 "Ch. %d [%sGHz] %s%s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n", 329 "Ch. %d [%sGHz] %s%s%s%s%s%s%s(0x%02x %ddBm): Ad-Hoc %ssupported\n",
302 channel->hw_value, 330 channel->hw_value,
@@ -370,8 +398,8 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
370 398
371static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg, 399static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
372 struct iwl_nvm_data *data, 400 struct iwl_nvm_data *data,
373 const __le16 *ch_section, bool enable_vht, 401 const __le16 *ch_section,
374 u8 tx_chains, u8 rx_chains) 402 u8 tx_chains, u8 rx_chains, bool lar_supported)
375{ 403{
376 int n_channels; 404 int n_channels;
377 int n_used = 0; 405 int n_used = 0;
@@ -380,11 +408,12 @@ static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
380 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) 408 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
381 n_channels = iwl_init_channel_map( 409 n_channels = iwl_init_channel_map(
382 dev, cfg, data, 410 dev, cfg, data,
383 &ch_section[NVM_CHANNELS]); 411 &ch_section[NVM_CHANNELS], lar_supported);
384 else 412 else
385 n_channels = iwl_init_channel_map( 413 n_channels = iwl_init_channel_map(
386 dev, cfg, data, 414 dev, cfg, data,
387 &ch_section[NVM_CHANNELS_FAMILY_8000]); 415 &ch_section[NVM_CHANNELS_FAMILY_8000],
416 lar_supported);
388 417
389 sband = &data->bands[IEEE80211_BAND_2GHZ]; 418 sband = &data->bands[IEEE80211_BAND_2GHZ];
390 sband->band = IEEE80211_BAND_2GHZ; 419 sband->band = IEEE80211_BAND_2GHZ;
@@ -403,7 +432,7 @@ static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
403 IEEE80211_BAND_5GHZ); 432 IEEE80211_BAND_5GHZ);
404 iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, IEEE80211_BAND_5GHZ, 433 iwl_init_ht_hw_capab(cfg, data, &sband->ht_cap, IEEE80211_BAND_5GHZ,
405 tx_chains, rx_chains); 434 tx_chains, rx_chains);
406 if (enable_vht) 435 if (data->sku_cap_11ac_enable)
407 iwl_init_vht_hw_capab(cfg, data, &sband->vht_cap, 436 iwl_init_vht_hw_capab(cfg, data, &sband->vht_cap,
408 tx_chains, rx_chains); 437 tx_chains, rx_chains);
409 438
@@ -412,17 +441,16 @@ static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,
412 n_used, n_channels); 441 n_used, n_channels);
413} 442}
414 443
415static int iwl_get_sku(const struct iwl_cfg *cfg, 444static int iwl_get_sku(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
416 const __le16 *nvm_sw) 445 const __le16 *phy_sku)
417{ 446{
418 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) 447 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
419 return le16_to_cpup(nvm_sw + SKU); 448 return le16_to_cpup(nvm_sw + SKU);
420 else 449
421 return le32_to_cpup((__le32 *)(nvm_sw + SKU_FAMILY_8000)); 450 return le32_to_cpup((__le32 *)(phy_sku + SKU_FAMILY_8000));
422} 451}
423 452
424static int iwl_get_nvm_version(const struct iwl_cfg *cfg, 453static int iwl_get_nvm_version(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
425 const __le16 *nvm_sw)
426{ 454{
427 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) 455 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
428 return le16_to_cpup(nvm_sw + NVM_VERSION); 456 return le16_to_cpup(nvm_sw + NVM_VERSION);
@@ -431,24 +459,26 @@ static int iwl_get_nvm_version(const struct iwl_cfg *cfg,
431 NVM_VERSION_FAMILY_8000)); 459 NVM_VERSION_FAMILY_8000));
432} 460}
433 461
434static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, 462static int iwl_get_radio_cfg(const struct iwl_cfg *cfg, const __le16 *nvm_sw,
435 const __le16 *nvm_sw) 463 const __le16 *phy_sku)
436{ 464{
437 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) 465 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
438 return le16_to_cpup(nvm_sw + RADIO_CFG); 466 return le16_to_cpup(nvm_sw + RADIO_CFG);
439 else 467
440 return le32_to_cpup((__le32 *)(nvm_sw + RADIO_CFG_FAMILY_8000)); 468 return le32_to_cpup((__le32 *)(nvm_sw + RADIO_CFG_FAMILY_8000));
469
441} 470}
442 471
443#define N_HW_ADDRS_MASK_FAMILY_8000 0xF 472static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg, const __le16 *nvm_sw)
444static int iwl_get_n_hw_addrs(const struct iwl_cfg *cfg,
445 const __le16 *nvm_sw)
446{ 473{
474 int n_hw_addr;
475
447 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) 476 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
448 return le16_to_cpup(nvm_sw + N_HW_ADDRS); 477 return le16_to_cpup(nvm_sw + N_HW_ADDRS);
449 else 478
450 return le32_to_cpup((__le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000)) 479 n_hw_addr = le32_to_cpup((__le32 *)(nvm_sw + N_HW_ADDRS_FAMILY_8000));
451 & N_HW_ADDRS_MASK_FAMILY_8000; 480
481 return n_hw_addr & N_HW_ADDR_MASK;
452} 482}
453 483
454static void iwl_set_radio_cfg(const struct iwl_cfg *cfg, 484static void iwl_set_radio_cfg(const struct iwl_cfg *cfg,
@@ -491,7 +521,8 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
491 const struct iwl_cfg *cfg, 521 const struct iwl_cfg *cfg,
492 struct iwl_nvm_data *data, 522 struct iwl_nvm_data *data,
493 const __le16 *mac_override, 523 const __le16 *mac_override,
494 const __le16 *nvm_hw) 524 const __le16 *nvm_hw,
525 u32 mac_addr0, u32 mac_addr1)
495{ 526{
496 const u8 *hw_addr; 527 const u8 *hw_addr;
497 528
@@ -515,48 +546,17 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
515 } 546 }
516 547
517 if (nvm_hw) { 548 if (nvm_hw) {
518 /* read the MAC address from OTP */ 549 /* read the MAC address from HW resisters */
519 if (!dev_is_pci(dev) || (data->nvm_version < 0xE08)) { 550 hw_addr = (const u8 *)&mac_addr0;
520 /* read the mac address from the WFPM location */ 551 data->hw_addr[0] = hw_addr[3];
521 hw_addr = (const u8 *)(nvm_hw + 552 data->hw_addr[1] = hw_addr[2];
522 HW_ADDR0_WFPM_FAMILY_8000); 553 data->hw_addr[2] = hw_addr[1];
523 data->hw_addr[0] = hw_addr[3]; 554 data->hw_addr[3] = hw_addr[0];
524 data->hw_addr[1] = hw_addr[2]; 555
525 data->hw_addr[2] = hw_addr[1]; 556 hw_addr = (const u8 *)&mac_addr1;
526 data->hw_addr[3] = hw_addr[0]; 557 data->hw_addr[4] = hw_addr[1];
527 558 data->hw_addr[5] = hw_addr[0];
528 hw_addr = (const u8 *)(nvm_hw + 559
529 HW_ADDR1_WFPM_FAMILY_8000);
530 data->hw_addr[4] = hw_addr[1];
531 data->hw_addr[5] = hw_addr[0];
532 } else if ((data->nvm_version >= 0xE08) &&
533 (data->nvm_version < 0xE0B)) {
534 /* read "reverse order" from the PCIe location */
535 hw_addr = (const u8 *)(nvm_hw +
536 HW_ADDR0_PCIE_FAMILY_8000);
537 data->hw_addr[5] = hw_addr[2];
538 data->hw_addr[4] = hw_addr[1];
539 data->hw_addr[3] = hw_addr[0];
540
541 hw_addr = (const u8 *)(nvm_hw +
542 HW_ADDR1_PCIE_FAMILY_8000);
543 data->hw_addr[2] = hw_addr[3];
544 data->hw_addr[1] = hw_addr[2];
545 data->hw_addr[0] = hw_addr[1];
546 } else {
547 /* read from the PCIe location */
548 hw_addr = (const u8 *)(nvm_hw +
549 HW_ADDR0_PCIE_FAMILY_8000);
550 data->hw_addr[5] = hw_addr[0];
551 data->hw_addr[4] = hw_addr[1];
552 data->hw_addr[3] = hw_addr[2];
553
554 hw_addr = (const u8 *)(nvm_hw +
555 HW_ADDR1_PCIE_FAMILY_8000);
556 data->hw_addr[2] = hw_addr[1];
557 data->hw_addr[1] = hw_addr[2];
558 data->hw_addr[0] = hw_addr[3];
559 }
560 if (!is_valid_ether_addr(data->hw_addr)) 560 if (!is_valid_ether_addr(data->hw_addr))
561 IWL_ERR_DEV(dev, 561 IWL_ERR_DEV(dev,
562 "mac address from hw section is not valid\n"); 562 "mac address from hw section is not valid\n");
@@ -571,11 +571,14 @@ struct iwl_nvm_data *
571iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg, 571iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
572 const __le16 *nvm_hw, const __le16 *nvm_sw, 572 const __le16 *nvm_hw, const __le16 *nvm_sw,
573 const __le16 *nvm_calib, const __le16 *regulatory, 573 const __le16 *nvm_calib, const __le16 *regulatory,
574 const __le16 *mac_override, u8 tx_chains, u8 rx_chains) 574 const __le16 *mac_override, const __le16 *phy_sku,
575 u8 tx_chains, u8 rx_chains, bool lar_fw_supported,
576 u32 mac_addr0, u32 mac_addr1)
575{ 577{
576 struct iwl_nvm_data *data; 578 struct iwl_nvm_data *data;
577 u32 sku; 579 u32 sku;
578 u32 radio_cfg; 580 u32 radio_cfg;
581 u16 lar_config;
579 582
580 if (cfg->device_family != IWL_DEVICE_FAMILY_8000) 583 if (cfg->device_family != IWL_DEVICE_FAMILY_8000)
581 data = kzalloc(sizeof(*data) + 584 data = kzalloc(sizeof(*data) +
@@ -592,20 +595,21 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
592 595
593 data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw); 596 data->nvm_version = iwl_get_nvm_version(cfg, nvm_sw);
594 597
595 radio_cfg = iwl_get_radio_cfg(cfg, nvm_sw); 598 radio_cfg = iwl_get_radio_cfg(cfg, nvm_sw, phy_sku);
596 iwl_set_radio_cfg(cfg, data, radio_cfg); 599 iwl_set_radio_cfg(cfg, data, radio_cfg);
597 if (data->valid_tx_ant) 600 if (data->valid_tx_ant)
598 tx_chains &= data->valid_tx_ant; 601 tx_chains &= data->valid_tx_ant;
599 if (data->valid_rx_ant) 602 if (data->valid_rx_ant)
600 rx_chains &= data->valid_rx_ant; 603 rx_chains &= data->valid_rx_ant;
601 604
602 sku = iwl_get_sku(cfg, nvm_sw); 605 sku = iwl_get_sku(cfg, nvm_sw, phy_sku);
603 data->sku_cap_band_24GHz_enable = sku & NVM_SKU_CAP_BAND_24GHZ; 606 data->sku_cap_band_24GHz_enable = sku & NVM_SKU_CAP_BAND_24GHZ;
604 data->sku_cap_band_52GHz_enable = sku & NVM_SKU_CAP_BAND_52GHZ; 607 data->sku_cap_band_52GHz_enable = sku & NVM_SKU_CAP_BAND_52GHZ;
605 data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE; 608 data->sku_cap_11n_enable = sku & NVM_SKU_CAP_11N_ENABLE;
606 data->sku_cap_11ac_enable = sku & NVM_SKU_CAP_11AC_ENABLE;
607 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL) 609 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_ALL)
608 data->sku_cap_11n_enable = false; 610 data->sku_cap_11n_enable = false;
611 data->sku_cap_11ac_enable = data->sku_cap_11n_enable &&
612 (sku & NVM_SKU_CAP_11AC_ENABLE);
609 613
610 data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw); 614 data->n_hw_addrs = iwl_get_n_hw_addrs(cfg, nvm_sw);
611 615
@@ -626,16 +630,23 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
626 iwl_set_hw_address(cfg, data, nvm_hw); 630 iwl_set_hw_address(cfg, data, nvm_hw);
627 631
628 iwl_init_sbands(dev, cfg, data, nvm_sw, 632 iwl_init_sbands(dev, cfg, data, nvm_sw,
629 sku & NVM_SKU_CAP_11AC_ENABLE, tx_chains, 633 tx_chains, rx_chains, lar_fw_supported);
630 rx_chains);
631 } else { 634 } else {
635 u16 lar_offset = data->nvm_version < 0xE39 ?
636 NVM_LAR_OFFSET_FAMILY_8000_OLD :
637 NVM_LAR_OFFSET_FAMILY_8000;
638
639 lar_config = le16_to_cpup(regulatory + lar_offset);
640 data->lar_enabled = !!(lar_config &
641 NVM_LAR_ENABLED_FAMILY_8000);
642
632 /* MAC address in family 8000 */ 643 /* MAC address in family 8000 */
633 iwl_set_hw_address_family_8000(dev, cfg, data, mac_override, 644 iwl_set_hw_address_family_8000(dev, cfg, data, mac_override,
634 nvm_hw); 645 nvm_hw, mac_addr0, mac_addr1);
635 646
636 iwl_init_sbands(dev, cfg, data, regulatory, 647 iwl_init_sbands(dev, cfg, data, regulatory,
637 sku & NVM_SKU_CAP_11AC_ENABLE, tx_chains, 648 tx_chains, rx_chains,
638 rx_chains); 649 lar_fw_supported && data->lar_enabled);
639 } 650 }
640 651
641 data->calib_version = 255; 652 data->calib_version = 255;
@@ -643,3 +654,164 @@ iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
643 return data; 654 return data;
644} 655}
645IWL_EXPORT_SYMBOL(iwl_parse_nvm_data); 656IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);
657
658static u32 iwl_nvm_get_regdom_bw_flags(const u8 *nvm_chan,
659 int ch_idx, u16 nvm_flags,
660 const struct iwl_cfg *cfg)
661{
662 u32 flags = NL80211_RRF_NO_HT40;
663 u32 last_5ghz_ht = LAST_5GHZ_HT;
664
665 if (cfg->device_family == IWL_DEVICE_FAMILY_8000)
666 last_5ghz_ht = LAST_5GHZ_HT_FAMILY_8000;
667
668 if (ch_idx < NUM_2GHZ_CHANNELS &&
669 (nvm_flags & NVM_CHANNEL_40MHZ)) {
670 if (nvm_chan[ch_idx] <= LAST_2GHZ_HT_PLUS)
671 flags &= ~NL80211_RRF_NO_HT40PLUS;
672 if (nvm_chan[ch_idx] >= FIRST_2GHZ_HT_MINUS)
673 flags &= ~NL80211_RRF_NO_HT40MINUS;
674 } else if (nvm_chan[ch_idx] <= last_5ghz_ht &&
675 (nvm_flags & NVM_CHANNEL_40MHZ)) {
676 if ((ch_idx - NUM_2GHZ_CHANNELS) % 2 == 0)
677 flags &= ~NL80211_RRF_NO_HT40PLUS;
678 else
679 flags &= ~NL80211_RRF_NO_HT40MINUS;
680 }
681
682 if (!(nvm_flags & NVM_CHANNEL_80MHZ))
683 flags |= NL80211_RRF_NO_80MHZ;
684 if (!(nvm_flags & NVM_CHANNEL_160MHZ))
685 flags |= NL80211_RRF_NO_160MHZ;
686
687 if (!(nvm_flags & NVM_CHANNEL_ACTIVE))
688 flags |= NL80211_RRF_NO_IR;
689
690 if (nvm_flags & NVM_CHANNEL_RADAR)
691 flags |= NL80211_RRF_DFS;
692
693 if (nvm_flags & NVM_CHANNEL_INDOOR_ONLY)
694 flags |= NL80211_RRF_NO_OUTDOOR;
695
696 /* Set the GO concurrent flag only in case that NO_IR is set.
697 * Otherwise it is meaningless
698 */
699 if ((nvm_flags & NVM_CHANNEL_GO_CONCURRENT) &&
700 (flags & NL80211_RRF_NO_IR))
701 flags |= NL80211_RRF_GO_CONCURRENT;
702
703 return flags;
704}
705
706struct ieee80211_regdomain *
707iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
708 int num_of_ch, __le32 *channels, u16 fw_mcc)
709{
710 int ch_idx;
711 u16 ch_flags, prev_ch_flags = 0;
712 const u8 *nvm_chan = cfg->device_family == IWL_DEVICE_FAMILY_8000 ?
713 iwl_nvm_channels_family_8000 : iwl_nvm_channels;
714 struct ieee80211_regdomain *regd;
715 int size_of_regd;
716 struct ieee80211_reg_rule *rule;
717 enum ieee80211_band band;
718 int center_freq, prev_center_freq = 0;
719 int valid_rules = 0;
720 bool new_rule;
721 int max_num_ch = cfg->device_family == IWL_DEVICE_FAMILY_8000 ?
722 IWL_NUM_CHANNELS_FAMILY_8000 : IWL_NUM_CHANNELS;
723
724 if (WARN_ON_ONCE(num_of_ch > NL80211_MAX_SUPP_REG_RULES))
725 return ERR_PTR(-EINVAL);
726
727 if (WARN_ON(num_of_ch > max_num_ch))
728 num_of_ch = max_num_ch;
729
730 IWL_DEBUG_DEV(dev, IWL_DL_LAR, "building regdom for %d channels\n",
731 num_of_ch);
732
733 /* build a regdomain rule for every valid channel */
734 size_of_regd =
735 sizeof(struct ieee80211_regdomain) +
736 num_of_ch * sizeof(struct ieee80211_reg_rule);
737
738 regd = kzalloc(size_of_regd, GFP_KERNEL);
739 if (!regd)
740 return ERR_PTR(-ENOMEM);
741
742 for (ch_idx = 0; ch_idx < num_of_ch; ch_idx++) {
743 ch_flags = (u16)__le32_to_cpup(channels + ch_idx);
744 band = (ch_idx < NUM_2GHZ_CHANNELS) ?
745 IEEE80211_BAND_2GHZ : IEEE80211_BAND_5GHZ;
746 center_freq = ieee80211_channel_to_frequency(nvm_chan[ch_idx],
747 band);
748 new_rule = false;
749
750 if (!(ch_flags & NVM_CHANNEL_VALID)) {
751 IWL_DEBUG_DEV(dev, IWL_DL_LAR,
752 "Ch. %d Flags %x [%sGHz] - No traffic\n",
753 nvm_chan[ch_idx],
754 ch_flags,
755 (ch_idx >= NUM_2GHZ_CHANNELS) ?
756 "5.2" : "2.4");
757 continue;
758 }
759
760 /* we can't continue the same rule */
761 if (ch_idx == 0 || prev_ch_flags != ch_flags ||
762 center_freq - prev_center_freq > 20) {
763 valid_rules++;
764 new_rule = true;
765 }
766
767 rule = &regd->reg_rules[valid_rules - 1];
768
769 if (new_rule)
770 rule->freq_range.start_freq_khz =
771 MHZ_TO_KHZ(center_freq - 10);
772
773 rule->freq_range.end_freq_khz = MHZ_TO_KHZ(center_freq + 10);
774
775 /* this doesn't matter - not used by FW */
776 rule->power_rule.max_antenna_gain = DBI_TO_MBI(6);
777 rule->power_rule.max_eirp =
778 DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER);
779
780 rule->flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
781 ch_flags, cfg);
782
783 /* rely on auto-calculation to merge BW of contiguous chans */
784 rule->flags |= NL80211_RRF_AUTO_BW;
785 rule->freq_range.max_bandwidth_khz = 0;
786
787 prev_ch_flags = ch_flags;
788 prev_center_freq = center_freq;
789
790 IWL_DEBUG_DEV(dev, IWL_DL_LAR,
791 "Ch. %d [%sGHz] %s%s%s%s%s%s%s%s%s(0x%02x): Ad-Hoc %ssupported\n",
792 center_freq,
793 band == IEEE80211_BAND_5GHZ ? "5.2" : "2.4",
794 CHECK_AND_PRINT_I(VALID),
795 CHECK_AND_PRINT_I(ACTIVE),
796 CHECK_AND_PRINT_I(RADAR),
797 CHECK_AND_PRINT_I(WIDE),
798 CHECK_AND_PRINT_I(40MHZ),
799 CHECK_AND_PRINT_I(80MHZ),
800 CHECK_AND_PRINT_I(160MHZ),
801 CHECK_AND_PRINT_I(INDOOR_ONLY),
802 CHECK_AND_PRINT_I(GO_CONCURRENT),
803 ch_flags,
804 ((ch_flags & NVM_CHANNEL_ACTIVE) &&
805 !(ch_flags & NVM_CHANNEL_RADAR))
806 ? "" : "not ");
807 }
808
809 regd->n_reg_rules = valid_rules;
810
811 /* set alpha2 from FW. */
812 regd->alpha2[0] = fw_mcc >> 8;
813 regd->alpha2[1] = fw_mcc & 0xff;
814
815 return regd;
816}
817IWL_EXPORT_SYMBOL(iwl_parse_nvm_mcc_info);
diff --git a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.h b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.h
index c9c45a39d212..822ba52e0e5a 100644
--- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.h
+++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.h
@@ -62,6 +62,7 @@
62#ifndef __iwl_nvm_parse_h__ 62#ifndef __iwl_nvm_parse_h__
63#define __iwl_nvm_parse_h__ 63#define __iwl_nvm_parse_h__
64 64
65#include <net/cfg80211.h>
65#include "iwl-eeprom-parse.h" 66#include "iwl-eeprom-parse.h"
66 67
67/** 68/**
@@ -76,6 +77,21 @@ struct iwl_nvm_data *
76iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg, 77iwl_parse_nvm_data(struct device *dev, const struct iwl_cfg *cfg,
77 const __le16 *nvm_hw, const __le16 *nvm_sw, 78 const __le16 *nvm_hw, const __le16 *nvm_sw,
78 const __le16 *nvm_calib, const __le16 *regulatory, 79 const __le16 *nvm_calib, const __le16 *regulatory,
79 const __le16 *mac_override, u8 tx_chains, u8 rx_chains); 80 const __le16 *mac_override, const __le16 *phy_sku,
81 u8 tx_chains, u8 rx_chains, bool lar_fw_supported,
82 u32 mac_addr0, u32 mac_addr1);
83
84/**
85 * iwl_parse_mcc_info - parse MCC (mobile country code) info coming from FW
86 *
87 * This function parses the regulatory channel data received as a
88 * MCC_UPDATE_CMD command. It returns a newly allocation regulatory domain,
89 * to be fed into the regulatory core. An ERR_PTR is returned on error.
90 * If not given to the regulatory core, the user is responsible for freeing
91 * the regdomain returned here with kfree.
92 */
93struct ieee80211_regdomain *
94iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
95 int num_of_ch, __le32 *channels, u16 fw_mcc);
80 96
81#endif /* __iwl_nvm_parse_h__ */ 97#endif /* __iwl_nvm_parse_h__ */
diff --git a/drivers/net/wireless/iwlwifi/iwl-op-mode.h b/drivers/net/wireless/iwlwifi/iwl-op-mode.h
index 17de6d46222a..ce1cdd7604e8 100644
--- a/drivers/net/wireless/iwlwifi/iwl-op-mode.h
+++ b/drivers/net/wireless/iwlwifi/iwl-op-mode.h
@@ -94,7 +94,7 @@ struct iwl_cfg;
94 * The operational mode has a very simple life cycle. 94 * The operational mode has a very simple life cycle.
95 * 95 *
96 * 1) The driver layer (iwl-drv.c) chooses the op_mode based on the 96 * 1) The driver layer (iwl-drv.c) chooses the op_mode based on the
97 * capabilities advertized by the fw file (in TLV format). 97 * capabilities advertised by the fw file (in TLV format).
98 * 2) The driver layer starts the op_mode (ops->start) 98 * 2) The driver layer starts the op_mode (ops->start)
99 * 3) The op_mode registers mac80211 99 * 3) The op_mode registers mac80211
100 * 4) The op_mode is governed by mac80211 100 * 4) The op_mode is governed by mac80211
@@ -116,7 +116,7 @@ struct iwl_cfg;
116 * May sleep 116 * May sleep
117 * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the 117 * @rx: Rx notification to the op_mode. rxb is the Rx buffer itself. Cmd is the
118 * HCMD this Rx responds to. Can't sleep. 118 * HCMD this Rx responds to. Can't sleep.
119 * @napi_add: NAPI initialisation. The transport is fully responsible for NAPI, 119 * @napi_add: NAPI initialization. The transport is fully responsible for NAPI,
120 * but the higher layers need to know about it (in particular mac80211 to 120 * but the higher layers need to know about it (in particular mac80211 to
121 * to able to call the right NAPI RX functions); this function is needed 121 * to able to call the right NAPI RX functions); this function is needed
122 * to eventually call netif_napi_add() with higher layer involvement. 122 * to eventually call netif_napi_add() with higher layer involvement.
diff --git a/drivers/net/wireless/iwlwifi/iwl-phy-db.c b/drivers/net/wireless/iwlwifi/iwl-phy-db.c
index d4fb5cad07ea..a105455b6a24 100644
--- a/drivers/net/wireless/iwlwifi/iwl-phy-db.c
+++ b/drivers/net/wireless/iwlwifi/iwl-phy-db.c
@@ -72,7 +72,7 @@
72#include "iwl-trans.h" 72#include "iwl-trans.h"
73 73
74#define CHANNEL_NUM_SIZE 4 /* num of channels in calib_ch size */ 74#define CHANNEL_NUM_SIZE 4 /* num of channels in calib_ch size */
75#define IWL_NUM_PAPD_CH_GROUPS 7 75#define IWL_NUM_PAPD_CH_GROUPS 9
76#define IWL_NUM_TXP_CH_GROUPS 9 76#define IWL_NUM_TXP_CH_GROUPS 9
77 77
78struct iwl_phy_db_entry { 78struct iwl_phy_db_entry {
@@ -125,7 +125,7 @@ struct iwl_phy_db_chg_txp {
125} __packed; 125} __packed;
126 126
127/* 127/*
128 * phy db - Receieve phy db chunk after calibrations 128 * phy db - Receive phy db chunk after calibrations
129 */ 129 */
130struct iwl_calib_res_notif_phy_db { 130struct iwl_calib_res_notif_phy_db {
131 __le16 type; 131 __le16 type;
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h
index 6221e4dfc64f..88a57e6e232f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-prph.h
+++ b/drivers/net/wireless/iwlwifi/iwl-prph.h
@@ -110,8 +110,8 @@
110#define DEVICE_SET_NMI_REG 0x00a01c30 110#define DEVICE_SET_NMI_REG 0x00a01c30
111#define DEVICE_SET_NMI_VAL_HW BIT(0) 111#define DEVICE_SET_NMI_VAL_HW BIT(0)
112#define DEVICE_SET_NMI_VAL_DRV BIT(7) 112#define DEVICE_SET_NMI_VAL_DRV BIT(7)
113#define DEVICE_SET_NMI_8000B_REG 0x00a01c24 113#define DEVICE_SET_NMI_8000_REG 0x00a01c24
114#define DEVICE_SET_NMI_8000B_VAL 0x1000000 114#define DEVICE_SET_NMI_8000_VAL 0x1000000
115 115
116/* Shared registers (0x0..0x3ff, via target indirect or periphery */ 116/* Shared registers (0x0..0x3ff, via target indirect or periphery */
117#define SHR_BASE 0x00a10000 117#define SHR_BASE 0x00a10000
@@ -295,25 +295,6 @@
295#define OSC_CLK (0xa04068) 295#define OSC_CLK (0xa04068)
296#define OSC_CLK_FORCE_CONTROL (0x8) 296#define OSC_CLK_FORCE_CONTROL (0x8)
297 297
298/* SECURE boot registers */
299#define LMPM_SECURE_BOOT_CONFIG_ADDR (0x100)
300enum secure_boot_config_reg {
301 LMPM_SECURE_BOOT_CONFIG_INSPECTOR_BURNED_IN_OTP = 0x00000001,
302 LMPM_SECURE_BOOT_CONFIG_INSPECTOR_NOT_REQ = 0x00000002,
303};
304
305#define LMPM_SECURE_BOOT_CPU1_STATUS_ADDR_B0 (0xA01E30)
306#define LMPM_SECURE_BOOT_CPU1_STATUS_ADDR (0x1E30)
307#define LMPM_SECURE_BOOT_CPU2_STATUS_ADDR (0x1E34)
308enum secure_boot_status_reg {
309 LMPM_SECURE_BOOT_CPU_STATUS_VERF_STATUS = 0x00000001,
310 LMPM_SECURE_BOOT_CPU_STATUS_VERF_COMPLETED = 0x00000002,
311 LMPM_SECURE_BOOT_CPU_STATUS_VERF_SUCCESS = 0x00000004,
312 LMPM_SECURE_BOOT_CPU_STATUS_VERF_FAIL = 0x00000008,
313 LMPM_SECURE_BOOT_CPU_STATUS_SIGN_VERF_FAIL = 0x00000010,
314 LMPM_SECURE_BOOT_STATUS_SUCCESS = 0x00000003,
315};
316
317#define FH_UCODE_LOAD_STATUS (0x1AF0) 298#define FH_UCODE_LOAD_STATUS (0x1AF0)
318#define CSR_UCODE_LOAD_STATUS_ADDR (0x1E70) 299#define CSR_UCODE_LOAD_STATUS_ADDR (0x1E70)
319enum secure_load_status_reg { 300enum secure_load_status_reg {
@@ -334,8 +315,6 @@ enum secure_load_status_reg {
334#define LMPM_SECURE_CPU1_HDR_MEM_SPACE (0x420000) 315#define LMPM_SECURE_CPU1_HDR_MEM_SPACE (0x420000)
335#define LMPM_SECURE_CPU2_HDR_MEM_SPACE (0x420400) 316#define LMPM_SECURE_CPU2_HDR_MEM_SPACE (0x420400)
336 317
337#define LMPM_SECURE_TIME_OUT (100) /* 10 micro */
338
339/* Rx FIFO */ 318/* Rx FIFO */
340#define RXF_SIZE_ADDR (0xa00c88) 319#define RXF_SIZE_ADDR (0xa00c88)
341#define RXF_RD_D_SPACE (0xa00c40) 320#define RXF_RD_D_SPACE (0xa00c40)
@@ -370,7 +349,33 @@ enum secure_load_status_reg {
370#define MON_BUFF_CYCLE_CNT (0xa03c48) 349#define MON_BUFF_CYCLE_CNT (0xa03c48)
371 350
372#define DBGC_IN_SAMPLE (0xa03c00) 351#define DBGC_IN_SAMPLE (0xa03c00)
373#define DBGC_OUT_CTRL (0xa03c0c) 352
353/* enable the ID buf for read */
354#define WFPM_PS_CTL_CLR 0xA0300C
355#define WFMP_MAC_ADDR_0 0xA03080
356#define WFMP_MAC_ADDR_1 0xA03084
357#define LMPM_PMG_EN 0xA01CEC
358#define RADIO_REG_SYS_MANUAL_DFT_0 0xAD4078
359#define RFIC_REG_RD 0xAD0470
360#define WFPM_CTRL_REG 0xA03030
361enum {
362 ENABLE_WFPM = BIT(31),
363 WFPM_AUX_CTL_AUX_IF_MAC_OWNER_MSK = 0x80000000,
364};
365
366#define AUX_MISC_REG 0xA200B0
367enum {
368 HW_STEP_LOCATION_BITS = 24,
369};
370
371#define AUX_MISC_MASTER1_EN 0xA20818
372enum aux_misc_master1_en {
373 AUX_MISC_MASTER1_EN_SBE_MSK = 0x1,
374};
375
376#define AUX_MISC_MASTER1_SMPHR_STATUS 0xA20800
377#define RSA_ENABLE 0xA24B08
378#define PREG_AUX_BUS_WPROT_0 0xA04CC0
374 379
375/* FW chicken bits */ 380/* FW chicken bits */
376#define LMPM_CHICK 0xA01FF8 381#define LMPM_CHICK 0xA01FF8
diff --git a/drivers/net/wireless/iwlwifi/iwl-trans.h b/drivers/net/wireless/iwlwifi/iwl-trans.h
index a96bd8db6ceb..6dfed1259260 100644
--- a/drivers/net/wireless/iwlwifi/iwl-trans.h
+++ b/drivers/net/wireless/iwlwifi/iwl-trans.h
@@ -77,10 +77,10 @@
77/** 77/**
78 * DOC: Transport layer - what is it ? 78 * DOC: Transport layer - what is it ?
79 * 79 *
80 * The tranport layer is the layer that deals with the HW directly. It provides 80 * The transport layer is the layer that deals with the HW directly. It provides
81 * an abstraction of the underlying HW to the upper layer. The transport layer 81 * an abstraction of the underlying HW to the upper layer. The transport layer
82 * doesn't provide any policy, algorithm or anything of this kind, but only 82 * doesn't provide any policy, algorithm or anything of this kind, but only
83 * mechanisms to make the HW do something.It is not completely stateless but 83 * mechanisms to make the HW do something. It is not completely stateless but
84 * close to it. 84 * close to it.
85 * We will have an implementation for each different supported bus. 85 * We will have an implementation for each different supported bus.
86 */ 86 */
@@ -111,10 +111,10 @@
111/** 111/**
112 * DOC: Host command section 112 * DOC: Host command section
113 * 113 *
114 * A host command is a commaned issued by the upper layer to the fw. There are 114 * A host command is a command issued by the upper layer to the fw. There are
115 * several versions of fw that have several APIs. The transport layer is 115 * several versions of fw that have several APIs. The transport layer is
116 * completely agnostic to these differences. 116 * completely agnostic to these differences.
117 * The transport does provide helper functionnality (i.e. SYNC / ASYNC mode), 117 * The transport does provide helper functionality (i.e. SYNC / ASYNC mode),
118 */ 118 */
119#define SEQ_TO_QUEUE(s) (((s) >> 8) & 0x1f) 119#define SEQ_TO_QUEUE(s) (((s) >> 8) & 0x1f)
120#define QUEUE_TO_SEQ(q) (((q) & 0x1f) << 8) 120#define QUEUE_TO_SEQ(q) (((q) & 0x1f) << 8)
@@ -195,7 +195,7 @@ static inline u32 iwl_rx_packet_payload_len(const struct iwl_rx_packet *pkt)
195 * @CMD_WANT_SKB: Not valid with CMD_ASYNC. The caller needs the buffer of 195 * @CMD_WANT_SKB: Not valid with CMD_ASYNC. The caller needs the buffer of
196 * the response. The caller needs to call iwl_free_resp when done. 196 * the response. The caller needs to call iwl_free_resp when done.
197 * @CMD_HIGH_PRIO: The command is high priority - it goes to the front of the 197 * @CMD_HIGH_PRIO: The command is high priority - it goes to the front of the
198 * command queue, but after other high priority commands. valid only 198 * command queue, but after other high priority commands. Valid only
199 * with CMD_ASYNC. 199 * with CMD_ASYNC.
200 * @CMD_SEND_IN_IDLE: The command should be sent even when the trans is idle. 200 * @CMD_SEND_IN_IDLE: The command should be sent even when the trans is idle.
201 * @CMD_MAKE_TRANS_IDLE: The command response should mark the trans as idle. 201 * @CMD_MAKE_TRANS_IDLE: The command response should mark the trans as idle.
@@ -458,6 +458,8 @@ struct iwl_trans_txq_scd_cfg {
458 * @txq_disable: de-configure a Tx queue to send AMPDUs 458 * @txq_disable: de-configure a Tx queue to send AMPDUs
459 * Must be atomic 459 * Must be atomic
460 * @wait_tx_queue_empty: wait until tx queues are empty. May sleep. 460 * @wait_tx_queue_empty: wait until tx queues are empty. May sleep.
461 * @freeze_txq_timer: prevents the timer of the queue from firing until the
462 * queue is set to awake. Must be atomic.
461 * @dbgfs_register: add the dbgfs files under this directory. Files will be 463 * @dbgfs_register: add the dbgfs files under this directory. Files will be
462 * automatically deleted. 464 * automatically deleted.
463 * @write8: write a u8 to a register at offset ofs from the BAR 465 * @write8: write a u8 to a register at offset ofs from the BAR
@@ -517,6 +519,8 @@ struct iwl_trans_ops {
517 519
518 int (*dbgfs_register)(struct iwl_trans *trans, struct dentry* dir); 520 int (*dbgfs_register)(struct iwl_trans *trans, struct dentry* dir);
519 int (*wait_tx_queue_empty)(struct iwl_trans *trans, u32 txq_bm); 521 int (*wait_tx_queue_empty)(struct iwl_trans *trans, u32 txq_bm);
522 void (*freeze_txq_timer)(struct iwl_trans *trans, unsigned long txqs,
523 bool freeze);
520 524
521 void (*write8)(struct iwl_trans *trans, u32 ofs, u8 val); 525 void (*write8)(struct iwl_trans *trans, u32 ofs, u8 val);
522 void (*write32)(struct iwl_trans *trans, u32 ofs, u32 val); 526 void (*write32)(struct iwl_trans *trans, u32 ofs, u32 val);
@@ -578,7 +582,7 @@ enum iwl_d0i3_mode {
578 * @cfg - pointer to the configuration 582 * @cfg - pointer to the configuration
579 * @status: a bit-mask of transport status flags 583 * @status: a bit-mask of transport status flags
580 * @dev - pointer to struct device * that represents the device 584 * @dev - pointer to struct device * that represents the device
581 * @hw_id: a u32 with the ID of the device / subdevice. 585 * @hw_id: a u32 with the ID of the device / sub-device.
582 * Set during transport allocation. 586 * Set during transport allocation.
583 * @hw_id_str: a string with info about HW ID. Set during transport allocation. 587 * @hw_id_str: a string with info about HW ID. Set during transport allocation.
584 * @pm_support: set to true in start_hw if link pm is supported 588 * @pm_support: set to true in start_hw if link pm is supported
@@ -595,6 +599,7 @@ enum iwl_d0i3_mode {
595 * @dflt_pwr_limit: default power limit fetched from the platform (ACPI) 599 * @dflt_pwr_limit: default power limit fetched from the platform (ACPI)
596 * @dbg_dest_tlv: points to the destination TLV for debug 600 * @dbg_dest_tlv: points to the destination TLV for debug
597 * @dbg_conf_tlv: array of pointers to configuration TLVs for debug 601 * @dbg_conf_tlv: array of pointers to configuration TLVs for debug
602 * @dbg_trigger_tlv: array of pointers to triggers TLVs for debug
598 * @dbg_dest_reg_num: num of reg_ops in %dbg_dest_tlv 603 * @dbg_dest_reg_num: num of reg_ops in %dbg_dest_tlv
599 */ 604 */
600struct iwl_trans { 605struct iwl_trans {
@@ -628,7 +633,8 @@ struct iwl_trans {
628 u64 dflt_pwr_limit; 633 u64 dflt_pwr_limit;
629 634
630 const struct iwl_fw_dbg_dest_tlv *dbg_dest_tlv; 635 const struct iwl_fw_dbg_dest_tlv *dbg_dest_tlv;
631 const struct iwl_fw_dbg_conf_tlv *dbg_conf_tlv[FW_DBG_MAX]; 636 const struct iwl_fw_dbg_conf_tlv *dbg_conf_tlv[FW_DBG_CONF_MAX];
637 struct iwl_fw_dbg_trigger_tlv * const *dbg_trigger_tlv;
632 u8 dbg_dest_reg_num; 638 u8 dbg_dest_reg_num;
633 639
634 enum iwl_d0i3_mode d0i3_mode; 640 enum iwl_d0i3_mode d0i3_mode;
@@ -871,6 +877,17 @@ void iwl_trans_ac_txq_enable(struct iwl_trans *trans, int queue, int fifo,
871 iwl_trans_txq_enable_cfg(trans, queue, 0, &cfg, queue_wdg_timeout); 877 iwl_trans_txq_enable_cfg(trans, queue, 0, &cfg, queue_wdg_timeout);
872} 878}
873 879
880static inline void iwl_trans_freeze_txq_timer(struct iwl_trans *trans,
881 unsigned long txqs,
882 bool freeze)
883{
884 if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
885 IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
886
887 if (trans->ops->freeze_txq_timer)
888 trans->ops->freeze_txq_timer(trans, txqs, freeze);
889}
890
874static inline int iwl_trans_wait_tx_queue_empty(struct iwl_trans *trans, 891static inline int iwl_trans_wait_tx_queue_empty(struct iwl_trans *trans,
875 u32 txqs) 892 u32 txqs)
876{ 893{
diff --git a/drivers/net/wireless/iwlwifi/mvm/coex.c b/drivers/net/wireless/iwlwifi/mvm/coex.c
index 7810c41cf9a7..13a0a03158de 100644
--- a/drivers/net/wireless/iwlwifi/mvm/coex.c
+++ b/drivers/net/wireless/iwlwifi/mvm/coex.c
@@ -72,158 +72,6 @@
72#include "mvm.h" 72#include "mvm.h"
73#include "iwl-debug.h" 73#include "iwl-debug.h"
74 74
75const u32 iwl_bt_ctl_kill_msk[BT_KILL_MSK_MAX] = {
76 [BT_KILL_MSK_DEFAULT] = 0xfffffc00,
77 [BT_KILL_MSK_NEVER] = 0xffffffff,
78 [BT_KILL_MSK_ALWAYS] = 0,
79};
80
81const u8 iwl_bt_cts_kill_msk[BT_MAX_AG][BT_COEX_MAX_LUT] = {
82 {
83 BT_KILL_MSK_ALWAYS,
84 BT_KILL_MSK_ALWAYS,
85 BT_KILL_MSK_ALWAYS,
86 },
87 {
88 BT_KILL_MSK_NEVER,
89 BT_KILL_MSK_NEVER,
90 BT_KILL_MSK_NEVER,
91 },
92 {
93 BT_KILL_MSK_NEVER,
94 BT_KILL_MSK_NEVER,
95 BT_KILL_MSK_NEVER,
96 },
97 {
98 BT_KILL_MSK_DEFAULT,
99 BT_KILL_MSK_NEVER,
100 BT_KILL_MSK_DEFAULT,
101 },
102};
103
104const u8 iwl_bt_ack_kill_msk[BT_MAX_AG][BT_COEX_MAX_LUT] = {
105 {
106 BT_KILL_MSK_ALWAYS,
107 BT_KILL_MSK_ALWAYS,
108 BT_KILL_MSK_ALWAYS,
109 },
110 {
111 BT_KILL_MSK_ALWAYS,
112 BT_KILL_MSK_ALWAYS,
113 BT_KILL_MSK_ALWAYS,
114 },
115 {
116 BT_KILL_MSK_ALWAYS,
117 BT_KILL_MSK_ALWAYS,
118 BT_KILL_MSK_ALWAYS,
119 },
120 {
121 BT_KILL_MSK_DEFAULT,
122 BT_KILL_MSK_ALWAYS,
123 BT_KILL_MSK_DEFAULT,
124 },
125};
126
127static const __le32 iwl_bt_prio_boost[BT_COEX_BOOST_SIZE] = {
128 cpu_to_le32(0xf0f0f0f0), /* 50% */
129 cpu_to_le32(0xc0c0c0c0), /* 25% */
130 cpu_to_le32(0xfcfcfcfc), /* 75% */
131 cpu_to_le32(0xfefefefe), /* 87.5% */
132};
133
134static const __le32 iwl_single_shared_ant[BT_COEX_MAX_LUT][BT_COEX_LUT_SIZE] = {
135 {
136 cpu_to_le32(0x40000000),
137 cpu_to_le32(0x00000000),
138 cpu_to_le32(0x44000000),
139 cpu_to_le32(0x00000000),
140 cpu_to_le32(0x40000000),
141 cpu_to_le32(0x00000000),
142 cpu_to_le32(0x44000000),
143 cpu_to_le32(0x00000000),
144 cpu_to_le32(0xc0004000),
145 cpu_to_le32(0xf0005000),
146 cpu_to_le32(0xc0004000),
147 cpu_to_le32(0xf0005000),
148 },
149 {
150 cpu_to_le32(0x40000000),
151 cpu_to_le32(0x00000000),
152 cpu_to_le32(0x44000000),
153 cpu_to_le32(0x00000000),
154 cpu_to_le32(0x40000000),
155 cpu_to_le32(0x00000000),
156 cpu_to_le32(0x44000000),
157 cpu_to_le32(0x00000000),
158 cpu_to_le32(0xc0004000),
159 cpu_to_le32(0xf0005000),
160 cpu_to_le32(0xc0004000),
161 cpu_to_le32(0xf0005000),
162 },
163 {
164 cpu_to_le32(0x40000000),
165 cpu_to_le32(0x00000000),
166 cpu_to_le32(0x44000000),
167 cpu_to_le32(0x00000000),
168 cpu_to_le32(0x40000000),
169 cpu_to_le32(0x00000000),
170 cpu_to_le32(0x44000000),
171 cpu_to_le32(0x00000000),
172 cpu_to_le32(0xc0004000),
173 cpu_to_le32(0xf0005000),
174 cpu_to_le32(0xc0004000),
175 cpu_to_le32(0xf0005000),
176 },
177};
178
179static const __le32 iwl_combined_lookup[BT_COEX_MAX_LUT][BT_COEX_LUT_SIZE] = {
180 {
181 /* Tight */
182 cpu_to_le32(0xaaaaaaaa),
183 cpu_to_le32(0xaaaaaaaa),
184 cpu_to_le32(0xaeaaaaaa),
185 cpu_to_le32(0xaaaaaaaa),
186 cpu_to_le32(0xcc00ff28),
187 cpu_to_le32(0x0000aaaa),
188 cpu_to_le32(0xcc00aaaa),
189 cpu_to_le32(0x0000aaaa),
190 cpu_to_le32(0xc0004000),
191 cpu_to_le32(0x00004000),
192 cpu_to_le32(0xf0005000),
193 cpu_to_le32(0xf0005000),
194 },
195 {
196 /* Loose */
197 cpu_to_le32(0xaaaaaaaa),
198 cpu_to_le32(0xaaaaaaaa),
199 cpu_to_le32(0xaaaaaaaa),
200 cpu_to_le32(0xaaaaaaaa),
201 cpu_to_le32(0xcc00ff28),
202 cpu_to_le32(0x0000aaaa),
203 cpu_to_le32(0xcc00aaaa),
204 cpu_to_le32(0x0000aaaa),
205 cpu_to_le32(0x00000000),
206 cpu_to_le32(0x00000000),
207 cpu_to_le32(0xf0005000),
208 cpu_to_le32(0xf0005000),
209 },
210 {
211 /* Tx Tx disabled */
212 cpu_to_le32(0xaaaaaaaa),
213 cpu_to_le32(0xaaaaaaaa),
214 cpu_to_le32(0xeeaaaaaa),
215 cpu_to_le32(0xaaaaaaaa),
216 cpu_to_le32(0xcc00ff28),
217 cpu_to_le32(0x0000aaaa),
218 cpu_to_le32(0xcc00aaaa),
219 cpu_to_le32(0x0000aaaa),
220 cpu_to_le32(0xc0004000),
221 cpu_to_le32(0xc0004000),
222 cpu_to_le32(0xf0005000),
223 cpu_to_le32(0xf0005000),
224 },
225};
226
227/* 20MHz / 40MHz below / 40Mhz above*/ 75/* 20MHz / 40MHz below / 40Mhz above*/
228static const __le64 iwl_ci_mask[][3] = { 76static const __le64 iwl_ci_mask[][3] = {
229 /* dummy entry for channel 0 */ 77 /* dummy entry for channel 0 */
@@ -596,14 +444,6 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
596 goto send_cmd; 444 goto send_cmd;
597 } 445 }
598 446
599 bt_cmd->max_kill = cpu_to_le32(5);
600 bt_cmd->bt4_antenna_isolation_thr =
601 cpu_to_le32(IWL_MVM_BT_COEX_ANTENNA_COUPLING_THRS);
602 bt_cmd->bt4_tx_tx_delta_freq_thr = cpu_to_le32(15);
603 bt_cmd->bt4_tx_rx_max_freq0 = cpu_to_le32(15);
604 bt_cmd->override_primary_lut = cpu_to_le32(BT_COEX_INVALID_LUT);
605 bt_cmd->override_secondary_lut = cpu_to_le32(BT_COEX_INVALID_LUT);
606
607 mode = iwlwifi_mod_params.bt_coex_active ? BT_COEX_NW : BT_COEX_DISABLE; 447 mode = iwlwifi_mod_params.bt_coex_active ? BT_COEX_NW : BT_COEX_DISABLE;
608 bt_cmd->mode = cpu_to_le32(mode); 448 bt_cmd->mode = cpu_to_le32(mode);
609 449
@@ -611,7 +451,7 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
611 bt_cmd->enabled_modules |= 451 bt_cmd->enabled_modules |=
612 cpu_to_le32(BT_COEX_SYNC2SCO_ENABLED); 452 cpu_to_le32(BT_COEX_SYNC2SCO_ENABLED);
613 453
614 if (IWL_MVM_BT_COEX_CORUNNING) 454 if (iwl_mvm_bt_is_plcr_supported(mvm))
615 bt_cmd->enabled_modules |= cpu_to_le32(BT_COEX_CORUN_ENABLED); 455 bt_cmd->enabled_modules |= cpu_to_le32(BT_COEX_CORUN_ENABLED);
616 456
617 if (IWL_MVM_BT_COEX_MPLUT) { 457 if (IWL_MVM_BT_COEX_MPLUT) {
@@ -622,18 +462,6 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
622 462
623 bt_cmd->enabled_modules |= cpu_to_le32(BT_COEX_HIGH_BAND_RET); 463 bt_cmd->enabled_modules |= cpu_to_le32(BT_COEX_HIGH_BAND_RET);
624 464
625 if (mvm->cfg->bt_shared_single_ant)
626 memcpy(&bt_cmd->decision_lut, iwl_single_shared_ant,
627 sizeof(iwl_single_shared_ant));
628 else
629 memcpy(&bt_cmd->decision_lut, iwl_combined_lookup,
630 sizeof(iwl_combined_lookup));
631
632 memcpy(&bt_cmd->mplut_prio_boost, iwl_bt_prio_boost,
633 sizeof(iwl_bt_prio_boost));
634 bt_cmd->multiprio_lut[0] = cpu_to_le32(IWL_MVM_BT_COEX_MPLUT_REG0);
635 bt_cmd->multiprio_lut[1] = cpu_to_le32(IWL_MVM_BT_COEX_MPLUT_REG1);
636
637send_cmd: 465send_cmd:
638 memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif)); 466 memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
639 memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd)); 467 memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd));
@@ -644,48 +472,6 @@ send_cmd:
644 return ret; 472 return ret;
645} 473}
646 474
647static int iwl_mvm_bt_udpate_sw_boost(struct iwl_mvm *mvm)
648{
649 struct iwl_bt_coex_profile_notif *notif = &mvm->last_bt_notif;
650 u32 primary_lut = le32_to_cpu(notif->primary_ch_lut);
651 u32 secondary_lut = le32_to_cpu(notif->secondary_ch_lut);
652 u32 ag = le32_to_cpu(notif->bt_activity_grading);
653 struct iwl_bt_coex_sw_boost_update_cmd cmd = {};
654 u8 ack_kill_msk[NUM_PHY_CTX] = {};
655 u8 cts_kill_msk[NUM_PHY_CTX] = {};
656 int i;
657
658 lockdep_assert_held(&mvm->mutex);
659
660 ack_kill_msk[0] = iwl_bt_ack_kill_msk[ag][primary_lut];
661 cts_kill_msk[0] = iwl_bt_cts_kill_msk[ag][primary_lut];
662
663 ack_kill_msk[1] = iwl_bt_ack_kill_msk[ag][secondary_lut];
664 cts_kill_msk[1] = iwl_bt_cts_kill_msk[ag][secondary_lut];
665
666 /* Don't send HCMD if there is no update */
667 if (!memcmp(ack_kill_msk, mvm->bt_ack_kill_msk, sizeof(ack_kill_msk)) ||
668 !memcmp(cts_kill_msk, mvm->bt_cts_kill_msk, sizeof(cts_kill_msk)))
669 return 0;
670
671 memcpy(mvm->bt_ack_kill_msk, ack_kill_msk,
672 sizeof(mvm->bt_ack_kill_msk));
673 memcpy(mvm->bt_cts_kill_msk, cts_kill_msk,
674 sizeof(mvm->bt_cts_kill_msk));
675
676 BUILD_BUG_ON(ARRAY_SIZE(ack_kill_msk) < ARRAY_SIZE(cmd.boost_values));
677
678 for (i = 0; i < ARRAY_SIZE(cmd.boost_values); i++) {
679 cmd.boost_values[i].kill_ack_msk =
680 cpu_to_le32(iwl_bt_ctl_kill_msk[ack_kill_msk[i]]);
681 cmd.boost_values[i].kill_cts_msk =
682 cpu_to_le32(iwl_bt_ctl_kill_msk[cts_kill_msk[i]]);
683 }
684
685 return iwl_mvm_send_cmd_pdu(mvm, BT_COEX_UPDATE_SW_BOOST, 0,
686 sizeof(cmd), &cmd);
687}
688
689static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id, 475static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,
690 bool enable) 476 bool enable)
691{ 477{
@@ -951,9 +737,6 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
951 IWL_ERR(mvm, "Failed to send BT_CI cmd\n"); 737 IWL_ERR(mvm, "Failed to send BT_CI cmd\n");
952 memcpy(&mvm->last_bt_ci_cmd, &cmd, sizeof(cmd)); 738 memcpy(&mvm->last_bt_ci_cmd, &cmd, sizeof(cmd));
953 } 739 }
954
955 if (iwl_mvm_bt_udpate_sw_boost(mvm))
956 IWL_ERR(mvm, "Failed to update the ctrl_kill_msk\n");
957} 740}
958 741
959int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm, 742int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
@@ -1024,7 +807,7 @@ static void iwl_mvm_bt_rssi_iterator(void *_data, u8 *mac,
1024} 807}
1025 808
1026void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 809void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1027 enum ieee80211_rssi_event rssi_event) 810 enum ieee80211_rssi_event_data rssi_event)
1028{ 811{
1029 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 812 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1030 struct iwl_bt_iterator_data data = { 813 struct iwl_bt_iterator_data data = {
@@ -1074,9 +857,6 @@ void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1074 ieee80211_iterate_active_interfaces_atomic( 857 ieee80211_iterate_active_interfaces_atomic(
1075 mvm->hw, IEEE80211_IFACE_ITER_NORMAL, 858 mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
1076 iwl_mvm_bt_rssi_iterator, &data); 859 iwl_mvm_bt_rssi_iterator, &data);
1077
1078 if (iwl_mvm_bt_udpate_sw_boost(mvm))
1079 IWL_ERR(mvm, "Failed to update the ctrl_kill_msk\n");
1080} 860}
1081 861
1082#define LINK_QUAL_AGG_TIME_LIMIT_DEF (4000) 862#define LINK_QUAL_AGG_TIME_LIMIT_DEF (4000)
@@ -1235,7 +1015,7 @@ int iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
1235 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BT_COEX_SPLIT)) 1015 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_BT_COEX_SPLIT))
1236 return iwl_mvm_rx_ant_coupling_notif_old(mvm, rxb, dev_cmd); 1016 return iwl_mvm_rx_ant_coupling_notif_old(mvm, rxb, dev_cmd);
1237 1017
1238 if (!IWL_MVM_BT_COEX_CORUNNING) 1018 if (!iwl_mvm_bt_is_plcr_supported(mvm))
1239 return 0; 1019 return 0;
1240 1020
1241 lockdep_assert_held(&mvm->mutex); 1021 lockdep_assert_held(&mvm->mutex);
diff --git a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
index 542ee74f290a..d954591e0be5 100644
--- a/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
+++ b/drivers/net/wireless/iwlwifi/mvm/coex_legacy.c
@@ -288,6 +288,65 @@ static const __le64 iwl_ci_mask[][3] = {
288 }, 288 },
289}; 289};
290 290
291enum iwl_bt_kill_msk {
292 BT_KILL_MSK_DEFAULT,
293 BT_KILL_MSK_NEVER,
294 BT_KILL_MSK_ALWAYS,
295 BT_KILL_MSK_MAX,
296};
297
298static const u32 iwl_bt_ctl_kill_msk[BT_KILL_MSK_MAX] = {
299 [BT_KILL_MSK_DEFAULT] = 0xfffffc00,
300 [BT_KILL_MSK_NEVER] = 0xffffffff,
301 [BT_KILL_MSK_ALWAYS] = 0,
302};
303
304static const u8 iwl_bt_cts_kill_msk[BT_MAX_AG][BT_COEX_MAX_LUT] = {
305 {
306 BT_KILL_MSK_ALWAYS,
307 BT_KILL_MSK_ALWAYS,
308 BT_KILL_MSK_ALWAYS,
309 },
310 {
311 BT_KILL_MSK_NEVER,
312 BT_KILL_MSK_NEVER,
313 BT_KILL_MSK_NEVER,
314 },
315 {
316 BT_KILL_MSK_NEVER,
317 BT_KILL_MSK_NEVER,
318 BT_KILL_MSK_NEVER,
319 },
320 {
321 BT_KILL_MSK_DEFAULT,
322 BT_KILL_MSK_NEVER,
323 BT_KILL_MSK_DEFAULT,
324 },
325};
326
327static const u8 iwl_bt_ack_kill_msk[BT_MAX_AG][BT_COEX_MAX_LUT] = {
328 {
329 BT_KILL_MSK_ALWAYS,
330 BT_KILL_MSK_ALWAYS,
331 BT_KILL_MSK_ALWAYS,
332 },
333 {
334 BT_KILL_MSK_ALWAYS,
335 BT_KILL_MSK_ALWAYS,
336 BT_KILL_MSK_ALWAYS,
337 },
338 {
339 BT_KILL_MSK_ALWAYS,
340 BT_KILL_MSK_ALWAYS,
341 BT_KILL_MSK_ALWAYS,
342 },
343 {
344 BT_KILL_MSK_DEFAULT,
345 BT_KILL_MSK_ALWAYS,
346 BT_KILL_MSK_DEFAULT,
347 },
348};
349
291struct corunning_block_luts { 350struct corunning_block_luts {
292 u8 range; 351 u8 range;
293 __le32 lut20[BT_COEX_CORUN_LUT_SIZE]; 352 __le32 lut20[BT_COEX_CORUN_LUT_SIZE];
@@ -619,7 +678,7 @@ int iwl_send_bt_init_conf_old(struct iwl_mvm *mvm)
619 if (IWL_MVM_BT_COEX_SYNC2SCO) 678 if (IWL_MVM_BT_COEX_SYNC2SCO)
620 bt_cmd->flags |= cpu_to_le32(BT_COEX_SYNC2SCO); 679 bt_cmd->flags |= cpu_to_le32(BT_COEX_SYNC2SCO);
621 680
622 if (IWL_MVM_BT_COEX_CORUNNING) { 681 if (iwl_mvm_bt_is_plcr_supported(mvm)) {
623 bt_cmd->valid_bit_msk |= cpu_to_le32(BT_VALID_CORUN_LUT_20 | 682 bt_cmd->valid_bit_msk |= cpu_to_le32(BT_VALID_CORUN_LUT_20 |
624 BT_VALID_CORUN_LUT_40); 683 BT_VALID_CORUN_LUT_40);
625 bt_cmd->flags |= cpu_to_le32(BT_COEX_CORUNNING); 684 bt_cmd->flags |= cpu_to_le32(BT_COEX_CORUNNING);
@@ -633,7 +692,7 @@ int iwl_send_bt_init_conf_old(struct iwl_mvm *mvm)
633 if (IWL_MVM_BT_COEX_TTC) 692 if (IWL_MVM_BT_COEX_TTC)
634 bt_cmd->flags |= cpu_to_le32(BT_COEX_TTC); 693 bt_cmd->flags |= cpu_to_le32(BT_COEX_TTC);
635 694
636 if (IWL_MVM_BT_COEX_RRC) 695 if (iwl_mvm_bt_is_rrc_supported(mvm))
637 bt_cmd->flags |= cpu_to_le32(BT_COEX_RRC); 696 bt_cmd->flags |= cpu_to_le32(BT_COEX_RRC);
638 697
639 if (mvm->cfg->bt_shared_single_ant) 698 if (mvm->cfg->bt_shared_single_ant)
@@ -1069,7 +1128,7 @@ static void iwl_mvm_bt_rssi_iterator(void *_data, u8 *mac,
1069} 1128}
1070 1129
1071void iwl_mvm_bt_rssi_event_old(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1130void iwl_mvm_bt_rssi_event_old(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1072 enum ieee80211_rssi_event rssi_event) 1131 enum ieee80211_rssi_event_data rssi_event)
1073{ 1132{
1074 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1133 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1075 struct iwl_bt_iterator_data data = { 1134 struct iwl_bt_iterator_data data = {
@@ -1168,16 +1227,10 @@ bool iwl_mvm_bt_coex_is_mimo_allowed_old(struct iwl_mvm *mvm,
1168 return lut_type != BT_COEX_LOOSE_LUT; 1227 return lut_type != BT_COEX_LOOSE_LUT;
1169} 1228}
1170 1229
1171bool iwl_mvm_bt_coex_is_ant_avail_old(struct iwl_mvm *mvm, u8 ant)
1172{
1173 u32 ag = le32_to_cpu(mvm->last_bt_notif_old.bt_activity_grading);
1174 return ag < BT_HIGH_TRAFFIC;
1175}
1176
1177bool iwl_mvm_bt_coex_is_shared_ant_avail_old(struct iwl_mvm *mvm) 1230bool iwl_mvm_bt_coex_is_shared_ant_avail_old(struct iwl_mvm *mvm)
1178{ 1231{
1179 u32 ag = le32_to_cpu(mvm->last_bt_notif_old.bt_activity_grading); 1232 u32 ag = le32_to_cpu(mvm->last_bt_notif_old.bt_activity_grading);
1180 return ag == BT_OFF; 1233 return ag < BT_HIGH_TRAFFIC;
1181} 1234}
1182 1235
1183bool iwl_mvm_bt_coex_is_tpc_allowed_old(struct iwl_mvm *mvm, 1236bool iwl_mvm_bt_coex_is_tpc_allowed_old(struct iwl_mvm *mvm,
@@ -1214,7 +1267,7 @@ int iwl_mvm_rx_ant_coupling_notif_old(struct iwl_mvm *mvm,
1214 .dataflags = { IWL_HCMD_DFL_NOCOPY, }, 1267 .dataflags = { IWL_HCMD_DFL_NOCOPY, },
1215 }; 1268 };
1216 1269
1217 if (!IWL_MVM_BT_COEX_CORUNNING) 1270 if (!iwl_mvm_bt_is_plcr_supported(mvm))
1218 return 0; 1271 return 0;
1219 1272
1220 lockdep_assert_held(&mvm->mutex); 1273 lockdep_assert_held(&mvm->mutex);
diff --git a/drivers/net/wireless/iwlwifi/mvm/d3.c b/drivers/net/wireless/iwlwifi/mvm/d3.c
index 14e8fd661889..a6c48c7b1e16 100644
--- a/drivers/net/wireless/iwlwifi/mvm/d3.c
+++ b/drivers/net/wireless/iwlwifi/mvm/d3.c
@@ -694,6 +694,9 @@ static int iwl_mvm_d3_reprogram(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
694 if (ret) 694 if (ret)
695 IWL_ERR(mvm, "Failed to send quota: %d\n", ret); 695 IWL_ERR(mvm, "Failed to send quota: %d\n", ret);
696 696
697 if (iwl_mvm_is_lar_supported(mvm) && iwl_mvm_init_fw_regd(mvm))
698 IWL_ERR(mvm, "Failed to initialize D3 LAR information\n");
699
697 return 0; 700 return 0;
698} 701}
699 702
@@ -1128,6 +1131,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
1128 iwl_trans_d3_suspend(mvm->trans, test); 1131 iwl_trans_d3_suspend(mvm->trans, test);
1129 out: 1132 out:
1130 if (ret < 0) { 1133 if (ret < 0) {
1134 iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
1131 ieee80211_restart_hw(mvm->hw); 1135 ieee80211_restart_hw(mvm->hw);
1132 iwl_mvm_free_nd(mvm); 1136 iwl_mvm_free_nd(mvm);
1133 } 1137 }
@@ -1596,7 +1600,7 @@ iwl_mvm_get_wakeup_status(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1596 1600
1597 /* RF-kill already asserted again... */ 1601 /* RF-kill already asserted again... */
1598 if (!cmd.resp_pkt) { 1602 if (!cmd.resp_pkt) {
1599 ret = -ERFKILL; 1603 fw_status = ERR_PTR(-ERFKILL);
1600 goto out_free_resp; 1604 goto out_free_resp;
1601 } 1605 }
1602 1606
@@ -1605,7 +1609,7 @@ iwl_mvm_get_wakeup_status(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1605 len = iwl_rx_packet_payload_len(cmd.resp_pkt); 1609 len = iwl_rx_packet_payload_len(cmd.resp_pkt);
1606 if (len < status_size) { 1610 if (len < status_size) {
1607 IWL_ERR(mvm, "Invalid WoWLAN status response!\n"); 1611 IWL_ERR(mvm, "Invalid WoWLAN status response!\n");
1608 ret = -EIO; 1612 fw_status = ERR_PTR(-EIO);
1609 goto out_free_resp; 1613 goto out_free_resp;
1610 } 1614 }
1611 1615
@@ -1613,7 +1617,7 @@ iwl_mvm_get_wakeup_status(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1613 if (len != (status_size + 1617 if (len != (status_size +
1614 ALIGN(le32_to_cpu(status->wake_packet_bufsize), 4))) { 1618 ALIGN(le32_to_cpu(status->wake_packet_bufsize), 4))) {
1615 IWL_ERR(mvm, "Invalid WoWLAN status response!\n"); 1619 IWL_ERR(mvm, "Invalid WoWLAN status response!\n");
1616 ret = -EIO; 1620 fw_status = ERR_PTR(-EIO);
1617 goto out_free_resp; 1621 goto out_free_resp;
1618 } 1622 }
1619 1623
@@ -1621,7 +1625,7 @@ iwl_mvm_get_wakeup_status(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1621 1625
1622out_free_resp: 1626out_free_resp:
1623 iwl_free_resp(&cmd); 1627 iwl_free_resp(&cmd);
1624 return ret ? ERR_PTR(ret) : fw_status; 1628 return fw_status;
1625} 1629}
1626 1630
1627/* releases the MVM mutex */ 1631/* releases the MVM mutex */
@@ -1722,6 +1726,10 @@ iwl_mvm_netdetect_query_results(struct iwl_mvm *mvm,
1722 results->matched_profiles = le32_to_cpu(query->matched_profiles); 1726 results->matched_profiles = le32_to_cpu(query->matched_profiles);
1723 memcpy(results->matches, query->matches, sizeof(results->matches)); 1727 memcpy(results->matches, query->matches, sizeof(results->matches));
1724 1728
1729#ifdef CPTCFG_IWLWIFI_DEBUGFS
1730 mvm->last_netdetect_scans = le32_to_cpu(query->n_scans_done);
1731#endif
1732
1725out_free_resp: 1733out_free_resp:
1726 iwl_free_resp(&cmd); 1734 iwl_free_resp(&cmd);
1727 return ret; 1735 return ret;
@@ -1874,27 +1882,36 @@ static int __iwl_mvm_resume(struct iwl_mvm *mvm, bool test)
1874 /* query SRAM first in case we want event logging */ 1882 /* query SRAM first in case we want event logging */
1875 iwl_mvm_read_d3_sram(mvm); 1883 iwl_mvm_read_d3_sram(mvm);
1876 1884
1885 /*
1886 * Query the current location and source from the D3 firmware so we
1887 * can play it back when we re-intiailize the D0 firmware
1888 */
1889 iwl_mvm_update_changed_regdom(mvm);
1890
1877 if (mvm->net_detect) { 1891 if (mvm->net_detect) {
1878 iwl_mvm_query_netdetect_reasons(mvm, vif); 1892 iwl_mvm_query_netdetect_reasons(mvm, vif);
1893 /* has unlocked the mutex, so skip that */
1894 goto out;
1879 } else { 1895 } else {
1880 keep = iwl_mvm_query_wakeup_reasons(mvm, vif); 1896 keep = iwl_mvm_query_wakeup_reasons(mvm, vif);
1881#ifdef CONFIG_IWLWIFI_DEBUGFS 1897#ifdef CONFIG_IWLWIFI_DEBUGFS
1882 if (keep) 1898 if (keep)
1883 mvm->keep_vif = vif; 1899 mvm->keep_vif = vif;
1884#endif 1900#endif
1901 /* has unlocked the mutex, so skip that */
1902 goto out_iterate;
1885 } 1903 }
1886 /* has unlocked the mutex, so skip that */
1887 goto out;
1888 1904
1889 out_unlock: 1905 out_unlock:
1890 mutex_unlock(&mvm->mutex); 1906 mutex_unlock(&mvm->mutex);
1891 1907
1892 out: 1908out_iterate:
1893 if (!test) 1909 if (!test)
1894 ieee80211_iterate_active_interfaces_rtnl(mvm->hw, 1910 ieee80211_iterate_active_interfaces_rtnl(mvm->hw,
1895 IEEE80211_IFACE_ITER_NORMAL, 1911 IEEE80211_IFACE_ITER_NORMAL,
1896 iwl_mvm_d3_disconnect_iter, keep ? vif : NULL); 1912 iwl_mvm_d3_disconnect_iter, keep ? vif : NULL);
1897 1913
1914out:
1898 /* return 1 to reconfigure the device */ 1915 /* return 1 to reconfigure the device */
1899 set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); 1916 set_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1900 set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status); 1917 set_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status);
@@ -2004,6 +2021,7 @@ static int iwl_mvm_d3_test_release(struct inode *inode, struct file *file)
2004 __iwl_mvm_resume(mvm, true); 2021 __iwl_mvm_resume(mvm, true);
2005 rtnl_unlock(); 2022 rtnl_unlock();
2006 iwl_abort_notification_waits(&mvm->notif_wait); 2023 iwl_abort_notification_waits(&mvm->notif_wait);
2024 iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
2007 ieee80211_restart_hw(mvm->hw); 2025 ieee80211_restart_hw(mvm->hw);
2008 2026
2009 /* wait for restart and disconnect all interfaces */ 2027 /* wait for restart and disconnect all interfaces */
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c b/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
index 5fe14591e1c4..5f37eab5008d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs-vif.c
@@ -545,6 +545,57 @@ static ssize_t iwl_dbgfs_uapsd_misbehaving_write(struct ieee80211_vif *vif,
545 return ret ? count : -EINVAL; 545 return ret ? count : -EINVAL;
546} 546}
547 547
548static ssize_t iwl_dbgfs_rx_phyinfo_write(struct ieee80211_vif *vif, char *buf,
549 size_t count, loff_t *ppos)
550{
551 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
552 struct iwl_mvm *mvm = mvmvif->mvm;
553 struct ieee80211_chanctx_conf *chanctx_conf;
554 struct iwl_mvm_phy_ctxt *phy_ctxt;
555 u16 value;
556 int ret;
557
558 ret = kstrtou16(buf, 0, &value);
559 if (ret)
560 return ret;
561
562 mutex_lock(&mvm->mutex);
563 rcu_read_lock();
564
565 chanctx_conf = rcu_dereference(vif->chanctx_conf);
566 /* make sure the channel context is assigned */
567 if (!chanctx_conf) {
568 rcu_read_unlock();
569 mutex_unlock(&mvm->mutex);
570 return -EINVAL;
571 }
572
573 phy_ctxt = &mvm->phy_ctxts[*(u16 *)chanctx_conf->drv_priv];
574 rcu_read_unlock();
575
576 mvm->dbgfs_rx_phyinfo = value;
577
578 ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &chanctx_conf->min_def,
579 chanctx_conf->rx_chains_static,
580 chanctx_conf->rx_chains_dynamic);
581 mutex_unlock(&mvm->mutex);
582
583 return ret ?: count;
584}
585
586static ssize_t iwl_dbgfs_rx_phyinfo_read(struct file *file,
587 char __user *user_buf,
588 size_t count, loff_t *ppos)
589{
590 struct ieee80211_vif *vif = file->private_data;
591 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
592 char buf[8];
593
594 snprintf(buf, sizeof(buf), "0x%04x\n", mvmvif->mvm->dbgfs_rx_phyinfo);
595
596 return simple_read_from_buffer(user_buf, count, ppos, buf, sizeof(buf));
597}
598
548#define MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz) \ 599#define MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz) \
549 _MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz, struct ieee80211_vif) 600 _MVM_DEBUGFS_WRITE_FILE_OPS(name, bufsz, struct ieee80211_vif)
550#define MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz) \ 601#define MVM_DEBUGFS_READ_WRITE_FILE_OPS(name, bufsz) \
@@ -560,6 +611,7 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(pm_params, 32);
560MVM_DEBUGFS_READ_WRITE_FILE_OPS(bf_params, 256); 611MVM_DEBUGFS_READ_WRITE_FILE_OPS(bf_params, 256);
561MVM_DEBUGFS_READ_WRITE_FILE_OPS(low_latency, 10); 612MVM_DEBUGFS_READ_WRITE_FILE_OPS(low_latency, 10);
562MVM_DEBUGFS_READ_WRITE_FILE_OPS(uapsd_misbehaving, 20); 613MVM_DEBUGFS_READ_WRITE_FILE_OPS(uapsd_misbehaving, 20);
614MVM_DEBUGFS_READ_WRITE_FILE_OPS(rx_phyinfo, 10);
563 615
564void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif) 616void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
565{ 617{
@@ -575,7 +627,6 @@ void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
575 return; 627 return;
576 628
577 mvmvif->dbgfs_dir = debugfs_create_dir("iwlmvm", dbgfs_dir); 629 mvmvif->dbgfs_dir = debugfs_create_dir("iwlmvm", dbgfs_dir);
578 mvmvif->mvm = mvm;
579 630
580 if (!mvmvif->dbgfs_dir) { 631 if (!mvmvif->dbgfs_dir) {
581 IWL_ERR(mvm, "Failed to create debugfs directory under %s\n", 632 IWL_ERR(mvm, "Failed to create debugfs directory under %s\n",
@@ -595,6 +646,8 @@ void iwl_mvm_vif_dbgfs_register(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
595 S_IRUSR | S_IWUSR); 646 S_IRUSR | S_IWUSR);
596 MVM_DEBUGFS_ADD_FILE_VIF(uapsd_misbehaving, mvmvif->dbgfs_dir, 647 MVM_DEBUGFS_ADD_FILE_VIF(uapsd_misbehaving, mvmvif->dbgfs_dir,
597 S_IRUSR | S_IWUSR); 648 S_IRUSR | S_IWUSR);
649 MVM_DEBUGFS_ADD_FILE_VIF(rx_phyinfo, mvmvif->dbgfs_dir,
650 S_IRUSR | S_IWUSR);
598 651
599 if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p && 652 if (vif->type == NL80211_IFTYPE_STATION && !vif->p2p &&
600 mvmvif == mvm->bf_allowed_vif) 653 mvmvif == mvm->bf_allowed_vif)
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
index 82c09d86af8c..9ac04c1ea706 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
@@ -562,11 +562,12 @@ static ssize_t iwl_dbgfs_bt_cmd_read(struct file *file, char __user *user_buf,
562 "\tSecondary Channel Bitmap 0x%016llx\n", 562 "\tSecondary Channel Bitmap 0x%016llx\n",
563 le64_to_cpu(cmd->bt_secondary_ci)); 563 le64_to_cpu(cmd->bt_secondary_ci));
564 564
565 pos += scnprintf(buf+pos, bufsz-pos, "BT Configuration CMD\n"); 565 pos += scnprintf(buf+pos, bufsz-pos,
566 pos += scnprintf(buf+pos, bufsz-pos, "\tACK Kill Mask 0x%08x\n", 566 "BT Configuration CMD - 0=default, 1=never, 2=always\n");
567 iwl_bt_ctl_kill_msk[mvm->bt_ack_kill_msk[0]]); 567 pos += scnprintf(buf+pos, bufsz-pos, "\tACK Kill msk idx %d\n",
568 pos += scnprintf(buf+pos, bufsz-pos, "\tCTS Kill Mask 0x%08x\n", 568 mvm->bt_ack_kill_msk[0]);
569 iwl_bt_ctl_kill_msk[mvm->bt_cts_kill_msk[0]]); 569 pos += scnprintf(buf+pos, bufsz-pos, "\tCTS Kill msk idx %d\n",
570 mvm->bt_cts_kill_msk[0]);
570 571
571 } else { 572 } else {
572 struct iwl_bt_coex_ci_cmd *cmd = &mvm->last_bt_ci_cmd; 573 struct iwl_bt_coex_ci_cmd *cmd = &mvm->last_bt_ci_cmd;
@@ -579,21 +580,6 @@ static ssize_t iwl_dbgfs_bt_cmd_read(struct file *file, char __user *user_buf,
579 pos += scnprintf(buf+pos, bufsz-pos, 580 pos += scnprintf(buf+pos, bufsz-pos,
580 "\tSecondary Channel Bitmap 0x%016llx\n", 581 "\tSecondary Channel Bitmap 0x%016llx\n",
581 le64_to_cpu(cmd->bt_secondary_ci)); 582 le64_to_cpu(cmd->bt_secondary_ci));
582
583 pos += scnprintf(buf+pos, bufsz-pos, "BT Configuration CMD\n");
584 pos += scnprintf(buf+pos, bufsz-pos,
585 "\tPrimary: ACK Kill Mask 0x%08x\n",
586 iwl_bt_ctl_kill_msk[mvm->bt_ack_kill_msk[0]]);
587 pos += scnprintf(buf+pos, bufsz-pos,
588 "\tPrimary: CTS Kill Mask 0x%08x\n",
589 iwl_bt_ctl_kill_msk[mvm->bt_cts_kill_msk[0]]);
590 pos += scnprintf(buf+pos, bufsz-pos,
591 "\tSecondary: ACK Kill Mask 0x%08x\n",
592 iwl_bt_ctl_kill_msk[mvm->bt_ack_kill_msk[1]]);
593 pos += scnprintf(buf+pos, bufsz-pos,
594 "\tSecondary: CTS Kill Mask 0x%08x\n",
595 iwl_bt_ctl_kill_msk[mvm->bt_cts_kill_msk[1]]);
596
597 } 583 }
598 584
599 mutex_unlock(&mvm->mutex); 585 mutex_unlock(&mvm->mutex);
@@ -942,7 +928,7 @@ static ssize_t iwl_dbgfs_fw_dbg_conf_read(struct file *file,
942 size_t count, loff_t *ppos) 928 size_t count, loff_t *ppos)
943{ 929{
944 struct iwl_mvm *mvm = file->private_data; 930 struct iwl_mvm *mvm = file->private_data;
945 enum iwl_fw_dbg_conf conf; 931 int conf;
946 char buf[8]; 932 char buf[8];
947 const size_t bufsz = sizeof(buf); 933 const size_t bufsz = sizeof(buf);
948 int pos = 0; 934 int pos = 0;
@@ -966,7 +952,7 @@ static ssize_t iwl_dbgfs_fw_dbg_conf_write(struct iwl_mvm *mvm,
966 if (ret) 952 if (ret)
967 return ret; 953 return ret;
968 954
969 if (WARN_ON(conf_id >= FW_DBG_MAX)) 955 if (WARN_ON(conf_id >= FW_DBG_CONF_MAX))
970 return -EINVAL; 956 return -EINVAL;
971 957
972 mutex_lock(&mvm->mutex); 958 mutex_lock(&mvm->mutex);
@@ -985,7 +971,7 @@ static ssize_t iwl_dbgfs_fw_dbg_collect_write(struct iwl_mvm *mvm,
985 if (ret) 971 if (ret)
986 return ret; 972 return ret;
987 973
988 iwl_mvm_fw_dbg_collect(mvm); 974 iwl_mvm_fw_dbg_collect(mvm, FW_DBG_TRIGGER_USER, NULL, 0, 0);
989 975
990 iwl_mvm_unref(mvm, IWL_MVM_REF_PRPH_WRITE); 976 iwl_mvm_unref(mvm, IWL_MVM_REF_PRPH_WRITE);
991 977
@@ -1487,26 +1473,6 @@ out:
1487 return count; 1473 return count;
1488} 1474}
1489 1475
1490static ssize_t iwl_dbgfs_enable_scan_iteration_notif_write(struct iwl_mvm *mvm,
1491 char *buf,
1492 size_t count,
1493 loff_t *ppos)
1494{
1495 int val;
1496
1497 mutex_lock(&mvm->mutex);
1498
1499 if (kstrtoint(buf, 10, &val)) {
1500 mutex_unlock(&mvm->mutex);
1501 return -EINVAL;
1502 }
1503
1504 mvm->scan_iter_notif_enabled = val;
1505 mutex_unlock(&mvm->mutex);
1506
1507 return count;
1508}
1509
1510MVM_DEBUGFS_READ_WRITE_FILE_OPS(prph_reg, 64); 1476MVM_DEBUGFS_READ_WRITE_FILE_OPS(prph_reg, 64);
1511 1477
1512/* Device wide debugfs entries */ 1478/* Device wide debugfs entries */
@@ -1529,7 +1495,6 @@ MVM_DEBUGFS_READ_WRITE_FILE_OPS(scan_ant_rxchain, 8);
1529MVM_DEBUGFS_READ_WRITE_FILE_OPS(d0i3_refs, 8); 1495MVM_DEBUGFS_READ_WRITE_FILE_OPS(d0i3_refs, 8);
1530MVM_DEBUGFS_READ_WRITE_FILE_OPS(fw_dbg_conf, 8); 1496MVM_DEBUGFS_READ_WRITE_FILE_OPS(fw_dbg_conf, 8);
1531MVM_DEBUGFS_WRITE_FILE_OPS(fw_dbg_collect, 8); 1497MVM_DEBUGFS_WRITE_FILE_OPS(fw_dbg_collect, 8);
1532MVM_DEBUGFS_WRITE_FILE_OPS(enable_scan_iteration_notif, 8);
1533 1498
1534#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 1499#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
1535MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters, 256); 1500MVM_DEBUGFS_READ_WRITE_FILE_OPS(bcast_filters, 256);
@@ -1573,8 +1538,11 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
1573 MVM_DEBUGFS_ADD_FILE(d0i3_refs, mvm->debugfs_dir, S_IRUSR | S_IWUSR); 1538 MVM_DEBUGFS_ADD_FILE(d0i3_refs, mvm->debugfs_dir, S_IRUSR | S_IWUSR);
1574 MVM_DEBUGFS_ADD_FILE(fw_dbg_conf, mvm->debugfs_dir, S_IRUSR | S_IWUSR); 1539 MVM_DEBUGFS_ADD_FILE(fw_dbg_conf, mvm->debugfs_dir, S_IRUSR | S_IWUSR);
1575 MVM_DEBUGFS_ADD_FILE(fw_dbg_collect, mvm->debugfs_dir, S_IWUSR); 1540 MVM_DEBUGFS_ADD_FILE(fw_dbg_collect, mvm->debugfs_dir, S_IWUSR);
1576 MVM_DEBUGFS_ADD_FILE(enable_scan_iteration_notif, mvm->debugfs_dir, 1541 if (!debugfs_create_bool("enable_scan_iteration_notif",
1577 S_IWUSR); 1542 S_IRUSR | S_IWUSR,
1543 mvm->debugfs_dir,
1544 &mvm->scan_iter_notif_enabled))
1545 goto err;
1578 1546
1579#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 1547#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
1580 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING) { 1548 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING) {
@@ -1601,6 +1569,9 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
1601 if (!debugfs_create_bool("d3_wake_sysassert", S_IRUSR | S_IWUSR, 1569 if (!debugfs_create_bool("d3_wake_sysassert", S_IRUSR | S_IWUSR,
1602 mvm->debugfs_dir, &mvm->d3_wake_sysassert)) 1570 mvm->debugfs_dir, &mvm->d3_wake_sysassert))
1603 goto err; 1571 goto err;
1572 if (!debugfs_create_u32("last_netdetect_scans", S_IRUSR,
1573 mvm->debugfs_dir, &mvm->last_netdetect_scans))
1574 goto err;
1604 MVM_DEBUGFS_ADD_FILE(netdetect, mvm->debugfs_dir, S_IRUSR | S_IWUSR); 1575 MVM_DEBUGFS_ADD_FILE(netdetect, mvm->debugfs_dir, S_IRUSR | S_IWUSR);
1605#endif 1576#endif
1606 1577
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-coex.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-coex.h
index f3b11897991e..d398a6102805 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-coex.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-coex.h
@@ -235,36 +235,12 @@ enum iwl_bt_coex_enabled_modules {
235 * struct iwl_bt_coex_cmd - bt coex configuration command 235 * struct iwl_bt_coex_cmd - bt coex configuration command
236 * @mode: enum %iwl_bt_coex_mode 236 * @mode: enum %iwl_bt_coex_mode
237 * @enabled_modules: enum %iwl_bt_coex_enabled_modules 237 * @enabled_modules: enum %iwl_bt_coex_enabled_modules
238 * @max_kill: max count of Tx retries due to kill from PTA
239 * @override_primary_lut: enum %iwl_bt_coex_lut_type: BT_COEX_INVALID_LUT
240 * should be set by default
241 * @override_secondary_lut: enum %iwl_bt_coex_lut_type: BT_COEX_INVALID_LUT
242 * should be set by default
243 * @bt4_antenna_isolation_thr: antenna threshold value
244 * @bt4_tx_tx_delta_freq_thr: TxTx delta frequency
245 * @bt4_tx_rx_max_freq0: TxRx max frequency
246 * @multiprio_lut: multi priority LUT configuration
247 * @mplut_prio_boost: BT priority boost registers
248 * @decision_lut: PTA decision LUT, per Prio-Ch
249 * 238 *
250 * The structure is used for the BT_COEX command. 239 * The structure is used for the BT_COEX command.
251 */ 240 */
252struct iwl_bt_coex_cmd { 241struct iwl_bt_coex_cmd {
253 __le32 mode; 242 __le32 mode;
254 __le32 enabled_modules; 243 __le32 enabled_modules;
255
256 __le32 max_kill;
257 __le32 override_primary_lut;
258 __le32 override_secondary_lut;
259 __le32 bt4_antenna_isolation_thr;
260
261 __le32 bt4_tx_tx_delta_freq_thr;
262 __le32 bt4_tx_rx_max_freq0;
263
264 __le32 multiprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE];
265 __le32 mplut_prio_boost[BT_COEX_BOOST_SIZE];
266
267 __le32 decision_lut[BT_COEX_MAX_LUT][BT_COEX_LUT_SIZE];
268} __packed; /* BT_COEX_CMD_API_S_VER_6 */ 244} __packed; /* BT_COEX_CMD_API_S_VER_6 */
269 245
270/** 246/**
@@ -280,29 +256,6 @@ struct iwl_bt_coex_corun_lut_update_cmd {
280} __packed; /* BT_COEX_UPDATE_CORUN_LUT_API_S_VER_1 */ 256} __packed; /* BT_COEX_UPDATE_CORUN_LUT_API_S_VER_1 */
281 257
282/** 258/**
283 * struct iwl_bt_coex_sw_boost - SW boost values
284 * @wifi_tx_prio_boost: SW boost of wifi tx priority
285 * @wifi_rx_prio_boost: SW boost of wifi rx priority
286 * @kill_ack_msk: kill ACK mask. 1 - Tx ACK, 0 - kill Tx of ACK.
287 * @kill_cts_msk: kill CTS mask. 1 - Tx CTS, 0 - kill Tx of CTS.
288 */
289struct iwl_bt_coex_sw_boost {
290 __le32 wifi_tx_prio_boost;
291 __le32 wifi_rx_prio_boost;
292 __le32 kill_ack_msk;
293 __le32 kill_cts_msk;
294};
295
296/**
297 * struct iwl_bt_coex_sw_boost_update_cmd - command to update the SW boost
298 * @boost_values: check struct %iwl_bt_coex_sw_boost - one for each channel
299 * primary / secondary / low priority
300 */
301struct iwl_bt_coex_sw_boost_update_cmd {
302 struct iwl_bt_coex_sw_boost boost_values[3];
303} __packed; /* BT_COEX_UPDATE_SW_BOOST_S_VER_1 */
304
305/**
306 * struct iwl_bt_coex_reduced_txp_update_cmd 259 * struct iwl_bt_coex_reduced_txp_update_cmd
307 * @reduced_txp: bit BT_REDUCED_TX_POWER_BIT to enable / disable, rest of the 260 * @reduced_txp: bit BT_REDUCED_TX_POWER_BIT to enable / disable, rest of the
308 * bits are the sta_id (value) 261 * bits are the sta_id (value)
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h
index 6d3bea5c59d1..d7658d16e965 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-d3.h
@@ -132,7 +132,7 @@ struct iwl_proto_offload_cmd_common {
132 * @solicited_node_ipv6_addr: broken -- solicited node address exists 132 * @solicited_node_ipv6_addr: broken -- solicited node address exists
133 * for each target address 133 * for each target address
134 * @target_ipv6_addr: our target addresses 134 * @target_ipv6_addr: our target addresses
135 * @ndp_mac_addr: neighbor soliciation response MAC address 135 * @ndp_mac_addr: neighbor solicitation response MAC address
136 */ 136 */
137struct iwl_proto_offload_cmd_v1 { 137struct iwl_proto_offload_cmd_v1 {
138 struct iwl_proto_offload_cmd_common common; 138 struct iwl_proto_offload_cmd_common common;
@@ -150,7 +150,7 @@ struct iwl_proto_offload_cmd_v1 {
150 * @solicited_node_ipv6_addr: broken -- solicited node address exists 150 * @solicited_node_ipv6_addr: broken -- solicited node address exists
151 * for each target address 151 * for each target address
152 * @target_ipv6_addr: our target addresses 152 * @target_ipv6_addr: our target addresses
153 * @ndp_mac_addr: neighbor soliciation response MAC address 153 * @ndp_mac_addr: neighbor solicitation response MAC address
154 */ 154 */
155struct iwl_proto_offload_cmd_v2 { 155struct iwl_proto_offload_cmd_v2 {
156 struct iwl_proto_offload_cmd_common common; 156 struct iwl_proto_offload_cmd_common common;
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-mac.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-mac.h
index c405cda1025f..f3f3ee0a766b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-mac.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-mac.h
@@ -70,6 +70,7 @@
70#define MAC_INDEX_AUX 4 70#define MAC_INDEX_AUX 4
71#define MAC_INDEX_MIN_DRIVER 0 71#define MAC_INDEX_MIN_DRIVER 0
72#define NUM_MAC_INDEX_DRIVER MAC_INDEX_AUX 72#define NUM_MAC_INDEX_DRIVER MAC_INDEX_AUX
73#define NUM_MAC_INDEX (MAC_INDEX_AUX + 1)
73 74
74enum iwl_ac { 75enum iwl_ac {
75 AC_BK, 76 AC_BK,
@@ -254,7 +255,7 @@ struct iwl_mac_data_p2p_dev {
254/** 255/**
255 * enum iwl_mac_filter_flags - MAC context filter flags 256 * enum iwl_mac_filter_flags - MAC context filter flags
256 * @MAC_FILTER_IN_PROMISC: accept all data frames 257 * @MAC_FILTER_IN_PROMISC: accept all data frames
257 * @MAC_FILTER_IN_CONTROL_AND_MGMT: pass all mangement and 258 * @MAC_FILTER_IN_CONTROL_AND_MGMT: pass all management and
258 * control frames to the host 259 * control frames to the host
259 * @MAC_FILTER_ACCEPT_GRP: accept multicast frames 260 * @MAC_FILTER_ACCEPT_GRP: accept multicast frames
260 * @MAC_FILTER_DIS_DECRYPT: don't decrypt unicast frames 261 * @MAC_FILTER_DIS_DECRYPT: don't decrypt unicast frames
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
index cfc0e65b34a5..4f81dcf57a73 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
@@ -70,55 +70,10 @@
70 70
71/* Scan Commands, Responses, Notifications */ 71/* Scan Commands, Responses, Notifications */
72 72
73/* Masks for iwl_scan_channel.type flags */
74#define SCAN_CHANNEL_TYPE_ACTIVE BIT(0)
75#define SCAN_CHANNEL_NARROW_BAND BIT(22)
76
77/* Max number of IEs for direct SSID scans in a command */ 73/* Max number of IEs for direct SSID scans in a command */
78#define PROBE_OPTION_MAX 20 74#define PROBE_OPTION_MAX 20
79 75
80/** 76/**
81 * struct iwl_scan_channel - entry in REPLY_SCAN_CMD channel table
82 * @channel: band is selected by iwl_scan_cmd "flags" field
83 * @tx_gain: gain for analog radio
84 * @dsp_atten: gain for DSP
85 * @active_dwell: dwell time for active scan in TU, typically 5-50
86 * @passive_dwell: dwell time for passive scan in TU, typically 20-500
87 * @type: type is broken down to these bits:
88 * bit 0: 0 = passive, 1 = active
89 * bits 1-20: SSID direct bit map. If any of these bits is set then
90 * the corresponding SSID IE is transmitted in probe request
91 * (bit i adds IE in position i to the probe request)
92 * bit 22: channel width, 0 = regular, 1 = TGj narrow channel
93 *
94 * @iteration_count:
95 * @iteration_interval:
96 * This struct is used once for each channel in the scan list.
97 * Each channel can independently select:
98 * 1) SSID for directed active scans
99 * 2) Txpower setting (for rate specified within Tx command)
100 * 3) How long to stay on-channel (behavior may be modified by quiet_time,
101 * quiet_plcp_th, good_CRC_th)
102 *
103 * To avoid uCode errors, make sure the following are true (see comments
104 * under struct iwl_scan_cmd about max_out_time and quiet_time):
105 * 1) If using passive_dwell (i.e. passive_dwell != 0):
106 * active_dwell <= passive_dwell (< max_out_time if max_out_time != 0)
107 * 2) quiet_time <= active_dwell
108 * 3) If restricting off-channel time (i.e. max_out_time !=0):
109 * passive_dwell < max_out_time
110 * active_dwell < max_out_time
111 */
112struct iwl_scan_channel {
113 __le32 type;
114 __le16 channel;
115 __le16 iteration_count;
116 __le32 iteration_interval;
117 __le16 active_dwell;
118 __le16 passive_dwell;
119} __packed; /* SCAN_CHANNEL_CONTROL_API_S_VER_1 */
120
121/**
122 * struct iwl_ssid_ie - directed scan network information element 77 * struct iwl_ssid_ie - directed scan network information element
123 * 78 *
124 * Up to 20 of these may appear in REPLY_SCAN_CMD, 79 * Up to 20 of these may appear in REPLY_SCAN_CMD,
@@ -132,152 +87,6 @@ struct iwl_ssid_ie {
132 u8 ssid[IEEE80211_MAX_SSID_LEN]; 87 u8 ssid[IEEE80211_MAX_SSID_LEN];
133} __packed; /* SCAN_DIRECT_SSID_IE_API_S_VER_1 */ 88} __packed; /* SCAN_DIRECT_SSID_IE_API_S_VER_1 */
134 89
135/**
136 * iwl_scan_flags - masks for scan command flags
137 *@SCAN_FLAGS_PERIODIC_SCAN:
138 *@SCAN_FLAGS_P2P_PUBLIC_ACTION_FRAME_TX:
139 *@SCAN_FLAGS_DELAYED_SCAN_LOWBAND:
140 *@SCAN_FLAGS_DELAYED_SCAN_HIGHBAND:
141 *@SCAN_FLAGS_FRAGMENTED_SCAN:
142 *@SCAN_FLAGS_PASSIVE2ACTIVE: use active scan on channels that was active
143 * in the past hour, even if they are marked as passive.
144 */
145enum iwl_scan_flags {
146 SCAN_FLAGS_PERIODIC_SCAN = BIT(0),
147 SCAN_FLAGS_P2P_PUBLIC_ACTION_FRAME_TX = BIT(1),
148 SCAN_FLAGS_DELAYED_SCAN_LOWBAND = BIT(2),
149 SCAN_FLAGS_DELAYED_SCAN_HIGHBAND = BIT(3),
150 SCAN_FLAGS_FRAGMENTED_SCAN = BIT(4),
151 SCAN_FLAGS_PASSIVE2ACTIVE = BIT(5),
152};
153
154/**
155 * enum iwl_scan_type - Scan types for scan command
156 * @SCAN_TYPE_FORCED:
157 * @SCAN_TYPE_BACKGROUND:
158 * @SCAN_TYPE_OS:
159 * @SCAN_TYPE_ROAMING:
160 * @SCAN_TYPE_ACTION:
161 * @SCAN_TYPE_DISCOVERY:
162 * @SCAN_TYPE_DISCOVERY_FORCED:
163 */
164enum iwl_scan_type {
165 SCAN_TYPE_FORCED = 0,
166 SCAN_TYPE_BACKGROUND = 1,
167 SCAN_TYPE_OS = 2,
168 SCAN_TYPE_ROAMING = 3,
169 SCAN_TYPE_ACTION = 4,
170 SCAN_TYPE_DISCOVERY = 5,
171 SCAN_TYPE_DISCOVERY_FORCED = 6,
172}; /* SCAN_ACTIVITY_TYPE_E_VER_1 */
173
174/**
175 * struct iwl_scan_cmd - scan request command
176 * ( SCAN_REQUEST_CMD = 0x80 )
177 * @len: command length in bytes
178 * @scan_flags: scan flags from SCAN_FLAGS_*
179 * @channel_count: num of channels in channel list
180 * (1 - ucode_capa.n_scan_channels)
181 * @quiet_time: in msecs, dwell this time for active scan on quiet channels
182 * @quiet_plcp_th: quiet PLCP threshold (channel is quiet if less than
183 * this number of packets were received (typically 1)
184 * @passive2active: is auto switching from passive to active during scan allowed
185 * @rxchain_sel_flags: RXON_RX_CHAIN_*
186 * @max_out_time: in TUs, max out of serving channel time
187 * @suspend_time: how long to pause scan when returning to service channel:
188 * bits 0-19: beacon interal in TUs (suspend before executing)
189 * bits 20-23: reserved
190 * bits 24-31: number of beacons (suspend between channels)
191 * @rxon_flags: RXON_FLG_*
192 * @filter_flags: RXON_FILTER_*
193 * @tx_cmd: for active scans (zero for passive), w/o payload,
194 * no RS so specify TX rate
195 * @direct_scan: direct scan SSIDs
196 * @type: one of SCAN_TYPE_*
197 * @repeats: how many time to repeat the scan
198 */
199struct iwl_scan_cmd {
200 __le16 len;
201 u8 scan_flags;
202 u8 channel_count;
203 __le16 quiet_time;
204 __le16 quiet_plcp_th;
205 __le16 passive2active;
206 __le16 rxchain_sel_flags;
207 __le32 max_out_time;
208 __le32 suspend_time;
209 /* RX_ON_FLAGS_API_S_VER_1 */
210 __le32 rxon_flags;
211 __le32 filter_flags;
212 struct iwl_tx_cmd tx_cmd;
213 struct iwl_ssid_ie direct_scan[PROBE_OPTION_MAX];
214 __le32 type;
215 __le32 repeats;
216
217 /*
218 * Probe request frame, followed by channel list.
219 *
220 * Size of probe request frame is specified by byte count in tx_cmd.
221 * Channel list follows immediately after probe request frame.
222 * Number of channels in list is specified by channel_count.
223 * Each channel in list is of type:
224 *
225 * struct iwl_scan_channel channels[0];
226 *
227 * NOTE: Only one band of channels can be scanned per pass. You
228 * must not mix 2.4GHz channels and 5.2GHz channels, and you must wait
229 * for one scan to complete (i.e. receive SCAN_COMPLETE_NOTIFICATION)
230 * before requesting another scan.
231 */
232 u8 data[0];
233} __packed; /* SCAN_REQUEST_FIXED_PART_API_S_VER_5 */
234
235/* Response to scan request contains only status with one of these values */
236#define SCAN_RESPONSE_OK 0x1
237#define SCAN_RESPONSE_ERROR 0x2
238
239/*
240 * SCAN_ABORT_CMD = 0x81
241 * When scan abort is requested, the command has no fields except the common
242 * header. The response contains only a status with one of these values.
243 */
244#define SCAN_ABORT_POSSIBLE 0x1
245#define SCAN_ABORT_IGNORED 0x2 /* no pending scans */
246
247/* TODO: complete documentation */
248#define SCAN_OWNER_STATUS 0x1
249#define MEASURE_OWNER_STATUS 0x2
250
251/**
252 * struct iwl_scan_start_notif - notifies start of scan in the device
253 * ( SCAN_START_NOTIFICATION = 0x82 )
254 * @tsf_low: TSF timer (lower half) in usecs
255 * @tsf_high: TSF timer (higher half) in usecs
256 * @beacon_timer: structured as follows:
257 * bits 0:19 - beacon interval in usecs
258 * bits 20:23 - reserved (0)
259 * bits 24:31 - number of beacons
260 * @channel: which channel is scanned
261 * @band: 0 for 5.2 GHz, 1 for 2.4 GHz
262 * @status: one of *_OWNER_STATUS
263 */
264struct iwl_scan_start_notif {
265 __le32 tsf_low;
266 __le32 tsf_high;
267 __le32 beacon_timer;
268 u8 channel;
269 u8 band;
270 u8 reserved[2];
271 __le32 status;
272} __packed; /* SCAN_START_NTF_API_S_VER_1 */
273
274/* scan results probe_status first bit indicates success */
275#define SCAN_PROBE_STATUS_OK 0
276#define SCAN_PROBE_STATUS_TX_FAILED BIT(0)
277/* error statuses combined with TX_FAILED */
278#define SCAN_PROBE_STATUS_FAIL_TTL BIT(1)
279#define SCAN_PROBE_STATUS_FAIL_BT BIT(2)
280
281/* How many statistics are gathered for each channel */ 90/* How many statistics are gathered for each channel */
282#define SCAN_RESULTS_STATISTICS 1 91#define SCAN_RESULTS_STATISTICS 1
283 92
@@ -294,7 +103,7 @@ struct iwl_scan_start_notif {
294 * @SCAN_COMP_STATUS_ERR_COEX: medium was lost ot WiMax 103 * @SCAN_COMP_STATUS_ERR_COEX: medium was lost ot WiMax
295 * @SCAN_COMP_STATUS_P2P_ACTION_OK: P2P public action frame TX was successful 104 * @SCAN_COMP_STATUS_P2P_ACTION_OK: P2P public action frame TX was successful
296 * (not an error!) 105 * (not an error!)
297 * @SCAN_COMP_STATUS_ITERATION_END: indicates end of one repeatition the driver 106 * @SCAN_COMP_STATUS_ITERATION_END: indicates end of one repetition the driver
298 * asked for 107 * asked for
299 * @SCAN_COMP_STATUS_ERR_ALLOC_TE: scan could not allocate time events 108 * @SCAN_COMP_STATUS_ERR_ALLOC_TE: scan could not allocate time events
300*/ 109*/
@@ -378,11 +187,11 @@ enum scan_framework_client {
378 * struct iwl_scan_offload_cmd - SCAN_REQUEST_FIXED_PART_API_S_VER_6 187 * struct iwl_scan_offload_cmd - SCAN_REQUEST_FIXED_PART_API_S_VER_6
379 * @scan_flags: see enum iwl_scan_flags 188 * @scan_flags: see enum iwl_scan_flags
380 * @channel_count: channels in channel list 189 * @channel_count: channels in channel list
381 * @quiet_time: dwell time, in milisiconds, on quiet channel 190 * @quiet_time: dwell time, in milliseconds, on quiet channel
382 * @quiet_plcp_th: quiet channel num of packets threshold 191 * @quiet_plcp_th: quiet channel num of packets threshold
383 * @good_CRC_th: passive to active promotion threshold 192 * @good_CRC_th: passive to active promotion threshold
384 * @rx_chain: RXON rx chain. 193 * @rx_chain: RXON rx chain.
385 * @max_out_time: max TUs to be out of assoceated channel 194 * @max_out_time: max TUs to be out of associated channel
386 * @suspend_time: pause scan this TUs when returning to service channel 195 * @suspend_time: pause scan this TUs when returning to service channel
387 * @flags: RXON flags 196 * @flags: RXON flags
388 * @filter_flags: RXONfilter 197 * @filter_flags: RXONfilter
@@ -423,7 +232,7 @@ enum iwl_scan_offload_channel_flags {
423 * see enum iwl_scan_offload_channel_flags. 232 * see enum iwl_scan_offload_channel_flags.
424 * __le16 channel_number: channel number 1-13 etc. 233 * __le16 channel_number: channel number 1-13 etc.
425 * __le16 iter_count: repetition count for the channel. 234 * __le16 iter_count: repetition count for the channel.
426 * __le32 iter_interval: interval between two innteration on one channel. 235 * __le32 iter_interval: interval between two iterations on one channel.
427 * u8 active_dwell. 236 * u8 active_dwell.
428 * u8 passive_dwell. 237 * u8 passive_dwell.
429 */ 238 */
@@ -466,8 +275,8 @@ enum iwl_scan_offload_band_selection {
466/** 275/**
467 * iwl_scan_offload_profile - SCAN_OFFLOAD_PROFILE_S 276 * iwl_scan_offload_profile - SCAN_OFFLOAD_PROFILE_S
468 * @ssid_index: index to ssid list in fixed part 277 * @ssid_index: index to ssid list in fixed part
469 * @unicast_cipher: encryption olgorithm to match - bitmap 278 * @unicast_cipher: encryption algorithm to match - bitmap
470 * @aut_alg: authentication olgorithm to match - bitmap 279 * @aut_alg: authentication algorithm to match - bitmap
471 * @network_type: enum iwl_scan_offload_network_type 280 * @network_type: enum iwl_scan_offload_network_type
472 * @band_selection: enum iwl_scan_offload_band_selection 281 * @band_selection: enum iwl_scan_offload_band_selection
473 * @client_bitmap: clients waiting for match - enum scan_framework_client 282 * @client_bitmap: clients waiting for match - enum scan_framework_client
@@ -939,7 +748,7 @@ enum iwl_umac_scan_general_flags {
939 * @flags: bitmap - 0-19: directed scan to i'th ssid. 748 * @flags: bitmap - 0-19: directed scan to i'th ssid.
940 * @channel_num: channel number 1-13 etc. 749 * @channel_num: channel number 1-13 etc.
941 * @iter_count: repetition count for the channel. 750 * @iter_count: repetition count for the channel.
942 * @iter_interval: interval between two scan interations on one channel. 751 * @iter_interval: interval between two scan iterations on one channel.
943 */ 752 */
944struct iwl_scan_channel_cfg_umac { 753struct iwl_scan_channel_cfg_umac {
945 __le32 flags; 754 __le32 flags;
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-stats.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-stats.h
index 928168b18346..709e28d8b1b0 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-stats.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-stats.h
@@ -65,6 +65,7 @@
65 65
66#ifndef __fw_api_stats_h__ 66#ifndef __fw_api_stats_h__
67#define __fw_api_stats_h__ 67#define __fw_api_stats_h__
68#include "fw-api-mac.h"
68 69
69struct mvm_statistics_dbg { 70struct mvm_statistics_dbg {
70 __le32 burst_check; 71 __le32 burst_check;
@@ -218,7 +219,7 @@ struct mvm_statistics_bt_activity {
218 __le32 lo_priority_rx_denied_cnt; 219 __le32 lo_priority_rx_denied_cnt;
219} __packed; /* STATISTICS_BT_ACTIVITY_API_S_VER_1 */ 220} __packed; /* STATISTICS_BT_ACTIVITY_API_S_VER_1 */
220 221
221struct mvm_statistics_general { 222struct mvm_statistics_general_v5 {
222 __le32 radio_temperature; 223 __le32 radio_temperature;
223 __le32 radio_voltage; 224 __le32 radio_voltage;
224 struct mvm_statistics_dbg dbg; 225 struct mvm_statistics_dbg dbg;
@@ -244,6 +245,39 @@ struct mvm_statistics_general {
244 struct mvm_statistics_bt_activity bt_activity; 245 struct mvm_statistics_bt_activity bt_activity;
245} __packed; /* STATISTICS_GENERAL_API_S_VER_5 */ 246} __packed; /* STATISTICS_GENERAL_API_S_VER_5 */
246 247
248struct mvm_statistics_general_v8 {
249 __le32 radio_temperature;
250 __le32 radio_voltage;
251 struct mvm_statistics_dbg dbg;
252 __le32 sleep_time;
253 __le32 slots_out;
254 __le32 slots_idle;
255 __le32 ttl_timestamp;
256 struct mvm_statistics_div slow_div;
257 __le32 rx_enable_counter;
258 /*
259 * num_of_sos_states:
260 * count the number of times we have to re-tune
261 * in order to get out of bad PHY status
262 */
263 __le32 num_of_sos_states;
264 __le32 beacon_filtered;
265 __le32 missed_beacons;
266 __s8 beacon_filter_average_energy;
267 __s8 beacon_filter_reason;
268 __s8 beacon_filter_current_energy;
269 __s8 beacon_filter_reserved;
270 __le32 beacon_filter_delta_time;
271 struct mvm_statistics_bt_activity bt_activity;
272 __le64 rx_time;
273 __le64 on_time_rf;
274 __le64 on_time_scan;
275 __le64 tx_time;
276 __le32 beacon_counter[NUM_MAC_INDEX];
277 u8 beacon_average_energy[NUM_MAC_INDEX];
278 u8 reserved[4 - (NUM_MAC_INDEX % 4)];
279} __packed; /* STATISTICS_GENERAL_API_S_VER_8 */
280
247struct mvm_statistics_rx { 281struct mvm_statistics_rx {
248 struct mvm_statistics_rx_phy ofdm; 282 struct mvm_statistics_rx_phy ofdm;
249 struct mvm_statistics_rx_phy cck; 283 struct mvm_statistics_rx_phy cck;
@@ -256,22 +290,28 @@ struct mvm_statistics_rx {
256 * 290 *
257 * By default, uCode issues this notification after receiving a beacon 291 * By default, uCode issues this notification after receiving a beacon
258 * while associated. To disable this behavior, set DISABLE_NOTIF flag in the 292 * while associated. To disable this behavior, set DISABLE_NOTIF flag in the
259 * REPLY_STATISTICS_CMD 0x9c, above. 293 * STATISTICS_CMD (0x9c), below.
260 *
261 * Statistics counters continue to increment beacon after beacon, but are
262 * cleared when changing channels or when driver issues REPLY_STATISTICS_CMD
263 * 0x9c with CLEAR_STATS bit set (see above).
264 *
265 * uCode also issues this notification during scans. uCode clears statistics
266 * appropriately so that each notification contains statistics for only the
267 * one channel that has just been scanned.
268 */ 294 */
269 295
270struct iwl_notif_statistics { 296struct iwl_notif_statistics_v8 {
271 __le32 flag; 297 __le32 flag;
272 struct mvm_statistics_rx rx; 298 struct mvm_statistics_rx rx;
273 struct mvm_statistics_tx tx; 299 struct mvm_statistics_tx tx;
274 struct mvm_statistics_general general; 300 struct mvm_statistics_general_v5 general;
275} __packed; /* STATISTICS_NTFY_API_S_VER_8 */ 301} __packed; /* STATISTICS_NTFY_API_S_VER_8 */
276 302
303struct iwl_notif_statistics_v10 {
304 __le32 flag;
305 struct mvm_statistics_rx rx;
306 struct mvm_statistics_tx tx;
307 struct mvm_statistics_general_v8 general;
308} __packed; /* STATISTICS_NTFY_API_S_VER_10 */
309
310#define IWL_STATISTICS_FLG_CLEAR 0x1
311#define IWL_STATISTICS_FLG_DISABLE_NOTIF 0x2
312
313struct iwl_statistics_cmd {
314 __le32 flags;
315} __packed; /* STATISTICS_CMD_API_S_VER_1 */
316
277#endif /* __fw_api_stats_h__ */ 317#endif /* __fw_api_stats_h__ */
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
index b56154fe8ec5..aab68cbae754 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
@@ -192,6 +192,7 @@ enum {
192 BEACON_NOTIFICATION = 0x90, 192 BEACON_NOTIFICATION = 0x90,
193 BEACON_TEMPLATE_CMD = 0x91, 193 BEACON_TEMPLATE_CMD = 0x91,
194 TX_ANT_CONFIGURATION_CMD = 0x98, 194 TX_ANT_CONFIGURATION_CMD = 0x98,
195 STATISTICS_CMD = 0x9c,
195 STATISTICS_NOTIFICATION = 0x9d, 196 STATISTICS_NOTIFICATION = 0x9d,
196 EOSP_NOTIFICATION = 0x9e, 197 EOSP_NOTIFICATION = 0x9e,
197 REDUCE_TX_POWER_CMD = 0x9f, 198 REDUCE_TX_POWER_CMD = 0x9f,
@@ -211,6 +212,10 @@ enum {
211 REPLY_RX_MPDU_CMD = 0xc1, 212 REPLY_RX_MPDU_CMD = 0xc1,
212 BA_NOTIF = 0xc5, 213 BA_NOTIF = 0xc5,
213 214
215 /* Location Aware Regulatory */
216 MCC_UPDATE_CMD = 0xc8,
217 MCC_CHUB_UPDATE_CMD = 0xc9,
218
214 MARKER_CMD = 0xcb, 219 MARKER_CMD = 0xcb,
215 220
216 /* BT Coex */ 221 /* BT Coex */
@@ -361,7 +366,8 @@ enum {
361 NVM_SECTION_TYPE_CALIBRATION = 4, 366 NVM_SECTION_TYPE_CALIBRATION = 4,
362 NVM_SECTION_TYPE_PRODUCTION = 5, 367 NVM_SECTION_TYPE_PRODUCTION = 5,
363 NVM_SECTION_TYPE_MAC_OVERRIDE = 11, 368 NVM_SECTION_TYPE_MAC_OVERRIDE = 11,
364 NVM_MAX_NUM_SECTIONS = 12, 369 NVM_SECTION_TYPE_PHY_SKU = 12,
370 NVM_MAX_NUM_SECTIONS = 13,
365}; 371};
366 372
367/** 373/**
@@ -431,7 +437,7 @@ enum {
431 437
432#define IWL_ALIVE_FLG_RFKILL BIT(0) 438#define IWL_ALIVE_FLG_RFKILL BIT(0)
433 439
434struct mvm_alive_resp { 440struct mvm_alive_resp_ver1 {
435 __le16 status; 441 __le16 status;
436 __le16 flags; 442 __le16 flags;
437 u8 ucode_minor; 443 u8 ucode_minor;
@@ -482,6 +488,30 @@ struct mvm_alive_resp_ver2 {
482 __le32 dbg_print_buff_addr; 488 __le32 dbg_print_buff_addr;
483} __packed; /* ALIVE_RES_API_S_VER_2 */ 489} __packed; /* ALIVE_RES_API_S_VER_2 */
484 490
491struct mvm_alive_resp {
492 __le16 status;
493 __le16 flags;
494 __le32 ucode_minor;
495 __le32 ucode_major;
496 u8 ver_subtype;
497 u8 ver_type;
498 u8 mac;
499 u8 opt;
500 __le32 timestamp;
501 __le32 error_event_table_ptr; /* SRAM address for error log */
502 __le32 log_event_table_ptr; /* SRAM address for LMAC event log */
503 __le32 cpu_register_ptr;
504 __le32 dbgm_config_ptr;
505 __le32 alive_counter_ptr;
506 __le32 scd_base_ptr; /* SRAM address for SCD */
507 __le32 st_fwrd_addr; /* pointer to Store and forward */
508 __le32 st_fwrd_size;
509 __le32 umac_minor; /* UMAC version: minor */
510 __le32 umac_major; /* UMAC version: major */
511 __le32 error_info_addr; /* SRAM address for UMAC error log */
512 __le32 dbg_print_buff_addr;
513} __packed; /* ALIVE_RES_API_S_VER_3 */
514
485/* Error response/notification */ 515/* Error response/notification */
486enum { 516enum {
487 FW_ERR_UNKNOWN_CMD = 0x0, 517 FW_ERR_UNKNOWN_CMD = 0x0,
@@ -1417,7 +1447,19 @@ enum iwl_sf_scenario {
1417#define SF_W_MARK_LEGACY 4096 1447#define SF_W_MARK_LEGACY 4096
1418#define SF_W_MARK_SCAN 4096 1448#define SF_W_MARK_SCAN 4096
1419 1449
1420/* SF Scenarios timers for FULL_ON state (aligned to 32 uSec) */ 1450/* SF Scenarios timers for default configuration (aligned to 32 uSec) */
1451#define SF_SINGLE_UNICAST_IDLE_TIMER_DEF 160 /* 150 uSec */
1452#define SF_SINGLE_UNICAST_AGING_TIMER_DEF 400 /* 0.4 mSec */
1453#define SF_AGG_UNICAST_IDLE_TIMER_DEF 160 /* 150 uSec */
1454#define SF_AGG_UNICAST_AGING_TIMER_DEF 400 /* 0.4 mSec */
1455#define SF_MCAST_IDLE_TIMER_DEF 160 /* 150 mSec */
1456#define SF_MCAST_AGING_TIMER_DEF 400 /* 0.4 mSec */
1457#define SF_BA_IDLE_TIMER_DEF 160 /* 150 uSec */
1458#define SF_BA_AGING_TIMER_DEF 400 /* 0.4 mSec */
1459#define SF_TX_RE_IDLE_TIMER_DEF 160 /* 150 uSec */
1460#define SF_TX_RE_AGING_TIMER_DEF 400 /* 0.4 mSec */
1461
1462/* SF Scenarios timers for BSS MAC configuration (aligned to 32 uSec) */
1421#define SF_SINGLE_UNICAST_IDLE_TIMER 320 /* 300 uSec */ 1463#define SF_SINGLE_UNICAST_IDLE_TIMER 320 /* 300 uSec */
1422#define SF_SINGLE_UNICAST_AGING_TIMER 2016 /* 2 mSec */ 1464#define SF_SINGLE_UNICAST_AGING_TIMER 2016 /* 2 mSec */
1423#define SF_AGG_UNICAST_IDLE_TIMER 320 /* 300 uSec */ 1465#define SF_AGG_UNICAST_IDLE_TIMER 320 /* 300 uSec */
@@ -1448,6 +1490,92 @@ struct iwl_sf_cfg_cmd {
1448 __le32 full_on_timeouts[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES]; 1490 __le32 full_on_timeouts[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES];
1449} __packed; /* SF_CFG_API_S_VER_2 */ 1491} __packed; /* SF_CFG_API_S_VER_2 */
1450 1492
1493/***********************************
1494 * Location Aware Regulatory (LAR) API - MCC updates
1495 ***********************************/
1496
1497/**
1498 * struct iwl_mcc_update_cmd - Request the device to update geographic
1499 * regulatory profile according to the given MCC (Mobile Country Code).
1500 * The MCC is two letter-code, ascii upper case[A-Z] or '00' for world domain.
1501 * 'ZZ' MCC will be used to switch to NVM default profile; in this case, the
1502 * MCC in the cmd response will be the relevant MCC in the NVM.
1503 * @mcc: given mobile country code
1504 * @source_id: the source from where we got the MCC, see iwl_mcc_source
1505 * @reserved: reserved for alignment
1506 */
1507struct iwl_mcc_update_cmd {
1508 __le16 mcc;
1509 u8 source_id;
1510 u8 reserved;
1511} __packed; /* LAR_UPDATE_MCC_CMD_API_S */
1512
1513/**
1514 * iwl_mcc_update_resp - response to MCC_UPDATE_CMD.
1515 * Contains the new channel control profile map, if changed, and the new MCC
1516 * (mobile country code).
1517 * The new MCC may be different than what was requested in MCC_UPDATE_CMD.
1518 * @status: see &enum iwl_mcc_update_status
1519 * @mcc: the new applied MCC
1520 * @cap: capabilities for all channels which matches the MCC
1521 * @source_id: the MCC source, see iwl_mcc_source
1522 * @n_channels: number of channels in @channels_data (may be 14, 39, 50 or 51
1523 * channels, depending on platform)
1524 * @channels: channel control data map, DWORD for each channel. Only the first
1525 * 16bits are used.
1526 */
1527struct iwl_mcc_update_resp {
1528 __le32 status;
1529 __le16 mcc;
1530 u8 cap;
1531 u8 source_id;
1532 __le32 n_channels;
1533 __le32 channels[0];
1534} __packed; /* LAR_UPDATE_MCC_CMD_RESP_S */
1535
1536/**
1537 * struct iwl_mcc_chub_notif - chub notifies of mcc change
1538 * (MCC_CHUB_UPDATE_CMD = 0xc9)
1539 * The Chub (Communication Hub, CommsHUB) is a HW component that connects to
1540 * the cellular and connectivity cores that gets updates of the mcc, and
1541 * notifies the ucode directly of any mcc change.
1542 * The ucode requests the driver to request the device to update geographic
1543 * regulatory profile according to the given MCC (Mobile Country Code).
1544 * The MCC is two letter-code, ascii upper case[A-Z] or '00' for world domain.
1545 * 'ZZ' MCC will be used to switch to NVM default profile; in this case, the
1546 * MCC in the cmd response will be the relevant MCC in the NVM.
1547 * @mcc: given mobile country code
1548 * @source_id: identity of the change originator, see iwl_mcc_source
1549 * @reserved1: reserved for alignment
1550 */
1551struct iwl_mcc_chub_notif {
1552 u16 mcc;
1553 u8 source_id;
1554 u8 reserved1;
1555} __packed; /* LAR_MCC_NOTIFY_S */
1556
1557enum iwl_mcc_update_status {
1558 MCC_RESP_NEW_CHAN_PROFILE,
1559 MCC_RESP_SAME_CHAN_PROFILE,
1560 MCC_RESP_INVALID,
1561 MCC_RESP_NVM_DISABLED,
1562 MCC_RESP_ILLEGAL,
1563 MCC_RESP_LOW_PRIORITY,
1564};
1565
1566enum iwl_mcc_source {
1567 MCC_SOURCE_OLD_FW = 0,
1568 MCC_SOURCE_ME = 1,
1569 MCC_SOURCE_BIOS = 2,
1570 MCC_SOURCE_3G_LTE_HOST = 3,
1571 MCC_SOURCE_3G_LTE_DEVICE = 4,
1572 MCC_SOURCE_WIFI = 5,
1573 MCC_SOURCE_RESERVED = 6,
1574 MCC_SOURCE_DEFAULT = 7,
1575 MCC_SOURCE_UNINITIALIZED = 8,
1576 MCC_SOURCE_GET_CURRENT = 0x10
1577};
1578
1451/* DTS measurements */ 1579/* DTS measurements */
1452 1580
1453enum iwl_dts_measurement_flags { 1581enum iwl_dts_measurement_flags {
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw.c b/drivers/net/wireless/iwlwifi/mvm/fw.c
index ca38e9817374..bc5eac4960e1 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw.c
+++ b/drivers/net/wireless/iwlwifi/mvm/fw.c
@@ -112,25 +112,27 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
112 struct iwl_mvm *mvm = 112 struct iwl_mvm *mvm =
113 container_of(notif_wait, struct iwl_mvm, notif_wait); 113 container_of(notif_wait, struct iwl_mvm, notif_wait);
114 struct iwl_mvm_alive_data *alive_data = data; 114 struct iwl_mvm_alive_data *alive_data = data;
115 struct mvm_alive_resp *palive; 115 struct mvm_alive_resp_ver1 *palive1;
116 struct mvm_alive_resp_ver2 *palive2; 116 struct mvm_alive_resp_ver2 *palive2;
117 struct mvm_alive_resp *palive;
117 118
118 if (iwl_rx_packet_payload_len(pkt) == sizeof(*palive)) { 119 if (iwl_rx_packet_payload_len(pkt) == sizeof(*palive1)) {
119 palive = (void *)pkt->data; 120 palive1 = (void *)pkt->data;
120 121
121 mvm->support_umac_log = false; 122 mvm->support_umac_log = false;
122 mvm->error_event_table = 123 mvm->error_event_table =
123 le32_to_cpu(palive->error_event_table_ptr); 124 le32_to_cpu(palive1->error_event_table_ptr);
124 mvm->log_event_table = le32_to_cpu(palive->log_event_table_ptr); 125 mvm->log_event_table =
125 alive_data->scd_base_addr = le32_to_cpu(palive->scd_base_ptr); 126 le32_to_cpu(palive1->log_event_table_ptr);
127 alive_data->scd_base_addr = le32_to_cpu(palive1->scd_base_ptr);
126 128
127 alive_data->valid = le16_to_cpu(palive->status) == 129 alive_data->valid = le16_to_cpu(palive1->status) ==
128 IWL_ALIVE_STATUS_OK; 130 IWL_ALIVE_STATUS_OK;
129 IWL_DEBUG_FW(mvm, 131 IWL_DEBUG_FW(mvm,
130 "Alive VER1 ucode status 0x%04x revision 0x%01X 0x%01X flags 0x%01X\n", 132 "Alive VER1 ucode status 0x%04x revision 0x%01X 0x%01X flags 0x%01X\n",
131 le16_to_cpu(palive->status), palive->ver_type, 133 le16_to_cpu(palive1->status), palive1->ver_type,
132 palive->ver_subtype, palive->flags); 134 palive1->ver_subtype, palive1->flags);
133 } else { 135 } else if (iwl_rx_packet_payload_len(pkt) == sizeof(*palive2)) {
134 palive2 = (void *)pkt->data; 136 palive2 = (void *)pkt->data;
135 137
136 mvm->error_event_table = 138 mvm->error_event_table =
@@ -156,6 +158,33 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
156 IWL_DEBUG_FW(mvm, 158 IWL_DEBUG_FW(mvm,
157 "UMAC version: Major - 0x%x, Minor - 0x%x\n", 159 "UMAC version: Major - 0x%x, Minor - 0x%x\n",
158 palive2->umac_major, palive2->umac_minor); 160 palive2->umac_major, palive2->umac_minor);
161 } else if (iwl_rx_packet_payload_len(pkt) == sizeof(*palive)) {
162 palive = (void *)pkt->data;
163
164 mvm->error_event_table =
165 le32_to_cpu(palive->error_event_table_ptr);
166 mvm->log_event_table =
167 le32_to_cpu(palive->log_event_table_ptr);
168 alive_data->scd_base_addr = le32_to_cpu(palive->scd_base_ptr);
169 mvm->umac_error_event_table =
170 le32_to_cpu(palive->error_info_addr);
171 mvm->sf_space.addr = le32_to_cpu(palive->st_fwrd_addr);
172 mvm->sf_space.size = le32_to_cpu(palive->st_fwrd_size);
173
174 alive_data->valid = le16_to_cpu(palive->status) ==
175 IWL_ALIVE_STATUS_OK;
176 if (mvm->umac_error_event_table)
177 mvm->support_umac_log = true;
178
179 IWL_DEBUG_FW(mvm,
180 "Alive VER3 ucode status 0x%04x revision 0x%01X 0x%01X flags 0x%01X\n",
181 le16_to_cpu(palive->status), palive->ver_type,
182 palive->ver_subtype, palive->flags);
183
184 IWL_DEBUG_FW(mvm,
185 "UMAC version: Major - 0x%x, Minor - 0x%x\n",
186 le32_to_cpu(palive->umac_major),
187 le32_to_cpu(palive->umac_minor));
159 } 188 }
160 189
161 return true; 190 return true;
@@ -188,8 +217,7 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
188 struct iwl_sf_region st_fwrd_space; 217 struct iwl_sf_region st_fwrd_space;
189 218
190 if (ucode_type == IWL_UCODE_REGULAR && 219 if (ucode_type == IWL_UCODE_REGULAR &&
191 iwl_fw_dbg_conf_usniffer(mvm->fw, FW_DBG_CUSTOM) && 220 iwl_fw_dbg_conf_usniffer(mvm->fw, FW_DBG_START_FROM_ALIVE))
192 iwl_fw_dbg_conf_enabled(mvm->fw, FW_DBG_CUSTOM))
193 fw = iwl_get_ucode_image(mvm, IWL_UCODE_REGULAR_USNIFFER); 221 fw = iwl_get_ucode_image(mvm, IWL_UCODE_REGULAR_USNIFFER);
194 else 222 else
195 fw = iwl_get_ucode_image(mvm, ucode_type); 223 fw = iwl_get_ucode_image(mvm, ucode_type);
@@ -451,20 +479,97 @@ exit:
451 iwl_free_resp(&cmd); 479 iwl_free_resp(&cmd);
452} 480}
453 481
454void iwl_mvm_fw_dbg_collect(struct iwl_mvm *mvm) 482int iwl_mvm_fw_dbg_collect_desc(struct iwl_mvm *mvm,
483 struct iwl_mvm_dump_desc *desc,
484 unsigned int delay)
455{ 485{
486 if (test_and_set_bit(IWL_MVM_STATUS_DUMPING_FW_LOG, &mvm->status))
487 return -EBUSY;
488
489 if (WARN_ON(mvm->fw_dump_desc))
490 iwl_mvm_free_fw_dump_desc(mvm);
491
492 IWL_WARN(mvm, "Collecting data: trigger %d fired.\n",
493 le32_to_cpu(desc->trig_desc.type));
494
495 mvm->fw_dump_desc = desc;
496
456 /* stop recording */ 497 /* stop recording */
457 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000) { 498 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000) {
458 iwl_set_bits_prph(mvm->trans, MON_BUFF_SAMPLE_CTL, 0x100); 499 iwl_set_bits_prph(mvm->trans, MON_BUFF_SAMPLE_CTL, 0x100);
459 } else { 500 } else {
460 iwl_write_prph(mvm->trans, DBGC_IN_SAMPLE, 0); 501 iwl_write_prph(mvm->trans, DBGC_IN_SAMPLE, 0);
461 iwl_write_prph(mvm->trans, DBGC_OUT_CTRL, 0); 502 /* wait before we collect the data till the DBGC stop */
503 udelay(100);
504 }
505
506 queue_delayed_work(system_wq, &mvm->fw_dump_wk, delay);
507
508 return 0;
509}
510
511int iwl_mvm_fw_dbg_collect(struct iwl_mvm *mvm, enum iwl_fw_dbg_trigger trig,
512 const char *str, size_t len, unsigned int delay)
513{
514 struct iwl_mvm_dump_desc *desc;
515
516 desc = kzalloc(sizeof(*desc) + len, GFP_ATOMIC);
517 if (!desc)
518 return -ENOMEM;
519
520 desc->len = len;
521 desc->trig_desc.type = cpu_to_le32(trig);
522 memcpy(desc->trig_desc.data, str, len);
523
524 return iwl_mvm_fw_dbg_collect_desc(mvm, desc, delay);
525}
526
527int iwl_mvm_fw_dbg_collect_trig(struct iwl_mvm *mvm,
528 struct iwl_fw_dbg_trigger_tlv *trigger,
529 const char *fmt, ...)
530{
531 unsigned int delay = msecs_to_jiffies(le32_to_cpu(trigger->stop_delay));
532 u16 occurrences = le16_to_cpu(trigger->occurrences);
533 int ret, len = 0;
534 char buf[64];
535
536 if (!occurrences)
537 return 0;
538
539 if (fmt) {
540 va_list ap;
541
542 buf[sizeof(buf) - 1] = '\0';
543
544 va_start(ap, fmt);
545 vsnprintf(buf, sizeof(buf), fmt, ap);
546 va_end(ap);
547
548 /* check for truncation */
549 if (WARN_ON_ONCE(buf[sizeof(buf) - 1]))
550 buf[sizeof(buf) - 1] = '\0';
551
552 len = strlen(buf) + 1;
462 } 553 }
463 554
464 schedule_work(&mvm->fw_error_dump_wk); 555 ret = iwl_mvm_fw_dbg_collect(mvm, le32_to_cpu(trigger->id), buf,
556 len, delay);
557 if (ret)
558 return ret;
559
560 trigger->occurrences = cpu_to_le16(occurrences - 1);
561 return 0;
465} 562}
466 563
467int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, enum iwl_fw_dbg_conf conf_id) 564static inline void iwl_mvm_restart_early_start(struct iwl_mvm *mvm)
565{
566 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000)
567 iwl_clear_bits_prph(mvm->trans, MON_BUFF_SAMPLE_CTL, 0x100);
568 else
569 iwl_write_prph(mvm->trans, DBGC_IN_SAMPLE, 1);
570}
571
572int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, u8 conf_id)
468{ 573{
469 u8 *ptr; 574 u8 *ptr;
470 int ret; 575 int ret;
@@ -474,6 +579,14 @@ int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, enum iwl_fw_dbg_conf conf_id)
474 "Invalid configuration %d\n", conf_id)) 579 "Invalid configuration %d\n", conf_id))
475 return -EINVAL; 580 return -EINVAL;
476 581
582 /* EARLY START - firmware's configuration is hard coded */
583 if ((!mvm->fw->dbg_conf_tlv[conf_id] ||
584 !mvm->fw->dbg_conf_tlv[conf_id]->num_of_hcmds) &&
585 conf_id == FW_DBG_START_FROM_ALIVE) {
586 iwl_mvm_restart_early_start(mvm);
587 return 0;
588 }
589
477 if (!mvm->fw->dbg_conf_tlv[conf_id]) 590 if (!mvm->fw->dbg_conf_tlv[conf_id])
478 return -EINVAL; 591 return -EINVAL;
479 592
@@ -583,7 +696,10 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
583 IWL_ERR(mvm, "Failed to initialize Smart Fifo\n"); 696 IWL_ERR(mvm, "Failed to initialize Smart Fifo\n");
584 697
585 mvm->fw_dbg_conf = FW_DBG_INVALID; 698 mvm->fw_dbg_conf = FW_DBG_INVALID;
586 iwl_mvm_start_fw_dbg_conf(mvm, FW_DBG_CUSTOM); 699 /* if we have a destination, assume EARLY START */
700 if (mvm->fw->dbg_dest_tlv)
701 mvm->fw_dbg_conf = FW_DBG_START_FROM_ALIVE;
702 iwl_mvm_start_fw_dbg_conf(mvm, FW_DBG_START_FROM_ALIVE);
587 703
588 ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm)); 704 ret = iwl_send_tx_ant_cfg(mvm, iwl_mvm_get_valid_tx_ant(mvm));
589 if (ret) 705 if (ret)
@@ -640,6 +756,16 @@ int iwl_mvm_up(struct iwl_mvm *mvm)
640 if (ret) 756 if (ret)
641 goto error; 757 goto error;
642 758
759 /*
760 * RTNL is not taken during Ct-kill, but we don't need to scan/Tx
761 * anyway, so don't init MCC.
762 */
763 if (!test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status)) {
764 ret = iwl_mvm_init_mcc(mvm);
765 if (ret)
766 goto error;
767 }
768
643 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) { 769 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) {
644 ret = iwl_mvm_config_scan(mvm); 770 ret = iwl_mvm_config_scan(mvm);
645 if (ret) 771 if (ret)
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
index 7bdc6220743f..8088c7137f7c 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
@@ -244,6 +244,7 @@ static void iwl_mvm_mac_sta_hw_queues_iter(void *_data,
244unsigned long iwl_mvm_get_used_hw_queues(struct iwl_mvm *mvm, 244unsigned long iwl_mvm_get_used_hw_queues(struct iwl_mvm *mvm,
245 struct ieee80211_vif *exclude_vif) 245 struct ieee80211_vif *exclude_vif)
246{ 246{
247 u8 sta_id;
247 struct iwl_mvm_hw_queues_iface_iterator_data data = { 248 struct iwl_mvm_hw_queues_iface_iterator_data data = {
248 .exclude_vif = exclude_vif, 249 .exclude_vif = exclude_vif,
249 .used_hw_queues = 250 .used_hw_queues =
@@ -264,6 +265,13 @@ unsigned long iwl_mvm_get_used_hw_queues(struct iwl_mvm *mvm,
264 iwl_mvm_mac_sta_hw_queues_iter, 265 iwl_mvm_mac_sta_hw_queues_iter,
265 &data); 266 &data);
266 267
268 /*
269 * Some TDLS stations may be removed but are in the process of being
270 * drained. Don't touch their queues.
271 */
272 for_each_set_bit(sta_id, mvm->sta_drained, IWL_MVM_STATION_COUNT)
273 data.used_hw_queues |= mvm->tfd_drained[sta_id];
274
267 return data.used_hw_queues; 275 return data.used_hw_queues;
268} 276}
269 277
@@ -462,9 +470,8 @@ exit_fail:
462 470
463int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif) 471int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
464{ 472{
465 unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ? 473 unsigned int wdg_timeout =
466 mvm->cfg->base_params->wd_timeout : 474 iwl_mvm_get_wd_timeout(mvm, vif, false, false);
467 IWL_WATCHDOG_DISABLED;
468 u32 ac; 475 u32 ac;
469 int ret; 476 int ret;
470 477
@@ -1367,10 +1374,18 @@ static void iwl_mvm_beacon_loss_iterator(void *_data, u8 *mac,
1367{ 1374{
1368 struct iwl_missed_beacons_notif *missed_beacons = _data; 1375 struct iwl_missed_beacons_notif *missed_beacons = _data;
1369 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1376 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1377 struct iwl_mvm *mvm = mvmvif->mvm;
1378 struct iwl_fw_dbg_trigger_missed_bcon *bcon_trig;
1379 struct iwl_fw_dbg_trigger_tlv *trigger;
1380 u32 stop_trig_missed_bcon, stop_trig_missed_bcon_since_rx;
1381 u32 rx_missed_bcon, rx_missed_bcon_since_rx;
1370 1382
1371 if (mvmvif->id != (u16)le32_to_cpu(missed_beacons->mac_id)) 1383 if (mvmvif->id != (u16)le32_to_cpu(missed_beacons->mac_id))
1372 return; 1384 return;
1373 1385
1386 rx_missed_bcon = le32_to_cpu(missed_beacons->consec_missed_beacons);
1387 rx_missed_bcon_since_rx =
1388 le32_to_cpu(missed_beacons->consec_missed_beacons_since_last_rx);
1374 /* 1389 /*
1375 * TODO: the threshold should be adjusted based on latency conditions, 1390 * TODO: the threshold should be adjusted based on latency conditions,
1376 * and/or in case of a CS flow on one of the other AP vifs. 1391 * and/or in case of a CS flow on one of the other AP vifs.
@@ -1378,6 +1393,26 @@ static void iwl_mvm_beacon_loss_iterator(void *_data, u8 *mac,
1378 if (le32_to_cpu(missed_beacons->consec_missed_beacons_since_last_rx) > 1393 if (le32_to_cpu(missed_beacons->consec_missed_beacons_since_last_rx) >
1379 IWL_MVM_MISSED_BEACONS_THRESHOLD) 1394 IWL_MVM_MISSED_BEACONS_THRESHOLD)
1380 ieee80211_beacon_loss(vif); 1395 ieee80211_beacon_loss(vif);
1396
1397 if (!iwl_fw_dbg_trigger_enabled(mvm->fw,
1398 FW_DBG_TRIGGER_MISSED_BEACONS))
1399 return;
1400
1401 trigger = iwl_fw_dbg_get_trigger(mvm->fw,
1402 FW_DBG_TRIGGER_MISSED_BEACONS);
1403 bcon_trig = (void *)trigger->data;
1404 stop_trig_missed_bcon = le32_to_cpu(bcon_trig->stop_consec_missed_bcon);
1405 stop_trig_missed_bcon_since_rx =
1406 le32_to_cpu(bcon_trig->stop_consec_missed_bcon_since_rx);
1407
1408 /* TODO: implement start trigger */
1409
1410 if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trigger))
1411 return;
1412
1413 if (rx_missed_bcon_since_rx >= stop_trig_missed_bcon_since_rx ||
1414 rx_missed_bcon >= stop_trig_missed_bcon)
1415 iwl_mvm_fw_dbg_collect_trig(mvm, trigger, NULL);
1381} 1416}
1382 1417
1383int iwl_mvm_rx_missed_beacons_notif(struct iwl_mvm *mvm, 1418int iwl_mvm_rx_missed_beacons_notif(struct iwl_mvm *mvm,
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 09654e73a533..84555170b6f7 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -86,6 +86,7 @@
86#include "iwl-fw-error-dump.h" 86#include "iwl-fw-error-dump.h"
87#include "iwl-prph.h" 87#include "iwl-prph.h"
88#include "iwl-csr.h" 88#include "iwl-csr.h"
89#include "iwl-nvm-parse.h"
89 90
90static const struct ieee80211_iface_limit iwl_mvm_limits[] = { 91static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
91 { 92 {
@@ -301,6 +302,116 @@ static void iwl_mvm_reset_phy_ctxts(struct iwl_mvm *mvm)
301 } 302 }
302} 303}
303 304
305struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
306 const char *alpha2,
307 enum iwl_mcc_source src_id,
308 bool *changed)
309{
310 struct ieee80211_regdomain *regd = NULL;
311 struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
312 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
313 struct iwl_mcc_update_resp *resp;
314
315 IWL_DEBUG_LAR(mvm, "Getting regdomain data for %s from FW\n", alpha2);
316
317 lockdep_assert_held(&mvm->mutex);
318
319 resp = iwl_mvm_update_mcc(mvm, alpha2, src_id);
320 if (IS_ERR_OR_NULL(resp)) {
321 IWL_DEBUG_LAR(mvm, "Could not get update from FW %d\n",
322 PTR_RET(resp));
323 goto out;
324 }
325
326 if (changed)
327 *changed = (resp->status == MCC_RESP_NEW_CHAN_PROFILE);
328
329 regd = iwl_parse_nvm_mcc_info(mvm->trans->dev, mvm->cfg,
330 __le32_to_cpu(resp->n_channels),
331 resp->channels,
332 __le16_to_cpu(resp->mcc));
333 /* Store the return source id */
334 src_id = resp->source_id;
335 kfree(resp);
336 if (IS_ERR_OR_NULL(regd)) {
337 IWL_DEBUG_LAR(mvm, "Could not get parse update from FW %d\n",
338 PTR_RET(regd));
339 goto out;
340 }
341
342 IWL_DEBUG_LAR(mvm, "setting alpha2 from FW to %s (0x%x, 0x%x) src=%d\n",
343 regd->alpha2, regd->alpha2[0], regd->alpha2[1], src_id);
344 mvm->lar_regdom_set = true;
345 mvm->mcc_src = src_id;
346
347out:
348 return regd;
349}
350
351void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm)
352{
353 bool changed;
354 struct ieee80211_regdomain *regd;
355
356 if (!iwl_mvm_is_lar_supported(mvm))
357 return;
358
359 regd = iwl_mvm_get_current_regdomain(mvm, &changed);
360 if (!IS_ERR_OR_NULL(regd)) {
361 /* only update the regulatory core if changed */
362 if (changed)
363 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd);
364
365 kfree(regd);
366 }
367}
368
369struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
370 bool *changed)
371{
372 return iwl_mvm_get_regdomain(mvm->hw->wiphy, "ZZ",
373 iwl_mvm_is_wifi_mcc_supported(mvm) ?
374 MCC_SOURCE_GET_CURRENT :
375 MCC_SOURCE_OLD_FW, changed);
376}
377
378int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)
379{
380 enum iwl_mcc_source used_src;
381 struct ieee80211_regdomain *regd;
382 int ret;
383 bool changed;
384 const struct ieee80211_regdomain *r =
385 rtnl_dereference(mvm->hw->wiphy->regd);
386
387 if (!r)
388 return -ENOENT;
389
390 /* save the last source in case we overwrite it below */
391 used_src = mvm->mcc_src;
392 if (iwl_mvm_is_wifi_mcc_supported(mvm)) {
393 /* Notify the firmware we support wifi location updates */
394 regd = iwl_mvm_get_current_regdomain(mvm, NULL);
395 if (!IS_ERR_OR_NULL(regd))
396 kfree(regd);
397 }
398
399 /* Now set our last stored MCC and source */
400 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src,
401 &changed);
402 if (IS_ERR_OR_NULL(regd))
403 return -EIO;
404
405 /* update cfg80211 if the regdomain was changed */
406 if (changed)
407 ret = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
408 else
409 ret = 0;
410
411 kfree(regd);
412 return ret;
413}
414
304int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) 415int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
305{ 416{
306 struct ieee80211_hw *hw = mvm->hw; 417 struct ieee80211_hw *hw = mvm->hw;
@@ -339,13 +450,10 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
339 !iwlwifi_mod_params.sw_crypto) 450 !iwlwifi_mod_params.sw_crypto)
340 hw->flags |= IEEE80211_HW_MFP_CAPABLE; 451 hw->flags |= IEEE80211_HW_MFP_CAPABLE;
341 452
342 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN || 453 hw->flags |= IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS;
343 mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) { 454 hw->wiphy->features |=
344 hw->flags |= IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS; 455 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR |
345 hw->wiphy->features |= 456 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
346 NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR |
347 NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
348 }
349 457
350 hw->sta_data_size = sizeof(struct iwl_mvm_sta); 458 hw->sta_data_size = sizeof(struct iwl_mvm_sta);
351 hw->vif_data_size = sizeof(struct iwl_mvm_vif); 459 hw->vif_data_size = sizeof(struct iwl_mvm_vif);
@@ -359,8 +467,12 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
359 BIT(NL80211_IFTYPE_ADHOC); 467 BIT(NL80211_IFTYPE_ADHOC);
360 468
361 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 469 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
362 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | 470 hw->wiphy->regulatory_flags |= REGULATORY_ENABLE_RELAX_NO_IR;
363 REGULATORY_DISABLE_BEACON_HINTS; 471 if (iwl_mvm_is_lar_supported(mvm))
472 hw->wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
473 else
474 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
475 REGULATORY_DISABLE_BEACON_HINTS;
364 476
365 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_GO_UAPSD) 477 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_GO_UAPSD)
366 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 478 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
@@ -892,12 +1004,26 @@ static void iwl_mvm_dump_fifos(struct iwl_mvm *mvm,
892 iwl_trans_release_nic_access(mvm->trans, &flags); 1004 iwl_trans_release_nic_access(mvm->trans, &flags);
893} 1005}
894 1006
1007void iwl_mvm_free_fw_dump_desc(struct iwl_mvm *mvm)
1008{
1009 if (mvm->fw_dump_desc == &iwl_mvm_dump_desc_assert ||
1010 !mvm->fw_dump_desc)
1011 return;
1012
1013 kfree(mvm->fw_dump_desc);
1014 mvm->fw_dump_desc = NULL;
1015}
1016
1017#define IWL8260_ICCM_OFFSET 0x44000 /* Only for B-step */
1018#define IWL8260_ICCM_LEN 0xC000 /* Only for B-step */
1019
895void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm) 1020void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
896{ 1021{
897 struct iwl_fw_error_dump_file *dump_file; 1022 struct iwl_fw_error_dump_file *dump_file;
898 struct iwl_fw_error_dump_data *dump_data; 1023 struct iwl_fw_error_dump_data *dump_data;
899 struct iwl_fw_error_dump_info *dump_info; 1024 struct iwl_fw_error_dump_info *dump_info;
900 struct iwl_fw_error_dump_mem *dump_mem; 1025 struct iwl_fw_error_dump_mem *dump_mem;
1026 struct iwl_fw_error_dump_trigger_desc *dump_trig;
901 struct iwl_mvm_dump_ptrs *fw_error_dump; 1027 struct iwl_mvm_dump_ptrs *fw_error_dump;
902 u32 sram_len, sram_ofs; 1028 u32 sram_len, sram_ofs;
903 u32 file_len, fifo_data_len = 0; 1029 u32 file_len, fifo_data_len = 0;
@@ -906,16 +1032,6 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
906 1032
907 lockdep_assert_held(&mvm->mutex); 1033 lockdep_assert_held(&mvm->mutex);
908 1034
909 /* W/A for 8000 HW family A-step */
910 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
911 CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_A_STEP) {
912 if (smem_len)
913 smem_len = 0x38000;
914
915 if (sram2_len)
916 sram2_len = 0x10000;
917 }
918
919 fw_error_dump = kzalloc(sizeof(*fw_error_dump), GFP_KERNEL); 1035 fw_error_dump = kzalloc(sizeof(*fw_error_dump), GFP_KERNEL);
920 if (!fw_error_dump) 1036 if (!fw_error_dump)
921 return; 1037 return;
@@ -967,6 +1083,18 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
967 fifo_data_len + 1083 fifo_data_len +
968 sizeof(*dump_info); 1084 sizeof(*dump_info);
969 1085
1086 /*
1087 * In 8000 HW family B-step include the ICCM (which resides separately)
1088 */
1089 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
1090 CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_B_STEP)
1091 file_len += sizeof(*dump_data) + sizeof(*dump_mem) +
1092 IWL8260_ICCM_LEN;
1093
1094 if (mvm->fw_dump_desc)
1095 file_len += sizeof(*dump_data) + sizeof(*dump_trig) +
1096 mvm->fw_dump_desc->len;
1097
970 /* Make room for the SMEM, if it exists */ 1098 /* Make room for the SMEM, if it exists */
971 if (smem_len) 1099 if (smem_len)
972 file_len += sizeof(*dump_data) + sizeof(*dump_mem) + smem_len; 1100 file_len += sizeof(*dump_data) + sizeof(*dump_mem) + smem_len;
@@ -978,6 +1106,7 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
978 dump_file = vzalloc(file_len); 1106 dump_file = vzalloc(file_len);
979 if (!dump_file) { 1107 if (!dump_file) {
980 kfree(fw_error_dump); 1108 kfree(fw_error_dump);
1109 iwl_mvm_free_fw_dump_desc(mvm);
981 return; 1110 return;
982 } 1111 }
983 1112
@@ -1006,6 +1135,19 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
1006 if (test_bit(STATUS_FW_ERROR, &mvm->trans->status)) 1135 if (test_bit(STATUS_FW_ERROR, &mvm->trans->status))
1007 iwl_mvm_dump_fifos(mvm, &dump_data); 1136 iwl_mvm_dump_fifos(mvm, &dump_data);
1008 1137
1138 if (mvm->fw_dump_desc) {
1139 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_ERROR_INFO);
1140 dump_data->len = cpu_to_le32(sizeof(*dump_trig) +
1141 mvm->fw_dump_desc->len);
1142 dump_trig = (void *)dump_data->data;
1143 memcpy(dump_trig, &mvm->fw_dump_desc->trig_desc,
1144 sizeof(*dump_trig) + mvm->fw_dump_desc->len);
1145
1146 /* now we can free this copy */
1147 iwl_mvm_free_fw_dump_desc(mvm);
1148 dump_data = iwl_fw_error_next_data(dump_data);
1149 }
1150
1009 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM); 1151 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM);
1010 dump_data->len = cpu_to_le32(sram_len + sizeof(*dump_mem)); 1152 dump_data->len = cpu_to_le32(sram_len + sizeof(*dump_mem));
1011 dump_mem = (void *)dump_data->data; 1153 dump_mem = (void *)dump_data->data;
@@ -1036,6 +1178,19 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
1036 dump_mem->data, sram2_len); 1178 dump_mem->data, sram2_len);
1037 } 1179 }
1038 1180
1181 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
1182 CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_B_STEP) {
1183 dump_data = iwl_fw_error_next_data(dump_data);
1184 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM);
1185 dump_data->len = cpu_to_le32(IWL8260_ICCM_LEN +
1186 sizeof(*dump_mem));
1187 dump_mem = (void *)dump_data->data;
1188 dump_mem->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_SRAM);
1189 dump_mem->offset = cpu_to_le32(IWL8260_ICCM_OFFSET);
1190 iwl_trans_read_mem_bytes(mvm->trans, IWL8260_ICCM_OFFSET,
1191 dump_mem->data, IWL8260_ICCM_LEN);
1192 }
1193
1039 fw_error_dump->trans_ptr = iwl_trans_dump_data(mvm->trans); 1194 fw_error_dump->trans_ptr = iwl_trans_dump_data(mvm->trans);
1040 fw_error_dump->op_mode_len = file_len; 1195 fw_error_dump->op_mode_len = file_len;
1041 if (fw_error_dump->trans_ptr) 1196 if (fw_error_dump->trans_ptr)
@@ -1044,16 +1199,26 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
1044 1199
1045 dev_coredumpm(mvm->trans->dev, THIS_MODULE, fw_error_dump, 0, 1200 dev_coredumpm(mvm->trans->dev, THIS_MODULE, fw_error_dump, 0,
1046 GFP_KERNEL, iwl_mvm_read_coredump, iwl_mvm_free_coredump); 1201 GFP_KERNEL, iwl_mvm_read_coredump, iwl_mvm_free_coredump);
1202
1203 clear_bit(IWL_MVM_STATUS_DUMPING_FW_LOG, &mvm->status);
1047} 1204}
1048 1205
1206struct iwl_mvm_dump_desc iwl_mvm_dump_desc_assert = {
1207 .trig_desc = {
1208 .type = cpu_to_le32(FW_DBG_TRIGGER_FW_ASSERT),
1209 },
1210};
1211
1049static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm) 1212static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
1050{ 1213{
1051 /* clear the D3 reconfig, we only need it to avoid dumping a 1214 /* clear the D3 reconfig, we only need it to avoid dumping a
1052 * firmware coredump on reconfiguration, we shouldn't do that 1215 * firmware coredump on reconfiguration, we shouldn't do that
1053 * on D3->D0 transition 1216 * on D3->D0 transition
1054 */ 1217 */
1055 if (!test_and_clear_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status)) 1218 if (!test_and_clear_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status)) {
1219 mvm->fw_dump_desc = &iwl_mvm_dump_desc_assert;
1056 iwl_mvm_fw_error_dump(mvm); 1220 iwl_mvm_fw_error_dump(mvm);
1221 }
1057 1222
1058 /* cleanup all stale references (scan, roc), but keep the 1223 /* cleanup all stale references (scan, roc), but keep the
1059 * ucode_down ref until reconfig is complete 1224 * ucode_down ref until reconfig is complete
@@ -1094,6 +1259,10 @@ static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
1094 1259
1095 mvm->vif_count = 0; 1260 mvm->vif_count = 0;
1096 mvm->rx_ba_sessions = 0; 1261 mvm->rx_ba_sessions = 0;
1262 mvm->fw_dbg_conf = FW_DBG_INVALID;
1263
1264 /* keep statistics ticking */
1265 iwl_mvm_accu_radio_stats(mvm);
1097} 1266}
1098 1267
1099int __iwl_mvm_mac_start(struct iwl_mvm *mvm) 1268int __iwl_mvm_mac_start(struct iwl_mvm *mvm)
@@ -1153,7 +1322,7 @@ static void iwl_mvm_restart_complete(struct iwl_mvm *mvm)
1153 1322
1154 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); 1323 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1155 iwl_mvm_d0i3_enable_tx(mvm, NULL); 1324 iwl_mvm_d0i3_enable_tx(mvm, NULL);
1156 ret = iwl_mvm_update_quotas(mvm, NULL); 1325 ret = iwl_mvm_update_quotas(mvm, false, NULL);
1157 if (ret) 1326 if (ret)
1158 IWL_ERR(mvm, "Failed to update quotas after restart (%d)\n", 1327 IWL_ERR(mvm, "Failed to update quotas after restart (%d)\n",
1159 ret); 1328 ret);
@@ -1216,6 +1385,11 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
1216{ 1385{
1217 lockdep_assert_held(&mvm->mutex); 1386 lockdep_assert_held(&mvm->mutex);
1218 1387
1388 /* firmware counters are obviously reset now, but we shouldn't
1389 * partially track so also clear the fw_reset_accu counters.
1390 */
1391 memset(&mvm->accu_radio_stats, 0, sizeof(mvm->accu_radio_stats));
1392
1219 /* 1393 /*
1220 * Disallow low power states when the FW is down by taking 1394 * Disallow low power states when the FW is down by taking
1221 * the UCODE_DOWN ref. in case of ongoing hw restart the 1395 * the UCODE_DOWN ref. in case of ongoing hw restart the
@@ -1246,6 +1420,20 @@ void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
1246 */ 1420 */
1247 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); 1421 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1248 1422
1423 /* We shouldn't have any UIDs still set. Loop over all the UIDs to
1424 * make sure there's nothing left there and warn if any is found.
1425 */
1426 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) {
1427 int i;
1428
1429 for (i = 0; i < IWL_MVM_MAX_SIMULTANEOUS_SCANS; i++) {
1430 if (WARN_ONCE(mvm->scan_uid[i],
1431 "UMAC scan UID %d was not cleaned\n",
1432 mvm->scan_uid[i]))
1433 mvm->scan_uid[i] = 0;
1434 }
1435 }
1436
1249 mvm->ucode_loaded = false; 1437 mvm->ucode_loaded = false;
1250} 1438}
1251 1439
@@ -1255,7 +1443,8 @@ static void iwl_mvm_mac_stop(struct ieee80211_hw *hw)
1255 1443
1256 flush_work(&mvm->d0i3_exit_work); 1444 flush_work(&mvm->d0i3_exit_work);
1257 flush_work(&mvm->async_handlers_wk); 1445 flush_work(&mvm->async_handlers_wk);
1258 flush_work(&mvm->fw_error_dump_wk); 1446 cancel_delayed_work_sync(&mvm->fw_dump_wk);
1447 iwl_mvm_free_fw_dump_desc(mvm);
1259 1448
1260 mutex_lock(&mvm->mutex); 1449 mutex_lock(&mvm->mutex);
1261 __iwl_mvm_mac_stop(mvm); 1450 __iwl_mvm_mac_stop(mvm);
@@ -1303,6 +1492,8 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
1303 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1492 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1304 int ret; 1493 int ret;
1305 1494
1495 mvmvif->mvm = mvm;
1496
1306 /* 1497 /*
1307 * make sure D0i3 exit is completed, otherwise a target access 1498 * make sure D0i3 exit is completed, otherwise a target access
1308 * during tx queue configuration could be done when still in 1499 * during tx queue configuration could be done when still in
@@ -1320,6 +1511,11 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
1320 1511
1321 mutex_lock(&mvm->mutex); 1512 mutex_lock(&mvm->mutex);
1322 1513
1514 /* make sure that beacon statistics don't go backwards with FW reset */
1515 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1516 mvmvif->beacon_stats.accu_num_beacons +=
1517 mvmvif->beacon_stats.num_beacons;
1518
1323 /* Allocate resources for the MAC context, and add it to the fw */ 1519 /* Allocate resources for the MAC context, and add it to the fw */
1324 ret = iwl_mvm_mac_ctxt_init(mvm, vif); 1520 ret = iwl_mvm_mac_ctxt_init(mvm, vif);
1325 if (ret) 1521 if (ret)
@@ -1434,9 +1630,33 @@ static void iwl_mvm_prepare_mac_removal(struct iwl_mvm *mvm,
1434 u32 tfd_msk = iwl_mvm_mac_get_queues_mask(vif); 1630 u32 tfd_msk = iwl_mvm_mac_get_queues_mask(vif);
1435 1631
1436 if (tfd_msk) { 1632 if (tfd_msk) {
1633 /*
1634 * mac80211 first removes all the stations of the vif and
1635 * then removes the vif. When it removes a station it also
1636 * flushes the AMPDU session. So by now, all the AMPDU sessions
1637 * of all the stations of this vif are closed, and the queues
1638 * of these AMPDU sessions are properly closed.
1639 * We still need to take care of the shared queues of the vif.
1640 * Flush them here.
1641 */
1437 mutex_lock(&mvm->mutex); 1642 mutex_lock(&mvm->mutex);
1438 iwl_mvm_flush_tx_path(mvm, tfd_msk, true); 1643 iwl_mvm_flush_tx_path(mvm, tfd_msk, true);
1439 mutex_unlock(&mvm->mutex); 1644 mutex_unlock(&mvm->mutex);
1645
1646 /*
1647 * There are transports that buffer a few frames in the host.
1648 * For these, the flush above isn't enough since while we were
1649 * flushing, the transport might have sent more frames to the
1650 * device. To solve this, wait here until the transport is
1651 * empty. Technically, this could have replaced the flush
1652 * above, but flush is much faster than draining. So flush
1653 * first, and drain to make sure we have no frames in the
1654 * transport anymore.
1655 * If a station still had frames on the shared queues, it is
1656 * already marked as draining, so to complete the draining, we
1657 * just need to wait until the transport is empty.
1658 */
1659 iwl_trans_wait_tx_queue_empty(mvm->trans, tfd_msk);
1440 } 1660 }
1441 1661
1442 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { 1662 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
@@ -1813,8 +2033,13 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
1813 2033
1814 if (changes & BSS_CHANGED_ASSOC) { 2034 if (changes & BSS_CHANGED_ASSOC) {
1815 if (bss_conf->assoc) { 2035 if (bss_conf->assoc) {
2036 /* clear statistics to get clean beacon counter */
2037 iwl_mvm_request_statistics(mvm, true);
2038 memset(&mvmvif->beacon_stats, 0,
2039 sizeof(mvmvif->beacon_stats));
2040
1816 /* add quota for this interface */ 2041 /* add quota for this interface */
1817 ret = iwl_mvm_update_quotas(mvm, NULL); 2042 ret = iwl_mvm_update_quotas(mvm, true, NULL);
1818 if (ret) { 2043 if (ret) {
1819 IWL_ERR(mvm, "failed to update quotas\n"); 2044 IWL_ERR(mvm, "failed to update quotas\n");
1820 return; 2045 return;
@@ -1866,7 +2091,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
1866 mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT; 2091 mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
1867 mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT; 2092 mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
1868 /* remove quota for this interface */ 2093 /* remove quota for this interface */
1869 ret = iwl_mvm_update_quotas(mvm, NULL); 2094 ret = iwl_mvm_update_quotas(mvm, false, NULL);
1870 if (ret) 2095 if (ret)
1871 IWL_ERR(mvm, "failed to update quotas\n"); 2096 IWL_ERR(mvm, "failed to update quotas\n");
1872 2097
@@ -1985,7 +2210,7 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
1985 /* power updated needs to be done before quotas */ 2210 /* power updated needs to be done before quotas */
1986 iwl_mvm_power_update_mac(mvm); 2211 iwl_mvm_power_update_mac(mvm);
1987 2212
1988 ret = iwl_mvm_update_quotas(mvm, NULL); 2213 ret = iwl_mvm_update_quotas(mvm, false, NULL);
1989 if (ret) 2214 if (ret)
1990 goto out_quota_failed; 2215 goto out_quota_failed;
1991 2216
@@ -2001,8 +2226,7 @@ static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
2001 if (iwl_mvm_phy_ctx_count(mvm) > 1) 2226 if (iwl_mvm_phy_ctx_count(mvm) > 1)
2002 iwl_mvm_teardown_tdls_peers(mvm); 2227 iwl_mvm_teardown_tdls_peers(mvm);
2003 2228
2004 mutex_unlock(&mvm->mutex); 2229 goto out_unlock;
2005 return 0;
2006 2230
2007out_quota_failed: 2231out_quota_failed:
2008 iwl_mvm_power_update_mac(mvm); 2232 iwl_mvm_power_update_mac(mvm);
@@ -2051,7 +2275,7 @@ static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
2051 if (vif->p2p && mvm->p2p_device_vif) 2275 if (vif->p2p && mvm->p2p_device_vif)
2052 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL); 2276 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL);
2053 2277
2054 iwl_mvm_update_quotas(mvm, NULL); 2278 iwl_mvm_update_quotas(mvm, false, NULL);
2055 iwl_mvm_send_rm_bcast_sta(mvm, vif); 2279 iwl_mvm_send_rm_bcast_sta(mvm, vif);
2056 iwl_mvm_binding_remove_vif(mvm, vif); 2280 iwl_mvm_binding_remove_vif(mvm, vif);
2057 2281
@@ -2190,6 +2414,12 @@ static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
2190 2414
2191 mutex_lock(&mvm->mutex); 2415 mutex_lock(&mvm->mutex);
2192 2416
2417 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) {
2418 IWL_ERR(mvm, "scan while LAR regdomain is not set\n");
2419 ret = -EBUSY;
2420 goto out;
2421 }
2422
2193 if (mvm->scan_status != IWL_MVM_SCAN_NONE) { 2423 if (mvm->scan_status != IWL_MVM_SCAN_NONE) {
2194 ret = -EBUSY; 2424 ret = -EBUSY;
2195 goto out; 2425 goto out;
@@ -2199,10 +2429,8 @@ static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
2199 2429
2200 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) 2430 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN)
2201 ret = iwl_mvm_scan_umac(mvm, vif, hw_req); 2431 ret = iwl_mvm_scan_umac(mvm, vif, hw_req);
2202 else if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN)
2203 ret = iwl_mvm_unified_scan_lmac(mvm, vif, hw_req);
2204 else 2432 else
2205 ret = iwl_mvm_scan_request(mvm, vif, req); 2433 ret = iwl_mvm_unified_scan_lmac(mvm, vif, hw_req);
2206 2434
2207 if (ret) 2435 if (ret)
2208 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); 2436 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN);
@@ -2272,25 +2500,35 @@ static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw,
2272{ 2500{
2273 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2501 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2274 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); 2502 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
2503 unsigned long txqs = 0, tids = 0;
2275 int tid; 2504 int tid;
2276 2505
2506 spin_lock_bh(&mvmsta->lock);
2507 for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) {
2508 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
2509
2510 if (tid_data->state != IWL_AGG_ON &&
2511 tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA)
2512 continue;
2513
2514 __set_bit(tid_data->txq_id, &txqs);
2515
2516 if (iwl_mvm_tid_queued(tid_data) == 0)
2517 continue;
2518
2519 __set_bit(tid, &tids);
2520 }
2521
2277 switch (cmd) { 2522 switch (cmd) {
2278 case STA_NOTIFY_SLEEP: 2523 case STA_NOTIFY_SLEEP:
2279 if (atomic_read(&mvm->pending_frames[mvmsta->sta_id]) > 0) 2524 if (atomic_read(&mvm->pending_frames[mvmsta->sta_id]) > 0)
2280 ieee80211_sta_block_awake(hw, sta, true); 2525 ieee80211_sta_block_awake(hw, sta, true);
2281 spin_lock_bh(&mvmsta->lock);
2282 for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) {
2283 struct iwl_mvm_tid_data *tid_data;
2284 2526
2285 tid_data = &mvmsta->tid_data[tid]; 2527 for_each_set_bit(tid, &tids, IWL_MAX_TID_COUNT)
2286 if (tid_data->state != IWL_AGG_ON &&
2287 tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA)
2288 continue;
2289 if (iwl_mvm_tid_queued(tid_data) == 0)
2290 continue;
2291 ieee80211_sta_set_buffered(sta, tid, true); 2528 ieee80211_sta_set_buffered(sta, tid, true);
2292 } 2529
2293 spin_unlock_bh(&mvmsta->lock); 2530 if (txqs)
2531 iwl_trans_freeze_txq_timer(mvm->trans, txqs, true);
2294 /* 2532 /*
2295 * The fw updates the STA to be asleep. Tx packets on the Tx 2533 * The fw updates the STA to be asleep. Tx packets on the Tx
2296 * queues to this station will not be transmitted. The fw will 2534 * queues to this station will not be transmitted. The fw will
@@ -2300,11 +2538,15 @@ static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw,
2300 case STA_NOTIFY_AWAKE: 2538 case STA_NOTIFY_AWAKE:
2301 if (WARN_ON(mvmsta->sta_id == IWL_MVM_STATION_COUNT)) 2539 if (WARN_ON(mvmsta->sta_id == IWL_MVM_STATION_COUNT))
2302 break; 2540 break;
2541
2542 if (txqs)
2543 iwl_trans_freeze_txq_timer(mvm->trans, txqs, false);
2303 iwl_mvm_sta_modify_ps_wake(mvm, sta); 2544 iwl_mvm_sta_modify_ps_wake(mvm, sta);
2304 break; 2545 break;
2305 default: 2546 default:
2306 break; 2547 break;
2307 } 2548 }
2549 spin_unlock_bh(&mvmsta->lock);
2308} 2550}
2309 2551
2310static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw, 2552static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw,
@@ -2542,13 +2784,13 @@ static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
2542 2784
2543 mutex_lock(&mvm->mutex); 2785 mutex_lock(&mvm->mutex);
2544 2786
2545 /* Newest FW fixes sched scan while connected on another interface */ 2787 if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) {
2546 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) { 2788 IWL_ERR(mvm, "sched-scan while LAR regdomain is not set\n");
2547 if (!vif->bss_conf.idle) { 2789 ret = -EBUSY;
2548 ret = -EBUSY; 2790 goto out;
2549 goto out; 2791 }
2550 } 2792
2551 } else if (!iwl_mvm_is_idle(mvm)) { 2793 if (!vif->bss_conf.idle) {
2552 ret = -EBUSY; 2794 ret = -EBUSY;
2553 goto out; 2795 goto out;
2554 } 2796 }
@@ -2838,6 +3080,8 @@ static int iwl_mvm_roc(struct ieee80211_hw *hw,
2838 IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value, 3080 IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value,
2839 duration, type); 3081 duration, type);
2840 3082
3083 flush_work(&mvm->roc_done_wk);
3084
2841 mutex_lock(&mvm->mutex); 3085 mutex_lock(&mvm->mutex);
2842 3086
2843 switch (vif->type) { 3087 switch (vif->type) {
@@ -3109,14 +3353,14 @@ static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
3109 */ 3353 */
3110 if (vif->type == NL80211_IFTYPE_MONITOR) { 3354 if (vif->type == NL80211_IFTYPE_MONITOR) {
3111 mvmvif->monitor_active = true; 3355 mvmvif->monitor_active = true;
3112 ret = iwl_mvm_update_quotas(mvm, NULL); 3356 ret = iwl_mvm_update_quotas(mvm, false, NULL);
3113 if (ret) 3357 if (ret)
3114 goto out_remove_binding; 3358 goto out_remove_binding;
3115 } 3359 }
3116 3360
3117 /* Handle binding during CSA */ 3361 /* Handle binding during CSA */
3118 if (vif->type == NL80211_IFTYPE_AP) { 3362 if (vif->type == NL80211_IFTYPE_AP) {
3119 iwl_mvm_update_quotas(mvm, NULL); 3363 iwl_mvm_update_quotas(mvm, false, NULL);
3120 iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL); 3364 iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
3121 } 3365 }
3122 3366
@@ -3140,7 +3384,7 @@ static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
3140 3384
3141 iwl_mvm_unref(mvm, IWL_MVM_REF_PROTECT_CSA); 3385 iwl_mvm_unref(mvm, IWL_MVM_REF_PROTECT_CSA);
3142 3386
3143 iwl_mvm_update_quotas(mvm, NULL); 3387 iwl_mvm_update_quotas(mvm, false, NULL);
3144 } 3388 }
3145 3389
3146 goto out; 3390 goto out;
@@ -3213,7 +3457,7 @@ static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
3213 break; 3457 break;
3214 } 3458 }
3215 3459
3216 iwl_mvm_update_quotas(mvm, disabled_vif); 3460 iwl_mvm_update_quotas(mvm, false, disabled_vif);
3217 iwl_mvm_binding_remove_vif(mvm, vif); 3461 iwl_mvm_binding_remove_vif(mvm, vif);
3218 3462
3219out: 3463out:
@@ -3405,7 +3649,7 @@ static int __iwl_mvm_mac_testmode_cmd(struct iwl_mvm *mvm,
3405 mvm->noa_duration = noa_duration; 3649 mvm->noa_duration = noa_duration;
3406 mvm->noa_vif = vif; 3650 mvm->noa_vif = vif;
3407 3651
3408 return iwl_mvm_update_quotas(mvm, NULL); 3652 return iwl_mvm_update_quotas(mvm, false, NULL);
3409 case IWL_MVM_TM_CMD_SET_BEACON_FILTER: 3653 case IWL_MVM_TM_CMD_SET_BEACON_FILTER:
3410 /* must be associated client vif - ignore authorized */ 3654 /* must be associated client vif - ignore authorized */
3411 if (!vif || vif->type != NL80211_IFTYPE_STATION || 3655 if (!vif || vif->type != NL80211_IFTYPE_STATION ||
@@ -3462,9 +3706,13 @@ static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw,
3462 3706
3463 mutex_lock(&mvm->mutex); 3707 mutex_lock(&mvm->mutex);
3464 3708
3709 mvmvif->csa_failed = false;
3710
3465 IWL_DEBUG_MAC80211(mvm, "pre CSA to freq %d\n", 3711 IWL_DEBUG_MAC80211(mvm, "pre CSA to freq %d\n",
3466 chsw->chandef.center_freq1); 3712 chsw->chandef.center_freq1);
3467 3713
3714 iwl_fw_dbg_trigger_simple_stop(mvm, vif, FW_DBG_TRIGGER_CHANNEL_SWITCH);
3715
3468 switch (vif->type) { 3716 switch (vif->type) {
3469 case NL80211_IFTYPE_AP: 3717 case NL80211_IFTYPE_AP:
3470 csa_vif = 3718 csa_vif =
@@ -3534,6 +3782,12 @@ static int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw,
3534 3782
3535 mutex_lock(&mvm->mutex); 3783 mutex_lock(&mvm->mutex);
3536 3784
3785 if (mvmvif->csa_failed) {
3786 mvmvif->csa_failed = false;
3787 ret = -EIO;
3788 goto out_unlock;
3789 }
3790
3537 if (vif->type == NL80211_IFTYPE_STATION) { 3791 if (vif->type == NL80211_IFTYPE_STATION) {
3538 struct iwl_mvm_sta *mvmsta; 3792 struct iwl_mvm_sta *mvmsta;
3539 3793
@@ -3613,6 +3867,154 @@ static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
3613 } 3867 }
3614} 3868}
3615 3869
3870static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx,
3871 struct survey_info *survey)
3872{
3873 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3874 int ret;
3875
3876 memset(survey, 0, sizeof(*survey));
3877
3878 /* only support global statistics right now */
3879 if (idx != 0)
3880 return -ENOENT;
3881
3882 if (!(mvm->fw->ucode_capa.capa[0] &
3883 IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
3884 return -ENOENT;
3885
3886 mutex_lock(&mvm->mutex);
3887
3888 if (mvm->ucode_loaded) {
3889 ret = iwl_mvm_request_statistics(mvm, false);
3890 if (ret)
3891 goto out;
3892 }
3893
3894 survey->filled = SURVEY_INFO_TIME |
3895 SURVEY_INFO_TIME_RX |
3896 SURVEY_INFO_TIME_TX |
3897 SURVEY_INFO_TIME_SCAN;
3898 survey->time = mvm->accu_radio_stats.on_time_rf +
3899 mvm->radio_stats.on_time_rf;
3900 do_div(survey->time, USEC_PER_MSEC);
3901
3902 survey->time_rx = mvm->accu_radio_stats.rx_time +
3903 mvm->radio_stats.rx_time;
3904 do_div(survey->time_rx, USEC_PER_MSEC);
3905
3906 survey->time_tx = mvm->accu_radio_stats.tx_time +
3907 mvm->radio_stats.tx_time;
3908 do_div(survey->time_tx, USEC_PER_MSEC);
3909
3910 survey->time_scan = mvm->accu_radio_stats.on_time_scan +
3911 mvm->radio_stats.on_time_scan;
3912 do_div(survey->time_scan, USEC_PER_MSEC);
3913
3914 ret = 0;
3915 out:
3916 mutex_unlock(&mvm->mutex);
3917 return ret;
3918}
3919
3920static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw,
3921 struct ieee80211_vif *vif,
3922 struct ieee80211_sta *sta,
3923 struct station_info *sinfo)
3924{
3925 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3926 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3927 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
3928
3929 if (!(mvm->fw->ucode_capa.capa[0] &
3930 IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
3931 return;
3932
3933 /* if beacon filtering isn't on mac80211 does it anyway */
3934 if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
3935 return;
3936
3937 if (!vif->bss_conf.assoc)
3938 return;
3939
3940 mutex_lock(&mvm->mutex);
3941
3942 if (mvmvif->ap_sta_id != mvmsta->sta_id)
3943 goto unlock;
3944
3945 if (iwl_mvm_request_statistics(mvm, false))
3946 goto unlock;
3947
3948 sinfo->rx_beacon = mvmvif->beacon_stats.num_beacons +
3949 mvmvif->beacon_stats.accu_num_beacons;
3950 sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_RX);
3951 if (mvmvif->beacon_stats.avg_signal) {
3952 /* firmware only reports a value after RXing a few beacons */
3953 sinfo->rx_beacon_signal_avg = mvmvif->beacon_stats.avg_signal;
3954 sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
3955 }
3956 unlock:
3957 mutex_unlock(&mvm->mutex);
3958}
3959
3960static void iwl_mvm_mac_event_callback(struct ieee80211_hw *hw,
3961 struct ieee80211_vif *vif,
3962 const struct ieee80211_event *event)
3963{
3964#define CHECK_MLME_TRIGGER(_mvm, _trig, _buf, _cnt, _fmt...) \
3965 do { \
3966 if ((_cnt) && --(_cnt)) \
3967 break; \
3968 iwl_mvm_fw_dbg_collect_trig(_mvm, _trig, _fmt);\
3969 } while (0)
3970
3971 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3972 struct iwl_fw_dbg_trigger_tlv *trig;
3973 struct iwl_fw_dbg_trigger_mlme *trig_mlme;
3974
3975 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME))
3976 return;
3977
3978 if (event->u.mlme.status == MLME_SUCCESS)
3979 return;
3980
3981 trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME);
3982 trig_mlme = (void *)trig->data;
3983 if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
3984 return;
3985
3986 if (event->u.mlme.data == ASSOC_EVENT) {
3987 if (event->u.mlme.status == MLME_DENIED)
3988 CHECK_MLME_TRIGGER(mvm, trig, buf,
3989 trig_mlme->stop_assoc_denied,
3990 "DENIED ASSOC: reason %d",
3991 event->u.mlme.reason);
3992 else if (event->u.mlme.status == MLME_TIMEOUT)
3993 CHECK_MLME_TRIGGER(mvm, trig, buf,
3994 trig_mlme->stop_assoc_timeout,
3995 "ASSOC TIMEOUT");
3996 } else if (event->u.mlme.data == AUTH_EVENT) {
3997 if (event->u.mlme.status == MLME_DENIED)
3998 CHECK_MLME_TRIGGER(mvm, trig, buf,
3999 trig_mlme->stop_auth_denied,
4000 "DENIED AUTH: reason %d",
4001 event->u.mlme.reason);
4002 else if (event->u.mlme.status == MLME_TIMEOUT)
4003 CHECK_MLME_TRIGGER(mvm, trig, buf,
4004 trig_mlme->stop_auth_timeout,
4005 "AUTH TIMEOUT");
4006 } else if (event->u.mlme.data == DEAUTH_RX_EVENT) {
4007 CHECK_MLME_TRIGGER(mvm, trig, buf,
4008 trig_mlme->stop_rx_deauth,
4009 "DEAUTH RX %d", event->u.mlme.reason);
4010 } else if (event->u.mlme.data == DEAUTH_TX_EVENT) {
4011 CHECK_MLME_TRIGGER(mvm, trig, buf,
4012 trig_mlme->stop_tx_deauth,
4013 "DEAUTH TX %d", event->u.mlme.reason);
4014 }
4015#undef CHECK_MLME_TRIGGER
4016}
4017
3616const struct ieee80211_ops iwl_mvm_hw_ops = { 4018const struct ieee80211_ops iwl_mvm_hw_ops = {
3617 .tx = iwl_mvm_mac_tx, 4019 .tx = iwl_mvm_mac_tx,
3618 .ampdu_action = iwl_mvm_mac_ampdu_action, 4020 .ampdu_action = iwl_mvm_mac_ampdu_action,
@@ -3666,6 +4068,8 @@ const struct ieee80211_ops iwl_mvm_hw_ops = {
3666 .tdls_cancel_channel_switch = iwl_mvm_tdls_cancel_channel_switch, 4068 .tdls_cancel_channel_switch = iwl_mvm_tdls_cancel_channel_switch,
3667 .tdls_recv_channel_switch = iwl_mvm_tdls_recv_channel_switch, 4069 .tdls_recv_channel_switch = iwl_mvm_tdls_recv_channel_switch,
3668 4070
4071 .event_callback = iwl_mvm_mac_event_callback,
4072
3669 CFG80211_TESTMODE_CMD(iwl_mvm_mac_testmode_cmd) 4073 CFG80211_TESTMODE_CMD(iwl_mvm_mac_testmode_cmd)
3670 4074
3671#ifdef CONFIG_PM_SLEEP 4075#ifdef CONFIG_PM_SLEEP
@@ -3679,4 +4083,6 @@ const struct ieee80211_ops iwl_mvm_hw_ops = {
3679#endif 4083#endif
3680 .set_default_unicast_key = iwl_mvm_set_default_unicast_key, 4084 .set_default_unicast_key = iwl_mvm_set_default_unicast_key,
3681#endif 4085#endif
4086 .get_survey = iwl_mvm_mac_get_survey,
4087 .sta_statistics = iwl_mvm_mac_sta_statistics,
3682}; 4088};
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index 6c69d0584f6c..d5522a161242 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -75,6 +75,7 @@
75#include "iwl-trans.h" 75#include "iwl-trans.h"
76#include "iwl-notif-wait.h" 76#include "iwl-notif-wait.h"
77#include "iwl-eeprom-parse.h" 77#include "iwl-eeprom-parse.h"
78#include "iwl-fw-file.h"
78#include "sta.h" 79#include "sta.h"
79#include "fw-api.h" 80#include "fw-api.h"
80#include "constants.h" 81#include "constants.h"
@@ -145,6 +146,19 @@ struct iwl_mvm_dump_ptrs {
145 u32 op_mode_len; 146 u32 op_mode_len;
146}; 147};
147 148
149/**
150 * struct iwl_mvm_dump_desc - describes the dump
151 * @len: length of trig_desc->data
152 * @trig_desc: the description of the dump
153 */
154struct iwl_mvm_dump_desc {
155 size_t len;
156 /* must be last */
157 struct iwl_fw_error_dump_trigger_desc trig_desc;
158};
159
160extern struct iwl_mvm_dump_desc iwl_mvm_dump_desc_assert;
161
148struct iwl_mvm_phy_ctxt { 162struct iwl_mvm_phy_ctxt {
149 u16 id; 163 u16 id;
150 u16 color; 164 u16 color;
@@ -335,10 +349,15 @@ struct iwl_mvm_vif_bf_data {
335 * @bcast_sta: station used for broadcast packets. Used by the following 349 * @bcast_sta: station used for broadcast packets. Used by the following
336 * vifs: P2P_DEVICE, GO and AP. 350 * vifs: P2P_DEVICE, GO and AP.
337 * @beacon_skb: the skb used to hold the AP/GO beacon template 351 * @beacon_skb: the skb used to hold the AP/GO beacon template
338 * @smps_requests: the SMPS requests of differents parts of the driver, 352 * @smps_requests: the SMPS requests of different parts of the driver,
339 * combined on update to yield the overall request to mac80211. 353 * combined on update to yield the overall request to mac80211.
354 * @beacon_stats: beacon statistics, containing the # of received beacons,
355 * # of received beacons accumulated over FW restart, and the current
356 * average signal of beacons retrieved from the firmware
357 * @csa_failed: CSA failed to schedule time event, report an error later
340 */ 358 */
341struct iwl_mvm_vif { 359struct iwl_mvm_vif {
360 struct iwl_mvm *mvm;
342 u16 id; 361 u16 id;
343 u16 color; 362 u16 color;
344 u8 ap_sta_id; 363 u8 ap_sta_id;
@@ -354,6 +373,11 @@ struct iwl_mvm_vif {
354 bool ps_disabled; 373 bool ps_disabled;
355 struct iwl_mvm_vif_bf_data bf_data; 374 struct iwl_mvm_vif_bf_data bf_data;
356 375
376 struct {
377 u32 num_beacons, accu_num_beacons;
378 u8 avg_signal;
379 } beacon_stats;
380
357 u32 ap_beacon_time; 381 u32 ap_beacon_time;
358 382
359 enum iwl_tsf_id tsf_id; 383 enum iwl_tsf_id tsf_id;
@@ -396,7 +420,6 @@ struct iwl_mvm_vif {
396#endif 420#endif
397 421
398#ifdef CONFIG_IWLWIFI_DEBUGFS 422#ifdef CONFIG_IWLWIFI_DEBUGFS
399 struct iwl_mvm *mvm;
400 struct dentry *dbgfs_dir; 423 struct dentry *dbgfs_dir;
401 struct dentry *dbgfs_slink; 424 struct dentry *dbgfs_slink;
402 struct iwl_dbgfs_pm dbgfs_pm; 425 struct iwl_dbgfs_pm dbgfs_pm;
@@ -411,6 +434,7 @@ struct iwl_mvm_vif {
411 434
412 /* Indicates that CSA countdown may be started */ 435 /* Indicates that CSA countdown may be started */
413 bool csa_countdown; 436 bool csa_countdown;
437 bool csa_failed;
414}; 438};
415 439
416static inline struct iwl_mvm_vif * 440static inline struct iwl_mvm_vif *
@@ -593,6 +617,13 @@ struct iwl_mvm {
593 617
594 struct mvm_statistics_rx rx_stats; 618 struct mvm_statistics_rx rx_stats;
595 619
620 struct {
621 u64 rx_time;
622 u64 tx_time;
623 u64 on_time_rf;
624 u64 on_time_scan;
625 } radio_stats, accu_radio_stats;
626
596 u8 queue_to_mac80211[IWL_MAX_HW_QUEUES]; 627 u8 queue_to_mac80211[IWL_MAX_HW_QUEUES];
597 atomic_t mac80211_queue_stop_count[IEEE80211_MAX_QUEUES]; 628 atomic_t mac80211_queue_stop_count[IEEE80211_MAX_QUEUES];
598 629
@@ -657,7 +688,7 @@ struct iwl_mvm {
657 bool disable_power_off; 688 bool disable_power_off;
658 bool disable_power_off_d3; 689 bool disable_power_off_d3;
659 690
660 bool scan_iter_notif_enabled; 691 u32 scan_iter_notif_enabled; /* must be u32 for debugfs_create_bool */
661 692
662 struct debugfs_blob_wrapper nvm_hw_blob; 693 struct debugfs_blob_wrapper nvm_hw_blob;
663 struct debugfs_blob_wrapper nvm_sw_blob; 694 struct debugfs_blob_wrapper nvm_sw_blob;
@@ -666,6 +697,7 @@ struct iwl_mvm {
666 697
667 struct iwl_mvm_frame_stats drv_rx_stats; 698 struct iwl_mvm_frame_stats drv_rx_stats;
668 spinlock_t drv_stats_lock; 699 spinlock_t drv_stats_lock;
700 u16 dbgfs_rx_phyinfo;
669#endif 701#endif
670 702
671 struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX]; 703 struct iwl_mvm_phy_ctxt phy_ctxts[NUM_PHY_CTX];
@@ -687,8 +719,9 @@ struct iwl_mvm {
687 719
688 /* -1 for always, 0 for never, >0 for that many times */ 720 /* -1 for always, 0 for never, >0 for that many times */
689 s8 restart_fw; 721 s8 restart_fw;
690 struct work_struct fw_error_dump_wk; 722 u8 fw_dbg_conf;
691 enum iwl_fw_dbg_conf fw_dbg_conf; 723 struct delayed_work fw_dump_wk;
724 struct iwl_mvm_dump_desc *fw_dump_desc;
692 725
693#ifdef CONFIG_IWLWIFI_LEDS 726#ifdef CONFIG_IWLWIFI_LEDS
694 struct led_classdev led; 727 struct led_classdev led;
@@ -715,6 +748,7 @@ struct iwl_mvm {
715 void *d3_resume_sram; 748 void *d3_resume_sram;
716 u32 d3_test_pme_ptr; 749 u32 d3_test_pme_ptr;
717 struct ieee80211_vif *keep_vif; 750 struct ieee80211_vif *keep_vif;
751 u32 last_netdetect_scans; /* no. of scans in the last net-detect wake */
718#endif 752#endif
719#endif 753#endif
720 754
@@ -779,6 +813,9 @@ struct iwl_mvm {
779 /* system time of last beacon (for AP/GO interface) */ 813 /* system time of last beacon (for AP/GO interface) */
780 u32 ap_last_beacon_gp2; 814 u32 ap_last_beacon_gp2;
781 815
816 bool lar_regdom_set;
817 enum iwl_mcc_source mcc_src;
818
782 u8 low_latency_agg_frame_limit; 819 u8 low_latency_agg_frame_limit;
783 820
784 /* TDLS channel switch data */ 821 /* TDLS channel switch data */
@@ -824,6 +861,7 @@ enum iwl_mvm_status {
824 IWL_MVM_STATUS_IN_D0I3, 861 IWL_MVM_STATUS_IN_D0I3,
825 IWL_MVM_STATUS_ROC_AUX_RUNNING, 862 IWL_MVM_STATUS_ROC_AUX_RUNNING,
826 IWL_MVM_STATUS_D3_RECONFIG, 863 IWL_MVM_STATUS_D3_RECONFIG,
864 IWL_MVM_STATUS_DUMPING_FW_LOG,
827}; 865};
828 866
829static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm) 867static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm)
@@ -878,11 +916,48 @@ static inline bool iwl_mvm_is_d0i3_supported(struct iwl_mvm *mvm)
878 (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_D0I3_SUPPORT); 916 (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_D0I3_SUPPORT);
879} 917}
880 918
919static inline bool iwl_mvm_is_lar_supported(struct iwl_mvm *mvm)
920{
921 bool nvm_lar = mvm->nvm_data->lar_enabled;
922 bool tlv_lar = mvm->fw->ucode_capa.capa[0] &
923 IWL_UCODE_TLV_CAPA_LAR_SUPPORT;
924
925 if (iwlwifi_mod_params.lar_disable)
926 return false;
927
928 /*
929 * Enable LAR only if it is supported by the FW (TLV) &&
930 * enabled in the NVM
931 */
932 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000)
933 return nvm_lar && tlv_lar;
934 else
935 return tlv_lar;
936}
937
938static inline bool iwl_mvm_is_wifi_mcc_supported(struct iwl_mvm *mvm)
939{
940 return mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_WIFI_MCC_UPDATE ||
941 mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_LAR_MULTI_MCC;
942}
943
881static inline bool iwl_mvm_is_scd_cfg_supported(struct iwl_mvm *mvm) 944static inline bool iwl_mvm_is_scd_cfg_supported(struct iwl_mvm *mvm)
882{ 945{
883 return mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SCD_CFG; 946 return mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SCD_CFG;
884} 947}
885 948
949static inline bool iwl_mvm_bt_is_plcr_supported(struct iwl_mvm *mvm)
950{
951 return (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_BT_COEX_PLCR) &&
952 IWL_MVM_BT_COEX_CORUNNING;
953}
954
955static inline bool iwl_mvm_bt_is_rrc_supported(struct iwl_mvm *mvm)
956{
957 return (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_BT_COEX_RRC) &&
958 IWL_MVM_BT_COEX_RRC;
959}
960
886extern const u8 iwl_mvm_ac_to_tx_fifo[]; 961extern const u8 iwl_mvm_ac_to_tx_fifo[];
887 962
888struct iwl_rate_info { 963struct iwl_rate_info {
@@ -951,12 +1026,13 @@ static inline void iwl_mvm_wait_for_async_handlers(struct iwl_mvm *mvm)
951} 1026}
952 1027
953/* Statistics */ 1028/* Statistics */
954int iwl_mvm_rx_reply_statistics(struct iwl_mvm *mvm, 1029void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
955 struct iwl_rx_cmd_buffer *rxb, 1030 struct iwl_rx_packet *pkt);
956 struct iwl_device_cmd *cmd);
957int iwl_mvm_rx_statistics(struct iwl_mvm *mvm, 1031int iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
958 struct iwl_rx_cmd_buffer *rxb, 1032 struct iwl_rx_cmd_buffer *rxb,
959 struct iwl_device_cmd *cmd); 1033 struct iwl_device_cmd *cmd);
1034int iwl_mvm_request_statistics(struct iwl_mvm *mvm, bool clear);
1035void iwl_mvm_accu_radio_stats(struct iwl_mvm *mvm);
960 1036
961/* NVM */ 1037/* NVM */
962int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic); 1038int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic);
@@ -1067,20 +1143,14 @@ int iwl_mvm_binding_add_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1067int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif); 1143int iwl_mvm_binding_remove_vif(struct iwl_mvm *mvm, struct ieee80211_vif *vif);
1068 1144
1069/* Quota management */ 1145/* Quota management */
1070int iwl_mvm_update_quotas(struct iwl_mvm *mvm, 1146int iwl_mvm_update_quotas(struct iwl_mvm *mvm, bool force_upload,
1071 struct ieee80211_vif *disabled_vif); 1147 struct ieee80211_vif *disabled_vif);
1072 1148
1073/* Scanning */ 1149/* Scanning */
1074int iwl_mvm_scan_size(struct iwl_mvm *mvm); 1150int iwl_mvm_scan_size(struct iwl_mvm *mvm);
1075int iwl_mvm_scan_request(struct iwl_mvm *mvm,
1076 struct ieee80211_vif *vif,
1077 struct cfg80211_scan_request *req);
1078int iwl_mvm_rx_scan_response(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
1079 struct iwl_device_cmd *cmd);
1080int iwl_mvm_rx_scan_complete(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
1081 struct iwl_device_cmd *cmd);
1082int iwl_mvm_cancel_scan(struct iwl_mvm *mvm); 1151int iwl_mvm_cancel_scan(struct iwl_mvm *mvm);
1083int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan); 1152int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan);
1153void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm);
1084 1154
1085/* Scheduled scan */ 1155/* Scheduled scan */
1086int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm, 1156int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
@@ -1089,14 +1159,8 @@ int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
1089int iwl_mvm_rx_scan_offload_iter_complete_notif(struct iwl_mvm *mvm, 1159int iwl_mvm_rx_scan_offload_iter_complete_notif(struct iwl_mvm *mvm,
1090 struct iwl_rx_cmd_buffer *rxb, 1160 struct iwl_rx_cmd_buffer *rxb,
1091 struct iwl_device_cmd *cmd); 1161 struct iwl_device_cmd *cmd);
1092int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,
1093 struct ieee80211_vif *vif,
1094 struct cfg80211_sched_scan_request *req,
1095 struct ieee80211_scan_ies *ies);
1096int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, 1162int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
1097 struct cfg80211_sched_scan_request *req); 1163 struct cfg80211_sched_scan_request *req);
1098int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
1099 struct cfg80211_sched_scan_request *req);
1100int iwl_mvm_scan_offload_start(struct iwl_mvm *mvm, 1164int iwl_mvm_scan_offload_start(struct iwl_mvm *mvm,
1101 struct ieee80211_vif *vif, 1165 struct ieee80211_vif *vif,
1102 struct cfg80211_sched_scan_request *req, 1166 struct cfg80211_sched_scan_request *req,
@@ -1225,7 +1289,7 @@ int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
1225 struct iwl_rx_cmd_buffer *rxb, 1289 struct iwl_rx_cmd_buffer *rxb,
1226 struct iwl_device_cmd *cmd); 1290 struct iwl_device_cmd *cmd);
1227void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1291void iwl_mvm_bt_rssi_event(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1228 enum ieee80211_rssi_event rssi_event); 1292 enum ieee80211_rssi_event_data);
1229void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm); 1293void iwl_mvm_bt_coex_vif_change(struct iwl_mvm *mvm);
1230u16 iwl_mvm_coex_agg_time_limit(struct iwl_mvm *mvm, 1294u16 iwl_mvm_coex_agg_time_limit(struct iwl_mvm *mvm,
1231 struct ieee80211_sta *sta); 1295 struct ieee80211_sta *sta);
@@ -1238,7 +1302,6 @@ bool iwl_mvm_bt_coex_is_tpc_allowed(struct iwl_mvm *mvm,
1238u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr, 1302u8 iwl_mvm_bt_coex_tx_prio(struct iwl_mvm *mvm, struct ieee80211_hdr *hdr,
1239 struct ieee80211_tx_info *info, u8 ac); 1303 struct ieee80211_tx_info *info, u8 ac);
1240 1304
1241bool iwl_mvm_bt_coex_is_ant_avail_old(struct iwl_mvm *mvm, u8 ant);
1242bool iwl_mvm_bt_coex_is_shared_ant_avail_old(struct iwl_mvm *mvm); 1305bool iwl_mvm_bt_coex_is_shared_ant_avail_old(struct iwl_mvm *mvm);
1243void iwl_mvm_bt_coex_vif_change_old(struct iwl_mvm *mvm); 1306void iwl_mvm_bt_coex_vif_change_old(struct iwl_mvm *mvm);
1244int iwl_send_bt_init_conf_old(struct iwl_mvm *mvm); 1307int iwl_send_bt_init_conf_old(struct iwl_mvm *mvm);
@@ -1246,7 +1309,7 @@ int iwl_mvm_rx_bt_coex_notif_old(struct iwl_mvm *mvm,
1246 struct iwl_rx_cmd_buffer *rxb, 1309 struct iwl_rx_cmd_buffer *rxb,
1247 struct iwl_device_cmd *cmd); 1310 struct iwl_device_cmd *cmd);
1248void iwl_mvm_bt_rssi_event_old(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1311void iwl_mvm_bt_rssi_event_old(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1249 enum ieee80211_rssi_event rssi_event); 1312 enum ieee80211_rssi_event_data);
1250u16 iwl_mvm_coex_agg_time_limit_old(struct iwl_mvm *mvm, 1313u16 iwl_mvm_coex_agg_time_limit_old(struct iwl_mvm *mvm,
1251 struct ieee80211_sta *sta); 1314 struct ieee80211_sta *sta);
1252bool iwl_mvm_bt_coex_is_mimo_allowed_old(struct iwl_mvm *mvm, 1315bool iwl_mvm_bt_coex_is_mimo_allowed_old(struct iwl_mvm *mvm,
@@ -1257,17 +1320,6 @@ int iwl_mvm_rx_ant_coupling_notif_old(struct iwl_mvm *mvm,
1257 struct iwl_rx_cmd_buffer *rxb, 1320 struct iwl_rx_cmd_buffer *rxb,
1258 struct iwl_device_cmd *cmd); 1321 struct iwl_device_cmd *cmd);
1259 1322
1260enum iwl_bt_kill_msk {
1261 BT_KILL_MSK_DEFAULT,
1262 BT_KILL_MSK_NEVER,
1263 BT_KILL_MSK_ALWAYS,
1264 BT_KILL_MSK_MAX,
1265};
1266
1267extern const u8 iwl_bt_ack_kill_msk[BT_MAX_AG][BT_COEX_MAX_LUT];
1268extern const u8 iwl_bt_cts_kill_msk[BT_MAX_AG][BT_COEX_MAX_LUT];
1269extern const u32 iwl_bt_ctl_kill_msk[BT_KILL_MSK_MAX];
1270
1271/* beacon filtering */ 1323/* beacon filtering */
1272#ifdef CONFIG_IWLWIFI_DEBUGFS 1324#ifdef CONFIG_IWLWIFI_DEBUGFS
1273void 1325void
@@ -1352,9 +1404,6 @@ static inline void iwl_mvm_enable_agg_txq(struct iwl_mvm *mvm, int queue,
1352 iwl_mvm_enable_txq(mvm, queue, ssn, &cfg, wdg_timeout); 1404 iwl_mvm_enable_txq(mvm, queue, ssn, &cfg, wdg_timeout);
1353} 1405}
1354 1406
1355/* Assoc status */
1356bool iwl_mvm_is_idle(struct iwl_mvm *mvm);
1357
1358/* Thermal management and CT-kill */ 1407/* Thermal management and CT-kill */
1359void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff); 1408void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff);
1360void iwl_mvm_tt_temp_changed(struct iwl_mvm *mvm, u32 temp); 1409void iwl_mvm_tt_temp_changed(struct iwl_mvm *mvm, u32 temp);
@@ -1367,6 +1416,23 @@ void iwl_mvm_tt_exit(struct iwl_mvm *mvm);
1367void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state); 1416void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state);
1368int iwl_mvm_get_temp(struct iwl_mvm *mvm); 1417int iwl_mvm_get_temp(struct iwl_mvm *mvm);
1369 1418
1419/* Location Aware Regulatory */
1420struct iwl_mcc_update_resp *
1421iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
1422 enum iwl_mcc_source src_id);
1423int iwl_mvm_init_mcc(struct iwl_mvm *mvm);
1424int iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm,
1425 struct iwl_rx_cmd_buffer *rxb,
1426 struct iwl_device_cmd *cmd);
1427struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
1428 const char *alpha2,
1429 enum iwl_mcc_source src_id,
1430 bool *changed);
1431struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
1432 bool *changed);
1433int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm);
1434void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm);
1435
1370/* smart fifo */ 1436/* smart fifo */
1371int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1437int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1372 bool added_vif); 1438 bool added_vif);
@@ -1405,7 +1471,65 @@ struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm);
1405void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error); 1471void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error);
1406void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm); 1472void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm);
1407 1473
1408int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, enum iwl_fw_dbg_conf id); 1474int iwl_mvm_start_fw_dbg_conf(struct iwl_mvm *mvm, u8 id);
1409void iwl_mvm_fw_dbg_collect(struct iwl_mvm *mvm); 1475int iwl_mvm_fw_dbg_collect(struct iwl_mvm *mvm, enum iwl_fw_dbg_trigger trig,
1476 const char *str, size_t len, unsigned int delay);
1477int iwl_mvm_fw_dbg_collect_desc(struct iwl_mvm *mvm,
1478 struct iwl_mvm_dump_desc *desc,
1479 unsigned int delay);
1480void iwl_mvm_free_fw_dump_desc(struct iwl_mvm *mvm);
1481int iwl_mvm_fw_dbg_collect_trig(struct iwl_mvm *mvm,
1482 struct iwl_fw_dbg_trigger_tlv *trigger,
1483 const char *fmt, ...) __printf(3, 4);
1484unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
1485 struct ieee80211_vif *vif,
1486 bool tdls, bool cmd_q);
1487void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1488 const char *errmsg);
1489static inline bool
1490iwl_fw_dbg_trigger_vif_match(struct iwl_fw_dbg_trigger_tlv *trig,
1491 struct ieee80211_vif *vif)
1492{
1493 u32 trig_vif = le32_to_cpu(trig->vif_type);
1494
1495 return trig_vif == IWL_FW_DBG_CONF_VIF_ANY || vif->type == trig_vif;
1496}
1497
1498static inline bool
1499iwl_fw_dbg_trigger_stop_conf_match(struct iwl_mvm *mvm,
1500 struct iwl_fw_dbg_trigger_tlv *trig)
1501{
1502 return ((trig->mode & IWL_FW_DBG_TRIGGER_STOP) &&
1503 (mvm->fw_dbg_conf == FW_DBG_INVALID ||
1504 (BIT(mvm->fw_dbg_conf) & le32_to_cpu(trig->stop_conf_ids))));
1505}
1506
1507static inline bool
1508iwl_fw_dbg_trigger_check_stop(struct iwl_mvm *mvm,
1509 struct ieee80211_vif *vif,
1510 struct iwl_fw_dbg_trigger_tlv *trig)
1511{
1512 if (vif && !iwl_fw_dbg_trigger_vif_match(trig, vif))
1513 return false;
1514
1515 return iwl_fw_dbg_trigger_stop_conf_match(mvm, trig);
1516}
1517
1518static inline void
1519iwl_fw_dbg_trigger_simple_stop(struct iwl_mvm *mvm,
1520 struct ieee80211_vif *vif,
1521 enum iwl_fw_dbg_trigger trig)
1522{
1523 struct iwl_fw_dbg_trigger_tlv *trigger;
1524
1525 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, trig))
1526 return;
1527
1528 trigger = iwl_fw_dbg_get_trigger(mvm->fw, trig);
1529 if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trigger))
1530 return;
1531
1532 iwl_mvm_fw_dbg_collect_trig(mvm, trigger, NULL);
1533}
1410 1534
1411#endif /* __IWL_MVM_H__ */ 1535#endif /* __IWL_MVM_H__ */
diff --git a/drivers/net/wireless/iwlwifi/mvm/nvm.c b/drivers/net/wireless/iwlwifi/mvm/nvm.c
index 5383429d96c1..87b2a30a2308 100644
--- a/drivers/net/wireless/iwlwifi/mvm/nvm.c
+++ b/drivers/net/wireless/iwlwifi/mvm/nvm.c
@@ -63,18 +63,21 @@
63 * 63 *
64 *****************************************************************************/ 64 *****************************************************************************/
65#include <linux/firmware.h> 65#include <linux/firmware.h>
66#include <linux/rtnetlink.h>
67#include <linux/pci.h>
68#include <linux/acpi.h>
66#include "iwl-trans.h" 69#include "iwl-trans.h"
67#include "iwl-csr.h" 70#include "iwl-csr.h"
68#include "mvm.h" 71#include "mvm.h"
69#include "iwl-eeprom-parse.h" 72#include "iwl-eeprom-parse.h"
70#include "iwl-eeprom-read.h" 73#include "iwl-eeprom-read.h"
71#include "iwl-nvm-parse.h" 74#include "iwl-nvm-parse.h"
75#include "iwl-prph.h"
72 76
73/* Default NVM size to read */ 77/* Default NVM size to read */
74#define IWL_NVM_DEFAULT_CHUNK_SIZE (2*1024) 78#define IWL_NVM_DEFAULT_CHUNK_SIZE (2*1024)
75#define IWL_MAX_NVM_SECTION_SIZE 0x1b58 79#define IWL_MAX_NVM_SECTION_SIZE 0x1b58
76#define IWL_MAX_NVM_8000A_SECTION_SIZE 0xffc 80#define IWL_MAX_NVM_8000_SECTION_SIZE 0x1ffc
77#define IWL_MAX_NVM_8000B_SECTION_SIZE 0x1ffc
78 81
79#define NVM_WRITE_OPCODE 1 82#define NVM_WRITE_OPCODE 1
80#define NVM_READ_OPCODE 0 83#define NVM_READ_OPCODE 0
@@ -262,7 +265,9 @@ static struct iwl_nvm_data *
262iwl_parse_nvm_sections(struct iwl_mvm *mvm) 265iwl_parse_nvm_sections(struct iwl_mvm *mvm)
263{ 266{
264 struct iwl_nvm_section *sections = mvm->nvm_sections; 267 struct iwl_nvm_section *sections = mvm->nvm_sections;
265 const __le16 *hw, *sw, *calib, *regulatory, *mac_override; 268 const __le16 *hw, *sw, *calib, *regulatory, *mac_override, *phy_sku;
269 bool lar_enabled;
270 u32 mac_addr0, mac_addr1;
266 271
267 /* Checking for required sections */ 272 /* Checking for required sections */
268 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) { 273 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) {
@@ -286,22 +291,38 @@ iwl_parse_nvm_sections(struct iwl_mvm *mvm)
286 "Can't parse mac_address, empty sections\n"); 291 "Can't parse mac_address, empty sections\n");
287 return NULL; 292 return NULL;
288 } 293 }
294
295 /* PHY_SKU section is mandatory in B0 */
296 if (!mvm->nvm_sections[NVM_SECTION_TYPE_PHY_SKU].data) {
297 IWL_ERR(mvm,
298 "Can't parse phy_sku in B0, empty sections\n");
299 return NULL;
300 }
289 } 301 }
290 302
291 if (WARN_ON(!mvm->cfg)) 303 if (WARN_ON(!mvm->cfg))
292 return NULL; 304 return NULL;
293 305
306 /* read the mac address from WFMP registers */
307 mac_addr0 = iwl_trans_read_prph(mvm->trans, WFMP_MAC_ADDR_0);
308 mac_addr1 = iwl_trans_read_prph(mvm->trans, WFMP_MAC_ADDR_1);
309
294 hw = (const __le16 *)sections[mvm->cfg->nvm_hw_section_num].data; 310 hw = (const __le16 *)sections[mvm->cfg->nvm_hw_section_num].data;
295 sw = (const __le16 *)sections[NVM_SECTION_TYPE_SW].data; 311 sw = (const __le16 *)sections[NVM_SECTION_TYPE_SW].data;
296 calib = (const __le16 *)sections[NVM_SECTION_TYPE_CALIBRATION].data; 312 calib = (const __le16 *)sections[NVM_SECTION_TYPE_CALIBRATION].data;
297 regulatory = (const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY].data; 313 regulatory = (const __le16 *)sections[NVM_SECTION_TYPE_REGULATORY].data;
298 mac_override = 314 mac_override =
299 (const __le16 *)sections[NVM_SECTION_TYPE_MAC_OVERRIDE].data; 315 (const __le16 *)sections[NVM_SECTION_TYPE_MAC_OVERRIDE].data;
316 phy_sku = (const __le16 *)sections[NVM_SECTION_TYPE_PHY_SKU].data;
317
318 lar_enabled = !iwlwifi_mod_params.lar_disable &&
319 (mvm->fw->ucode_capa.capa[0] &
320 IWL_UCODE_TLV_CAPA_LAR_SUPPORT);
300 321
301 return iwl_parse_nvm_data(mvm->trans->dev, mvm->cfg, hw, sw, calib, 322 return iwl_parse_nvm_data(mvm->trans->dev, mvm->cfg, hw, sw, calib,
302 regulatory, mac_override, 323 regulatory, mac_override, phy_sku,
303 mvm->fw->valid_tx_ant, 324 mvm->fw->valid_tx_ant, mvm->fw->valid_rx_ant,
304 mvm->fw->valid_rx_ant); 325 lar_enabled, mac_addr0, mac_addr1);
305} 326}
306 327
307#define MAX_NVM_FILE_LEN 16384 328#define MAX_NVM_FILE_LEN 16384
@@ -354,10 +375,8 @@ static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)
354 /* Maximal size depends on HW family and step */ 375 /* Maximal size depends on HW family and step */
355 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) 376 if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000)
356 max_section_size = IWL_MAX_NVM_SECTION_SIZE; 377 max_section_size = IWL_MAX_NVM_SECTION_SIZE;
357 else if (CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_A_STEP) 378 else
358 max_section_size = IWL_MAX_NVM_8000A_SECTION_SIZE; 379 max_section_size = IWL_MAX_NVM_8000_SECTION_SIZE;
359 else /* Family 8000 B-step or C-step */
360 max_section_size = IWL_MAX_NVM_8000B_SECTION_SIZE;
361 380
362 /* 381 /*
363 * Obtain NVM image via request_firmware. Since we already used 382 * Obtain NVM image via request_firmware. Since we already used
@@ -399,6 +418,15 @@ static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)
399 IWL_INFO(mvm, "NVM Version %08X\n", le32_to_cpu(dword_buff[2])); 418 IWL_INFO(mvm, "NVM Version %08X\n", le32_to_cpu(dword_buff[2]));
400 IWL_INFO(mvm, "NVM Manufacturing date %08X\n", 419 IWL_INFO(mvm, "NVM Manufacturing date %08X\n",
401 le32_to_cpu(dword_buff[3])); 420 le32_to_cpu(dword_buff[3]));
421
422 /* nvm file validation, dword_buff[2] holds the file version */
423 if ((CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_C_STEP &&
424 le32_to_cpu(dword_buff[2]) < 0xE4A) ||
425 (CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_B_STEP &&
426 le32_to_cpu(dword_buff[2]) >= 0xE4A)) {
427 ret = -EFAULT;
428 goto out;
429 }
402 } else { 430 } else {
403 file_sec = (void *)fw_entry->data; 431 file_sec = (void *)fw_entry->data;
404 } 432 }
@@ -497,6 +525,8 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
497 int ret, section; 525 int ret, section;
498 u32 size_read = 0; 526 u32 size_read = 0;
499 u8 *nvm_buffer, *temp; 527 u8 *nvm_buffer, *temp;
528 const char *nvm_file_B = mvm->cfg->default_nvm_file_B_step;
529 const char *nvm_file_C = mvm->cfg->default_nvm_file_C_step;
500 530
501 if (WARN_ON_ONCE(mvm->cfg->nvm_hw_section_num >= NVM_MAX_NUM_SECTIONS)) 531 if (WARN_ON_ONCE(mvm->cfg->nvm_hw_section_num >= NVM_MAX_NUM_SECTIONS))
502 return -EINVAL; 532 return -EINVAL;
@@ -555,10 +585,27 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
555 585
556 /* load external NVM if configured */ 586 /* load external NVM if configured */
557 if (mvm->nvm_file_name) { 587 if (mvm->nvm_file_name) {
558 /* move to External NVM flow */ 588 /* read External NVM file - take the default */
559 ret = iwl_mvm_read_external_nvm(mvm); 589 ret = iwl_mvm_read_external_nvm(mvm);
560 if (ret) 590 if (ret) {
561 return ret; 591 /* choose the nvm_file name according to the
592 * HW step
593 */
594 if (CSR_HW_REV_STEP(mvm->trans->hw_rev) ==
595 SILICON_B_STEP)
596 mvm->nvm_file_name = nvm_file_B;
597 else
598 mvm->nvm_file_name = nvm_file_C;
599
600 if (ret == -EFAULT && mvm->nvm_file_name) {
601 /* in case nvm file was failed try again */
602 ret = iwl_mvm_read_external_nvm(mvm);
603 if (ret)
604 return ret;
605 } else {
606 return ret;
607 }
608 }
562 } 609 }
563 610
564 /* parse the relevant nvm sections */ 611 /* parse the relevant nvm sections */
@@ -570,3 +617,257 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
570 617
571 return 0; 618 return 0;
572} 619}
620
621struct iwl_mcc_update_resp *
622iwl_mvm_update_mcc(struct iwl_mvm *mvm, const char *alpha2,
623 enum iwl_mcc_source src_id)
624{
625 struct iwl_mcc_update_cmd mcc_update_cmd = {
626 .mcc = cpu_to_le16(alpha2[0] << 8 | alpha2[1]),
627 .source_id = (u8)src_id,
628 };
629 struct iwl_mcc_update_resp *mcc_resp, *resp_cp = NULL;
630 struct iwl_rx_packet *pkt;
631 struct iwl_host_cmd cmd = {
632 .id = MCC_UPDATE_CMD,
633 .flags = CMD_WANT_SKB,
634 .data = { &mcc_update_cmd },
635 };
636
637 int ret;
638 u32 status;
639 int resp_len, n_channels;
640 u16 mcc;
641
642 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm)))
643 return ERR_PTR(-EOPNOTSUPP);
644
645 cmd.len[0] = sizeof(struct iwl_mcc_update_cmd);
646
647 IWL_DEBUG_LAR(mvm, "send MCC update to FW with '%c%c' src = %d\n",
648 alpha2[0], alpha2[1], src_id);
649
650 ret = iwl_mvm_send_cmd(mvm, &cmd);
651 if (ret)
652 return ERR_PTR(ret);
653
654 pkt = cmd.resp_pkt;
655 if (pkt->hdr.flags & IWL_CMD_FAILED_MSK) {
656 IWL_ERR(mvm, "Bad return from MCC_UPDATE_COMMAND (0x%08X)\n",
657 pkt->hdr.flags);
658 ret = -EIO;
659 goto exit;
660 }
661
662 /* Extract MCC response */
663 mcc_resp = (void *)pkt->data;
664 status = le32_to_cpu(mcc_resp->status);
665
666 mcc = le16_to_cpu(mcc_resp->mcc);
667
668 /* W/A for a FW/NVM issue - returns 0x00 for the world domain */
669 if (mcc == 0) {
670 mcc = 0x3030; /* "00" - world */
671 mcc_resp->mcc = cpu_to_le16(mcc);
672 }
673
674 n_channels = __le32_to_cpu(mcc_resp->n_channels);
675 IWL_DEBUG_LAR(mvm,
676 "MCC response status: 0x%x. new MCC: 0x%x ('%c%c') change: %d n_chans: %d\n",
677 status, mcc, mcc >> 8, mcc & 0xff,
678 !!(status == MCC_RESP_NEW_CHAN_PROFILE), n_channels);
679
680 resp_len = sizeof(*mcc_resp) + n_channels * sizeof(__le32);
681 resp_cp = kmemdup(mcc_resp, resp_len, GFP_KERNEL);
682 if (!resp_cp) {
683 ret = -ENOMEM;
684 goto exit;
685 }
686
687 ret = 0;
688exit:
689 iwl_free_resp(&cmd);
690 if (ret)
691 return ERR_PTR(ret);
692 return resp_cp;
693}
694
695#ifdef CONFIG_ACPI
696#define WRD_METHOD "WRDD"
697#define WRDD_WIFI (0x07)
698#define WRDD_WIGIG (0x10)
699
700static u32 iwl_mvm_wrdd_get_mcc(struct iwl_mvm *mvm, union acpi_object *wrdd)
701{
702 union acpi_object *mcc_pkg, *domain_type, *mcc_value;
703 u32 i;
704
705 if (wrdd->type != ACPI_TYPE_PACKAGE ||
706 wrdd->package.count < 2 ||
707 wrdd->package.elements[0].type != ACPI_TYPE_INTEGER ||
708 wrdd->package.elements[0].integer.value != 0) {
709 IWL_DEBUG_LAR(mvm, "Unsupported wrdd structure\n");
710 return 0;
711 }
712
713 for (i = 1 ; i < wrdd->package.count ; ++i) {
714 mcc_pkg = &wrdd->package.elements[i];
715
716 if (mcc_pkg->type != ACPI_TYPE_PACKAGE ||
717 mcc_pkg->package.count < 2 ||
718 mcc_pkg->package.elements[0].type != ACPI_TYPE_INTEGER ||
719 mcc_pkg->package.elements[1].type != ACPI_TYPE_INTEGER) {
720 mcc_pkg = NULL;
721 continue;
722 }
723
724 domain_type = &mcc_pkg->package.elements[0];
725 if (domain_type->integer.value == WRDD_WIFI)
726 break;
727
728 mcc_pkg = NULL;
729 }
730
731 if (mcc_pkg) {
732 mcc_value = &mcc_pkg->package.elements[1];
733 return mcc_value->integer.value;
734 }
735
736 return 0;
737}
738
739static int iwl_mvm_get_bios_mcc(struct iwl_mvm *mvm, char *mcc)
740{
741 acpi_handle root_handle;
742 acpi_handle handle;
743 struct acpi_buffer wrdd = {ACPI_ALLOCATE_BUFFER, NULL};
744 acpi_status status;
745 u32 mcc_val;
746 struct pci_dev *pdev = to_pci_dev(mvm->dev);
747
748 root_handle = ACPI_HANDLE(&pdev->dev);
749 if (!root_handle) {
750 IWL_DEBUG_LAR(mvm,
751 "Could not retrieve root port ACPI handle\n");
752 return -ENOENT;
753 }
754
755 /* Get the method's handle */
756 status = acpi_get_handle(root_handle, (acpi_string)WRD_METHOD, &handle);
757 if (ACPI_FAILURE(status)) {
758 IWL_DEBUG_LAR(mvm, "WRD method not found\n");
759 return -ENOENT;
760 }
761
762 /* Call WRDD with no arguments */
763 status = acpi_evaluate_object(handle, NULL, NULL, &wrdd);
764 if (ACPI_FAILURE(status)) {
765 IWL_DEBUG_LAR(mvm, "WRDC invocation failed (0x%x)\n", status);
766 return -ENOENT;
767 }
768
769 mcc_val = iwl_mvm_wrdd_get_mcc(mvm, wrdd.pointer);
770 kfree(wrdd.pointer);
771 if (!mcc_val)
772 return -ENOENT;
773
774 mcc[0] = (mcc_val >> 8) & 0xff;
775 mcc[1] = mcc_val & 0xff;
776 mcc[2] = '\0';
777 return 0;
778}
779#else /* CONFIG_ACPI */
780static int iwl_mvm_get_bios_mcc(struct iwl_mvm *mvm, char *mcc)
781{
782 return -ENOENT;
783}
784#endif
785
786int iwl_mvm_init_mcc(struct iwl_mvm *mvm)
787{
788 bool tlv_lar;
789 bool nvm_lar;
790 int retval;
791 struct ieee80211_regdomain *regd;
792 char mcc[3];
793
794 if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000) {
795 tlv_lar = mvm->fw->ucode_capa.capa[0] &
796 IWL_UCODE_TLV_CAPA_LAR_SUPPORT;
797 nvm_lar = mvm->nvm_data->lar_enabled;
798 if (tlv_lar != nvm_lar)
799 IWL_INFO(mvm,
800 "Conflict between TLV & NVM regarding enabling LAR (TLV = %s NVM =%s)\n",
801 tlv_lar ? "enabled" : "disabled",
802 nvm_lar ? "enabled" : "disabled");
803 }
804
805 if (!iwl_mvm_is_lar_supported(mvm))
806 return 0;
807
808 /*
809 * try to replay the last set MCC to FW. If it doesn't exist,
810 * queue an update to cfg80211 to retrieve the default alpha2 from FW.
811 */
812 retval = iwl_mvm_init_fw_regd(mvm);
813 if (retval != -ENOENT)
814 return retval;
815
816 /*
817 * Driver regulatory hint for initial update, this also informs the
818 * firmware we support wifi location updates.
819 * Disallow scans that might crash the FW while the LAR regdomain
820 * is not set.
821 */
822 mvm->lar_regdom_set = false;
823
824 regd = iwl_mvm_get_current_regdomain(mvm, NULL);
825 if (IS_ERR_OR_NULL(regd))
826 return -EIO;
827
828 if (iwl_mvm_is_wifi_mcc_supported(mvm) &&
829 !iwl_mvm_get_bios_mcc(mvm, mcc)) {
830 kfree(regd);
831 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc,
832 MCC_SOURCE_BIOS, NULL);
833 if (IS_ERR_OR_NULL(regd))
834 return -EIO;
835 }
836
837 retval = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
838 kfree(regd);
839 return retval;
840}
841
842int iwl_mvm_rx_chub_update_mcc(struct iwl_mvm *mvm,
843 struct iwl_rx_cmd_buffer *rxb,
844 struct iwl_device_cmd *cmd)
845{
846 struct iwl_rx_packet *pkt = rxb_addr(rxb);
847 struct iwl_mcc_chub_notif *notif = (void *)pkt->data;
848 enum iwl_mcc_source src;
849 char mcc[3];
850 struct ieee80211_regdomain *regd;
851
852 lockdep_assert_held(&mvm->mutex);
853
854 if (WARN_ON_ONCE(!iwl_mvm_is_lar_supported(mvm)))
855 return 0;
856
857 mcc[0] = notif->mcc >> 8;
858 mcc[1] = notif->mcc & 0xff;
859 mcc[2] = '\0';
860 src = notif->source_id;
861
862 IWL_DEBUG_LAR(mvm,
863 "RX: received chub update mcc cmd (mcc '%s' src %d)\n",
864 mcc, src);
865 regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, mcc, src, NULL);
866 if (IS_ERR_OR_NULL(regd))
867 return 0;
868
869 regulatory_set_wiphy_regd(mvm->hw->wiphy, regd);
870 kfree(regd);
871
872 return 0;
873}
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index 2dffc3600ed3..a08b03d58d4b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -82,7 +82,6 @@
82#include "rs.h" 82#include "rs.h"
83#include "fw-api-scan.h" 83#include "fw-api-scan.h"
84#include "time-event.h" 84#include "time-event.h"
85#include "iwl-fw-error-dump.h"
86 85
87#define DRV_DESCRIPTION "The new Intel(R) wireless AGN driver for Linux" 86#define DRV_DESCRIPTION "The new Intel(R) wireless AGN driver for Linux"
88MODULE_DESCRIPTION(DRV_DESCRIPTION); 87MODULE_DESCRIPTION(DRV_DESCRIPTION);
@@ -234,11 +233,10 @@ static const struct iwl_rx_handlers iwl_mvm_rx_handlers[] = {
234 iwl_mvm_rx_ant_coupling_notif, true), 233 iwl_mvm_rx_ant_coupling_notif, true),
235 234
236 RX_HANDLER(TIME_EVENT_NOTIFICATION, iwl_mvm_rx_time_event_notif, false), 235 RX_HANDLER(TIME_EVENT_NOTIFICATION, iwl_mvm_rx_time_event_notif, false),
236 RX_HANDLER(MCC_CHUB_UPDATE_CMD, iwl_mvm_rx_chub_update_mcc, true),
237 237
238 RX_HANDLER(EOSP_NOTIFICATION, iwl_mvm_rx_eosp_notif, false), 238 RX_HANDLER(EOSP_NOTIFICATION, iwl_mvm_rx_eosp_notif, false),
239 239
240 RX_HANDLER(SCAN_REQUEST_CMD, iwl_mvm_rx_scan_response, false),
241 RX_HANDLER(SCAN_COMPLETE_NOTIFICATION, iwl_mvm_rx_scan_complete, true),
242 RX_HANDLER(SCAN_ITERATION_COMPLETE, 240 RX_HANDLER(SCAN_ITERATION_COMPLETE,
243 iwl_mvm_rx_scan_offload_iter_complete_notif, false), 241 iwl_mvm_rx_scan_offload_iter_complete_notif, false),
244 RX_HANDLER(SCAN_OFFLOAD_COMPLETE, 242 RX_HANDLER(SCAN_OFFLOAD_COMPLETE,
@@ -311,6 +309,7 @@ static const char *const iwl_mvm_cmd_strings[REPLY_MAX] = {
311 CMD(REPLY_RX_MPDU_CMD), 309 CMD(REPLY_RX_MPDU_CMD),
312 CMD(BEACON_NOTIFICATION), 310 CMD(BEACON_NOTIFICATION),
313 CMD(BEACON_TEMPLATE_CMD), 311 CMD(BEACON_TEMPLATE_CMD),
312 CMD(STATISTICS_CMD),
314 CMD(STATISTICS_NOTIFICATION), 313 CMD(STATISTICS_NOTIFICATION),
315 CMD(EOSP_NOTIFICATION), 314 CMD(EOSP_NOTIFICATION),
316 CMD(REDUCE_TX_POWER_CMD), 315 CMD(REDUCE_TX_POWER_CMD),
@@ -359,6 +358,7 @@ static const char *const iwl_mvm_cmd_strings[REPLY_MAX] = {
359 CMD(TDLS_CHANNEL_SWITCH_CMD), 358 CMD(TDLS_CHANNEL_SWITCH_CMD),
360 CMD(TDLS_CHANNEL_SWITCH_NOTIFICATION), 359 CMD(TDLS_CHANNEL_SWITCH_NOTIFICATION),
361 CMD(TDLS_CONFIG_CMD), 360 CMD(TDLS_CONFIG_CMD),
361 CMD(MCC_UPDATE_CMD),
362}; 362};
363#undef CMD 363#undef CMD
364 364
@@ -456,7 +456,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
456 INIT_WORK(&mvm->roc_done_wk, iwl_mvm_roc_done_wk); 456 INIT_WORK(&mvm->roc_done_wk, iwl_mvm_roc_done_wk);
457 INIT_WORK(&mvm->sta_drained_wk, iwl_mvm_sta_drained_wk); 457 INIT_WORK(&mvm->sta_drained_wk, iwl_mvm_sta_drained_wk);
458 INIT_WORK(&mvm->d0i3_exit_work, iwl_mvm_d0i3_exit_work); 458 INIT_WORK(&mvm->d0i3_exit_work, iwl_mvm_d0i3_exit_work);
459 INIT_WORK(&mvm->fw_error_dump_wk, iwl_mvm_fw_error_dump_wk); 459 INIT_DELAYED_WORK(&mvm->fw_dump_wk, iwl_mvm_fw_error_dump_wk);
460 INIT_DELAYED_WORK(&mvm->tdls_cs.dwork, iwl_mvm_tdls_ch_switch_work); 460 INIT_DELAYED_WORK(&mvm->tdls_cs.dwork, iwl_mvm_tdls_ch_switch_work);
461 461
462 spin_lock_init(&mvm->d0i3_tx_lock); 462 spin_lock_init(&mvm->d0i3_tx_lock);
@@ -488,8 +488,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
488 488
489 /* Set a short watchdog for the command queue */ 489 /* Set a short watchdog for the command queue */
490 trans_cfg.cmd_q_wdg_timeout = 490 trans_cfg.cmd_q_wdg_timeout =
491 iwlmvm_mod_params.tfd_q_hang_detect ? IWL_DEF_WD_TIMEOUT : 491 iwl_mvm_get_wd_timeout(mvm, NULL, false, true);
492 IWL_WATCHDOG_DISABLED;
493 492
494 snprintf(mvm->hw->wiphy->fw_version, 493 snprintf(mvm->hw->wiphy->fw_version,
495 sizeof(mvm->hw->wiphy->fw_version), 494 sizeof(mvm->hw->wiphy->fw_version),
@@ -504,6 +503,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
504 trans->dbg_dest_reg_num = mvm->fw->dbg_dest_reg_num; 503 trans->dbg_dest_reg_num = mvm->fw->dbg_dest_reg_num;
505 memcpy(trans->dbg_conf_tlv, mvm->fw->dbg_conf_tlv, 504 memcpy(trans->dbg_conf_tlv, mvm->fw->dbg_conf_tlv,
506 sizeof(trans->dbg_conf_tlv)); 505 sizeof(trans->dbg_conf_tlv));
506 trans->dbg_trigger_tlv = mvm->fw->dbg_trigger_tlv;
507 507
508 /* set up notification wait support */ 508 /* set up notification wait support */
509 iwl_notification_wait_init(&mvm->notif_wait); 509 iwl_notification_wait_init(&mvm->notif_wait);
@@ -523,12 +523,11 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
523 /* set the nvm_file_name according to priority */ 523 /* set the nvm_file_name according to priority */
524 if (iwlwifi_mod_params.nvm_file) { 524 if (iwlwifi_mod_params.nvm_file) {
525 mvm->nvm_file_name = iwlwifi_mod_params.nvm_file; 525 mvm->nvm_file_name = iwlwifi_mod_params.nvm_file;
526 } else { 526 } else if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) {
527 if ((trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) && 527 if (CSR_HW_REV_STEP(trans->hw_rev) == SILICON_B_STEP)
528 (CSR_HW_REV_STEP(trans->hw_rev) == SILICON_A_STEP)) 528 mvm->nvm_file_name = mvm->cfg->default_nvm_file_B_step;
529 mvm->nvm_file_name = mvm->cfg->default_nvm_file_8000A;
530 else 529 else
531 mvm->nvm_file_name = mvm->cfg->default_nvm_file; 530 mvm->nvm_file_name = mvm->cfg->default_nvm_file_C_step;
532 } 531 }
533 532
534 if (WARN(cfg->no_power_up_nic_in_init && !mvm->nvm_file_name, 533 if (WARN(cfg->no_power_up_nic_in_init && !mvm->nvm_file_name,
@@ -685,6 +684,37 @@ static void iwl_mvm_async_handlers_wk(struct work_struct *wk)
685 mutex_unlock(&mvm->mutex); 684 mutex_unlock(&mvm->mutex);
686} 685}
687 686
687static inline void iwl_mvm_rx_check_trigger(struct iwl_mvm *mvm,
688 struct iwl_rx_packet *pkt)
689{
690 struct iwl_fw_dbg_trigger_tlv *trig;
691 struct iwl_fw_dbg_trigger_cmd *cmds_trig;
692 int i;
693
694 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_FW_NOTIF))
695 return;
696
697 trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_FW_NOTIF);
698 cmds_trig = (void *)trig->data;
699
700 if (!iwl_fw_dbg_trigger_check_stop(mvm, NULL, trig))
701 return;
702
703 for (i = 0; i < ARRAY_SIZE(cmds_trig->cmds); i++) {
704 /* don't collect on CMD 0 */
705 if (!cmds_trig->cmds[i].cmd_id)
706 break;
707
708 if (cmds_trig->cmds[i].cmd_id != pkt->hdr.cmd)
709 continue;
710
711 iwl_mvm_fw_dbg_collect_trig(mvm, trig,
712 "CMD 0x%02x received",
713 pkt->hdr.cmd);
714 break;
715 }
716}
717
688static int iwl_mvm_rx_dispatch(struct iwl_op_mode *op_mode, 718static int iwl_mvm_rx_dispatch(struct iwl_op_mode *op_mode,
689 struct iwl_rx_cmd_buffer *rxb, 719 struct iwl_rx_cmd_buffer *rxb,
690 struct iwl_device_cmd *cmd) 720 struct iwl_device_cmd *cmd)
@@ -693,6 +723,8 @@ static int iwl_mvm_rx_dispatch(struct iwl_op_mode *op_mode,
693 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); 723 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
694 u8 i; 724 u8 i;
695 725
726 iwl_mvm_rx_check_trigger(mvm, pkt);
727
696 /* 728 /*
697 * Do the notification wait before RX handlers so 729 * Do the notification wait before RX handlers so
698 * even if the RX handler consumes the RXB we have 730 * even if the RX handler consumes the RXB we have
@@ -827,7 +859,7 @@ static void iwl_mvm_reprobe_wk(struct work_struct *wk)
827static void iwl_mvm_fw_error_dump_wk(struct work_struct *work) 859static void iwl_mvm_fw_error_dump_wk(struct work_struct *work)
828{ 860{
829 struct iwl_mvm *mvm = 861 struct iwl_mvm *mvm =
830 container_of(work, struct iwl_mvm, fw_error_dump_wk); 862 container_of(work, struct iwl_mvm, fw_dump_wk.work);
831 863
832 if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_FW_DBG_COLLECT)) 864 if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_FW_DBG_COLLECT))
833 return; 865 return;
@@ -837,8 +869,8 @@ static void iwl_mvm_fw_error_dump_wk(struct work_struct *work)
837 869
838 /* start recording again if the firmware is not crashed */ 870 /* start recording again if the firmware is not crashed */
839 WARN_ON_ONCE((!test_bit(STATUS_FW_ERROR, &mvm->trans->status)) && 871 WARN_ON_ONCE((!test_bit(STATUS_FW_ERROR, &mvm->trans->status)) &&
840 mvm->fw->dbg_dest_tlv && 872 mvm->fw->dbg_dest_tlv &&
841 iwl_mvm_start_fw_dbg_conf(mvm, mvm->fw_dbg_conf)); 873 iwl_mvm_start_fw_dbg_conf(mvm, mvm->fw_dbg_conf));
842 874
843 mutex_unlock(&mvm->mutex); 875 mutex_unlock(&mvm->mutex);
844 876
@@ -859,18 +891,7 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error)
859 * the next start() call from mac80211. If restart isn't called 891 * the next start() call from mac80211. If restart isn't called
860 * (no fw restart) scan status will stay busy. 892 * (no fw restart) scan status will stay busy.
861 */ 893 */
862 switch (mvm->scan_status) { 894 iwl_mvm_report_scan_aborted(mvm);
863 case IWL_MVM_SCAN_NONE:
864 break;
865 case IWL_MVM_SCAN_OS:
866 ieee80211_scan_completed(mvm->hw, true);
867 break;
868 case IWL_MVM_SCAN_SCHED:
869 /* Sched scan will be restarted by mac80211 in restart_hw. */
870 if (!mvm->restart_fw)
871 ieee80211_sched_scan_stopped(mvm->hw);
872 break;
873 }
874 895
875 /* 896 /*
876 * If we're restarting already, don't cycle restarts. 897 * If we're restarting already, don't cycle restarts.
@@ -879,7 +900,7 @@ void iwl_mvm_nic_restart(struct iwl_mvm *mvm, bool fw_error)
879 * can't recover this since we're already half suspended. 900 * can't recover this since we're already half suspended.
880 */ 901 */
881 if (!mvm->restart_fw && fw_error) { 902 if (!mvm->restart_fw && fw_error) {
882 schedule_work(&mvm->fw_error_dump_wk); 903 iwl_mvm_fw_dbg_collect_desc(mvm, &iwl_mvm_dump_desc_assert, 0);
883 } else if (test_and_set_bit(IWL_MVM_STATUS_IN_HW_RESTART, 904 } else if (test_and_set_bit(IWL_MVM_STATUS_IN_HW_RESTART,
884 &mvm->status)) { 905 &mvm->status)) {
885 struct iwl_mvm_reprobe *reprobe; 906 struct iwl_mvm_reprobe *reprobe;
@@ -1140,7 +1161,7 @@ static void iwl_mvm_d0i3_disconnect_iter(void *data, u8 *mac,
1140 1161
1141 if (vif->type == NL80211_IFTYPE_STATION && vif->bss_conf.assoc && 1162 if (vif->type == NL80211_IFTYPE_STATION && vif->bss_conf.assoc &&
1142 mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id) 1163 mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id)
1143 ieee80211_connection_loss(vif); 1164 iwl_mvm_connection_loss(mvm, vif, "D0i3");
1144} 1165}
1145 1166
1146void iwl_mvm_d0i3_enable_tx(struct iwl_mvm *mvm, __le16 *qos_seq) 1167void iwl_mvm_d0i3_enable_tx(struct iwl_mvm *mvm, __le16 *qos_seq)
@@ -1236,6 +1257,10 @@ static void iwl_mvm_d0i3_exit_work(struct work_struct *wk)
1236 iwl_free_resp(&get_status_cmd); 1257 iwl_free_resp(&get_status_cmd);
1237out: 1258out:
1238 iwl_mvm_d0i3_enable_tx(mvm, qos_seq); 1259 iwl_mvm_d0i3_enable_tx(mvm, qos_seq);
1260
1261 /* the FW might have updated the regdomain */
1262 iwl_mvm_update_changed_regdom(mvm);
1263
1239 iwl_mvm_unref(mvm, IWL_MVM_REF_EXIT_WORK); 1264 iwl_mvm_unref(mvm, IWL_MVM_REF_EXIT_WORK);
1240 mutex_unlock(&mvm->mutex); 1265 mutex_unlock(&mvm->mutex);
1241} 1266}
diff --git a/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c b/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
index 5b43616eeb06..e68a475e3071 100644
--- a/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
+++ b/drivers/net/wireless/iwlwifi/mvm/phy-ctxt.c
@@ -67,7 +67,7 @@
67#include "fw-api.h" 67#include "fw-api.h"
68#include "mvm.h" 68#include "mvm.h"
69 69
70/* Maps the driver specific channel width definition to the the fw values */ 70/* Maps the driver specific channel width definition to the fw values */
71u8 iwl_mvm_get_channel_width(struct cfg80211_chan_def *chandef) 71u8 iwl_mvm_get_channel_width(struct cfg80211_chan_def *chandef)
72{ 72{
73 switch (chandef->width) { 73 switch (chandef->width) {
@@ -175,6 +175,10 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
175 cmd->rxchain_info |= cpu_to_le32(idle_cnt << PHY_RX_CHAIN_CNT_POS); 175 cmd->rxchain_info |= cpu_to_le32(idle_cnt << PHY_RX_CHAIN_CNT_POS);
176 cmd->rxchain_info |= cpu_to_le32(active_cnt << 176 cmd->rxchain_info |= cpu_to_le32(active_cnt <<
177 PHY_RX_CHAIN_MIMO_CNT_POS); 177 PHY_RX_CHAIN_MIMO_CNT_POS);
178#ifdef CONFIG_IWLWIFI_DEBUGFS
179 if (unlikely(mvm->dbgfs_rx_phyinfo))
180 cmd->rxchain_info = cpu_to_le32(mvm->dbgfs_rx_phyinfo);
181#endif
178 182
179 cmd->txchain_info = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm)); 183 cmd->txchain_info = cpu_to_le32(iwl_mvm_get_valid_tx_ant(mvm));
180} 184}
diff --git a/drivers/net/wireless/iwlwifi/mvm/power.c b/drivers/net/wireless/iwlwifi/mvm/power.c
index 2620dd0c45f9..d2c6ba9d326b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/power.c
+++ b/drivers/net/wireless/iwlwifi/mvm/power.c
@@ -66,6 +66,7 @@
66#include <linux/kernel.h> 66#include <linux/kernel.h>
67#include <linux/module.h> 67#include <linux/module.h>
68#include <linux/slab.h> 68#include <linux/slab.h>
69#include <linux/etherdevice.h>
69 70
70#include <net/mac80211.h> 71#include <net/mac80211.h>
71 72
@@ -357,7 +358,7 @@ static void iwl_mvm_power_build_cmd(struct iwl_mvm *mvm,
357 cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_SAVE_ENA_MSK); 358 cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_SAVE_ENA_MSK);
358 359
359 if (!vif->bss_conf.ps || iwl_mvm_vif_low_latency(mvmvif) || 360 if (!vif->bss_conf.ps || iwl_mvm_vif_low_latency(mvmvif) ||
360 !mvmvif->pm_enabled || iwl_mvm_tdls_sta_count(mvm, vif)) 361 !mvmvif->pm_enabled)
361 return; 362 return;
362 363
363 cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK); 364 cmd->flags |= cpu_to_le16(POWER_FLAGS_POWER_MANAGEMENT_ENA_MSK);
@@ -491,7 +492,7 @@ void iwl_mvm_power_vif_assoc(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
491 492
492 if (memcmp(vif->bss_conf.bssid, mvmvif->uapsd_misbehaving_bssid, 493 if (memcmp(vif->bss_conf.bssid, mvmvif->uapsd_misbehaving_bssid,
493 ETH_ALEN)) 494 ETH_ALEN))
494 memset(mvmvif->uapsd_misbehaving_bssid, 0, ETH_ALEN); 495 eth_zero_addr(mvmvif->uapsd_misbehaving_bssid);
495} 496}
496 497
497static void iwl_mvm_power_uapsd_misbehav_ap_iterator(void *_data, u8 *mac, 498static void iwl_mvm_power_uapsd_misbehav_ap_iterator(void *_data, u8 *mac,
@@ -638,6 +639,10 @@ static void iwl_mvm_power_set_pm(struct iwl_mvm *mvm,
638 if (vifs->ap_vif) 639 if (vifs->ap_vif)
639 ap_mvmvif = iwl_mvm_vif_from_mac80211(vifs->ap_vif); 640 ap_mvmvif = iwl_mvm_vif_from_mac80211(vifs->ap_vif);
640 641
642 /* don't allow PM if any TDLS stations exist */
643 if (iwl_mvm_tdls_sta_count(mvm, NULL))
644 return;
645
641 /* enable PM on bss if bss stand alone */ 646 /* enable PM on bss if bss stand alone */
642 if (vifs->bss_active && !vifs->p2p_active && !vifs->ap_active) { 647 if (vifs->bss_active && !vifs->p2p_active && !vifs->ap_active) {
643 bss_mvmvif->pm_enabled = true; 648 bss_mvmvif->pm_enabled = true;
diff --git a/drivers/net/wireless/iwlwifi/mvm/quota.c b/drivers/net/wireless/iwlwifi/mvm/quota.c
index dbb2594390e9..509a66d05245 100644
--- a/drivers/net/wireless/iwlwifi/mvm/quota.c
+++ b/drivers/net/wireless/iwlwifi/mvm/quota.c
@@ -172,6 +172,7 @@ static void iwl_mvm_adjust_quota_for_noa(struct iwl_mvm *mvm,
172} 172}
173 173
174int iwl_mvm_update_quotas(struct iwl_mvm *mvm, 174int iwl_mvm_update_quotas(struct iwl_mvm *mvm,
175 bool force_update,
175 struct ieee80211_vif *disabled_vif) 176 struct ieee80211_vif *disabled_vif)
176{ 177{
177 struct iwl_time_quota_cmd cmd = {}; 178 struct iwl_time_quota_cmd cmd = {};
@@ -309,7 +310,7 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm,
309 "zero quota on binding %d\n", i); 310 "zero quota on binding %d\n", i);
310 } 311 }
311 312
312 if (!send) { 313 if (!send && !force_update) {
313 /* don't send a practically unchanged command, the firmware has 314 /* don't send a practically unchanged command, the firmware has
314 * to re-initialize a lot of state and that can have an adverse 315 * to re-initialize a lot of state and that can have an adverse
315 * impact on it 316 * impact on it
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index 078f24cf4af3..f9928f2c125f 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -160,6 +160,9 @@ static bool rs_mimo_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
160 struct iwl_scale_tbl_info *tbl, 160 struct iwl_scale_tbl_info *tbl,
161 const struct rs_tx_column *next_col) 161 const struct rs_tx_column *next_col)
162{ 162{
163 struct iwl_mvm_sta *mvmsta;
164 struct iwl_mvm_vif *mvmvif;
165
163 if (!sta->ht_cap.ht_supported) 166 if (!sta->ht_cap.ht_supported)
164 return false; 167 return false;
165 168
@@ -172,6 +175,11 @@ static bool rs_mimo_allow(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
172 if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) 175 if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta))
173 return false; 176 return false;
174 177
178 mvmsta = iwl_mvm_sta_from_mac80211(sta);
179 mvmvif = iwl_mvm_vif_from_mac80211(mvmsta->vif);
180 if (iwl_mvm_vif_low_latency(mvmvif) && mvmsta->vif->p2p)
181 return false;
182
175 return true; 183 return true;
176} 184}
177 185
@@ -807,6 +815,8 @@ static int rs_rate_from_ucode_rate(const u32 ucode_rate,
807 rate->ldpc = true; 815 rate->ldpc = true;
808 if (ucode_rate & RATE_MCS_VHT_STBC_MSK) 816 if (ucode_rate & RATE_MCS_VHT_STBC_MSK)
809 rate->stbc = true; 817 rate->stbc = true;
818 if (ucode_rate & RATE_MCS_BF_MSK)
819 rate->bfer = true;
810 820
811 rate->bw = ucode_rate & RATE_MCS_CHAN_WIDTH_MSK; 821 rate->bw = ucode_rate & RATE_MCS_CHAN_WIDTH_MSK;
812 822
@@ -816,7 +826,9 @@ static int rs_rate_from_ucode_rate(const u32 ucode_rate,
816 826
817 if (nss == 1) { 827 if (nss == 1) {
818 rate->type = LQ_HT_SISO; 828 rate->type = LQ_HT_SISO;
819 WARN_ON_ONCE(!rate->stbc && num_of_ant != 1); 829 WARN_ONCE(!rate->stbc && !rate->bfer && num_of_ant != 1,
830 "stbc %d bfer %d",
831 rate->stbc, rate->bfer);
820 } else if (nss == 2) { 832 } else if (nss == 2) {
821 rate->type = LQ_HT_MIMO2; 833 rate->type = LQ_HT_MIMO2;
822 WARN_ON_ONCE(num_of_ant != 2); 834 WARN_ON_ONCE(num_of_ant != 2);
@@ -829,7 +841,9 @@ static int rs_rate_from_ucode_rate(const u32 ucode_rate,
829 841
830 if (nss == 1) { 842 if (nss == 1) {
831 rate->type = LQ_VHT_SISO; 843 rate->type = LQ_VHT_SISO;
832 WARN_ON_ONCE(!rate->stbc && num_of_ant != 1); 844 WARN_ONCE(!rate->stbc && !rate->bfer && num_of_ant != 1,
845 "stbc %d bfer %d",
846 rate->stbc, rate->bfer);
833 } else if (nss == 2) { 847 } else if (nss == 2) {
834 rate->type = LQ_VHT_MIMO2; 848 rate->type = LQ_VHT_MIMO2;
835 WARN_ON_ONCE(num_of_ant != 2); 849 WARN_ON_ONCE(num_of_ant != 2);
@@ -1008,13 +1022,41 @@ static void rs_get_lower_rate_down_column(struct iwl_lq_sta *lq_sta,
1008 rs_get_lower_rate_in_column(lq_sta, rate); 1022 rs_get_lower_rate_in_column(lq_sta, rate);
1009} 1023}
1010 1024
1011/* Simple function to compare two rate scale table types */ 1025/* Check if both rates are identical
1012static inline bool rs_rate_match(struct rs_rate *a, 1026 * allow_ant_mismatch enables matching a SISO rate on ANT_A or ANT_B
1013 struct rs_rate *b) 1027 * with a rate indicating STBC/BFER and ANT_AB.
1028 */
1029static inline bool rs_rate_equal(struct rs_rate *a,
1030 struct rs_rate *b,
1031 bool allow_ant_mismatch)
1032
1033{
1034 bool ant_match = (a->ant == b->ant) && (a->stbc == b->stbc) &&
1035 (a->bfer == b->bfer);
1036
1037 if (allow_ant_mismatch) {
1038 if (a->stbc || a->bfer) {
1039 WARN_ONCE(a->ant != ANT_AB, "stbc %d bfer %d ant %d",
1040 a->stbc, a->bfer, a->ant);
1041 ant_match |= (b->ant == ANT_A || b->ant == ANT_B);
1042 } else if (b->stbc || b->bfer) {
1043 WARN_ONCE(b->ant != ANT_AB, "stbc %d bfer %d ant %d",
1044 b->stbc, b->bfer, b->ant);
1045 ant_match |= (a->ant == ANT_A || a->ant == ANT_B);
1046 }
1047 }
1048
1049 return (a->type == b->type) && (a->bw == b->bw) && (a->sgi == b->sgi) &&
1050 (a->ldpc == b->ldpc) && (a->index == b->index) && ant_match;
1051}
1052
1053/* Check if both rates share the same column */
1054static inline bool rs_rate_column_match(struct rs_rate *a,
1055 struct rs_rate *b)
1014{ 1056{
1015 bool ant_match; 1057 bool ant_match;
1016 1058
1017 if (a->stbc) 1059 if (a->stbc || a->bfer)
1018 ant_match = (b->ant == ANT_A || b->ant == ANT_B); 1060 ant_match = (b->ant == ANT_A || b->ant == ANT_B);
1019 else 1061 else
1020 ant_match = (a->ant == b->ant); 1062 ant_match = (a->ant == b->ant);
@@ -1023,16 +1065,35 @@ static inline bool rs_rate_match(struct rs_rate *a,
1023 && ant_match; 1065 && ant_match;
1024} 1066}
1025 1067
1026static u32 rs_ch_width_from_mac_flags(enum mac80211_rate_control_flags flags) 1068static inline enum rs_column rs_get_column_from_rate(struct rs_rate *rate)
1027{ 1069{
1028 if (flags & IEEE80211_TX_RC_40_MHZ_WIDTH) 1070 if (is_legacy(rate)) {
1029 return RATE_MCS_CHAN_WIDTH_40; 1071 if (rate->ant == ANT_A)
1030 else if (flags & IEEE80211_TX_RC_80_MHZ_WIDTH) 1072 return RS_COLUMN_LEGACY_ANT_A;
1031 return RATE_MCS_CHAN_WIDTH_80;
1032 else if (flags & IEEE80211_TX_RC_160_MHZ_WIDTH)
1033 return RATE_MCS_CHAN_WIDTH_160;
1034 1073
1035 return RATE_MCS_CHAN_WIDTH_20; 1074 if (rate->ant == ANT_B)
1075 return RS_COLUMN_LEGACY_ANT_B;
1076
1077 goto err;
1078 }
1079
1080 if (is_siso(rate)) {
1081 if (rate->ant == ANT_A || rate->stbc || rate->bfer)
1082 return rate->sgi ? RS_COLUMN_SISO_ANT_A_SGI :
1083 RS_COLUMN_SISO_ANT_A;
1084
1085 if (rate->ant == ANT_B)
1086 return rate->sgi ? RS_COLUMN_SISO_ANT_B_SGI :
1087 RS_COLUMN_SISO_ANT_B;
1088
1089 goto err;
1090 }
1091
1092 if (is_mimo(rate))
1093 return rate->sgi ? RS_COLUMN_MIMO2_SGI : RS_COLUMN_MIMO2;
1094
1095err:
1096 return RS_COLUMN_INVALID;
1036} 1097}
1037 1098
1038static u8 rs_get_tid(struct ieee80211_hdr *hdr) 1099static u8 rs_get_tid(struct ieee80211_hdr *hdr)
@@ -1055,15 +1116,17 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1055{ 1116{
1056 int legacy_success; 1117 int legacy_success;
1057 int retries; 1118 int retries;
1058 int mac_index, i; 1119 int i;
1059 struct iwl_lq_cmd *table; 1120 struct iwl_lq_cmd *table;
1060 enum mac80211_rate_control_flags mac_flags; 1121 u32 lq_hwrate;
1061 u32 ucode_rate; 1122 struct rs_rate lq_rate, tx_resp_rate;
1062 struct rs_rate rate;
1063 struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl; 1123 struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
1064 u8 reduced_txp = (uintptr_t)info->status.status_driver_data[0]; 1124 u8 reduced_txp = (uintptr_t)info->status.status_driver_data[0];
1125 u32 tx_resp_hwrate = (uintptr_t)info->status.status_driver_data[1];
1065 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); 1126 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
1066 struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta; 1127 struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta;
1128 bool allow_ant_mismatch = mvm->fw->ucode_capa.api[0] &
1129 IWL_UCODE_TLV_API_LQ_SS_PARAMS;
1067 1130
1068 /* Treat uninitialized rate scaling data same as non-existing. */ 1131 /* Treat uninitialized rate scaling data same as non-existing. */
1069 if (!lq_sta) { 1132 if (!lq_sta) {
@@ -1074,50 +1137,43 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1074 return; 1137 return;
1075 } 1138 }
1076 1139
1077#ifdef CONFIG_MAC80211_DEBUGFS
1078 /* Disable last tx check if we are debugging with fixed rate */
1079 if (lq_sta->pers.dbg_fixed_rate) {
1080 IWL_DEBUG_RATE(mvm, "Fixed rate. avoid rate scaling\n");
1081 return;
1082 }
1083#endif
1084 /* This packet was aggregated but doesn't carry status info */ 1140 /* This packet was aggregated but doesn't carry status info */
1085 if ((info->flags & IEEE80211_TX_CTL_AMPDU) && 1141 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
1086 !(info->flags & IEEE80211_TX_STAT_AMPDU)) 1142 !(info->flags & IEEE80211_TX_STAT_AMPDU))
1087 return; 1143 return;
1088 1144
1089 /* 1145 rs_rate_from_ucode_rate(tx_resp_hwrate, info->band, &tx_resp_rate);
1090 * Ignore this Tx frame response if its initial rate doesn't match 1146
1091 * that of latest Link Quality command. There may be stragglers 1147#ifdef CONFIG_MAC80211_DEBUGFS
1092 * from a previous Link Quality command, but we're no longer interested 1148 /* Disable last tx check if we are debugging with fixed rate but
1093 * in those; they're either from the "active" mode while we're trying 1149 * update tx stats */
1094 * to check "search" mode, or a prior "search" mode after we've moved 1150 if (lq_sta->pers.dbg_fixed_rate) {
1095 * to a new "search" mode (which might become the new "active" mode). 1151 int index = tx_resp_rate.index;
1096 */ 1152 enum rs_column column;
1097 table = &lq_sta->lq; 1153 int attempts, success;
1098 ucode_rate = le32_to_cpu(table->rs_table[0]); 1154
1099 rs_rate_from_ucode_rate(ucode_rate, info->band, &rate); 1155 column = rs_get_column_from_rate(&tx_resp_rate);
1100 if (info->band == IEEE80211_BAND_5GHZ) 1156 if (WARN_ONCE(column == RS_COLUMN_INVALID,
1101 rate.index -= IWL_FIRST_OFDM_RATE; 1157 "Can't map rate 0x%x to column",
1102 mac_flags = info->status.rates[0].flags; 1158 tx_resp_hwrate))
1103 mac_index = info->status.rates[0].idx; 1159 return;
1104 /* For HT packets, map MCS to PLCP */ 1160
1105 if (mac_flags & IEEE80211_TX_RC_MCS) { 1161 if (info->flags & IEEE80211_TX_STAT_AMPDU) {
1106 /* Remove # of streams */ 1162 attempts = info->status.ampdu_len;
1107 mac_index &= RATE_HT_MCS_RATE_CODE_MSK; 1163 success = info->status.ampdu_ack_len;
1108 if (mac_index >= (IWL_RATE_9M_INDEX - IWL_FIRST_OFDM_RATE)) 1164 } else {
1109 mac_index++; 1165 attempts = info->status.rates[0].count;
1110 /* 1166 success = !!(info->flags & IEEE80211_TX_STAT_ACK);
1111 * mac80211 HT index is always zero-indexed; we need to move 1167 }
1112 * HT OFDM rates after CCK rates in 2.4 GHz band 1168
1113 */ 1169 lq_sta->pers.tx_stats[column][index].total += attempts;
1114 if (info->band == IEEE80211_BAND_2GHZ) 1170 lq_sta->pers.tx_stats[column][index].success += success;
1115 mac_index += IWL_FIRST_OFDM_RATE; 1171
1116 } else if (mac_flags & IEEE80211_TX_RC_VHT_MCS) { 1172 IWL_DEBUG_RATE(mvm, "Fixed rate 0x%x success %d attempts %d\n",
1117 mac_index &= RATE_VHT_MCS_RATE_CODE_MSK; 1173 tx_resp_hwrate, success, attempts);
1118 if (mac_index >= (IWL_RATE_9M_INDEX - IWL_FIRST_OFDM_RATE)) 1174 return;
1119 mac_index++;
1120 } 1175 }
1176#endif
1121 1177
1122 if (time_after(jiffies, 1178 if (time_after(jiffies,
1123 (unsigned long)(lq_sta->last_tx + 1179 (unsigned long)(lq_sta->last_tx +
@@ -1133,21 +1189,23 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1133 } 1189 }
1134 lq_sta->last_tx = jiffies; 1190 lq_sta->last_tx = jiffies;
1135 1191
1192 /* Ignore this Tx frame response if its initial rate doesn't match
1193 * that of latest Link Quality command. There may be stragglers
1194 * from a previous Link Quality command, but we're no longer interested
1195 * in those; they're either from the "active" mode while we're trying
1196 * to check "search" mode, or a prior "search" mode after we've moved
1197 * to a new "search" mode (which might become the new "active" mode).
1198 */
1199 table = &lq_sta->lq;
1200 lq_hwrate = le32_to_cpu(table->rs_table[0]);
1201 rs_rate_from_ucode_rate(lq_hwrate, info->band, &lq_rate);
1202
1136 /* Here we actually compare this rate to the latest LQ command */ 1203 /* Here we actually compare this rate to the latest LQ command */
1137 if ((mac_index < 0) || 1204 if (!rs_rate_equal(&tx_resp_rate, &lq_rate, allow_ant_mismatch)) {
1138 (rate.sgi != !!(mac_flags & IEEE80211_TX_RC_SHORT_GI)) ||
1139 (rate.bw != rs_ch_width_from_mac_flags(mac_flags)) ||
1140 (rate.ant != info->status.antenna) ||
1141 (!!(ucode_rate & RATE_MCS_HT_MSK) !=
1142 !!(mac_flags & IEEE80211_TX_RC_MCS)) ||
1143 (!!(ucode_rate & RATE_MCS_VHT_MSK) !=
1144 !!(mac_flags & IEEE80211_TX_RC_VHT_MCS)) ||
1145 (!!(ucode_rate & RATE_HT_MCS_GF_MSK) !=
1146 !!(mac_flags & IEEE80211_TX_RC_GREEN_FIELD)) ||
1147 (rate.index != mac_index)) {
1148 IWL_DEBUG_RATE(mvm, 1205 IWL_DEBUG_RATE(mvm,
1149 "initial rate %d does not match %d (0x%x)\n", 1206 "initial tx resp rate 0x%x does not match 0x%x\n",
1150 mac_index, rate.index, ucode_rate); 1207 tx_resp_hwrate, lq_hwrate);
1208
1151 /* 1209 /*
1152 * Since rates mis-match, the last LQ command may have failed. 1210 * Since rates mis-match, the last LQ command may have failed.
1153 * After IWL_MISSED_RATE_MAX mis-matches, resync the uCode with 1211 * After IWL_MISSED_RATE_MAX mis-matches, resync the uCode with
@@ -1175,14 +1233,14 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1175 other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); 1233 other_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1176 } 1234 }
1177 1235
1178 if (WARN_ON_ONCE(!rs_rate_match(&rate, &curr_tbl->rate))) { 1236 if (WARN_ON_ONCE(!rs_rate_column_match(&lq_rate, &curr_tbl->rate))) {
1179 IWL_DEBUG_RATE(mvm, 1237 IWL_DEBUG_RATE(mvm,
1180 "Neither active nor search matches tx rate\n"); 1238 "Neither active nor search matches tx rate\n");
1181 tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); 1239 tmp_tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
1182 rs_dump_rate(mvm, &tmp_tbl->rate, "ACTIVE"); 1240 rs_dump_rate(mvm, &tmp_tbl->rate, "ACTIVE");
1183 tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]); 1241 tmp_tbl = &(lq_sta->lq_info[1 - lq_sta->active_tbl]);
1184 rs_dump_rate(mvm, &tmp_tbl->rate, "SEARCH"); 1242 rs_dump_rate(mvm, &tmp_tbl->rate, "SEARCH");
1185 rs_dump_rate(mvm, &rate, "ACTUAL"); 1243 rs_dump_rate(mvm, &lq_rate, "ACTUAL");
1186 1244
1187 /* 1245 /*
1188 * no matching table found, let's by-pass the data collection 1246 * no matching table found, let's by-pass the data collection
@@ -1207,9 +1265,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1207 if (info->status.ampdu_ack_len == 0) 1265 if (info->status.ampdu_ack_len == 0)
1208 info->status.ampdu_len = 1; 1266 info->status.ampdu_len = 1;
1209 1267
1210 ucode_rate = le32_to_cpu(table->rs_table[0]); 1268 rs_collect_tx_data(mvm, lq_sta, curr_tbl, lq_rate.index,
1211 rs_rate_from_ucode_rate(ucode_rate, info->band, &rate);
1212 rs_collect_tx_data(mvm, lq_sta, curr_tbl, rate.index,
1213 info->status.ampdu_len, 1269 info->status.ampdu_len,
1214 info->status.ampdu_ack_len, 1270 info->status.ampdu_ack_len,
1215 reduced_txp); 1271 reduced_txp);
@@ -1221,9 +1277,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1221 info->status.ampdu_ack_len); 1277 info->status.ampdu_ack_len);
1222 } 1278 }
1223 } else { 1279 } else {
1224 /* 1280 /* For legacy, update frame history with for each Tx retry. */
1225 * For legacy, update frame history with for each Tx retry.
1226 */
1227 retries = info->status.rates[0].count - 1; 1281 retries = info->status.rates[0].count - 1;
1228 /* HW doesn't send more than 15 retries */ 1282 /* HW doesn't send more than 15 retries */
1229 retries = min(retries, 15); 1283 retries = min(retries, 15);
@@ -1232,21 +1286,23 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1232 legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK); 1286 legacy_success = !!(info->flags & IEEE80211_TX_STAT_ACK);
1233 /* Collect data for each rate used during failed TX attempts */ 1287 /* Collect data for each rate used during failed TX attempts */
1234 for (i = 0; i <= retries; ++i) { 1288 for (i = 0; i <= retries; ++i) {
1235 ucode_rate = le32_to_cpu(table->rs_table[i]); 1289 lq_hwrate = le32_to_cpu(table->rs_table[i]);
1236 rs_rate_from_ucode_rate(ucode_rate, info->band, &rate); 1290 rs_rate_from_ucode_rate(lq_hwrate, info->band,
1291 &lq_rate);
1237 /* 1292 /*
1238 * Only collect stats if retried rate is in the same RS 1293 * Only collect stats if retried rate is in the same RS
1239 * table as active/search. 1294 * table as active/search.
1240 */ 1295 */
1241 if (rs_rate_match(&rate, &curr_tbl->rate)) 1296 if (rs_rate_column_match(&lq_rate, &curr_tbl->rate))
1242 tmp_tbl = curr_tbl; 1297 tmp_tbl = curr_tbl;
1243 else if (rs_rate_match(&rate, &other_tbl->rate)) 1298 else if (rs_rate_column_match(&lq_rate,
1299 &other_tbl->rate))
1244 tmp_tbl = other_tbl; 1300 tmp_tbl = other_tbl;
1245 else 1301 else
1246 continue; 1302 continue;
1247 1303
1248 rs_collect_tx_data(mvm, lq_sta, tmp_tbl, rate.index, 1, 1304 rs_collect_tx_data(mvm, lq_sta, tmp_tbl, lq_rate.index,
1249 i < retries ? 0 : legacy_success, 1305 1, i < retries ? 0 : legacy_success,
1250 reduced_txp); 1306 reduced_txp);
1251 } 1307 }
1252 1308
@@ -1257,7 +1313,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1257 } 1313 }
1258 } 1314 }
1259 /* The last TX rate is cached in lq_sta; it's set in if/else above */ 1315 /* The last TX rate is cached in lq_sta; it's set in if/else above */
1260 lq_sta->last_rate_n_flags = ucode_rate; 1316 lq_sta->last_rate_n_flags = lq_hwrate;
1261 IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp); 1317 IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp);
1262done: 1318done:
1263 /* See if there's a better rate or modulation mode to try. */ 1319 /* See if there's a better rate or modulation mode to try. */
@@ -1557,9 +1613,9 @@ static void rs_stay_in_table(struct iwl_lq_sta *lq_sta, bool force_search)
1557static void rs_update_rate_tbl(struct iwl_mvm *mvm, 1613static void rs_update_rate_tbl(struct iwl_mvm *mvm,
1558 struct ieee80211_sta *sta, 1614 struct ieee80211_sta *sta,
1559 struct iwl_lq_sta *lq_sta, 1615 struct iwl_lq_sta *lq_sta,
1560 struct rs_rate *rate) 1616 struct iwl_scale_tbl_info *tbl)
1561{ 1617{
1562 rs_fill_lq_cmd(mvm, sta, lq_sta, rate); 1618 rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate);
1563 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false); 1619 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false);
1564} 1620}
1565 1621
@@ -2089,7 +2145,7 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm,
2089 rate->type = LQ_NONE; 2145 rate->type = LQ_NONE;
2090 lq_sta->search_better_tbl = 0; 2146 lq_sta->search_better_tbl = 0;
2091 tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); 2147 tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
2092 rs_update_rate_tbl(mvm, sta, lq_sta, &tbl->rate); 2148 rs_update_rate_tbl(mvm, sta, lq_sta, tbl);
2093 } 2149 }
2094 return; 2150 return;
2095 } 2151 }
@@ -2252,7 +2308,7 @@ lq_update:
2252 /* Replace uCode's rate table for the destination station. */ 2308 /* Replace uCode's rate table for the destination station. */
2253 if (update_lq) { 2309 if (update_lq) {
2254 tbl->rate.index = index; 2310 tbl->rate.index = index;
2255 rs_update_rate_tbl(mvm, sta, lq_sta, &tbl->rate); 2311 rs_update_rate_tbl(mvm, sta, lq_sta, tbl);
2256 } 2312 }
2257 2313
2258 rs_stay_in_table(lq_sta, false); 2314 rs_stay_in_table(lq_sta, false);
@@ -2299,8 +2355,7 @@ lq_update:
2299 2355
2300 rs_dump_rate(mvm, &tbl->rate, 2356 rs_dump_rate(mvm, &tbl->rate,
2301 "Switch to SEARCH TABLE:"); 2357 "Switch to SEARCH TABLE:");
2302 rs_fill_lq_cmd(mvm, sta, lq_sta, &tbl->rate); 2358 rs_update_rate_tbl(mvm, sta, lq_sta, tbl);
2303 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false);
2304 } else { 2359 } else {
2305 done_search = 1; 2360 done_search = 1;
2306 } 2361 }
@@ -2554,6 +2609,7 @@ static void *rs_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta,
2554#ifdef CONFIG_MAC80211_DEBUGFS 2609#ifdef CONFIG_MAC80211_DEBUGFS
2555 lq_sta->pers.dbg_fixed_rate = 0; 2610 lq_sta->pers.dbg_fixed_rate = 0;
2556 lq_sta->pers.dbg_fixed_txp_reduction = TPC_INVALID; 2611 lq_sta->pers.dbg_fixed_txp_reduction = TPC_INVALID;
2612 lq_sta->pers.ss_force = RS_SS_FORCE_NONE;
2557#endif 2613#endif
2558 lq_sta->pers.chains = 0; 2614 lq_sta->pers.chains = 0;
2559 memset(lq_sta->pers.chain_signal, 0, sizeof(lq_sta->pers.chain_signal)); 2615 memset(lq_sta->pers.chain_signal, 0, sizeof(lq_sta->pers.chain_signal));
@@ -3079,19 +3135,21 @@ static void rs_set_lq_ss_params(struct iwl_mvm *mvm,
3079 if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta)) 3135 if (!iwl_mvm_bt_coex_is_mimo_allowed(mvm, sta))
3080 goto out; 3136 goto out;
3081 3137
3138#ifdef CONFIG_MAC80211_DEBUGFS
3082 /* Check if forcing the decision is configured. 3139 /* Check if forcing the decision is configured.
3083 * Note that SISO is forced by not allowing STBC or BFER 3140 * Note that SISO is forced by not allowing STBC or BFER
3084 */ 3141 */
3085 if (lq_sta->ss_force == RS_SS_FORCE_STBC) 3142 if (lq_sta->pers.ss_force == RS_SS_FORCE_STBC)
3086 ss_params |= (LQ_SS_STBC_1SS_ALLOWED | LQ_SS_FORCE); 3143 ss_params |= (LQ_SS_STBC_1SS_ALLOWED | LQ_SS_FORCE);
3087 else if (lq_sta->ss_force == RS_SS_FORCE_BFER) 3144 else if (lq_sta->pers.ss_force == RS_SS_FORCE_BFER)
3088 ss_params |= (LQ_SS_BFER_ALLOWED | LQ_SS_FORCE); 3145 ss_params |= (LQ_SS_BFER_ALLOWED | LQ_SS_FORCE);
3089 3146
3090 if (lq_sta->ss_force != RS_SS_FORCE_NONE) { 3147 if (lq_sta->pers.ss_force != RS_SS_FORCE_NONE) {
3091 IWL_DEBUG_RATE(mvm, "Forcing single stream Tx decision %d\n", 3148 IWL_DEBUG_RATE(mvm, "Forcing single stream Tx decision %d\n",
3092 lq_sta->ss_force); 3149 lq_sta->pers.ss_force);
3093 goto out; 3150 goto out;
3094 } 3151 }
3152#endif
3095 3153
3096 if (lq_sta->stbc_capable) 3154 if (lq_sta->stbc_capable)
3097 ss_params |= LQ_SS_STBC_1SS_ALLOWED; 3155 ss_params |= LQ_SS_STBC_1SS_ALLOWED;
@@ -3177,7 +3235,7 @@ static void rs_fill_lq_cmd(struct iwl_mvm *mvm,
3177 lq_cmd->agg_frame_cnt_limit = mvmsta->max_agg_bufsize; 3235 lq_cmd->agg_frame_cnt_limit = mvmsta->max_agg_bufsize;
3178 3236
3179 /* 3237 /*
3180 * In case of low latency, tell the firwmare to leave a frame in the 3238 * In case of low latency, tell the firmware to leave a frame in the
3181 * Tx Fifo so that it can start a transaction in the same TxOP. This 3239 * Tx Fifo so that it can start a transaction in the same TxOP. This
3182 * basically allows the firmware to send bursts. 3240 * basically allows the firmware to send bursts.
3183 */ 3241 */
@@ -3332,6 +3390,7 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
3332 struct iwl_mvm *mvm; 3390 struct iwl_mvm *mvm;
3333 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]); 3391 struct iwl_scale_tbl_info *tbl = &(lq_sta->lq_info[lq_sta->active_tbl]);
3334 struct rs_rate *rate = &tbl->rate; 3392 struct rs_rate *rate = &tbl->rate;
3393 u32 ss_params;
3335 mvm = lq_sta->pers.drv; 3394 mvm = lq_sta->pers.drv;
3336 buff = kmalloc(2048, GFP_KERNEL); 3395 buff = kmalloc(2048, GFP_KERNEL);
3337 if (!buff) 3396 if (!buff)
@@ -3351,16 +3410,16 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
3351 (is_legacy(rate)) ? "legacy" : 3410 (is_legacy(rate)) ? "legacy" :
3352 is_vht(rate) ? "VHT" : "HT"); 3411 is_vht(rate) ? "VHT" : "HT");
3353 if (!is_legacy(rate)) { 3412 if (!is_legacy(rate)) {
3354 desc += sprintf(buff+desc, " %s", 3413 desc += sprintf(buff + desc, " %s",
3355 (is_siso(rate)) ? "SISO" : "MIMO2"); 3414 (is_siso(rate)) ? "SISO" : "MIMO2");
3356 desc += sprintf(buff+desc, " %s", 3415 desc += sprintf(buff + desc, " %s",
3357 (is_ht20(rate)) ? "20MHz" : 3416 (is_ht20(rate)) ? "20MHz" :
3358 (is_ht40(rate)) ? "40MHz" : 3417 (is_ht40(rate)) ? "40MHz" :
3359 (is_ht80(rate)) ? "80Mhz" : "BAD BW"); 3418 (is_ht80(rate)) ? "80Mhz" : "BAD BW");
3360 desc += sprintf(buff+desc, " %s %s %s\n", 3419 desc += sprintf(buff + desc, " %s %s %s\n",
3361 (rate->sgi) ? "SGI" : "NGI", 3420 (rate->sgi) ? "SGI" : "NGI",
3362 (rate->ldpc) ? "LDPC" : "BCC", 3421 (rate->ldpc) ? "LDPC" : "BCC",
3363 (lq_sta->is_agg) ? "AGG on" : ""); 3422 (lq_sta->is_agg) ? "AGG on" : "");
3364 } 3423 }
3365 desc += sprintf(buff+desc, "last tx rate=0x%X\n", 3424 desc += sprintf(buff+desc, "last tx rate=0x%X\n",
3366 lq_sta->last_rate_n_flags); 3425 lq_sta->last_rate_n_flags);
@@ -3378,6 +3437,16 @@ static ssize_t rs_sta_dbgfs_scale_table_read(struct file *file,
3378 lq_sta->lq.agg_frame_cnt_limit); 3437 lq_sta->lq.agg_frame_cnt_limit);
3379 3438
3380 desc += sprintf(buff+desc, "reduced tpc=%d\n", lq_sta->lq.reduced_tpc); 3439 desc += sprintf(buff+desc, "reduced tpc=%d\n", lq_sta->lq.reduced_tpc);
3440 ss_params = le32_to_cpu(lq_sta->lq.ss_params);
3441 desc += sprintf(buff+desc, "single stream params: %s%s%s%s\n",
3442 (ss_params & LQ_SS_PARAMS_VALID) ?
3443 "VALID" : "INVALID",
3444 (ss_params & LQ_SS_BFER_ALLOWED) ?
3445 ", BFER" : "",
3446 (ss_params & LQ_SS_STBC_1SS_ALLOWED) ?
3447 ", STBC" : "",
3448 (ss_params & LQ_SS_FORCE) ?
3449 ", FORCE" : "");
3381 desc += sprintf(buff+desc, 3450 desc += sprintf(buff+desc,
3382 "Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n", 3451 "Start idx [0]=0x%x [1]=0x%x [2]=0x%x [3]=0x%x\n",
3383 lq_sta->lq.initial_rate_index[0], 3452 lq_sta->lq.initial_rate_index[0],
@@ -3554,7 +3623,7 @@ static ssize_t iwl_dbgfs_ss_force_read(struct file *file,
3554 }; 3623 };
3555 3624
3556 pos += scnprintf(buf+pos, bufsz-pos, "%s\n", 3625 pos += scnprintf(buf+pos, bufsz-pos, "%s\n",
3557 ss_force_name[lq_sta->ss_force]); 3626 ss_force_name[lq_sta->pers.ss_force]);
3558 return simple_read_from_buffer(user_buf, count, ppos, buf, pos); 3627 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
3559} 3628}
3560 3629
@@ -3565,12 +3634,12 @@ static ssize_t iwl_dbgfs_ss_force_write(struct iwl_lq_sta *lq_sta, char *buf,
3565 int ret = 0; 3634 int ret = 0;
3566 3635
3567 if (!strncmp("none", buf, 4)) { 3636 if (!strncmp("none", buf, 4)) {
3568 lq_sta->ss_force = RS_SS_FORCE_NONE; 3637 lq_sta->pers.ss_force = RS_SS_FORCE_NONE;
3569 } else if (!strncmp("siso", buf, 4)) { 3638 } else if (!strncmp("siso", buf, 4)) {
3570 lq_sta->ss_force = RS_SS_FORCE_SISO; 3639 lq_sta->pers.ss_force = RS_SS_FORCE_SISO;
3571 } else if (!strncmp("stbc", buf, 4)) { 3640 } else if (!strncmp("stbc", buf, 4)) {
3572 if (lq_sta->stbc_capable) { 3641 if (lq_sta->stbc_capable) {
3573 lq_sta->ss_force = RS_SS_FORCE_STBC; 3642 lq_sta->pers.ss_force = RS_SS_FORCE_STBC;
3574 } else { 3643 } else {
3575 IWL_ERR(mvm, 3644 IWL_ERR(mvm,
3576 "can't force STBC. peer doesn't support\n"); 3645 "can't force STBC. peer doesn't support\n");
@@ -3578,7 +3647,7 @@ static ssize_t iwl_dbgfs_ss_force_write(struct iwl_lq_sta *lq_sta, char *buf,
3578 } 3647 }
3579 } else if (!strncmp("bfer", buf, 4)) { 3648 } else if (!strncmp("bfer", buf, 4)) {
3580 if (lq_sta->bfer_capable) { 3649 if (lq_sta->bfer_capable) {
3581 lq_sta->ss_force = RS_SS_FORCE_BFER; 3650 lq_sta->pers.ss_force = RS_SS_FORCE_BFER;
3582 } else { 3651 } else {
3583 IWL_ERR(mvm, 3652 IWL_ERR(mvm,
3584 "can't force BFER. peer doesn't support\n"); 3653 "can't force BFER. peer doesn't support\n");
@@ -3673,7 +3742,7 @@ void iwl_mvm_rate_control_unregister(void)
3673 3742
3674/** 3743/**
3675 * iwl_mvm_tx_protection - Gets LQ command, change it to enable/disable 3744 * iwl_mvm_tx_protection - Gets LQ command, change it to enable/disable
3676 * Tx protection, according to this rquest and previous requests, 3745 * Tx protection, according to this request and previous requests,
3677 * and send the LQ command. 3746 * and send the LQ command.
3678 * @mvmsta: The station 3747 * @mvmsta: The station
3679 * @enable: Enable Tx protection? 3748 * @enable: Enable Tx protection?
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.h b/drivers/net/wireless/iwlwifi/mvm/rs.h
index dc4ef3dfafe1..e4aa9346a231 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.h
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.h
@@ -170,6 +170,7 @@ struct rs_rate {
170 bool sgi; 170 bool sgi;
171 bool ldpc; 171 bool ldpc;
172 bool stbc; 172 bool stbc;
173 bool bfer;
173}; 174};
174 175
175 176
@@ -331,14 +332,14 @@ struct iwl_lq_sta {
331 /* tx power reduce for this sta */ 332 /* tx power reduce for this sta */
332 int tpc_reduce; 333 int tpc_reduce;
333 334
334 /* force STBC/BFER/SISO for testing */
335 enum rs_ss_force_opt ss_force;
336
337 /* persistent fields - initialized only once - keep last! */ 335 /* persistent fields - initialized only once - keep last! */
338 struct lq_sta_pers { 336 struct lq_sta_pers {
339#ifdef CONFIG_MAC80211_DEBUGFS 337#ifdef CONFIG_MAC80211_DEBUGFS
340 u32 dbg_fixed_rate; 338 u32 dbg_fixed_rate;
341 u8 dbg_fixed_txp_reduction; 339 u8 dbg_fixed_txp_reduction;
340
341 /* force STBC/BFER/SISO for testing */
342 enum rs_ss_force_opt ss_force;
342#endif 343#endif
343 u8 chains; 344 u8 chains;
344 s8 chain_signal[IEEE80211_MAX_CHAINS]; 345 s8 chain_signal[IEEE80211_MAX_CHAINS];
diff --git a/drivers/net/wireless/iwlwifi/mvm/rx.c b/drivers/net/wireless/iwlwifi/mvm/rx.c
index f922131b4eab..78ec7db64ba5 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rx.c
@@ -6,7 +6,7 @@
6 * GPL LICENSE SUMMARY 6 * GPL LICENSE SUMMARY
7 * 7 *
8 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. 8 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
9 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH 9 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
10 * 10 *
11 * This program is free software; you can redistribute it and/or modify 11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of version 2 of the GNU General Public License as 12 * it under the terms of version 2 of the GNU General Public License as
@@ -32,7 +32,7 @@
32 * BSD LICENSE 32 * BSD LICENSE
33 * 33 *
34 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. 34 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved.
35 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH 35 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
36 * All rights reserved. 36 * All rights reserved.
37 * 37 *
38 * Redistribution and use in source and binary forms, with or without 38 * Redistribution and use in source and binary forms, with or without
@@ -345,6 +345,25 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
345 struct iwl_mvm_sta *mvmsta; 345 struct iwl_mvm_sta *mvmsta;
346 mvmsta = iwl_mvm_sta_from_mac80211(sta); 346 mvmsta = iwl_mvm_sta_from_mac80211(sta);
347 rs_update_last_rssi(mvm, &mvmsta->lq_sta, rx_status); 347 rs_update_last_rssi(mvm, &mvmsta->lq_sta, rx_status);
348
349 if (iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_RSSI) &&
350 ieee80211_is_beacon(hdr->frame_control)) {
351 struct iwl_fw_dbg_trigger_tlv *trig;
352 struct iwl_fw_dbg_trigger_low_rssi *rssi_trig;
353 bool trig_check;
354 s32 rssi;
355
356 trig = iwl_fw_dbg_get_trigger(mvm->fw,
357 FW_DBG_TRIGGER_RSSI);
358 rssi_trig = (void *)trig->data;
359 rssi = le32_to_cpu(rssi_trig->rssi);
360
361 trig_check =
362 iwl_fw_dbg_trigger_check_stop(mvm, mvmsta->vif,
363 trig);
364 if (trig_check && rx_status->signal < rssi)
365 iwl_mvm_fw_dbg_collect_trig(mvm, trig, NULL);
366 }
348 } 367 }
349 368
350 rcu_read_unlock(); 369 rcu_read_unlock();
@@ -416,35 +435,43 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
416} 435}
417 436
418static void iwl_mvm_update_rx_statistics(struct iwl_mvm *mvm, 437static void iwl_mvm_update_rx_statistics(struct iwl_mvm *mvm,
419 struct iwl_notif_statistics *stats) 438 struct mvm_statistics_rx *rx_stats)
420{ 439{
421 /*
422 * NOTE FW aggregates the statistics - BUT the statistics are cleared
423 * when the driver issues REPLY_STATISTICS_CMD 0x9c with CLEAR_STATS
424 * bit set.
425 */
426 lockdep_assert_held(&mvm->mutex); 440 lockdep_assert_held(&mvm->mutex);
427 memcpy(&mvm->rx_stats, &stats->rx, sizeof(struct mvm_statistics_rx)); 441
442 mvm->rx_stats = *rx_stats;
428} 443}
429 444
430struct iwl_mvm_stat_data { 445struct iwl_mvm_stat_data {
431 struct iwl_notif_statistics *stats;
432 struct iwl_mvm *mvm; 446 struct iwl_mvm *mvm;
447 __le32 mac_id;
448 __s8 beacon_filter_average_energy;
449 struct mvm_statistics_general_v8 *general;
433}; 450};
434 451
435static void iwl_mvm_stat_iterator(void *_data, u8 *mac, 452static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
436 struct ieee80211_vif *vif) 453 struct ieee80211_vif *vif)
437{ 454{
438 struct iwl_mvm_stat_data *data = _data; 455 struct iwl_mvm_stat_data *data = _data;
439 struct iwl_notif_statistics *stats = data->stats;
440 struct iwl_mvm *mvm = data->mvm; 456 struct iwl_mvm *mvm = data->mvm;
441 int sig = -stats->general.beacon_filter_average_energy; 457 int sig = -data->beacon_filter_average_energy;
442 int last_event; 458 int last_event;
443 int thold = vif->bss_conf.cqm_rssi_thold; 459 int thold = vif->bss_conf.cqm_rssi_thold;
444 int hyst = vif->bss_conf.cqm_rssi_hyst; 460 int hyst = vif->bss_conf.cqm_rssi_hyst;
445 u16 id = le32_to_cpu(stats->rx.general.mac_id); 461 u16 id = le32_to_cpu(data->mac_id);
446 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 462 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
447 463
464 /* This doesn't need the MAC ID check since it's not taking the
465 * data copied into the "data" struct, but rather the data from
466 * the notification directly.
467 */
468 if (data->general) {
469 mvmvif->beacon_stats.num_beacons =
470 le32_to_cpu(data->general->beacon_counter[mvmvif->id]);
471 mvmvif->beacon_stats.avg_signal =
472 -data->general->beacon_average_energy[mvmvif->id];
473 }
474
448 if (mvmvif->id != id) 475 if (mvmvif->id != id)
449 return; 476 return;
450 477
@@ -500,34 +527,101 @@ static void iwl_mvm_stat_iterator(void *_data, u8 *mac,
500 } 527 }
501} 528}
502 529
503/* 530static inline void
504 * iwl_mvm_rx_statistics - STATISTICS_NOTIFICATION handler 531iwl_mvm_rx_stats_check_trigger(struct iwl_mvm *mvm, struct iwl_rx_packet *pkt)
505 *
506 * TODO: This handler is implemented partially.
507 */
508int iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
509 struct iwl_rx_cmd_buffer *rxb,
510 struct iwl_device_cmd *cmd)
511{ 532{
512 struct iwl_rx_packet *pkt = rxb_addr(rxb); 533 struct iwl_fw_dbg_trigger_tlv *trig;
513 struct iwl_notif_statistics *stats = (void *)&pkt->data; 534 struct iwl_fw_dbg_trigger_stats *trig_stats;
535 u32 trig_offset, trig_thold;
536
537 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_STATS))
538 return;
539
540 trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_STATS);
541 trig_stats = (void *)trig->data;
542
543 if (!iwl_fw_dbg_trigger_check_stop(mvm, NULL, trig))
544 return;
545
546 trig_offset = le32_to_cpu(trig_stats->stop_offset);
547 trig_thold = le32_to_cpu(trig_stats->stop_threshold);
548
549 if (WARN_ON_ONCE(trig_offset >= iwl_rx_packet_payload_len(pkt)))
550 return;
551
552 if (le32_to_cpup((__le32 *) (pkt->data + trig_offset)) < trig_thold)
553 return;
554
555 iwl_mvm_fw_dbg_collect_trig(mvm, trig, NULL);
556}
557
558void iwl_mvm_handle_rx_statistics(struct iwl_mvm *mvm,
559 struct iwl_rx_packet *pkt)
560{
561 size_t v8_len = sizeof(struct iwl_notif_statistics_v8);
562 size_t v10_len = sizeof(struct iwl_notif_statistics_v10);
514 struct iwl_mvm_stat_data data = { 563 struct iwl_mvm_stat_data data = {
515 .stats = stats,
516 .mvm = mvm, 564 .mvm = mvm,
517 }; 565 };
566 u32 temperature;
567
568 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_STATS_V10) {
569 struct iwl_notif_statistics_v10 *stats = (void *)&pkt->data;
570
571 if (iwl_rx_packet_payload_len(pkt) != v10_len)
572 goto invalid;
573
574 temperature = le32_to_cpu(stats->general.radio_temperature);
575 data.mac_id = stats->rx.general.mac_id;
576 data.beacon_filter_average_energy =
577 stats->general.beacon_filter_average_energy;
578
579 iwl_mvm_update_rx_statistics(mvm, &stats->rx);
580
581 mvm->radio_stats.rx_time = le64_to_cpu(stats->general.rx_time);
582 mvm->radio_stats.tx_time = le64_to_cpu(stats->general.tx_time);
583 mvm->radio_stats.on_time_rf =
584 le64_to_cpu(stats->general.on_time_rf);
585 mvm->radio_stats.on_time_scan =
586 le64_to_cpu(stats->general.on_time_scan);
587
588 data.general = &stats->general;
589 } else {
590 struct iwl_notif_statistics_v8 *stats = (void *)&pkt->data;
591
592 if (iwl_rx_packet_payload_len(pkt) != v8_len)
593 goto invalid;
594
595 temperature = le32_to_cpu(stats->general.radio_temperature);
596 data.mac_id = stats->rx.general.mac_id;
597 data.beacon_filter_average_energy =
598 stats->general.beacon_filter_average_energy;
599
600 iwl_mvm_update_rx_statistics(mvm, &stats->rx);
601 }
602
603 iwl_mvm_rx_stats_check_trigger(mvm, pkt);
518 604
519 /* Only handle rx statistics temperature changes if async temp 605 /* Only handle rx statistics temperature changes if async temp
520 * notifications are not supported 606 * notifications are not supported
521 */ 607 */
522 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_ASYNC_DTM)) 608 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_ASYNC_DTM))
523 iwl_mvm_tt_temp_changed(mvm, 609 iwl_mvm_tt_temp_changed(mvm, temperature);
524 le32_to_cpu(stats->general.radio_temperature));
525
526 iwl_mvm_update_rx_statistics(mvm, stats);
527 610
528 ieee80211_iterate_active_interfaces(mvm->hw, 611 ieee80211_iterate_active_interfaces(mvm->hw,
529 IEEE80211_IFACE_ITER_NORMAL, 612 IEEE80211_IFACE_ITER_NORMAL,
530 iwl_mvm_stat_iterator, 613 iwl_mvm_stat_iterator,
531 &data); 614 &data);
615 return;
616 invalid:
617 IWL_ERR(mvm, "received invalid statistics size (%d)!\n",
618 iwl_rx_packet_payload_len(pkt));
619}
620
621int iwl_mvm_rx_statistics(struct iwl_mvm *mvm,
622 struct iwl_rx_cmd_buffer *rxb,
623 struct iwl_device_cmd *cmd)
624{
625 iwl_mvm_handle_rx_statistics(mvm, rxb_addr(rxb));
532 return 0; 626 return 0;
533} 627}
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index c47c8051da77..74e1c86289dc 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -82,6 +82,7 @@ struct iwl_mvm_scan_params {
82 struct _dwell { 82 struct _dwell {
83 u16 passive; 83 u16 passive;
84 u16 active; 84 u16 active;
85 u16 fragmented;
85 } dwell[IEEE80211_NUM_BANDS]; 86 } dwell[IEEE80211_NUM_BANDS];
86}; 87};
87 88
@@ -191,101 +192,6 @@ static u16 iwl_mvm_get_passive_dwell(struct iwl_mvm *mvm,
191 return band == IEEE80211_BAND_2GHZ ? 100 + 20 : 100 + 10; 192 return band == IEEE80211_BAND_2GHZ ? 100 + 20 : 100 + 10;
192} 193}
193 194
194static void iwl_mvm_scan_fill_channels(struct iwl_scan_cmd *cmd,
195 struct cfg80211_scan_request *req,
196 bool basic_ssid,
197 struct iwl_mvm_scan_params *params)
198{
199 struct iwl_scan_channel *chan = (struct iwl_scan_channel *)
200 (cmd->data + le16_to_cpu(cmd->tx_cmd.len));
201 int i;
202 int type = BIT(req->n_ssids) - 1;
203 enum ieee80211_band band = req->channels[0]->band;
204
205 if (!basic_ssid)
206 type |= BIT(req->n_ssids);
207
208 for (i = 0; i < cmd->channel_count; i++) {
209 chan->channel = cpu_to_le16(req->channels[i]->hw_value);
210 chan->type = cpu_to_le32(type);
211 if (req->channels[i]->flags & IEEE80211_CHAN_NO_IR)
212 chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE);
213 chan->active_dwell = cpu_to_le16(params->dwell[band].active);
214 chan->passive_dwell = cpu_to_le16(params->dwell[band].passive);
215 chan->iteration_count = cpu_to_le16(1);
216 chan++;
217 }
218}
219
220/*
221 * Fill in probe request with the following parameters:
222 * TA is our vif HW address, which mac80211 ensures we have.
223 * Packet is broadcasted, so this is both SA and DA.
224 * The probe request IE is made out of two: first comes the most prioritized
225 * SSID if a directed scan is requested. Second comes whatever extra
226 * information was given to us as the scan request IE.
227 */
228static u16 iwl_mvm_fill_probe_req(struct ieee80211_mgmt *frame, const u8 *ta,
229 int n_ssids, const u8 *ssid, int ssid_len,
230 const u8 *band_ie, int band_ie_len,
231 const u8 *common_ie, int common_ie_len,
232 int left)
233{
234 int len = 0;
235 u8 *pos = NULL;
236
237 /* Make sure there is enough space for the probe request,
238 * two mandatory IEs and the data */
239 left -= 24;
240 if (left < 0)
241 return 0;
242
243 frame->frame_control = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ);
244 eth_broadcast_addr(frame->da);
245 memcpy(frame->sa, ta, ETH_ALEN);
246 eth_broadcast_addr(frame->bssid);
247 frame->seq_ctrl = 0;
248
249 len += 24;
250
251 /* for passive scans, no need to fill anything */
252 if (n_ssids == 0)
253 return (u16)len;
254
255 /* points to the payload of the request */
256 pos = &frame->u.probe_req.variable[0];
257
258 /* fill in our SSID IE */
259 left -= ssid_len + 2;
260 if (left < 0)
261 return 0;
262 *pos++ = WLAN_EID_SSID;
263 *pos++ = ssid_len;
264 if (ssid && ssid_len) { /* ssid_len may be == 0 even if ssid is valid */
265 memcpy(pos, ssid, ssid_len);
266 pos += ssid_len;
267 }
268
269 len += ssid_len + 2;
270
271 if (WARN_ON(left < band_ie_len + common_ie_len))
272 return len;
273
274 if (band_ie && band_ie_len) {
275 memcpy(pos, band_ie, band_ie_len);
276 pos += band_ie_len;
277 len += band_ie_len;
278 }
279
280 if (common_ie && common_ie_len) {
281 memcpy(pos, common_ie, common_ie_len);
282 pos += common_ie_len;
283 len += common_ie_len;
284 }
285
286 return (u16)len;
287}
288
289static void iwl_mvm_scan_condition_iterator(void *data, u8 *mac, 195static void iwl_mvm_scan_condition_iterator(void *data, u8 *mac,
290 struct ieee80211_vif *vif) 196 struct ieee80211_vif *vif)
291{ 197{
@@ -325,7 +231,7 @@ static void iwl_mvm_scan_calc_params(struct iwl_mvm *mvm,
325 * If there is more than one active interface make 231 * If there is more than one active interface make
326 * passive scan more fragmented. 232 * passive scan more fragmented.
327 */ 233 */
328 frag_passive_dwell = (global_cnt < 2) ? 40 : 20; 234 frag_passive_dwell = 40;
329 params->max_out_time = frag_passive_dwell; 235 params->max_out_time = frag_passive_dwell;
330 } else { 236 } else {
331 params->suspend_time = 120; 237 params->suspend_time = 120;
@@ -358,10 +264,10 @@ not_bound:
358 264
359 for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) { 265 for (band = IEEE80211_BAND_2GHZ; band < IEEE80211_NUM_BANDS; band++) {
360 if (params->passive_fragmented) 266 if (params->passive_fragmented)
361 params->dwell[band].passive = frag_passive_dwell; 267 params->dwell[band].fragmented = frag_passive_dwell;
362 else 268
363 params->dwell[band].passive = 269 params->dwell[band].passive = iwl_mvm_get_passive_dwell(mvm,
364 iwl_mvm_get_passive_dwell(mvm, band); 270 band);
365 params->dwell[band].active = iwl_mvm_get_active_dwell(mvm, band, 271 params->dwell[band].active = iwl_mvm_get_active_dwell(mvm, band,
366 n_ssids); 272 n_ssids);
367 } 273 }
@@ -379,20 +285,11 @@ static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm,
379{ 285{
380 int max_probe_len; 286 int max_probe_len;
381 287
382 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) 288 max_probe_len = SCAN_OFFLOAD_PROBE_REQ_SIZE;
383 max_probe_len = SCAN_OFFLOAD_PROBE_REQ_SIZE;
384 else
385 max_probe_len = mvm->fw->ucode_capa.max_probe_length;
386 289
387 /* we create the 802.11 header and SSID element */ 290 /* we create the 802.11 header and SSID element */
388 max_probe_len -= 24 + 2; 291 max_probe_len -= 24 + 2;
389 292
390 /* basic ssid is added only for hw_scan with and old api */
391 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID) &&
392 !(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) &&
393 !is_sched_scan)
394 max_probe_len -= 32;
395
396 /* DS parameter set element is added on 2.4GHZ band if required */ 293 /* DS parameter set element is added on 2.4GHZ band if required */
397 if (iwl_mvm_rrm_scan_needed(mvm)) 294 if (iwl_mvm_rrm_scan_needed(mvm))
398 max_probe_len -= 3; 295 max_probe_len -= 3;
@@ -404,9 +301,6 @@ int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan)
404{ 301{
405 int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm, is_sched_scan); 302 int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm, is_sched_scan);
406 303
407 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN))
408 return max_ie_len;
409
410 /* TODO: [BUG] This function should return the maximum allowed size of 304 /* TODO: [BUG] This function should return the maximum allowed size of
411 * scan IEs, however the LMAC scan api contains both 2GHZ and 5GHZ IEs 305 * scan IEs, however the LMAC scan api contains both 2GHZ and 5GHZ IEs
412 * in the same command. So the correct implementation of this function 306 * in the same command. So the correct implementation of this function
@@ -420,129 +314,6 @@ int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan)
420 return max_ie_len; 314 return max_ie_len;
421} 315}
422 316
423int iwl_mvm_scan_request(struct iwl_mvm *mvm,
424 struct ieee80211_vif *vif,
425 struct cfg80211_scan_request *req)
426{
427 struct iwl_host_cmd hcmd = {
428 .id = SCAN_REQUEST_CMD,
429 .len = { 0, },
430 .data = { mvm->scan_cmd, },
431 .dataflags = { IWL_HCMD_DFL_NOCOPY, },
432 };
433 struct iwl_scan_cmd *cmd = mvm->scan_cmd;
434 int ret;
435 u32 status;
436 int ssid_len = 0;
437 u8 *ssid = NULL;
438 bool basic_ssid = !(mvm->fw->ucode_capa.flags &
439 IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID);
440 struct iwl_mvm_scan_params params = {};
441
442 lockdep_assert_held(&mvm->mutex);
443
444 /* we should have failed registration if scan_cmd was NULL */
445 if (WARN_ON(mvm->scan_cmd == NULL))
446 return -ENOMEM;
447
448 IWL_DEBUG_SCAN(mvm, "Handling mac80211 scan request\n");
449 mvm->scan_status = IWL_MVM_SCAN_OS;
450 memset(cmd, 0, ksize(cmd));
451
452 cmd->channel_count = (u8)req->n_channels;
453 cmd->quiet_time = cpu_to_le16(IWL_ACTIVE_QUIET_TIME);
454 cmd->quiet_plcp_th = cpu_to_le16(IWL_PLCP_QUIET_THRESH);
455 cmd->rxchain_sel_flags = iwl_mvm_scan_rx_chain(mvm);
456
457 iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, req->flags, &params);
458 cmd->max_out_time = cpu_to_le32(params.max_out_time);
459 cmd->suspend_time = cpu_to_le32(params.suspend_time);
460 if (params.passive_fragmented)
461 cmd->scan_flags |= SCAN_FLAGS_FRAGMENTED_SCAN;
462
463 cmd->rxon_flags = iwl_mvm_scan_rxon_flags(req->channels[0]->band);
464 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP |
465 MAC_FILTER_IN_BEACON);
466
467 if (vif->type == NL80211_IFTYPE_P2P_DEVICE)
468 cmd->type = cpu_to_le32(SCAN_TYPE_DISCOVERY_FORCED);
469 else
470 cmd->type = cpu_to_le32(SCAN_TYPE_FORCED);
471
472 cmd->repeats = cpu_to_le32(1);
473
474 /*
475 * If the user asked for passive scan, don't change to active scan if
476 * you see any activity on the channel - remain passive.
477 */
478 if (req->n_ssids > 0) {
479 cmd->passive2active = cpu_to_le16(1);
480 cmd->scan_flags |= SCAN_FLAGS_PASSIVE2ACTIVE;
481 if (basic_ssid) {
482 ssid = req->ssids[0].ssid;
483 ssid_len = req->ssids[0].ssid_len;
484 }
485 } else {
486 cmd->passive2active = 0;
487 cmd->scan_flags &= ~SCAN_FLAGS_PASSIVE2ACTIVE;
488 }
489
490 iwl_mvm_scan_fill_ssids(cmd->direct_scan, req->ssids, req->n_ssids,
491 basic_ssid ? 1 : 0);
492
493 cmd->tx_cmd.tx_flags = cpu_to_le32(TX_CMD_FLG_SEQ_CTL |
494 3 << TX_CMD_FLG_BT_PRIO_POS);
495
496 cmd->tx_cmd.sta_id = mvm->aux_sta.sta_id;
497 cmd->tx_cmd.life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE);
498 cmd->tx_cmd.rate_n_flags =
499 iwl_mvm_scan_rate_n_flags(mvm, req->channels[0]->band,
500 req->no_cck);
501
502 cmd->tx_cmd.len =
503 cpu_to_le16(iwl_mvm_fill_probe_req(
504 (struct ieee80211_mgmt *)cmd->data,
505 vif->addr,
506 req->n_ssids, ssid, ssid_len,
507 req->ie, req->ie_len, NULL, 0,
508 mvm->fw->ucode_capa.max_probe_length));
509
510 iwl_mvm_scan_fill_channels(cmd, req, basic_ssid, &params);
511
512 cmd->len = cpu_to_le16(sizeof(struct iwl_scan_cmd) +
513 le16_to_cpu(cmd->tx_cmd.len) +
514 (cmd->channel_count * sizeof(struct iwl_scan_channel)));
515 hcmd.len[0] = le16_to_cpu(cmd->len);
516
517 status = SCAN_RESPONSE_OK;
518 ret = iwl_mvm_send_cmd_status(mvm, &hcmd, &status);
519 if (!ret && status == SCAN_RESPONSE_OK) {
520 IWL_DEBUG_SCAN(mvm, "Scan request was sent successfully\n");
521 } else {
522 /*
523 * If the scan failed, it usually means that the FW was unable
524 * to allocate the time events. Warn on it, but maybe we
525 * should try to send the command again with different params.
526 */
527 IWL_ERR(mvm, "Scan failed! status 0x%x ret %d\n",
528 status, ret);
529 mvm->scan_status = IWL_MVM_SCAN_NONE;
530 ret = -EIO;
531 }
532 return ret;
533}
534
535int iwl_mvm_rx_scan_response(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
536 struct iwl_device_cmd *cmd)
537{
538 struct iwl_rx_packet *pkt = rxb_addr(rxb);
539 struct iwl_cmd_response *resp = (void *)pkt->data;
540
541 IWL_DEBUG_SCAN(mvm, "Scan response received. status 0x%x\n",
542 le32_to_cpu(resp->status));
543 return 0;
544}
545
546int iwl_mvm_rx_scan_offload_iter_complete_notif(struct iwl_mvm *mvm, 317int iwl_mvm_rx_scan_offload_iter_complete_notif(struct iwl_mvm *mvm,
547 struct iwl_rx_cmd_buffer *rxb, 318 struct iwl_rx_cmd_buffer *rxb,
548 struct iwl_device_cmd *cmd) 319 struct iwl_device_cmd *cmd)
@@ -556,130 +327,25 @@ int iwl_mvm_rx_scan_offload_iter_complete_notif(struct iwl_mvm *mvm,
556 return 0; 327 return 0;
557} 328}
558 329
559int iwl_mvm_rx_scan_complete(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
560 struct iwl_device_cmd *cmd)
561{
562 struct iwl_rx_packet *pkt = rxb_addr(rxb);
563 struct iwl_scan_complete_notif *notif = (void *)pkt->data;
564
565 lockdep_assert_held(&mvm->mutex);
566
567 IWL_DEBUG_SCAN(mvm, "Scan complete: status=0x%x scanned channels=%d\n",
568 notif->status, notif->scanned_channels);
569
570 if (mvm->scan_status == IWL_MVM_SCAN_OS)
571 mvm->scan_status = IWL_MVM_SCAN_NONE;
572 ieee80211_scan_completed(mvm->hw, notif->status != SCAN_COMP_STATUS_OK);
573
574 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN);
575
576 return 0;
577}
578
579int iwl_mvm_rx_scan_offload_results(struct iwl_mvm *mvm, 330int iwl_mvm_rx_scan_offload_results(struct iwl_mvm *mvm,
580 struct iwl_rx_cmd_buffer *rxb, 331 struct iwl_rx_cmd_buffer *rxb,
581 struct iwl_device_cmd *cmd) 332 struct iwl_device_cmd *cmd)
582{ 333{
583 struct iwl_rx_packet *pkt = rxb_addr(rxb);
584
585 if (!(mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) &&
586 !(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN)) {
587 struct iwl_sched_scan_results *notif = (void *)pkt->data;
588
589 if (!(notif->client_bitmap & SCAN_CLIENT_SCHED_SCAN))
590 return 0;
591 }
592
593 IWL_DEBUG_SCAN(mvm, "Scheduled scan results\n"); 334 IWL_DEBUG_SCAN(mvm, "Scheduled scan results\n");
594 ieee80211_sched_scan_results(mvm->hw); 335 ieee80211_sched_scan_results(mvm->hw);
595 336
596 return 0; 337 return 0;
597} 338}
598 339
599static bool iwl_mvm_scan_abort_notif(struct iwl_notif_wait_data *notif_wait,
600 struct iwl_rx_packet *pkt, void *data)
601{
602 struct iwl_mvm *mvm =
603 container_of(notif_wait, struct iwl_mvm, notif_wait);
604 struct iwl_scan_complete_notif *notif;
605 u32 *resp;
606
607 switch (pkt->hdr.cmd) {
608 case SCAN_ABORT_CMD:
609 resp = (void *)pkt->data;
610 if (*resp == CAN_ABORT_STATUS) {
611 IWL_DEBUG_SCAN(mvm,
612 "Scan can be aborted, wait until completion\n");
613 return false;
614 }
615
616 /*
617 * If scan cannot be aborted, it means that we had a
618 * SCAN_COMPLETE_NOTIFICATION in the pipe and it called
619 * ieee80211_scan_completed already.
620 */
621 IWL_DEBUG_SCAN(mvm, "Scan cannot be aborted, exit now: %d\n",
622 *resp);
623 return true;
624
625 case SCAN_COMPLETE_NOTIFICATION:
626 notif = (void *)pkt->data;
627 IWL_DEBUG_SCAN(mvm, "Scan aborted: status 0x%x\n",
628 notif->status);
629 return true;
630
631 default:
632 WARN_ON(1);
633 return false;
634 };
635}
636
637static int iwl_mvm_cancel_regular_scan(struct iwl_mvm *mvm)
638{
639 struct iwl_notification_wait wait_scan_abort;
640 static const u8 scan_abort_notif[] = { SCAN_ABORT_CMD,
641 SCAN_COMPLETE_NOTIFICATION };
642 int ret;
643
644 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_abort,
645 scan_abort_notif,
646 ARRAY_SIZE(scan_abort_notif),
647 iwl_mvm_scan_abort_notif, NULL);
648
649 ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, 0, 0, NULL);
650 if (ret) {
651 IWL_ERR(mvm, "Couldn't send SCAN_ABORT_CMD: %d\n", ret);
652 /* mac80211's state will be cleaned in the nic_restart flow */
653 goto out_remove_notif;
654 }
655
656 return iwl_wait_notification(&mvm->notif_wait, &wait_scan_abort, HZ);
657
658out_remove_notif:
659 iwl_remove_notification(&mvm->notif_wait, &wait_scan_abort);
660 return ret;
661}
662
663int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm, 340int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
664 struct iwl_rx_cmd_buffer *rxb, 341 struct iwl_rx_cmd_buffer *rxb,
665 struct iwl_device_cmd *cmd) 342 struct iwl_device_cmd *cmd)
666{ 343{
667 struct iwl_rx_packet *pkt = rxb_addr(rxb); 344 struct iwl_rx_packet *pkt = rxb_addr(rxb);
668 u8 status, ebs_status; 345 struct iwl_periodic_scan_complete *scan_notif;
669
670 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) {
671 struct iwl_periodic_scan_complete *scan_notif;
672 346
673 scan_notif = (void *)pkt->data; 347 scan_notif = (void *)pkt->data;
674 status = scan_notif->status;
675 ebs_status = scan_notif->ebs_status;
676 } else {
677 struct iwl_scan_offload_complete *scan_notif;
678 348
679 scan_notif = (void *)pkt->data;
680 status = scan_notif->status;
681 ebs_status = scan_notif->ebs_status;
682 }
683 /* scan status must be locked for proper checking */ 349 /* scan status must be locked for proper checking */
684 lockdep_assert_held(&mvm->mutex); 350 lockdep_assert_held(&mvm->mutex);
685 351
@@ -687,9 +353,9 @@ int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
687 "%s completed, status %s, EBS status %s\n", 353 "%s completed, status %s, EBS status %s\n",
688 mvm->scan_status == IWL_MVM_SCAN_SCHED ? 354 mvm->scan_status == IWL_MVM_SCAN_SCHED ?
689 "Scheduled scan" : "Scan", 355 "Scheduled scan" : "Scan",
690 status == IWL_SCAN_OFFLOAD_COMPLETED ? 356 scan_notif->status == IWL_SCAN_OFFLOAD_COMPLETED ?
691 "completed" : "aborted", 357 "completed" : "aborted",
692 ebs_status == IWL_SCAN_EBS_SUCCESS ? 358 scan_notif->ebs_status == IWL_SCAN_EBS_SUCCESS ?
693 "success" : "failed"); 359 "success" : "failed");
694 360
695 361
@@ -700,64 +366,16 @@ int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
700 } else if (mvm->scan_status == IWL_MVM_SCAN_OS) { 366 } else if (mvm->scan_status == IWL_MVM_SCAN_OS) {
701 mvm->scan_status = IWL_MVM_SCAN_NONE; 367 mvm->scan_status = IWL_MVM_SCAN_NONE;
702 ieee80211_scan_completed(mvm->hw, 368 ieee80211_scan_completed(mvm->hw,
703 status == IWL_SCAN_OFFLOAD_ABORTED); 369 scan_notif->status == IWL_SCAN_OFFLOAD_ABORTED);
704 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); 370 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN);
705 } 371 }
706 372
707 if (ebs_status) 373 if (scan_notif->ebs_status)
708 mvm->last_ebs_successful = false; 374 mvm->last_ebs_successful = false;
709 375
710 return 0; 376 return 0;
711} 377}
712 378
713static void iwl_scan_offload_build_tx_cmd(struct iwl_mvm *mvm,
714 struct ieee80211_vif *vif,
715 struct ieee80211_scan_ies *ies,
716 enum ieee80211_band band,
717 struct iwl_tx_cmd *cmd,
718 u8 *data)
719{
720 u16 cmd_len;
721
722 cmd->tx_flags = cpu_to_le32(TX_CMD_FLG_SEQ_CTL);
723 cmd->life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE);
724 cmd->sta_id = mvm->aux_sta.sta_id;
725
726 cmd->rate_n_flags = iwl_mvm_scan_rate_n_flags(mvm, band, false);
727
728 cmd_len = iwl_mvm_fill_probe_req((struct ieee80211_mgmt *)data,
729 vif->addr,
730 1, NULL, 0,
731 ies->ies[band], ies->len[band],
732 ies->common_ies, ies->common_ie_len,
733 SCAN_OFFLOAD_PROBE_REQ_SIZE);
734 cmd->len = cpu_to_le16(cmd_len);
735}
736
737static void iwl_build_scan_cmd(struct iwl_mvm *mvm,
738 struct ieee80211_vif *vif,
739 struct cfg80211_sched_scan_request *req,
740 struct iwl_scan_offload_cmd *scan,
741 struct iwl_mvm_scan_params *params)
742{
743 scan->channel_count = req->n_channels;
744 scan->quiet_time = cpu_to_le16(IWL_ACTIVE_QUIET_TIME);
745 scan->quiet_plcp_th = cpu_to_le16(IWL_PLCP_QUIET_THRESH);
746 scan->good_CRC_th = IWL_GOOD_CRC_TH_DEFAULT;
747 scan->rx_chain = iwl_mvm_scan_rx_chain(mvm);
748
749 scan->max_out_time = cpu_to_le32(params->max_out_time);
750 scan->suspend_time = cpu_to_le32(params->suspend_time);
751
752 scan->filter_flags |= cpu_to_le32(MAC_FILTER_ACCEPT_GRP |
753 MAC_FILTER_IN_BEACON);
754 scan->scan_type = cpu_to_le32(SCAN_TYPE_BACKGROUND);
755 scan->rep_count = cpu_to_le32(1);
756
757 if (params->passive_fragmented)
758 scan->scan_flags |= SCAN_FLAGS_FRAGMENTED_SCAN;
759}
760
761static int iwl_ssid_exist(u8 *ssid, u8 ssid_len, struct iwl_ssid_ie *ssid_list) 379static int iwl_ssid_exist(u8 *ssid, u8 ssid_len, struct iwl_ssid_ie *ssid_list)
762{ 380{
763 int i; 381 int i;
@@ -815,127 +433,6 @@ static void iwl_scan_offload_build_ssid(struct cfg80211_sched_scan_request *req,
815 } 433 }
816} 434}
817 435
818static void iwl_build_channel_cfg(struct iwl_mvm *mvm,
819 struct cfg80211_sched_scan_request *req,
820 u8 *channels_buffer,
821 enum ieee80211_band band,
822 int *head,
823 u32 ssid_bitmap,
824 struct iwl_mvm_scan_params *params)
825{
826 u32 n_channels = mvm->fw->ucode_capa.n_scan_channels;
827 __le32 *type = (__le32 *)channels_buffer;
828 __le16 *channel_number = (__le16 *)(type + n_channels);
829 __le16 *iter_count = channel_number + n_channels;
830 __le32 *iter_interval = (__le32 *)(iter_count + n_channels);
831 u8 *active_dwell = (u8 *)(iter_interval + n_channels);
832 u8 *passive_dwell = active_dwell + n_channels;
833 int i, index = 0;
834
835 for (i = 0; i < req->n_channels; i++) {
836 struct ieee80211_channel *chan = req->channels[i];
837
838 if (chan->band != band)
839 continue;
840
841 index = *head;
842 (*head)++;
843
844 channel_number[index] = cpu_to_le16(chan->hw_value);
845 active_dwell[index] = params->dwell[band].active;
846 passive_dwell[index] = params->dwell[band].passive;
847
848 iter_count[index] = cpu_to_le16(1);
849 iter_interval[index] = 0;
850
851 if (!(chan->flags & IEEE80211_CHAN_NO_IR))
852 type[index] |=
853 cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_ACTIVE);
854
855 type[index] |= cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_FULL |
856 IWL_SCAN_OFFLOAD_CHANNEL_PARTIAL);
857
858 if (chan->flags & IEEE80211_CHAN_NO_HT40)
859 type[index] |=
860 cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_NARROW);
861
862 /* scan for all SSIDs from req->ssids */
863 type[index] |= cpu_to_le32(ssid_bitmap);
864 }
865}
866
867int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,
868 struct ieee80211_vif *vif,
869 struct cfg80211_sched_scan_request *req,
870 struct ieee80211_scan_ies *ies)
871{
872 int band_2ghz = mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels;
873 int band_5ghz = mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels;
874 int head = 0;
875 u32 ssid_bitmap;
876 int cmd_len;
877 int ret;
878 u8 *probes;
879 bool basic_ssid = !(mvm->fw->ucode_capa.flags &
880 IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID);
881
882 struct iwl_scan_offload_cfg *scan_cfg;
883 struct iwl_host_cmd cmd = {
884 .id = SCAN_OFFLOAD_CONFIG_CMD,
885 };
886 struct iwl_mvm_scan_params params = {};
887
888 lockdep_assert_held(&mvm->mutex);
889
890 cmd_len = sizeof(struct iwl_scan_offload_cfg) +
891 mvm->fw->ucode_capa.n_scan_channels * IWL_SCAN_CHAN_SIZE +
892 2 * SCAN_OFFLOAD_PROBE_REQ_SIZE;
893
894 scan_cfg = kzalloc(cmd_len, GFP_KERNEL);
895 if (!scan_cfg)
896 return -ENOMEM;
897
898 probes = scan_cfg->data +
899 mvm->fw->ucode_capa.n_scan_channels * IWL_SCAN_CHAN_SIZE;
900
901 iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, 0, &params);
902 iwl_build_scan_cmd(mvm, vif, req, &scan_cfg->scan_cmd, &params);
903 scan_cfg->scan_cmd.len = cpu_to_le16(cmd_len);
904
905 iwl_scan_offload_build_ssid(req, scan_cfg->scan_cmd.direct_scan,
906 &ssid_bitmap, basic_ssid);
907 /* build tx frames for supported bands */
908 if (band_2ghz) {
909 iwl_scan_offload_build_tx_cmd(mvm, vif, ies,
910 IEEE80211_BAND_2GHZ,
911 &scan_cfg->scan_cmd.tx_cmd[0],
912 probes);
913 iwl_build_channel_cfg(mvm, req, scan_cfg->data,
914 IEEE80211_BAND_2GHZ, &head,
915 ssid_bitmap, &params);
916 }
917 if (band_5ghz) {
918 iwl_scan_offload_build_tx_cmd(mvm, vif, ies,
919 IEEE80211_BAND_5GHZ,
920 &scan_cfg->scan_cmd.tx_cmd[1],
921 probes +
922 SCAN_OFFLOAD_PROBE_REQ_SIZE);
923 iwl_build_channel_cfg(mvm, req, scan_cfg->data,
924 IEEE80211_BAND_5GHZ, &head,
925 ssid_bitmap, &params);
926 }
927
928 cmd.data[0] = scan_cfg;
929 cmd.len[0] = cmd_len;
930 cmd.dataflags[0] = IWL_HCMD_DFL_NOCOPY;
931
932 IWL_DEBUG_SCAN(mvm, "Sending scheduled scan config\n");
933
934 ret = iwl_mvm_send_cmd(mvm, &cmd);
935 kfree(scan_cfg);
936 return ret;
937}
938
939int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm, 436int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
940 struct cfg80211_sched_scan_request *req) 437 struct cfg80211_sched_scan_request *req)
941{ 438{
@@ -1018,33 +515,6 @@ static bool iwl_mvm_scan_pass_all(struct iwl_mvm *mvm,
1018 return true; 515 return true;
1019} 516}
1020 517
1021int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
1022 struct cfg80211_sched_scan_request *req)
1023{
1024 struct iwl_scan_offload_req scan_req = {
1025 .watchdog = IWL_SCHED_SCAN_WATCHDOG,
1026
1027 .schedule_line[0].iterations = IWL_FAST_SCHED_SCAN_ITERATIONS,
1028 .schedule_line[0].delay = cpu_to_le16(req->interval / 1000),
1029 .schedule_line[0].full_scan_mul = 1,
1030
1031 .schedule_line[1].iterations = 0xff,
1032 .schedule_line[1].delay = cpu_to_le16(req->interval / 1000),
1033 .schedule_line[1].full_scan_mul = IWL_FULL_SCAN_MULTIPLIER,
1034 };
1035
1036 if (iwl_mvm_scan_pass_all(mvm, req))
1037 scan_req.flags |= cpu_to_le16(IWL_SCAN_OFFLOAD_FLAG_PASS_ALL);
1038
1039 if (mvm->last_ebs_successful &&
1040 mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_EBS_SUPPORT)
1041 scan_req.flags |=
1042 cpu_to_le16(IWL_SCAN_OFFLOAD_FLAG_EBS_ACCURATE_MODE);
1043
1044 return iwl_mvm_send_cmd_pdu(mvm, SCAN_OFFLOAD_REQUEST_CMD, 0,
1045 sizeof(scan_req), &scan_req);
1046}
1047
1048int iwl_mvm_scan_offload_start(struct iwl_mvm *mvm, 518int iwl_mvm_scan_offload_start(struct iwl_mvm *mvm,
1049 struct ieee80211_vif *vif, 519 struct ieee80211_vif *vif,
1050 struct cfg80211_sched_scan_request *req, 520 struct cfg80211_sched_scan_request *req,
@@ -1057,21 +527,12 @@ int iwl_mvm_scan_offload_start(struct iwl_mvm *mvm,
1057 if (ret) 527 if (ret)
1058 return ret; 528 return ret;
1059 ret = iwl_mvm_sched_scan_umac(mvm, vif, req, ies); 529 ret = iwl_mvm_sched_scan_umac(mvm, vif, req, ies);
1060 } else if ((mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN)) {
1061 mvm->scan_status = IWL_MVM_SCAN_SCHED;
1062 ret = iwl_mvm_config_sched_scan_profiles(mvm, req);
1063 if (ret)
1064 return ret;
1065 ret = iwl_mvm_unified_sched_scan_lmac(mvm, vif, req, ies);
1066 } else { 530 } else {
1067 mvm->scan_status = IWL_MVM_SCAN_SCHED; 531 mvm->scan_status = IWL_MVM_SCAN_SCHED;
1068 ret = iwl_mvm_config_sched_scan(mvm, vif, req, ies);
1069 if (ret)
1070 return ret;
1071 ret = iwl_mvm_config_sched_scan_profiles(mvm, req); 532 ret = iwl_mvm_config_sched_scan_profiles(mvm, req);
1072 if (ret) 533 if (ret)
1073 return ret; 534 return ret;
1074 ret = iwl_mvm_sched_scan_start(mvm, req); 535 ret = iwl_mvm_unified_sched_scan_lmac(mvm, vif, req, ies);
1075 } 536 }
1076 537
1077 return ret; 538 return ret;
@@ -1088,9 +549,7 @@ static int iwl_mvm_send_scan_offload_abort(struct iwl_mvm *mvm)
1088 /* Exit instantly with error when device is not ready 549 /* Exit instantly with error when device is not ready
1089 * to receive scan abort command or it does not perform 550 * to receive scan abort command or it does not perform
1090 * scheduled scan currently */ 551 * scheduled scan currently */
1091 if (mvm->scan_status != IWL_MVM_SCAN_SCHED && 552 if (mvm->scan_status == IWL_MVM_SCAN_NONE)
1092 (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) ||
1093 mvm->scan_status != IWL_MVM_SCAN_OS))
1094 return -EIO; 553 return -EIO;
1095 554
1096 ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status); 555 ret = iwl_mvm_send_cmd_status(mvm, &cmd, &status);
@@ -1133,13 +592,6 @@ int iwl_mvm_scan_offload_stop(struct iwl_mvm *mvm, bool notify)
1133 goto out; 592 goto out;
1134 } 593 }
1135 594
1136 if (mvm->scan_status != IWL_MVM_SCAN_SCHED &&
1137 (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) ||
1138 mvm->scan_status != IWL_MVM_SCAN_OS)) {
1139 IWL_DEBUG_SCAN(mvm, "No scan to stop\n");
1140 return 0;
1141 }
1142
1143 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done, 595 iwl_init_notification_wait(&mvm->notif_wait, &wait_scan_done,
1144 scan_done_notif, 596 scan_done_notif,
1145 ARRAY_SIZE(scan_done_notif), 597 ARRAY_SIZE(scan_done_notif),
@@ -1316,7 +768,7 @@ iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm,
1316 cmd->passive_dwell = params->dwell[IEEE80211_BAND_2GHZ].passive; 768 cmd->passive_dwell = params->dwell[IEEE80211_BAND_2GHZ].passive;
1317 if (params->passive_fragmented) 769 if (params->passive_fragmented)
1318 cmd->fragmented_dwell = 770 cmd->fragmented_dwell =
1319 params->dwell[IEEE80211_BAND_2GHZ].passive; 771 params->dwell[IEEE80211_BAND_2GHZ].fragmented;
1320 cmd->rx_chain_select = iwl_mvm_scan_rx_chain(mvm); 772 cmd->rx_chain_select = iwl_mvm_scan_rx_chain(mvm);
1321 cmd->max_out_time = cpu_to_le32(params->max_out_time); 773 cmd->max_out_time = cpu_to_le32(params->max_out_time);
1322 cmd->suspend_time = cpu_to_le32(params->suspend_time); 774 cmd->suspend_time = cpu_to_le32(params->suspend_time);
@@ -1483,6 +935,8 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
1483 935
1484 cmd->n_channels = (u8)req->n_channels; 936 cmd->n_channels = (u8)req->n_channels;
1485 937
938 cmd->delay = cpu_to_le32(req->delay);
939
1486 if (iwl_mvm_scan_pass_all(mvm, req)) 940 if (iwl_mvm_scan_pass_all(mvm, req))
1487 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL; 941 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL;
1488 else 942 else
@@ -1579,9 +1033,7 @@ int iwl_mvm_cancel_scan(struct iwl_mvm *mvm)
1579 return 0; 1033 return 0;
1580 } 1034 }
1581 1035
1582 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) 1036 return iwl_mvm_scan_offload_stop(mvm, true);
1583 return iwl_mvm_scan_offload_stop(mvm, true);
1584 return iwl_mvm_cancel_regular_scan(mvm);
1585} 1037}
1586 1038
1587/* UMAC scan API */ 1039/* UMAC scan API */
@@ -1727,6 +1179,18 @@ static bool iwl_mvm_find_scan_type(struct iwl_mvm *mvm,
1727 return false; 1179 return false;
1728} 1180}
1729 1181
1182static int iwl_mvm_find_first_scan(struct iwl_mvm *mvm,
1183 enum iwl_umac_scan_uid_type type)
1184{
1185 int i;
1186
1187 for (i = 0; i < IWL_MVM_MAX_SIMULTANEOUS_SCANS; i++)
1188 if (mvm->scan_uid[i] & type)
1189 return i;
1190
1191 return i;
1192}
1193
1730static u32 iwl_generate_scan_uid(struct iwl_mvm *mvm, 1194static u32 iwl_generate_scan_uid(struct iwl_mvm *mvm,
1731 enum iwl_umac_scan_uid_type type) 1195 enum iwl_umac_scan_uid_type type)
1732{ 1196{
@@ -1764,7 +1228,7 @@ iwl_mvm_build_generic_umac_scan_cmd(struct iwl_mvm *mvm,
1764 cmd->passive_dwell = params->dwell[IEEE80211_BAND_2GHZ].passive; 1228 cmd->passive_dwell = params->dwell[IEEE80211_BAND_2GHZ].passive;
1765 if (params->passive_fragmented) 1229 if (params->passive_fragmented)
1766 cmd->fragmented_dwell = 1230 cmd->fragmented_dwell =
1767 params->dwell[IEEE80211_BAND_2GHZ].passive; 1231 params->dwell[IEEE80211_BAND_2GHZ].fragmented;
1768 cmd->max_out_time = cpu_to_le32(params->max_out_time); 1232 cmd->max_out_time = cpu_to_le32(params->max_out_time);
1769 cmd->suspend_time = cpu_to_le32(params->suspend_time); 1233 cmd->suspend_time = cpu_to_le32(params->suspend_time);
1770 cmd->scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH); 1234 cmd->scan_priority = cpu_to_le32(IWL_SCAN_PRIORITY_HIGH);
@@ -1986,7 +1450,13 @@ int iwl_mvm_sched_scan_umac(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1986 cpu_to_le16(req->interval / MSEC_PER_SEC); 1450 cpu_to_le16(req->interval / MSEC_PER_SEC);
1987 sec_part->schedule[0].iter_count = 0xff; 1451 sec_part->schedule[0].iter_count = 0xff;
1988 1452
1989 sec_part->delay = 0; 1453 if (req->delay > U16_MAX) {
1454 IWL_DEBUG_SCAN(mvm,
1455 "delay value is > 16-bits, set to max possible\n");
1456 sec_part->delay = cpu_to_le16(U16_MAX);
1457 } else {
1458 sec_part->delay = cpu_to_le16(req->delay);
1459 }
1990 1460
1991 iwl_mvm_build_unified_scan_probe(mvm, vif, ies, &sec_part->preq, 1461 iwl_mvm_build_unified_scan_probe(mvm, vif, ies, &sec_part->preq,
1992 req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR ? 1462 req->flags & NL80211_SCAN_FLAG_RANDOM_ADDR ?
@@ -2158,14 +1628,59 @@ int iwl_mvm_scan_size(struct iwl_mvm *mvm)
2158 mvm->fw->ucode_capa.n_scan_channels + 1628 mvm->fw->ucode_capa.n_scan_channels +
2159 sizeof(struct iwl_scan_req_umac_tail); 1629 sizeof(struct iwl_scan_req_umac_tail);
2160 1630
2161 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) 1631 return sizeof(struct iwl_scan_req_unified_lmac) +
2162 return sizeof(struct iwl_scan_req_unified_lmac) + 1632 sizeof(struct iwl_scan_channel_cfg_lmac) *
2163 sizeof(struct iwl_scan_channel_cfg_lmac) * 1633 mvm->fw->ucode_capa.n_scan_channels +
2164 mvm->fw->ucode_capa.n_scan_channels + 1634 sizeof(struct iwl_scan_probe_req);
2165 sizeof(struct iwl_scan_probe_req); 1635}
1636
1637/*
1638 * This function is used in nic restart flow, to inform mac80211 about scans
1639 * that was aborted by restart flow or by an assert.
1640 */
1641void iwl_mvm_report_scan_aborted(struct iwl_mvm *mvm)
1642{
1643 if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) {
1644 u32 uid, i;
2166 1645
2167 return sizeof(struct iwl_scan_cmd) + 1646 uid = iwl_mvm_find_first_scan(mvm, IWL_UMAC_SCAN_UID_REG_SCAN);
2168 mvm->fw->ucode_capa.max_probe_length + 1647 if (uid < IWL_MVM_MAX_SIMULTANEOUS_SCANS) {
2169 mvm->fw->ucode_capa.n_scan_channels * 1648 ieee80211_scan_completed(mvm->hw, true);
2170 sizeof(struct iwl_scan_channel); 1649 mvm->scan_uid[uid] = 0;
1650 }
1651 uid = iwl_mvm_find_first_scan(mvm,
1652 IWL_UMAC_SCAN_UID_SCHED_SCAN);
1653 if (uid < IWL_MVM_MAX_SIMULTANEOUS_SCANS && !mvm->restart_fw) {
1654 ieee80211_sched_scan_stopped(mvm->hw);
1655 mvm->scan_uid[uid] = 0;
1656 }
1657
1658 /* We shouldn't have any UIDs still set. Loop over all the
1659 * UIDs to make sure there's nothing left there and warn if
1660 * any is found.
1661 */
1662 for (i = 0; i < IWL_MVM_MAX_SIMULTANEOUS_SCANS; i++) {
1663 if (WARN_ONCE(mvm->scan_uid[i],
1664 "UMAC scan UID %d was not cleaned\n",
1665 mvm->scan_uid[i]))
1666 mvm->scan_uid[i] = 0;
1667 }
1668 } else {
1669 switch (mvm->scan_status) {
1670 case IWL_MVM_SCAN_NONE:
1671 break;
1672 case IWL_MVM_SCAN_OS:
1673 ieee80211_scan_completed(mvm->hw, true);
1674 break;
1675 case IWL_MVM_SCAN_SCHED:
1676 /*
1677 * Sched scan will be restarted by mac80211 in
1678 * restart_hw, so do not report if FW is about to be
1679 * restarted.
1680 */
1681 if (!mvm->restart_fw)
1682 ieee80211_sched_scan_stopped(mvm->hw);
1683 break;
1684 }
1685 }
2171} 1686}
diff --git a/drivers/net/wireless/iwlwifi/mvm/sf.c b/drivers/net/wireless/iwlwifi/mvm/sf.c
index 7eb78e2c240a..b0f59fdd287c 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sf.c
+++ b/drivers/net/wireless/iwlwifi/mvm/sf.c
@@ -99,7 +99,35 @@ static void iwl_mvm_bound_iface_iterator(void *_data, u8 *mac,
99 99
100/* 100/*
101 * Aging and idle timeouts for the different possible scenarios 101 * Aging and idle timeouts for the different possible scenarios
102 * in SF_FULL_ON state. 102 * in default configuration
103 */
104static const
105__le32 sf_full_timeout_def[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES] = {
106 {
107 cpu_to_le32(SF_SINGLE_UNICAST_AGING_TIMER_DEF),
108 cpu_to_le32(SF_SINGLE_UNICAST_IDLE_TIMER_DEF)
109 },
110 {
111 cpu_to_le32(SF_AGG_UNICAST_AGING_TIMER_DEF),
112 cpu_to_le32(SF_AGG_UNICAST_IDLE_TIMER_DEF)
113 },
114 {
115 cpu_to_le32(SF_MCAST_AGING_TIMER_DEF),
116 cpu_to_le32(SF_MCAST_IDLE_TIMER_DEF)
117 },
118 {
119 cpu_to_le32(SF_BA_AGING_TIMER_DEF),
120 cpu_to_le32(SF_BA_IDLE_TIMER_DEF)
121 },
122 {
123 cpu_to_le32(SF_TX_RE_AGING_TIMER_DEF),
124 cpu_to_le32(SF_TX_RE_IDLE_TIMER_DEF)
125 },
126};
127
128/*
129 * Aging and idle timeouts for the different possible scenarios
130 * in single BSS MAC configuration.
103 */ 131 */
104static const __le32 sf_full_timeout[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES] = { 132static const __le32 sf_full_timeout[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES] = {
105 { 133 {
@@ -124,7 +152,8 @@ static const __le32 sf_full_timeout[SF_NUM_SCENARIO][SF_NUM_TIMEOUT_TYPES] = {
124 }, 152 },
125}; 153};
126 154
127static void iwl_mvm_fill_sf_command(struct iwl_sf_cfg_cmd *sf_cmd, 155static void iwl_mvm_fill_sf_command(struct iwl_mvm *mvm,
156 struct iwl_sf_cfg_cmd *sf_cmd,
128 struct ieee80211_sta *sta) 157 struct ieee80211_sta *sta)
129{ 158{
130 int i, j, watermark; 159 int i, j, watermark;
@@ -163,24 +192,38 @@ static void iwl_mvm_fill_sf_command(struct iwl_sf_cfg_cmd *sf_cmd,
163 cpu_to_le32(SF_LONG_DELAY_AGING_TIMER); 192 cpu_to_le32(SF_LONG_DELAY_AGING_TIMER);
164 } 193 }
165 } 194 }
166 BUILD_BUG_ON(sizeof(sf_full_timeout) !=
167 sizeof(__le32) * SF_NUM_SCENARIO * SF_NUM_TIMEOUT_TYPES);
168 195
169 memcpy(sf_cmd->full_on_timeouts, sf_full_timeout, 196 if (sta || IWL_UCODE_API(mvm->fw->ucode_ver) < 13) {
170 sizeof(sf_full_timeout)); 197 BUILD_BUG_ON(sizeof(sf_full_timeout) !=
198 sizeof(__le32) * SF_NUM_SCENARIO *
199 SF_NUM_TIMEOUT_TYPES);
200
201 memcpy(sf_cmd->full_on_timeouts, sf_full_timeout,
202 sizeof(sf_full_timeout));
203 } else {
204 BUILD_BUG_ON(sizeof(sf_full_timeout_def) !=
205 sizeof(__le32) * SF_NUM_SCENARIO *
206 SF_NUM_TIMEOUT_TYPES);
207
208 memcpy(sf_cmd->full_on_timeouts, sf_full_timeout_def,
209 sizeof(sf_full_timeout_def));
210 }
211
171} 212}
172 213
173static int iwl_mvm_sf_config(struct iwl_mvm *mvm, u8 sta_id, 214static int iwl_mvm_sf_config(struct iwl_mvm *mvm, u8 sta_id,
174 enum iwl_sf_state new_state) 215 enum iwl_sf_state new_state)
175{ 216{
176 struct iwl_sf_cfg_cmd sf_cmd = { 217 struct iwl_sf_cfg_cmd sf_cmd = {
177 .state = cpu_to_le32(new_state), 218 .state = cpu_to_le32(SF_FULL_ON),
178 }; 219 };
179 struct ieee80211_sta *sta; 220 struct ieee80211_sta *sta;
180 int ret = 0; 221 int ret = 0;
181 222
182 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_SF_NO_DUMMY_NOTIF && 223 if (IWL_UCODE_API(mvm->fw->ucode_ver) < 13)
183 mvm->cfg->disable_dummy_notification) 224 sf_cmd.state = cpu_to_le32(new_state);
225
226 if (mvm->cfg->disable_dummy_notification)
184 sf_cmd.state |= cpu_to_le32(SF_CFG_DUMMY_NOTIF_OFF); 227 sf_cmd.state |= cpu_to_le32(SF_CFG_DUMMY_NOTIF_OFF);
185 228
186 /* 229 /*
@@ -192,6 +235,8 @@ static int iwl_mvm_sf_config(struct iwl_mvm *mvm, u8 sta_id,
192 235
193 switch (new_state) { 236 switch (new_state) {
194 case SF_UNINIT: 237 case SF_UNINIT:
238 if (IWL_UCODE_API(mvm->fw->ucode_ver) >= 13)
239 iwl_mvm_fill_sf_command(mvm, &sf_cmd, NULL);
195 break; 240 break;
196 case SF_FULL_ON: 241 case SF_FULL_ON:
197 if (sta_id == IWL_MVM_STATION_COUNT) { 242 if (sta_id == IWL_MVM_STATION_COUNT) {
@@ -206,11 +251,11 @@ static int iwl_mvm_sf_config(struct iwl_mvm *mvm, u8 sta_id,
206 rcu_read_unlock(); 251 rcu_read_unlock();
207 return -EINVAL; 252 return -EINVAL;
208 } 253 }
209 iwl_mvm_fill_sf_command(&sf_cmd, sta); 254 iwl_mvm_fill_sf_command(mvm, &sf_cmd, sta);
210 rcu_read_unlock(); 255 rcu_read_unlock();
211 break; 256 break;
212 case SF_INIT_OFF: 257 case SF_INIT_OFF:
213 iwl_mvm_fill_sf_command(&sf_cmd, NULL); 258 iwl_mvm_fill_sf_command(mvm, &sf_cmd, NULL);
214 break; 259 break;
215 default: 260 default:
216 WARN_ONCE(1, "Invalid state: %d. not sending Smart Fifo cmd\n", 261 WARN_ONCE(1, "Invalid state: %d. not sending Smart Fifo cmd\n",
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c
index 5c23cddaaae3..1845b79487c8 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.c
@@ -209,9 +209,8 @@ static int iwl_mvm_tdls_sta_init(struct iwl_mvm *mvm,
209{ 209{
210 unsigned long used_hw_queues; 210 unsigned long used_hw_queues;
211 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); 211 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
212 unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ? 212 unsigned int wdg_timeout =
213 mvm->cfg->base_params->wd_timeout : 213 iwl_mvm_get_wd_timeout(mvm, NULL, true, false);
214 IWL_WATCHDOG_DISABLED;
215 u32 ac; 214 u32 ac;
216 215
217 lockdep_assert_held(&mvm->mutex); 216 lockdep_assert_held(&mvm->mutex);
@@ -273,7 +272,7 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
273 else 272 else
274 sta_id = mvm_sta->sta_id; 273 sta_id = mvm_sta->sta_id;
275 274
276 if (WARN_ON_ONCE(sta_id == IWL_MVM_STATION_COUNT)) 275 if (sta_id == IWL_MVM_STATION_COUNT)
277 return -ENOSPC; 276 return -ENOSPC;
278 277
279 spin_lock_init(&mvm_sta->lock); 278 spin_lock_init(&mvm_sta->lock);
@@ -491,8 +490,18 @@ int iwl_mvm_rm_sta(struct iwl_mvm *mvm,
491 490
492 if (vif->type == NL80211_IFTYPE_STATION && 491 if (vif->type == NL80211_IFTYPE_STATION &&
493 mvmvif->ap_sta_id == mvm_sta->sta_id) { 492 mvmvif->ap_sta_id == mvm_sta->sta_id) {
493 ret = iwl_mvm_drain_sta(mvm, mvm_sta, true);
494 if (ret)
495 return ret;
494 /* flush its queues here since we are freeing mvm_sta */ 496 /* flush its queues here since we are freeing mvm_sta */
495 ret = iwl_mvm_flush_tx_path(mvm, mvm_sta->tfd_queue_msk, true); 497 ret = iwl_mvm_flush_tx_path(mvm, mvm_sta->tfd_queue_msk, true);
498 if (ret)
499 return ret;
500 ret = iwl_trans_wait_tx_queue_empty(mvm->trans,
501 mvm_sta->tfd_queue_msk);
502 if (ret)
503 return ret;
504 ret = iwl_mvm_drain_sta(mvm, mvm_sta, false);
496 505
497 /* if we are associated - we can't remove the AP STA now */ 506 /* if we are associated - we can't remove the AP STA now */
498 if (vif->bss_conf.assoc) 507 if (vif->bss_conf.assoc)
@@ -971,9 +980,8 @@ int iwl_mvm_sta_tx_agg_oper(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
971{ 980{
972 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); 981 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
973 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid]; 982 struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
974 unsigned int wdg_timeout = iwlmvm_mod_params.tfd_q_hang_detect ? 983 unsigned int wdg_timeout =
975 mvm->cfg->base_params->wd_timeout : 984 iwl_mvm_get_wd_timeout(mvm, vif, sta->tdls, false);
976 IWL_WATCHDOG_DISABLED;
977 int queue, fifo, ret; 985 int queue, fifo, ret;
978 u16 ssn; 986 u16 ssn;
979 987
@@ -1120,8 +1128,12 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1120 spin_unlock_bh(&mvmsta->lock); 1128 spin_unlock_bh(&mvmsta->lock);
1121 1129
1122 if (old_state >= IWL_AGG_ON) { 1130 if (old_state >= IWL_AGG_ON) {
1131 iwl_mvm_drain_sta(mvm, mvmsta, true);
1123 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true)) 1132 if (iwl_mvm_flush_tx_path(mvm, BIT(txq_id), true))
1124 IWL_ERR(mvm, "Couldn't flush the AGG queue\n"); 1133 IWL_ERR(mvm, "Couldn't flush the AGG queue\n");
1134 iwl_trans_wait_tx_queue_empty(mvm->trans,
1135 mvmsta->tfd_queue_msk);
1136 iwl_mvm_drain_sta(mvm, mvmsta, false);
1125 1137
1126 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false); 1138 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false);
1127 1139
@@ -1681,9 +1693,6 @@ void iwl_mvm_sta_modify_disable_tx(struct iwl_mvm *mvm,
1681 }; 1693 };
1682 int ret; 1694 int ret;
1683 1695
1684 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_DISABLE_STA_TX))
1685 return;
1686
1687 ret = iwl_mvm_send_cmd_pdu(mvm, ADD_STA, CMD_ASYNC, sizeof(cmd), &cmd); 1696 ret = iwl_mvm_send_cmd_pdu(mvm, ADD_STA, CMD_ASYNC, sizeof(cmd), &cmd);
1688 if (ret) 1697 if (ret)
1689 IWL_ERR(mvm, "Failed to send ADD_STA command (%d)\n", ret); 1698 IWL_ERR(mvm, "Failed to send ADD_STA command (%d)\n", ret);
@@ -1705,8 +1714,8 @@ void iwl_mvm_sta_modify_disable_tx_ap(struct iwl_mvm *mvm,
1705 mvm_sta->disable_tx = disable; 1714 mvm_sta->disable_tx = disable;
1706 1715
1707 /* 1716 /*
1708 * Tell mac80211 to start/stop queueing tx for this station, 1717 * Tell mac80211 to start/stop queuing tx for this station,
1709 * but don't stop queueing if there are still pending frames 1718 * but don't stop queuing if there are still pending frames
1710 * for this station. 1719 * for this station.
1711 */ 1720 */
1712 if (disable || !atomic_read(&mvm->pending_frames[mvm_sta->sta_id])) 1721 if (disable || !atomic_read(&mvm->pending_frames[mvm_sta->sta_id]))
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.h b/drivers/net/wireless/iwlwifi/mvm/sta.h
index d8f48975ad08..748f5dc3f9f4 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sta.h
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.h
@@ -150,7 +150,7 @@ struct iwl_mvm_vif;
150 * DOC: station table - AP Station in STA mode 150 * DOC: station table - AP Station in STA mode
151 * 151 *
152 * %iwl_mvm_vif includes the index of the AP station in the fw's STA table: 152 * %iwl_mvm_vif includes the index of the AP station in the fw's STA table:
153 * %ap_sta_id. To get the point to the coresponsding %ieee80211_sta, 153 * %ap_sta_id. To get the point to the corresponding %ieee80211_sta,
154 * &fw_id_to_mac_id can be used. Due to the way the fw works, we must not remove 154 * &fw_id_to_mac_id can be used. Due to the way the fw works, we must not remove
155 * the AP station from the fw before setting the MAC context as unassociated. 155 * the AP station from the fw before setting the MAC context as unassociated.
156 * Hence, %fw_id_to_mac_id[%ap_sta_id] will be NULLed when the AP station is 156 * Hence, %fw_id_to_mac_id[%ap_sta_id] will be NULLed when the AP station is
@@ -209,14 +209,14 @@ struct iwl_mvm_vif;
209 * When a trigger frame is received, mac80211 tells the driver to send frames 209 * When a trigger frame is received, mac80211 tells the driver to send frames
210 * from the AMPDU queues or sends frames to non-aggregation queues itself, 210 * from the AMPDU queues or sends frames to non-aggregation queues itself,
211 * depending on which ACs are delivery-enabled and what TID has frames to 211 * depending on which ACs are delivery-enabled and what TID has frames to
212 * transmit. Note that mac80211 has all the knowledege since all the non-agg 212 * transmit. Note that mac80211 has all the knowledge since all the non-agg
213 * frames are buffered / filtered, and the driver tells mac80211 about agg 213 * frames are buffered / filtered, and the driver tells mac80211 about agg
214 * frames). The driver needs to tell the fw to let frames out even if the 214 * frames). The driver needs to tell the fw to let frames out even if the
215 * station is asleep. This is done by %iwl_mvm_sta_modify_sleep_tx_count. 215 * station is asleep. This is done by %iwl_mvm_sta_modify_sleep_tx_count.
216 * 216 *
217 * When we receive a frame from that station with PM bit unset, the driver 217 * When we receive a frame from that station with PM bit unset, the driver
218 * needs to let the fw know that this station isn't asleep any more. This is 218 * needs to let the fw know that this station isn't asleep any more. This is
219 * done by %iwl_mvm_sta_modify_ps_wake in response to mac80211 signalling the 219 * done by %iwl_mvm_sta_modify_ps_wake in response to mac80211 signaling the
220 * station's wakeup. 220 * station's wakeup.
221 * 221 *
222 * For a GO, the Service Period might be cut short due to an absence period 222 * For a GO, the Service Period might be cut short due to an absence period
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c
index 4b81c0bf63b0..fd7b0d36f9a6 100644
--- a/drivers/net/wireless/iwlwifi/mvm/time-event.c
+++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c
@@ -119,7 +119,7 @@ void iwl_mvm_roc_done_wk(struct work_struct *wk)
119 119
120 /* 120 /*
121 * Flush the offchannel queue -- this is called when the time 121 * Flush the offchannel queue -- this is called when the time
122 * event finishes or is cancelled, so that frames queued for it 122 * event finishes or is canceled, so that frames queued for it
123 * won't get stuck on the queue and be transmitted in the next 123 * won't get stuck on the queue and be transmitted in the next
124 * time event. 124 * time event.
125 * We have to send the command asynchronously since this cannot 125 * We have to send the command asynchronously since this cannot
@@ -187,7 +187,8 @@ static bool iwl_mvm_te_check_disconnect(struct iwl_mvm *mvm,
187 return false; 187 return false;
188 if (errmsg) 188 if (errmsg)
189 IWL_ERR(mvm, "%s\n", errmsg); 189 IWL_ERR(mvm, "%s\n", errmsg);
190 ieee80211_connection_loss(vif); 190
191 iwl_mvm_connection_loss(mvm, vif, errmsg);
191 return true; 192 return true;
192} 193}
193 194
@@ -196,19 +197,24 @@ iwl_mvm_te_handle_notify_csa(struct iwl_mvm *mvm,
196 struct iwl_mvm_time_event_data *te_data, 197 struct iwl_mvm_time_event_data *te_data,
197 struct iwl_time_event_notif *notif) 198 struct iwl_time_event_notif *notif)
198{ 199{
199 if (!le32_to_cpu(notif->status)) { 200 struct ieee80211_vif *vif = te_data->vif;
200 if (te_data->vif->type == NL80211_IFTYPE_STATION) 201 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
201 ieee80211_connection_loss(te_data->vif); 202
203 if (!notif->status)
202 IWL_DEBUG_TE(mvm, "CSA time event failed to start\n"); 204 IWL_DEBUG_TE(mvm, "CSA time event failed to start\n");
203 iwl_mvm_te_clear_data(mvm, te_data);
204 return;
205 }
206 205
207 switch (te_data->vif->type) { 206 switch (te_data->vif->type) {
208 case NL80211_IFTYPE_AP: 207 case NL80211_IFTYPE_AP:
208 if (!notif->status)
209 mvmvif->csa_failed = true;
209 iwl_mvm_csa_noa_start(mvm); 210 iwl_mvm_csa_noa_start(mvm);
210 break; 211 break;
211 case NL80211_IFTYPE_STATION: 212 case NL80211_IFTYPE_STATION:
213 if (!notif->status) {
214 iwl_mvm_connection_loss(mvm, vif,
215 "CSA TE failed to start");
216 break;
217 }
212 iwl_mvm_csa_client_absent(mvm, te_data->vif); 218 iwl_mvm_csa_client_absent(mvm, te_data->vif);
213 ieee80211_chswitch_done(te_data->vif, true); 219 ieee80211_chswitch_done(te_data->vif, true);
214 break; 220 break;
@@ -222,6 +228,44 @@ iwl_mvm_te_handle_notify_csa(struct iwl_mvm *mvm,
222 iwl_mvm_te_clear_data(mvm, te_data); 228 iwl_mvm_te_clear_data(mvm, te_data);
223} 229}
224 230
231static void iwl_mvm_te_check_trigger(struct iwl_mvm *mvm,
232 struct iwl_time_event_notif *notif,
233 struct iwl_mvm_time_event_data *te_data)
234{
235 struct iwl_fw_dbg_trigger_tlv *trig;
236 struct iwl_fw_dbg_trigger_time_event *te_trig;
237 int i;
238
239 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_TIME_EVENT))
240 return;
241
242 trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_TIME_EVENT);
243 te_trig = (void *)trig->data;
244
245 if (!iwl_fw_dbg_trigger_check_stop(mvm, te_data->vif, trig))
246 return;
247
248 for (i = 0; i < ARRAY_SIZE(te_trig->time_events); i++) {
249 u32 trig_te_id = le32_to_cpu(te_trig->time_events[i].id);
250 u32 trig_action_bitmap =
251 le32_to_cpu(te_trig->time_events[i].action_bitmap);
252 u32 trig_status_bitmap =
253 le32_to_cpu(te_trig->time_events[i].status_bitmap);
254
255 if (trig_te_id != te_data->id ||
256 !(trig_action_bitmap & le32_to_cpu(notif->action)) ||
257 !(trig_status_bitmap & BIT(le32_to_cpu(notif->status))))
258 continue;
259
260 iwl_mvm_fw_dbg_collect_trig(mvm, trig,
261 "Time event %d Action 0x%x received status: %d",
262 te_data->id,
263 le32_to_cpu(notif->action),
264 le32_to_cpu(notif->status));
265 break;
266 }
267}
268
225/* 269/*
226 * Handles a FW notification for an event that is known to the driver. 270 * Handles a FW notification for an event that is known to the driver.
227 * 271 *
@@ -239,6 +283,8 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
239 le32_to_cpu(notif->unique_id), 283 le32_to_cpu(notif->unique_id),
240 le32_to_cpu(notif->action)); 284 le32_to_cpu(notif->action));
241 285
286 iwl_mvm_te_check_trigger(mvm, notif, te_data);
287
242 /* 288 /*
243 * The FW sends the start/end time event notifications even for events 289 * The FW sends the start/end time event notifications even for events
244 * that it fails to schedule. This is indicated in the status field of 290 * that it fails to schedule. This is indicated in the status field of
@@ -248,11 +294,16 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
248 * events in the system). 294 * events in the system).
249 */ 295 */
250 if (!le32_to_cpu(notif->status)) { 296 if (!le32_to_cpu(notif->status)) {
251 bool start = le32_to_cpu(notif->action) & 297 const char *msg;
252 TE_V2_NOTIF_HOST_EVENT_START; 298
253 IWL_WARN(mvm, "Time Event %s notification failure\n", 299 if (notif->action & cpu_to_le32(TE_V2_NOTIF_HOST_EVENT_START))
254 start ? "start" : "end"); 300 msg = "Time Event start notification failure";
255 if (iwl_mvm_te_check_disconnect(mvm, te_data->vif, NULL)) { 301 else
302 msg = "Time Event end notification failure";
303
304 IWL_DEBUG_TE(mvm, "%s\n", msg);
305
306 if (iwl_mvm_te_check_disconnect(mvm, te_data->vif, msg)) {
256 iwl_mvm_te_clear_data(mvm, te_data); 307 iwl_mvm_te_clear_data(mvm, te_data);
257 return; 308 return;
258 } 309 }
@@ -263,17 +314,23 @@ static void iwl_mvm_te_handle_notif(struct iwl_mvm *mvm,
263 "TE ended - current time %lu, estimated end %lu\n", 314 "TE ended - current time %lu, estimated end %lu\n",
264 jiffies, te_data->end_jiffies); 315 jiffies, te_data->end_jiffies);
265 316
266 if (te_data->vif->type == NL80211_IFTYPE_P2P_DEVICE) { 317 switch (te_data->vif->type) {
318 case NL80211_IFTYPE_P2P_DEVICE:
267 ieee80211_remain_on_channel_expired(mvm->hw); 319 ieee80211_remain_on_channel_expired(mvm->hw);
268 iwl_mvm_roc_finished(mvm); 320 iwl_mvm_roc_finished(mvm);
321 break;
322 case NL80211_IFTYPE_STATION:
323 /*
324 * By now, we should have finished association
325 * and know the dtim period.
326 */
327 iwl_mvm_te_check_disconnect(mvm, te_data->vif,
328 "No association and the time event is over already...");
329 break;
330 default:
331 break;
269 } 332 }
270 333
271 /*
272 * By now, we should have finished association
273 * and know the dtim period.
274 */
275 iwl_mvm_te_check_disconnect(mvm, te_data->vif,
276 "No association and the time event is over already...");
277 iwl_mvm_te_clear_data(mvm, te_data); 334 iwl_mvm_te_clear_data(mvm, te_data);
278 } else if (le32_to_cpu(notif->action) & TE_V2_NOTIF_HOST_EVENT_START) { 335 } else if (le32_to_cpu(notif->action) & TE_V2_NOTIF_HOST_EVENT_START) {
279 te_data->running = true; 336 te_data->running = true;
@@ -309,6 +366,8 @@ static int iwl_mvm_aux_roc_te_handle_notif(struct iwl_mvm *mvm,
309 if (!aux_roc_te) /* Not a Aux ROC time event */ 366 if (!aux_roc_te) /* Not a Aux ROC time event */
310 return -EINVAL; 367 return -EINVAL;
311 368
369 iwl_mvm_te_check_trigger(mvm, notif, te_data);
370
312 if (!le32_to_cpu(notif->status)) { 371 if (!le32_to_cpu(notif->status)) {
313 IWL_DEBUG_TE(mvm, 372 IWL_DEBUG_TE(mvm,
314 "ERROR: Aux ROC Time Event %s notification failure\n", 373 "ERROR: Aux ROC Time Event %s notification failure\n",
@@ -763,7 +822,7 @@ void iwl_mvm_stop_roc(struct iwl_mvm *mvm)
763 * Iterate over the list of aux roc time events and find the time 822 * Iterate over the list of aux roc time events and find the time
764 * event that is associated with a BSS interface. 823 * event that is associated with a BSS interface.
765 * This assumes that a BSS interface can have only a single time 824 * This assumes that a BSS interface can have only a single time
766 * event at any given time and this time event coresponds to a ROC 825 * event at any given time and this time event corresponds to a ROC
767 * request 826 * request
768 */ 827 */
769 list_for_each_entry(te_data, &mvm->aux_roc_te_list, list) { 828 list_for_each_entry(te_data, &mvm->aux_roc_te_list, list) {
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.h b/drivers/net/wireless/iwlwifi/mvm/time-event.h
index 6f6b35db3ab8..de4fbc6d57f1 100644
--- a/drivers/net/wireless/iwlwifi/mvm/time-event.h
+++ b/drivers/net/wireless/iwlwifi/mvm/time-event.h
@@ -147,7 +147,7 @@ void iwl_mvm_protect_session(struct iwl_mvm *mvm,
147 * @vif: the virtual interface for which the session is issued 147 * @vif: the virtual interface for which the session is issued
148 * 148 *
149 * This functions cancels the session protection which is an act of good 149 * This functions cancels the session protection which is an act of good
150 * citizenship. If it is not needed any more it should be cancelled because 150 * citizenship. If it is not needed any more it should be canceled because
151 * the other bindings wait for the medium during that time. 151 * the other bindings wait for the medium during that time.
152 * This funtions doesn't sleep. 152 * This funtions doesn't sleep.
153 */ 153 */
@@ -162,7 +162,7 @@ int iwl_mvm_rx_time_event_notif(struct iwl_mvm *mvm,
162 struct iwl_device_cmd *cmd); 162 struct iwl_device_cmd *cmd);
163 163
164/** 164/**
165 * iwl_mvm_start_p2p_roc - start remain on channel for p2p device functionlity 165 * iwl_mvm_start_p2p_roc - start remain on channel for p2p device functionality
166 * @mvm: the mvm component 166 * @mvm: the mvm component
167 * @vif: the virtual interface for which the roc is requested. It is assumed 167 * @vif: the virtual interface for which the roc is requested. It is assumed
168 * that the vif type is NL80211_IFTYPE_P2P_DEVICE 168 * that the vif type is NL80211_IFTYPE_P2P_DEVICE
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c
index 96a05406babf..ef32e177f662 100644
--- a/drivers/net/wireless/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
@@ -664,6 +664,8 @@ static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
664 info->status.rates[0].count = tx_resp->failure_frame + 1; 664 info->status.rates[0].count = tx_resp->failure_frame + 1;
665 iwl_mvm_hwrate_to_tx_status(le32_to_cpu(tx_resp->initial_rate), 665 iwl_mvm_hwrate_to_tx_status(le32_to_cpu(tx_resp->initial_rate),
666 info); 666 info);
667 info->status.status_driver_data[1] =
668 (void *)(uintptr_t)le32_to_cpu(tx_resp->initial_rate);
667 669
668 /* Single frame failure in an AMPDU queue => send BAR */ 670 /* Single frame failure in an AMPDU queue => send BAR */
669 if (txq_id >= mvm->first_agg_queue && 671 if (txq_id >= mvm->first_agg_queue &&
@@ -909,6 +911,8 @@ static void iwl_mvm_tx_info_from_ba_notif(struct ieee80211_tx_info *info,
909 info->status.tx_time = tid_data->tx_time; 911 info->status.tx_time = tid_data->tx_time;
910 info->status.status_driver_data[0] = 912 info->status.status_driver_data[0] =
911 (void *)(uintptr_t)tid_data->reduced_tpc; 913 (void *)(uintptr_t)tid_data->reduced_tpc;
914 info->status.status_driver_data[1] =
915 (void *)(uintptr_t)tid_data->rate_n_flags;
912} 916}
913 917
914int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, 918int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
@@ -1045,6 +1049,14 @@ out:
1045 return 0; 1049 return 0;
1046} 1050}
1047 1051
1052/*
1053 * Note that there are transports that buffer frames before they reach
1054 * the firmware. This means that after flush_tx_path is called, the
1055 * queue might not be empty. The race-free way to handle this is to:
1056 * 1) set the station as draining
1057 * 2) flush the Tx path
1058 * 3) wait for the transport queues to be empty
1059 */
1048int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk, bool sync) 1060int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk, bool sync)
1049{ 1061{
1050 int ret; 1062 int ret;
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index 8decf9953229..bc55a8b82db6 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -122,7 +122,7 @@ int iwl_mvm_send_cmd_pdu(struct iwl_mvm *mvm, u8 id,
122} 122}
123 123
124/* 124/*
125 * We assume that the caller set the status to the sucess value 125 * We assume that the caller set the status to the success value
126 */ 126 */
127int iwl_mvm_send_cmd_status(struct iwl_mvm *mvm, struct iwl_host_cmd *cmd, 127int iwl_mvm_send_cmd_status(struct iwl_mvm *mvm, struct iwl_host_cmd *cmd,
128 u32 *status) 128 u32 *status)
@@ -332,7 +332,7 @@ static const char *desc_lookup(u32 num)
332 * read with u32-sized accesses, any members with a different size 332 * read with u32-sized accesses, any members with a different size
333 * need to be ordered correctly though! 333 * need to be ordered correctly though!
334 */ 334 */
335struct iwl_error_event_table { 335struct iwl_error_event_table_v1 {
336 u32 valid; /* (nonzero) valid, (0) log is empty */ 336 u32 valid; /* (nonzero) valid, (0) log is empty */
337 u32 error_id; /* type of error */ 337 u32 error_id; /* type of error */
338 u32 pc; /* program counter */ 338 u32 pc; /* program counter */
@@ -377,7 +377,55 @@ struct iwl_error_event_table {
377 u32 u_timestamp; /* indicate when the date and time of the 377 u32 u_timestamp; /* indicate when the date and time of the
378 * compilation */ 378 * compilation */
379 u32 flow_handler; /* FH read/write pointers, RX credit */ 379 u32 flow_handler; /* FH read/write pointers, RX credit */
380} __packed; 380} __packed /* LOG_ERROR_TABLE_API_S_VER_1 */;
381
382struct iwl_error_event_table {
383 u32 valid; /* (nonzero) valid, (0) log is empty */
384 u32 error_id; /* type of error */
385 u32 pc; /* program counter */
386 u32 blink1; /* branch link */
387 u32 blink2; /* branch link */
388 u32 ilink1; /* interrupt link */
389 u32 ilink2; /* interrupt link */
390 u32 data1; /* error-specific data */
391 u32 data2; /* error-specific data */
392 u32 data3; /* error-specific data */
393 u32 bcon_time; /* beacon timer */
394 u32 tsf_low; /* network timestamp function timer */
395 u32 tsf_hi; /* network timestamp function timer */
396 u32 gp1; /* GP1 timer register */
397 u32 gp2; /* GP2 timer register */
398 u32 gp3; /* GP3 timer register */
399 u32 major; /* uCode version major */
400 u32 minor; /* uCode version minor */
401 u32 hw_ver; /* HW Silicon version */
402 u32 brd_ver; /* HW board version */
403 u32 log_pc; /* log program counter */
404 u32 frame_ptr; /* frame pointer */
405 u32 stack_ptr; /* stack pointer */
406 u32 hcmd; /* last host command header */
407 u32 isr0; /* isr status register LMPM_NIC_ISR0:
408 * rxtx_flag */
409 u32 isr1; /* isr status register LMPM_NIC_ISR1:
410 * host_flag */
411 u32 isr2; /* isr status register LMPM_NIC_ISR2:
412 * enc_flag */
413 u32 isr3; /* isr status register LMPM_NIC_ISR3:
414 * time_flag */
415 u32 isr4; /* isr status register LMPM_NIC_ISR4:
416 * wico interrupt */
417 u32 isr_pref; /* isr status register LMPM_NIC_PREF_STAT */
418 u32 wait_event; /* wait event() caller address */
419 u32 l2p_control; /* L2pControlField */
420 u32 l2p_duration; /* L2pDurationField */
421 u32 l2p_mhvalid; /* L2pMhValidBits */
422 u32 l2p_addr_match; /* L2pAddrMatchStat */
423 u32 lmpm_pmg_sel; /* indicate which clocks are turned on
424 * (LMPM_PMG_SEL) */
425 u32 u_timestamp; /* indicate when the date and time of the
426 * compilation */
427 u32 flow_handler; /* FH read/write pointers, RX credit */
428} __packed /* LOG_ERROR_TABLE_API_S_VER_2 */;
381 429
382/* 430/*
383 * UMAC error struct - relevant starting from family 8000 chip. 431 * UMAC error struct - relevant starting from family 8000 chip.
@@ -396,11 +444,11 @@ struct iwl_umac_error_event_table {
396 u32 data1; /* error-specific data */ 444 u32 data1; /* error-specific data */
397 u32 data2; /* error-specific data */ 445 u32 data2; /* error-specific data */
398 u32 data3; /* error-specific data */ 446 u32 data3; /* error-specific data */
399 u32 umac_fw_ver; /* UMAC version */ 447 u32 umac_major;
400 u32 umac_fw_api_ver; /* UMAC FW API ver */ 448 u32 umac_minor;
401 u32 frame_pointer; /* core register 27*/ 449 u32 frame_pointer; /* core register 27*/
402 u32 stack_pointer; /* core register 28 */ 450 u32 stack_pointer; /* core register 28 */
403 u32 cmd_header; /* latest host cmd sent to UMAC */ 451 u32 cmd_header; /* latest host cmd sent to UMAC */
404 u32 nic_isr_pref; /* ISR status register */ 452 u32 nic_isr_pref; /* ISR status register */
405} __packed; 453} __packed;
406 454
@@ -441,18 +489,18 @@ static void iwl_mvm_dump_umac_error_log(struct iwl_mvm *mvm)
441 IWL_ERR(mvm, "0x%08X | umac data1\n", table.data1); 489 IWL_ERR(mvm, "0x%08X | umac data1\n", table.data1);
442 IWL_ERR(mvm, "0x%08X | umac data2\n", table.data2); 490 IWL_ERR(mvm, "0x%08X | umac data2\n", table.data2);
443 IWL_ERR(mvm, "0x%08X | umac data3\n", table.data3); 491 IWL_ERR(mvm, "0x%08X | umac data3\n", table.data3);
444 IWL_ERR(mvm, "0x%08X | umac version\n", table.umac_fw_ver); 492 IWL_ERR(mvm, "0x%08X | umac major\n", table.umac_major);
445 IWL_ERR(mvm, "0x%08X | umac api version\n", table.umac_fw_api_ver); 493 IWL_ERR(mvm, "0x%08X | umac minor\n", table.umac_minor);
446 IWL_ERR(mvm, "0x%08X | frame pointer\n", table.frame_pointer); 494 IWL_ERR(mvm, "0x%08X | frame pointer\n", table.frame_pointer);
447 IWL_ERR(mvm, "0x%08X | stack pointer\n", table.stack_pointer); 495 IWL_ERR(mvm, "0x%08X | stack pointer\n", table.stack_pointer);
448 IWL_ERR(mvm, "0x%08X | last host cmd\n", table.cmd_header); 496 IWL_ERR(mvm, "0x%08X | last host cmd\n", table.cmd_header);
449 IWL_ERR(mvm, "0x%08X | isr status reg\n", table.nic_isr_pref); 497 IWL_ERR(mvm, "0x%08X | isr status reg\n", table.nic_isr_pref);
450} 498}
451 499
452void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm) 500static void iwl_mvm_dump_nic_error_log_old(struct iwl_mvm *mvm)
453{ 501{
454 struct iwl_trans *trans = mvm->trans; 502 struct iwl_trans *trans = mvm->trans;
455 struct iwl_error_event_table table; 503 struct iwl_error_event_table_v1 table;
456 u32 base; 504 u32 base;
457 505
458 base = mvm->error_event_table; 506 base = mvm->error_event_table;
@@ -489,7 +537,7 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
489 table.data1, table.data2, table.data3, 537 table.data1, table.data2, table.data3,
490 table.blink1, table.blink2, table.ilink1, 538 table.blink1, table.blink2, table.ilink1,
491 table.ilink2, table.bcon_time, table.gp1, 539 table.ilink2, table.bcon_time, table.gp1,
492 table.gp2, table.gp3, table.ucode_ver, 540 table.gp2, table.gp3, table.ucode_ver, 0,
493 table.hw_ver, table.brd_ver); 541 table.hw_ver, table.brd_ver);
494 IWL_ERR(mvm, "0x%08X | %-28s\n", table.error_id, 542 IWL_ERR(mvm, "0x%08X | %-28s\n", table.error_id,
495 desc_lookup(table.error_id)); 543 desc_lookup(table.error_id));
@@ -530,6 +578,92 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
530 iwl_mvm_dump_umac_error_log(mvm); 578 iwl_mvm_dump_umac_error_log(mvm);
531} 579}
532 580
581void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
582{
583 struct iwl_trans *trans = mvm->trans;
584 struct iwl_error_event_table table;
585 u32 base;
586
587 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_NEW_VERSION)) {
588 iwl_mvm_dump_nic_error_log_old(mvm);
589 return;
590 }
591
592 base = mvm->error_event_table;
593 if (mvm->cur_ucode == IWL_UCODE_INIT) {
594 if (!base)
595 base = mvm->fw->init_errlog_ptr;
596 } else {
597 if (!base)
598 base = mvm->fw->inst_errlog_ptr;
599 }
600
601 if (base < 0x800000) {
602 IWL_ERR(mvm,
603 "Not valid error log pointer 0x%08X for %s uCode\n",
604 base,
605 (mvm->cur_ucode == IWL_UCODE_INIT)
606 ? "Init" : "RT");
607 return;
608 }
609
610 iwl_trans_read_mem_bytes(trans, base, &table, sizeof(table));
611
612 if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
613 IWL_ERR(trans, "Start IWL Error Log Dump:\n");
614 IWL_ERR(trans, "Status: 0x%08lX, count: %d\n",
615 mvm->status, table.valid);
616 }
617
618 /* Do not change this output - scripts rely on it */
619
620 IWL_ERR(mvm, "Loaded firmware version: %s\n", mvm->fw->fw_version);
621
622 trace_iwlwifi_dev_ucode_error(trans->dev, table.error_id, table.tsf_low,
623 table.data1, table.data2, table.data3,
624 table.blink1, table.blink2, table.ilink1,
625 table.ilink2, table.bcon_time, table.gp1,
626 table.gp2, table.gp3, table.major,
627 table.minor, table.hw_ver, table.brd_ver);
628 IWL_ERR(mvm, "0x%08X | %-28s\n", table.error_id,
629 desc_lookup(table.error_id));
630 IWL_ERR(mvm, "0x%08X | uPc\n", table.pc);
631 IWL_ERR(mvm, "0x%08X | branchlink1\n", table.blink1);
632 IWL_ERR(mvm, "0x%08X | branchlink2\n", table.blink2);
633 IWL_ERR(mvm, "0x%08X | interruptlink1\n", table.ilink1);
634 IWL_ERR(mvm, "0x%08X | interruptlink2\n", table.ilink2);
635 IWL_ERR(mvm, "0x%08X | data1\n", table.data1);
636 IWL_ERR(mvm, "0x%08X | data2\n", table.data2);
637 IWL_ERR(mvm, "0x%08X | data3\n", table.data3);
638 IWL_ERR(mvm, "0x%08X | beacon time\n", table.bcon_time);
639 IWL_ERR(mvm, "0x%08X | tsf low\n", table.tsf_low);
640 IWL_ERR(mvm, "0x%08X | tsf hi\n", table.tsf_hi);
641 IWL_ERR(mvm, "0x%08X | time gp1\n", table.gp1);
642 IWL_ERR(mvm, "0x%08X | time gp2\n", table.gp2);
643 IWL_ERR(mvm, "0x%08X | time gp3\n", table.gp3);
644 IWL_ERR(mvm, "0x%08X | uCode version major\n", table.major);
645 IWL_ERR(mvm, "0x%08X | uCode version minor\n", table.minor);
646 IWL_ERR(mvm, "0x%08X | hw version\n", table.hw_ver);
647 IWL_ERR(mvm, "0x%08X | board version\n", table.brd_ver);
648 IWL_ERR(mvm, "0x%08X | hcmd\n", table.hcmd);
649 IWL_ERR(mvm, "0x%08X | isr0\n", table.isr0);
650 IWL_ERR(mvm, "0x%08X | isr1\n", table.isr1);
651 IWL_ERR(mvm, "0x%08X | isr2\n", table.isr2);
652 IWL_ERR(mvm, "0x%08X | isr3\n", table.isr3);
653 IWL_ERR(mvm, "0x%08X | isr4\n", table.isr4);
654 IWL_ERR(mvm, "0x%08X | isr_pref\n", table.isr_pref);
655 IWL_ERR(mvm, "0x%08X | wait_event\n", table.wait_event);
656 IWL_ERR(mvm, "0x%08X | l2p_control\n", table.l2p_control);
657 IWL_ERR(mvm, "0x%08X | l2p_duration\n", table.l2p_duration);
658 IWL_ERR(mvm, "0x%08X | l2p_mhvalid\n", table.l2p_mhvalid);
659 IWL_ERR(mvm, "0x%08X | l2p_addr_match\n", table.l2p_addr_match);
660 IWL_ERR(mvm, "0x%08X | lmpm_pmg_sel\n", table.lmpm_pmg_sel);
661 IWL_ERR(mvm, "0x%08X | timestamp\n", table.u_timestamp);
662 IWL_ERR(mvm, "0x%08X | flow_handler\n", table.flow_handler);
663
664 if (mvm->support_umac_log)
665 iwl_mvm_dump_umac_error_log(mvm);
666}
533void iwl_mvm_enable_txq(struct iwl_mvm *mvm, int queue, u16 ssn, 667void iwl_mvm_enable_txq(struct iwl_mvm *mvm, int queue, u16 ssn,
534 const struct iwl_trans_txq_scd_cfg *cfg, 668 const struct iwl_trans_txq_scd_cfg *cfg,
535 unsigned int wdg_timeout) 669 unsigned int wdg_timeout)
@@ -603,7 +737,7 @@ int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq, bool init)
603} 737}
604 738
605/** 739/**
606 * iwl_mvm_update_smps - Get a requst to change the SMPS mode 740 * iwl_mvm_update_smps - Get a request to change the SMPS mode
607 * @req_type: The part of the driver who call for a change. 741 * @req_type: The part of the driver who call for a change.
608 * @smps_requests: The request to change the SMPS mode. 742 * @smps_requests: The request to change the SMPS mode.
609 * 743 *
@@ -643,6 +777,40 @@ void iwl_mvm_update_smps(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
643 ieee80211_request_smps(vif, smps_mode); 777 ieee80211_request_smps(vif, smps_mode);
644} 778}
645 779
780int iwl_mvm_request_statistics(struct iwl_mvm *mvm, bool clear)
781{
782 struct iwl_statistics_cmd scmd = {
783 .flags = clear ? cpu_to_le32(IWL_STATISTICS_FLG_CLEAR) : 0,
784 };
785 struct iwl_host_cmd cmd = {
786 .id = STATISTICS_CMD,
787 .len[0] = sizeof(scmd),
788 .data[0] = &scmd,
789 .flags = CMD_WANT_SKB,
790 };
791 int ret;
792
793 ret = iwl_mvm_send_cmd(mvm, &cmd);
794 if (ret)
795 return ret;
796
797 iwl_mvm_handle_rx_statistics(mvm, cmd.resp_pkt);
798 iwl_free_resp(&cmd);
799
800 if (clear)
801 iwl_mvm_accu_radio_stats(mvm);
802
803 return 0;
804}
805
806void iwl_mvm_accu_radio_stats(struct iwl_mvm *mvm)
807{
808 mvm->accu_radio_stats.rx_time += mvm->radio_stats.rx_time;
809 mvm->accu_radio_stats.tx_time += mvm->radio_stats.tx_time;
810 mvm->accu_radio_stats.on_time_rf += mvm->radio_stats.on_time_rf;
811 mvm->accu_radio_stats.on_time_scan += mvm->radio_stats.on_time_scan;
812}
813
646static void iwl_mvm_diversity_iter(void *_data, u8 *mac, 814static void iwl_mvm_diversity_iter(void *_data, u8 *mac,
647 struct ieee80211_vif *vif) 815 struct ieee80211_vif *vif)
648{ 816{
@@ -689,7 +857,7 @@ int iwl_mvm_update_low_latency(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
689 857
690 mvmvif->low_latency = value; 858 mvmvif->low_latency = value;
691 859
692 res = iwl_mvm_update_quotas(mvm, NULL); 860 res = iwl_mvm_update_quotas(mvm, false, NULL);
693 if (res) 861 if (res)
694 return res; 862 return res;
695 863
@@ -717,25 +885,6 @@ bool iwl_mvm_low_latency(struct iwl_mvm *mvm)
717 return result; 885 return result;
718} 886}
719 887
720static void iwl_mvm_idle_iter(void *_data, u8 *mac, struct ieee80211_vif *vif)
721{
722 bool *idle = _data;
723
724 if (!vif->bss_conf.idle)
725 *idle = false;
726}
727
728bool iwl_mvm_is_idle(struct iwl_mvm *mvm)
729{
730 bool idle = true;
731
732 ieee80211_iterate_active_interfaces_atomic(
733 mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
734 iwl_mvm_idle_iter, &idle);
735
736 return idle;
737}
738
739struct iwl_bss_iter_data { 888struct iwl_bss_iter_data {
740 struct ieee80211_vif *vif; 889 struct ieee80211_vif *vif;
741 bool error; 890 bool error;
@@ -772,3 +921,71 @@ struct ieee80211_vif *iwl_mvm_get_bss_vif(struct iwl_mvm *mvm)
772 921
773 return bss_iter_data.vif; 922 return bss_iter_data.vif;
774} 923}
924
925unsigned int iwl_mvm_get_wd_timeout(struct iwl_mvm *mvm,
926 struct ieee80211_vif *vif,
927 bool tdls, bool cmd_q)
928{
929 struct iwl_fw_dbg_trigger_tlv *trigger;
930 struct iwl_fw_dbg_trigger_txq_timer *txq_timer;
931 unsigned int default_timeout =
932 cmd_q ? IWL_DEF_WD_TIMEOUT : mvm->cfg->base_params->wd_timeout;
933
934 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_TXQ_TIMERS))
935 return iwlmvm_mod_params.tfd_q_hang_detect ?
936 default_timeout : IWL_WATCHDOG_DISABLED;
937
938 trigger = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_TXQ_TIMERS);
939 txq_timer = (void *)trigger->data;
940
941 if (tdls)
942 return le32_to_cpu(txq_timer->tdls);
943
944 if (cmd_q)
945 return le32_to_cpu(txq_timer->command_queue);
946
947 if (WARN_ON(!vif))
948 return default_timeout;
949
950 switch (ieee80211_vif_type_p2p(vif)) {
951 case NL80211_IFTYPE_ADHOC:
952 return le32_to_cpu(txq_timer->ibss);
953 case NL80211_IFTYPE_STATION:
954 return le32_to_cpu(txq_timer->bss);
955 case NL80211_IFTYPE_AP:
956 return le32_to_cpu(txq_timer->softap);
957 case NL80211_IFTYPE_P2P_CLIENT:
958 return le32_to_cpu(txq_timer->p2p_client);
959 case NL80211_IFTYPE_P2P_GO:
960 return le32_to_cpu(txq_timer->p2p_go);
961 case NL80211_IFTYPE_P2P_DEVICE:
962 return le32_to_cpu(txq_timer->p2p_device);
963 default:
964 WARN_ON(1);
965 return mvm->cfg->base_params->wd_timeout;
966 }
967}
968
969void iwl_mvm_connection_loss(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
970 const char *errmsg)
971{
972 struct iwl_fw_dbg_trigger_tlv *trig;
973 struct iwl_fw_dbg_trigger_mlme *trig_mlme;
974
975 if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME))
976 goto out;
977
978 trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME);
979 trig_mlme = (void *)trig->data;
980 if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
981 goto out;
982
983 if (trig_mlme->stop_connection_loss &&
984 --trig_mlme->stop_connection_loss)
985 goto out;
986
987 iwl_mvm_fw_dbg_collect_trig(mvm, trig, "%s", errmsg);
988
989out:
990 ieee80211_connection_loss(vif);
991}
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c
index 686dd301cd53..b18569734922 100644
--- a/drivers/net/wireless/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/iwlwifi/pcie/drv.c
@@ -415,10 +415,35 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
415 415
416/* 8000 Series */ 416/* 8000 Series */
417 {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)}, 417 {IWL_PCI_DEVICE(0x24F3, 0x0010, iwl8260_2ac_cfg)},
418 {IWL_PCI_DEVICE(0x24F3, 0x0004, iwl8260_2n_cfg)}, 418 {IWL_PCI_DEVICE(0x24F3, 0x1010, iwl8260_2ac_cfg)},
419 {IWL_PCI_DEVICE(0x24F3, 0x0110, iwl8260_2ac_cfg)},
420 {IWL_PCI_DEVICE(0x24F3, 0x1110, iwl8260_2ac_cfg)},
421 {IWL_PCI_DEVICE(0x24F3, 0x0050, iwl8260_2ac_cfg)},
422 {IWL_PCI_DEVICE(0x24F3, 0x0250, iwl8260_2ac_cfg)},
423 {IWL_PCI_DEVICE(0x24F3, 0x1050, iwl8260_2ac_cfg)},
424 {IWL_PCI_DEVICE(0x24F3, 0x0150, iwl8260_2ac_cfg)},
419 {IWL_PCI_DEVICE(0x24F4, 0x0030, iwl8260_2ac_cfg)}, 425 {IWL_PCI_DEVICE(0x24F4, 0x0030, iwl8260_2ac_cfg)},
426 {IWL_PCI_DEVICE(0x24F4, 0x1130, iwl8260_2ac_cfg)},
427 {IWL_PCI_DEVICE(0x24F4, 0x1030, iwl8260_2ac_cfg)},
428 {IWL_PCI_DEVICE(0x24F3, 0xC010, iwl8260_2ac_cfg)},
429 {IWL_PCI_DEVICE(0x24F3, 0xD010, iwl8260_2ac_cfg)},
430 {IWL_PCI_DEVICE(0x24F4, 0xC030, iwl8260_2ac_cfg)},
431 {IWL_PCI_DEVICE(0x24F4, 0xD030, iwl8260_2ac_cfg)},
432 {IWL_PCI_DEVICE(0x24F3, 0xC050, iwl8260_2ac_cfg)},
433 {IWL_PCI_DEVICE(0x24F3, 0xD050, iwl8260_2ac_cfg)},
434 {IWL_PCI_DEVICE(0x24F3, 0x8010, iwl8260_2ac_cfg)},
435 {IWL_PCI_DEVICE(0x24F3, 0x9010, iwl8260_2ac_cfg)},
436 {IWL_PCI_DEVICE(0x24F4, 0x8030, iwl8260_2ac_cfg)},
437 {IWL_PCI_DEVICE(0x24F4, 0x9030, iwl8260_2ac_cfg)},
438 {IWL_PCI_DEVICE(0x24F3, 0x8050, iwl8260_2ac_cfg)},
439 {IWL_PCI_DEVICE(0x24F3, 0x9050, iwl8260_2ac_cfg)},
440 {IWL_PCI_DEVICE(0x24F3, 0x0004, iwl8260_2n_cfg)},
420 {IWL_PCI_DEVICE(0x24F5, 0x0010, iwl4165_2ac_cfg)}, 441 {IWL_PCI_DEVICE(0x24F5, 0x0010, iwl4165_2ac_cfg)},
421 {IWL_PCI_DEVICE(0x24F6, 0x0030, iwl4165_2ac_cfg)}, 442 {IWL_PCI_DEVICE(0x24F6, 0x0030, iwl4165_2ac_cfg)},
443 {IWL_PCI_DEVICE(0x24F3, 0x0810, iwl8260_2ac_cfg)},
444 {IWL_PCI_DEVICE(0x24F3, 0x0910, iwl8260_2ac_cfg)},
445 {IWL_PCI_DEVICE(0x24F3, 0x0850, iwl8260_2ac_cfg)},
446 {IWL_PCI_DEVICE(0x24F3, 0x0950, iwl8260_2ac_cfg)},
422#endif /* CONFIG_IWLMVM */ 447#endif /* CONFIG_IWLMVM */
423 448
424 {0} 449 {0}
diff --git a/drivers/net/wireless/iwlwifi/pcie/internal.h b/drivers/net/wireless/iwlwifi/pcie/internal.h
index cae0eb8835ce..01996c9d98a7 100644
--- a/drivers/net/wireless/iwlwifi/pcie/internal.h
+++ b/drivers/net/wireless/iwlwifi/pcie/internal.h
@@ -217,6 +217,8 @@ struct iwl_pcie_txq_scratch_buf {
217 * @active: stores if queue is active 217 * @active: stores if queue is active
218 * @ampdu: true if this queue is an ampdu queue for an specific RA/TID 218 * @ampdu: true if this queue is an ampdu queue for an specific RA/TID
219 * @wd_timeout: queue watchdog timeout (jiffies) - per queue 219 * @wd_timeout: queue watchdog timeout (jiffies) - per queue
220 * @frozen: tx stuck queue timer is frozen
221 * @frozen_expiry_remainder: remember how long until the timer fires
220 * 222 *
221 * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame 223 * A Tx queue consists of circular buffer of BDs (a.k.a. TFDs, transmit frame
222 * descriptors) and required locking structures. 224 * descriptors) and required locking structures.
@@ -228,9 +230,11 @@ struct iwl_txq {
228 dma_addr_t scratchbufs_dma; 230 dma_addr_t scratchbufs_dma;
229 struct iwl_pcie_txq_entry *entries; 231 struct iwl_pcie_txq_entry *entries;
230 spinlock_t lock; 232 spinlock_t lock;
233 unsigned long frozen_expiry_remainder;
231 struct timer_list stuck_timer; 234 struct timer_list stuck_timer;
232 struct iwl_trans_pcie *trans_pcie; 235 struct iwl_trans_pcie *trans_pcie;
233 bool need_update; 236 bool need_update;
237 bool frozen;
234 u8 active; 238 u8 active;
235 bool ampdu; 239 bool ampdu;
236 unsigned long wd_timeout; 240 unsigned long wd_timeout;
diff --git a/drivers/net/wireless/iwlwifi/pcie/rx.c b/drivers/net/wireless/iwlwifi/pcie/rx.c
index 7b7e2f223fb2..7ff69c642103 100644
--- a/drivers/net/wireless/iwlwifi/pcie/rx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/rx.c
@@ -600,9 +600,11 @@ static void iwl_pcie_rx_handle_rb(struct iwl_trans *trans,
600 if (pkt->len_n_flags == cpu_to_le32(FH_RSCSR_FRAME_INVALID)) 600 if (pkt->len_n_flags == cpu_to_le32(FH_RSCSR_FRAME_INVALID))
601 break; 601 break;
602 602
603 IWL_DEBUG_RX(trans, "cmd at offset %d: %s (0x%.2x)\n", 603 IWL_DEBUG_RX(trans,
604 rxcb._offset, get_cmd_string(trans_pcie, pkt->hdr.cmd), 604 "cmd at offset %d: %s (0x%.2x, seq 0x%x)\n",
605 pkt->hdr.cmd); 605 rxcb._offset,
606 get_cmd_string(trans_pcie, pkt->hdr.cmd),
607 pkt->hdr.cmd, le16_to_cpu(pkt->hdr.sequence));
606 608
607 len = iwl_rx_packet_len(pkt); 609 len = iwl_rx_packet_len(pkt);
608 len += sizeof(u32); /* account for status word */ 610 len += sizeof(u32); /* account for status word */
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index 69935aa5a1b3..2de8fbfe4edf 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -682,10 +682,51 @@ static int iwl_pcie_load_section(struct iwl_trans *trans, u8 section_num,
682 return ret; 682 return ret;
683} 683}
684 684
685static int iwl_pcie_load_cpu_sections_8000b(struct iwl_trans *trans, 685/*
686 const struct fw_img *image, 686 * Driver Takes the ownership on secure machine before FW load
687 int cpu, 687 * and prevent race with the BT load.
688 int *first_ucode_section) 688 * W/A for ROM bug. (should be remove in the next Si step)
689 */
690static int iwl_pcie_rsa_race_bug_wa(struct iwl_trans *trans)
691{
692 u32 val, loop = 1000;
693
694 /*
695 * Check the RSA semaphore is accessible.
696 * If the HW isn't locked and the rsa semaphore isn't accessible,
697 * we are in trouble.
698 */
699 val = iwl_read_prph(trans, PREG_AUX_BUS_WPROT_0);
700 if (val & (BIT(1) | BIT(17))) {
701 IWL_INFO(trans,
702 "can't access the RSA semaphore it is write protected\n");
703 return 0;
704 }
705
706 /* take ownership on the AUX IF */
707 iwl_write_prph(trans, WFPM_CTRL_REG, WFPM_AUX_CTL_AUX_IF_MAC_OWNER_MSK);
708 iwl_write_prph(trans, AUX_MISC_MASTER1_EN, AUX_MISC_MASTER1_EN_SBE_MSK);
709
710 do {
711 iwl_write_prph(trans, AUX_MISC_MASTER1_SMPHR_STATUS, 0x1);
712 val = iwl_read_prph(trans, AUX_MISC_MASTER1_SMPHR_STATUS);
713 if (val == 0x1) {
714 iwl_write_prph(trans, RSA_ENABLE, 0);
715 return 0;
716 }
717
718 udelay(10);
719 loop--;
720 } while (loop > 0);
721
722 IWL_ERR(trans, "Failed to take ownership on secure machine\n");
723 return -EIO;
724}
725
726static int iwl_pcie_load_cpu_sections_8000(struct iwl_trans *trans,
727 const struct fw_img *image,
728 int cpu,
729 int *first_ucode_section)
689{ 730{
690 int shift_param; 731 int shift_param;
691 int i, ret = 0, sec_num = 0x1; 732 int i, ret = 0, sec_num = 0x1;
@@ -880,64 +921,50 @@ static int iwl_pcie_load_given_ucode(struct iwl_trans *trans,
880 } 921 }
881 922
882 /* release CPU reset */ 923 /* release CPU reset */
883 if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) 924 iwl_write32(trans, CSR_RESET, 0);
884 iwl_write_prph(trans, RELEASE_CPU_RESET, RELEASE_CPU_RESET_BIT);
885 else
886 iwl_write32(trans, CSR_RESET, 0);
887 925
888 return 0; 926 return 0;
889} 927}
890 928
891static int iwl_pcie_load_given_ucode_8000b(struct iwl_trans *trans, 929static int iwl_pcie_load_given_ucode_8000(struct iwl_trans *trans,
892 const struct fw_img *image) 930 const struct fw_img *image)
893{ 931{
894 int ret = 0; 932 int ret = 0;
895 int first_ucode_section; 933 int first_ucode_section;
896 u32 reg;
897 934
898 IWL_DEBUG_FW(trans, "working with %s CPU\n", 935 IWL_DEBUG_FW(trans, "working with %s CPU\n",
899 image->is_dual_cpus ? "Dual" : "Single"); 936 image->is_dual_cpus ? "Dual" : "Single");
900 937
938 if (trans->dbg_dest_tlv)
939 iwl_pcie_apply_destination(trans);
940
941 /* TODO: remove in the next Si step */
942 ret = iwl_pcie_rsa_race_bug_wa(trans);
943 if (ret)
944 return ret;
945
901 /* configure the ucode to be ready to get the secured image */ 946 /* configure the ucode to be ready to get the secured image */
902 /* release CPU reset */ 947 /* release CPU reset */
903 iwl_write_prph(trans, RELEASE_CPU_RESET, RELEASE_CPU_RESET_BIT); 948 iwl_write_prph(trans, RELEASE_CPU_RESET, RELEASE_CPU_RESET_BIT);
904 949
905 /* load to FW the binary Secured sections of CPU1 */ 950 /* load to FW the binary Secured sections of CPU1 */
906 ret = iwl_pcie_load_cpu_sections_8000b(trans, image, 1, 951 ret = iwl_pcie_load_cpu_sections_8000(trans, image, 1,
907 &first_ucode_section); 952 &first_ucode_section);
908 if (ret) 953 if (ret)
909 return ret; 954 return ret;
910 955
911 /* load to FW the binary sections of CPU2 */ 956 /* load to FW the binary sections of CPU2 */
912 ret = iwl_pcie_load_cpu_sections_8000b(trans, image, 2, 957 ret = iwl_pcie_load_cpu_sections_8000(trans, image, 2,
913 &first_ucode_section); 958 &first_ucode_section);
914 if (ret) 959 if (ret)
915 return ret; 960 return ret;
916 961
917 if (trans->dbg_dest_tlv)
918 iwl_pcie_apply_destination(trans);
919
920 /* wait for image verification to complete */
921 ret = iwl_poll_prph_bit(trans, LMPM_SECURE_BOOT_CPU1_STATUS_ADDR_B0,
922 LMPM_SECURE_BOOT_STATUS_SUCCESS,
923 LMPM_SECURE_BOOT_STATUS_SUCCESS,
924 LMPM_SECURE_TIME_OUT);
925 if (ret < 0) {
926 reg = iwl_read_prph(trans,
927 LMPM_SECURE_BOOT_CPU1_STATUS_ADDR_B0);
928
929 IWL_ERR(trans, "Timeout on secure boot process, reg = %x\n",
930 reg);
931 return ret;
932 }
933
934 return 0; 962 return 0;
935} 963}
936 964
937static int iwl_trans_pcie_start_fw(struct iwl_trans *trans, 965static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
938 const struct fw_img *fw, bool run_in_rfkill) 966 const struct fw_img *fw, bool run_in_rfkill)
939{ 967{
940 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
941 int ret; 968 int ret;
942 bool hw_rfkill; 969 bool hw_rfkill;
943 970
@@ -967,9 +994,6 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
967 return ret; 994 return ret;
968 } 995 }
969 996
970 /* init ref_count to 1 (should be cleared when ucode is loaded) */
971 trans_pcie->ref_count = 1;
972
973 /* make sure rfkill handshake bits are cleared */ 997 /* make sure rfkill handshake bits are cleared */
974 iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL); 998 iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
975 iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, 999 iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR,
@@ -984,9 +1008,8 @@ static int iwl_trans_pcie_start_fw(struct iwl_trans *trans,
984 iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL); 1008 iwl_write32(trans, CSR_UCODE_DRV_GP1_CLR, CSR_UCODE_SW_BIT_RFKILL);
985 1009
986 /* Load the given image to the HW */ 1010 /* Load the given image to the HW */
987 if ((trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) && 1011 if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000)
988 (CSR_HW_REV_STEP(trans->hw_rev) != SILICON_A_STEP)) 1012 return iwl_pcie_load_given_ucode_8000(trans, fw);
989 return iwl_pcie_load_given_ucode_8000b(trans, fw);
990 else 1013 else
991 return iwl_pcie_load_given_ucode(trans, fw); 1014 return iwl_pcie_load_given_ucode(trans, fw);
992} 1015}
@@ -1288,6 +1311,9 @@ static void iwl_trans_pcie_configure(struct iwl_trans *trans,
1288 trans_pcie->bc_table_dword = trans_cfg->bc_table_dword; 1311 trans_pcie->bc_table_dword = trans_cfg->bc_table_dword;
1289 trans_pcie->scd_set_active = trans_cfg->scd_set_active; 1312 trans_pcie->scd_set_active = trans_cfg->scd_set_active;
1290 1313
1314 /* init ref_count to 1 (should be cleared when ucode is loaded) */
1315 trans_pcie->ref_count = 1;
1316
1291 /* Initialize NAPI here - it should be before registering to mac80211 1317 /* Initialize NAPI here - it should be before registering to mac80211
1292 * in the opmode but after the HW struct is allocated. 1318 * in the opmode but after the HW struct is allocated.
1293 * As this function may be called again in some corner cases don't 1319 * As this function may be called again in some corner cases don't
@@ -1462,6 +1488,60 @@ static int iwl_trans_pcie_write_mem(struct iwl_trans *trans, u32 addr,
1462 return ret; 1488 return ret;
1463} 1489}
1464 1490
1491static void iwl_trans_pcie_freeze_txq_timer(struct iwl_trans *trans,
1492 unsigned long txqs,
1493 bool freeze)
1494{
1495 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
1496 int queue;
1497
1498 for_each_set_bit(queue, &txqs, BITS_PER_LONG) {
1499 struct iwl_txq *txq = &trans_pcie->txq[queue];
1500 unsigned long now;
1501
1502 spin_lock_bh(&txq->lock);
1503
1504 now = jiffies;
1505
1506 if (txq->frozen == freeze)
1507 goto next_queue;
1508
1509 IWL_DEBUG_TX_QUEUES(trans, "%s TXQ %d\n",
1510 freeze ? "Freezing" : "Waking", queue);
1511
1512 txq->frozen = freeze;
1513
1514 if (txq->q.read_ptr == txq->q.write_ptr)
1515 goto next_queue;
1516
1517 if (freeze) {
1518 if (unlikely(time_after(now,
1519 txq->stuck_timer.expires))) {
1520 /*
1521 * The timer should have fired, maybe it is
1522 * spinning right now on the lock.
1523 */
1524 goto next_queue;
1525 }
1526 /* remember how long until the timer fires */
1527 txq->frozen_expiry_remainder =
1528 txq->stuck_timer.expires - now;
1529 del_timer(&txq->stuck_timer);
1530 goto next_queue;
1531 }
1532
1533 /*
1534 * Wake a non-empty queue -> arm timer with the
1535 * remainder before it froze
1536 */
1537 mod_timer(&txq->stuck_timer,
1538 now + txq->frozen_expiry_remainder);
1539
1540next_queue:
1541 spin_unlock_bh(&txq->lock);
1542 }
1543}
1544
1465#define IWL_FLUSH_WAIT_MS 2000 1545#define IWL_FLUSH_WAIT_MS 2000
1466 1546
1467static int iwl_trans_pcie_wait_txq_empty(struct iwl_trans *trans, u32 txq_bm) 1547static int iwl_trans_pcie_wait_txq_empty(struct iwl_trans *trans, u32 txq_bm)
@@ -1713,7 +1793,7 @@ static ssize_t iwl_dbgfs_tx_queue_read(struct file *file,
1713 int ret; 1793 int ret;
1714 size_t bufsz; 1794 size_t bufsz;
1715 1795
1716 bufsz = sizeof(char) * 64 * trans->cfg->base_params->num_of_queues; 1796 bufsz = sizeof(char) * 75 * trans->cfg->base_params->num_of_queues;
1717 1797
1718 if (!trans_pcie->txq) 1798 if (!trans_pcie->txq)
1719 return -EAGAIN; 1799 return -EAGAIN;
@@ -1726,11 +1806,11 @@ static ssize_t iwl_dbgfs_tx_queue_read(struct file *file,
1726 txq = &trans_pcie->txq[cnt]; 1806 txq = &trans_pcie->txq[cnt];
1727 q = &txq->q; 1807 q = &txq->q;
1728 pos += scnprintf(buf + pos, bufsz - pos, 1808 pos += scnprintf(buf + pos, bufsz - pos,
1729 "hwq %.2d: read=%u write=%u use=%d stop=%d need_update=%d%s\n", 1809 "hwq %.2d: read=%u write=%u use=%d stop=%d need_update=%d frozen=%d%s\n",
1730 cnt, q->read_ptr, q->write_ptr, 1810 cnt, q->read_ptr, q->write_ptr,
1731 !!test_bit(cnt, trans_pcie->queue_used), 1811 !!test_bit(cnt, trans_pcie->queue_used),
1732 !!test_bit(cnt, trans_pcie->queue_stopped), 1812 !!test_bit(cnt, trans_pcie->queue_stopped),
1733 txq->need_update, 1813 txq->need_update, txq->frozen,
1734 (cnt == trans_pcie->cmd_queue ? " HCMD" : "")); 1814 (cnt == trans_pcie->cmd_queue ? " HCMD" : ""));
1735 } 1815 }
1736 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); 1816 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
@@ -1961,24 +2041,25 @@ static const struct {
1961 { .start = 0x00a01c7c, .end = 0x00a01c7c }, 2041 { .start = 0x00a01c7c, .end = 0x00a01c7c },
1962 { .start = 0x00a01c28, .end = 0x00a01c54 }, 2042 { .start = 0x00a01c28, .end = 0x00a01c54 },
1963 { .start = 0x00a01c5c, .end = 0x00a01c5c }, 2043 { .start = 0x00a01c5c, .end = 0x00a01c5c },
1964 { .start = 0x00a01c84, .end = 0x00a01c84 }, 2044 { .start = 0x00a01c60, .end = 0x00a01cdc },
1965 { .start = 0x00a01ce0, .end = 0x00a01d0c }, 2045 { .start = 0x00a01ce0, .end = 0x00a01d0c },
1966 { .start = 0x00a01d18, .end = 0x00a01d20 }, 2046 { .start = 0x00a01d18, .end = 0x00a01d20 },
1967 { .start = 0x00a01d2c, .end = 0x00a01d30 }, 2047 { .start = 0x00a01d2c, .end = 0x00a01d30 },
1968 { .start = 0x00a01d40, .end = 0x00a01d5c }, 2048 { .start = 0x00a01d40, .end = 0x00a01d5c },
1969 { .start = 0x00a01d80, .end = 0x00a01d80 }, 2049 { .start = 0x00a01d80, .end = 0x00a01d80 },
1970 { .start = 0x00a01d98, .end = 0x00a01d98 }, 2050 { .start = 0x00a01d98, .end = 0x00a01d9c },
2051 { .start = 0x00a01da8, .end = 0x00a01da8 },
2052 { .start = 0x00a01db8, .end = 0x00a01df4 },
1971 { .start = 0x00a01dc0, .end = 0x00a01dfc }, 2053 { .start = 0x00a01dc0, .end = 0x00a01dfc },
1972 { .start = 0x00a01e00, .end = 0x00a01e2c }, 2054 { .start = 0x00a01e00, .end = 0x00a01e2c },
1973 { .start = 0x00a01e40, .end = 0x00a01e60 }, 2055 { .start = 0x00a01e40, .end = 0x00a01e60 },
2056 { .start = 0x00a01e68, .end = 0x00a01e6c },
2057 { .start = 0x00a01e74, .end = 0x00a01e74 },
1974 { .start = 0x00a01e84, .end = 0x00a01e90 }, 2058 { .start = 0x00a01e84, .end = 0x00a01e90 },
1975 { .start = 0x00a01e9c, .end = 0x00a01ec4 }, 2059 { .start = 0x00a01e9c, .end = 0x00a01ec4 },
1976 { .start = 0x00a01ed0, .end = 0x00a01ed0 }, 2060 { .start = 0x00a01ed0, .end = 0x00a01ee0 },
1977 { .start = 0x00a01f00, .end = 0x00a01f14 }, 2061 { .start = 0x00a01f00, .end = 0x00a01f1c },
1978 { .start = 0x00a01f44, .end = 0x00a01f58 }, 2062 { .start = 0x00a01f44, .end = 0x00a01ffc },
1979 { .start = 0x00a01f80, .end = 0x00a01fa8 },
1980 { .start = 0x00a01fb0, .end = 0x00a01fbc },
1981 { .start = 0x00a01ff8, .end = 0x00a01ffc },
1982 { .start = 0x00a02000, .end = 0x00a02048 }, 2063 { .start = 0x00a02000, .end = 0x00a02048 },
1983 { .start = 0x00a02068, .end = 0x00a020f0 }, 2064 { .start = 0x00a02068, .end = 0x00a020f0 },
1984 { .start = 0x00a02100, .end = 0x00a02118 }, 2065 { .start = 0x00a02100, .end = 0x00a02118 },
@@ -2305,6 +2386,7 @@ static const struct iwl_trans_ops trans_ops_pcie = {
2305 .dbgfs_register = iwl_trans_pcie_dbgfs_register, 2386 .dbgfs_register = iwl_trans_pcie_dbgfs_register,
2306 2387
2307 .wait_tx_queue_empty = iwl_trans_pcie_wait_txq_empty, 2388 .wait_tx_queue_empty = iwl_trans_pcie_wait_txq_empty,
2389 .freeze_txq_timer = iwl_trans_pcie_freeze_txq_timer,
2308 2390
2309 .write8 = iwl_trans_pcie_write8, 2391 .write8 = iwl_trans_pcie_write8,
2310 .write32 = iwl_trans_pcie_write32, 2392 .write32 = iwl_trans_pcie_write32,
@@ -2423,10 +2505,45 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
2423 * "dash" value). To keep hw_rev backwards compatible - we'll store it 2505 * "dash" value). To keep hw_rev backwards compatible - we'll store it
2424 * in the old format. 2506 * in the old format.
2425 */ 2507 */
2426 if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) 2508 if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) {
2509 unsigned long flags;
2510 int ret;
2511
2427 trans->hw_rev = (trans->hw_rev & 0xfff0) | 2512 trans->hw_rev = (trans->hw_rev & 0xfff0) |
2428 (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2); 2513 (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2);
2429 2514
2515 /*
2516 * in-order to recognize C step driver should read chip version
2517 * id located at the AUX bus MISC address space.
2518 */
2519 iwl_set_bit(trans, CSR_GP_CNTRL,
2520 CSR_GP_CNTRL_REG_FLAG_INIT_DONE);
2521 udelay(2);
2522
2523 ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
2524 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
2525 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY,
2526 25000);
2527 if (ret < 0) {
2528 IWL_DEBUG_INFO(trans, "Failed to wake up the nic\n");
2529 goto out_pci_disable_msi;
2530 }
2531
2532 if (iwl_trans_grab_nic_access(trans, false, &flags)) {
2533 u32 hw_step;
2534
2535 hw_step = __iwl_read_prph(trans, WFPM_CTRL_REG);
2536 hw_step |= ENABLE_WFPM;
2537 __iwl_write_prph(trans, WFPM_CTRL_REG, hw_step);
2538 hw_step = __iwl_read_prph(trans, AUX_MISC_REG);
2539 hw_step = (hw_step >> HW_STEP_LOCATION_BITS) & 0xF;
2540 if (hw_step == 0x3)
2541 trans->hw_rev = (trans->hw_rev & 0xFFFFFFF3) |
2542 (SILICON_C_STEP << 2);
2543 iwl_trans_release_nic_access(trans, &flags);
2544 }
2545 }
2546
2430 trans->hw_id = (pdev->device << 16) + pdev->subsystem_device; 2547 trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
2431 snprintf(trans->hw_id_str, sizeof(trans->hw_id_str), 2548 snprintf(trans->hw_id_str, sizeof(trans->hw_id_str),
2432 "PCI ID: 0x%04X:0x%04X", pdev->device, pdev->subsystem_device); 2549 "PCI ID: 0x%04X:0x%04X", pdev->device, pdev->subsystem_device);
diff --git a/drivers/net/wireless/iwlwifi/pcie/tx.c b/drivers/net/wireless/iwlwifi/pcie/tx.c
index af0bce736358..06952aadfd7b 100644
--- a/drivers/net/wireless/iwlwifi/pcie/tx.c
+++ b/drivers/net/wireless/iwlwifi/pcie/tx.c
@@ -725,33 +725,50 @@ void iwl_trans_pcie_tx_reset(struct iwl_trans *trans)
725 iwl_pcie_tx_start(trans, 0); 725 iwl_pcie_tx_start(trans, 0);
726} 726}
727 727
728static void iwl_pcie_tx_stop_fh(struct iwl_trans *trans)
729{
730 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
731 unsigned long flags;
732 int ch, ret;
733 u32 mask = 0;
734
735 spin_lock(&trans_pcie->irq_lock);
736
737 if (!iwl_trans_grab_nic_access(trans, false, &flags))
738 goto out;
739
740 /* Stop each Tx DMA channel */
741 for (ch = 0; ch < FH_TCSR_CHNL_NUM; ch++) {
742 iwl_write32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0);
743 mask |= FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch);
744 }
745
746 /* Wait for DMA channels to be idle */
747 ret = iwl_poll_bit(trans, FH_TSSR_TX_STATUS_REG, mask, mask, 5000);
748 if (ret < 0)
749 IWL_ERR(trans,
750 "Failing on timeout while stopping DMA channel %d [0x%08x]\n",
751 ch, iwl_read32(trans, FH_TSSR_TX_STATUS_REG));
752
753 iwl_trans_release_nic_access(trans, &flags);
754
755out:
756 spin_unlock(&trans_pcie->irq_lock);
757}
758
728/* 759/*
729 * iwl_pcie_tx_stop - Stop all Tx DMA channels 760 * iwl_pcie_tx_stop - Stop all Tx DMA channels
730 */ 761 */
731int iwl_pcie_tx_stop(struct iwl_trans *trans) 762int iwl_pcie_tx_stop(struct iwl_trans *trans)
732{ 763{
733 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 764 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
734 int ch, txq_id, ret; 765 int txq_id;
735 766
736 /* Turn off all Tx DMA fifos */ 767 /* Turn off all Tx DMA fifos */
737 spin_lock(&trans_pcie->irq_lock);
738
739 iwl_scd_deactivate_fifos(trans); 768 iwl_scd_deactivate_fifos(trans);
740 769
741 /* Stop each Tx DMA channel, and wait for it to be idle */ 770 /* Turn off all Tx DMA channels */
742 for (ch = 0; ch < FH_TCSR_CHNL_NUM; ch++) { 771 iwl_pcie_tx_stop_fh(trans);
743 iwl_write_direct32(trans,
744 FH_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0);
745 ret = iwl_poll_direct_bit(trans, FH_TSSR_TX_STATUS_REG,
746 FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch), 1000);
747 if (ret < 0)
748 IWL_ERR(trans,
749 "Failing on timeout while stopping DMA channel %d [0x%08x]\n",
750 ch,
751 iwl_read_direct32(trans,
752 FH_TSSR_TX_STATUS_REG));
753 }
754 spin_unlock(&trans_pcie->irq_lock);
755 772
756 /* 773 /*
757 * This function can be called before the op_mode disabled the 774 * This function can be called before the op_mode disabled the
@@ -912,10 +929,19 @@ error:
912 929
913static inline void iwl_pcie_txq_progress(struct iwl_txq *txq) 930static inline void iwl_pcie_txq_progress(struct iwl_txq *txq)
914{ 931{
932 lockdep_assert_held(&txq->lock);
933
915 if (!txq->wd_timeout) 934 if (!txq->wd_timeout)
916 return; 935 return;
917 936
918 /* 937 /*
938 * station is asleep and we send data - that must
939 * be uAPSD or PS-Poll. Don't rearm the timer.
940 */
941 if (txq->frozen)
942 return;
943
944 /*
919 * if empty delete timer, otherwise move timer forward 945 * if empty delete timer, otherwise move timer forward
920 * since we're making progress on this queue 946 * since we're making progress on this queue
921 */ 947 */
@@ -1248,6 +1274,9 @@ void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id,
1248 SCD_TX_STTS_QUEUE_OFFSET(txq_id); 1274 SCD_TX_STTS_QUEUE_OFFSET(txq_id);
1249 static const u32 zero_val[4] = {}; 1275 static const u32 zero_val[4] = {};
1250 1276
1277 trans_pcie->txq[txq_id].frozen_expiry_remainder = 0;
1278 trans_pcie->txq[txq_id].frozen = false;
1279
1251 /* 1280 /*
1252 * Upon HW Rfkill - we stop the device, and then stop the queues 1281 * Upon HW Rfkill - we stop the device, and then stop the queues
1253 * in the op_mode. Just for the sake of the simplicity of the op_mode, 1282 * in the op_mode. Just for the sake of the simplicity of the op_mode,
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c
index a92985a6ea21..1a4d558022d8 100644
--- a/drivers/net/wireless/libertas/cfg.c
+++ b/drivers/net/wireless/libertas/cfg.c
@@ -1356,8 +1356,8 @@ static int lbs_cfg_connect(struct wiphy *wiphy, struct net_device *dev,
1356 1356
1357 /* Find the BSS we want using available scan results */ 1357 /* Find the BSS we want using available scan results */
1358 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid, 1358 bss = cfg80211_get_bss(wiphy, sme->channel, sme->bssid,
1359 sme->ssid, sme->ssid_len, 1359 sme->ssid, sme->ssid_len, IEEE80211_BSS_TYPE_ESS,
1360 WLAN_CAPABILITY_ESS, WLAN_CAPABILITY_ESS); 1360 IEEE80211_PRIVACY_ANY);
1361 if (!bss) { 1361 if (!bss) {
1362 wiphy_err(wiphy, "assoc: bss %pM not in scan results\n", 1362 wiphy_err(wiphy, "assoc: bss %pM not in scan results\n",
1363 sme->bssid); 1363 sme->bssid);
@@ -2000,7 +2000,7 @@ static int lbs_join_ibss(struct wiphy *wiphy, struct net_device *dev,
2000 * bss list is populated already */ 2000 * bss list is populated already */
2001 bss = cfg80211_get_bss(wiphy, params->chandef.chan, params->bssid, 2001 bss = cfg80211_get_bss(wiphy, params->chandef.chan, params->bssid,
2002 params->ssid, params->ssid_len, 2002 params->ssid, params->ssid_len,
2003 WLAN_CAPABILITY_IBSS, WLAN_CAPABILITY_IBSS); 2003 IEEE80211_BSS_TYPE_IBSS, IEEE80211_PRIVACY_ANY);
2004 2004
2005 if (bss) { 2005 if (bss) {
2006 ret = lbs_ibss_join_existing(priv, params, bss); 2006 ret = lbs_ibss_join_existing(priv, params, bss);
diff --git a/drivers/net/wireless/libertas/debugfs.c b/drivers/net/wireless/libertas/debugfs.c
index cc6a0a586f0b..26cbf1dcc662 100644
--- a/drivers/net/wireless/libertas/debugfs.c
+++ b/drivers/net/wireless/libertas/debugfs.c
@@ -742,8 +742,7 @@ void lbs_debugfs_init(void)
742 742
743void lbs_debugfs_remove(void) 743void lbs_debugfs_remove(void)
744{ 744{
745 if (lbs_dir) 745 debugfs_remove(lbs_dir);
746 debugfs_remove(lbs_dir);
747} 746}
748 747
749void lbs_debugfs_init_one(struct lbs_private *priv, struct net_device *dev) 748void lbs_debugfs_init_one(struct lbs_private *priv, struct net_device *dev)
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
index 569b64ecc607..8079560f4965 100644
--- a/drivers/net/wireless/libertas/main.c
+++ b/drivers/net/wireless/libertas/main.c
@@ -667,7 +667,7 @@ static int lbs_setup_firmware(struct lbs_private *priv)
667 lbs_deb_enter(LBS_DEB_FW); 667 lbs_deb_enter(LBS_DEB_FW);
668 668
669 /* Read MAC address from firmware */ 669 /* Read MAC address from firmware */
670 memset(priv->current_addr, 0xff, ETH_ALEN); 670 eth_broadcast_addr(priv->current_addr);
671 ret = lbs_update_hw_spec(priv); 671 ret = lbs_update_hw_spec(priv);
672 if (ret) 672 if (ret)
673 goto done; 673 goto done;
@@ -871,7 +871,7 @@ static int lbs_init_adapter(struct lbs_private *priv)
871 871
872 lbs_deb_enter(LBS_DEB_MAIN); 872 lbs_deb_enter(LBS_DEB_MAIN);
873 873
874 memset(priv->current_addr, 0xff, ETH_ALEN); 874 eth_broadcast_addr(priv->current_addr);
875 875
876 priv->connect_status = LBS_DISCONNECTED; 876 priv->connect_status = LBS_DISCONNECTED;
877 priv->channel = DEFAULT_AD_HOC_CHANNEL; 877 priv->channel = DEFAULT_AD_HOC_CHANNEL;
diff --git a/drivers/net/wireless/libertas_tf/if_usb.c b/drivers/net/wireless/libertas_tf/if_usb.c
index d576dd6665d3..1a20cee5febe 100644
--- a/drivers/net/wireless/libertas_tf/if_usb.c
+++ b/drivers/net/wireless/libertas_tf/if_usb.c
@@ -365,7 +365,6 @@ static int if_usb_reset_device(struct if_usb_card *cardp)
365 365
366 return ret; 366 return ret;
367} 367}
368EXPORT_SYMBOL_GPL(if_usb_reset_device);
369 368
370/** 369/**
371 * usb_tx_block - transfer data to the device 370 * usb_tx_block - transfer data to the device
@@ -907,7 +906,6 @@ restart:
907 lbtf_deb_leave_args(LBTF_DEB_USB, "ret %d", ret); 906 lbtf_deb_leave_args(LBTF_DEB_USB, "ret %d", ret);
908 return ret; 907 return ret;
909} 908}
910EXPORT_SYMBOL_GPL(if_usb_prog_firmware);
911 909
912 910
913#define if_usb_suspend NULL 911#define if_usb_suspend NULL
diff --git a/drivers/net/wireless/libertas_tf/main.c b/drivers/net/wireless/libertas_tf/main.c
index 25c5acc78bd1..ed02e4bf2c26 100644
--- a/drivers/net/wireless/libertas_tf/main.c
+++ b/drivers/net/wireless/libertas_tf/main.c
@@ -152,7 +152,7 @@ static int lbtf_setup_firmware(struct lbtf_private *priv)
152 /* 152 /*
153 * Read priv address from HW 153 * Read priv address from HW
154 */ 154 */
155 memset(priv->current_addr, 0xff, ETH_ALEN); 155 eth_broadcast_addr(priv->current_addr);
156 ret = lbtf_update_hw_spec(priv); 156 ret = lbtf_update_hw_spec(priv);
157 if (ret) { 157 if (ret) {
158 ret = -1; 158 ret = -1;
@@ -199,7 +199,7 @@ out:
199static int lbtf_init_adapter(struct lbtf_private *priv) 199static int lbtf_init_adapter(struct lbtf_private *priv)
200{ 200{
201 lbtf_deb_enter(LBTF_DEB_MAIN); 201 lbtf_deb_enter(LBTF_DEB_MAIN);
202 memset(priv->current_addr, 0xff, ETH_ALEN); 202 eth_broadcast_addr(priv->current_addr);
203 mutex_init(&priv->lock); 203 mutex_init(&priv->lock);
204 204
205 priv->vif = NULL; 205 priv->vif = NULL;
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c
index 8908be6dbc48..d5c0a1af08b9 100644
--- a/drivers/net/wireless/mac80211_hwsim.c
+++ b/drivers/net/wireless/mac80211_hwsim.c
@@ -330,6 +330,83 @@ static const struct ieee80211_rate hwsim_rates[] = {
330 { .bitrate = 540 } 330 { .bitrate = 540 }
331}; 331};
332 332
333#define OUI_QCA 0x001374
334#define QCA_NL80211_SUBCMD_TEST 1
335enum qca_nl80211_vendor_subcmds {
336 QCA_WLAN_VENDOR_ATTR_TEST = 8,
337 QCA_WLAN_VENDOR_ATTR_MAX = QCA_WLAN_VENDOR_ATTR_TEST
338};
339
340static const struct nla_policy
341hwsim_vendor_test_policy[QCA_WLAN_VENDOR_ATTR_MAX + 1] = {
342 [QCA_WLAN_VENDOR_ATTR_MAX] = { .type = NLA_U32 },
343};
344
345static int mac80211_hwsim_vendor_cmd_test(struct wiphy *wiphy,
346 struct wireless_dev *wdev,
347 const void *data, int data_len)
348{
349 struct sk_buff *skb;
350 struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
351 int err;
352 u32 val;
353
354 err = nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, data_len,
355 hwsim_vendor_test_policy);
356 if (err)
357 return err;
358 if (!tb[QCA_WLAN_VENDOR_ATTR_TEST])
359 return -EINVAL;
360 val = nla_get_u32(tb[QCA_WLAN_VENDOR_ATTR_TEST]);
361 wiphy_debug(wiphy, "%s: test=%u\n", __func__, val);
362
363 /* Send a vendor event as a test. Note that this would not normally be
364 * done within a command handler, but rather, based on some other
365 * trigger. For simplicity, this command is used to trigger the event
366 * here.
367 *
368 * event_idx = 0 (index in mac80211_hwsim_vendor_commands)
369 */
370 skb = cfg80211_vendor_event_alloc(wiphy, wdev, 100, 0, GFP_KERNEL);
371 if (skb) {
372 /* skb_put() or nla_put() will fill up data within
373 * NL80211_ATTR_VENDOR_DATA.
374 */
375
376 /* Add vendor data */
377 nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_TEST, val + 1);
378
379 /* Send the event - this will call nla_nest_end() */
380 cfg80211_vendor_event(skb, GFP_KERNEL);
381 }
382
383 /* Send a response to the command */
384 skb = cfg80211_vendor_cmd_alloc_reply_skb(wiphy, 10);
385 if (!skb)
386 return -ENOMEM;
387
388 /* skb_put() or nla_put() will fill up data within
389 * NL80211_ATTR_VENDOR_DATA
390 */
391 nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_TEST, val + 2);
392
393 return cfg80211_vendor_cmd_reply(skb);
394}
395
396static struct wiphy_vendor_command mac80211_hwsim_vendor_commands[] = {
397 {
398 .info = { .vendor_id = OUI_QCA,
399 .subcmd = QCA_NL80211_SUBCMD_TEST },
400 .flags = WIPHY_VENDOR_CMD_NEED_NETDEV,
401 .doit = mac80211_hwsim_vendor_cmd_test,
402 }
403};
404
405/* Advertise support vendor specific events */
406static const struct nl80211_vendor_cmd_info mac80211_hwsim_vendor_events[] = {
407 { .vendor_id = OUI_QCA, .subcmd = 1 },
408};
409
333static const struct ieee80211_iface_limit hwsim_if_limits[] = { 410static const struct ieee80211_iface_limit hwsim_if_limits[] = {
334 { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) }, 411 { .max = 1, .types = BIT(NL80211_IFTYPE_ADHOC) },
335 { .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) | 412 { .max = 2048, .types = BIT(NL80211_IFTYPE_STATION) |
@@ -906,8 +983,7 @@ static void mac80211_hwsim_tx_frame_nl(struct ieee80211_hw *hw,
906 goto nla_put_failure; 983 goto nla_put_failure;
907 } 984 }
908 985
909 if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER, 986 if (nla_put(skb, HWSIM_ATTR_ADDR_TRANSMITTER, ETH_ALEN, hdr->addr2))
910 ETH_ALEN, data->addresses[1].addr))
911 goto nla_put_failure; 987 goto nla_put_failure;
912 988
913 /* We get the skb->data */ 989 /* We get the skb->data */
@@ -1522,21 +1598,16 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
1522 vp->aid = info->aid; 1598 vp->aid = info->aid;
1523 } 1599 }
1524 1600
1525 if (changed & BSS_CHANGED_BEACON_INT) {
1526 wiphy_debug(hw->wiphy, " BCNINT: %d\n", info->beacon_int);
1527 data->beacon_int = info->beacon_int * 1024;
1528 }
1529
1530 if (changed & BSS_CHANGED_BEACON_ENABLED) { 1601 if (changed & BSS_CHANGED_BEACON_ENABLED) {
1531 wiphy_debug(hw->wiphy, " BCN EN: %d\n", info->enable_beacon); 1602 wiphy_debug(hw->wiphy, " BCN EN: %d (BI=%u)\n",
1603 info->enable_beacon, info->beacon_int);
1532 vp->bcn_en = info->enable_beacon; 1604 vp->bcn_en = info->enable_beacon;
1533 if (data->started && 1605 if (data->started &&
1534 !hrtimer_is_queued(&data->beacon_timer.timer) && 1606 !hrtimer_is_queued(&data->beacon_timer.timer) &&
1535 info->enable_beacon) { 1607 info->enable_beacon) {
1536 u64 tsf, until_tbtt; 1608 u64 tsf, until_tbtt;
1537 u32 bcn_int; 1609 u32 bcn_int;
1538 if (WARN_ON(!data->beacon_int)) 1610 data->beacon_int = info->beacon_int * 1024;
1539 data->beacon_int = 1000 * 1024;
1540 tsf = mac80211_hwsim_get_tsf(hw, vif); 1611 tsf = mac80211_hwsim_get_tsf(hw, vif);
1541 bcn_int = data->beacon_int; 1612 bcn_int = data->beacon_int;
1542 until_tbtt = bcn_int - do_div(tsf, bcn_int); 1613 until_tbtt = bcn_int - do_div(tsf, bcn_int);
@@ -1550,8 +1621,10 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
1550 mac80211_hwsim_bcn_en_iter, &count); 1621 mac80211_hwsim_bcn_en_iter, &count);
1551 wiphy_debug(hw->wiphy, " beaconing vifs remaining: %u", 1622 wiphy_debug(hw->wiphy, " beaconing vifs remaining: %u",
1552 count); 1623 count);
1553 if (count == 0) 1624 if (count == 0) {
1554 tasklet_hrtimer_cancel(&data->beacon_timer); 1625 tasklet_hrtimer_cancel(&data->beacon_timer);
1626 data->beacon_int = 0;
1627 }
1555 } 1628 }
1556 } 1629 }
1557 1630
@@ -1911,7 +1984,7 @@ static void mac80211_hwsim_sw_scan_complete(struct ieee80211_hw *hw,
1911 1984
1912 printk(KERN_DEBUG "hwsim sw_scan_complete\n"); 1985 printk(KERN_DEBUG "hwsim sw_scan_complete\n");
1913 hwsim->scanning = false; 1986 hwsim->scanning = false;
1914 memset(hwsim->scan_addr, 0, ETH_ALEN); 1987 eth_zero_addr(hwsim->scan_addr);
1915 1988
1916 mutex_unlock(&hwsim->mutex); 1989 mutex_unlock(&hwsim->mutex);
1917} 1990}
@@ -2267,7 +2340,7 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
2267 skb_queue_head_init(&data->pending); 2340 skb_queue_head_init(&data->pending);
2268 2341
2269 SET_IEEE80211_DEV(hw, data->dev); 2342 SET_IEEE80211_DEV(hw, data->dev);
2270 memset(addr, 0, ETH_ALEN); 2343 eth_zero_addr(addr);
2271 addr[0] = 0x02; 2344 addr[0] = 0x02;
2272 addr[3] = idx >> 8; 2345 addr[3] = idx >> 8;
2273 addr[4] = idx; 2346 addr[4] = idx;
@@ -2420,6 +2493,12 @@ static int mac80211_hwsim_new_radio(struct genl_info *info,
2420 hw->max_rates = 4; 2493 hw->max_rates = 4;
2421 hw->max_rate_tries = 11; 2494 hw->max_rate_tries = 11;
2422 2495
2496 hw->wiphy->vendor_commands = mac80211_hwsim_vendor_commands;
2497 hw->wiphy->n_vendor_commands =
2498 ARRAY_SIZE(mac80211_hwsim_vendor_commands);
2499 hw->wiphy->vendor_events = mac80211_hwsim_vendor_events;
2500 hw->wiphy->n_vendor_events = ARRAY_SIZE(mac80211_hwsim_vendor_events);
2501
2423 if (param->reg_strict) 2502 if (param->reg_strict)
2424 hw->wiphy->regulatory_flags |= REGULATORY_STRICT_REG; 2503 hw->wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
2425 if (param->regd) { 2504 if (param->regd) {
@@ -2600,7 +2679,7 @@ static void hwsim_mon_setup(struct net_device *dev)
2600 ether_setup(dev); 2679 ether_setup(dev);
2601 dev->tx_queue_len = 0; 2680 dev->tx_queue_len = 0;
2602 dev->type = ARPHRD_IEEE80211_RADIOTAP; 2681 dev->type = ARPHRD_IEEE80211_RADIOTAP;
2603 memset(dev->dev_addr, 0, ETH_ALEN); 2682 eth_zero_addr(dev->dev_addr);
2604 dev->dev_addr[0] = 0x12; 2683 dev->dev_addr[0] = 0x12;
2605} 2684}
2606 2685
@@ -2611,7 +2690,7 @@ static struct mac80211_hwsim_data *get_hwsim_data_ref_from_addr(const u8 *addr)
2611 2690
2612 spin_lock_bh(&hwsim_radio_lock); 2691 spin_lock_bh(&hwsim_radio_lock);
2613 list_for_each_entry(data, &hwsim_radios, list) { 2692 list_for_each_entry(data, &hwsim_radios, list) {
2614 if (memcmp(data->addresses[1].addr, addr, ETH_ALEN) == 0) { 2693 if (mac80211_hwsim_addr_match(data, addr)) {
2615 _found = true; 2694 _found = true;
2616 break; 2695 break;
2617 } 2696 }
diff --git a/drivers/net/wireless/mwifiex/11n.c b/drivers/net/wireless/mwifiex/11n.c
index 543148d27b01..433bd6837c79 100644
--- a/drivers/net/wireless/mwifiex/11n.c
+++ b/drivers/net/wireless/mwifiex/11n.c
@@ -159,6 +159,7 @@ int mwifiex_ret_11n_addba_req(struct mwifiex_private *priv,
159 int tid; 159 int tid;
160 struct host_cmd_ds_11n_addba_rsp *add_ba_rsp = &resp->params.add_ba_rsp; 160 struct host_cmd_ds_11n_addba_rsp *add_ba_rsp = &resp->params.add_ba_rsp;
161 struct mwifiex_tx_ba_stream_tbl *tx_ba_tbl; 161 struct mwifiex_tx_ba_stream_tbl *tx_ba_tbl;
162 struct mwifiex_ra_list_tbl *ra_list;
162 u16 block_ack_param_set = le16_to_cpu(add_ba_rsp->block_ack_param_set); 163 u16 block_ack_param_set = le16_to_cpu(add_ba_rsp->block_ack_param_set);
163 164
164 add_ba_rsp->ssn = cpu_to_le16((le16_to_cpu(add_ba_rsp->ssn)) 165 add_ba_rsp->ssn = cpu_to_le16((le16_to_cpu(add_ba_rsp->ssn))
@@ -166,7 +167,13 @@ int mwifiex_ret_11n_addba_req(struct mwifiex_private *priv,
166 167
167 tid = (block_ack_param_set & IEEE80211_ADDBA_PARAM_TID_MASK) 168 tid = (block_ack_param_set & IEEE80211_ADDBA_PARAM_TID_MASK)
168 >> BLOCKACKPARAM_TID_POS; 169 >> BLOCKACKPARAM_TID_POS;
170 ra_list = mwifiex_wmm_get_ralist_node(priv, tid, add_ba_rsp->
171 peer_mac_addr);
169 if (le16_to_cpu(add_ba_rsp->status_code) != BA_RESULT_SUCCESS) { 172 if (le16_to_cpu(add_ba_rsp->status_code) != BA_RESULT_SUCCESS) {
173 if (ra_list) {
174 ra_list->ba_status = BA_SETUP_NONE;
175 ra_list->amsdu_in_ampdu = false;
176 }
170 mwifiex_del_ba_tbl(priv, tid, add_ba_rsp->peer_mac_addr, 177 mwifiex_del_ba_tbl(priv, tid, add_ba_rsp->peer_mac_addr,
171 TYPE_DELBA_SENT, true); 178 TYPE_DELBA_SENT, true);
172 if (add_ba_rsp->add_rsp_result != BA_RESULT_TIMEOUT) 179 if (add_ba_rsp->add_rsp_result != BA_RESULT_TIMEOUT)
@@ -185,6 +192,10 @@ int mwifiex_ret_11n_addba_req(struct mwifiex_private *priv,
185 tx_ba_tbl->amsdu = true; 192 tx_ba_tbl->amsdu = true;
186 else 193 else
187 tx_ba_tbl->amsdu = false; 194 tx_ba_tbl->amsdu = false;
195 if (ra_list) {
196 ra_list->amsdu_in_ampdu = tx_ba_tbl->amsdu;
197 ra_list->ba_status = BA_SETUP_COMPLETE;
198 }
188 } else { 199 } else {
189 dev_err(priv->adapter->dev, "BA stream not created\n"); 200 dev_err(priv->adapter->dev, "BA stream not created\n");
190 } 201 }
@@ -515,6 +526,7 @@ void mwifiex_create_ba_tbl(struct mwifiex_private *priv, u8 *ra, int tid,
515 enum mwifiex_ba_status ba_status) 526 enum mwifiex_ba_status ba_status)
516{ 527{
517 struct mwifiex_tx_ba_stream_tbl *new_node; 528 struct mwifiex_tx_ba_stream_tbl *new_node;
529 struct mwifiex_ra_list_tbl *ra_list;
518 unsigned long flags; 530 unsigned long flags;
519 531
520 if (!mwifiex_get_ba_tbl(priv, tid, ra)) { 532 if (!mwifiex_get_ba_tbl(priv, tid, ra)) {
@@ -522,7 +534,11 @@ void mwifiex_create_ba_tbl(struct mwifiex_private *priv, u8 *ra, int tid,
522 GFP_ATOMIC); 534 GFP_ATOMIC);
523 if (!new_node) 535 if (!new_node)
524 return; 536 return;
525 537 ra_list = mwifiex_wmm_get_ralist_node(priv, tid, ra);
538 if (ra_list) {
539 ra_list->ba_status = ba_status;
540 ra_list->amsdu_in_ampdu = false;
541 }
526 INIT_LIST_HEAD(&new_node->list); 542 INIT_LIST_HEAD(&new_node->list);
527 543
528 new_node->tid = tid; 544 new_node->tid = tid;
diff --git a/drivers/net/wireless/mwifiex/11n.h b/drivers/net/wireless/mwifiex/11n.h
index 8e2e39422ad8..afdd58aa90de 100644
--- a/drivers/net/wireless/mwifiex/11n.h
+++ b/drivers/net/wireless/mwifiex/11n.h
@@ -77,22 +77,6 @@ mwifiex_is_station_ampdu_allowed(struct mwifiex_private *priv,
77 return (node->ampdu_sta[tid] != BA_STREAM_NOT_ALLOWED) ? true : false; 77 return (node->ampdu_sta[tid] != BA_STREAM_NOT_ALLOWED) ? true : false;
78} 78}
79 79
80/* This function checks whether AMSDU is allowed for BA stream. */
81static inline u8
82mwifiex_is_amsdu_in_ampdu_allowed(struct mwifiex_private *priv,
83 struct mwifiex_ra_list_tbl *ptr, int tid)
84{
85 struct mwifiex_tx_ba_stream_tbl *tx_tbl;
86
87 if (is_broadcast_ether_addr(ptr->ra))
88 return false;
89 tx_tbl = mwifiex_get_ba_tbl(priv, tid, ptr->ra);
90 if (tx_tbl)
91 return tx_tbl->amsdu;
92
93 return false;
94}
95
96/* This function checks whether AMPDU is allowed or not for a particular TID. */ 80/* This function checks whether AMPDU is allowed or not for a particular TID. */
97static inline u8 81static inline u8
98mwifiex_is_ampdu_allowed(struct mwifiex_private *priv, 82mwifiex_is_ampdu_allowed(struct mwifiex_private *priv,
@@ -182,22 +166,6 @@ mwifiex_find_stream_to_delete(struct mwifiex_private *priv, int ptr_tid,
182} 166}
183 167
184/* 168/*
185 * This function checks whether BA stream is set up or not.
186 */
187static inline int
188mwifiex_is_ba_stream_setup(struct mwifiex_private *priv,
189 struct mwifiex_ra_list_tbl *ptr, int tid)
190{
191 struct mwifiex_tx_ba_stream_tbl *tx_tbl;
192
193 tx_tbl = mwifiex_get_ba_tbl(priv, tid, ptr->ra);
194 if (tx_tbl && IS_BASTREAM_SETUP(tx_tbl))
195 return true;
196
197 return false;
198}
199
200/*
201 * This function checks whether associated station is 11n enabled 169 * This function checks whether associated station is 11n enabled
202 */ 170 */
203static inline int mwifiex_is_sta_11n_enabled(struct mwifiex_private *priv, 171static inline int mwifiex_is_sta_11n_enabled(struct mwifiex_private *priv,
diff --git a/drivers/net/wireless/mwifiex/11n_aggr.c b/drivers/net/wireless/mwifiex/11n_aggr.c
index 9b983b5cebbd..6183e255e62a 100644
--- a/drivers/net/wireless/mwifiex/11n_aggr.c
+++ b/drivers/net/wireless/mwifiex/11n_aggr.c
@@ -170,7 +170,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
170 struct mwifiex_adapter *adapter = priv->adapter; 170 struct mwifiex_adapter *adapter = priv->adapter;
171 struct sk_buff *skb_aggr, *skb_src; 171 struct sk_buff *skb_aggr, *skb_src;
172 struct mwifiex_txinfo *tx_info_aggr, *tx_info_src; 172 struct mwifiex_txinfo *tx_info_aggr, *tx_info_src;
173 int pad = 0, ret; 173 int pad = 0, aggr_num = 0, ret;
174 struct mwifiex_tx_param tx_param; 174 struct mwifiex_tx_param tx_param;
175 struct txpd *ptx_pd = NULL; 175 struct txpd *ptx_pd = NULL;
176 struct timeval tv; 176 struct timeval tv;
@@ -184,7 +184,8 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
184 } 184 }
185 185
186 tx_info_src = MWIFIEX_SKB_TXCB(skb_src); 186 tx_info_src = MWIFIEX_SKB_TXCB(skb_src);
187 skb_aggr = dev_alloc_skb(adapter->tx_buf_size); 187 skb_aggr = mwifiex_alloc_dma_align_buf(adapter->tx_buf_size,
188 GFP_ATOMIC | GFP_DMA);
188 if (!skb_aggr) { 189 if (!skb_aggr) {
189 dev_err(adapter->dev, "%s: alloc skb_aggr\n", __func__); 190 dev_err(adapter->dev, "%s: alloc skb_aggr\n", __func__);
190 spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, 191 spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
@@ -200,6 +201,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
200 201
201 if (tx_info_src->flags & MWIFIEX_BUF_FLAG_TDLS_PKT) 202 if (tx_info_src->flags & MWIFIEX_BUF_FLAG_TDLS_PKT)
202 tx_info_aggr->flags |= MWIFIEX_BUF_FLAG_TDLS_PKT; 203 tx_info_aggr->flags |= MWIFIEX_BUF_FLAG_TDLS_PKT;
204 tx_info_aggr->flags |= MWIFIEX_BUF_FLAG_AGGR_PKT;
203 skb_aggr->priority = skb_src->priority; 205 skb_aggr->priority = skb_src->priority;
204 206
205 do_gettimeofday(&tv); 207 do_gettimeofday(&tv);
@@ -211,11 +213,9 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
211 break; 213 break;
212 214
213 skb_src = skb_dequeue(&pra_list->skb_head); 215 skb_src = skb_dequeue(&pra_list->skb_head);
214
215 pra_list->total_pkt_count--; 216 pra_list->total_pkt_count--;
216
217 atomic_dec(&priv->wmm.tx_pkts_queued); 217 atomic_dec(&priv->wmm.tx_pkts_queued);
218 218 aggr_num++;
219 spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock, 219 spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
220 ra_list_flags); 220 ra_list_flags);
221 mwifiex_11n_form_amsdu_pkt(skb_aggr, skb_src, &pad); 221 mwifiex_11n_form_amsdu_pkt(skb_aggr, skb_src, &pad);
@@ -251,6 +251,12 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
251 ptx_pd = (struct txpd *)skb_aggr->data; 251 ptx_pd = (struct txpd *)skb_aggr->data;
252 252
253 skb_push(skb_aggr, headroom); 253 skb_push(skb_aggr, headroom);
254 tx_info_aggr->aggr_num = aggr_num * 2;
255 if (adapter->data_sent || adapter->tx_lock_flag) {
256 atomic_add(aggr_num * 2, &adapter->tx_queued);
257 skb_queue_tail(&adapter->tx_data_q, skb_aggr);
258 return 0;
259 }
254 260
255 if (adapter->iface_type == MWIFIEX_USB) { 261 if (adapter->iface_type == MWIFIEX_USB) {
256 adapter->data_sent = true; 262 adapter->data_sent = true;
diff --git a/drivers/net/wireless/mwifiex/11n_rxreorder.c b/drivers/net/wireless/mwifiex/11n_rxreorder.c
index a2e8817b56d8..f75f8acfaca0 100644
--- a/drivers/net/wireless/mwifiex/11n_rxreorder.c
+++ b/drivers/net/wireless/mwifiex/11n_rxreorder.c
@@ -659,6 +659,7 @@ mwifiex_del_ba_tbl(struct mwifiex_private *priv, int tid, u8 *peer_mac,
659{ 659{
660 struct mwifiex_rx_reorder_tbl *tbl; 660 struct mwifiex_rx_reorder_tbl *tbl;
661 struct mwifiex_tx_ba_stream_tbl *ptx_tbl; 661 struct mwifiex_tx_ba_stream_tbl *ptx_tbl;
662 struct mwifiex_ra_list_tbl *ra_list;
662 u8 cleanup_rx_reorder_tbl; 663 u8 cleanup_rx_reorder_tbl;
663 unsigned long flags; 664 unsigned long flags;
664 665
@@ -686,7 +687,11 @@ mwifiex_del_ba_tbl(struct mwifiex_private *priv, int tid, u8 *peer_mac,
686 "event: TID, RA not found in table\n"); 687 "event: TID, RA not found in table\n");
687 return; 688 return;
688 } 689 }
689 690 ra_list = mwifiex_wmm_get_ralist_node(priv, tid, peer_mac);
691 if (ra_list) {
692 ra_list->amsdu_in_ampdu = false;
693 ra_list->ba_status = BA_SETUP_NONE;
694 }
690 spin_lock_irqsave(&priv->tx_ba_stream_tbl_lock, flags); 695 spin_lock_irqsave(&priv->tx_ba_stream_tbl_lock, flags);
691 mwifiex_11n_delete_tx_ba_stream_tbl_entry(priv, ptx_tbl); 696 mwifiex_11n_delete_tx_ba_stream_tbl_entry(priv, ptx_tbl);
692 spin_unlock_irqrestore(&priv->tx_ba_stream_tbl_lock, flags); 697 spin_unlock_irqrestore(&priv->tx_ba_stream_tbl_lock, flags);
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c
index 41c8e25df954..bf9020ff2d33 100644
--- a/drivers/net/wireless/mwifiex/cfg80211.c
+++ b/drivers/net/wireless/mwifiex/cfg80211.c
@@ -717,6 +717,9 @@ mwifiex_cfg80211_init_p2p_go(struct mwifiex_private *priv)
717 717
718static int mwifiex_deinit_priv_params(struct mwifiex_private *priv) 718static int mwifiex_deinit_priv_params(struct mwifiex_private *priv)
719{ 719{
720 struct mwifiex_adapter *adapter = priv->adapter;
721 unsigned long flags;
722
720 priv->mgmt_frame_mask = 0; 723 priv->mgmt_frame_mask = 0;
721 if (mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG, 724 if (mwifiex_send_cmd(priv, HostCmd_CMD_MGMT_FRAME_REG,
722 HostCmd_ACT_GEN_SET, 0, 725 HostCmd_ACT_GEN_SET, 0,
@@ -727,6 +730,25 @@ static int mwifiex_deinit_priv_params(struct mwifiex_private *priv)
727 } 730 }
728 731
729 mwifiex_deauthenticate(priv, NULL); 732 mwifiex_deauthenticate(priv, NULL);
733
734 spin_lock_irqsave(&adapter->main_proc_lock, flags);
735 adapter->main_locked = true;
736 if (adapter->mwifiex_processing) {
737 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
738 flush_workqueue(adapter->workqueue);
739 } else {
740 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
741 }
742
743 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
744 adapter->rx_locked = true;
745 if (adapter->rx_processing) {
746 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
747 flush_workqueue(adapter->rx_workqueue);
748 } else {
749 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
750 }
751
730 mwifiex_free_priv(priv); 752 mwifiex_free_priv(priv);
731 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED; 753 priv->wdev.iftype = NL80211_IFTYPE_UNSPECIFIED;
732 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; 754 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
@@ -740,6 +762,9 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv,
740 struct net_device *dev, 762 struct net_device *dev,
741 enum nl80211_iftype type) 763 enum nl80211_iftype type)
742{ 764{
765 struct mwifiex_adapter *adapter = priv->adapter;
766 unsigned long flags;
767
743 mwifiex_init_priv(priv); 768 mwifiex_init_priv(priv);
744 769
745 priv->bss_mode = type; 770 priv->bss_mode = type;
@@ -770,6 +795,14 @@ mwifiex_init_new_priv_params(struct mwifiex_private *priv,
770 return -EOPNOTSUPP; 795 return -EOPNOTSUPP;
771 } 796 }
772 797
798 spin_lock_irqsave(&adapter->main_proc_lock, flags);
799 adapter->main_locked = false;
800 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
801
802 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
803 adapter->rx_locked = false;
804 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
805
773 return 0; 806 return 0;
774} 807}
775 808
@@ -1563,7 +1596,7 @@ mwifiex_cfg80211_del_station(struct wiphy *wiphy, struct net_device *dev,
1563 1596
1564 wiphy_dbg(wiphy, "%s: mac address %pM\n", __func__, params->mac); 1597 wiphy_dbg(wiphy, "%s: mac address %pM\n", __func__, params->mac);
1565 1598
1566 memset(deauth_mac, 0, ETH_ALEN); 1599 eth_zero_addr(deauth_mac);
1567 1600
1568 spin_lock_irqsave(&priv->sta_list_spinlock, flags); 1601 spin_lock_irqsave(&priv->sta_list_spinlock, flags);
1569 sta_node = mwifiex_get_sta_entry(priv, params->mac); 1602 sta_node = mwifiex_get_sta_entry(priv, params->mac);
@@ -1786,7 +1819,7 @@ mwifiex_cfg80211_disconnect(struct wiphy *wiphy, struct net_device *dev,
1786 wiphy_dbg(wiphy, "info: successfully disconnected from %pM:" 1819 wiphy_dbg(wiphy, "info: successfully disconnected from %pM:"
1787 " reason code %d\n", priv->cfg_bssid, reason_code); 1820 " reason code %d\n", priv->cfg_bssid, reason_code);
1788 1821
1789 memset(priv->cfg_bssid, 0, ETH_ALEN); 1822 eth_zero_addr(priv->cfg_bssid);
1790 priv->hs2_enabled = false; 1823 priv->hs2_enabled = false;
1791 1824
1792 return 0; 1825 return 0;
@@ -1954,13 +1987,13 @@ done:
1954 if (mode == NL80211_IFTYPE_ADHOC) 1987 if (mode == NL80211_IFTYPE_ADHOC)
1955 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, 1988 bss = cfg80211_get_bss(priv->wdev.wiphy, channel,
1956 bssid, ssid, ssid_len, 1989 bssid, ssid, ssid_len,
1957 WLAN_CAPABILITY_IBSS, 1990 IEEE80211_BSS_TYPE_IBSS,
1958 WLAN_CAPABILITY_IBSS); 1991 IEEE80211_PRIVACY_ANY);
1959 else 1992 else
1960 bss = cfg80211_get_bss(priv->wdev.wiphy, channel, 1993 bss = cfg80211_get_bss(priv->wdev.wiphy, channel,
1961 bssid, ssid, ssid_len, 1994 bssid, ssid, ssid_len,
1962 WLAN_CAPABILITY_ESS, 1995 IEEE80211_BSS_TYPE_ESS,
1963 WLAN_CAPABILITY_ESS); 1996 IEEE80211_PRIVACY_ANY);
1964 1997
1965 if (!bss) { 1998 if (!bss) {
1966 if (is_scanning_required) { 1999 if (is_scanning_required) {
@@ -2046,7 +2079,7 @@ mwifiex_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
2046 dev_dbg(priv->adapter->dev, 2079 dev_dbg(priv->adapter->dev,
2047 "info: association to bssid %pM failed\n", 2080 "info: association to bssid %pM failed\n",
2048 priv->cfg_bssid); 2081 priv->cfg_bssid);
2049 memset(priv->cfg_bssid, 0, ETH_ALEN); 2082 eth_zero_addr(priv->cfg_bssid);
2050 2083
2051 if (ret > 0) 2084 if (ret > 0)
2052 cfg80211_connect_result(priv->netdev, priv->cfg_bssid, 2085 cfg80211_connect_result(priv->netdev, priv->cfg_bssid,
@@ -2194,7 +2227,7 @@ mwifiex_cfg80211_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
2194 if (mwifiex_deauthenticate(priv, NULL)) 2227 if (mwifiex_deauthenticate(priv, NULL))
2195 return -EFAULT; 2228 return -EFAULT;
2196 2229
2197 memset(priv->cfg_bssid, 0, ETH_ALEN); 2230 eth_zero_addr(priv->cfg_bssid);
2198 2231
2199 return 0; 2232 return 0;
2200} 2233}
@@ -2397,12 +2430,12 @@ mwifiex_setup_ht_caps(struct ieee80211_sta_ht_cap *ht_info,
2397 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; 2430 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
2398} 2431}
2399 2432
2400#define MWIFIEX_MAX_WQ_LEN 30
2401/* 2433/*
2402 * create a new virtual interface with the given name 2434 * create a new virtual interface with the given name and name assign type
2403 */ 2435 */
2404struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy, 2436struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
2405 const char *name, 2437 const char *name,
2438 unsigned char name_assign_type,
2406 enum nl80211_iftype type, 2439 enum nl80211_iftype type,
2407 u32 *flags, 2440 u32 *flags,
2408 struct vif_params *params) 2441 struct vif_params *params)
@@ -2411,7 +2444,6 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
2411 struct mwifiex_private *priv; 2444 struct mwifiex_private *priv;
2412 struct net_device *dev; 2445 struct net_device *dev;
2413 void *mdev_priv; 2446 void *mdev_priv;
2414 char dfs_cac_str[MWIFIEX_MAX_WQ_LEN], dfs_chsw_str[MWIFIEX_MAX_WQ_LEN];
2415 2447
2416 if (!adapter) 2448 if (!adapter)
2417 return ERR_PTR(-EFAULT); 2449 return ERR_PTR(-EFAULT);
@@ -2523,7 +2555,7 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
2523 } 2555 }
2524 2556
2525 dev = alloc_netdev_mqs(sizeof(struct mwifiex_private *), name, 2557 dev = alloc_netdev_mqs(sizeof(struct mwifiex_private *), name,
2526 NET_NAME_UNKNOWN, ether_setup, 2558 name_assign_type, ether_setup,
2527 IEEE80211_NUM_ACS, 1); 2559 IEEE80211_NUM_ACS, 1);
2528 if (!dev) { 2560 if (!dev) {
2529 wiphy_err(wiphy, "no memory available for netdevice\n"); 2561 wiphy_err(wiphy, "no memory available for netdevice\n");
@@ -2576,12 +2608,10 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
2576 return ERR_PTR(-EFAULT); 2608 return ERR_PTR(-EFAULT);
2577 } 2609 }
2578 2610
2579 strcpy(dfs_cac_str, "MWIFIEX_DFS_CAC"); 2611 priv->dfs_cac_workqueue = alloc_workqueue("MWIFIEX_DFS_CAC%s",
2580 strcat(dfs_cac_str, name);
2581 priv->dfs_cac_workqueue = alloc_workqueue(dfs_cac_str,
2582 WQ_HIGHPRI | 2612 WQ_HIGHPRI |
2583 WQ_MEM_RECLAIM | 2613 WQ_MEM_RECLAIM |
2584 WQ_UNBOUND, 1); 2614 WQ_UNBOUND, 1, name);
2585 if (!priv->dfs_cac_workqueue) { 2615 if (!priv->dfs_cac_workqueue) {
2586 wiphy_err(wiphy, "cannot register virtual network device\n"); 2616 wiphy_err(wiphy, "cannot register virtual network device\n");
2587 free_netdev(dev); 2617 free_netdev(dev);
@@ -2594,11 +2624,9 @@ struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
2594 2624
2595 INIT_DELAYED_WORK(&priv->dfs_cac_work, mwifiex_dfs_cac_work_queue); 2625 INIT_DELAYED_WORK(&priv->dfs_cac_work, mwifiex_dfs_cac_work_queue);
2596 2626
2597 strcpy(dfs_chsw_str, "MWIFIEX_DFS_CHSW"); 2627 priv->dfs_chan_sw_workqueue = alloc_workqueue("MWIFIEX_DFS_CHSW%s",
2598 strcat(dfs_chsw_str, name);
2599 priv->dfs_chan_sw_workqueue = alloc_workqueue(dfs_chsw_str,
2600 WQ_HIGHPRI | WQ_UNBOUND | 2628 WQ_HIGHPRI | WQ_UNBOUND |
2601 WQ_MEM_RECLAIM, 1); 2629 WQ_MEM_RECLAIM, 1, name);
2602 if (!priv->dfs_chan_sw_workqueue) { 2630 if (!priv->dfs_chan_sw_workqueue) {
2603 wiphy_err(wiphy, "cannot register virtual network device\n"); 2631 wiphy_err(wiphy, "cannot register virtual network device\n");
2604 free_netdev(dev); 2632 free_netdev(dev);
@@ -2738,24 +2766,71 @@ mwifiex_is_pattern_supported(struct cfg80211_pkt_pattern *pat, s8 *byte_seq,
2738} 2766}
2739 2767
2740#ifdef CONFIG_PM 2768#ifdef CONFIG_PM
2741static int mwifiex_set_mef_filter(struct mwifiex_private *priv, 2769static void mwifiex_set_auto_arp_mef_entry(struct mwifiex_private *priv,
2742 struct cfg80211_wowlan *wowlan) 2770 struct mwifiex_mef_entry *mef_entry)
2771{
2772 int i, filt_num = 0, num_ipv4 = 0;
2773 struct in_device *in_dev;
2774 struct in_ifaddr *ifa;
2775 __be32 ips[MWIFIEX_MAX_SUPPORTED_IPADDR];
2776 struct mwifiex_adapter *adapter = priv->adapter;
2777
2778 mef_entry->mode = MEF_MODE_HOST_SLEEP;
2779 mef_entry->action = MEF_ACTION_AUTO_ARP;
2780
2781 /* Enable ARP offload feature */
2782 memset(ips, 0, sizeof(ips));
2783 for (i = 0; i < MWIFIEX_MAX_BSS_NUM; i++) {
2784 if (adapter->priv[i]->netdev) {
2785 in_dev = __in_dev_get_rtnl(adapter->priv[i]->netdev);
2786 if (!in_dev)
2787 continue;
2788 ifa = in_dev->ifa_list;
2789 if (!ifa || !ifa->ifa_local)
2790 continue;
2791 ips[i] = ifa->ifa_local;
2792 num_ipv4++;
2793 }
2794 }
2795
2796 for (i = 0; i < num_ipv4; i++) {
2797 if (!ips[i])
2798 continue;
2799 mef_entry->filter[filt_num].repeat = 1;
2800 memcpy(mef_entry->filter[filt_num].byte_seq,
2801 (u8 *)&ips[i], sizeof(ips[i]));
2802 mef_entry->filter[filt_num].
2803 byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] =
2804 sizeof(ips[i]);
2805 mef_entry->filter[filt_num].offset = 46;
2806 mef_entry->filter[filt_num].filt_type = TYPE_EQ;
2807 if (filt_num) {
2808 mef_entry->filter[filt_num].filt_action =
2809 TYPE_OR;
2810 }
2811 filt_num++;
2812 }
2813
2814 mef_entry->filter[filt_num].repeat = 1;
2815 mef_entry->filter[filt_num].byte_seq[0] = 0x08;
2816 mef_entry->filter[filt_num].byte_seq[1] = 0x06;
2817 mef_entry->filter[filt_num].byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] = 2;
2818 mef_entry->filter[filt_num].offset = 20;
2819 mef_entry->filter[filt_num].filt_type = TYPE_EQ;
2820 mef_entry->filter[filt_num].filt_action = TYPE_AND;
2821}
2822
2823static int mwifiex_set_wowlan_mef_entry(struct mwifiex_private *priv,
2824 struct mwifiex_ds_mef_cfg *mef_cfg,
2825 struct mwifiex_mef_entry *mef_entry,
2826 struct cfg80211_wowlan *wowlan)
2743{ 2827{
2744 int i, filt_num = 0, ret = 0; 2828 int i, filt_num = 0, ret = 0;
2745 bool first_pat = true; 2829 bool first_pat = true;
2746 u8 byte_seq[MWIFIEX_MEF_MAX_BYTESEQ + 1]; 2830 u8 byte_seq[MWIFIEX_MEF_MAX_BYTESEQ + 1];
2747 const u8 ipv4_mc_mac[] = {0x33, 0x33}; 2831 const u8 ipv4_mc_mac[] = {0x33, 0x33};
2748 const u8 ipv6_mc_mac[] = {0x01, 0x00, 0x5e}; 2832 const u8 ipv6_mc_mac[] = {0x01, 0x00, 0x5e};
2749 struct mwifiex_ds_mef_cfg mef_cfg;
2750 struct mwifiex_mef_entry *mef_entry;
2751 2833
2752 mef_entry = kzalloc(sizeof(*mef_entry), GFP_KERNEL);
2753 if (!mef_entry)
2754 return -ENOMEM;
2755
2756 memset(&mef_cfg, 0, sizeof(mef_cfg));
2757 mef_cfg.num_entries = 1;
2758 mef_cfg.mef_entry = mef_entry;
2759 mef_entry->mode = MEF_MODE_HOST_SLEEP; 2834 mef_entry->mode = MEF_MODE_HOST_SLEEP;
2760 mef_entry->action = MEF_ACTION_ALLOW_AND_WAKEUP_HOST; 2835 mef_entry->action = MEF_ACTION_ALLOW_AND_WAKEUP_HOST;
2761 2836
@@ -2772,20 +2847,19 @@ static int mwifiex_set_mef_filter(struct mwifiex_private *priv,
2772 if (!wowlan->patterns[i].pkt_offset) { 2847 if (!wowlan->patterns[i].pkt_offset) {
2773 if (!(byte_seq[0] & 0x01) && 2848 if (!(byte_seq[0] & 0x01) &&
2774 (byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] == 1)) { 2849 (byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] == 1)) {
2775 mef_cfg.criteria |= MWIFIEX_CRITERIA_UNICAST; 2850 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST;
2776 continue; 2851 continue;
2777 } else if (is_broadcast_ether_addr(byte_seq)) { 2852 } else if (is_broadcast_ether_addr(byte_seq)) {
2778 mef_cfg.criteria |= MWIFIEX_CRITERIA_BROADCAST; 2853 mef_cfg->criteria |= MWIFIEX_CRITERIA_BROADCAST;
2779 continue; 2854 continue;
2780 } else if ((!memcmp(byte_seq, ipv4_mc_mac, 2) && 2855 } else if ((!memcmp(byte_seq, ipv4_mc_mac, 2) &&
2781 (byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] == 2)) || 2856 (byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] == 2)) ||
2782 (!memcmp(byte_seq, ipv6_mc_mac, 3) && 2857 (!memcmp(byte_seq, ipv6_mc_mac, 3) &&
2783 (byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] == 3))) { 2858 (byte_seq[MWIFIEX_MEF_MAX_BYTESEQ] == 3))) {
2784 mef_cfg.criteria |= MWIFIEX_CRITERIA_MULTICAST; 2859 mef_cfg->criteria |= MWIFIEX_CRITERIA_MULTICAST;
2785 continue; 2860 continue;
2786 } 2861 }
2787 } 2862 }
2788
2789 mef_entry->filter[filt_num].repeat = 1; 2863 mef_entry->filter[filt_num].repeat = 1;
2790 mef_entry->filter[filt_num].offset = 2864 mef_entry->filter[filt_num].offset =
2791 wowlan->patterns[i].pkt_offset; 2865 wowlan->patterns[i].pkt_offset;
@@ -2802,7 +2876,7 @@ static int mwifiex_set_mef_filter(struct mwifiex_private *priv,
2802 } 2876 }
2803 2877
2804 if (wowlan->magic_pkt) { 2878 if (wowlan->magic_pkt) {
2805 mef_cfg.criteria |= MWIFIEX_CRITERIA_UNICAST; 2879 mef_cfg->criteria |= MWIFIEX_CRITERIA_UNICAST;
2806 mef_entry->filter[filt_num].repeat = 16; 2880 mef_entry->filter[filt_num].repeat = 16;
2807 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr, 2881 memcpy(mef_entry->filter[filt_num].byte_seq, priv->curr_addr,
2808 ETH_ALEN); 2882 ETH_ALEN);
@@ -2823,6 +2897,34 @@ static int mwifiex_set_mef_filter(struct mwifiex_private *priv,
2823 mef_entry->filter[filt_num].filt_type = TYPE_EQ; 2897 mef_entry->filter[filt_num].filt_type = TYPE_EQ;
2824 mef_entry->filter[filt_num].filt_action = TYPE_OR; 2898 mef_entry->filter[filt_num].filt_action = TYPE_OR;
2825 } 2899 }
2900 return ret;
2901}
2902
2903static int mwifiex_set_mef_filter(struct mwifiex_private *priv,
2904 struct cfg80211_wowlan *wowlan)
2905{
2906 int ret = 0, num_entries = 1;
2907 struct mwifiex_ds_mef_cfg mef_cfg;
2908 struct mwifiex_mef_entry *mef_entry;
2909
2910 if (wowlan->n_patterns || wowlan->magic_pkt)
2911 num_entries++;
2912
2913 mef_entry = kcalloc(num_entries, sizeof(*mef_entry), GFP_KERNEL);
2914 if (!mef_entry)
2915 return -ENOMEM;
2916
2917 memset(&mef_cfg, 0, sizeof(mef_cfg));
2918 mef_cfg.criteria |= MWIFIEX_CRITERIA_BROADCAST |
2919 MWIFIEX_CRITERIA_UNICAST;
2920 mef_cfg.num_entries = num_entries;
2921 mef_cfg.mef_entry = mef_entry;
2922
2923 mwifiex_set_auto_arp_mef_entry(priv, &mef_entry[0]);
2924
2925 if (wowlan->n_patterns || wowlan->magic_pkt)
2926 ret = mwifiex_set_wowlan_mef_entry(priv, &mef_cfg,
2927 &mef_entry[1], wowlan);
2826 2928
2827 if (!mef_cfg.criteria) 2929 if (!mef_cfg.criteria)
2828 mef_cfg.criteria = MWIFIEX_CRITERIA_BROADCAST | 2930 mef_cfg.criteria = MWIFIEX_CRITERIA_BROADCAST |
@@ -2830,8 +2932,8 @@ static int mwifiex_set_mef_filter(struct mwifiex_private *priv,
2830 MWIFIEX_CRITERIA_MULTICAST; 2932 MWIFIEX_CRITERIA_MULTICAST;
2831 2933
2832 ret = mwifiex_send_cmd(priv, HostCmd_CMD_MEF_CFG, 2934 ret = mwifiex_send_cmd(priv, HostCmd_CMD_MEF_CFG,
2833 HostCmd_ACT_GEN_SET, 0, &mef_cfg, true); 2935 HostCmd_ACT_GEN_SET, 0,
2834 2936 &mef_cfg, true);
2835 kfree(mef_entry); 2937 kfree(mef_entry);
2836 return ret; 2938 return ret;
2837} 2939}
@@ -2841,27 +2943,33 @@ static int mwifiex_cfg80211_suspend(struct wiphy *wiphy,
2841{ 2943{
2842 struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy); 2944 struct mwifiex_adapter *adapter = mwifiex_cfg80211_get_adapter(wiphy);
2843 struct mwifiex_ds_hs_cfg hs_cfg; 2945 struct mwifiex_ds_hs_cfg hs_cfg;
2844 int ret = 0; 2946 int i, ret = 0;
2845 struct mwifiex_private *priv = 2947 struct mwifiex_private *priv;
2846 mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA); 2948
2949 for (i = 0; i < adapter->priv_num; i++) {
2950 priv = adapter->priv[i];
2951 mwifiex_abort_cac(priv);
2952 }
2953
2954 mwifiex_cancel_all_pending_cmd(adapter);
2847 2955
2848 if (!wowlan) { 2956 if (!wowlan) {
2849 dev_warn(adapter->dev, "None of the WOWLAN triggers enabled\n"); 2957 dev_warn(adapter->dev, "None of the WOWLAN triggers enabled\n");
2850 return 0; 2958 return 0;
2851 } 2959 }
2852 2960
2961 priv = mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA);
2962
2853 if (!priv->media_connected) { 2963 if (!priv->media_connected) {
2854 dev_warn(adapter->dev, 2964 dev_warn(adapter->dev,
2855 "Can not configure WOWLAN in disconnected state\n"); 2965 "Can not configure WOWLAN in disconnected state\n");
2856 return 0; 2966 return 0;
2857 } 2967 }
2858 2968
2859 if (wowlan->n_patterns || wowlan->magic_pkt) { 2969 ret = mwifiex_set_mef_filter(priv, wowlan);
2860 ret = mwifiex_set_mef_filter(priv, wowlan); 2970 if (ret) {
2861 if (ret) { 2971 dev_err(adapter->dev, "Failed to set MEF filter\n");
2862 dev_err(adapter->dev, "Failed to set MEF filter\n"); 2972 return ret;
2863 return ret;
2864 }
2865 } 2973 }
2866 2974
2867 if (wowlan->disconnect) { 2975 if (wowlan->disconnect) {
diff --git a/drivers/net/wireless/mwifiex/decl.h b/drivers/net/wireless/mwifiex/decl.h
index 88d0eade6bb1..38f24e0427d2 100644
--- a/drivers/net/wireless/mwifiex/decl.h
+++ b/drivers/net/wireless/mwifiex/decl.h
@@ -33,6 +33,7 @@
33#define MWIFIEX_MAX_BSS_NUM (3) 33#define MWIFIEX_MAX_BSS_NUM (3)
34 34
35#define MWIFIEX_DMA_ALIGN_SZ 64 35#define MWIFIEX_DMA_ALIGN_SZ 64
36#define MWIFIEX_RX_HEADROOM 64
36#define MAX_TXPD_SZ 32 37#define MAX_TXPD_SZ 32
37#define INTF_HDR_ALIGN 4 38#define INTF_HDR_ALIGN 4
38 39
@@ -82,6 +83,7 @@
82#define MWIFIEX_BUF_FLAG_TDLS_PKT BIT(2) 83#define MWIFIEX_BUF_FLAG_TDLS_PKT BIT(2)
83#define MWIFIEX_BUF_FLAG_EAPOL_TX_STATUS BIT(3) 84#define MWIFIEX_BUF_FLAG_EAPOL_TX_STATUS BIT(3)
84#define MWIFIEX_BUF_FLAG_ACTION_TX_STATUS BIT(4) 85#define MWIFIEX_BUF_FLAG_ACTION_TX_STATUS BIT(4)
86#define MWIFIEX_BUF_FLAG_AGGR_PKT BIT(5)
85 87
86#define MWIFIEX_BRIDGED_PKTS_THR_HIGH 1024 88#define MWIFIEX_BRIDGED_PKTS_THR_HIGH 1024
87#define MWIFIEX_BRIDGED_PKTS_THR_LOW 128 89#define MWIFIEX_BRIDGED_PKTS_THR_LOW 128
@@ -110,6 +112,11 @@
110 112
111#define MWIFIEX_A_BAND_START_FREQ 5000 113#define MWIFIEX_A_BAND_START_FREQ 5000
112 114
115/* SDIO Aggr data packet special info */
116#define SDIO_MAX_AGGR_BUF_SIZE (256 * 255)
117#define BLOCK_NUMBER_OFFSET 15
118#define SDIO_HEADER_OFFSET 28
119
113enum mwifiex_bss_type { 120enum mwifiex_bss_type {
114 MWIFIEX_BSS_TYPE_STA = 0, 121 MWIFIEX_BSS_TYPE_STA = 0,
115 MWIFIEX_BSS_TYPE_UAP = 1, 122 MWIFIEX_BSS_TYPE_UAP = 1,
@@ -167,10 +174,11 @@ struct mwifiex_wait_queue {
167}; 174};
168 175
169struct mwifiex_rxinfo { 176struct mwifiex_rxinfo {
177 struct sk_buff *parent;
170 u8 bss_num; 178 u8 bss_num;
171 u8 bss_type; 179 u8 bss_type;
172 struct sk_buff *parent;
173 u8 use_count; 180 u8 use_count;
181 u8 buf_type;
174}; 182};
175 183
176struct mwifiex_txinfo { 184struct mwifiex_txinfo {
@@ -178,6 +186,7 @@ struct mwifiex_txinfo {
178 u8 flags; 186 u8 flags;
179 u8 bss_num; 187 u8 bss_num;
180 u8 bss_type; 188 u8 bss_type;
189 u8 aggr_num;
181 u32 pkt_len; 190 u32 pkt_len;
182 u8 ack_frame_id; 191 u8 ack_frame_id;
183 u64 cookie; 192 u64 cookie;
diff --git a/drivers/net/wireless/mwifiex/fw.h b/drivers/net/wireless/mwifiex/fw.h
index df553e86a0ad..59d8964dd0dc 100644
--- a/drivers/net/wireless/mwifiex/fw.h
+++ b/drivers/net/wireless/mwifiex/fw.h
@@ -197,6 +197,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
197 197
198#define ISSUPP_11NENABLED(FwCapInfo) (FwCapInfo & BIT(11)) 198#define ISSUPP_11NENABLED(FwCapInfo) (FwCapInfo & BIT(11))
199#define ISSUPP_TDLS_ENABLED(FwCapInfo) (FwCapInfo & BIT(14)) 199#define ISSUPP_TDLS_ENABLED(FwCapInfo) (FwCapInfo & BIT(14))
200#define ISSUPP_SDIO_SPA_ENABLED(FwCapInfo) (FwCapInfo & BIT(16))
200 201
201#define MWIFIEX_DEF_HT_CAP (IEEE80211_HT_CAP_DSSSCCK40 | \ 202#define MWIFIEX_DEF_HT_CAP (IEEE80211_HT_CAP_DSSSCCK40 | \
202 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT) | \ 203 (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT) | \
@@ -353,6 +354,7 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
353#define HostCmd_CMD_REMAIN_ON_CHAN 0x010d 354#define HostCmd_CMD_REMAIN_ON_CHAN 0x010d
354#define HostCmd_CMD_11AC_CFG 0x0112 355#define HostCmd_CMD_11AC_CFG 0x0112
355#define HostCmd_CMD_TDLS_OPER 0x0122 356#define HostCmd_CMD_TDLS_OPER 0x0122
357#define HostCmd_CMD_SDIO_SP_RX_AGGR_CFG 0x0223
356 358
357#define PROTOCOL_NO_SECURITY 0x01 359#define PROTOCOL_NO_SECURITY 0x01
358#define PROTOCOL_STATIC_WEP 0x02 360#define PROTOCOL_STATIC_WEP 0x02
@@ -523,9 +525,11 @@ enum P2P_MODES {
523#define TYPE_OR (MAX_OPERAND+5) 525#define TYPE_OR (MAX_OPERAND+5)
524#define MEF_MODE_HOST_SLEEP 1 526#define MEF_MODE_HOST_SLEEP 1
525#define MEF_ACTION_ALLOW_AND_WAKEUP_HOST 3 527#define MEF_ACTION_ALLOW_AND_WAKEUP_HOST 3
528#define MEF_ACTION_AUTO_ARP 0x10
526#define MWIFIEX_CRITERIA_BROADCAST BIT(0) 529#define MWIFIEX_CRITERIA_BROADCAST BIT(0)
527#define MWIFIEX_CRITERIA_UNICAST BIT(1) 530#define MWIFIEX_CRITERIA_UNICAST BIT(1)
528#define MWIFIEX_CRITERIA_MULTICAST BIT(3) 531#define MWIFIEX_CRITERIA_MULTICAST BIT(3)
532#define MWIFIEX_MAX_SUPPORTED_IPADDR 4
529 533
530#define ACT_TDLS_DELETE 0x00 534#define ACT_TDLS_DELETE 0x00
531#define ACT_TDLS_CREATE 0x01 535#define ACT_TDLS_CREATE 0x01
@@ -1240,6 +1244,12 @@ struct host_cmd_ds_chan_rpt_event {
1240 u8 tlvbuf[0]; 1244 u8 tlvbuf[0];
1241} __packed; 1245} __packed;
1242 1246
1247struct host_cmd_sdio_sp_rx_aggr_cfg {
1248 u8 action;
1249 u8 enable;
1250 __le16 block_size;
1251} __packed;
1252
1243struct mwifiex_fixed_bcn_param { 1253struct mwifiex_fixed_bcn_param {
1244 __le64 timestamp; 1254 __le64 timestamp;
1245 __le16 beacon_period; 1255 __le16 beacon_period;
@@ -1962,6 +1972,7 @@ struct host_cmd_ds_command {
1962 struct host_cmd_ds_coalesce_cfg coalesce_cfg; 1972 struct host_cmd_ds_coalesce_cfg coalesce_cfg;
1963 struct host_cmd_ds_tdls_oper tdls_oper; 1973 struct host_cmd_ds_tdls_oper tdls_oper;
1964 struct host_cmd_ds_chan_rpt_req chan_rpt_req; 1974 struct host_cmd_ds_chan_rpt_req chan_rpt_req;
1975 struct host_cmd_sdio_sp_rx_aggr_cfg sdio_rx_aggr_cfg;
1965 } params; 1976 } params;
1966} __packed; 1977} __packed;
1967 1978
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c
index b77ba743e1c4..e12192f5cfad 100644
--- a/drivers/net/wireless/mwifiex/init.c
+++ b/drivers/net/wireless/mwifiex/init.c
@@ -76,7 +76,7 @@ int mwifiex_init_priv(struct mwifiex_private *priv)
76 u32 i; 76 u32 i;
77 77
78 priv->media_connected = false; 78 priv->media_connected = false;
79 memset(priv->curr_addr, 0xff, ETH_ALEN); 79 eth_broadcast_addr(priv->curr_addr);
80 80
81 priv->pkt_tx_ctrl = 0; 81 priv->pkt_tx_ctrl = 0;
82 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED; 82 priv->bss_mode = NL80211_IFTYPE_UNSPECIFIED;
@@ -266,18 +266,15 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
266 266
267 mwifiex_wmm_init(adapter); 267 mwifiex_wmm_init(adapter);
268 268
269 if (adapter->sleep_cfm) { 269 sleep_cfm_buf = (struct mwifiex_opt_sleep_confirm *)
270 sleep_cfm_buf = (struct mwifiex_opt_sleep_confirm *) 270 adapter->sleep_cfm->data;
271 adapter->sleep_cfm->data; 271 memset(sleep_cfm_buf, 0, adapter->sleep_cfm->len);
272 memset(sleep_cfm_buf, 0, adapter->sleep_cfm->len); 272 sleep_cfm_buf->command = cpu_to_le16(HostCmd_CMD_802_11_PS_MODE_ENH);
273 sleep_cfm_buf->command = 273 sleep_cfm_buf->size = cpu_to_le16(adapter->sleep_cfm->len);
274 cpu_to_le16(HostCmd_CMD_802_11_PS_MODE_ENH); 274 sleep_cfm_buf->result = 0;
275 sleep_cfm_buf->size = 275 sleep_cfm_buf->action = cpu_to_le16(SLEEP_CONFIRM);
276 cpu_to_le16(adapter->sleep_cfm->len); 276 sleep_cfm_buf->resp_ctrl = cpu_to_le16(RESP_NEEDED);
277 sleep_cfm_buf->result = 0; 277
278 sleep_cfm_buf->action = cpu_to_le16(SLEEP_CONFIRM);
279 sleep_cfm_buf->resp_ctrl = cpu_to_le16(RESP_NEEDED);
280 }
281 memset(&adapter->sleep_params, 0, sizeof(adapter->sleep_params)); 278 memset(&adapter->sleep_params, 0, sizeof(adapter->sleep_params));
282 memset(&adapter->sleep_period, 0, sizeof(adapter->sleep_period)); 279 memset(&adapter->sleep_period, 0, sizeof(adapter->sleep_period));
283 adapter->tx_lock_flag = false; 280 adapter->tx_lock_flag = false;
@@ -296,10 +293,9 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
296 memset(&adapter->arp_filter, 0, sizeof(adapter->arp_filter)); 293 memset(&adapter->arp_filter, 0, sizeof(adapter->arp_filter));
297 adapter->arp_filter_size = 0; 294 adapter->arp_filter_size = 0;
298 adapter->max_mgmt_ie_index = MAX_MGMT_IE_INDEX; 295 adapter->max_mgmt_ie_index = MAX_MGMT_IE_INDEX;
299 adapter->ext_scan = false;
300 adapter->key_api_major_ver = 0; 296 adapter->key_api_major_ver = 0;
301 adapter->key_api_minor_ver = 0; 297 adapter->key_api_minor_ver = 0;
302 memset(adapter->perm_addr, 0xff, ETH_ALEN); 298 eth_broadcast_addr(adapter->perm_addr);
303 adapter->iface_limit.sta_intf = MWIFIEX_MAX_STA_NUM; 299 adapter->iface_limit.sta_intf = MWIFIEX_MAX_STA_NUM;
304 adapter->iface_limit.uap_intf = MWIFIEX_MAX_UAP_NUM; 300 adapter->iface_limit.uap_intf = MWIFIEX_MAX_UAP_NUM;
305 adapter->iface_limit.p2p_intf = MWIFIEX_MAX_P2P_NUM; 301 adapter->iface_limit.p2p_intf = MWIFIEX_MAX_P2P_NUM;
@@ -482,6 +478,7 @@ int mwifiex_init_lock_list(struct mwifiex_adapter *adapter)
482 spin_lock_init(&adapter->rx_proc_lock); 478 spin_lock_init(&adapter->rx_proc_lock);
483 479
484 skb_queue_head_init(&adapter->rx_data_q); 480 skb_queue_head_init(&adapter->rx_data_q);
481 skb_queue_head_init(&adapter->tx_data_q);
485 482
486 for (i = 0; i < adapter->priv_num; ++i) { 483 for (i = 0; i < adapter->priv_num; ++i) {
487 INIT_LIST_HEAD(&adapter->bss_prio_tbl[i].bss_prio_head); 484 INIT_LIST_HEAD(&adapter->bss_prio_tbl[i].bss_prio_head);
@@ -689,6 +686,10 @@ mwifiex_shutdown_drv(struct mwifiex_adapter *adapter)
689 } 686 }
690 } 687 }
691 688
689 atomic_set(&adapter->tx_queued, 0);
690 while ((skb = skb_dequeue(&adapter->tx_data_q)))
691 mwifiex_write_data_complete(adapter, skb, 0, 0);
692
692 spin_lock_irqsave(&adapter->rx_proc_lock, flags); 693 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
693 694
694 while ((skb = skb_dequeue(&adapter->rx_data_q))) { 695 while ((skb = skb_dequeue(&adapter->rx_data_q))) {
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index 7e74b4fccddd..03a95c7d34bf 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -131,10 +131,39 @@ static int mwifiex_unregister(struct mwifiex_adapter *adapter)
131 return 0; 131 return 0;
132} 132}
133 133
134void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
135{
136 unsigned long flags;
137
138 spin_lock_irqsave(&adapter->main_proc_lock, flags);
139 if (adapter->mwifiex_processing) {
140 adapter->more_task_flag = true;
141 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
142 } else {
143 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
144 queue_work(adapter->workqueue, &adapter->main_work);
145 }
146}
147EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
148
149static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
150{
151 unsigned long flags;
152
153 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
154 if (adapter->rx_processing) {
155 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
156 } else {
157 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
158 queue_work(adapter->rx_workqueue, &adapter->rx_work);
159 }
160}
161
134static int mwifiex_process_rx(struct mwifiex_adapter *adapter) 162static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
135{ 163{
136 unsigned long flags; 164 unsigned long flags;
137 struct sk_buff *skb; 165 struct sk_buff *skb;
166 struct mwifiex_rxinfo *rx_info;
138 167
139 spin_lock_irqsave(&adapter->rx_proc_lock, flags); 168 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
140 if (adapter->rx_processing || adapter->rx_locked) { 169 if (adapter->rx_processing || adapter->rx_locked) {
@@ -154,9 +183,16 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
154 if (adapter->if_ops.submit_rem_rx_urbs) 183 if (adapter->if_ops.submit_rem_rx_urbs)
155 adapter->if_ops.submit_rem_rx_urbs(adapter); 184 adapter->if_ops.submit_rem_rx_urbs(adapter);
156 adapter->delay_main_work = false; 185 adapter->delay_main_work = false;
157 queue_work(adapter->workqueue, &adapter->main_work); 186 mwifiex_queue_main_work(adapter);
187 }
188 rx_info = MWIFIEX_SKB_RXCB(skb);
189 if (rx_info->buf_type == MWIFIEX_TYPE_AGGR_DATA) {
190 if (adapter->if_ops.deaggr_pkt)
191 adapter->if_ops.deaggr_pkt(adapter, skb);
192 dev_kfree_skb_any(skb);
193 } else {
194 mwifiex_handle_rx_packet(adapter, skb);
158 } 195 }
159 mwifiex_handle_rx_packet(adapter, skb);
160 } 196 }
161 spin_lock_irqsave(&adapter->rx_proc_lock, flags); 197 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
162 adapter->rx_processing = false; 198 adapter->rx_processing = false;
@@ -189,15 +225,17 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
189 spin_lock_irqsave(&adapter->main_proc_lock, flags); 225 spin_lock_irqsave(&adapter->main_proc_lock, flags);
190 226
191 /* Check if already processing */ 227 /* Check if already processing */
192 if (adapter->mwifiex_processing) { 228 if (adapter->mwifiex_processing || adapter->main_locked) {
229 adapter->more_task_flag = true;
193 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); 230 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
194 goto exit_main_proc; 231 goto exit_main_proc;
195 } else { 232 } else {
196 adapter->mwifiex_processing = true; 233 adapter->mwifiex_processing = true;
197 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
198 } 234 }
199process_start: 235process_start:
200 do { 236 do {
237 adapter->more_task_flag = false;
238 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
201 if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) || 239 if ((adapter->hw_status == MWIFIEX_HW_STATUS_CLOSING) ||
202 (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY)) 240 (adapter->hw_status == MWIFIEX_HW_STATUS_NOT_READY))
203 break; 241 break;
@@ -212,9 +250,7 @@ process_start:
212 if (atomic_read(&adapter->rx_pending) >= HIGH_RX_PENDING && 250 if (atomic_read(&adapter->rx_pending) >= HIGH_RX_PENDING &&
213 adapter->iface_type != MWIFIEX_USB) { 251 adapter->iface_type != MWIFIEX_USB) {
214 adapter->delay_main_work = true; 252 adapter->delay_main_work = true;
215 if (!adapter->rx_processing) 253 mwifiex_queue_rx_work(adapter);
216 queue_work(adapter->rx_workqueue,
217 &adapter->rx_work);
218 break; 254 break;
219 } 255 }
220 256
@@ -227,24 +263,26 @@ process_start:
227 } 263 }
228 264
229 if (adapter->rx_work_enabled && adapter->data_received) 265 if (adapter->rx_work_enabled && adapter->data_received)
230 queue_work(adapter->rx_workqueue, &adapter->rx_work); 266 mwifiex_queue_rx_work(adapter);
231 267
232 /* Need to wake up the card ? */ 268 /* Need to wake up the card ? */
233 if ((adapter->ps_state == PS_STATE_SLEEP) && 269 if ((adapter->ps_state == PS_STATE_SLEEP) &&
234 (adapter->pm_wakeup_card_req && 270 (adapter->pm_wakeup_card_req &&
235 !adapter->pm_wakeup_fw_try) && 271 !adapter->pm_wakeup_fw_try) &&
236 (is_command_pending(adapter) || 272 (is_command_pending(adapter) ||
273 !skb_queue_empty(&adapter->tx_data_q) ||
237 !mwifiex_wmm_lists_empty(adapter))) { 274 !mwifiex_wmm_lists_empty(adapter))) {
238 adapter->pm_wakeup_fw_try = true; 275 adapter->pm_wakeup_fw_try = true;
239 mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3)); 276 mod_timer(&adapter->wakeup_timer, jiffies + (HZ*3));
240 adapter->if_ops.wakeup(adapter); 277 adapter->if_ops.wakeup(adapter);
278 spin_lock_irqsave(&adapter->main_proc_lock, flags);
241 continue; 279 continue;
242 } 280 }
243 281
244 if (IS_CARD_RX_RCVD(adapter)) { 282 if (IS_CARD_RX_RCVD(adapter)) {
245 adapter->data_received = false; 283 adapter->data_received = false;
246 adapter->pm_wakeup_fw_try = false; 284 adapter->pm_wakeup_fw_try = false;
247 del_timer_sync(&adapter->wakeup_timer); 285 del_timer(&adapter->wakeup_timer);
248 if (adapter->ps_state == PS_STATE_SLEEP) 286 if (adapter->ps_state == PS_STATE_SLEEP)
249 adapter->ps_state = PS_STATE_AWAKE; 287 adapter->ps_state = PS_STATE_AWAKE;
250 } else { 288 } else {
@@ -257,7 +295,8 @@ process_start:
257 295
258 if ((!adapter->scan_chan_gap_enabled && 296 if ((!adapter->scan_chan_gap_enabled &&
259 adapter->scan_processing) || adapter->data_sent || 297 adapter->scan_processing) || adapter->data_sent ||
260 mwifiex_wmm_lists_empty(adapter)) { 298 (mwifiex_wmm_lists_empty(adapter) &&
299 skb_queue_empty(&adapter->tx_data_q))) {
261 if (adapter->cmd_sent || adapter->curr_cmd || 300 if (adapter->cmd_sent || adapter->curr_cmd ||
262 (!is_command_pending(adapter))) 301 (!is_command_pending(adapter)))
263 break; 302 break;
@@ -295,8 +334,10 @@ process_start:
295 if ((adapter->ps_state == PS_STATE_SLEEP) || 334 if ((adapter->ps_state == PS_STATE_SLEEP) ||
296 (adapter->ps_state == PS_STATE_PRE_SLEEP) || 335 (adapter->ps_state == PS_STATE_PRE_SLEEP) ||
297 (adapter->ps_state == PS_STATE_SLEEP_CFM) || 336 (adapter->ps_state == PS_STATE_SLEEP_CFM) ||
298 adapter->tx_lock_flag) 337 adapter->tx_lock_flag){
338 spin_lock_irqsave(&adapter->main_proc_lock, flags);
299 continue; 339 continue;
340 }
300 341
301 if (!adapter->cmd_sent && !adapter->curr_cmd) { 342 if (!adapter->cmd_sent && !adapter->curr_cmd) {
302 if (mwifiex_exec_next_cmd(adapter) == -1) { 343 if (mwifiex_exec_next_cmd(adapter) == -1) {
@@ -307,6 +348,20 @@ process_start:
307 348
308 if ((adapter->scan_chan_gap_enabled || 349 if ((adapter->scan_chan_gap_enabled ||
309 !adapter->scan_processing) && 350 !adapter->scan_processing) &&
351 !adapter->data_sent &&
352 !skb_queue_empty(&adapter->tx_data_q)) {
353 mwifiex_process_tx_queue(adapter);
354 if (adapter->hs_activated) {
355 adapter->is_hs_configured = false;
356 mwifiex_hs_activated_event
357 (mwifiex_get_priv
358 (adapter, MWIFIEX_BSS_ROLE_ANY),
359 false);
360 }
361 }
362
363 if ((adapter->scan_chan_gap_enabled ||
364 !adapter->scan_processing) &&
310 !adapter->data_sent && !mwifiex_wmm_lists_empty(adapter)) { 365 !adapter->data_sent && !mwifiex_wmm_lists_empty(adapter)) {
311 mwifiex_wmm_process_tx(adapter); 366 mwifiex_wmm_process_tx(adapter);
312 if (adapter->hs_activated) { 367 if (adapter->hs_activated) {
@@ -320,7 +375,8 @@ process_start:
320 375
321 if (adapter->delay_null_pkt && !adapter->cmd_sent && 376 if (adapter->delay_null_pkt && !adapter->cmd_sent &&
322 !adapter->curr_cmd && !is_command_pending(adapter) && 377 !adapter->curr_cmd && !is_command_pending(adapter) &&
323 mwifiex_wmm_lists_empty(adapter)) { 378 (mwifiex_wmm_lists_empty(adapter) &&
379 skb_queue_empty(&adapter->tx_data_q))) {
324 if (!mwifiex_send_null_packet 380 if (!mwifiex_send_null_packet
325 (mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA), 381 (mwifiex_get_priv(adapter, MWIFIEX_BSS_ROLE_STA),
326 MWIFIEX_TxPD_POWER_MGMT_NULL_PACKET | 382 MWIFIEX_TxPD_POWER_MGMT_NULL_PACKET |
@@ -330,15 +386,12 @@ process_start:
330 } 386 }
331 break; 387 break;
332 } 388 }
389 spin_lock_irqsave(&adapter->main_proc_lock, flags);
333 } while (true); 390 } while (true);
334 391
335 spin_lock_irqsave(&adapter->main_proc_lock, flags); 392 spin_lock_irqsave(&adapter->main_proc_lock, flags);
336 if (!adapter->delay_main_work && 393 if (adapter->more_task_flag)
337 (adapter->int_status || IS_CARD_RX_RCVD(adapter))) {
338 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
339 goto process_start; 394 goto process_start;
340 }
341
342 adapter->mwifiex_processing = false; 395 adapter->mwifiex_processing = false;
343 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); 396 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
344 397
@@ -466,7 +519,7 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
466 519
467 rtnl_lock(); 520 rtnl_lock();
468 /* Create station interface by default */ 521 /* Create station interface by default */
469 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "mlan%d", 522 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "mlan%d", NET_NAME_ENUM,
470 NL80211_IFTYPE_STATION, NULL, NULL); 523 NL80211_IFTYPE_STATION, NULL, NULL);
471 if (IS_ERR(wdev)) { 524 if (IS_ERR(wdev)) {
472 dev_err(adapter->dev, "cannot create default STA interface\n"); 525 dev_err(adapter->dev, "cannot create default STA interface\n");
@@ -475,7 +528,7 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
475 } 528 }
476 529
477 if (driver_mode & MWIFIEX_DRIVER_MODE_UAP) { 530 if (driver_mode & MWIFIEX_DRIVER_MODE_UAP) {
478 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "uap%d", 531 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "uap%d", NET_NAME_ENUM,
479 NL80211_IFTYPE_AP, NULL, NULL); 532 NL80211_IFTYPE_AP, NULL, NULL);
480 if (IS_ERR(wdev)) { 533 if (IS_ERR(wdev)) {
481 dev_err(adapter->dev, "cannot create AP interface\n"); 534 dev_err(adapter->dev, "cannot create AP interface\n");
@@ -485,7 +538,7 @@ static void mwifiex_fw_dpc(const struct firmware *firmware, void *context)
485 } 538 }
486 539
487 if (driver_mode & MWIFIEX_DRIVER_MODE_P2P) { 540 if (driver_mode & MWIFIEX_DRIVER_MODE_P2P) {
488 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "p2p%d", 541 wdev = mwifiex_add_virtual_intf(adapter->wiphy, "p2p%d", NET_NAME_ENUM,
489 NL80211_IFTYPE_P2P_CLIENT, NULL, 542 NL80211_IFTYPE_P2P_CLIENT, NULL,
490 NULL); 543 NULL);
491 if (IS_ERR(wdev)) { 544 if (IS_ERR(wdev)) {
@@ -604,7 +657,7 @@ int mwifiex_queue_tx_pkt(struct mwifiex_private *priv, struct sk_buff *skb)
604 atomic_inc(&priv->adapter->tx_pending); 657 atomic_inc(&priv->adapter->tx_pending);
605 mwifiex_wmm_add_buf_txqueue(priv, skb); 658 mwifiex_wmm_add_buf_txqueue(priv, skb);
606 659
607 queue_work(priv->adapter->workqueue, &priv->adapter->main_work); 660 mwifiex_queue_main_work(priv->adapter);
608 661
609 return 0; 662 return 0;
610} 663}
@@ -1096,9 +1149,6 @@ mwifiex_add_card(void *card, struct semaphore *sem,
1096 INIT_WORK(&adapter->rx_work, mwifiex_rx_work_queue); 1149 INIT_WORK(&adapter->rx_work, mwifiex_rx_work_queue);
1097 } 1150 }
1098 1151
1099 if (adapter->if_ops.iface_work)
1100 INIT_WORK(&adapter->iface_work, adapter->if_ops.iface_work);
1101
1102 /* Register the device. Fill up the private data structure with relevant 1152 /* Register the device. Fill up the private data structure with relevant
1103 information from the card. */ 1153 information from the card. */
1104 if (adapter->if_ops.register_dev(adapter)) { 1154 if (adapter->if_ops.register_dev(adapter)) {
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index f0a6af179af0..fe1256044a6c 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -35,6 +35,7 @@
35#include <linux/ctype.h> 35#include <linux/ctype.h>
36#include <linux/of.h> 36#include <linux/of.h>
37#include <linux/idr.h> 37#include <linux/idr.h>
38#include <linux/inetdevice.h>
38 39
39#include "decl.h" 40#include "decl.h"
40#include "ioctl.h" 41#include "ioctl.h"
@@ -58,6 +59,8 @@ enum {
58 59
59#define MWIFIEX_MAX_AP 64 60#define MWIFIEX_MAX_AP 64
60 61
62#define MWIFIEX_MAX_PKTS_TXQ 16
63
61#define MWIFIEX_DEFAULT_WATCHDOG_TIMEOUT (5 * HZ) 64#define MWIFIEX_DEFAULT_WATCHDOG_TIMEOUT (5 * HZ)
62 65
63#define MWIFIEX_TIMER_10S 10000 66#define MWIFIEX_TIMER_10S 10000
@@ -118,6 +121,7 @@ enum {
118 121
119#define MWIFIEX_TYPE_CMD 1 122#define MWIFIEX_TYPE_CMD 1
120#define MWIFIEX_TYPE_DATA 0 123#define MWIFIEX_TYPE_DATA 0
124#define MWIFIEX_TYPE_AGGR_DATA 10
121#define MWIFIEX_TYPE_EVENT 3 125#define MWIFIEX_TYPE_EVENT 3
122 126
123#define MAX_BITMAP_RATES_SIZE 18 127#define MAX_BITMAP_RATES_SIZE 18
@@ -140,6 +144,9 @@ enum {
140 144
141#define MWIFIEX_DRV_INFO_SIZE_MAX 0x40000 145#define MWIFIEX_DRV_INFO_SIZE_MAX 0x40000
142 146
147/* Address alignment */
148#define MWIFIEX_ALIGN_ADDR(p, a) (((long)(p) + (a) - 1) & ~((a) - 1))
149
143struct mwifiex_dbg { 150struct mwifiex_dbg {
144 u32 num_cmd_host_to_card_failure; 151 u32 num_cmd_host_to_card_failure;
145 u32 num_cmd_sleep_cfm_host_to_card_failure; 152 u32 num_cmd_sleep_cfm_host_to_card_failure;
@@ -207,6 +214,12 @@ struct mwifiex_tx_aggr {
207 u8 amsdu; 214 u8 amsdu;
208}; 215};
209 216
217enum mwifiex_ba_status {
218 BA_SETUP_NONE = 0,
219 BA_SETUP_INPROGRESS,
220 BA_SETUP_COMPLETE
221};
222
210struct mwifiex_ra_list_tbl { 223struct mwifiex_ra_list_tbl {
211 struct list_head list; 224 struct list_head list;
212 struct sk_buff_head skb_head; 225 struct sk_buff_head skb_head;
@@ -215,6 +228,8 @@ struct mwifiex_ra_list_tbl {
215 u16 max_amsdu; 228 u16 max_amsdu;
216 u16 ba_pkt_count; 229 u16 ba_pkt_count;
217 u8 ba_packet_thr; 230 u8 ba_packet_thr;
231 enum mwifiex_ba_status ba_status;
232 u8 amsdu_in_ampdu;
218 u16 total_pkt_count; 233 u16 total_pkt_count;
219 bool tdls_link; 234 bool tdls_link;
220}; 235};
@@ -598,11 +613,6 @@ struct mwifiex_private {
598 struct mwifiex_11h_intf_state state_11h; 613 struct mwifiex_11h_intf_state state_11h;
599}; 614};
600 615
601enum mwifiex_ba_status {
602 BA_SETUP_NONE = 0,
603 BA_SETUP_INPROGRESS,
604 BA_SETUP_COMPLETE
605};
606 616
607struct mwifiex_tx_ba_stream_tbl { 617struct mwifiex_tx_ba_stream_tbl {
608 struct list_head list; 618 struct list_head list;
@@ -735,6 +745,7 @@ struct mwifiex_if_ops {
735 int (*clean_pcie_ring) (struct mwifiex_adapter *adapter); 745 int (*clean_pcie_ring) (struct mwifiex_adapter *adapter);
736 void (*iface_work)(struct work_struct *work); 746 void (*iface_work)(struct work_struct *work);
737 void (*submit_rem_rx_urbs)(struct mwifiex_adapter *adapter); 747 void (*submit_rem_rx_urbs)(struct mwifiex_adapter *adapter);
748 void (*deaggr_pkt)(struct mwifiex_adapter *, struct sk_buff *);
738}; 749};
739 750
740struct mwifiex_adapter { 751struct mwifiex_adapter {
@@ -768,14 +779,18 @@ struct mwifiex_adapter {
768 bool rx_processing; 779 bool rx_processing;
769 bool delay_main_work; 780 bool delay_main_work;
770 bool rx_locked; 781 bool rx_locked;
782 bool main_locked;
771 struct mwifiex_bss_prio_tbl bss_prio_tbl[MWIFIEX_MAX_BSS_NUM]; 783 struct mwifiex_bss_prio_tbl bss_prio_tbl[MWIFIEX_MAX_BSS_NUM];
772 /* spin lock for init/shutdown */ 784 /* spin lock for init/shutdown */
773 spinlock_t mwifiex_lock; 785 spinlock_t mwifiex_lock;
774 /* spin lock for main process */ 786 /* spin lock for main process */
775 spinlock_t main_proc_lock; 787 spinlock_t main_proc_lock;
776 u32 mwifiex_processing; 788 u32 mwifiex_processing;
789 u8 more_task_flag;
777 u16 tx_buf_size; 790 u16 tx_buf_size;
778 u16 curr_tx_buf_size; 791 u16 curr_tx_buf_size;
792 bool sdio_rx_aggr_enable;
793 u16 sdio_rx_block_size;
779 u32 ioport; 794 u32 ioport;
780 enum MWIFIEX_HARDWARE_STATUS hw_status; 795 enum MWIFIEX_HARDWARE_STATUS hw_status;
781 u16 number_of_antenna; 796 u16 number_of_antenna;
@@ -810,6 +825,8 @@ struct mwifiex_adapter {
810 spinlock_t scan_pending_q_lock; 825 spinlock_t scan_pending_q_lock;
811 /* spin lock for RX processing routine */ 826 /* spin lock for RX processing routine */
812 spinlock_t rx_proc_lock; 827 spinlock_t rx_proc_lock;
828 struct sk_buff_head tx_data_q;
829 atomic_t tx_queued;
813 u32 scan_processing; 830 u32 scan_processing;
814 u16 region_code; 831 u16 region_code;
815 struct mwifiex_802_11d_domain_reg domain_reg; 832 struct mwifiex_802_11d_domain_reg domain_reg;
@@ -881,8 +898,6 @@ struct mwifiex_adapter {
881 bool ext_scan; 898 bool ext_scan;
882 u8 fw_api_ver; 899 u8 fw_api_ver;
883 u8 key_api_major_ver, key_api_minor_ver; 900 u8 key_api_major_ver, key_api_minor_ver;
884 struct work_struct iface_work;
885 unsigned long iface_work_flags;
886 struct memory_type_mapping *mem_type_mapping_tbl; 901 struct memory_type_mapping *mem_type_mapping_tbl;
887 u8 num_mem_types; 902 u8 num_mem_types;
888 u8 curr_mem_idx; 903 u8 curr_mem_idx;
@@ -896,6 +911,8 @@ struct mwifiex_adapter {
896 bool auto_tdls; 911 bool auto_tdls;
897}; 912};
898 913
914void mwifiex_process_tx_queue(struct mwifiex_adapter *adapter);
915
899int mwifiex_init_lock_list(struct mwifiex_adapter *adapter); 916int mwifiex_init_lock_list(struct mwifiex_adapter *adapter);
900 917
901void mwifiex_set_trans_start(struct net_device *dev); 918void mwifiex_set_trans_start(struct net_device *dev);
@@ -1318,6 +1335,7 @@ u8 mwifiex_chan_type_to_sec_chan_offset(enum nl80211_channel_type chan_type);
1318 1335
1319struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy, 1336struct wireless_dev *mwifiex_add_virtual_intf(struct wiphy *wiphy,
1320 const char *name, 1337 const char *name,
1338 unsigned char name_assign_type,
1321 enum nl80211_iftype type, 1339 enum nl80211_iftype type,
1322 u32 *flags, 1340 u32 *flags,
1323 struct vif_params *params); 1341 struct vif_params *params);
@@ -1417,6 +1435,8 @@ u8 mwifiex_adjust_data_rate(struct mwifiex_private *priv,
1417 u8 rx_rate, u8 ht_info); 1435 u8 rx_rate, u8 ht_info);
1418 1436
1419void mwifiex_dump_drv_info(struct mwifiex_adapter *adapter); 1437void mwifiex_dump_drv_info(struct mwifiex_adapter *adapter);
1438void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
1439void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
1420 1440
1421#ifdef CONFIG_DEBUG_FS 1441#ifdef CONFIG_DEBUG_FS
1422void mwifiex_debugfs_init(void); 1442void mwifiex_debugfs_init(void);
diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c
index a5828da59365..bcc7751d883c 100644
--- a/drivers/net/wireless/mwifiex/pcie.c
+++ b/drivers/net/wireless/mwifiex/pcie.c
@@ -203,7 +203,7 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
203 card->pcie.reg = data->reg; 203 card->pcie.reg = data->reg;
204 card->pcie.blksz_fw_dl = data->blksz_fw_dl; 204 card->pcie.blksz_fw_dl = data->blksz_fw_dl;
205 card->pcie.tx_buf_size = data->tx_buf_size; 205 card->pcie.tx_buf_size = data->tx_buf_size;
206 card->pcie.supports_fw_dump = data->supports_fw_dump; 206 card->pcie.can_dump_fw = data->can_dump_fw;
207 card->pcie.can_ext_scan = data->can_ext_scan; 207 card->pcie.can_ext_scan = data->can_ext_scan;
208 } 208 }
209 209
@@ -234,8 +234,6 @@ static void mwifiex_pcie_remove(struct pci_dev *pdev)
234 if (!adapter || !adapter->priv_num) 234 if (!adapter || !adapter->priv_num)
235 return; 235 return;
236 236
237 cancel_work_sync(&adapter->iface_work);
238
239 if (user_rmmod) { 237 if (user_rmmod) {
240#ifdef CONFIG_PM_SLEEP 238#ifdef CONFIG_PM_SLEEP
241 if (adapter->is_suspended) 239 if (adapter->is_suspended)
@@ -498,7 +496,8 @@ static int mwifiex_init_rxq_ring(struct mwifiex_adapter *adapter)
498 496
499 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) { 497 for (i = 0; i < MWIFIEX_MAX_TXRX_BD; i++) {
500 /* Allocate skb here so that firmware can DMA data from it */ 498 /* Allocate skb here so that firmware can DMA data from it */
501 skb = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE); 499 skb = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
500 GFP_KERNEL | GFP_DMA);
502 if (!skb) { 501 if (!skb) {
503 dev_err(adapter->dev, 502 dev_err(adapter->dev,
504 "Unable to allocate skb for RX ring.\n"); 503 "Unable to allocate skb for RX ring.\n");
@@ -1297,7 +1296,8 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1297 } 1296 }
1298 } 1297 }
1299 1298
1300 skb_tmp = dev_alloc_skb(MWIFIEX_RX_DATA_BUF_SIZE); 1299 skb_tmp = mwifiex_alloc_dma_align_buf(MWIFIEX_RX_DATA_BUF_SIZE,
1300 GFP_KERNEL | GFP_DMA);
1301 if (!skb_tmp) { 1301 if (!skb_tmp) {
1302 dev_err(adapter->dev, 1302 dev_err(adapter->dev,
1303 "Unable to allocate skb.\n"); 1303 "Unable to allocate skb.\n");
@@ -2099,7 +2099,7 @@ static irqreturn_t mwifiex_pcie_interrupt(int irq, void *context)
2099 goto exit; 2099 goto exit;
2100 2100
2101 mwifiex_interrupt_status(adapter); 2101 mwifiex_interrupt_status(adapter);
2102 queue_work(adapter->workqueue, &adapter->main_work); 2102 mwifiex_queue_main_work(adapter);
2103 2103
2104exit: 2104exit:
2105 return IRQ_HANDLED; 2105 return IRQ_HANDLED;
@@ -2271,7 +2271,7 @@ static void mwifiex_pcie_fw_dump_work(struct mwifiex_adapter *adapter)
2271 int ret; 2271 int ret;
2272 static char *env[] = { "DRIVER=mwifiex_pcie", "EVENT=fw_dump", NULL }; 2272 static char *env[] = { "DRIVER=mwifiex_pcie", "EVENT=fw_dump", NULL };
2273 2273
2274 if (!card->pcie.supports_fw_dump) 2274 if (!card->pcie.can_dump_fw)
2275 return; 2275 return;
2276 2276
2277 for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) { 2277 for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) {
@@ -2371,25 +2371,26 @@ done:
2371 adapter->curr_mem_idx = 0; 2371 adapter->curr_mem_idx = 0;
2372} 2372}
2373 2373
2374static unsigned long iface_work_flags;
2375static struct mwifiex_adapter *save_adapter;
2374static void mwifiex_pcie_work(struct work_struct *work) 2376static void mwifiex_pcie_work(struct work_struct *work)
2375{ 2377{
2376 struct mwifiex_adapter *adapter =
2377 container_of(work, struct mwifiex_adapter, iface_work);
2378
2379 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_FW_DUMP, 2378 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_FW_DUMP,
2380 &adapter->iface_work_flags)) 2379 &iface_work_flags))
2381 mwifiex_pcie_fw_dump_work(adapter); 2380 mwifiex_pcie_fw_dump_work(save_adapter);
2382} 2381}
2383 2382
2383static DECLARE_WORK(pcie_work, mwifiex_pcie_work);
2384/* This function dumps FW information */ 2384/* This function dumps FW information */
2385static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter) 2385static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
2386{ 2386{
2387 if (test_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &adapter->iface_work_flags)) 2387 save_adapter = adapter;
2388 if (test_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &iface_work_flags))
2388 return; 2389 return;
2389 2390
2390 set_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &adapter->iface_work_flags); 2391 set_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &iface_work_flags);
2391 2392
2392 schedule_work(&adapter->iface_work); 2393 schedule_work(&pcie_work);
2393} 2394}
2394 2395
2395/* 2396/*
@@ -2617,7 +2618,6 @@ static struct mwifiex_if_ops pcie_ops = {
2617 .init_fw_port = mwifiex_pcie_init_fw_port, 2618 .init_fw_port = mwifiex_pcie_init_fw_port,
2618 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf, 2619 .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
2619 .fw_dump = mwifiex_pcie_fw_dump, 2620 .fw_dump = mwifiex_pcie_fw_dump,
2620 .iface_work = mwifiex_pcie_work,
2621}; 2621};
2622 2622
2623/* 2623/*
@@ -2663,6 +2663,7 @@ static void mwifiex_pcie_cleanup_module(void)
2663 /* Set the flag as user is removing this module. */ 2663 /* Set the flag as user is removing this module. */
2664 user_rmmod = 1; 2664 user_rmmod = 1;
2665 2665
2666 cancel_work_sync(&pcie_work);
2666 pci_unregister_driver(&mwifiex_pcie); 2667 pci_unregister_driver(&mwifiex_pcie);
2667} 2668}
2668 2669
diff --git a/drivers/net/wireless/mwifiex/pcie.h b/drivers/net/wireless/mwifiex/pcie.h
index 666d40e9dbc3..0e7ee8b72358 100644
--- a/drivers/net/wireless/mwifiex/pcie.h
+++ b/drivers/net/wireless/mwifiex/pcie.h
@@ -205,7 +205,7 @@ struct mwifiex_pcie_device {
205 const struct mwifiex_pcie_card_reg *reg; 205 const struct mwifiex_pcie_card_reg *reg;
206 u16 blksz_fw_dl; 206 u16 blksz_fw_dl;
207 u16 tx_buf_size; 207 u16 tx_buf_size;
208 bool supports_fw_dump; 208 bool can_dump_fw;
209 bool can_ext_scan; 209 bool can_ext_scan;
210}; 210};
211 211
@@ -214,7 +214,7 @@ static const struct mwifiex_pcie_device mwifiex_pcie8766 = {
214 .reg = &mwifiex_reg_8766, 214 .reg = &mwifiex_reg_8766,
215 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD, 215 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
216 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K, 216 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
217 .supports_fw_dump = false, 217 .can_dump_fw = false,
218 .can_ext_scan = true, 218 .can_ext_scan = true,
219}; 219};
220 220
@@ -223,7 +223,7 @@ static const struct mwifiex_pcie_device mwifiex_pcie8897 = {
223 .reg = &mwifiex_reg_8897, 223 .reg = &mwifiex_reg_8897,
224 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD, 224 .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
225 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K, 225 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
226 .supports_fw_dump = true, 226 .can_dump_fw = true,
227 .can_ext_scan = true, 227 .can_ext_scan = true,
228}; 228};
229 229
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index 91e36cda9543..d10320f89bc1 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -47,6 +47,7 @@
47static u8 user_rmmod; 47static u8 user_rmmod;
48 48
49static struct mwifiex_if_ops sdio_ops; 49static struct mwifiex_if_ops sdio_ops;
50static unsigned long iface_work_flags;
50 51
51static struct semaphore add_remove_card_sem; 52static struct semaphore add_remove_card_sem;
52 53
@@ -105,8 +106,8 @@ mwifiex_sdio_probe(struct sdio_func *func, const struct sdio_device_id *id)
105 card->tx_buf_size = data->tx_buf_size; 106 card->tx_buf_size = data->tx_buf_size;
106 card->mp_tx_agg_buf_size = data->mp_tx_agg_buf_size; 107 card->mp_tx_agg_buf_size = data->mp_tx_agg_buf_size;
107 card->mp_rx_agg_buf_size = data->mp_rx_agg_buf_size; 108 card->mp_rx_agg_buf_size = data->mp_rx_agg_buf_size;
108 card->supports_fw_dump = data->supports_fw_dump; 109 card->can_dump_fw = data->can_dump_fw;
109 card->auto_tdls = data->auto_tdls; 110 card->can_auto_tdls = data->can_auto_tdls;
110 card->can_ext_scan = data->can_ext_scan; 111 card->can_ext_scan = data->can_ext_scan;
111 } 112 }
112 113
@@ -200,8 +201,6 @@ mwifiex_sdio_remove(struct sdio_func *func)
200 if (!adapter || !adapter->priv_num) 201 if (!adapter || !adapter->priv_num)
201 return; 202 return;
202 203
203 cancel_work_sync(&adapter->iface_work);
204
205 if (user_rmmod) { 204 if (user_rmmod) {
206 if (adapter->is_suspended) 205 if (adapter->is_suspended)
207 mwifiex_sdio_resume(adapter->dev); 206 mwifiex_sdio_resume(adapter->dev);
@@ -1043,6 +1042,59 @@ static int mwifiex_check_fw_status(struct mwifiex_adapter *adapter,
1043} 1042}
1044 1043
1045/* 1044/*
1045 * This function decode sdio aggreation pkt.
1046 *
1047 * Based on the the data block size and pkt_len,
1048 * skb data will be decoded to few packets.
1049 */
1050static void mwifiex_deaggr_sdio_pkt(struct mwifiex_adapter *adapter,
1051 struct sk_buff *skb)
1052{
1053 u32 total_pkt_len, pkt_len;
1054 struct sk_buff *skb_deaggr;
1055 u32 pkt_type;
1056 u16 blk_size;
1057 u8 blk_num;
1058 u8 *data;
1059
1060 data = skb->data;
1061 total_pkt_len = skb->len;
1062
1063 while (total_pkt_len >= (SDIO_HEADER_OFFSET + INTF_HEADER_LEN)) {
1064 if (total_pkt_len < adapter->sdio_rx_block_size)
1065 break;
1066 blk_num = *(data + BLOCK_NUMBER_OFFSET);
1067 blk_size = adapter->sdio_rx_block_size * blk_num;
1068 if (blk_size > total_pkt_len) {
1069 dev_err(adapter->dev, "%s: error in pkt,\t"
1070 "blk_num=%d, blk_size=%d, total_pkt_len=%d\n",
1071 __func__, blk_num, blk_size, total_pkt_len);
1072 break;
1073 }
1074 pkt_len = le16_to_cpu(*(__le16 *)(data + SDIO_HEADER_OFFSET));
1075 pkt_type = le16_to_cpu(*(__le16 *)(data + SDIO_HEADER_OFFSET +
1076 2));
1077 if ((pkt_len + SDIO_HEADER_OFFSET) > blk_size) {
1078 dev_err(adapter->dev, "%s: error in pkt,\t"
1079 "pkt_len=%d, blk_size=%d\n",
1080 __func__, pkt_len, blk_size);
1081 break;
1082 }
1083 skb_deaggr = mwifiex_alloc_dma_align_buf(pkt_len,
1084 GFP_KERNEL | GFP_DMA);
1085 if (!skb_deaggr)
1086 break;
1087 skb_put(skb_deaggr, pkt_len);
1088 memcpy(skb_deaggr->data, data + SDIO_HEADER_OFFSET, pkt_len);
1089 skb_pull(skb_deaggr, INTF_HEADER_LEN);
1090
1091 mwifiex_handle_rx_packet(adapter, skb_deaggr);
1092 data += blk_size;
1093 total_pkt_len -= blk_size;
1094 }
1095}
1096
1097/*
1046 * This function decodes a received packet. 1098 * This function decodes a received packet.
1047 * 1099 *
1048 * Based on the type, the packet is treated as either a data, or 1100 * Based on the type, the packet is treated as either a data, or
@@ -1055,11 +1107,28 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,
1055 u8 *cmd_buf; 1107 u8 *cmd_buf;
1056 __le16 *curr_ptr = (__le16 *)skb->data; 1108 __le16 *curr_ptr = (__le16 *)skb->data;
1057 u16 pkt_len = le16_to_cpu(*curr_ptr); 1109 u16 pkt_len = le16_to_cpu(*curr_ptr);
1110 struct mwifiex_rxinfo *rx_info;
1058 1111
1059 skb_trim(skb, pkt_len); 1112 if (upld_typ != MWIFIEX_TYPE_AGGR_DATA) {
1060 skb_pull(skb, INTF_HEADER_LEN); 1113 skb_trim(skb, pkt_len);
1114 skb_pull(skb, INTF_HEADER_LEN);
1115 }
1061 1116
1062 switch (upld_typ) { 1117 switch (upld_typ) {
1118 case MWIFIEX_TYPE_AGGR_DATA:
1119 dev_dbg(adapter->dev, "info: --- Rx: Aggr Data packet ---\n");
1120 rx_info = MWIFIEX_SKB_RXCB(skb);
1121 rx_info->buf_type = MWIFIEX_TYPE_AGGR_DATA;
1122 if (adapter->rx_work_enabled) {
1123 skb_queue_tail(&adapter->rx_data_q, skb);
1124 atomic_inc(&adapter->rx_pending);
1125 adapter->data_received = true;
1126 } else {
1127 mwifiex_deaggr_sdio_pkt(adapter, skb);
1128 dev_kfree_skb_any(skb);
1129 }
1130 break;
1131
1063 case MWIFIEX_TYPE_DATA: 1132 case MWIFIEX_TYPE_DATA:
1064 dev_dbg(adapter->dev, "info: --- Rx: Data packet ---\n"); 1133 dev_dbg(adapter->dev, "info: --- Rx: Data packet ---\n");
1065 if (adapter->rx_work_enabled) { 1134 if (adapter->rx_work_enabled) {
@@ -1127,17 +1196,17 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,
1127 * provided there is space left, processed and finally uploaded. 1196 * provided there is space left, processed and finally uploaded.
1128 */ 1197 */
1129static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter, 1198static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1130 struct sk_buff *skb, u8 port) 1199 u16 rx_len, u8 port)
1131{ 1200{
1132 struct sdio_mmc_card *card = adapter->card; 1201 struct sdio_mmc_card *card = adapter->card;
1133 s32 f_do_rx_aggr = 0; 1202 s32 f_do_rx_aggr = 0;
1134 s32 f_do_rx_cur = 0; 1203 s32 f_do_rx_cur = 0;
1135 s32 f_aggr_cur = 0; 1204 s32 f_aggr_cur = 0;
1205 s32 f_post_aggr_cur = 0;
1136 struct sk_buff *skb_deaggr; 1206 struct sk_buff *skb_deaggr;
1137 u32 pind; 1207 struct sk_buff *skb = NULL;
1138 u32 pkt_len, pkt_type, mport; 1208 u32 pkt_len, pkt_type, mport, pind;
1139 u8 *curr_ptr; 1209 u8 *curr_ptr;
1140 u32 rx_len = skb->len;
1141 1210
1142 if ((card->has_control_mask) && (port == CTRL_PORT)) { 1211 if ((card->has_control_mask) && (port == CTRL_PORT)) {
1143 /* Read the command Resp without aggr */ 1212 /* Read the command Resp without aggr */
@@ -1164,12 +1233,12 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1164 dev_dbg(adapter->dev, "info: %s: not last packet\n", __func__); 1233 dev_dbg(adapter->dev, "info: %s: not last packet\n", __func__);
1165 1234
1166 if (MP_RX_AGGR_IN_PROGRESS(card)) { 1235 if (MP_RX_AGGR_IN_PROGRESS(card)) {
1167 if (MP_RX_AGGR_BUF_HAS_ROOM(card, skb->len)) { 1236 if (MP_RX_AGGR_BUF_HAS_ROOM(card, rx_len)) {
1168 f_aggr_cur = 1; 1237 f_aggr_cur = 1;
1169 } else { 1238 } else {
1170 /* No room in Aggr buf, do rx aggr now */ 1239 /* No room in Aggr buf, do rx aggr now */
1171 f_do_rx_aggr = 1; 1240 f_do_rx_aggr = 1;
1172 f_do_rx_cur = 1; 1241 f_post_aggr_cur = 1;
1173 } 1242 }
1174 } else { 1243 } else {
1175 /* Rx aggr not in progress */ 1244 /* Rx aggr not in progress */
@@ -1182,7 +1251,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1182 1251
1183 if (MP_RX_AGGR_IN_PROGRESS(card)) { 1252 if (MP_RX_AGGR_IN_PROGRESS(card)) {
1184 f_do_rx_aggr = 1; 1253 f_do_rx_aggr = 1;
1185 if (MP_RX_AGGR_BUF_HAS_ROOM(card, skb->len)) 1254 if (MP_RX_AGGR_BUF_HAS_ROOM(card, rx_len))
1186 f_aggr_cur = 1; 1255 f_aggr_cur = 1;
1187 else 1256 else
1188 /* No room in Aggr buf, do rx aggr now */ 1257 /* No room in Aggr buf, do rx aggr now */
@@ -1195,7 +1264,7 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1195 if (f_aggr_cur) { 1264 if (f_aggr_cur) {
1196 dev_dbg(adapter->dev, "info: current packet aggregation\n"); 1265 dev_dbg(adapter->dev, "info: current packet aggregation\n");
1197 /* Curr pkt can be aggregated */ 1266 /* Curr pkt can be aggregated */
1198 mp_rx_aggr_setup(card, skb, port); 1267 mp_rx_aggr_setup(card, rx_len, port);
1199 1268
1200 if (MP_RX_AGGR_PKT_LIMIT_REACHED(card) || 1269 if (MP_RX_AGGR_PKT_LIMIT_REACHED(card) ||
1201 mp_rx_aggr_port_limit_reached(card)) { 1270 mp_rx_aggr_port_limit_reached(card)) {
@@ -1238,16 +1307,29 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1238 curr_ptr = card->mpa_rx.buf; 1307 curr_ptr = card->mpa_rx.buf;
1239 1308
1240 for (pind = 0; pind < card->mpa_rx.pkt_cnt; pind++) { 1309 for (pind = 0; pind < card->mpa_rx.pkt_cnt; pind++) {
1310 u32 *len_arr = card->mpa_rx.len_arr;
1241 1311
1242 /* get curr PKT len & type */ 1312 /* get curr PKT len & type */
1243 pkt_len = le16_to_cpu(*(__le16 *) &curr_ptr[0]); 1313 pkt_len = le16_to_cpu(*(__le16 *) &curr_ptr[0]);
1244 pkt_type = le16_to_cpu(*(__le16 *) &curr_ptr[2]); 1314 pkt_type = le16_to_cpu(*(__le16 *) &curr_ptr[2]);
1245 1315
1246 /* copy pkt to deaggr buf */ 1316 /* copy pkt to deaggr buf */
1247 skb_deaggr = card->mpa_rx.skb_arr[pind]; 1317 skb_deaggr = mwifiex_alloc_dma_align_buf(len_arr[pind],
1318 GFP_KERNEL |
1319 GFP_DMA);
1320 if (!skb_deaggr) {
1321 dev_err(adapter->dev, "skb allocation failure drop pkt len=%d type=%d\n",
1322 pkt_len, pkt_type);
1323 curr_ptr += len_arr[pind];
1324 continue;
1325 }
1248 1326
1249 if ((pkt_type == MWIFIEX_TYPE_DATA) && (pkt_len <= 1327 skb_put(skb_deaggr, len_arr[pind]);
1250 card->mpa_rx.len_arr[pind])) { 1328
1329 if ((pkt_type == MWIFIEX_TYPE_DATA ||
1330 (pkt_type == MWIFIEX_TYPE_AGGR_DATA &&
1331 adapter->sdio_rx_aggr_enable)) &&
1332 (pkt_len <= len_arr[pind])) {
1251 1333
1252 memcpy(skb_deaggr->data, curr_ptr, pkt_len); 1334 memcpy(skb_deaggr->data, curr_ptr, pkt_len);
1253 1335
@@ -1257,13 +1339,15 @@ static int mwifiex_sdio_card_to_host_mp_aggr(struct mwifiex_adapter *adapter,
1257 mwifiex_decode_rx_packet(adapter, skb_deaggr, 1339 mwifiex_decode_rx_packet(adapter, skb_deaggr,
1258 pkt_type); 1340 pkt_type);
1259 } else { 1341 } else {
1260 dev_err(adapter->dev, "wrong aggr pkt:" 1342 dev_err(adapter->dev, " drop wrong aggr pkt:\t"
1261 " type=%d len=%d max_len=%d\n", 1343 "sdio_single_port_rx_aggr=%d\t"
1344 "type=%d len=%d max_len=%d\n",
1345 adapter->sdio_rx_aggr_enable,
1262 pkt_type, pkt_len, 1346 pkt_type, pkt_len,
1263 card->mpa_rx.len_arr[pind]); 1347 len_arr[pind]);
1264 dev_kfree_skb_any(skb_deaggr); 1348 dev_kfree_skb_any(skb_deaggr);
1265 } 1349 }
1266 curr_ptr += card->mpa_rx.len_arr[pind]; 1350 curr_ptr += len_arr[pind];
1267 } 1351 }
1268 MP_RX_AGGR_BUF_RESET(card); 1352 MP_RX_AGGR_BUF_RESET(card);
1269 } 1353 }
@@ -1273,28 +1357,46 @@ rx_curr_single:
1273 dev_dbg(adapter->dev, "info: RX: port: %d, rx_len: %d\n", 1357 dev_dbg(adapter->dev, "info: RX: port: %d, rx_len: %d\n",
1274 port, rx_len); 1358 port, rx_len);
1275 1359
1360 skb = mwifiex_alloc_dma_align_buf(rx_len, GFP_KERNEL | GFP_DMA);
1361 if (!skb) {
1362 dev_err(adapter->dev, "single skb allocated fail,\t"
1363 "drop pkt port=%d len=%d\n", port, rx_len);
1364 if (mwifiex_sdio_card_to_host(adapter, &pkt_type,
1365 card->mpa_rx.buf, rx_len,
1366 adapter->ioport + port))
1367 goto error;
1368 return 0;
1369 }
1370
1371 skb_put(skb, rx_len);
1372
1276 if (mwifiex_sdio_card_to_host(adapter, &pkt_type, 1373 if (mwifiex_sdio_card_to_host(adapter, &pkt_type,
1277 skb->data, skb->len, 1374 skb->data, skb->len,
1278 adapter->ioport + port)) 1375 adapter->ioport + port))
1279 goto error; 1376 goto error;
1377 if (!adapter->sdio_rx_aggr_enable &&
1378 pkt_type == MWIFIEX_TYPE_AGGR_DATA) {
1379 dev_err(adapter->dev, "drop wrong pkt type %d\t"
1380 "current SDIO RX Aggr not enabled\n",
1381 pkt_type);
1382 dev_kfree_skb_any(skb);
1383 return 0;
1384 }
1280 1385
1281 mwifiex_decode_rx_packet(adapter, skb, pkt_type); 1386 mwifiex_decode_rx_packet(adapter, skb, pkt_type);
1282 } 1387 }
1388 if (f_post_aggr_cur) {
1389 dev_dbg(adapter->dev, "info: current packet aggregation\n");
1390 /* Curr pkt can be aggregated */
1391 mp_rx_aggr_setup(card, rx_len, port);
1392 }
1283 1393
1284 return 0; 1394 return 0;
1285
1286error: 1395error:
1287 if (MP_RX_AGGR_IN_PROGRESS(card)) { 1396 if (MP_RX_AGGR_IN_PROGRESS(card))
1288 /* Multiport-aggregation transfer failed - cleanup */
1289 for (pind = 0; pind < card->mpa_rx.pkt_cnt; pind++) {
1290 /* copy pkt to deaggr buf */
1291 skb_deaggr = card->mpa_rx.skb_arr[pind];
1292 dev_kfree_skb_any(skb_deaggr);
1293 }
1294 MP_RX_AGGR_BUF_RESET(card); 1397 MP_RX_AGGR_BUF_RESET(card);
1295 }
1296 1398
1297 if (f_do_rx_cur) 1399 if (f_do_rx_cur && skb)
1298 /* Single transfer pending. Free curr buff also */ 1400 /* Single transfer pending. Free curr buff also */
1299 dev_kfree_skb_any(skb); 1401 dev_kfree_skb_any(skb);
1300 1402
@@ -1356,8 +1458,9 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1356 MWIFIEX_RX_DATA_BUF_SIZE) 1458 MWIFIEX_RX_DATA_BUF_SIZE)
1357 return -1; 1459 return -1;
1358 rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE); 1460 rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
1461 dev_dbg(adapter->dev, "info: rx_len = %d\n", rx_len);
1359 1462
1360 skb = dev_alloc_skb(rx_len); 1463 skb = mwifiex_alloc_dma_align_buf(rx_len, GFP_KERNEL | GFP_DMA);
1361 if (!skb) 1464 if (!skb)
1362 return -1; 1465 return -1;
1363 1466
@@ -1447,27 +1550,16 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1447 1) / MWIFIEX_SDIO_BLOCK_SIZE; 1550 1) / MWIFIEX_SDIO_BLOCK_SIZE;
1448 if (rx_len <= INTF_HEADER_LEN || 1551 if (rx_len <= INTF_HEADER_LEN ||
1449 (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) > 1552 (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) >
1450 MWIFIEX_RX_DATA_BUF_SIZE) { 1553 card->mpa_rx.buf_size) {
1451 dev_err(adapter->dev, "invalid rx_len=%d\n", 1554 dev_err(adapter->dev, "invalid rx_len=%d\n",
1452 rx_len); 1555 rx_len);
1453 return -1; 1556 return -1;
1454 } 1557 }
1455 rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
1456
1457 skb = dev_alloc_skb(rx_len);
1458
1459 if (!skb) {
1460 dev_err(adapter->dev, "%s: failed to alloc skb",
1461 __func__);
1462 return -1;
1463 }
1464 1558
1465 skb_put(skb, rx_len); 1559 rx_len = (u16) (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE);
1466 1560 dev_dbg(adapter->dev, "info: rx_len = %d\n", rx_len);
1467 dev_dbg(adapter->dev, "info: rx_len = %d skb->len = %d\n",
1468 rx_len, skb->len);
1469 1561
1470 if (mwifiex_sdio_card_to_host_mp_aggr(adapter, skb, 1562 if (mwifiex_sdio_card_to_host_mp_aggr(adapter, rx_len,
1471 port)) { 1563 port)) {
1472 dev_err(adapter->dev, "card_to_host_mpa failed:" 1564 dev_err(adapter->dev, "card_to_host_mpa failed:"
1473 " int status=%#x\n", sdio_ireg); 1565 " int status=%#x\n", sdio_ireg);
@@ -1735,6 +1827,7 @@ static int mwifiex_alloc_sdio_mpa_buffers(struct mwifiex_adapter *adapter,
1735 u32 mpa_tx_buf_size, u32 mpa_rx_buf_size) 1827 u32 mpa_tx_buf_size, u32 mpa_rx_buf_size)
1736{ 1828{
1737 struct sdio_mmc_card *card = adapter->card; 1829 struct sdio_mmc_card *card = adapter->card;
1830 u32 rx_buf_size;
1738 int ret = 0; 1831 int ret = 0;
1739 1832
1740 card->mpa_tx.buf = kzalloc(mpa_tx_buf_size, GFP_KERNEL); 1833 card->mpa_tx.buf = kzalloc(mpa_tx_buf_size, GFP_KERNEL);
@@ -1745,13 +1838,15 @@ static int mwifiex_alloc_sdio_mpa_buffers(struct mwifiex_adapter *adapter,
1745 1838
1746 card->mpa_tx.buf_size = mpa_tx_buf_size; 1839 card->mpa_tx.buf_size = mpa_tx_buf_size;
1747 1840
1748 card->mpa_rx.buf = kzalloc(mpa_rx_buf_size, GFP_KERNEL); 1841 rx_buf_size = max_t(u32, mpa_rx_buf_size,
1842 (u32)SDIO_MAX_AGGR_BUF_SIZE);
1843 card->mpa_rx.buf = kzalloc(rx_buf_size, GFP_KERNEL);
1749 if (!card->mpa_rx.buf) { 1844 if (!card->mpa_rx.buf) {
1750 ret = -1; 1845 ret = -1;
1751 goto error; 1846 goto error;
1752 } 1847 }
1753 1848
1754 card->mpa_rx.buf_size = mpa_rx_buf_size; 1849 card->mpa_rx.buf_size = rx_buf_size;
1755 1850
1756error: 1851error:
1757 if (ret) { 1852 if (ret) {
@@ -1887,7 +1982,7 @@ static int mwifiex_init_sdio(struct mwifiex_adapter *adapter)
1887 return -1; 1982 return -1;
1888 } 1983 }
1889 1984
1890 adapter->auto_tdls = card->auto_tdls; 1985 adapter->auto_tdls = card->can_auto_tdls;
1891 adapter->ext_scan = card->can_ext_scan; 1986 adapter->ext_scan = card->can_ext_scan;
1892 return ret; 1987 return ret;
1893} 1988}
@@ -1950,6 +2045,7 @@ mwifiex_update_mp_end_port(struct mwifiex_adapter *adapter, u16 port)
1950 port, card->mp_data_port_mask); 2045 port, card->mp_data_port_mask);
1951} 2046}
1952 2047
2048static struct mwifiex_adapter *save_adapter;
1953static void mwifiex_sdio_card_reset_work(struct mwifiex_adapter *adapter) 2049static void mwifiex_sdio_card_reset_work(struct mwifiex_adapter *adapter)
1954{ 2050{
1955 struct sdio_mmc_card *card = adapter->card; 2051 struct sdio_mmc_card *card = adapter->card;
@@ -2018,10 +2114,8 @@ rdwr_status mwifiex_sdio_rdwr_firmware(struct mwifiex_adapter *adapter,
2018} 2114}
2019 2115
2020/* This function dump firmware memory to file */ 2116/* This function dump firmware memory to file */
2021static void mwifiex_sdio_fw_dump_work(struct work_struct *work) 2117static void mwifiex_sdio_fw_dump_work(struct mwifiex_adapter *adapter)
2022{ 2118{
2023 struct mwifiex_adapter *adapter =
2024 container_of(work, struct mwifiex_adapter, iface_work);
2025 struct sdio_mmc_card *card = adapter->card; 2119 struct sdio_mmc_card *card = adapter->card;
2026 int ret = 0; 2120 int ret = 0;
2027 unsigned int reg, reg_start, reg_end; 2121 unsigned int reg, reg_start, reg_end;
@@ -2032,7 +2126,7 @@ static void mwifiex_sdio_fw_dump_work(struct work_struct *work)
2032 2126
2033 mwifiex_dump_drv_info(adapter); 2127 mwifiex_dump_drv_info(adapter);
2034 2128
2035 if (!card->supports_fw_dump) 2129 if (!card->can_dump_fw)
2036 return; 2130 return;
2037 2131
2038 for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) { 2132 for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) {
@@ -2143,36 +2237,36 @@ done:
2143 2237
2144static void mwifiex_sdio_work(struct work_struct *work) 2238static void mwifiex_sdio_work(struct work_struct *work)
2145{ 2239{
2146 struct mwifiex_adapter *adapter =
2147 container_of(work, struct mwifiex_adapter, iface_work);
2148
2149 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2150 &adapter->iface_work_flags))
2151 mwifiex_sdio_card_reset_work(adapter);
2152 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_FW_DUMP, 2240 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_FW_DUMP,
2153 &adapter->iface_work_flags)) 2241 &iface_work_flags))
2154 mwifiex_sdio_fw_dump_work(work); 2242 mwifiex_sdio_fw_dump_work(save_adapter);
2243 if (test_and_clear_bit(MWIFIEX_IFACE_WORK_CARD_RESET,
2244 &iface_work_flags))
2245 mwifiex_sdio_card_reset_work(save_adapter);
2155} 2246}
2156 2247
2248static DECLARE_WORK(sdio_work, mwifiex_sdio_work);
2157/* This function resets the card */ 2249/* This function resets the card */
2158static void mwifiex_sdio_card_reset(struct mwifiex_adapter *adapter) 2250static void mwifiex_sdio_card_reset(struct mwifiex_adapter *adapter)
2159{ 2251{
2160 if (test_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &adapter->iface_work_flags)) 2252 save_adapter = adapter;
2253 if (test_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &iface_work_flags))
2161 return; 2254 return;
2162 2255
2163 set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &adapter->iface_work_flags); 2256 set_bit(MWIFIEX_IFACE_WORK_CARD_RESET, &iface_work_flags);
2164 2257
2165 schedule_work(&adapter->iface_work); 2258 schedule_work(&sdio_work);
2166} 2259}
2167 2260
2168/* This function dumps FW information */ 2261/* This function dumps FW information */
2169static void mwifiex_sdio_fw_dump(struct mwifiex_adapter *adapter) 2262static void mwifiex_sdio_fw_dump(struct mwifiex_adapter *adapter)
2170{ 2263{
2171 if (test_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &adapter->iface_work_flags)) 2264 save_adapter = adapter;
2265 if (test_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &iface_work_flags))
2172 return; 2266 return;
2173 2267
2174 set_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &adapter->iface_work_flags); 2268 set_bit(MWIFIEX_IFACE_WORK_FW_DUMP, &iface_work_flags);
2175 schedule_work(&adapter->iface_work); 2269 schedule_work(&sdio_work);
2176} 2270}
2177 2271
2178/* Function to dump SDIO function registers and SDIO scratch registers in case 2272/* Function to dump SDIO function registers and SDIO scratch registers in case
@@ -2288,9 +2382,9 @@ static struct mwifiex_if_ops sdio_ops = {
2288 .cmdrsp_complete = mwifiex_sdio_cmdrsp_complete, 2382 .cmdrsp_complete = mwifiex_sdio_cmdrsp_complete,
2289 .event_complete = mwifiex_sdio_event_complete, 2383 .event_complete = mwifiex_sdio_event_complete,
2290 .card_reset = mwifiex_sdio_card_reset, 2384 .card_reset = mwifiex_sdio_card_reset,
2291 .iface_work = mwifiex_sdio_work,
2292 .fw_dump = mwifiex_sdio_fw_dump, 2385 .fw_dump = mwifiex_sdio_fw_dump,
2293 .reg_dump = mwifiex_sdio_reg_dump, 2386 .reg_dump = mwifiex_sdio_reg_dump,
2387 .deaggr_pkt = mwifiex_deaggr_sdio_pkt,
2294}; 2388};
2295 2389
2296/* 2390/*
@@ -2327,6 +2421,7 @@ mwifiex_sdio_cleanup_module(void)
2327 2421
2328 /* Set the flag as user is removing this module. */ 2422 /* Set the flag as user is removing this module. */
2329 user_rmmod = 1; 2423 user_rmmod = 1;
2424 cancel_work_sync(&sdio_work);
2330 2425
2331 sdio_unregister_driver(&mwifiex_sdio); 2426 sdio_unregister_driver(&mwifiex_sdio);
2332} 2427}
diff --git a/drivers/net/wireless/mwifiex/sdio.h b/drivers/net/wireless/mwifiex/sdio.h
index 957cca246618..6f645cf47369 100644
--- a/drivers/net/wireless/mwifiex/sdio.h
+++ b/drivers/net/wireless/mwifiex/sdio.h
@@ -67,6 +67,8 @@
67 67
68#define MWIFIEX_MP_AGGR_BUF_SIZE_16K (16384) 68#define MWIFIEX_MP_AGGR_BUF_SIZE_16K (16384)
69#define MWIFIEX_MP_AGGR_BUF_SIZE_32K (32768) 69#define MWIFIEX_MP_AGGR_BUF_SIZE_32K (32768)
70/* we leave one block of 256 bytes for DMA alignment*/
71#define MWIFIEX_MP_AGGR_BUF_SIZE_MAX (65280)
70 72
71/* Misc. Config Register : Auto Re-enable interrupts */ 73/* Misc. Config Register : Auto Re-enable interrupts */
72#define AUTO_RE_ENABLE_INT BIT(4) 74#define AUTO_RE_ENABLE_INT BIT(4)
@@ -238,9 +240,6 @@ struct sdio_mmc_card {
238 const struct mwifiex_sdio_card_reg *reg; 240 const struct mwifiex_sdio_card_reg *reg;
239 u8 max_ports; 241 u8 max_ports;
240 u8 mp_agg_pkt_limit; 242 u8 mp_agg_pkt_limit;
241 bool supports_sdio_new_mode;
242 bool has_control_mask;
243 bool supports_fw_dump;
244 u16 tx_buf_size; 243 u16 tx_buf_size;
245 u32 mp_tx_agg_buf_size; 244 u32 mp_tx_agg_buf_size;
246 u32 mp_rx_agg_buf_size; 245 u32 mp_rx_agg_buf_size;
@@ -255,7 +254,10 @@ struct sdio_mmc_card {
255 u8 curr_wr_port; 254 u8 curr_wr_port;
256 255
257 u8 *mp_regs; 256 u8 *mp_regs;
258 u8 auto_tdls; 257 bool supports_sdio_new_mode;
258 bool has_control_mask;
259 bool can_dump_fw;
260 bool can_auto_tdls;
259 bool can_ext_scan; 261 bool can_ext_scan;
260 262
261 struct mwifiex_sdio_mpa_tx mpa_tx; 263 struct mwifiex_sdio_mpa_tx mpa_tx;
@@ -267,13 +269,13 @@ struct mwifiex_sdio_device {
267 const struct mwifiex_sdio_card_reg *reg; 269 const struct mwifiex_sdio_card_reg *reg;
268 u8 max_ports; 270 u8 max_ports;
269 u8 mp_agg_pkt_limit; 271 u8 mp_agg_pkt_limit;
270 bool supports_sdio_new_mode;
271 bool has_control_mask;
272 bool supports_fw_dump;
273 u16 tx_buf_size; 272 u16 tx_buf_size;
274 u32 mp_tx_agg_buf_size; 273 u32 mp_tx_agg_buf_size;
275 u32 mp_rx_agg_buf_size; 274 u32 mp_rx_agg_buf_size;
276 u8 auto_tdls; 275 bool supports_sdio_new_mode;
276 bool has_control_mask;
277 bool can_dump_fw;
278 bool can_auto_tdls;
277 bool can_ext_scan; 279 bool can_ext_scan;
278}; 280};
279 281
@@ -412,13 +414,13 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8786 = {
412 .reg = &mwifiex_reg_sd87xx, 414 .reg = &mwifiex_reg_sd87xx,
413 .max_ports = 16, 415 .max_ports = 16,
414 .mp_agg_pkt_limit = 8, 416 .mp_agg_pkt_limit = 8,
415 .supports_sdio_new_mode = false,
416 .has_control_mask = true,
417 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K, 417 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
418 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 418 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
419 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 419 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
420 .supports_fw_dump = false, 420 .supports_sdio_new_mode = false,
421 .auto_tdls = false, 421 .has_control_mask = true,
422 .can_dump_fw = false,
423 .can_auto_tdls = false,
422 .can_ext_scan = false, 424 .can_ext_scan = false,
423}; 425};
424 426
@@ -427,13 +429,13 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8787 = {
427 .reg = &mwifiex_reg_sd87xx, 429 .reg = &mwifiex_reg_sd87xx,
428 .max_ports = 16, 430 .max_ports = 16,
429 .mp_agg_pkt_limit = 8, 431 .mp_agg_pkt_limit = 8,
430 .supports_sdio_new_mode = false,
431 .has_control_mask = true,
432 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K, 432 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
433 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 433 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
434 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 434 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
435 .supports_fw_dump = false, 435 .supports_sdio_new_mode = false,
436 .auto_tdls = false, 436 .has_control_mask = true,
437 .can_dump_fw = false,
438 .can_auto_tdls = false,
437 .can_ext_scan = true, 439 .can_ext_scan = true,
438}; 440};
439 441
@@ -442,13 +444,13 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8797 = {
442 .reg = &mwifiex_reg_sd87xx, 444 .reg = &mwifiex_reg_sd87xx,
443 .max_ports = 16, 445 .max_ports = 16,
444 .mp_agg_pkt_limit = 8, 446 .mp_agg_pkt_limit = 8,
445 .supports_sdio_new_mode = false,
446 .has_control_mask = true,
447 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K, 447 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
448 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 448 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
449 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 449 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
450 .supports_fw_dump = false, 450 .supports_sdio_new_mode = false,
451 .auto_tdls = false, 451 .has_control_mask = true,
452 .can_dump_fw = false,
453 .can_auto_tdls = false,
452 .can_ext_scan = true, 454 .can_ext_scan = true,
453}; 455};
454 456
@@ -457,13 +459,13 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8897 = {
457 .reg = &mwifiex_reg_sd8897, 459 .reg = &mwifiex_reg_sd8897,
458 .max_ports = 32, 460 .max_ports = 32,
459 .mp_agg_pkt_limit = 16, 461 .mp_agg_pkt_limit = 16,
462 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
463 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_MAX,
464 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_MAX,
460 .supports_sdio_new_mode = true, 465 .supports_sdio_new_mode = true,
461 .has_control_mask = false, 466 .has_control_mask = false,
462 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K, 467 .can_dump_fw = true,
463 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K, 468 .can_auto_tdls = false,
464 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K,
465 .supports_fw_dump = true,
466 .auto_tdls = false,
467 .can_ext_scan = true, 469 .can_ext_scan = true,
468}; 470};
469 471
@@ -472,13 +474,13 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = {
472 .reg = &mwifiex_reg_sd8887, 474 .reg = &mwifiex_reg_sd8887,
473 .max_ports = 32, 475 .max_ports = 32,
474 .mp_agg_pkt_limit = 16, 476 .mp_agg_pkt_limit = 16,
475 .supports_sdio_new_mode = true, 477 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
476 .has_control_mask = false,
477 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
478 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K, 478 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K,
479 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K, 479 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K,
480 .supports_fw_dump = false, 480 .supports_sdio_new_mode = true,
481 .auto_tdls = true, 481 .has_control_mask = false,
482 .can_dump_fw = false,
483 .can_auto_tdls = true,
482 .can_ext_scan = true, 484 .can_ext_scan = true,
483}; 485};
484 486
@@ -492,8 +494,8 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8801 = {
492 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K, 494 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_2K,
493 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 495 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
494 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K, 496 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_16K,
495 .supports_fw_dump = false, 497 .can_dump_fw = false,
496 .auto_tdls = false, 498 .can_auto_tdls = false,
497 .can_ext_scan = true, 499 .can_ext_scan = true,
498}; 500};
499 501
@@ -571,9 +573,9 @@ mp_tx_aggr_port_limit_reached(struct sdio_mmc_card *card)
571 573
572/* Prepare to copy current packet from card to SDIO Rx aggregation buffer */ 574/* Prepare to copy current packet from card to SDIO Rx aggregation buffer */
573static inline void mp_rx_aggr_setup(struct sdio_mmc_card *card, 575static inline void mp_rx_aggr_setup(struct sdio_mmc_card *card,
574 struct sk_buff *skb, u8 port) 576 u16 rx_len, u8 port)
575{ 577{
576 card->mpa_rx.buf_len += skb->len; 578 card->mpa_rx.buf_len += rx_len;
577 579
578 if (!card->mpa_rx.pkt_cnt) 580 if (!card->mpa_rx.pkt_cnt)
579 card->mpa_rx.start_port = port; 581 card->mpa_rx.start_port = port;
@@ -586,8 +588,8 @@ static inline void mp_rx_aggr_setup(struct sdio_mmc_card *card,
586 else 588 else
587 card->mpa_rx.ports |= 1 << (card->mpa_rx.pkt_cnt + 1); 589 card->mpa_rx.ports |= 1 << (card->mpa_rx.pkt_cnt + 1);
588 } 590 }
589 card->mpa_rx.skb_arr[card->mpa_rx.pkt_cnt] = skb; 591 card->mpa_rx.skb_arr[card->mpa_rx.pkt_cnt] = NULL;
590 card->mpa_rx.len_arr[card->mpa_rx.pkt_cnt] = skb->len; 592 card->mpa_rx.len_arr[card->mpa_rx.pkt_cnt] = rx_len;
591 card->mpa_rx.pkt_cnt++; 593 card->mpa_rx.pkt_cnt++;
592} 594}
593#endif /* _MWIFIEX_SDIO_H */ 595#endif /* _MWIFIEX_SDIO_H */
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c
index f7d204ffd6e9..49422f2a5380 100644
--- a/drivers/net/wireless/mwifiex/sta_cmd.c
+++ b/drivers/net/wireless/mwifiex/sta_cmd.c
@@ -1370,22 +1370,29 @@ mwifiex_cmd_mef_cfg(struct mwifiex_private *priv,
1370 struct mwifiex_ds_mef_cfg *mef) 1370 struct mwifiex_ds_mef_cfg *mef)
1371{ 1371{
1372 struct host_cmd_ds_mef_cfg *mef_cfg = &cmd->params.mef_cfg; 1372 struct host_cmd_ds_mef_cfg *mef_cfg = &cmd->params.mef_cfg;
1373 struct mwifiex_fw_mef_entry *mef_entry = NULL;
1373 u8 *pos = (u8 *)mef_cfg; 1374 u8 *pos = (u8 *)mef_cfg;
1375 u16 i;
1374 1376
1375 cmd->command = cpu_to_le16(HostCmd_CMD_MEF_CFG); 1377 cmd->command = cpu_to_le16(HostCmd_CMD_MEF_CFG);
1376 1378
1377 mef_cfg->criteria = cpu_to_le32(mef->criteria); 1379 mef_cfg->criteria = cpu_to_le32(mef->criteria);
1378 mef_cfg->num_entries = cpu_to_le16(mef->num_entries); 1380 mef_cfg->num_entries = cpu_to_le16(mef->num_entries);
1379 pos += sizeof(*mef_cfg); 1381 pos += sizeof(*mef_cfg);
1380 mef_cfg->mef_entry->mode = mef->mef_entry->mode;
1381 mef_cfg->mef_entry->action = mef->mef_entry->action;
1382 pos += sizeof(*(mef_cfg->mef_entry));
1383 1382
1384 if (mwifiex_cmd_append_rpn_expression(priv, mef->mef_entry, &pos)) 1383 for (i = 0; i < mef->num_entries; i++) {
1385 return -1; 1384 mef_entry = (struct mwifiex_fw_mef_entry *)pos;
1385 mef_entry->mode = mef->mef_entry[i].mode;
1386 mef_entry->action = mef->mef_entry[i].action;
1387 pos += sizeof(*mef_cfg->mef_entry);
1388
1389 if (mwifiex_cmd_append_rpn_expression(priv,
1390 &mef->mef_entry[i], &pos))
1391 return -1;
1386 1392
1387 mef_cfg->mef_entry->exprsize = 1393 mef_entry->exprsize =
1388 cpu_to_le16(pos - mef_cfg->mef_entry->expr); 1394 cpu_to_le16(pos - mef_entry->expr);
1395 }
1389 cmd->size = cpu_to_le16((u16) (pos - (u8 *)mef_cfg) + S_DS_GEN); 1396 cmd->size = cpu_to_le16((u16) (pos - (u8 *)mef_cfg) + S_DS_GEN);
1390 1397
1391 return 0; 1398 return 0;
@@ -1664,6 +1671,25 @@ mwifiex_cmd_tdls_oper(struct mwifiex_private *priv,
1664 1671
1665 return 0; 1672 return 0;
1666} 1673}
1674
1675/* This function prepares command of sdio rx aggr info. */
1676static int mwifiex_cmd_sdio_rx_aggr_cfg(struct host_cmd_ds_command *cmd,
1677 u16 cmd_action, void *data_buf)
1678{
1679 struct host_cmd_sdio_sp_rx_aggr_cfg *cfg =
1680 &cmd->params.sdio_rx_aggr_cfg;
1681
1682 cmd->command = cpu_to_le16(HostCmd_CMD_SDIO_SP_RX_AGGR_CFG);
1683 cmd->size =
1684 cpu_to_le16(sizeof(struct host_cmd_sdio_sp_rx_aggr_cfg) +
1685 S_DS_GEN);
1686 cfg->action = cmd_action;
1687 if (cmd_action == HostCmd_ACT_GEN_SET)
1688 cfg->enable = *(u8 *)data_buf;
1689
1690 return 0;
1691}
1692
1667/* 1693/*
1668 * This function prepares the commands before sending them to the firmware. 1694 * This function prepares the commands before sending them to the firmware.
1669 * 1695 *
@@ -1901,6 +1927,10 @@ int mwifiex_sta_prepare_cmd(struct mwifiex_private *priv, uint16_t cmd_no,
1901 ret = mwifiex_cmd_issue_chan_report_request(priv, cmd_ptr, 1927 ret = mwifiex_cmd_issue_chan_report_request(priv, cmd_ptr,
1902 data_buf); 1928 data_buf);
1903 break; 1929 break;
1930 case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
1931 ret = mwifiex_cmd_sdio_rx_aggr_cfg(cmd_ptr, cmd_action,
1932 data_buf);
1933 break;
1904 default: 1934 default:
1905 dev_err(priv->adapter->dev, 1935 dev_err(priv->adapter->dev,
1906 "PREP_CMD: unknown cmd- %#x\n", cmd_no); 1936 "PREP_CMD: unknown cmd- %#x\n", cmd_no);
@@ -1940,6 +1970,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
1940 struct mwifiex_ds_auto_ds auto_ds; 1970 struct mwifiex_ds_auto_ds auto_ds;
1941 enum state_11d_t state_11d; 1971 enum state_11d_t state_11d;
1942 struct mwifiex_ds_11n_tx_cfg tx_cfg; 1972 struct mwifiex_ds_11n_tx_cfg tx_cfg;
1973 u8 sdio_sp_rx_aggr_enable;
1943 1974
1944 if (first_sta) { 1975 if (first_sta) {
1945 if (priv->adapter->iface_type == MWIFIEX_PCIE) { 1976 if (priv->adapter->iface_type == MWIFIEX_PCIE) {
@@ -1983,6 +2014,22 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
1983 if (ret) 2014 if (ret)
1984 return -1; 2015 return -1;
1985 2016
2017 /** Set SDIO Single Port RX Aggr Info */
2018 if (priv->adapter->iface_type == MWIFIEX_SDIO &&
2019 ISSUPP_SDIO_SPA_ENABLED(priv->adapter->fw_cap_info)) {
2020 sdio_sp_rx_aggr_enable = true;
2021 ret = mwifiex_send_cmd(priv,
2022 HostCmd_CMD_SDIO_SP_RX_AGGR_CFG,
2023 HostCmd_ACT_GEN_SET, 0,
2024 &sdio_sp_rx_aggr_enable,
2025 true);
2026 if (ret) {
2027 dev_err(priv->adapter->dev,
2028 "error while enabling SP aggregation..disable it");
2029 adapter->sdio_rx_aggr_enable = false;
2030 }
2031 }
2032
1986 /* Reconfigure tx buf size */ 2033 /* Reconfigure tx buf size */
1987 ret = mwifiex_send_cmd(priv, HostCmd_CMD_RECONFIGURE_TX_BUFF, 2034 ret = mwifiex_send_cmd(priv, HostCmd_CMD_RECONFIGURE_TX_BUFF,
1988 HostCmd_ACT_GEN_SET, 0, 2035 HostCmd_ACT_GEN_SET, 0,
diff --git a/drivers/net/wireless/mwifiex/sta_cmdresp.c b/drivers/net/wireless/mwifiex/sta_cmdresp.c
index 5f8da5924666..88dc6b672ef4 100644
--- a/drivers/net/wireless/mwifiex/sta_cmdresp.c
+++ b/drivers/net/wireless/mwifiex/sta_cmdresp.c
@@ -90,6 +90,10 @@ mwifiex_process_cmdresp_error(struct mwifiex_private *priv,
90 case HostCmd_CMD_MAC_CONTROL: 90 case HostCmd_CMD_MAC_CONTROL:
91 break; 91 break;
92 92
93 case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
94 dev_err(priv->adapter->dev, "SDIO RX single-port aggregation Not support\n");
95 break;
96
93 default: 97 default:
94 break; 98 break;
95 } 99 }
@@ -943,6 +947,20 @@ static int mwifiex_ret_cfg_data(struct mwifiex_private *priv,
943 return 0; 947 return 0;
944} 948}
945 949
950/** This Function handles the command response of sdio rx aggr */
951static int mwifiex_ret_sdio_rx_aggr_cfg(struct mwifiex_private *priv,
952 struct host_cmd_ds_command *resp)
953{
954 struct mwifiex_adapter *adapter = priv->adapter;
955 struct host_cmd_sdio_sp_rx_aggr_cfg *cfg =
956 &resp->params.sdio_rx_aggr_cfg;
957
958 adapter->sdio_rx_aggr_enable = cfg->enable;
959 adapter->sdio_rx_block_size = le16_to_cpu(cfg->block_size);
960
961 return 0;
962}
963
946/* 964/*
947 * This function handles the command responses. 965 * This function handles the command responses.
948 * 966 *
@@ -1124,6 +1142,9 @@ int mwifiex_process_sta_cmdresp(struct mwifiex_private *priv, u16 cmdresp_no,
1124 break; 1142 break;
1125 case HostCmd_CMD_CHAN_REPORT_REQUEST: 1143 case HostCmd_CMD_CHAN_REPORT_REQUEST:
1126 break; 1144 break;
1145 case HostCmd_CMD_SDIO_SP_RX_AGGR_CFG:
1146 ret = mwifiex_ret_sdio_rx_aggr_cfg(priv, resp);
1147 break;
1127 default: 1148 default:
1128 dev_err(adapter->dev, "CMD_RESP: unknown cmd response %#x\n", 1149 dev_err(adapter->dev, "CMD_RESP: unknown cmd response %#x\n",
1129 resp->command); 1150 resp->command);
diff --git a/drivers/net/wireless/mwifiex/sta_event.c b/drivers/net/wireless/mwifiex/sta_event.c
index 80ffe7412496..0dc7a1d3993d 100644
--- a/drivers/net/wireless/mwifiex/sta_event.c
+++ b/drivers/net/wireless/mwifiex/sta_event.c
@@ -135,7 +135,7 @@ mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code)
135 cfg80211_disconnected(priv->netdev, reason_code, NULL, 0, 135 cfg80211_disconnected(priv->netdev, reason_code, NULL, 0,
136 GFP_KERNEL); 136 GFP_KERNEL);
137 } 137 }
138 memset(priv->cfg_bssid, 0, ETH_ALEN); 138 eth_zero_addr(priv->cfg_bssid);
139 139
140 mwifiex_stop_net_dev_queue(priv->netdev, adapter); 140 mwifiex_stop_net_dev_queue(priv->netdev, adapter);
141 if (netif_carrier_ok(priv->netdev)) 141 if (netif_carrier_ok(priv->netdev))
@@ -312,7 +312,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
312 adapter->ps_state = PS_STATE_AWAKE; 312 adapter->ps_state = PS_STATE_AWAKE;
313 adapter->pm_wakeup_card_req = false; 313 adapter->pm_wakeup_card_req = false;
314 adapter->pm_wakeup_fw_try = false; 314 adapter->pm_wakeup_fw_try = false;
315 del_timer_sync(&adapter->wakeup_timer); 315 del_timer(&adapter->wakeup_timer);
316 break; 316 break;
317 } 317 }
318 if (!mwifiex_send_null_packet 318 if (!mwifiex_send_null_packet
@@ -327,7 +327,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv)
327 adapter->ps_state = PS_STATE_AWAKE; 327 adapter->ps_state = PS_STATE_AWAKE;
328 adapter->pm_wakeup_card_req = false; 328 adapter->pm_wakeup_card_req = false;
329 adapter->pm_wakeup_fw_try = false; 329 adapter->pm_wakeup_fw_try = false;
330 del_timer_sync(&adapter->wakeup_timer); 330 del_timer(&adapter->wakeup_timer);
331 331
332 break; 332 break;
333 333
diff --git a/drivers/net/wireless/mwifiex/txrx.c b/drivers/net/wireless/mwifiex/txrx.c
index ac93557cbdc9..a245f444aeec 100644
--- a/drivers/net/wireless/mwifiex/txrx.c
+++ b/drivers/net/wireless/mwifiex/txrx.c
@@ -80,23 +80,29 @@ EXPORT_SYMBOL_GPL(mwifiex_handle_rx_packet);
80int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb, 80int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
81 struct mwifiex_tx_param *tx_param) 81 struct mwifiex_tx_param *tx_param)
82{ 82{
83 int ret = -1; 83 int hroom, ret = -1;
84 struct mwifiex_adapter *adapter = priv->adapter; 84 struct mwifiex_adapter *adapter = priv->adapter;
85 u8 *head_ptr; 85 u8 *head_ptr;
86 struct txpd *local_tx_pd = NULL; 86 struct txpd *local_tx_pd = NULL;
87 87
88 hroom = (adapter->iface_type == MWIFIEX_USB) ? 0 : INTF_HEADER_LEN;
89
88 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP) 90 if (priv->bss_role == MWIFIEX_BSS_ROLE_UAP)
89 head_ptr = mwifiex_process_uap_txpd(priv, skb); 91 head_ptr = mwifiex_process_uap_txpd(priv, skb);
90 else 92 else
91 head_ptr = mwifiex_process_sta_txpd(priv, skb); 93 head_ptr = mwifiex_process_sta_txpd(priv, skb);
92 94
95 if ((adapter->data_sent || adapter->tx_lock_flag) && head_ptr) {
96 skb_queue_tail(&adapter->tx_data_q, skb);
97 atomic_inc(&adapter->tx_queued);
98 return 0;
99 }
100
93 if (head_ptr) { 101 if (head_ptr) {
94 if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) 102 if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA)
95 local_tx_pd = 103 local_tx_pd = (struct txpd *)(head_ptr + hroom);
96 (struct txpd *) (head_ptr + INTF_HEADER_LEN);
97 if (adapter->iface_type == MWIFIEX_USB) { 104 if (adapter->iface_type == MWIFIEX_USB) {
98 adapter->data_sent = true; 105 adapter->data_sent = true;
99 skb_pull(skb, INTF_HEADER_LEN);
100 ret = adapter->if_ops.host_to_card(adapter, 106 ret = adapter->if_ops.host_to_card(adapter,
101 MWIFIEX_USB_EP_DATA, 107 MWIFIEX_USB_EP_DATA,
102 skb, NULL); 108 skb, NULL);
@@ -142,6 +148,123 @@ int mwifiex_process_tx(struct mwifiex_private *priv, struct sk_buff *skb,
142 return ret; 148 return ret;
143} 149}
144 150
151static int mwifiex_host_to_card(struct mwifiex_adapter *adapter,
152 struct sk_buff *skb,
153 struct mwifiex_tx_param *tx_param)
154{
155 struct txpd *local_tx_pd = NULL;
156 u8 *head_ptr = skb->data;
157 int ret = 0;
158 struct mwifiex_private *priv;
159 struct mwifiex_txinfo *tx_info;
160
161 tx_info = MWIFIEX_SKB_TXCB(skb);
162 priv = mwifiex_get_priv_by_id(adapter, tx_info->bss_num,
163 tx_info->bss_type);
164 if (!priv) {
165 dev_err(adapter->dev, "data: priv not found. Drop TX packet\n");
166 adapter->dbg.num_tx_host_to_card_failure++;
167 mwifiex_write_data_complete(adapter, skb, 0, 0);
168 return ret;
169 }
170 if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) {
171 if (adapter->iface_type == MWIFIEX_USB)
172 local_tx_pd = (struct txpd *)head_ptr;
173 else
174 local_tx_pd = (struct txpd *) (head_ptr +
175 INTF_HEADER_LEN);
176 }
177
178 if (adapter->iface_type == MWIFIEX_USB) {
179 adapter->data_sent = true;
180 ret = adapter->if_ops.host_to_card(adapter,
181 MWIFIEX_USB_EP_DATA,
182 skb, NULL);
183 } else {
184 ret = adapter->if_ops.host_to_card(adapter,
185 MWIFIEX_TYPE_DATA,
186 skb, tx_param);
187 }
188 switch (ret) {
189 case -ENOSR:
190 dev_err(adapter->dev, "data: -ENOSR is returned\n");
191 break;
192 case -EBUSY:
193 if ((GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_STA) &&
194 (adapter->pps_uapsd_mode) &&
195 (adapter->tx_lock_flag)) {
196 priv->adapter->tx_lock_flag = false;
197 if (local_tx_pd)
198 local_tx_pd->flags = 0;
199 }
200 skb_queue_head(&adapter->tx_data_q, skb);
201 if (tx_info->flags & MWIFIEX_BUF_FLAG_AGGR_PKT)
202 atomic_add(tx_info->aggr_num, &adapter->tx_queued);
203 else
204 atomic_inc(&adapter->tx_queued);
205 dev_dbg(adapter->dev, "data: -EBUSY is returned\n");
206 break;
207 case -1:
208 if (adapter->iface_type != MWIFIEX_PCIE)
209 adapter->data_sent = false;
210 dev_err(adapter->dev, "mwifiex_write_data_async failed: 0x%X\n",
211 ret);
212 adapter->dbg.num_tx_host_to_card_failure++;
213 mwifiex_write_data_complete(adapter, skb, 0, ret);
214 break;
215 case -EINPROGRESS:
216 if (adapter->iface_type != MWIFIEX_PCIE)
217 adapter->data_sent = false;
218 break;
219 case 0:
220 mwifiex_write_data_complete(adapter, skb, 0, ret);
221 break;
222 default:
223 break;
224 }
225 return ret;
226}
227
228static int
229mwifiex_dequeue_tx_queue(struct mwifiex_adapter *adapter)
230{
231 struct sk_buff *skb, *skb_next;
232 struct mwifiex_txinfo *tx_info;
233 struct mwifiex_tx_param tx_param;
234
235 skb = skb_dequeue(&adapter->tx_data_q);
236 if (!skb)
237 return -1;
238
239 tx_info = MWIFIEX_SKB_TXCB(skb);
240 if (tx_info->flags & MWIFIEX_BUF_FLAG_AGGR_PKT)
241 atomic_sub(tx_info->aggr_num, &adapter->tx_queued);
242 else
243 atomic_dec(&adapter->tx_queued);
244
245 if (!skb_queue_empty(&adapter->tx_data_q))
246 skb_next = skb_peek(&adapter->tx_data_q);
247 else
248 skb_next = NULL;
249 tx_param.next_pkt_len = ((skb_next) ? skb_next->len : 0);
250 if (!tx_param.next_pkt_len) {
251 if (!mwifiex_wmm_lists_empty(adapter))
252 tx_param.next_pkt_len = 1;
253 }
254 return mwifiex_host_to_card(adapter, skb, &tx_param);
255}
256
257void
258mwifiex_process_tx_queue(struct mwifiex_adapter *adapter)
259{
260 do {
261 if (adapter->data_sent || adapter->tx_lock_flag)
262 break;
263 if (mwifiex_dequeue_tx_queue(adapter))
264 break;
265 } while (!skb_queue_empty(&adapter->tx_data_q));
266}
267
145/* 268/*
146 * Packet send completion callback handler. 269 * Packet send completion callback handler.
147 * 270 *
@@ -179,8 +302,11 @@ int mwifiex_write_data_complete(struct mwifiex_adapter *adapter,
179 priv->stats.tx_errors++; 302 priv->stats.tx_errors++;
180 } 303 }
181 304
182 if (tx_info->flags & MWIFIEX_BUF_FLAG_BRIDGED_PKT) 305 if (tx_info->flags & MWIFIEX_BUF_FLAG_BRIDGED_PKT) {
183 atomic_dec_return(&adapter->pending_bridged_pkts); 306 atomic_dec_return(&adapter->pending_bridged_pkts);
307 if (tx_info->flags & MWIFIEX_BUF_FLAG_AGGR_PKT)
308 goto done;
309 }
184 310
185 if (aggr) 311 if (aggr)
186 /* For skb_aggr, do not wake up tx queue */ 312 /* For skb_aggr, do not wake up tx queue */
diff --git a/drivers/net/wireless/mwifiex/usb.c b/drivers/net/wireless/mwifiex/usb.c
index 223873022ffe..fd8027f200a0 100644
--- a/drivers/net/wireless/mwifiex/usb.c
+++ b/drivers/net/wireless/mwifiex/usb.c
@@ -193,7 +193,7 @@ static void mwifiex_usb_rx_complete(struct urb *urb)
193 dev_dbg(adapter->dev, "info: recv_length=%d, status=%d\n", 193 dev_dbg(adapter->dev, "info: recv_length=%d, status=%d\n",
194 recv_length, status); 194 recv_length, status);
195 if (status == -EINPROGRESS) { 195 if (status == -EINPROGRESS) {
196 queue_work(adapter->workqueue, &adapter->main_work); 196 mwifiex_queue_main_work(adapter);
197 197
198 /* urb for data_ep is re-submitted now; 198 /* urb for data_ep is re-submitted now;
199 * urb for cmd_ep will be re-submitted in callback 199 * urb for cmd_ep will be re-submitted in callback
@@ -262,7 +262,7 @@ static void mwifiex_usb_tx_complete(struct urb *urb)
262 urb->status ? -1 : 0); 262 urb->status ? -1 : 0);
263 } 263 }
264 264
265 queue_work(adapter->workqueue, &adapter->main_work); 265 mwifiex_queue_main_work(adapter);
266 266
267 return; 267 return;
268} 268}
@@ -1006,7 +1006,7 @@ static int mwifiex_pm_wakeup_card(struct mwifiex_adapter *adapter)
1006{ 1006{
1007 /* Simulation of HS_AWAKE event */ 1007 /* Simulation of HS_AWAKE event */
1008 adapter->pm_wakeup_fw_try = false; 1008 adapter->pm_wakeup_fw_try = false;
1009 del_timer_sync(&adapter->wakeup_timer); 1009 del_timer(&adapter->wakeup_timer);
1010 adapter->pm_wakeup_card_req = false; 1010 adapter->pm_wakeup_card_req = false;
1011 adapter->ps_state = PS_STATE_AWAKE; 1011 adapter->ps_state = PS_STATE_AWAKE;
1012 1012
diff --git a/drivers/net/wireless/mwifiex/util.c b/drivers/net/wireless/mwifiex/util.c
index 308550611f22..b8a45872354d 100644
--- a/drivers/net/wireless/mwifiex/util.c
+++ b/drivers/net/wireless/mwifiex/util.c
@@ -367,6 +367,13 @@ mwifiex_process_mgmt_packet(struct mwifiex_private *priv,
367 if (!skb) 367 if (!skb)
368 return -1; 368 return -1;
369 369
370 if (!priv->mgmt_frame_mask ||
371 priv->wdev.iftype == NL80211_IFTYPE_UNSPECIFIED) {
372 dev_dbg(priv->adapter->dev,
373 "do not receive mgmt frames on uninitialized intf");
374 return -1;
375 }
376
370 rx_pd = (struct rxpd *)skb->data; 377 rx_pd = (struct rxpd *)skb->data;
371 378
372 skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset)); 379 skb_pull(skb, le16_to_cpu(rx_pd->rx_pkt_offset));
@@ -624,3 +631,26 @@ void mwifiex_hist_data_reset(struct mwifiex_private *priv)
624 for (ix = 0; ix < MWIFIEX_MAX_SIG_STRENGTH; ix++) 631 for (ix = 0; ix < MWIFIEX_MAX_SIG_STRENGTH; ix++)
625 atomic_set(&phist_data->sig_str[ix], 0); 632 atomic_set(&phist_data->sig_str[ix], 0);
626} 633}
634
635void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags)
636{
637 struct sk_buff *skb;
638 int buf_len, pad;
639
640 buf_len = rx_len + MWIFIEX_RX_HEADROOM + MWIFIEX_DMA_ALIGN_SZ;
641
642 skb = __dev_alloc_skb(buf_len, flags);
643
644 if (!skb)
645 return NULL;
646
647 skb_reserve(skb, MWIFIEX_RX_HEADROOM);
648
649 pad = MWIFIEX_ALIGN_ADDR(skb->data, MWIFIEX_DMA_ALIGN_SZ) -
650 (long)skb->data;
651
652 skb_reserve(skb, pad);
653
654 return skb;
655}
656EXPORT_SYMBOL_GPL(mwifiex_alloc_dma_align_buf);
diff --git a/drivers/net/wireless/mwifiex/wmm.c b/drivers/net/wireless/mwifiex/wmm.c
index ef717acec8b7..b2e99569a0f8 100644
--- a/drivers/net/wireless/mwifiex/wmm.c
+++ b/drivers/net/wireless/mwifiex/wmm.c
@@ -157,6 +157,8 @@ void mwifiex_ralist_add(struct mwifiex_private *priv, const u8 *ra)
157 157
158 ra_list->is_11n_enabled = 0; 158 ra_list->is_11n_enabled = 0;
159 ra_list->tdls_link = false; 159 ra_list->tdls_link = false;
160 ra_list->ba_status = BA_SETUP_NONE;
161 ra_list->amsdu_in_ampdu = false;
160 if (!mwifiex_queuing_ra_based(priv)) { 162 if (!mwifiex_queuing_ra_based(priv)) {
161 if (mwifiex_get_tdls_link_status(priv, ra) == 163 if (mwifiex_get_tdls_link_status(priv, ra) ==
162 TDLS_SETUP_COMPLETE) { 164 TDLS_SETUP_COMPLETE) {
@@ -574,7 +576,7 @@ mwifiex_clean_txrx(struct mwifiex_private *priv)
574 * This function retrieves a particular RA list node, matching with the 576 * This function retrieves a particular RA list node, matching with the
575 * given TID and RA address. 577 * given TID and RA address.
576 */ 578 */
577static struct mwifiex_ra_list_tbl * 579struct mwifiex_ra_list_tbl *
578mwifiex_wmm_get_ralist_node(struct mwifiex_private *priv, u8 tid, 580mwifiex_wmm_get_ralist_node(struct mwifiex_private *priv, u8 tid,
579 const u8 *ra_addr) 581 const u8 *ra_addr)
580{ 582{
@@ -730,7 +732,7 @@ mwifiex_wmm_add_buf_txqueue(struct mwifiex_private *priv,
730 } else { 732 } else {
731 memcpy(ra, skb->data, ETH_ALEN); 733 memcpy(ra, skb->data, ETH_ALEN);
732 if (ra[0] & 0x01 || mwifiex_is_skb_mgmt_frame(skb)) 734 if (ra[0] & 0x01 || mwifiex_is_skb_mgmt_frame(skb))
733 memset(ra, 0xff, ETH_ALEN); 735 eth_broadcast_addr(ra);
734 ra_list = mwifiex_wmm_get_queue_raptr(priv, tid_down, ra); 736 ra_list = mwifiex_wmm_get_queue_raptr(priv, tid_down, ra);
735 } 737 }
736 738
@@ -942,14 +944,11 @@ mwifiex_wmm_get_highest_priolist_ptr(struct mwifiex_adapter *adapter,
942 struct mwifiex_ra_list_tbl *ptr; 944 struct mwifiex_ra_list_tbl *ptr;
943 struct mwifiex_tid_tbl *tid_ptr; 945 struct mwifiex_tid_tbl *tid_ptr;
944 atomic_t *hqp; 946 atomic_t *hqp;
945 unsigned long flags_bss, flags_ra; 947 unsigned long flags_ra;
946 int i, j; 948 int i, j;
947 949
948 /* check the BSS with highest priority first */ 950 /* check the BSS with highest priority first */
949 for (j = adapter->priv_num - 1; j >= 0; --j) { 951 for (j = adapter->priv_num - 1; j >= 0; --j) {
950 spin_lock_irqsave(&adapter->bss_prio_tbl[j].bss_prio_lock,
951 flags_bss);
952
953 /* iterate over BSS with the equal priority */ 952 /* iterate over BSS with the equal priority */
954 list_for_each_entry(adapter->bss_prio_tbl[j].bss_prio_cur, 953 list_for_each_entry(adapter->bss_prio_tbl[j].bss_prio_cur,
955 &adapter->bss_prio_tbl[j].bss_prio_head, 954 &adapter->bss_prio_tbl[j].bss_prio_head,
@@ -985,19 +984,15 @@ mwifiex_wmm_get_highest_priolist_ptr(struct mwifiex_adapter *adapter,
985 } 984 }
986 } 985 }
987 986
988 spin_unlock_irqrestore(&adapter->bss_prio_tbl[j].bss_prio_lock,
989 flags_bss);
990 } 987 }
991 988
992 return NULL; 989 return NULL;
993 990
994found: 991found:
995 /* holds bss_prio_lock / ra_list_spinlock */ 992 /* holds ra_list_spinlock */
996 if (atomic_read(hqp) > i) 993 if (atomic_read(hqp) > i)
997 atomic_set(hqp, i); 994 atomic_set(hqp, i);
998 spin_unlock_irqrestore(&priv_tmp->wmm.ra_list_spinlock, flags_ra); 995 spin_unlock_irqrestore(&priv_tmp->wmm.ra_list_spinlock, flags_ra);
999 spin_unlock_irqrestore(&adapter->bss_prio_tbl[j].bss_prio_lock,
1000 flags_bss);
1001 996
1002 *priv = priv_tmp; 997 *priv = priv_tmp;
1003 *tid = tos_to_tid[i]; 998 *tid = tos_to_tid[i];
@@ -1179,6 +1174,14 @@ mwifiex_send_processed_packet(struct mwifiex_private *priv,
1179 1174
1180 skb = skb_dequeue(&ptr->skb_head); 1175 skb = skb_dequeue(&ptr->skb_head);
1181 1176
1177 if (adapter->data_sent || adapter->tx_lock_flag) {
1178 spin_unlock_irqrestore(&priv->wmm.ra_list_spinlock,
1179 ra_list_flags);
1180 skb_queue_tail(&adapter->tx_data_q, skb);
1181 atomic_inc(&adapter->tx_queued);
1182 return;
1183 }
1184
1182 if (!skb_queue_empty(&ptr->skb_head)) 1185 if (!skb_queue_empty(&ptr->skb_head))
1183 skb_next = skb_peek(&ptr->skb_head); 1186 skb_next = skb_peek(&ptr->skb_head);
1184 else 1187 else
@@ -1276,13 +1279,13 @@ mwifiex_dequeue_tx_packet(struct mwifiex_adapter *adapter)
1276 } 1279 }
1277 1280
1278 if (!ptr->is_11n_enabled || 1281 if (!ptr->is_11n_enabled ||
1279 mwifiex_is_ba_stream_setup(priv, ptr, tid) || 1282 ptr->ba_status ||
1280 priv->wps.session_enable) { 1283 priv->wps.session_enable) {
1281 if (ptr->is_11n_enabled && 1284 if (ptr->is_11n_enabled &&
1282 mwifiex_is_ba_stream_setup(priv, ptr, tid) && 1285 ptr->ba_status &&
1283 mwifiex_is_amsdu_in_ampdu_allowed(priv, ptr, tid) && 1286 ptr->amsdu_in_ampdu &&
1284 mwifiex_is_amsdu_allowed(priv, tid) && 1287 mwifiex_is_amsdu_allowed(priv, tid) &&
1285 mwifiex_is_11n_aggragation_possible(priv, ptr, 1288 mwifiex_is_11n_aggragation_possible(priv, ptr,
1286 adapter->tx_buf_size)) 1289 adapter->tx_buf_size))
1287 mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index, flags); 1290 mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index, flags);
1288 /* ra_list_spinlock has been freed in 1291 /* ra_list_spinlock has been freed in
@@ -1329,11 +1332,16 @@ void
1329mwifiex_wmm_process_tx(struct mwifiex_adapter *adapter) 1332mwifiex_wmm_process_tx(struct mwifiex_adapter *adapter)
1330{ 1333{
1331 do { 1334 do {
1332 /* Check if busy */
1333 if (adapter->data_sent || adapter->tx_lock_flag)
1334 break;
1335
1336 if (mwifiex_dequeue_tx_packet(adapter)) 1335 if (mwifiex_dequeue_tx_packet(adapter))
1337 break; 1336 break;
1337 if (adapter->iface_type != MWIFIEX_SDIO) {
1338 if (adapter->data_sent ||
1339 adapter->tx_lock_flag)
1340 break;
1341 } else {
1342 if (atomic_read(&adapter->tx_queued) >=
1343 MWIFIEX_MAX_PKTS_TXQ)
1344 break;
1345 }
1338 } while (!mwifiex_wmm_lists_empty(adapter)); 1346 } while (!mwifiex_wmm_lists_empty(adapter));
1339} 1347}
diff --git a/drivers/net/wireless/mwifiex/wmm.h b/drivers/net/wireless/mwifiex/wmm.h
index 569bd73f33c5..48ece0b35591 100644
--- a/drivers/net/wireless/mwifiex/wmm.h
+++ b/drivers/net/wireless/mwifiex/wmm.h
@@ -127,4 +127,6 @@ mwifiex_wmm_get_queue_raptr(struct mwifiex_private *priv, u8 tid,
127 const u8 *ra_addr); 127 const u8 *ra_addr);
128u8 mwifiex_wmm_downgrade_tid(struct mwifiex_private *priv, u32 tid); 128u8 mwifiex_wmm_downgrade_tid(struct mwifiex_private *priv, u32 tid);
129 129
130struct mwifiex_ra_list_tbl *mwifiex_wmm_get_ralist_node(struct mwifiex_private
131 *priv, u8 tid, const u8 *ra_addr);
130#endif /* !_MWIFIEX_WMM_H_ */ 132#endif /* !_MWIFIEX_WMM_H_ */
diff --git a/drivers/net/wireless/mwl8k.c b/drivers/net/wireless/mwl8k.c
index f9b1218c761a..95921167b53f 100644
--- a/drivers/net/wireless/mwl8k.c
+++ b/drivers/net/wireless/mwl8k.c
@@ -1277,7 +1277,7 @@ static inline void mwl8k_save_beacon(struct ieee80211_hw *hw,
1277 struct mwl8k_priv *priv = hw->priv; 1277 struct mwl8k_priv *priv = hw->priv;
1278 1278
1279 priv->capture_beacon = false; 1279 priv->capture_beacon = false;
1280 memset(priv->capture_bssid, 0, ETH_ALEN); 1280 eth_zero_addr(priv->capture_bssid);
1281 1281
1282 /* 1282 /*
1283 * Use GFP_ATOMIC as rxq_process is called from 1283 * Use GFP_ATOMIC as rxq_process is called from
diff --git a/drivers/net/wireless/orinoco/Kconfig b/drivers/net/wireless/orinoco/Kconfig
index 6d831d4d1b5f..f6fa3f4e294f 100644
--- a/drivers/net/wireless/orinoco/Kconfig
+++ b/drivers/net/wireless/orinoco/Kconfig
@@ -2,7 +2,7 @@ config HERMES
2 tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)" 2 tristate "Hermes chipset 802.11b support (Orinoco/Prism2/Symbol)"
3 depends on (PPC_PMAC || PCI || PCMCIA) 3 depends on (PPC_PMAC || PCI || PCMCIA)
4 depends on CFG80211 4 depends on CFG80211
5 select CFG80211_WEXT 5 select CFG80211_WEXT_EXPORT
6 select WIRELESS_EXT 6 select WIRELESS_EXT
7 select WEXT_SPY 7 select WEXT_SPY
8 select WEXT_PRIV 8 select WEXT_PRIV
diff --git a/drivers/net/wireless/orinoco/airport.c b/drivers/net/wireless/orinoco/airport.c
index 0ca8b1455cd9..77e6c53040a3 100644
--- a/drivers/net/wireless/orinoco/airport.c
+++ b/drivers/net/wireless/orinoco/airport.c
@@ -228,7 +228,7 @@ MODULE_AUTHOR("Benjamin Herrenschmidt <benh@kernel.crashing.org>");
228MODULE_DESCRIPTION("Driver for the Apple Airport wireless card."); 228MODULE_DESCRIPTION("Driver for the Apple Airport wireless card.");
229MODULE_LICENSE("Dual MPL/GPL"); 229MODULE_LICENSE("Dual MPL/GPL");
230 230
231static struct of_device_id airport_match[] = { 231static const struct of_device_id airport_match[] = {
232 { 232 {
233 .name = "radio", 233 .name = "radio",
234 }, 234 },
diff --git a/drivers/net/wireless/orinoco/wext.c b/drivers/net/wireless/orinoco/wext.c
index 6abdaf0aa052..1d4dae422106 100644
--- a/drivers/net/wireless/orinoco/wext.c
+++ b/drivers/net/wireless/orinoco/wext.c
@@ -168,7 +168,7 @@ static int orinoco_ioctl_setwap(struct net_device *dev,
168 if (is_zero_ether_addr(ap_addr->sa_data) || 168 if (is_zero_ether_addr(ap_addr->sa_data) ||
169 is_broadcast_ether_addr(ap_addr->sa_data)) { 169 is_broadcast_ether_addr(ap_addr->sa_data)) {
170 priv->bssid_fixed = 0; 170 priv->bssid_fixed = 0;
171 memset(priv->desired_bssid, 0, ETH_ALEN); 171 eth_zero_addr(priv->desired_bssid);
172 172
173 /* "off" means keep existing connection */ 173 /* "off" means keep existing connection */
174 if (ap_addr->sa_data[0] == 0) { 174 if (ap_addr->sa_data[0] == 0) {
diff --git a/drivers/net/wireless/p54/fwio.c b/drivers/net/wireless/p54/fwio.c
index 5367d510b22d..275408eaf95e 100644
--- a/drivers/net/wireless/p54/fwio.c
+++ b/drivers/net/wireless/p54/fwio.c
@@ -671,7 +671,7 @@ int p54_upload_key(struct p54_common *priv, u8 algo, int slot, u8 idx, u8 len,
671 if (addr) 671 if (addr)
672 memcpy(rxkey->mac, addr, ETH_ALEN); 672 memcpy(rxkey->mac, addr, ETH_ALEN);
673 else 673 else
674 memset(rxkey->mac, ~0, ETH_ALEN); 674 eth_broadcast_addr(rxkey->mac);
675 675
676 switch (algo) { 676 switch (algo) {
677 case P54_CRYPTO_WEP: 677 case P54_CRYPTO_WEP:
diff --git a/drivers/net/wireless/p54/main.c b/drivers/net/wireless/p54/main.c
index b9250d75d253..e79674f73dc5 100644
--- a/drivers/net/wireless/p54/main.c
+++ b/drivers/net/wireless/p54/main.c
@@ -182,7 +182,7 @@ static int p54_start(struct ieee80211_hw *dev)
182 if (err) 182 if (err)
183 goto out; 183 goto out;
184 184
185 memset(priv->bssid, ~0, ETH_ALEN); 185 eth_broadcast_addr(priv->bssid);
186 priv->mode = NL80211_IFTYPE_MONITOR; 186 priv->mode = NL80211_IFTYPE_MONITOR;
187 err = p54_setup_mac(priv); 187 err = p54_setup_mac(priv);
188 if (err) { 188 if (err) {
@@ -274,8 +274,8 @@ static void p54_remove_interface(struct ieee80211_hw *dev,
274 wait_for_completion_interruptible_timeout(&priv->beacon_comp, HZ); 274 wait_for_completion_interruptible_timeout(&priv->beacon_comp, HZ);
275 } 275 }
276 priv->mode = NL80211_IFTYPE_MONITOR; 276 priv->mode = NL80211_IFTYPE_MONITOR;
277 memset(priv->mac_addr, 0, ETH_ALEN); 277 eth_zero_addr(priv->mac_addr);
278 memset(priv->bssid, 0, ETH_ALEN); 278 eth_zero_addr(priv->bssid);
279 p54_setup_mac(priv); 279 p54_setup_mac(priv);
280 mutex_unlock(&priv->conf_mutex); 280 mutex_unlock(&priv->conf_mutex);
281} 281}
@@ -794,7 +794,7 @@ struct ieee80211_hw *p54_init_common(size_t priv_data_len)
794 init_completion(&priv->beacon_comp); 794 init_completion(&priv->beacon_comp);
795 INIT_DELAYED_WORK(&priv->work, p54_work); 795 INIT_DELAYED_WORK(&priv->work, p54_work);
796 796
797 memset(&priv->mc_maclist[0], ~0, ETH_ALEN); 797 eth_broadcast_addr(priv->mc_maclist[0]);
798 priv->curchan = NULL; 798 priv->curchan = NULL;
799 p54_reset_stats(priv); 799 p54_reset_stats(priv);
800 return dev; 800 return dev;
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c
index 8330fa33e50b..477f86354dc5 100644
--- a/drivers/net/wireless/ray_cs.c
+++ b/drivers/net/wireless/ray_cs.c
@@ -808,7 +808,7 @@ static int ray_dev_init(struct net_device *dev)
808 808
809 /* copy mac and broadcast addresses to linux device */ 809 /* copy mac and broadcast addresses to linux device */
810 memcpy(dev->dev_addr, &local->sparm.b4.a_mac_addr, ADDRLEN); 810 memcpy(dev->dev_addr, &local->sparm.b4.a_mac_addr, ADDRLEN);
811 memset(dev->broadcast, 0xff, ETH_ALEN); 811 eth_broadcast_addr(dev->broadcast);
812 812
813 dev_dbg(&link->dev, "ray_dev_init ending\n"); 813 dev_dbg(&link->dev, "ray_dev_init ending\n");
814 return 0; 814 return 0;
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
index 60d44ce9c017..d72ff8e7125d 100644
--- a/drivers/net/wireless/rndis_wlan.c
+++ b/drivers/net/wireless/rndis_wlan.c
@@ -199,13 +199,13 @@ enum ndis_80211_pmkid_cand_list_flag_bits {
199 199
200struct ndis_80211_auth_request { 200struct ndis_80211_auth_request {
201 __le32 length; 201 __le32 length;
202 u8 bssid[6]; 202 u8 bssid[ETH_ALEN];
203 u8 padding[2]; 203 u8 padding[2];
204 __le32 flags; 204 __le32 flags;
205} __packed; 205} __packed;
206 206
207struct ndis_80211_pmkid_candidate { 207struct ndis_80211_pmkid_candidate {
208 u8 bssid[6]; 208 u8 bssid[ETH_ALEN];
209 u8 padding[2]; 209 u8 padding[2];
210 __le32 flags; 210 __le32 flags;
211} __packed; 211} __packed;
@@ -248,7 +248,7 @@ struct ndis_80211_conf {
248 248
249struct ndis_80211_bssid_ex { 249struct ndis_80211_bssid_ex {
250 __le32 length; 250 __le32 length;
251 u8 mac[6]; 251 u8 mac[ETH_ALEN];
252 u8 padding[2]; 252 u8 padding[2];
253 struct ndis_80211_ssid ssid; 253 struct ndis_80211_ssid ssid;
254 __le32 privacy; 254 __le32 privacy;
@@ -283,7 +283,7 @@ struct ndis_80211_key {
283 __le32 size; 283 __le32 size;
284 __le32 index; 284 __le32 index;
285 __le32 length; 285 __le32 length;
286 u8 bssid[6]; 286 u8 bssid[ETH_ALEN];
287 u8 padding[6]; 287 u8 padding[6];
288 u8 rsc[8]; 288 u8 rsc[8];
289 u8 material[32]; 289 u8 material[32];
@@ -292,7 +292,7 @@ struct ndis_80211_key {
292struct ndis_80211_remove_key { 292struct ndis_80211_remove_key {
293 __le32 size; 293 __le32 size;
294 __le32 index; 294 __le32 index;
295 u8 bssid[6]; 295 u8 bssid[ETH_ALEN];
296 u8 padding[2]; 296 u8 padding[2];
297} __packed; 297} __packed;
298 298
@@ -310,7 +310,7 @@ struct ndis_80211_assoc_info {
310 struct req_ie { 310 struct req_ie {
311 __le16 capa; 311 __le16 capa;
312 __le16 listen_interval; 312 __le16 listen_interval;
313 u8 cur_ap_address[6]; 313 u8 cur_ap_address[ETH_ALEN];
314 } req_ie; 314 } req_ie;
315 __le32 req_ie_length; 315 __le32 req_ie_length;
316 __le32 offset_req_ies; 316 __le32 offset_req_ies;
@@ -338,7 +338,7 @@ struct ndis_80211_capability {
338} __packed; 338} __packed;
339 339
340struct ndis_80211_bssid_info { 340struct ndis_80211_bssid_info {
341 u8 bssid[6]; 341 u8 bssid[ETH_ALEN];
342 u8 pmkid[16]; 342 u8 pmkid[16];
343} __packed; 343} __packed;
344 344
@@ -1037,7 +1037,7 @@ static int get_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN])
1037 bssid, &len); 1037 bssid, &len);
1038 1038
1039 if (ret != 0) 1039 if (ret != 0)
1040 memset(bssid, 0, ETH_ALEN); 1040 eth_zero_addr(bssid);
1041 1041
1042 return ret; 1042 return ret;
1043} 1043}
@@ -1391,7 +1391,7 @@ static int add_wep_key(struct usbnet *usbdev, const u8 *key, int key_len,
1391 priv->encr_keys[index].len = key_len; 1391 priv->encr_keys[index].len = key_len;
1392 priv->encr_keys[index].cipher = cipher; 1392 priv->encr_keys[index].cipher = cipher;
1393 memcpy(&priv->encr_keys[index].material, key, key_len); 1393 memcpy(&priv->encr_keys[index].material, key, key_len);
1394 memset(&priv->encr_keys[index].bssid, 0xff, ETH_ALEN); 1394 eth_broadcast_addr(priv->encr_keys[index].bssid);
1395 1395
1396 return 0; 1396 return 0;
1397} 1397}
@@ -1466,7 +1466,7 @@ static int add_wpa_key(struct usbnet *usbdev, const u8 *key, int key_len,
1466 } else { 1466 } else {
1467 /* group key */ 1467 /* group key */
1468 if (priv->infra_mode == NDIS_80211_INFRA_ADHOC) 1468 if (priv->infra_mode == NDIS_80211_INFRA_ADHOC)
1469 memset(ndis_key.bssid, 0xff, ETH_ALEN); 1469 eth_broadcast_addr(ndis_key.bssid);
1470 else 1470 else
1471 get_bssid(usbdev, ndis_key.bssid); 1471 get_bssid(usbdev, ndis_key.bssid);
1472 } 1472 }
@@ -1486,7 +1486,7 @@ static int add_wpa_key(struct usbnet *usbdev, const u8 *key, int key_len,
1486 if (flags & NDIS_80211_ADDKEY_PAIRWISE_KEY) 1486 if (flags & NDIS_80211_ADDKEY_PAIRWISE_KEY)
1487 memcpy(&priv->encr_keys[index].bssid, ndis_key.bssid, ETH_ALEN); 1487 memcpy(&priv->encr_keys[index].bssid, ndis_key.bssid, ETH_ALEN);
1488 else 1488 else
1489 memset(&priv->encr_keys[index].bssid, 0xff, ETH_ALEN); 1489 eth_broadcast_addr(priv->encr_keys[index].bssid);
1490 1490
1491 if (flags & NDIS_80211_ADDKEY_TRANSMIT_KEY) 1491 if (flags & NDIS_80211_ADDKEY_TRANSMIT_KEY)
1492 priv->encr_tx_key_index = index; 1492 priv->encr_tx_key_index = index;
@@ -2280,7 +2280,7 @@ static int rndis_disconnect(struct wiphy *wiphy, struct net_device *dev,
2280 netdev_dbg(usbdev->net, "cfg80211.disconnect(%d)\n", reason_code); 2280 netdev_dbg(usbdev->net, "cfg80211.disconnect(%d)\n", reason_code);
2281 2281
2282 priv->connected = false; 2282 priv->connected = false;
2283 memset(priv->bssid, 0, ETH_ALEN); 2283 eth_zero_addr(priv->bssid);
2284 2284
2285 return deauthenticate(usbdev); 2285 return deauthenticate(usbdev);
2286} 2286}
@@ -2392,7 +2392,7 @@ static int rndis_leave_ibss(struct wiphy *wiphy, struct net_device *dev)
2392 netdev_dbg(usbdev->net, "cfg80211.leave_ibss()\n"); 2392 netdev_dbg(usbdev->net, "cfg80211.leave_ibss()\n");
2393 2393
2394 priv->connected = false; 2394 priv->connected = false;
2395 memset(priv->bssid, 0, ETH_ALEN); 2395 eth_zero_addr(priv->bssid);
2396 2396
2397 return deauthenticate(usbdev); 2397 return deauthenticate(usbdev);
2398} 2398}
@@ -2857,7 +2857,7 @@ static void rndis_wlan_do_link_down_work(struct usbnet *usbdev)
2857 2857
2858 if (priv->connected) { 2858 if (priv->connected) {
2859 priv->connected = false; 2859 priv->connected = false;
2860 memset(priv->bssid, 0, ETH_ALEN); 2860 eth_zero_addr(priv->bssid);
2861 2861
2862 deauthenticate(usbdev); 2862 deauthenticate(usbdev);
2863 2863
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c
index 8444313eabe2..6ec2466b52b6 100644
--- a/drivers/net/wireless/rt2x00/rt2800usb.c
+++ b/drivers/net/wireless/rt2x00/rt2800usb.c
@@ -233,6 +233,7 @@ static int rt2800usb_autorun_detect(struct rt2x00_dev *rt2x00dev)
233{ 233{
234 __le32 *reg; 234 __le32 *reg;
235 u32 fw_mode; 235 u32 fw_mode;
236 int ret;
236 237
237 reg = kmalloc(sizeof(*reg), GFP_KERNEL); 238 reg = kmalloc(sizeof(*reg), GFP_KERNEL);
238 if (reg == NULL) 239 if (reg == NULL)
@@ -242,11 +243,14 @@ static int rt2800usb_autorun_detect(struct rt2x00_dev *rt2x00dev)
242 * magic value USB_MODE_AUTORUN (0x11) to the device, thus the 243 * magic value USB_MODE_AUTORUN (0x11) to the device, thus the
243 * returned value would be invalid. 244 * returned value would be invalid.
244 */ 245 */
245 rt2x00usb_vendor_request(rt2x00dev, USB_DEVICE_MODE, 246 ret = rt2x00usb_vendor_request(rt2x00dev, USB_DEVICE_MODE,
246 USB_VENDOR_REQUEST_IN, 0, USB_MODE_AUTORUN, 247 USB_VENDOR_REQUEST_IN, 0,
247 reg, sizeof(*reg), REGISTER_TIMEOUT_FIRMWARE); 248 USB_MODE_AUTORUN, reg, sizeof(*reg),
249 REGISTER_TIMEOUT_FIRMWARE);
248 fw_mode = le32_to_cpu(*reg); 250 fw_mode = le32_to_cpu(*reg);
249 kfree(reg); 251 kfree(reg);
252 if (ret < 0)
253 return ret;
250 254
251 if ((fw_mode & 0x00000003) == 2) 255 if ((fw_mode & 0x00000003) == 2)
252 return 1; 256 return 1;
@@ -289,6 +293,7 @@ static int rt2800usb_write_firmware(struct rt2x00_dev *rt2x00dev,
289 if (retval) { 293 if (retval) {
290 rt2x00_info(rt2x00dev, 294 rt2x00_info(rt2x00dev,
291 "Firmware loading not required - NIC in AutoRun mode\n"); 295 "Firmware loading not required - NIC in AutoRun mode\n");
296 __clear_bit(REQUIRE_FIRMWARE, &rt2x00dev->cap_flags);
292 } else { 297 } else {
293 rt2x00usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE, 298 rt2x00usb_register_multiwrite(rt2x00dev, FIRMWARE_IMAGE_BASE,
294 data + offset, length); 299 data + offset, length);
@@ -374,7 +379,6 @@ static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev)
374static void rt2800usb_disable_radio(struct rt2x00_dev *rt2x00dev) 379static void rt2800usb_disable_radio(struct rt2x00_dev *rt2x00dev)
375{ 380{
376 rt2800_disable_radio(rt2x00dev); 381 rt2800_disable_radio(rt2x00dev);
377 rt2x00usb_disable_radio(rt2x00dev);
378} 382}
379 383
380static int rt2800usb_set_state(struct rt2x00_dev *rt2x00dev, 384static int rt2800usb_set_state(struct rt2x00_dev *rt2x00dev,
@@ -1040,6 +1044,7 @@ static struct usb_device_id rt2800usb_device_table[] = {
1040 { USB_DEVICE(0x07d1, 0x3c17) }, 1044 { USB_DEVICE(0x07d1, 0x3c17) },
1041 { USB_DEVICE(0x2001, 0x3317) }, 1045 { USB_DEVICE(0x2001, 0x3317) },
1042 { USB_DEVICE(0x2001, 0x3c1b) }, 1046 { USB_DEVICE(0x2001, 0x3c1b) },
1047 { USB_DEVICE(0x2001, 0x3c25) },
1043 /* Draytek */ 1048 /* Draytek */
1044 { USB_DEVICE(0x07fa, 0x7712) }, 1049 { USB_DEVICE(0x07fa, 0x7712) },
1045 /* DVICO */ 1050 /* DVICO */
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.h b/drivers/net/wireless/rt2x00/rt2x00usb.h
index 8f85fbd5f237..569363da00a2 100644
--- a/drivers/net/wireless/rt2x00/rt2x00usb.h
+++ b/drivers/net/wireless/rt2x00/rt2x00usb.h
@@ -199,7 +199,7 @@ static inline void rt2x00usb_register_read(struct rt2x00_dev *rt2x00dev,
199 const unsigned int offset, 199 const unsigned int offset,
200 u32 *value) 200 u32 *value)
201{ 201{
202 __le32 reg; 202 __le32 reg = 0;
203 rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ, 203 rt2x00usb_vendor_request_buff(rt2x00dev, USB_MULTI_READ,
204 USB_VENDOR_REQUEST_IN, offset, 204 USB_VENDOR_REQUEST_IN, offset,
205 &reg, sizeof(reg)); 205 &reg, sizeof(reg));
@@ -219,7 +219,7 @@ static inline void rt2x00usb_register_read_lock(struct rt2x00_dev *rt2x00dev,
219 const unsigned int offset, 219 const unsigned int offset,
220 u32 *value) 220 u32 *value)
221{ 221{
222 __le32 reg; 222 __le32 reg = 0;
223 rt2x00usb_vendor_req_buff_lock(rt2x00dev, USB_MULTI_READ, 223 rt2x00usb_vendor_req_buff_lock(rt2x00dev, USB_MULTI_READ,
224 USB_VENDOR_REQUEST_IN, offset, 224 USB_VENDOR_REQUEST_IN, offset,
225 &reg, sizeof(reg), REGISTER_TIMEOUT); 225 &reg, sizeof(reg), REGISTER_TIMEOUT);
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index 074f716020aa..01f56c7df8b5 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -1315,7 +1315,8 @@ static void setup_arp_tx(struct rtl_priv *rtlpriv, struct rtl_ps_ctl *ppsc)
1315} 1315}
1316 1316
1317/*should call before software enc*/ 1317/*should call before software enc*/
1318u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) 1318u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
1319 bool is_enc)
1319{ 1320{
1320 struct rtl_priv *rtlpriv = rtl_priv(hw); 1321 struct rtl_priv *rtlpriv = rtl_priv(hw);
1321 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1322 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
@@ -1344,7 +1345,9 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1344 break; 1345 break;
1345 } 1346 }
1346 1347
1347 offset = mac_hdr_len + SNAP_SIZE + encrypt_header_len; 1348 offset = mac_hdr_len + SNAP_SIZE;
1349 if (is_enc)
1350 offset += encrypt_header_len;
1348 ether_type = be16_to_cpup((__be16 *)(skb->data + offset)); 1351 ether_type = be16_to_cpup((__be16 *)(skb->data + offset));
1349 1352
1350 if (ETH_P_IP == ether_type) { 1353 if (ETH_P_IP == ether_type) {
diff --git a/drivers/net/wireless/rtlwifi/base.h b/drivers/net/wireless/rtlwifi/base.h
index c6cb49c3ee32..74233d601a90 100644
--- a/drivers/net/wireless/rtlwifi/base.h
+++ b/drivers/net/wireless/rtlwifi/base.h
@@ -45,9 +45,6 @@ enum ap_peer {
45#define RTL_TX_DESC_SIZE 32 45#define RTL_TX_DESC_SIZE 32
46#define RTL_TX_HEADER_SIZE (RTL_TX_DESC_SIZE + RTL_TX_DUMMY_SIZE) 46#define RTL_TX_HEADER_SIZE (RTL_TX_DESC_SIZE + RTL_TX_DUMMY_SIZE)
47 47
48#define HT_AMSDU_SIZE_4K 3839
49#define HT_AMSDU_SIZE_8K 7935
50
51#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ 48#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */
52#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ 49#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */
53 50
@@ -61,9 +58,6 @@ enum ap_peer {
61#define MAX_BIT_RATE_LONG_GI_1NSS_80MHZ_MCS9 390 /* Mbps */ 58#define MAX_BIT_RATE_LONG_GI_1NSS_80MHZ_MCS9 390 /* Mbps */
62#define MAX_BIT_RATE_LONG_GI_1NSS_80MHZ_MCS7 293 /* Mbps */ 59#define MAX_BIT_RATE_LONG_GI_1NSS_80MHZ_MCS7 293 /* Mbps */
63 60
64#define RTL_RATE_COUNT_LEGACY 12
65#define RTL_CHANNEL_COUNT 14
66
67#define FRAME_OFFSET_FRAME_CONTROL 0 61#define FRAME_OFFSET_FRAME_CONTROL 0
68#define FRAME_OFFSET_DURATION 2 62#define FRAME_OFFSET_DURATION 2
69#define FRAME_OFFSET_ADDRESS1 4 63#define FRAME_OFFSET_ADDRESS1 4
@@ -126,10 +120,10 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
126int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht, 120int rtlwifi_rate_mapping(struct ieee80211_hw *hw, bool isht,
127 bool isvht, u8 desc_rate); 121 bool isvht, u8 desc_rate);
128bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb); 122bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
129u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx); 123u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,
124 bool is_enc);
130 125
131void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb); 126void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb);
132void rtl_watch_dog_timer_callback(unsigned long data);
133int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 127int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
134 struct ieee80211_sta *sta, u16 tid, u16 *ssn); 128 struct ieee80211_sta *sta, u16 tid, u16 *ssn);
135int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 129int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
diff --git a/drivers/net/wireless/rtlwifi/cam.h b/drivers/net/wireless/rtlwifi/cam.h
index 35508087c0c5..e2e647d511c1 100644
--- a/drivers/net/wireless/rtlwifi/cam.h
+++ b/drivers/net/wireless/rtlwifi/cam.h
@@ -28,13 +28,11 @@
28 28
29#define CAM_CONTENT_COUNT 8 29#define CAM_CONTENT_COUNT 8
30 30
31#define CFG_DEFAULT_KEY BIT(5)
32#define CFG_VALID BIT(15) 31#define CFG_VALID BIT(15)
33 32
34#define PAIRWISE_KEYIDX 0 33#define PAIRWISE_KEYIDX 0
35#define CAM_PAIRWISE_KEY_POSITION 4 34#define CAM_PAIRWISE_KEY_POSITION 4
36 35
37#define CAM_CONFIG_USEDK 1
38#define CAM_CONFIG_NO_USEDK 0 36#define CAM_CONFIG_NO_USEDK 0
39 37
40void rtl_cam_reset_all_entry(struct ieee80211_hw *hw); 38void rtl_cam_reset_all_entry(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index a31a12775f1a..3b3a88b53b11 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -195,7 +195,7 @@ static void rtl_op_stop(struct ieee80211_hw *hw)
195 if (!(support_remote_wakeup && 195 if (!(support_remote_wakeup &&
196 rtlhal->enter_pnp_sleep)) { 196 rtlhal->enter_pnp_sleep)) {
197 mac->link_state = MAC80211_NOLINK; 197 mac->link_state = MAC80211_NOLINK;
198 memset(mac->bssid, 0, 6); 198 eth_zero_addr(mac->bssid);
199 mac->vendor = PEER_UNKNOWN; 199 mac->vendor = PEER_UNKNOWN;
200 200
201 /* reset sec info */ 201 /* reset sec info */
@@ -357,7 +357,7 @@ static void rtl_op_remove_interface(struct ieee80211_hw *hw,
357 mac->p2p = 0; 357 mac->p2p = 0;
358 mac->vif = NULL; 358 mac->vif = NULL;
359 mac->link_state = MAC80211_NOLINK; 359 mac->link_state = MAC80211_NOLINK;
360 memset(mac->bssid, 0, ETH_ALEN); 360 eth_zero_addr(mac->bssid);
361 mac->vendor = PEER_UNKNOWN; 361 mac->vendor = PEER_UNKNOWN;
362 mac->opmode = NL80211_IFTYPE_UNSPECIFIED; 362 mac->opmode = NL80211_IFTYPE_UNSPECIFIED;
363 rtlpriv->cfg->ops->set_network_type(hw, mac->opmode); 363 rtlpriv->cfg->ops->set_network_type(hw, mac->opmode);
@@ -1157,7 +1157,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
1157 if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE) 1157 if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE)
1158 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE); 1158 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
1159 mac->link_state = MAC80211_NOLINK; 1159 mac->link_state = MAC80211_NOLINK;
1160 memset(mac->bssid, 0, ETH_ALEN); 1160 eth_zero_addr(mac->bssid);
1161 mac->vendor = PEER_UNKNOWN; 1161 mac->vendor = PEER_UNKNOWN;
1162 mac->mode = 0; 1162 mac->mode = 0;
1163 1163
diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h
index 7b64e34f421e..82733c6b8c46 100644
--- a/drivers/net/wireless/rtlwifi/core.h
+++ b/drivers/net/wireless/rtlwifi/core.h
@@ -33,8 +33,6 @@
33 FIF_FCSFAIL | \ 33 FIF_FCSFAIL | \
34 FIF_BCN_PRBRESP_PROMISC) 34 FIF_BCN_PRBRESP_PROMISC)
35 35
36#define RTL_SUPPORTED_CTRL_FILTER 0xFF
37
38#define DM_DIG_THRESH_HIGH 40 36#define DM_DIG_THRESH_HIGH 40
39#define DM_DIG_THRESH_LOW 35 37#define DM_DIG_THRESH_LOW 35
40#define DM_FALSEALARM_THRESH_LOW 400 38#define DM_FALSEALARM_THRESH_LOW 400
diff --git a/drivers/net/wireless/rtlwifi/efuse.h b/drivers/net/wireless/rtlwifi/efuse.h
index fdab8240a5d7..be02e7894c61 100644
--- a/drivers/net/wireless/rtlwifi/efuse.h
+++ b/drivers/net/wireless/rtlwifi/efuse.h
@@ -40,12 +40,6 @@
40#define PG_STATE_WORD_3 0x10 40#define PG_STATE_WORD_3 0x10
41#define PG_STATE_DATA 0x20 41#define PG_STATE_DATA 0x20
42 42
43#define PG_SWBYTE_H 0x01
44#define PG_SWBYTE_L 0x02
45
46#define _POWERON_DELAY_
47#define _PRE_EXECUTE_READ_CMD_
48
49#define EFUSE_REPEAT_THRESHOLD_ 3 43#define EFUSE_REPEAT_THRESHOLD_ 3
50#define EFUSE_ERROE_HANDLE 1 44#define EFUSE_ERROE_HANDLE 1
51 45
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 8c45cf44ce24..f46c9d7f6528 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -887,7 +887,7 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
887 unicast = true; 887 unicast = true;
888 rtlpriv->stats.rxbytesunicast += skb->len; 888 rtlpriv->stats.rxbytesunicast += skb->len;
889 } 889 }
890 rtl_is_special_data(hw, skb, false); 890 rtl_is_special_data(hw, skb, false, true);
891 891
892 if (ieee80211_is_data(fc)) { 892 if (ieee80211_is_data(fc)) {
893 rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); 893 rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX);
diff --git a/drivers/net/wireless/rtlwifi/rc.c b/drivers/net/wireless/rtlwifi/rc.c
index 7863bd278b22..74c14ce28238 100644
--- a/drivers/net/wireless/rtlwifi/rc.c
+++ b/drivers/net/wireless/rtlwifi/rc.c
@@ -56,7 +56,8 @@ static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv,
56 wireless_mode = sta_entry->wireless_mode; 56 wireless_mode = sta_entry->wireless_mode;
57 } 57 }
58 58
59 if (rtl_is_special_data(rtlpriv->mac80211.hw, skb, true) || not_data) { 59 if (rtl_is_special_data(rtlpriv->mac80211.hw, skb, true, false) ||
60 not_data) {
60 return 0; 61 return 0;
61 } else { 62 } else {
62 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 63 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
@@ -201,7 +202,7 @@ static void rtl_tx_status(void *ppriv,
201 if (!priv_sta || !ieee80211_is_data(fc)) 202 if (!priv_sta || !ieee80211_is_data(fc))
202 return; 203 return;
203 204
204 if (rtl_is_special_data(mac->hw, skb, true)) 205 if (rtl_is_special_data(mac->hw, skb, true, true))
205 return; 206 return;
206 207
207 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) || 208 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/def.h b/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
index d9ea9d0c79a5..0532b9852444 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
@@ -26,53 +26,12 @@
26#ifndef __RTL92C_DEF_H__ 26#ifndef __RTL92C_DEF_H__
27#define __RTL92C_DEF_H__ 27#define __RTL92C_DEF_H__
28 28
29#define HAL_RETRY_LIMIT_INFRA 48
30#define HAL_RETRY_LIMIT_AP_ADHOC 7
31
32#define RESET_DELAY_8185 20
33
34#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
35#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
36
37#define NUM_OF_FIRMWARE_QUEUE 10
38#define NUM_OF_PAGES_IN_FW 0x100
39#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
40#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
41#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
42#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
43#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
44#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
45#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
46#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
47#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
48#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
49
50#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
51#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
52#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
53#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
54#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
55
56#define MAX_LINES_HWCONFIG_TXT 1000
57#define MAX_BYTES_LINE_HWCONFIG_TXT 256
58
59#define SW_THREE_WIRE 0
60#define HW_THREE_WIRE 2
61
62#define BT_DEMO_BOARD 0
63#define BT_QA_BOARD 1
64#define BT_FPGA 2
65
66#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 29#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
67#define HAL_PRIME_CHNL_OFFSET_LOWER 1 30#define HAL_PRIME_CHNL_OFFSET_LOWER 1
68#define HAL_PRIME_CHNL_OFFSET_UPPER 2 31#define HAL_PRIME_CHNL_OFFSET_UPPER 2
69 32
70#define MAX_H2C_QUEUE_NUM 10
71
72#define RX_MPDU_QUEUE 0 33#define RX_MPDU_QUEUE 0
73#define RX_CMD_QUEUE 1 34#define RX_CMD_QUEUE 1
74#define RX_MAX_QUEUE 2
75#define AC2QUEUEID(_AC) (_AC)
76 35
77#define C2H_RX_CMD_HDR_LEN 8 36#define C2H_RX_CMD_HDR_LEN 8
78#define GET_C2H_CMD_CMD_LEN(__prxhdr) \ 37#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
index f2b9713c456e..86ce5b1930e6 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
@@ -30,6 +30,7 @@
30#include "../cam.h" 30#include "../cam.h"
31#include "../ps.h" 31#include "../ps.h"
32#include "../pci.h" 32#include "../pci.h"
33#include "../pwrseqcmd.h"
33#include "reg.h" 34#include "reg.h"
34#include "def.h" 35#include "def.h"
35#include "phy.h" 36#include "phy.h"
@@ -566,7 +567,7 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
566 acm_ctrl &= (~ACMHW_VIQEN); 567 acm_ctrl &= (~ACMHW_VIQEN);
567 break; 568 break;
568 case AC3_VO: 569 case AC3_VO:
569 acm_ctrl &= (~ACMHW_BEQEN); 570 acm_ctrl &= (~ACMHW_VOQEN);
570 break; 571 break;
571 default: 572 default:
572 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 573 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
@@ -885,7 +886,7 @@ static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
885 886
886 rtl_write_word(rtlpriv, REG_CR, 0x2ff); 887 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
887 rtl_write_byte(rtlpriv, REG_CR+1, 0x06); 888 rtl_write_byte(rtlpriv, REG_CR+1, 0x06);
888 rtl_write_byte(rtlpriv, REG_CR+2, 0x00); 889 rtl_write_byte(rtlpriv, MSR, 0x00);
889 890
890 if (!rtlhal->mac_func_enable) { 891 if (!rtlhal->mac_func_enable) {
891 if (_rtl88ee_llt_table_init(hw) == false) { 892 if (_rtl88ee_llt_table_init(hw) == false) {
@@ -1277,7 +1278,7 @@ static int _rtl88ee_set_media_status(struct ieee80211_hw *hw,
1277 mode); 1278 mode);
1278 } 1279 }
1279 1280
1280 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode); 1281 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1281 rtlpriv->cfg->ops->led_control(hw, ledaction); 1282 rtlpriv->cfg->ops->led_control(hw, ledaction);
1282 if (mode == MSR_AP) 1283 if (mode == MSR_AP)
1283 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1284 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
index 3f6c59cdeaba..a2bb02c7b837 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
@@ -452,9 +452,10 @@ static void handle_branch1(struct ieee80211_hw *hw, u16 arraylen,
452 READ_NEXT_PAIR(v1, v2, i); 452 READ_NEXT_PAIR(v1, v2, i);
453 while (v2 != 0xDEAD && 453 while (v2 != 0xDEAD &&
454 v2 != 0xCDEF && 454 v2 != 0xCDEF &&
455 v2 != 0xCDCD && i < arraylen - 2) 455 v2 != 0xCDCD && i < arraylen - 2) {
456 _rtl8188e_config_bb_reg(hw, v1, v2); 456 _rtl8188e_config_bb_reg(hw, v1, v2);
457 READ_NEXT_PAIR(v1, v2, i); 457 READ_NEXT_PAIR(v1, v2, i);
458 }
458 459
459 while (v2 != 0xDEAD && i < arraylen - 2) 460 while (v2 != 0xDEAD && i < arraylen - 2)
460 READ_NEXT_PAIR(v1, v2, i); 461 READ_NEXT_PAIR(v1, v2, i);
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h b/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h
index 5c1472d88fd4..0eca030e3238 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h
@@ -27,7 +27,6 @@
27#define __RTL92C_RF_H__ 27#define __RTL92C_RF_H__
28 28
29#define RF6052_MAX_TX_PWR 0x3F 29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31 30
32void rtl88e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, 31void rtl88e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth); 32 u8 bandwidth);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
index 9b660df6fd71..690a7a1675e2 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
@@ -30,59 +30,18 @@
30#ifndef __RTL92C_DEF_H__ 30#ifndef __RTL92C_DEF_H__
31#define __RTL92C_DEF_H__ 31#define __RTL92C_DEF_H__
32 32
33#define HAL_RETRY_LIMIT_INFRA 48
34#define HAL_RETRY_LIMIT_AP_ADHOC 7
35
36#define PHY_RSSI_SLID_WIN_MAX 100 33#define PHY_RSSI_SLID_WIN_MAX 100
37#define PHY_LINKQUALITY_SLID_WIN_MAX 20 34#define PHY_LINKQUALITY_SLID_WIN_MAX 20
38#define PHY_BEACON_RSSI_SLID_WIN_MAX 10 35#define PHY_BEACON_RSSI_SLID_WIN_MAX 10
39 36
40#define RESET_DELAY_8185 20
41
42#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
43#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
44
45#define NUM_OF_FIRMWARE_QUEUE 10
46#define NUM_OF_PAGES_IN_FW 0x100
47#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
48#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
49#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
50#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
51#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
52#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
53#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
54#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
55#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
56#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
57
58#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
59#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
60#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
61#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
62#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
63
64#define MAX_LINES_HWCONFIG_TXT 1000
65#define MAX_BYTES_LINE_HWCONFIG_TXT 256
66
67#define SW_THREE_WIRE 0
68#define HW_THREE_WIRE 2
69
70#define BT_DEMO_BOARD 0
71#define BT_QA_BOARD 1
72#define BT_FPGA 2
73
74#define RX_SMOOTH_FACTOR 20 37#define RX_SMOOTH_FACTOR 20
75 38
76#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 39#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
77#define HAL_PRIME_CHNL_OFFSET_LOWER 1 40#define HAL_PRIME_CHNL_OFFSET_LOWER 1
78#define HAL_PRIME_CHNL_OFFSET_UPPER 2 41#define HAL_PRIME_CHNL_OFFSET_UPPER 2
79 42
80#define MAX_H2C_QUEUE_NUM 10
81
82#define RX_MPDU_QUEUE 0 43#define RX_MPDU_QUEUE 0
83#define RX_CMD_QUEUE 1 44#define RX_CMD_QUEUE 1
84#define RX_MAX_QUEUE 2
85#define AC2QUEUEID(_AC) (_AC)
86 45
87#define C2H_RX_CMD_HDR_LEN 8 46#define C2H_RX_CMD_HDR_LEN 8
88#define GET_C2H_CMD_CMD_LEN(__prxhdr) \ 47#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
index 303b299376c9..04eb5c3f8464 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
@@ -363,7 +363,7 @@ void rtl92ce_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
363 acm_ctrl &= (~AcmHw_ViqEn); 363 acm_ctrl &= (~AcmHw_ViqEn);
364 break; 364 break;
365 case AC3_VO: 365 case AC3_VO:
366 acm_ctrl &= (~AcmHw_BeqEn); 366 acm_ctrl &= (~AcmHw_VoqEn);
367 break; 367 break;
368 default: 368 default:
369 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 369 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/rf.h b/drivers/net/wireless/rtlwifi/rtl8192ce/rf.h
index d8fe68b389d2..ebd72cae10b6 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/rf.h
@@ -31,7 +31,6 @@
31#define __RTL92C_RF_H__ 31#define __RTL92C_RF_H__
32 32
33#define RF6052_MAX_TX_PWR 0x3F 33#define RF6052_MAX_TX_PWR 0x3F
34#define RF6052_MAX_REG 0x3F
35#define RF6052_MAX_PATH 2 34#define RF6052_MAX_PATH 2
36 35
37void rtl92ce_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth); 36void rtl92ce_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
index fe4b699a12f5..d310d55d800e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
@@ -1364,7 +1364,7 @@ static int _rtl92cu_set_media_status(struct ieee80211_hw *hw,
1364 "Network type %d not supported!\n", type); 1364 "Network type %d not supported!\n", type);
1365 goto error_out; 1365 goto error_out;
1366 } 1366 }
1367 rtl_write_byte(rtlpriv, (MSR), bt_msr); 1367 rtl_write_byte(rtlpriv, MSR, bt_msr);
1368 rtlpriv->cfg->ops->led_control(hw, ledaction); 1368 rtlpriv->cfg->ops->led_control(hw, ledaction);
1369 if ((bt_msr & MSR_MASK) == MSR_AP) 1369 if ((bt_msr & MSR_MASK) == MSR_AP)
1370 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1370 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
@@ -1471,8 +1471,7 @@ static void _InitBeaconParameters(struct ieee80211_hw *hw)
1471 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x66FF); 1471 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x66FF);
1472} 1472}
1473 1473
1474static void _beacon_function_enable(struct ieee80211_hw *hw, bool Enable, 1474static void _beacon_function_enable(struct ieee80211_hw *hw)
1475 bool Linked)
1476{ 1475{
1477 struct rtl_priv *rtlpriv = rtl_priv(hw); 1476 struct rtl_priv *rtlpriv = rtl_priv(hw);
1478 1477
@@ -1517,7 +1516,7 @@ void rtl92cu_set_beacon_related_registers(struct ieee80211_hw *hw)
1517 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x50); 1516 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x50);
1518 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x50); 1517 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x50);
1519 } 1518 }
1520 _beacon_function_enable(hw, true, true); 1519 _beacon_function_enable(hw);
1521} 1520}
1522 1521
1523void rtl92cu_set_beacon_interval(struct ieee80211_hw *hw) 1522void rtl92cu_set_beacon_interval(struct ieee80211_hw *hw)
@@ -1589,6 +1588,8 @@ void rtl92cu_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
1589 case HW_VAR_DATA_FILTER: 1588 case HW_VAR_DATA_FILTER:
1590 *((u16 *) (val)) = rtl_read_word(rtlpriv, REG_RXFLTMAP2); 1589 *((u16 *) (val)) = rtl_read_word(rtlpriv, REG_RXFLTMAP2);
1591 break; 1590 break;
1591 case HAL_DEF_WOWLAN:
1592 break;
1592 default: 1593 default:
1593 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1594 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1594 "switch case not processed\n"); 1595 "switch case not processed\n");
@@ -1871,7 +1872,7 @@ void rtl92cu_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
1871 acm_ctrl &= (~AcmHw_ViqEn); 1872 acm_ctrl &= (~AcmHw_ViqEn);
1872 break; 1873 break;
1873 case AC3_VO: 1874 case AC3_VO:
1874 acm_ctrl &= (~AcmHw_BeqEn); 1875 acm_ctrl &= (~AcmHw_VoqEn);
1875 break; 1876 break;
1876 default: 1877 default:
1877 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1878 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h
index c1e33b0228c0..67588083e6cc 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.h
@@ -32,8 +32,6 @@
32 32
33#define H2C_RA_MASK 6 33#define H2C_RA_MASK 6
34 34
35#define LLT_POLLING_LLT_THRESHOLD 20
36#define LLT_POLLING_READY_TIMEOUT_COUNT 100
37#define LLT_LAST_ENTRY_OF_TX_PKT_BUFFER 255 35#define LLT_LAST_ENTRY_OF_TX_PKT_BUFFER 255
38 36
39#define RX_PAGE_SIZE_REG_VALUE PBP_128 37#define RX_PAGE_SIZE_REG_VALUE PBP_128
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
index 133e395b7401..adb810794eef 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
@@ -497,7 +497,7 @@ int rtl92c_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
497 "Network type %d not supported!\n", type); 497 "Network type %d not supported!\n", type);
498 return -EOPNOTSUPP; 498 return -EOPNOTSUPP;
499 } 499 }
500 rtl_write_byte(rtlpriv, (REG_CR + 2), value); 500 rtl_write_byte(rtlpriv, MSR, value);
501 return 0; 501 return 0;
502} 502}
503 503
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h
index 11b439d6b671..6f987de5b441 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/rf.h
@@ -31,7 +31,6 @@
31#define __RTL92CU_RF_H__ 31#define __RTL92CU_RF_H__
32 32
33#define RF6052_MAX_TX_PWR 0x3F 33#define RF6052_MAX_TX_PWR 0x3F
34#define RF6052_MAX_REG 0x3F
35#define RF6052_MAX_PATH 2 34#define RF6052_MAX_PATH 2
36 35
37void rtl92cu_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth); 36void rtl92cu_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
index 90a714c189a8..23806c243a53 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
@@ -321,6 +321,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
321 {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/ 321 {RTL_USB_DEVICE(0x07b8, 0x8188, rtl92cu_hal_cfg)}, /*Abocom - Abocom*/
322 {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/ 322 {RTL_USB_DEVICE(0x07b8, 0x8189, rtl92cu_hal_cfg)}, /*Funai - Abocom*/
323 {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/ 323 {RTL_USB_DEVICE(0x0846, 0x9041, rtl92cu_hal_cfg)}, /*NetGear WNA1000M*/
324 {RTL_USB_DEVICE(0x0b05, 0x17ba, rtl92cu_hal_cfg)}, /*ASUS-Edimax*/
324 {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/ 325 {RTL_USB_DEVICE(0x0bda, 0x5088, rtl92cu_hal_cfg)}, /*Thinkware-CC&C*/
325 {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ 326 {RTL_USB_DEVICE(0x0df6, 0x0052, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
326 {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/ 327 {RTL_USB_DEVICE(0x0df6, 0x005c, rtl92cu_hal_cfg)}, /*Sitecom - Edimax*/
@@ -377,6 +378,7 @@ static struct usb_device_id rtl8192c_usb_ids[] = {
377 {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/ 378 {RTL_USB_DEVICE(0x2001, 0x3307, rtl92cu_hal_cfg)}, /*D-Link-Cameo*/
378 {RTL_USB_DEVICE(0x2001, 0x3309, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ 379 {RTL_USB_DEVICE(0x2001, 0x3309, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/
379 {RTL_USB_DEVICE(0x2001, 0x330a, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/ 380 {RTL_USB_DEVICE(0x2001, 0x330a, rtl92cu_hal_cfg)}, /*D-Link-Alpha*/
381 {RTL_USB_DEVICE(0x2001, 0x330d, rtl92cu_hal_cfg)}, /*D-Link DWA-131 */
380 {RTL_USB_DEVICE(0x2019, 0xab2b, rtl92cu_hal_cfg)}, /*Planex -Abocom*/ 382 {RTL_USB_DEVICE(0x2019, 0xab2b, rtl92cu_hal_cfg)}, /*Planex -Abocom*/
381 {RTL_USB_DEVICE(0x20f4, 0x624d, rtl92cu_hal_cfg)}, /*TRENDNet*/ 383 {RTL_USB_DEVICE(0x20f4, 0x624d, rtl92cu_hal_cfg)}, /*TRENDNet*/
382 {RTL_USB_DEVICE(0x2357, 0x0100, rtl92cu_hal_cfg)}, /*TP-Link WN8200ND*/ 384 {RTL_USB_DEVICE(0x2357, 0x0100, rtl92cu_hal_cfg)}, /*TP-Link WN8200ND*/
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/def.h b/drivers/net/wireless/rtlwifi/rtl8192de/def.h
index 939c905f547f..0a443ed17cf4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/def.h
@@ -35,61 +35,22 @@
35#define MAX_MSS_DENSITY_1T 0x0A 35#define MAX_MSS_DENSITY_1T 0x0A
36 36
37#define RF6052_MAX_TX_PWR 0x3F 37#define RF6052_MAX_TX_PWR 0x3F
38#define RF6052_MAX_REG 0x3F
39#define RF6052_MAX_PATH 2 38#define RF6052_MAX_PATH 2
40 39
41#define HAL_RETRY_LIMIT_INFRA 48
42#define HAL_RETRY_LIMIT_AP_ADHOC 7
43
44#define PHY_RSSI_SLID_WIN_MAX 100 40#define PHY_RSSI_SLID_WIN_MAX 100
45#define PHY_LINKQUALITY_SLID_WIN_MAX 20 41#define PHY_LINKQUALITY_SLID_WIN_MAX 20
46#define PHY_BEACON_RSSI_SLID_WIN_MAX 10 42#define PHY_BEACON_RSSI_SLID_WIN_MAX 10
47 43
48#define RESET_DELAY_8185 20
49
50#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
51#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK) 44#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
52 45
53#define NUM_OF_FIRMWARE_QUEUE 10
54#define NUM_OF_PAGES_IN_FW 0x100
55#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
56#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
57#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
58#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
59#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
60#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
61#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
62#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
63#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
64#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
65
66#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
67#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
68#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
69#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
70#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
71
72#define MAX_LINES_HWCONFIG_TXT 1000
73#define MAX_BYTES_LINE_HWCONFIG_TXT 256
74
75#define SW_THREE_WIRE 0
76#define HW_THREE_WIRE 2
77
78#define BT_DEMO_BOARD 0
79#define BT_QA_BOARD 1
80#define BT_FPGA 2
81
82#define RX_SMOOTH_FACTOR 20 46#define RX_SMOOTH_FACTOR 20
83 47
84#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 48#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
85#define HAL_PRIME_CHNL_OFFSET_LOWER 1 49#define HAL_PRIME_CHNL_OFFSET_LOWER 1
86#define HAL_PRIME_CHNL_OFFSET_UPPER 2 50#define HAL_PRIME_CHNL_OFFSET_UPPER 2
87 51
88#define MAX_H2C_QUEUE_NUM 10
89
90#define RX_MPDU_QUEUE 0 52#define RX_MPDU_QUEUE 0
91#define RX_CMD_QUEUE 1 53#define RX_CMD_QUEUE 1
92#define RX_MAX_QUEUE 2
93 54
94#define C2H_RX_CMD_HDR_LEN 8 55#define C2H_RX_CMD_HDR_LEN 8
95#define GET_C2H_CMD_CMD_LEN(__prxhdr) \ 56#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/hw.c b/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
index 01bcc2d218dc..f49b60d31450 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/hw.c
@@ -1126,7 +1126,7 @@ static int _rtl92de_set_media_status(struct ieee80211_hw *hw,
1126 break; 1126 break;
1127 1127
1128 } 1128 }
1129 rtl_write_byte(rtlpriv, REG_CR + 2, bt_msr); 1129 rtl_write_byte(rtlpriv, MSR, bt_msr);
1130 rtlpriv->cfg->ops->led_control(hw, ledaction); 1130 rtlpriv->cfg->ops->led_control(hw, ledaction);
1131 if ((bt_msr & MSR_MASK) == MSR_AP) 1131 if ((bt_msr & MSR_MASK) == MSR_AP)
1132 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1132 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
index b461b3128da5..da0a6125f314 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
@@ -562,7 +562,7 @@ void rtl92ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
562 acm_ctrl &= (~ACMHW_VIQEN); 562 acm_ctrl &= (~ACMHW_VIQEN);
563 break; 563 break;
564 case AC3_VO: 564 case AC3_VO:
565 acm_ctrl &= (~ACMHW_BEQEN); 565 acm_ctrl &= (~ACMHW_VOQEN);
566 break; 566 break;
567 default: 567 default:
568 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG, 568 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
@@ -1510,7 +1510,7 @@ static int _rtl92ee_set_media_status(struct ieee80211_hw *hw,
1510 mode); 1510 mode);
1511 } 1511 }
1512 1512
1513 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode); 1513 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1514 rtlpriv->cfg->ops->led_control(hw, ledaction); 1514 rtlpriv->cfg->ops->led_control(hw, ledaction);
1515 if (mode == MSR_AP) 1515 if (mode == MSR_AP)
1516 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1516 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/rf.h b/drivers/net/wireless/rtlwifi/rtl8192ee/rf.h
index 8bdeed3c064e..039c0133ad6b 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ee/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/rf.h
@@ -27,7 +27,6 @@
27#define __RTL92E_RF_H__ 27#define __RTL92E_RF_H__
28 28
29#define RF6052_MAX_TX_PWR 0x3F 29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31 30
32void rtl92ee_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, 31void rtl92ee_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth); 32 u8 bandwidth);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/def.h b/drivers/net/wireless/rtlwifi/rtl8192se/def.h
index ef87c09b77d0..41466f957cdc 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/def.h
@@ -31,7 +31,6 @@
31 31
32#define RX_MPDU_QUEUE 0 32#define RX_MPDU_QUEUE 0
33#define RX_CMD_QUEUE 1 33#define RX_CMD_QUEUE 1
34#define RX_MAX_QUEUE 2
35 34
36#define SHORT_SLOT_TIME 9 35#define SHORT_SLOT_TIME 9
37#define NON_SHORT_SLOT_TIME 20 36#define NON_SHORT_SLOT_TIME 20
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
index 5761d5b49e39..12b0978ba4fa 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/hw.c
@@ -293,7 +293,7 @@ void rtl92se_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
293 acm_ctrl &= (~AcmHw_ViqEn); 293 acm_ctrl &= (~AcmHw_ViqEn);
294 break; 294 break;
295 case AC3_VO: 295 case AC3_VO:
296 acm_ctrl &= (~AcmHw_BeqEn); 296 acm_ctrl &= (~AcmHw_VoqEn);
297 break; 297 break;
298 default: 298 default:
299 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 299 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
@@ -1204,7 +1204,7 @@ static int _rtl92se_set_media_status(struct ieee80211_hw *hw,
1204 if (type != NL80211_IFTYPE_AP && 1204 if (type != NL80211_IFTYPE_AP &&
1205 rtlpriv->mac80211.link_state < MAC80211_LINKED) 1205 rtlpriv->mac80211.link_state < MAC80211_LINKED)
1206 bt_msr = rtl_read_byte(rtlpriv, MSR) & ~MSR_LINK_MASK; 1206 bt_msr = rtl_read_byte(rtlpriv, MSR) & ~MSR_LINK_MASK;
1207 rtl_write_byte(rtlpriv, (MSR), bt_msr); 1207 rtl_write_byte(rtlpriv, MSR, bt_msr);
1208 1208
1209 temp = rtl_read_dword(rtlpriv, TCR); 1209 temp = rtl_read_dword(rtlpriv, TCR);
1210 rtl_write_dword(rtlpriv, TCR, temp & (~BIT(8))); 1210 rtl_write_dword(rtlpriv, TCR, temp & (~BIT(8)));
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/def.h b/drivers/net/wireless/rtlwifi/rtl8723ae/def.h
index 94bdd4bbca5d..bcdf2273688e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/def.h
@@ -26,53 +26,12 @@
26#ifndef __RTL8723E_DEF_H__ 26#ifndef __RTL8723E_DEF_H__
27#define __RTL8723E_DEF_H__ 27#define __RTL8723E_DEF_H__
28 28
29#define HAL_RETRY_LIMIT_INFRA 48
30#define HAL_RETRY_LIMIT_AP_ADHOC 7
31
32#define RESET_DELAY_8185 20
33
34#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
35#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
36
37#define NUM_OF_FIRMWARE_QUEUE 10
38#define NUM_OF_PAGES_IN_FW 0x100
39#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
40#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
41#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
42#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
43#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
44#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
45#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
46#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
47#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
48#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
49
50#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
51#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
52#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
53#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
54#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
55
56#define MAX_LINES_HWCONFIG_TXT 1000
57#define MAX_BYTES_LINE_HWCONFIG_TXT 256
58
59#define SW_THREE_WIRE 0
60#define HW_THREE_WIRE 2
61
62#define BT_DEMO_BOARD 0
63#define BT_QA_BOARD 1
64#define BT_FPGA 2
65
66#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 29#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
67#define HAL_PRIME_CHNL_OFFSET_LOWER 1 30#define HAL_PRIME_CHNL_OFFSET_LOWER 1
68#define HAL_PRIME_CHNL_OFFSET_UPPER 2 31#define HAL_PRIME_CHNL_OFFSET_UPPER 2
69 32
70#define MAX_H2C_QUEUE_NUM 10
71
72#define RX_MPDU_QUEUE 0 33#define RX_MPDU_QUEUE 0
73#define RX_CMD_QUEUE 1 34#define RX_CMD_QUEUE 1
74#define RX_MAX_QUEUE 2
75#define AC2QUEUEID(_AC) (_AC)
76 35
77#define C2H_RX_CMD_HDR_LEN 8 36#define C2H_RX_CMD_HDR_LEN 8
78#define GET_C2H_CMD_CMD_LEN(__prxhdr) \ 37#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
index aa085462d0e9..67bb47d77b68 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
@@ -362,7 +362,7 @@ void rtl8723e_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
362 acm_ctrl &= (~ACMHW_VIQEN); 362 acm_ctrl &= (~ACMHW_VIQEN);
363 break; 363 break;
364 case AC3_VO: 364 case AC3_VO:
365 acm_ctrl &= (~ACMHW_BEQEN); 365 acm_ctrl &= (~ACMHW_VOQEN);
366 break; 366 break;
367 default: 367 default:
368 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 368 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
@@ -1183,7 +1183,7 @@ static int _rtl8723e_set_media_status(struct ieee80211_hw *hw,
1183 mode); 1183 mode);
1184 } 1184 }
1185 1185
1186 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode); 1186 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1187 rtlpriv->cfg->ops->led_control(hw, ledaction); 1187 rtlpriv->cfg->ops->led_control(hw, ledaction);
1188 if (mode == MSR_AP) 1188 if (mode == MSR_AP)
1189 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1189 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h b/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h
index f3f45b16361f..7b44ebc0fac9 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h
@@ -27,7 +27,6 @@
27#define __RTL8723E_RF_H__ 27#define __RTL8723E_RF_H__
28 28
29#define RF6052_MAX_TX_PWR 0x3F 29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31 30
32void rtl8723e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, 31void rtl8723e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth); 32 u8 bandwidth);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/hw.c b/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
index 6dad28e77bbb..b681af3c7a35 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
@@ -603,7 +603,7 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
603 acm_ctrl &= (~ACMHW_VIQEN); 603 acm_ctrl &= (~ACMHW_VIQEN);
604 break; 604 break;
605 case AC3_VO: 605 case AC3_VO:
606 acm_ctrl &= (~ACMHW_BEQEN); 606 acm_ctrl &= (~ACMHW_VOQEN);
607 break; 607 break;
608 default: 608 default:
609 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 609 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
@@ -1558,7 +1558,7 @@ static int _rtl8723be_set_media_status(struct ieee80211_hw *hw,
1558 mode); 1558 mode);
1559 } 1559 }
1560 1560
1561 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode); 1561 rtl_write_byte(rtlpriv, MSR, bt_msr | mode);
1562 rtlpriv->cfg->ops->led_control(hw, ledaction); 1562 rtlpriv->cfg->ops->led_control(hw, ledaction);
1563 if (mode == MSR_AP) 1563 if (mode == MSR_AP)
1564 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1564 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/rf.h b/drivers/net/wireless/rtlwifi/rtl8723be/rf.h
index a6fea106ced4..f423e157020f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/rf.h
@@ -27,7 +27,6 @@
27#define __RTL8723BE_RF_H__ 27#define __RTL8723BE_RF_H__
28 28
29#define RF6052_MAX_TX_PWR 0x3F 29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31 30
32void rtl8723be_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, 31void rtl8723be_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth); 32 u8 bandwidth);
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
index ee7c208bd070..dfbdf539de1a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
@@ -118,55 +118,14 @@
118#define WIFI_NAV_UPPER_US 30000 118#define WIFI_NAV_UPPER_US 30000
119#define HAL_92C_NAV_UPPER_UNIT 128 119#define HAL_92C_NAV_UPPER_UNIT 128
120 120
121#define HAL_RETRY_LIMIT_INFRA 48
122#define HAL_RETRY_LIMIT_AP_ADHOC 7
123
124#define RESET_DELAY_8185 20
125
126#define RT_IBSS_INT_MASKS (IMR_BCNINT | IMR_TBDOK | IMR_TBDER)
127#define RT_AC_INT_MASKS (IMR_VIDOK | IMR_VODOK | IMR_BEDOK|IMR_BKDOK)
128
129#define NUM_OF_FIRMWARE_QUEUE 10
130#define NUM_OF_PAGES_IN_FW 0x100
131#define NUM_OF_PAGE_IN_FW_QUEUE_BK 0x07
132#define NUM_OF_PAGE_IN_FW_QUEUE_BE 0x07
133#define NUM_OF_PAGE_IN_FW_QUEUE_VI 0x07
134#define NUM_OF_PAGE_IN_FW_QUEUE_VO 0x07
135#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA 0x0
136#define NUM_OF_PAGE_IN_FW_QUEUE_CMD 0x0
137#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT 0x02
138#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH 0x02
139#define NUM_OF_PAGE_IN_FW_QUEUE_BCN 0x2
140#define NUM_OF_PAGE_IN_FW_QUEUE_PUB 0xA1
141
142#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
143#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
144#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
145#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
146#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM 0x00
147
148#define MAX_RX_DMA_BUFFER_SIZE 0x3E80 121#define MAX_RX_DMA_BUFFER_SIZE 0x3E80
149 122
150#define MAX_LINES_HWCONFIG_TXT 1000
151#define MAX_BYTES_LINE_HWCONFIG_TXT 256
152
153#define SW_THREE_WIRE 0
154#define HW_THREE_WIRE 2
155
156#define BT_DEMO_BOARD 0
157#define BT_QA_BOARD 1
158#define BT_FPGA 2
159
160#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0 123#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
161#define HAL_PRIME_CHNL_OFFSET_LOWER 1 124#define HAL_PRIME_CHNL_OFFSET_LOWER 1
162#define HAL_PRIME_CHNL_OFFSET_UPPER 2 125#define HAL_PRIME_CHNL_OFFSET_UPPER 2
163 126
164#define MAX_H2C_QUEUE_NUM 10
165
166#define RX_MPDU_QUEUE 0 127#define RX_MPDU_QUEUE 0
167#define RX_CMD_QUEUE 1 128#define RX_CMD_QUEUE 1
168#define RX_MAX_QUEUE 2
169#define AC2QUEUEID(_AC) (_AC)
170 129
171#define MAX_RX_DMA_BUFFER_SIZE_8812 0x3E80 130#define MAX_RX_DMA_BUFFER_SIZE_8812 0x3E80
172 131
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
index 8ec8200002c7..8704eee9f3a4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
@@ -423,7 +423,7 @@ void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
423 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4); 423 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4);
424 break; 424 break;
425 case HW_VAR_MEDIA_STATUS: 425 case HW_VAR_MEDIA_STATUS:
426 val[0] = rtl_read_byte(rtlpriv, REG_CR+2) & 0x3; 426 val[0] = rtl_read_byte(rtlpriv, MSR) & 0x3;
427 break; 427 break;
428 case HW_VAR_SLOT_TIME: 428 case HW_VAR_SLOT_TIME:
429 *((u8 *)(val)) = mac->slot_time; 429 *((u8 *)(val)) = mac->slot_time;
@@ -667,7 +667,7 @@ void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
667 acm_ctrl &= (~ACMHW_VIQEN); 667 acm_ctrl &= (~ACMHW_VIQEN);
668 break; 668 break;
669 case AC3_VO: 669 case AC3_VO:
670 acm_ctrl &= (~ACMHW_BEQEN); 670 acm_ctrl &= (~ACMHW_VOQEN);
671 break; 671 break;
672 default: 672 default:
673 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 673 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
@@ -1515,7 +1515,7 @@ static bool _rtl8821ae_dynamic_rqpn(struct ieee80211_hw *hw, u32 boundary,
1515 (u8 *)(&support_remote_wakeup)); 1515 (u8 *)(&support_remote_wakeup));
1516 1516
1517 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1517 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1518 "boundary=0x%#X, NPQ_RQPNValue=0x%#X, RQPNValue=0x%#X\n", 1518 "boundary=%#X, NPQ_RQPNValue=%#X, RQPNValue=%#X\n",
1519 boundary, npq_rqpn_value, rqpn_val); 1519 boundary, npq_rqpn_value, rqpn_val);
1520 1520
1521 /* stop PCIe DMA 1521 /* stop PCIe DMA
@@ -2178,7 +2178,7 @@ static int _rtl8821ae_set_media_status(struct ieee80211_hw *hw,
2178 return 1; 2178 return 1;
2179 } 2179 }
2180 2180
2181 rtl_write_byte(rtlpriv, (MSR), bt_msr); 2181 rtl_write_byte(rtlpriv, MSR, bt_msr);
2182 rtlpriv->cfg->ops->led_control(hw, ledaction); 2182 rtlpriv->cfg->ops->led_control(hw, ledaction);
2183 if ((bt_msr & 0xfc) == MSR_AP) 2183 if ((bt_msr & 0xfc) == MSR_AP)
2184 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 2184 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h
index d9582ee1c335..efd22bd0b139 100644
--- a/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h
@@ -27,7 +27,6 @@
27#define __RTL8821AE_RF_H__ 27#define __RTL8821AE_RF_H__
28 28
29#define RF6052_MAX_TX_PWR 0x3F 29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31 30
32void rtl8821ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, 31void rtl8821ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth); 32 u8 bandwidth);
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
index 72af4b9ee32b..174743aef943 100644
--- a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
@@ -64,6 +64,20 @@ static u16 odm_cfo(char value)
64 return ret_val; 64 return ret_val;
65} 65}
66 66
67static u8 _rtl8821ae_evm_dbm_jaguar(char value)
68{
69 char ret_val = value;
70
71 /* -33dB~0dB to 33dB ~ 0dB*/
72 if (ret_val == -128)
73 ret_val = 127;
74 else if (ret_val < 0)
75 ret_val = 0 - ret_val;
76
77 ret_val = ret_val >> 1;
78 return ret_val;
79}
80
67static void query_rxphystatus(struct ieee80211_hw *hw, 81static void query_rxphystatus(struct ieee80211_hw *hw,
68 struct rtl_stats *pstatus, u8 *pdesc, 82 struct rtl_stats *pstatus, u8 *pdesc,
69 struct rx_fwinfo_8821ae *p_drvinfo, 83 struct rx_fwinfo_8821ae *p_drvinfo,
@@ -246,7 +260,7 @@ static void query_rxphystatus(struct ieee80211_hw *hw,
246 260
247 for (i = 0; i < max_spatial_stream; i++) { 261 for (i = 0; i < max_spatial_stream; i++) {
248 evm = rtl_evm_db_to_percentage(p_phystrpt->rxevm[i]); 262 evm = rtl_evm_db_to_percentage(p_phystrpt->rxevm[i]);
249 evmdbm = rtl_evm_dbm_jaguar(p_phystrpt->rxevm[i]); 263 evmdbm = _rtl8821ae_evm_dbm_jaguar(p_phystrpt->rxevm[i]);
250 264
251 if (bpacket_match_bssid) { 265 if (bpacket_match_bssid) {
252 /* Fill value in RFD, Get the first 266 /* Fill value in RFD, Get the first
diff --git a/drivers/net/wireless/rtlwifi/stats.c b/drivers/net/wireless/rtlwifi/stats.c
index 2d0736a09fc0..d8b30690b00d 100644
--- a/drivers/net/wireless/rtlwifi/stats.c
+++ b/drivers/net/wireless/rtlwifi/stats.c
@@ -39,15 +39,8 @@ EXPORT_SYMBOL(rtl_query_rxpwrpercentage);
39 39
40u8 rtl_evm_db_to_percentage(char value) 40u8 rtl_evm_db_to_percentage(char value)
41{ 41{
42 char ret_val; 42 char ret_val = clamp(-value, 0, 33) * 3;
43 ret_val = value;
44 43
45 if (ret_val >= 0)
46 ret_val = 0;
47 if (ret_val <= -33)
48 ret_val = -33;
49 ret_val = 0 - ret_val;
50 ret_val *= 3;
51 if (ret_val == 99) 44 if (ret_val == 99)
52 ret_val = 100; 45 ret_val = 100;
53 46
@@ -55,21 +48,6 @@ u8 rtl_evm_db_to_percentage(char value)
55} 48}
56EXPORT_SYMBOL(rtl_evm_db_to_percentage); 49EXPORT_SYMBOL(rtl_evm_db_to_percentage);
57 50
58u8 rtl_evm_dbm_jaguar(char value)
59{
60 char ret_val = value;
61
62 /* -33dB~0dB to 33dB ~ 0dB*/
63 if (ret_val == -128)
64 ret_val = 127;
65 else if (ret_val < 0)
66 ret_val = 0 - ret_val;
67
68 ret_val = ret_val >> 1;
69 return ret_val;
70}
71EXPORT_SYMBOL(rtl_evm_dbm_jaguar);
72
73static long rtl_translate_todbm(struct ieee80211_hw *hw, 51static long rtl_translate_todbm(struct ieee80211_hw *hw,
74 u8 signal_strength_index) 52 u8 signal_strength_index)
75{ 53{
diff --git a/drivers/net/wireless/rtlwifi/stats.h b/drivers/net/wireless/rtlwifi/stats.h
index aa4eec80ccf7..2b57dffef572 100644
--- a/drivers/net/wireless/rtlwifi/stats.h
+++ b/drivers/net/wireless/rtlwifi/stats.h
@@ -35,7 +35,6 @@
35 35
36u8 rtl_query_rxpwrpercentage(char antpower); 36u8 rtl_query_rxpwrpercentage(char antpower);
37u8 rtl_evm_db_to_percentage(char value); 37u8 rtl_evm_db_to_percentage(char value);
38u8 rtl_evm_dbm_jaguar(char value);
39long rtl_signal_scale_mapping(struct ieee80211_hw *hw, long currsig); 38long rtl_signal_scale_mapping(struct ieee80211_hw *hw, long currsig);
40void rtl_process_phyinfo(struct ieee80211_hw *hw, u8 *buffer, 39void rtl_process_phyinfo(struct ieee80211_hw *hw, u8 *buffer,
41 struct rtl_stats *pstatus); 40 struct rtl_stats *pstatus);
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index 46ee956d0235..f0188c83c79f 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -701,12 +701,18 @@ free:
701 701
702static void _rtl_usb_cleanup_rx(struct ieee80211_hw *hw) 702static void _rtl_usb_cleanup_rx(struct ieee80211_hw *hw)
703{ 703{
704 struct rtl_priv *rtlpriv = rtl_priv(hw);
704 struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw)); 705 struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
705 struct urb *urb; 706 struct urb *urb;
706 707
707 usb_kill_anchored_urbs(&rtlusb->rx_submitted); 708 usb_kill_anchored_urbs(&rtlusb->rx_submitted);
708 709
709 tasklet_kill(&rtlusb->rx_work_tasklet); 710 tasklet_kill(&rtlusb->rx_work_tasklet);
711 cancel_work_sync(&rtlpriv->works.lps_change_work);
712
713 flush_workqueue(rtlpriv->works.rtl_wq);
714 destroy_workqueue(rtlpriv->works.rtl_wq);
715
710 skb_queue_purge(&rtlusb->rx_queue); 716 skb_queue_purge(&rtlusb->rx_queue);
711 717
712 while ((urb = usb_get_from_anchor(&rtlusb->rx_cleanup_urbs))) { 718 while ((urb = usb_get_from_anchor(&rtlusb->rx_cleanup_urbs))) {
@@ -794,8 +800,6 @@ static void rtl_usb_cleanup(struct ieee80211_hw *hw)
794 struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw)); 800 struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw));
795 struct ieee80211_tx_info *txinfo; 801 struct ieee80211_tx_info *txinfo;
796 802
797 SET_USB_STOP(rtlusb);
798
799 /* clean up rx stuff. */ 803 /* clean up rx stuff. */
800 _rtl_usb_cleanup_rx(hw); 804 _rtl_usb_cleanup_rx(hw);
801 805
@@ -834,7 +838,6 @@ static void rtl_usb_stop(struct ieee80211_hw *hw)
834 cancel_work_sync(&rtlpriv->works.fill_h2c_cmd); 838 cancel_work_sync(&rtlpriv->works.fill_h2c_cmd);
835 /* Enable software */ 839 /* Enable software */
836 SET_USB_STOP(rtlusb); 840 SET_USB_STOP(rtlusb);
837 rtl_usb_deinit(hw);
838 rtlpriv->cfg->ops->hw_disable(hw); 841 rtlpriv->cfg->ops->hw_disable(hw);
839} 842}
840 843
@@ -1147,9 +1150,9 @@ void rtl_usb_disconnect(struct usb_interface *intf)
1147 1150
1148 if (unlikely(!rtlpriv)) 1151 if (unlikely(!rtlpriv))
1149 return; 1152 return;
1150
1151 /* just in case driver is removed before firmware callback */ 1153 /* just in case driver is removed before firmware callback */
1152 wait_for_completion(&rtlpriv->firmware_loading_complete); 1154 wait_for_completion(&rtlpriv->firmware_loading_complete);
1155 clear_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
1153 /*ieee80211_unregister_hw will call ops_stop */ 1156 /*ieee80211_unregister_hw will call ops_stop */
1154 if (rtlmac->mac80211_registered == 1) { 1157 if (rtlmac->mac80211_registered == 1) {
1155 ieee80211_unregister_hw(hw); 1158 ieee80211_unregister_hw(hw);
diff --git a/drivers/net/wireless/ti/wl1251/main.c b/drivers/net/wireless/ti/wl1251/main.c
index d4ba009ac9aa..5d54d16a59e7 100644
--- a/drivers/net/wireless/ti/wl1251/main.c
+++ b/drivers/net/wireless/ti/wl1251/main.c
@@ -468,7 +468,7 @@ static void wl1251_op_stop(struct ieee80211_hw *hw)
468 wl1251_tx_flush(wl); 468 wl1251_tx_flush(wl);
469 wl1251_power_off(wl); 469 wl1251_power_off(wl);
470 470
471 memset(wl->bssid, 0, ETH_ALEN); 471 eth_zero_addr(wl->bssid);
472 wl->listen_int = 1; 472 wl->listen_int = 1;
473 wl->bss_type = MAX_BSS_TYPE; 473 wl->bss_type = MAX_BSS_TYPE;
474 474
@@ -547,7 +547,7 @@ static void wl1251_op_remove_interface(struct ieee80211_hw *hw,
547 mutex_lock(&wl->mutex); 547 mutex_lock(&wl->mutex);
548 wl1251_debug(DEBUG_MAC80211, "mac80211 remove interface"); 548 wl1251_debug(DEBUG_MAC80211, "mac80211 remove interface");
549 wl->vif = NULL; 549 wl->vif = NULL;
550 memset(wl->bssid, 0, ETH_ALEN); 550 eth_zero_addr(wl->bssid);
551 mutex_unlock(&wl->mutex); 551 mutex_unlock(&wl->mutex);
552} 552}
553 553
@@ -1608,7 +1608,7 @@ int wl1251_free_hw(struct wl1251 *wl)
1608} 1608}
1609EXPORT_SYMBOL_GPL(wl1251_free_hw); 1609EXPORT_SYMBOL_GPL(wl1251_free_hw);
1610 1610
1611MODULE_DESCRIPTION("TI wl1251 Wireles LAN Driver Core"); 1611MODULE_DESCRIPTION("TI wl1251 Wireless LAN Driver Core");
1612MODULE_LICENSE("GPL"); 1612MODULE_LICENSE("GPL");
1613MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>"); 1613MODULE_AUTHOR("Kalle Valo <kvalo@adurom.com>");
1614MODULE_FIRMWARE(WL1251_FW_NAME); 1614MODULE_FIRMWARE(WL1251_FW_NAME);
diff --git a/drivers/net/wireless/ti/wl18xx/debugfs.c b/drivers/net/wireless/ti/wl18xx/debugfs.c
index c93fae95baac..5fbd2230f372 100644
--- a/drivers/net/wireless/ti/wl18xx/debugfs.c
+++ b/drivers/net/wireless/ti/wl18xx/debugfs.c
@@ -139,7 +139,7 @@ WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, protection_filter, "%u");
139WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u"); 139WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, accum_arp_pend_requests, "%u");
140WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u"); 140WL18XX_DEBUGFS_FWSTATS_FILE(rx_filter, max_arp_queue_dep, "%u");
141 141
142WL18XX_DEBUGFS_FWSTATS_FILE(rx_rate, rx_frames_per_rates, "%u"); 142WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(rx_rate, rx_frames_per_rates, 50);
143 143
144WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_vs_rate, 144WL18XX_DEBUGFS_FWSTATS_FILE_ARRAY(aggr_size, tx_agg_vs_rate,
145 AGGR_STATS_TX_AGG*AGGR_STATS_TX_RATE); 145 AGGR_STATS_TX_AGG*AGGR_STATS_TX_RATE);
diff --git a/drivers/net/wireless/ti/wl18xx/event.c b/drivers/net/wireless/ti/wl18xx/event.c
index c28f06854195..548bb9e7e91e 100644
--- a/drivers/net/wireless/ti/wl18xx/event.c
+++ b/drivers/net/wireless/ti/wl18xx/event.c
@@ -77,7 +77,7 @@ static int wlcore_smart_config_sync_event(struct wl1271 *wl, u8 sync_channel,
77 wl1271_debug(DEBUG_EVENT, 77 wl1271_debug(DEBUG_EVENT,
78 "SMART_CONFIG_SYNC_EVENT_ID, freq: %d (chan: %d band %d)", 78 "SMART_CONFIG_SYNC_EVENT_ID, freq: %d (chan: %d band %d)",
79 freq, sync_channel, sync_band); 79 freq, sync_channel, sync_band);
80 skb = cfg80211_vendor_event_alloc(wl->hw->wiphy, 20, 80 skb = cfg80211_vendor_event_alloc(wl->hw->wiphy, NULL, 20,
81 WLCORE_VENDOR_EVENT_SC_SYNC, 81 WLCORE_VENDOR_EVENT_SC_SYNC,
82 GFP_KERNEL); 82 GFP_KERNEL);
83 83
@@ -98,7 +98,7 @@ static int wlcore_smart_config_decode_event(struct wl1271 *wl,
98 wl1271_debug(DEBUG_EVENT, "SMART_CONFIG_DECODE_EVENT_ID"); 98 wl1271_debug(DEBUG_EVENT, "SMART_CONFIG_DECODE_EVENT_ID");
99 wl1271_dump_ascii(DEBUG_EVENT, "SSID:", ssid, ssid_len); 99 wl1271_dump_ascii(DEBUG_EVENT, "SSID:", ssid, ssid_len);
100 100
101 skb = cfg80211_vendor_event_alloc(wl->hw->wiphy, 101 skb = cfg80211_vendor_event_alloc(wl->hw->wiphy, NULL,
102 ssid_len + pwd_len + 20, 102 ssid_len + pwd_len + 20,
103 WLCORE_VENDOR_EVENT_SC_DECODE, 103 WLCORE_VENDOR_EVENT_SC_DECODE,
104 GFP_KERNEL); 104 GFP_KERNEL);
diff --git a/drivers/net/wireless/ti/wlcore/cmd.c b/drivers/net/wireless/ti/wlcore/cmd.c
index c26fc2106e5b..68919f8d4310 100644
--- a/drivers/net/wireless/ti/wlcore/cmd.c
+++ b/drivers/net/wireless/ti/wlcore/cmd.c
@@ -367,7 +367,7 @@ void wl12xx_free_link(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 *hlid)
367 wl->links[*hlid].allocated_pkts = 0; 367 wl->links[*hlid].allocated_pkts = 0;
368 wl->links[*hlid].prev_freed_pkts = 0; 368 wl->links[*hlid].prev_freed_pkts = 0;
369 wl->links[*hlid].ba_bitmap = 0; 369 wl->links[*hlid].ba_bitmap = 0;
370 memset(wl->links[*hlid].addr, 0, ETH_ALEN); 370 eth_zero_addr(wl->links[*hlid].addr);
371 371
372 /* 372 /*
373 * At this point op_tx() will not add more packets to the queues. We 373 * At this point op_tx() will not add more packets to the queues. We
@@ -1293,7 +1293,7 @@ int wl1271_cmd_build_arp_rsp(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1293 hdr->frame_control = cpu_to_le16(fc); 1293 hdr->frame_control = cpu_to_le16(fc);
1294 memcpy(hdr->addr1, vif->bss_conf.bssid, ETH_ALEN); 1294 memcpy(hdr->addr1, vif->bss_conf.bssid, ETH_ALEN);
1295 memcpy(hdr->addr2, vif->addr, ETH_ALEN); 1295 memcpy(hdr->addr2, vif->addr, ETH_ALEN);
1296 memset(hdr->addr3, 0xff, ETH_ALEN); 1296 eth_broadcast_addr(hdr->addr3);
1297 1297
1298 ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_ARP_RSP, 1298 ret = wl1271_cmd_template_set(wl, wlvif->role_id, CMD_TEMPL_ARP_RSP,
1299 skb->data, skb->len, 0, 1299 skb->data, skb->len, 0,
diff --git a/drivers/net/wireless/ti/wlcore/debugfs.h b/drivers/net/wireless/ti/wlcore/debugfs.h
index 0f2cfb0d2a9e..bf14676e6515 100644
--- a/drivers/net/wireless/ti/wlcore/debugfs.h
+++ b/drivers/net/wireless/ti/wlcore/debugfs.h
@@ -26,8 +26,8 @@
26 26
27#include "wlcore.h" 27#include "wlcore.h"
28 28
29int wl1271_format_buffer(char __user *userbuf, size_t count, 29__printf(4, 5) int wl1271_format_buffer(char __user *userbuf, size_t count,
30 loff_t *ppos, char *fmt, ...); 30 loff_t *ppos, char *fmt, ...);
31 31
32int wl1271_debugfs_init(struct wl1271 *wl); 32int wl1271_debugfs_init(struct wl1271 *wl);
33void wl1271_debugfs_exit(struct wl1271 *wl); 33void wl1271_debugfs_exit(struct wl1271 *wl);