aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2014-10-05 21:34:39 -0400
committerDavid S. Miller <davem@davemloft.net>2014-10-05 21:34:39 -0400
commita4b4a2b7f98a45c71a906b1126cabea6446a9905 (patch)
tree0d501e78aeb9df90172a9435d673f31bf89290eb
parent61b37d2f54961b336a47a501e797a05df20c3b30 (diff)
parent3f08e47291879fb047d7d4464d2beaedfea4eb63 (diff)
Merge tag 'master-2014-10-02' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next
John W. Linville says: ==================== pull request: wireless-next 2014-10-03 Please pull tihs batch of updates intended for the 3.18 stream! For the iwlwifi bits, Emmanuel says: "I have here a few things that depend on the latest mac80211's changes: RRM, TPC, Quiet Period etc... Eyal keeps improving our rate control and we have a new device ID. This last patch should probably have gone to wireless.git, but at that stage, I preferred to send it to -next and CC stable." For (most of) the Atheros bits, Kalle says: "The only new feature is testmode support from me. Ben added a new method to crash the firmware with an assert for debug purposes. As usual, we have lots of smaller fixes from Michal. Matteo fixed a Kconfig dependency with debugfs. I fixed some warnings recently added to checkpatch." For the NFC bits, Samuel says: "We've had major updates for TI and ST Microelectronics drivers, and a few NCI related changes. For TI's trf7970a driver: - Target mode support for trf7970a - Suspend/resume support for trf7970a - DT properties additions to handle different quirks - A bunch of fixes for smartphone IOP related issues For ST Microelectronics' ST21NFCA and ST21NFCB drivers: - ISO15693 support for st21nfcb - checkpatch and sparse related warning fixes - Code cleanups and a few minor fixes Finally, Marvell added ISO15693 support to the NCI stack, together with a couple of NCI fixes." For the Bluetooth bits, Johan says: "This 3.18 pull request replaces the one I did on Monday ("bluetooth-next 2014-09-22", which hasn't been pulled yet). The additions since the last request are: - SCO connection fix for devices not supporting eSCO - Cleanups regarding the SCO establishment logic - Remove unnecessary return value from logging functions - Header compression fix for 6lowpan - Cleanups to the ieee802154/mrf24j40 driver Here's a copy from previous request that this one replaces: ' Here are some more patches for 3.18. They include various fixes to the btusb HCI driver, a fix for LE SMP, as well as adding Jukka to the MAINTAINERS file for generic 6LoWPAN (as requested by Alexander Aring). I've held on to this pull request a bit since we were waiting for a SCO related fix to get sorted out first. However, since the merge window is getting closer I decided not to wait for it. If we do get the fix sorted out there'll probably be a second small pull request later this week. '" And, "Unless 3.17 gets delayed this will probably be our last -next pull request for 3.18. We've got: - New Marvell hardware supportr - Multicast support for 6lowpan - Several of 6lowpan fixes & cleanups - Fix for a (false-positive) lockdep warning in L2CAP - Minor btusb cleanup" On top of all that comes the usual sort of updates to ath5k, ath9k, ath10k, brcmfmac, mwifiex, and wil6210. This time around there are also a number of rtlwifi updates to enable some new hardware and to reconcile the in-kernel drivers with some newer releases of the Realtek vendor drivers. Also of note is some device tree work for the bcma bus. Please let me know if there are problems! ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--Documentation/devicetree/bindings/bus/bcma.txt32
-rw-r--r--Documentation/devicetree/bindings/net/nfc/st21nfcb.txt2
-rw-r--r--Documentation/devicetree/bindings/net/nfc/trf7970a.txt8
-rw-r--r--MAINTAINERS5
-rw-r--r--drivers/bcma/bcma_private.h14
-rw-r--r--drivers/bcma/driver_gpio.c8
-rw-r--r--drivers/bcma/host_soc.c81
-rw-r--r--drivers/bcma/main.c52
-rw-r--r--drivers/bcma/scan.c8
-rw-r--r--drivers/bluetooth/Kconfig4
-rw-r--r--drivers/bluetooth/btmrvl_sdio.c36
-rw-r--r--drivers/bluetooth/btusb.c515
-rw-r--r--drivers/net/ieee802154/mrf24j40.c19
-rw-r--r--drivers/net/wireless/ath/Kconfig8
-rw-r--r--drivers/net/wireless/ath/Makefile4
-rw-r--r--drivers/net/wireless/ath/ath.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/Kconfig2
-rw-r--r--drivers/net/wireless/ath/ath10k/Makefile1
-rw-r--r--drivers/net/wireless/ath/ath10k/bmi.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/ce.c2
-rw-r--r--drivers/net/wireless/ath/ath10k/ce.h13
-rw-r--r--drivers/net/wireless/ath/ath10k/core.c106
-rw-r--r--drivers/net/wireless/ath/ath10k/core.h25
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.c102
-rw-r--r--drivers/net/wireless/ath/ath10k/debug.h12
-rw-r--r--drivers/net/wireless/ath/ath10k/hif.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/htc.c10
-rw-r--r--drivers/net/wireless/ath/ath10k/htc.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/htt.c2
-rw-r--r--drivers/net/wireless/ath/ath10k/htt.h3
-rw-r--r--drivers/net/wireless/ath/ath10k/htt_rx.c54
-rw-r--r--drivers/net/wireless/ath/ath10k/htt_tx.c2
-rw-r--r--drivers/net/wireless/ath/ath10k/hw.h2
-rw-r--r--drivers/net/wireless/ath/ath10k/mac.c192
-rw-r--r--drivers/net/wireless/ath/ath10k/pci.c183
-rw-r--r--drivers/net/wireless/ath/ath10k/rx_desc.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/targaddrs.h1
-rw-r--r--drivers/net/wireless/ath/ath10k/testmode.c382
-rw-r--r--drivers/net/wireless/ath/ath10k/testmode.h46
-rw-r--r--drivers/net/wireless/ath/ath10k/testmode_i.h70
-rw-r--r--drivers/net/wireless/ath/ath10k/trace.h105
-rw-r--r--drivers/net/wireless/ath/ath10k/txrx.c2
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.c103
-rw-r--r--drivers/net/wireless/ath/ath10k/wmi.h33
-rw-r--r--drivers/net/wireless/ath/ath5k/Kconfig14
-rw-r--r--drivers/net/wireless/ath/ath5k/Makefile1
-rw-r--r--drivers/net/wireless/ath/ath5k/ahb.c234
-rw-r--r--drivers/net/wireless/ath/ath5k/ath5k.h28
-rw-r--r--drivers/net/wireless/ath/ath5k/base.c14
-rw-r--r--drivers/net/wireless/ath/ath5k/debug.c1
-rw-r--r--drivers/net/wireless/ath/ath5k/led.c6
-rw-r--r--drivers/net/wireless/ath/ath9k/ar5008_phy.c9
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9002_mac.c26
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mac.c28
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_phy.c24
-rw-r--r--drivers/net/wireless/ath/ath9k/ath9k.h16
-rw-r--r--drivers/net/wireless/ath/ath9k/channel.c54
-rw-r--r--drivers/net/wireless/ath/ath9k/dynack.c2
-rw-r--r--drivers/net/wireless/ath/ath9k/hw-ops.h6
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c29
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/mac.h2
-rw-r--r--drivers/net/wireless/ath/ath9k/main.c79
-rw-r--r--drivers/net/wireless/ath/ath9k/reg.h15
-rw-r--r--drivers/net/wireless/ath/ath9k/xmit.c29
-rw-r--r--drivers/net/wireless/ath/main.c3
-rw-r--r--drivers/net/wireless/ath/trace.c20
-rw-r--r--drivers/net/wireless/ath/trace.h71
-rw-r--r--drivers/net/wireless/ath/wil6210/Makefile2
-rw-r--r--drivers/net/wireless/ath/wil6210/cfg80211.c4
-rw-r--r--drivers/net/wireless/ath/wil6210/debugfs.c67
-rw-r--r--drivers/net/wireless/ath/wil6210/ethtool.c103
-rw-r--r--drivers/net/wireless/ath/wil6210/interrupt.c12
-rw-r--r--drivers/net/wireless/ath/wil6210/ioctl.c173
-rw-r--r--drivers/net/wireless/ath/wil6210/main.c72
-rw-r--r--drivers/net/wireless/ath/wil6210/netdev.c13
-rw-r--r--drivers/net/wireless/ath/wil6210/wil6210.h21
-rw-r--r--drivers/net/wireless/ath/wil6210/wmi.c1
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h11
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/feature.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/feature.h3
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/flowring.c4
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h56
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c2
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c133
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/p2p.c5
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/pcie.c74
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c114
-rw-r--r--drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h7
-rw-r--r--drivers/net/wireless/brcm80211/include/defs.h5
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-8000.c2
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-drv.c18
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-fw.h17
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/constants.h3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/debugfs.c25
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/fw-api.h60
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c20
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mac80211.c37
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/mvm.h43
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/ops.c3
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c240
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.h4
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rx.c41
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/scan.c79
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.c20
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/sta.h2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/tt.c2
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/tx.c60
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/utils.c46
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/drv.c4
-rw-r--r--drivers/net/wireless/iwlwifi/pcie/trans.c2
-rw-r--r--drivers/net/wireless/mwifiex/Kconfig4
-rw-r--r--drivers/net/wireless/mwifiex/init.c1
-rw-r--r--drivers/net/wireless/mwifiex/main.c11
-rw-r--r--drivers/net/wireless/mwifiex/main.h3
-rw-r--r--drivers/net/wireless/mwifiex/pcie.c25
-rw-r--r--drivers/net/wireless/mwifiex/scan.c33
-rw-r--r--drivers/net/wireless/mwifiex/sdio.c47
-rw-r--r--drivers/net/wireless/mwifiex/sdio.h114
-rw-r--r--drivers/net/wireless/mwifiex/sta_cmd.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2800.h2
-rw-r--r--drivers/net/wireless/rtl818x/rtl8180/dev.c28
-rw-r--r--drivers/net/wireless/rtlwifi/Kconfig29
-rw-r--r--drivers/net/wireless/rtlwifi/Makefile2
-rw-r--r--drivers/net/wireless/rtlwifi/base.c661
-rw-r--r--drivers/net/wireless/rtlwifi/base.h55
-rw-r--r--drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.c2
-rw-r--r--drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.h2
-rw-r--r--drivers/net/wireless/rtlwifi/cam.c61
-rw-r--r--drivers/net/wireless/rtlwifi/cam.h10
-rw-r--r--drivers/net/wireless/rtlwifi/core.c888
-rw-r--r--drivers/net/wireless/rtlwifi/core.h11
-rw-r--r--drivers/net/wireless/rtlwifi/debug.c10
-rw-r--r--drivers/net/wireless/rtlwifi/debug.h11
-rw-r--r--drivers/net/wireless/rtlwifi/efuse.c228
-rw-r--r--drivers/net/wireless/rtlwifi/efuse.h17
-rw-r--r--drivers/net/wireless/rtlwifi/pci.c853
-rw-r--r--drivers/net/wireless/rtlwifi/pci.h56
-rw-r--r--drivers/net/wireless/rtlwifi/ps.c283
-rw-r--r--drivers/net/wireless/rtlwifi/ps.h71
-rw-r--r--drivers/net/wireless/rtlwifi/pwrseqcmd.h (renamed from drivers/net/wireless/rtlwifi/rtl8723ae/pwrseqcmd.h)6
-rw-r--r--drivers/net/wireless/rtlwifi/rc.c97
-rw-r--r--drivers/net/wireless/rtlwifi/rc.h9
-rw-r--r--drivers/net/wireless/rtlwifi/regd.c108
-rw-r--r--drivers/net/wireless/rtlwifi/regd.h11
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/def.h66
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/dm.c881
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/dm.h23
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/fw.c259
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/fw.h29
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/hw.c1251
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/led.c49
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/led.h4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/phy.c2121
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/phy.h49
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.c100
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.h415
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.c139
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.h97
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/reg.h2936
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/rf.c282
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/rf.h7
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/sw.c43
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/sw.h6
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/table.c6
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/table.h12
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/trx.c443
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8188ee/trx.h83
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c447
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h40
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c815
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/def.h15
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/dm.h64
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/hw.c16
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/hw.h2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/phy.c3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/phy.h107
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/sw.c5
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ce/trx.c8
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/def.h3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/hw.c17
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/mac.c3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/phy.c3
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/sw.c4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192cu/trx.c1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/fw.h12
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192de/trx.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/Makefile19
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/def.h101
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/dm.c1263
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/dm.h267
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/fw.c906
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/fw.h208
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/hw.c2569
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/hw.h62
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/led.c145
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/led.h34
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/phy.c3219
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/phy.h153
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.c112
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.h340
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/reg.h2231
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/rf.c152
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/rf.h36
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/sw.c399
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/sw.h33
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/table.c882
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/table.h45
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/trx.c1293
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192ee/trx.h860
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/fw.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8192se/trx.c4
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/btc.h7
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/def.h197
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/dm.c422
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/dm.h50
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/fw.c255
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/fw.h54
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.c414
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.h38
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.c1232
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.h66
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hw.c1513
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/hw.h66
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/led.c54
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/led.h13
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/phy.c884
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/phy.h67
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.c93
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.h543
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/pwrseqcmd.c129
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/reg.h2718
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/rf.c261
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/rf.h18
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/sw.c222
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/sw.h12
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/table.c8
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/table.h8
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/trx.c460
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723ae/trx.h325
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/def.h178
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/dm.c243
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/dm.h30
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/fw.c194
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/fw.h200
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/hw.c1320
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/hw.h1
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/led.c6
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/phy.c1783
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/phy.h110
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.c2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.h131
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.c139
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.h95
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/reg.h1135
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/rf.c144
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/sw.c42
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/table.c1053
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/table.h2
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/trx.c314
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723be/trx.h34
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723com/dm_common.c14
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723com/fw_common.c90
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723com/fw_common.h59
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8723com/phy_common.c57
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/Makefile19
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/def.h450
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/dm.c3019
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/dm.h356
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/fw.c1857
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/fw.h351
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/hw.c4218
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/hw.h70
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/led.c237
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/led.h37
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/phy.c4855
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/phy.h259
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c182
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h738
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/reg.h2464
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/rf.c465
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/rf.h43
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/sw.c484
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/sw.h34
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/table.c4572
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/table.h60
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/trx.c1236
-rw-r--r--drivers/net/wireless/rtlwifi/rtl8821ae/trx.h620
-rw-r--r--drivers/net/wireless/rtlwifi/stats.c50
-rw-r--r--drivers/net/wireless/rtlwifi/stats.h7
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c4
-rw-r--r--drivers/net/wireless/rtlwifi/wifi.h238
-rw-r--r--drivers/nfc/st21nfca/i2c.c34
-rw-r--r--drivers/nfc/st21nfca/st21nfca.c59
-rw-r--r--drivers/nfc/st21nfca/st21nfca.h21
-rw-r--r--drivers/nfc/st21nfca/st21nfca_dep.c59
-rw-r--r--drivers/nfc/st21nfcb/i2c.c67
-rw-r--r--drivers/nfc/st21nfcb/ndlc.c6
-rw-r--r--drivers/nfc/st21nfcb/ndlc.h4
-rw-r--r--drivers/nfc/st21nfcb/st21nfcb.c27
-rw-r--r--drivers/nfc/st21nfcb/st21nfcb.h2
-rw-r--r--drivers/nfc/trf7970a.c1059
-rw-r--r--include/linux/bcma/bcma.h2
-rw-r--r--include/net/bluetooth/bluetooth.h5
-rw-r--r--include/net/bluetooth/hci.h1
-rw-r--r--include/net/bluetooth/hci_core.h1
-rw-r--r--include/net/nfc/nci.h16
-rw-r--r--include/net/nfc/nci_core.h9
-rw-r--r--include/uapi/linux/wil6210_uapi.h87
-rw-r--r--net/bluetooth/6lowpan.c145
-rw-r--r--net/bluetooth/af_bluetooth.c3
-rw-r--r--net/bluetooth/hci_conn.c43
-rw-r--r--net/bluetooth/hci_core.c21
-rw-r--r--net/bluetooth/l2cap_core.c13
-rw-r--r--net/bluetooth/lib.c14
-rw-r--r--net/bluetooth/smp.c5
-rw-r--r--net/ieee802154/6lowpan_rtnl.c125
-rw-r--r--net/nfc/digital_dep.c101
-rw-r--r--net/nfc/nci/core.c21
-rw-r--r--net/nfc/nci/data.c7
-rw-r--r--net/nfc/nci/ntf.c40
325 files changed, 63942 insertions, 17025 deletions
diff --git a/Documentation/devicetree/bindings/bus/bcma.txt b/Documentation/devicetree/bindings/bus/bcma.txt
new file mode 100644
index 000000000000..62a48348ac15
--- /dev/null
+++ b/Documentation/devicetree/bindings/bus/bcma.txt
@@ -0,0 +1,32 @@
1Driver for ARM AXI Bus with Broadcom Plugins (bcma)
2
3Required properties:
4
5- compatible : brcm,bus-axi
6
7- reg : iomem address range of chipcommon core
8
9The cores on the AXI bus are automatically detected by bcma with the
10memory ranges they are using and they get registered afterwards.
11
12The top-level axi bus may contain children representing attached cores
13(devices). This is needed since some hardware details can't be auto
14detected (e.g. IRQ numbers). Also some of the cores may be responsible
15for extra things, e.g. ChipCommon providing access to the GPIO chip.
16
17Example:
18
19 axi@18000000 {
20 compatible = "brcm,bus-axi";
21 reg = <0x18000000 0x1000>;
22 ranges = <0x00000000 0x18000000 0x00100000>;
23 #address-cells = <1>;
24 #size-cells = <1>;
25
26 chipcommon {
27 reg = <0x00000000 0x1000>;
28
29 gpio-controller;
30 #gpio-cells = <2>;
31 };
32 };
diff --git a/Documentation/devicetree/bindings/net/nfc/st21nfcb.txt b/Documentation/devicetree/bindings/net/nfc/st21nfcb.txt
index 3b58ae480344..9005608cbbd1 100644
--- a/Documentation/devicetree/bindings/net/nfc/st21nfcb.txt
+++ b/Documentation/devicetree/bindings/net/nfc/st21nfcb.txt
@@ -26,7 +26,7 @@ Example (for ARM-based BeagleBoard xM with ST21NFCB on I2C2):
26 clock-frequency = <400000>; 26 clock-frequency = <400000>;
27 27
28 interrupt-parent = <&gpio5>; 28 interrupt-parent = <&gpio5>;
29 interrupts = <2 IRQ_TYPE_LEVEL_LOW>; 29 interrupts = <2 IRQ_TYPE_LEVEL_HIGH>;
30 30
31 reset-gpios = <&gpio5 29 GPIO_ACTIVE_HIGH>; 31 reset-gpios = <&gpio5 29 GPIO_ACTIVE_HIGH>;
32 }; 32 };
diff --git a/Documentation/devicetree/bindings/net/nfc/trf7970a.txt b/Documentation/devicetree/bindings/net/nfc/trf7970a.txt
index 1e436133685f..7c89ca290ced 100644
--- a/Documentation/devicetree/bindings/net/nfc/trf7970a.txt
+++ b/Documentation/devicetree/bindings/net/nfc/trf7970a.txt
@@ -13,6 +13,11 @@ Optional SoC Specific Properties:
13- pinctrl-names: Contains only one value - "default". 13- pinctrl-names: Contains only one value - "default".
14- pintctrl-0: Specifies the pin control groups used for this controller. 14- pintctrl-0: Specifies the pin control groups used for this controller.
15- autosuspend-delay: Specify autosuspend delay in milliseconds. 15- autosuspend-delay: Specify autosuspend delay in milliseconds.
16- vin-voltage-override: Specify voltage of VIN pin in microvolts.
17- irq-status-read-quirk: Specify that the trf7970a being used has the
18 "IRQ Status Read" erratum.
19- en2-rf-quirk: Specify that the trf7970a being used has the "EN2 RF"
20 erratum.
16 21
17Example (for ARM-based BeagleBone with TRF7970A on SPI1): 22Example (for ARM-based BeagleBone with TRF7970A on SPI1):
18 23
@@ -30,7 +35,10 @@ Example (for ARM-based BeagleBone with TRF7970A on SPI1):
30 ti,enable-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>, 35 ti,enable-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>,
31 <&gpio2 5 GPIO_ACTIVE_LOW>; 36 <&gpio2 5 GPIO_ACTIVE_LOW>;
32 vin-supply = <&ldo3_reg>; 37 vin-supply = <&ldo3_reg>;
38 vin-voltage-override = <5000000>;
33 autosuspend-delay = <30000>; 39 autosuspend-delay = <30000>;
40 irq-status-read-quirk;
41 en2-rf-quirk;
34 status = "okay"; 42 status = "okay";
35 }; 43 };
36}; 44};
diff --git a/MAINTAINERS b/MAINTAINERS
index 78b9f3b77a87..907de3dcf2b9 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -152,6 +152,7 @@ F: drivers/scsi/53c700*
152 152
1536LOWPAN GENERIC (BTLE/IEEE 802.15.4) 1536LOWPAN GENERIC (BTLE/IEEE 802.15.4)
154M: Alexander Aring <alex.aring@gmail.com> 154M: Alexander Aring <alex.aring@gmail.com>
155M: Jukka Rissanen <jukka.rissanen@linux.intel.com>
155L: linux-bluetooth@vger.kernel.org 156L: linux-bluetooth@vger.kernel.org
156L: linux-wpan@vger.kernel.org 157L: linux-wpan@vger.kernel.org
157S: Maintained 158S: Maintained
@@ -1616,6 +1617,7 @@ L: wil6210@qca.qualcomm.com
1616S: Supported 1617S: Supported
1617W: http://wireless.kernel.org/en/users/Drivers/wil6210 1618W: http://wireless.kernel.org/en/users/Drivers/wil6210
1618F: drivers/net/wireless/ath/wil6210/ 1619F: drivers/net/wireless/ath/wil6210/
1620F: include/uapi/linux/wil6210_uapi.h
1619 1621
1620CARL9170 LINUX COMMUNITY WIRELESS DRIVER 1622CARL9170 LINUX COMMUNITY WIRELESS DRIVER
1621M: Christian Lamparter <chunkeey@googlemail.com> 1623M: Christian Lamparter <chunkeey@googlemail.com>
@@ -7494,13 +7496,12 @@ F: drivers/video/fbdev/aty/aty128fb.c
7494 7496
7495RALINK RT2X00 WIRELESS LAN DRIVER 7497RALINK RT2X00 WIRELESS LAN DRIVER
7496P: rt2x00 project 7498P: rt2x00 project
7497M: Ivo van Doorn <IvDoorn@gmail.com> 7499M: Stanislaw Gruszka <sgruszka@redhat.com>
7498M: Helmut Schaa <helmut.schaa@googlemail.com> 7500M: Helmut Schaa <helmut.schaa@googlemail.com>
7499L: linux-wireless@vger.kernel.org 7501L: linux-wireless@vger.kernel.org
7500L: users@rt2x00.serialmonkey.com (moderated for non-subscribers) 7502L: users@rt2x00.serialmonkey.com (moderated for non-subscribers)
7501W: http://rt2x00.serialmonkey.com/ 7503W: http://rt2x00.serialmonkey.com/
7502S: Maintained 7504S: Maintained
7503T: git git://git.kernel.org/pub/scm/linux/kernel/git/ivd/rt2x00.git
7504F: drivers/net/wireless/rt2x00/ 7505F: drivers/net/wireless/rt2x00/
7505 7506
7506RAMDISK RAM BLOCK DEVICE DRIVER 7507RAMDISK RAM BLOCK DEVICE DRIVER
diff --git a/drivers/bcma/bcma_private.h b/drivers/bcma/bcma_private.h
index b40be43c6f31..b6412b2d748d 100644
--- a/drivers/bcma/bcma_private.h
+++ b/drivers/bcma/bcma_private.h
@@ -88,6 +88,20 @@ extern int __init bcma_host_pci_init(void);
88extern void __exit bcma_host_pci_exit(void); 88extern void __exit bcma_host_pci_exit(void);
89#endif /* CONFIG_BCMA_HOST_PCI */ 89#endif /* CONFIG_BCMA_HOST_PCI */
90 90
91/* host_soc.c */
92#if defined(CONFIG_BCMA_HOST_SOC) && defined(CONFIG_OF)
93extern int __init bcma_host_soc_register_driver(void);
94extern void __exit bcma_host_soc_unregister_driver(void);
95#else
96static inline int __init bcma_host_soc_register_driver(void)
97{
98 return 0;
99}
100static inline void __exit bcma_host_soc_unregister_driver(void)
101{
102}
103#endif /* CONFIG_BCMA_HOST_SOC && CONFIG_OF */
104
91/* driver_pci.c */ 105/* driver_pci.c */
92u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address); 106u32 bcma_pcie_read(struct bcma_drv_pci *pc, u32 address);
93 107
diff --git a/drivers/bcma/driver_gpio.c b/drivers/bcma/driver_gpio.c
index aec9f850b4a8..57ce5fe65364 100644
--- a/drivers/bcma/driver_gpio.c
+++ b/drivers/bcma/driver_gpio.c
@@ -76,7 +76,7 @@ static void bcma_gpio_free(struct gpio_chip *chip, unsigned gpio)
76 bcma_chipco_gpio_pullup(cc, 1 << gpio, 0); 76 bcma_chipco_gpio_pullup(cc, 1 << gpio, 0);
77} 77}
78 78
79#if IS_BUILTIN(CONFIG_BCMA_HOST_SOC) 79#if IS_BUILTIN(CONFIG_BCM47XX)
80static int bcma_gpio_to_irq(struct gpio_chip *chip, unsigned gpio) 80static int bcma_gpio_to_irq(struct gpio_chip *chip, unsigned gpio)
81{ 81{
82 struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip); 82 struct bcma_drv_cc *cc = bcma_gpio_get_cc(chip);
@@ -215,9 +215,13 @@ int bcma_gpio_init(struct bcma_drv_cc *cc)
215 chip->set = bcma_gpio_set_value; 215 chip->set = bcma_gpio_set_value;
216 chip->direction_input = bcma_gpio_direction_input; 216 chip->direction_input = bcma_gpio_direction_input;
217 chip->direction_output = bcma_gpio_direction_output; 217 chip->direction_output = bcma_gpio_direction_output;
218#if IS_BUILTIN(CONFIG_BCMA_HOST_SOC) 218#if IS_BUILTIN(CONFIG_BCM47XX)
219 chip->to_irq = bcma_gpio_to_irq; 219 chip->to_irq = bcma_gpio_to_irq;
220#endif 220#endif
221#if IS_BUILTIN(CONFIG_OF)
222 if (cc->core->bus->hosttype == BCMA_HOSTTYPE_SOC)
223 chip->of_node = cc->core->dev.of_node;
224#endif
221 switch (cc->core->bus->chipinfo.id) { 225 switch (cc->core->bus->chipinfo.id) {
222 case BCMA_CHIP_ID_BCM5357: 226 case BCMA_CHIP_ID_BCM5357:
223 case BCMA_CHIP_ID_BCM53572: 227 case BCMA_CHIP_ID_BCM53572:
diff --git a/drivers/bcma/host_soc.c b/drivers/bcma/host_soc.c
index 718e054dd727..335cbcfd945b 100644
--- a/drivers/bcma/host_soc.c
+++ b/drivers/bcma/host_soc.c
@@ -7,6 +7,9 @@
7 7
8#include "bcma_private.h" 8#include "bcma_private.h"
9#include "scan.h" 9#include "scan.h"
10#include <linux/slab.h>
11#include <linux/module.h>
12#include <linux/of_address.h>
10#include <linux/bcma/bcma.h> 13#include <linux/bcma/bcma.h>
11#include <linux/bcma/bcma_soc.h> 14#include <linux/bcma/bcma_soc.h>
12 15
@@ -176,6 +179,7 @@ int __init bcma_host_soc_register(struct bcma_soc *soc)
176 /* Host specific */ 179 /* Host specific */
177 bus->hosttype = BCMA_HOSTTYPE_SOC; 180 bus->hosttype = BCMA_HOSTTYPE_SOC;
178 bus->ops = &bcma_host_soc_ops; 181 bus->ops = &bcma_host_soc_ops;
182 bus->host_pdev = NULL;
179 183
180 /* Initialize struct, detect chip */ 184 /* Initialize struct, detect chip */
181 bcma_init_bus(bus); 185 bcma_init_bus(bus);
@@ -195,3 +199,80 @@ int __init bcma_host_soc_init(struct bcma_soc *soc)
195 199
196 return err; 200 return err;
197} 201}
202
203#ifdef CONFIG_OF
204static int bcma_host_soc_probe(struct platform_device *pdev)
205{
206 struct device *dev = &pdev->dev;
207 struct device_node *np = dev->of_node;
208 struct bcma_bus *bus;
209 int err;
210
211 /* Alloc */
212 bus = devm_kzalloc(dev, sizeof(*bus), GFP_KERNEL);
213 if (!bus)
214 return -ENOMEM;
215
216 /* Map MMIO */
217 bus->mmio = of_iomap(np, 0);
218 if (!bus->mmio)
219 return -ENOMEM;
220
221 /* Host specific */
222 bus->hosttype = BCMA_HOSTTYPE_SOC;
223 bus->ops = &bcma_host_soc_ops;
224 bus->host_pdev = pdev;
225
226 /* Initialize struct, detect chip */
227 bcma_init_bus(bus);
228
229 /* Register */
230 err = bcma_bus_register(bus);
231 if (err)
232 goto err_unmap_mmio;
233
234 platform_set_drvdata(pdev, bus);
235
236 return err;
237
238err_unmap_mmio:
239 iounmap(bus->mmio);
240 return err;
241}
242
243static int bcma_host_soc_remove(struct platform_device *pdev)
244{
245 struct bcma_bus *bus = platform_get_drvdata(pdev);
246
247 bcma_bus_unregister(bus);
248 iounmap(bus->mmio);
249 platform_set_drvdata(pdev, NULL);
250
251 return 0;
252}
253
254static const struct of_device_id bcma_host_soc_of_match[] = {
255 { .compatible = "brcm,bus-axi", },
256 {},
257};
258MODULE_DEVICE_TABLE(of, bcma_host_soc_of_match);
259
260static struct platform_driver bcma_host_soc_driver = {
261 .driver = {
262 .name = "bcma-host-soc",
263 .of_match_table = bcma_host_soc_of_match,
264 },
265 .probe = bcma_host_soc_probe,
266 .remove = bcma_host_soc_remove,
267};
268
269int __init bcma_host_soc_register_driver(void)
270{
271 return platform_driver_register(&bcma_host_soc_driver);
272}
273
274void __exit bcma_host_soc_unregister_driver(void)
275{
276 platform_driver_unregister(&bcma_host_soc_driver);
277}
278#endif /* CONFIG_OF */
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c
index c421403cab43..d1656c2f70af 100644
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
@@ -10,6 +10,7 @@
10#include <linux/platform_device.h> 10#include <linux/platform_device.h>
11#include <linux/bcma/bcma.h> 11#include <linux/bcma/bcma.h>
12#include <linux/slab.h> 12#include <linux/slab.h>
13#include <linux/of_address.h>
13 14
14MODULE_DESCRIPTION("Broadcom's specific AMBA driver"); 15MODULE_DESCRIPTION("Broadcom's specific AMBA driver");
15MODULE_LICENSE("GPL"); 16MODULE_LICENSE("GPL");
@@ -131,6 +132,43 @@ static bool bcma_is_core_needed_early(u16 core_id)
131 return false; 132 return false;
132} 133}
133 134
135#ifdef CONFIG_OF
136static struct device_node *bcma_of_find_child_device(struct platform_device *parent,
137 struct bcma_device *core)
138{
139 struct device_node *node;
140 u64 size;
141 const __be32 *reg;
142
143 if (!parent || !parent->dev.of_node)
144 return NULL;
145
146 for_each_child_of_node(parent->dev.of_node, node) {
147 reg = of_get_address(node, 0, &size, NULL);
148 if (!reg)
149 continue;
150 if (of_translate_address(node, reg) == core->addr)
151 return node;
152 }
153 return NULL;
154}
155
156static void bcma_of_fill_device(struct platform_device *parent,
157 struct bcma_device *core)
158{
159 struct device_node *node;
160
161 node = bcma_of_find_child_device(parent, core);
162 if (node)
163 core->dev.of_node = node;
164}
165#else
166static void bcma_of_fill_device(struct platform_device *parent,
167 struct bcma_device *core)
168{
169}
170#endif /* CONFIG_OF */
171
134static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core) 172static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
135{ 173{
136 int err; 174 int err;
@@ -147,7 +185,13 @@ static void bcma_register_core(struct bcma_bus *bus, struct bcma_device *core)
147 break; 185 break;
148 case BCMA_HOSTTYPE_SOC: 186 case BCMA_HOSTTYPE_SOC:
149 core->dev.dma_mask = &core->dev.coherent_dma_mask; 187 core->dev.dma_mask = &core->dev.coherent_dma_mask;
150 core->dma_dev = &core->dev; 188 if (bus->host_pdev) {
189 core->dma_dev = &bus->host_pdev->dev;
190 core->dev.parent = &bus->host_pdev->dev;
191 bcma_of_fill_device(bus->host_pdev, core);
192 } else {
193 core->dma_dev = &core->dev;
194 }
151 break; 195 break;
152 case BCMA_HOSTTYPE_SDIO: 196 case BCMA_HOSTTYPE_SDIO:
153 break; 197 break;
@@ -528,6 +572,11 @@ static int __init bcma_modinit(void)
528 if (err) 572 if (err)
529 return err; 573 return err;
530 574
575 err = bcma_host_soc_register_driver();
576 if (err) {
577 pr_err("SoC host initialization failed\n");
578 err = 0;
579 }
531#ifdef CONFIG_BCMA_HOST_PCI 580#ifdef CONFIG_BCMA_HOST_PCI
532 err = bcma_host_pci_init(); 581 err = bcma_host_pci_init();
533 if (err) { 582 if (err) {
@@ -545,6 +594,7 @@ static void __exit bcma_modexit(void)
545#ifdef CONFIG_BCMA_HOST_PCI 594#ifdef CONFIG_BCMA_HOST_PCI
546 bcma_host_pci_exit(); 595 bcma_host_pci_exit();
547#endif 596#endif
597 bcma_host_soc_unregister_driver();
548 bus_unregister(&bcma_bus_type); 598 bus_unregister(&bcma_bus_type);
549} 599}
550module_exit(bcma_modexit) 600module_exit(bcma_modexit)
diff --git a/drivers/bcma/scan.c b/drivers/bcma/scan.c
index b3a403c136fb..14b56561a36f 100644
--- a/drivers/bcma/scan.c
+++ b/drivers/bcma/scan.c
@@ -439,6 +439,7 @@ void bcma_init_bus(struct bcma_bus *bus)
439{ 439{
440 s32 tmp; 440 s32 tmp;
441 struct bcma_chipinfo *chipinfo = &(bus->chipinfo); 441 struct bcma_chipinfo *chipinfo = &(bus->chipinfo);
442 char chip_id[8];
442 443
443 INIT_LIST_HEAD(&bus->cores); 444 INIT_LIST_HEAD(&bus->cores);
444 bus->nr_cores = 0; 445 bus->nr_cores = 0;
@@ -449,8 +450,11 @@ void bcma_init_bus(struct bcma_bus *bus)
449 chipinfo->id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT; 450 chipinfo->id = (tmp & BCMA_CC_ID_ID) >> BCMA_CC_ID_ID_SHIFT;
450 chipinfo->rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT; 451 chipinfo->rev = (tmp & BCMA_CC_ID_REV) >> BCMA_CC_ID_REV_SHIFT;
451 chipinfo->pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT; 452 chipinfo->pkg = (tmp & BCMA_CC_ID_PKG) >> BCMA_CC_ID_PKG_SHIFT;
452 bcma_info(bus, "Found chip with id 0x%04X, rev 0x%02X and package 0x%02X\n", 453
453 chipinfo->id, chipinfo->rev, chipinfo->pkg); 454 snprintf(chip_id, ARRAY_SIZE(chip_id),
455 (chipinfo->id > 0x9999) ? "%d" : "0x%04X", chipinfo->id);
456 bcma_info(bus, "Found chip with id %s, rev 0x%02X and package 0x%02X\n",
457 chip_id, chipinfo->rev, chipinfo->pkg);
454} 458}
455 459
456int bcma_bus_scan(struct bcma_bus *bus) 460int bcma_bus_scan(struct bcma_bus *bus)
diff --git a/drivers/bluetooth/Kconfig b/drivers/bluetooth/Kconfig
index fa7fd62ddffa..4547dc238fc7 100644
--- a/drivers/bluetooth/Kconfig
+++ b/drivers/bluetooth/Kconfig
@@ -201,7 +201,7 @@ config BT_MRVL
201 The core driver to support Marvell Bluetooth devices. 201 The core driver to support Marvell Bluetooth devices.
202 202
203 This driver is required if you want to support 203 This driver is required if you want to support
204 Marvell Bluetooth devices, such as 8688/8787/8797/8897. 204 Marvell Bluetooth devices, such as 8688/8787/8797/8887/8897.
205 205
206 Say Y here to compile Marvell Bluetooth driver 206 Say Y here to compile Marvell Bluetooth driver
207 into the kernel or say M to compile it as module. 207 into the kernel or say M to compile it as module.
@@ -214,7 +214,7 @@ config BT_MRVL_SDIO
214 The driver for Marvell Bluetooth chipsets with SDIO interface. 214 The driver for Marvell Bluetooth chipsets with SDIO interface.
215 215
216 This driver is required if you want to use Marvell Bluetooth 216 This driver is required if you want to use Marvell Bluetooth
217 devices with SDIO interface. Currently SD8688/SD8787/SD8797/SD8897 217 devices with SDIO interface. Currently SD8688/SD8787/SD8797/SD8887/SD8897
218 chipsets are supported. 218 chipsets are supported.
219 219
220 Say Y here to compile support for Marvell BT-over-SDIO driver 220 Say Y here to compile support for Marvell BT-over-SDIO driver
diff --git a/drivers/bluetooth/btmrvl_sdio.c b/drivers/bluetooth/btmrvl_sdio.c
index 3e683b153259..550bce089fa6 100644
--- a/drivers/bluetooth/btmrvl_sdio.c
+++ b/drivers/bluetooth/btmrvl_sdio.c
@@ -84,7 +84,27 @@ static const struct btmrvl_sdio_card_reg btmrvl_reg_87xx = {
84 .int_read_to_clear = false, 84 .int_read_to_clear = false,
85}; 85};
86 86
87static const struct btmrvl_sdio_card_reg btmrvl_reg_88xx = { 87static const struct btmrvl_sdio_card_reg btmrvl_reg_8887 = {
88 .cfg = 0x00,
89 .host_int_mask = 0x08,
90 .host_intstatus = 0x0C,
91 .card_status = 0x5C,
92 .sq_read_base_addr_a0 = 0x6C,
93 .sq_read_base_addr_a1 = 0x6D,
94 .card_revision = 0xC8,
95 .card_fw_status0 = 0x88,
96 .card_fw_status1 = 0x89,
97 .card_rx_len = 0x8A,
98 .card_rx_unit = 0x8B,
99 .io_port_0 = 0xE4,
100 .io_port_1 = 0xE5,
101 .io_port_2 = 0xE6,
102 .int_read_to_clear = true,
103 .host_int_rsr = 0x04,
104 .card_misc_cfg = 0xD8,
105};
106
107static const struct btmrvl_sdio_card_reg btmrvl_reg_8897 = {
88 .cfg = 0x00, 108 .cfg = 0x00,
89 .host_int_mask = 0x02, 109 .host_int_mask = 0x02,
90 .host_intstatus = 0x03, 110 .host_intstatus = 0x03,
@@ -128,10 +148,18 @@ static const struct btmrvl_sdio_device btmrvl_sdio_sd8797 = {
128 .sd_blksz_fw_dl = 256, 148 .sd_blksz_fw_dl = 256,
129}; 149};
130 150
151static const struct btmrvl_sdio_device btmrvl_sdio_sd8887 = {
152 .helper = NULL,
153 .firmware = "mrvl/sd8887_uapsta.bin",
154 .reg = &btmrvl_reg_8887,
155 .support_pscan_win_report = true,
156 .sd_blksz_fw_dl = 256,
157};
158
131static const struct btmrvl_sdio_device btmrvl_sdio_sd8897 = { 159static const struct btmrvl_sdio_device btmrvl_sdio_sd8897 = {
132 .helper = NULL, 160 .helper = NULL,
133 .firmware = "mrvl/sd8897_uapsta.bin", 161 .firmware = "mrvl/sd8897_uapsta.bin",
134 .reg = &btmrvl_reg_88xx, 162 .reg = &btmrvl_reg_8897,
135 .support_pscan_win_report = true, 163 .support_pscan_win_report = true,
136 .sd_blksz_fw_dl = 256, 164 .sd_blksz_fw_dl = 256,
137}; 165};
@@ -149,6 +177,9 @@ static const struct sdio_device_id btmrvl_sdio_ids[] = {
149 /* Marvell SD8797 Bluetooth device */ 177 /* Marvell SD8797 Bluetooth device */
150 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912A), 178 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912A),
151 .driver_data = (unsigned long) &btmrvl_sdio_sd8797 }, 179 .driver_data = (unsigned long) &btmrvl_sdio_sd8797 },
180 /* Marvell SD8887 Bluetooth device */
181 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x9136),
182 .driver_data = (unsigned long)&btmrvl_sdio_sd8887 },
152 /* Marvell SD8897 Bluetooth device */ 183 /* Marvell SD8897 Bluetooth device */
153 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912E), 184 { SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, 0x912E),
154 .driver_data = (unsigned long) &btmrvl_sdio_sd8897 }, 185 .driver_data = (unsigned long) &btmrvl_sdio_sd8897 },
@@ -1280,4 +1311,5 @@ MODULE_FIRMWARE("mrvl/sd8688_helper.bin");
1280MODULE_FIRMWARE("mrvl/sd8688.bin"); 1311MODULE_FIRMWARE("mrvl/sd8688.bin");
1281MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin"); 1312MODULE_FIRMWARE("mrvl/sd8787_uapsta.bin");
1282MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin"); 1313MODULE_FIRMWARE("mrvl/sd8797_uapsta.bin");
1314MODULE_FIRMWARE("mrvl/sd8887_uapsta.bin");
1283MODULE_FIRMWARE("mrvl/sd8897_uapsta.bin"); 1315MODULE_FIRMWARE("mrvl/sd8897_uapsta.bin");
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index a79d657c0845..edfc17bfcd44 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -268,20 +268,24 @@ struct btusb_data {
268 struct usb_interface *intf; 268 struct usb_interface *intf;
269 struct usb_interface *isoc; 269 struct usb_interface *isoc;
270 270
271 spinlock_t lock;
272
273 unsigned long flags; 271 unsigned long flags;
274 272
275 struct work_struct work; 273 struct work_struct work;
276 struct work_struct waker; 274 struct work_struct waker;
277 275
276 struct usb_anchor deferred;
278 struct usb_anchor tx_anchor; 277 struct usb_anchor tx_anchor;
278 int tx_in_flight;
279 spinlock_t txlock;
280
279 struct usb_anchor intr_anchor; 281 struct usb_anchor intr_anchor;
280 struct usb_anchor bulk_anchor; 282 struct usb_anchor bulk_anchor;
281 struct usb_anchor isoc_anchor; 283 struct usb_anchor isoc_anchor;
282 struct usb_anchor deferred; 284 spinlock_t rxlock;
283 int tx_in_flight; 285
284 spinlock_t txlock; 286 struct sk_buff *evt_skb;
287 struct sk_buff *acl_skb;
288 struct sk_buff *sco_skb;
285 289
286 struct usb_endpoint_descriptor *intr_ep; 290 struct usb_endpoint_descriptor *intr_ep;
287 struct usb_endpoint_descriptor *bulk_tx_ep; 291 struct usb_endpoint_descriptor *bulk_tx_ep;
@@ -296,18 +300,189 @@ struct btusb_data {
296 int suspend_count; 300 int suspend_count;
297}; 301};
298 302
299static int inc_tx(struct btusb_data *data) 303static inline void btusb_free_frags(struct btusb_data *data)
300{ 304{
301 unsigned long flags; 305 unsigned long flags;
302 int rv;
303 306
304 spin_lock_irqsave(&data->txlock, flags); 307 spin_lock_irqsave(&data->rxlock, flags);
305 rv = test_bit(BTUSB_SUSPENDING, &data->flags); 308
306 if (!rv) 309 kfree_skb(data->evt_skb);
307 data->tx_in_flight++; 310 data->evt_skb = NULL;
308 spin_unlock_irqrestore(&data->txlock, flags); 311
312 kfree_skb(data->acl_skb);
313 data->acl_skb = NULL;
314
315 kfree_skb(data->sco_skb);
316 data->sco_skb = NULL;
317
318 spin_unlock_irqrestore(&data->rxlock, flags);
319}
320
321static int btusb_recv_intr(struct btusb_data *data, void *buffer, int count)
322{
323 struct sk_buff *skb;
324 int err = 0;
325
326 spin_lock(&data->rxlock);
327 skb = data->evt_skb;
328
329 while (count) {
330 int len;
331
332 if (!skb) {
333 skb = bt_skb_alloc(HCI_MAX_EVENT_SIZE, GFP_ATOMIC);
334 if (!skb) {
335 err = -ENOMEM;
336 break;
337 }
338
339 bt_cb(skb)->pkt_type = HCI_EVENT_PKT;
340 bt_cb(skb)->expect = HCI_EVENT_HDR_SIZE;
341 }
342
343 len = min_t(uint, bt_cb(skb)->expect, count);
344 memcpy(skb_put(skb, len), buffer, len);
345
346 count -= len;
347 buffer += len;
348 bt_cb(skb)->expect -= len;
349
350 if (skb->len == HCI_EVENT_HDR_SIZE) {
351 /* Complete event header */
352 bt_cb(skb)->expect = hci_event_hdr(skb)->plen;
353
354 if (skb_tailroom(skb) < bt_cb(skb)->expect) {
355 kfree_skb(skb);
356 skb = NULL;
357
358 err = -EILSEQ;
359 break;
360 }
361 }
362
363 if (bt_cb(skb)->expect == 0) {
364 /* Complete frame */
365 hci_recv_frame(data->hdev, skb);
366 skb = NULL;
367 }
368 }
369
370 data->evt_skb = skb;
371 spin_unlock(&data->rxlock);
372
373 return err;
374}
375
376static int btusb_recv_bulk(struct btusb_data *data, void *buffer, int count)
377{
378 struct sk_buff *skb;
379 int err = 0;
380
381 spin_lock(&data->rxlock);
382 skb = data->acl_skb;
383
384 while (count) {
385 int len;
309 386
310 return rv; 387 if (!skb) {
388 skb = bt_skb_alloc(HCI_MAX_FRAME_SIZE, GFP_ATOMIC);
389 if (!skb) {
390 err = -ENOMEM;
391 break;
392 }
393
394 bt_cb(skb)->pkt_type = HCI_ACLDATA_PKT;
395 bt_cb(skb)->expect = HCI_ACL_HDR_SIZE;
396 }
397
398 len = min_t(uint, bt_cb(skb)->expect, count);
399 memcpy(skb_put(skb, len), buffer, len);
400
401 count -= len;
402 buffer += len;
403 bt_cb(skb)->expect -= len;
404
405 if (skb->len == HCI_ACL_HDR_SIZE) {
406 __le16 dlen = hci_acl_hdr(skb)->dlen;
407
408 /* Complete ACL header */
409 bt_cb(skb)->expect = __le16_to_cpu(dlen);
410
411 if (skb_tailroom(skb) < bt_cb(skb)->expect) {
412 kfree_skb(skb);
413 skb = NULL;
414
415 err = -EILSEQ;
416 break;
417 }
418 }
419
420 if (bt_cb(skb)->expect == 0) {
421 /* Complete frame */
422 hci_recv_frame(data->hdev, skb);
423 skb = NULL;
424 }
425 }
426
427 data->acl_skb = skb;
428 spin_unlock(&data->rxlock);
429
430 return err;
431}
432
433static int btusb_recv_isoc(struct btusb_data *data, void *buffer, int count)
434{
435 struct sk_buff *skb;
436 int err = 0;
437
438 spin_lock(&data->rxlock);
439 skb = data->sco_skb;
440
441 while (count) {
442 int len;
443
444 if (!skb) {
445 skb = bt_skb_alloc(HCI_MAX_SCO_SIZE, GFP_ATOMIC);
446 if (!skb) {
447 err = -ENOMEM;
448 break;
449 }
450
451 bt_cb(skb)->pkt_type = HCI_SCODATA_PKT;
452 bt_cb(skb)->expect = HCI_SCO_HDR_SIZE;
453 }
454
455 len = min_t(uint, bt_cb(skb)->expect, count);
456 memcpy(skb_put(skb, len), buffer, len);
457
458 count -= len;
459 buffer += len;
460 bt_cb(skb)->expect -= len;
461
462 if (skb->len == HCI_SCO_HDR_SIZE) {
463 /* Complete SCO header */
464 bt_cb(skb)->expect = hci_sco_hdr(skb)->dlen;
465
466 if (skb_tailroom(skb) < bt_cb(skb)->expect) {
467 kfree_skb(skb);
468 skb = NULL;
469
470 err = -EILSEQ;
471 break;
472 }
473 }
474
475 if (bt_cb(skb)->expect == 0) {
476 /* Complete frame */
477 hci_recv_frame(data->hdev, skb);
478 skb = NULL;
479 }
480 }
481
482 data->sco_skb = skb;
483 spin_unlock(&data->rxlock);
484
485 return err;
311} 486}
312 487
313static void btusb_intr_complete(struct urb *urb) 488static void btusb_intr_complete(struct urb *urb)
@@ -316,8 +491,8 @@ static void btusb_intr_complete(struct urb *urb)
316 struct btusb_data *data = hci_get_drvdata(hdev); 491 struct btusb_data *data = hci_get_drvdata(hdev);
317 int err; 492 int err;
318 493
319 BT_DBG("%s urb %p status %d count %d", hdev->name, 494 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
320 urb, urb->status, urb->actual_length); 495 urb->actual_length);
321 496
322 if (!test_bit(HCI_RUNNING, &hdev->flags)) 497 if (!test_bit(HCI_RUNNING, &hdev->flags))
323 return; 498 return;
@@ -325,9 +500,8 @@ static void btusb_intr_complete(struct urb *urb)
325 if (urb->status == 0) { 500 if (urb->status == 0) {
326 hdev->stat.byte_rx += urb->actual_length; 501 hdev->stat.byte_rx += urb->actual_length;
327 502
328 if (hci_recv_fragment(hdev, HCI_EVENT_PKT, 503 if (btusb_recv_intr(data, urb->transfer_buffer,
329 urb->transfer_buffer, 504 urb->actual_length) < 0) {
330 urb->actual_length) < 0) {
331 BT_ERR("%s corrupted event packet", hdev->name); 505 BT_ERR("%s corrupted event packet", hdev->name);
332 hdev->stat.err_rx++; 506 hdev->stat.err_rx++;
333 } 507 }
@@ -348,7 +522,7 @@ static void btusb_intr_complete(struct urb *urb)
348 * -ENODEV: device got disconnected */ 522 * -ENODEV: device got disconnected */
349 if (err != -EPERM && err != -ENODEV) 523 if (err != -EPERM && err != -ENODEV)
350 BT_ERR("%s urb %p failed to resubmit (%d)", 524 BT_ERR("%s urb %p failed to resubmit (%d)",
351 hdev->name, urb, -err); 525 hdev->name, urb, -err);
352 usb_unanchor_urb(urb); 526 usb_unanchor_urb(urb);
353 } 527 }
354} 528}
@@ -381,8 +555,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
381 pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress); 555 pipe = usb_rcvintpipe(data->udev, data->intr_ep->bEndpointAddress);
382 556
383 usb_fill_int_urb(urb, data->udev, pipe, buf, size, 557 usb_fill_int_urb(urb, data->udev, pipe, buf, size,
384 btusb_intr_complete, hdev, 558 btusb_intr_complete, hdev, data->intr_ep->bInterval);
385 data->intr_ep->bInterval);
386 559
387 urb->transfer_flags |= URB_FREE_BUFFER; 560 urb->transfer_flags |= URB_FREE_BUFFER;
388 561
@@ -392,7 +565,7 @@ static int btusb_submit_intr_urb(struct hci_dev *hdev, gfp_t mem_flags)
392 if (err < 0) { 565 if (err < 0) {
393 if (err != -EPERM && err != -ENODEV) 566 if (err != -EPERM && err != -ENODEV)
394 BT_ERR("%s urb %p submission failed (%d)", 567 BT_ERR("%s urb %p submission failed (%d)",
395 hdev->name, urb, -err); 568 hdev->name, urb, -err);
396 usb_unanchor_urb(urb); 569 usb_unanchor_urb(urb);
397 } 570 }
398 571
@@ -407,8 +580,8 @@ static void btusb_bulk_complete(struct urb *urb)
407 struct btusb_data *data = hci_get_drvdata(hdev); 580 struct btusb_data *data = hci_get_drvdata(hdev);
408 int err; 581 int err;
409 582
410 BT_DBG("%s urb %p status %d count %d", hdev->name, 583 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
411 urb, urb->status, urb->actual_length); 584 urb->actual_length);
412 585
413 if (!test_bit(HCI_RUNNING, &hdev->flags)) 586 if (!test_bit(HCI_RUNNING, &hdev->flags))
414 return; 587 return;
@@ -416,9 +589,8 @@ static void btusb_bulk_complete(struct urb *urb)
416 if (urb->status == 0) { 589 if (urb->status == 0) {
417 hdev->stat.byte_rx += urb->actual_length; 590 hdev->stat.byte_rx += urb->actual_length;
418 591
419 if (hci_recv_fragment(hdev, HCI_ACLDATA_PKT, 592 if (btusb_recv_bulk(data, urb->transfer_buffer,
420 urb->transfer_buffer, 593 urb->actual_length) < 0) {
421 urb->actual_length) < 0) {
422 BT_ERR("%s corrupted ACL packet", hdev->name); 594 BT_ERR("%s corrupted ACL packet", hdev->name);
423 hdev->stat.err_rx++; 595 hdev->stat.err_rx++;
424 } 596 }
@@ -439,7 +611,7 @@ static void btusb_bulk_complete(struct urb *urb)
439 * -ENODEV: device got disconnected */ 611 * -ENODEV: device got disconnected */
440 if (err != -EPERM && err != -ENODEV) 612 if (err != -EPERM && err != -ENODEV)
441 BT_ERR("%s urb %p failed to resubmit (%d)", 613 BT_ERR("%s urb %p failed to resubmit (%d)",
442 hdev->name, urb, -err); 614 hdev->name, urb, -err);
443 usb_unanchor_urb(urb); 615 usb_unanchor_urb(urb);
444 } 616 }
445} 617}
@@ -469,8 +641,8 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
469 641
470 pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress); 642 pipe = usb_rcvbulkpipe(data->udev, data->bulk_rx_ep->bEndpointAddress);
471 643
472 usb_fill_bulk_urb(urb, data->udev, pipe, 644 usb_fill_bulk_urb(urb, data->udev, pipe, buf, size,
473 buf, size, btusb_bulk_complete, hdev); 645 btusb_bulk_complete, hdev);
474 646
475 urb->transfer_flags |= URB_FREE_BUFFER; 647 urb->transfer_flags |= URB_FREE_BUFFER;
476 648
@@ -481,7 +653,7 @@ static int btusb_submit_bulk_urb(struct hci_dev *hdev, gfp_t mem_flags)
481 if (err < 0) { 653 if (err < 0) {
482 if (err != -EPERM && err != -ENODEV) 654 if (err != -EPERM && err != -ENODEV)
483 BT_ERR("%s urb %p submission failed (%d)", 655 BT_ERR("%s urb %p submission failed (%d)",
484 hdev->name, urb, -err); 656 hdev->name, urb, -err);
485 usb_unanchor_urb(urb); 657 usb_unanchor_urb(urb);
486 } 658 }
487 659
@@ -496,8 +668,8 @@ static void btusb_isoc_complete(struct urb *urb)
496 struct btusb_data *data = hci_get_drvdata(hdev); 668 struct btusb_data *data = hci_get_drvdata(hdev);
497 int i, err; 669 int i, err;
498 670
499 BT_DBG("%s urb %p status %d count %d", hdev->name, 671 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
500 urb, urb->status, urb->actual_length); 672 urb->actual_length);
501 673
502 if (!test_bit(HCI_RUNNING, &hdev->flags)) 674 if (!test_bit(HCI_RUNNING, &hdev->flags))
503 return; 675 return;
@@ -512,9 +684,8 @@ static void btusb_isoc_complete(struct urb *urb)
512 684
513 hdev->stat.byte_rx += length; 685 hdev->stat.byte_rx += length;
514 686
515 if (hci_recv_fragment(hdev, HCI_SCODATA_PKT, 687 if (btusb_recv_isoc(data, urb->transfer_buffer + offset,
516 urb->transfer_buffer + offset, 688 length) < 0) {
517 length) < 0) {
518 BT_ERR("%s corrupted SCO packet", hdev->name); 689 BT_ERR("%s corrupted SCO packet", hdev->name);
519 hdev->stat.err_rx++; 690 hdev->stat.err_rx++;
520 } 691 }
@@ -535,7 +706,7 @@ static void btusb_isoc_complete(struct urb *urb)
535 * -ENODEV: device got disconnected */ 706 * -ENODEV: device got disconnected */
536 if (err != -EPERM && err != -ENODEV) 707 if (err != -EPERM && err != -ENODEV)
537 BT_ERR("%s urb %p failed to resubmit (%d)", 708 BT_ERR("%s urb %p failed to resubmit (%d)",
538 hdev->name, urb, -err); 709 hdev->name, urb, -err);
539 usb_unanchor_urb(urb); 710 usb_unanchor_urb(urb);
540 } 711 }
541} 712}
@@ -590,12 +761,12 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
590 pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress); 761 pipe = usb_rcvisocpipe(data->udev, data->isoc_rx_ep->bEndpointAddress);
591 762
592 usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete, 763 usb_fill_int_urb(urb, data->udev, pipe, buf, size, btusb_isoc_complete,
593 hdev, data->isoc_rx_ep->bInterval); 764 hdev, data->isoc_rx_ep->bInterval);
594 765
595 urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP; 766 urb->transfer_flags = URB_FREE_BUFFER | URB_ISO_ASAP;
596 767
597 __fill_isoc_descriptor(urb, size, 768 __fill_isoc_descriptor(urb, size,
598 le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize)); 769 le16_to_cpu(data->isoc_rx_ep->wMaxPacketSize));
599 770
600 usb_anchor_urb(urb, &data->isoc_anchor); 771 usb_anchor_urb(urb, &data->isoc_anchor);
601 772
@@ -603,7 +774,7 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
603 if (err < 0) { 774 if (err < 0) {
604 if (err != -EPERM && err != -ENODEV) 775 if (err != -EPERM && err != -ENODEV)
605 BT_ERR("%s urb %p submission failed (%d)", 776 BT_ERR("%s urb %p submission failed (%d)",
606 hdev->name, urb, -err); 777 hdev->name, urb, -err);
607 usb_unanchor_urb(urb); 778 usb_unanchor_urb(urb);
608 } 779 }
609 780
@@ -615,11 +786,11 @@ static int btusb_submit_isoc_urb(struct hci_dev *hdev, gfp_t mem_flags)
615static void btusb_tx_complete(struct urb *urb) 786static void btusb_tx_complete(struct urb *urb)
616{ 787{
617 struct sk_buff *skb = urb->context; 788 struct sk_buff *skb = urb->context;
618 struct hci_dev *hdev = (struct hci_dev *) skb->dev; 789 struct hci_dev *hdev = (struct hci_dev *)skb->dev;
619 struct btusb_data *data = hci_get_drvdata(hdev); 790 struct btusb_data *data = hci_get_drvdata(hdev);
620 791
621 BT_DBG("%s urb %p status %d count %d", hdev->name, 792 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
622 urb, urb->status, urb->actual_length); 793 urb->actual_length);
623 794
624 if (!test_bit(HCI_RUNNING, &hdev->flags)) 795 if (!test_bit(HCI_RUNNING, &hdev->flags))
625 goto done; 796 goto done;
@@ -642,10 +813,10 @@ done:
642static void btusb_isoc_tx_complete(struct urb *urb) 813static void btusb_isoc_tx_complete(struct urb *urb)
643{ 814{
644 struct sk_buff *skb = urb->context; 815 struct sk_buff *skb = urb->context;
645 struct hci_dev *hdev = (struct hci_dev *) skb->dev; 816 struct hci_dev *hdev = (struct hci_dev *)skb->dev;
646 817
647 BT_DBG("%s urb %p status %d count %d", hdev->name, 818 BT_DBG("%s urb %p status %d count %d", hdev->name, urb, urb->status,
648 urb, urb->status, urb->actual_length); 819 urb->actual_length);
649 820
650 if (!test_bit(HCI_RUNNING, &hdev->flags)) 821 if (!test_bit(HCI_RUNNING, &hdev->flags))
651 goto done; 822 goto done;
@@ -729,6 +900,8 @@ static int btusb_close(struct hci_dev *hdev)
729 clear_bit(BTUSB_INTR_RUNNING, &data->flags); 900 clear_bit(BTUSB_INTR_RUNNING, &data->flags);
730 901
731 btusb_stop_traffic(data); 902 btusb_stop_traffic(data);
903 btusb_free_frags(data);
904
732 err = usb_autopm_get_interface(data->intf); 905 err = usb_autopm_get_interface(data->intf);
733 if (err < 0) 906 if (err < 0)
734 goto failed; 907 goto failed;
@@ -748,122 +921,181 @@ static int btusb_flush(struct hci_dev *hdev)
748 BT_DBG("%s", hdev->name); 921 BT_DBG("%s", hdev->name);
749 922
750 usb_kill_anchored_urbs(&data->tx_anchor); 923 usb_kill_anchored_urbs(&data->tx_anchor);
924 btusb_free_frags(data);
751 925
752 return 0; 926 return 0;
753} 927}
754 928
755static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb) 929static struct urb *alloc_ctrl_urb(struct hci_dev *hdev, struct sk_buff *skb)
756{ 930{
757 struct btusb_data *data = hci_get_drvdata(hdev); 931 struct btusb_data *data = hci_get_drvdata(hdev);
758 struct usb_ctrlrequest *dr; 932 struct usb_ctrlrequest *dr;
759 struct urb *urb; 933 struct urb *urb;
760 unsigned int pipe; 934 unsigned int pipe;
761 int err;
762 935
763 BT_DBG("%s", hdev->name); 936 urb = usb_alloc_urb(0, GFP_KERNEL);
937 if (!urb)
938 return ERR_PTR(-ENOMEM);
764 939
765 if (!test_bit(HCI_RUNNING, &hdev->flags)) 940 dr = kmalloc(sizeof(*dr), GFP_KERNEL);
766 return -EBUSY; 941 if (!dr) {
942 usb_free_urb(urb);
943 return ERR_PTR(-ENOMEM);
944 }
767 945
768 skb->dev = (void *) hdev; 946 dr->bRequestType = data->cmdreq_type;
947 dr->bRequest = 0;
948 dr->wIndex = 0;
949 dr->wValue = 0;
950 dr->wLength = __cpu_to_le16(skb->len);
769 951
770 switch (bt_cb(skb)->pkt_type) { 952 pipe = usb_sndctrlpipe(data->udev, 0x00);
771 case HCI_COMMAND_PKT:
772 urb = usb_alloc_urb(0, GFP_ATOMIC);
773 if (!urb)
774 return -ENOMEM;
775
776 dr = kmalloc(sizeof(*dr), GFP_ATOMIC);
777 if (!dr) {
778 usb_free_urb(urb);
779 return -ENOMEM;
780 }
781 953
782 dr->bRequestType = data->cmdreq_type; 954 usb_fill_control_urb(urb, data->udev, pipe, (void *)dr,
783 dr->bRequest = 0; 955 skb->data, skb->len, btusb_tx_complete, skb);
784 dr->wIndex = 0;
785 dr->wValue = 0;
786 dr->wLength = __cpu_to_le16(skb->len);
787 956
788 pipe = usb_sndctrlpipe(data->udev, 0x00); 957 skb->dev = (void *)hdev;
789 958
790 usb_fill_control_urb(urb, data->udev, pipe, (void *) dr, 959 return urb;
791 skb->data, skb->len, btusb_tx_complete, skb); 960}
792 961
793 hdev->stat.cmd_tx++; 962static struct urb *alloc_bulk_urb(struct hci_dev *hdev, struct sk_buff *skb)
794 break; 963{
964 struct btusb_data *data = hci_get_drvdata(hdev);
965 struct urb *urb;
966 unsigned int pipe;
795 967
796 case HCI_ACLDATA_PKT: 968 if (!data->bulk_tx_ep)
797 if (!data->bulk_tx_ep) 969 return ERR_PTR(-ENODEV);
798 return -ENODEV;
799 970
800 urb = usb_alloc_urb(0, GFP_ATOMIC); 971 urb = usb_alloc_urb(0, GFP_KERNEL);
801 if (!urb) 972 if (!urb)
802 return -ENOMEM; 973 return ERR_PTR(-ENOMEM);
803 974
804 pipe = usb_sndbulkpipe(data->udev, 975 pipe = usb_sndbulkpipe(data->udev, data->bulk_tx_ep->bEndpointAddress);
805 data->bulk_tx_ep->bEndpointAddress);
806 976
807 usb_fill_bulk_urb(urb, data->udev, pipe, 977 usb_fill_bulk_urb(urb, data->udev, pipe,
808 skb->data, skb->len, btusb_tx_complete, skb); 978 skb->data, skb->len, btusb_tx_complete, skb);
809 979
810 hdev->stat.acl_tx++; 980 skb->dev = (void *)hdev;
811 break;
812 981
813 case HCI_SCODATA_PKT: 982 return urb;
814 if (!data->isoc_tx_ep || hci_conn_num(hdev, SCO_LINK) < 1) 983}
815 return -ENODEV;
816 984
817 urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_ATOMIC); 985static struct urb *alloc_isoc_urb(struct hci_dev *hdev, struct sk_buff *skb)
818 if (!urb) 986{
819 return -ENOMEM; 987 struct btusb_data *data = hci_get_drvdata(hdev);
988 struct urb *urb;
989 unsigned int pipe;
820 990
821 pipe = usb_sndisocpipe(data->udev, 991 if (!data->isoc_tx_ep)
822 data->isoc_tx_ep->bEndpointAddress); 992 return ERR_PTR(-ENODEV);
823 993
824 usb_fill_int_urb(urb, data->udev, pipe, 994 urb = usb_alloc_urb(BTUSB_MAX_ISOC_FRAMES, GFP_KERNEL);
825 skb->data, skb->len, btusb_isoc_tx_complete, 995 if (!urb)
826 skb, data->isoc_tx_ep->bInterval); 996 return ERR_PTR(-ENOMEM);
827 997
828 urb->transfer_flags = URB_ISO_ASAP; 998 pipe = usb_sndisocpipe(data->udev, data->isoc_tx_ep->bEndpointAddress);
829 999
830 __fill_isoc_descriptor(urb, skb->len, 1000 usb_fill_int_urb(urb, data->udev, pipe,
831 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize)); 1001 skb->data, skb->len, btusb_isoc_tx_complete,
1002 skb, data->isoc_tx_ep->bInterval);
832 1003
833 hdev->stat.sco_tx++; 1004 urb->transfer_flags = URB_ISO_ASAP;
834 goto skip_waking;
835 1005
836 default: 1006 __fill_isoc_descriptor(urb, skb->len,
837 return -EILSEQ; 1007 le16_to_cpu(data->isoc_tx_ep->wMaxPacketSize));
838 }
839 1008
840 err = inc_tx(data); 1009 skb->dev = (void *)hdev;
841 if (err) { 1010
842 usb_anchor_urb(urb, &data->deferred); 1011 return urb;
843 schedule_work(&data->waker); 1012}
844 err = 0; 1013
845 goto done; 1014static int submit_tx_urb(struct hci_dev *hdev, struct urb *urb)
846 } 1015{
1016 struct btusb_data *data = hci_get_drvdata(hdev);
1017 int err;
847 1018
848skip_waking:
849 usb_anchor_urb(urb, &data->tx_anchor); 1019 usb_anchor_urb(urb, &data->tx_anchor);
850 1020
851 err = usb_submit_urb(urb, GFP_ATOMIC); 1021 err = usb_submit_urb(urb, GFP_KERNEL);
852 if (err < 0) { 1022 if (err < 0) {
853 if (err != -EPERM && err != -ENODEV) 1023 if (err != -EPERM && err != -ENODEV)
854 BT_ERR("%s urb %p submission failed (%d)", 1024 BT_ERR("%s urb %p submission failed (%d)",
855 hdev->name, urb, -err); 1025 hdev->name, urb, -err);
856 kfree(urb->setup_packet); 1026 kfree(urb->setup_packet);
857 usb_unanchor_urb(urb); 1027 usb_unanchor_urb(urb);
858 } else { 1028 } else {
859 usb_mark_last_busy(data->udev); 1029 usb_mark_last_busy(data->udev);
860 } 1030 }
861 1031
862done:
863 usb_free_urb(urb); 1032 usb_free_urb(urb);
864 return err; 1033 return err;
865} 1034}
866 1035
1036static int submit_or_queue_tx_urb(struct hci_dev *hdev, struct urb *urb)
1037{
1038 struct btusb_data *data = hci_get_drvdata(hdev);
1039 unsigned long flags;
1040 bool suspending;
1041
1042 spin_lock_irqsave(&data->txlock, flags);
1043 suspending = test_bit(BTUSB_SUSPENDING, &data->flags);
1044 if (!suspending)
1045 data->tx_in_flight++;
1046 spin_unlock_irqrestore(&data->txlock, flags);
1047
1048 if (!suspending)
1049 return submit_tx_urb(hdev, urb);
1050
1051 usb_anchor_urb(urb, &data->deferred);
1052 schedule_work(&data->waker);
1053
1054 usb_free_urb(urb);
1055 return 0;
1056}
1057
1058static int btusb_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
1059{
1060 struct urb *urb;
1061
1062 BT_DBG("%s", hdev->name);
1063
1064 if (!test_bit(HCI_RUNNING, &hdev->flags))
1065 return -EBUSY;
1066
1067 switch (bt_cb(skb)->pkt_type) {
1068 case HCI_COMMAND_PKT:
1069 urb = alloc_ctrl_urb(hdev, skb);
1070 if (IS_ERR(urb))
1071 return PTR_ERR(urb);
1072
1073 hdev->stat.cmd_tx++;
1074 return submit_or_queue_tx_urb(hdev, urb);
1075
1076 case HCI_ACLDATA_PKT:
1077 urb = alloc_bulk_urb(hdev, skb);
1078 if (IS_ERR(urb))
1079 return PTR_ERR(urb);
1080
1081 hdev->stat.acl_tx++;
1082 return submit_or_queue_tx_urb(hdev, urb);
1083
1084 case HCI_SCODATA_PKT:
1085 if (hci_conn_num(hdev, SCO_LINK) < 1)
1086 return -ENODEV;
1087
1088 urb = alloc_isoc_urb(hdev, skb);
1089 if (IS_ERR(urb))
1090 return PTR_ERR(urb);
1091
1092 hdev->stat.sco_tx++;
1093 return submit_tx_urb(hdev, urb);
1094 }
1095
1096 return -EILSEQ;
1097}
1098
867static void btusb_notify(struct hci_dev *hdev, unsigned int evt) 1099static void btusb_notify(struct hci_dev *hdev, unsigned int evt)
868{ 1100{
869 struct btusb_data *data = hci_get_drvdata(hdev); 1101 struct btusb_data *data = hci_get_drvdata(hdev);
@@ -940,6 +1172,7 @@ static void btusb_work(struct work_struct *work)
940 1172
941 if (hdev->voice_setting & 0x0020) { 1173 if (hdev->voice_setting & 0x0020) {
942 static const int alts[3] = { 2, 4, 5 }; 1174 static const int alts[3] = { 2, 4, 5 };
1175
943 new_alts = alts[data->sco_num - 1]; 1176 new_alts = alts[data->sco_num - 1];
944 } else { 1177 } else {
945 new_alts = data->sco_num; 1178 new_alts = data->sco_num;
@@ -1012,7 +1245,7 @@ static int btusb_setup_csr(struct hci_dev *hdev)
1012 return -PTR_ERR(skb); 1245 return -PTR_ERR(skb);
1013 } 1246 }
1014 1247
1015 rp = (struct hci_rp_read_local_version *) skb->data; 1248 rp = (struct hci_rp_read_local_version *)skb->data;
1016 1249
1017 if (!rp->status) { 1250 if (!rp->status) {
1018 if (le16_to_cpu(rp->manufacturer) != 10) { 1251 if (le16_to_cpu(rp->manufacturer) != 10) {
@@ -1050,7 +1283,7 @@ struct intel_version {
1050} __packed; 1283} __packed;
1051 1284
1052static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev, 1285static const struct firmware *btusb_setup_intel_get_fw(struct hci_dev *hdev,
1053 struct intel_version *ver) 1286 struct intel_version *ver)
1054{ 1287{
1055 const struct firmware *fw; 1288 const struct firmware *fw;
1056 char fwname[64]; 1289 char fwname[64];
@@ -1226,7 +1459,7 @@ static int btusb_check_bdaddr_intel(struct hci_dev *hdev)
1226 return -EIO; 1459 return -EIO;
1227 } 1460 }
1228 1461
1229 rp = (struct hci_rp_read_bd_addr *) skb->data; 1462 rp = (struct hci_rp_read_bd_addr *)skb->data;
1230 if (rp->status) { 1463 if (rp->status) {
1231 BT_ERR("%s Intel device address result failed (%02x)", 1464 BT_ERR("%s Intel device address result failed (%02x)",
1232 hdev->name, rp->status); 1465 hdev->name, rp->status);
@@ -1356,6 +1589,7 @@ static int btusb_setup_intel(struct hci_dev *hdev)
1356 1589
1357 if (skb->data[0]) { 1590 if (skb->data[0]) {
1358 u8 evt_status = skb->data[0]; 1591 u8 evt_status = skb->data[0];
1592
1359 BT_ERR("%s enable Intel manufacturer mode event failed (%02x)", 1593 BT_ERR("%s enable Intel manufacturer mode event failed (%02x)",
1360 hdev->name, evt_status); 1594 hdev->name, evt_status);
1361 kfree_skb(skb); 1595 kfree_skb(skb);
@@ -1465,7 +1699,7 @@ static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr)
1465 if (IS_ERR(skb)) { 1699 if (IS_ERR(skb)) {
1466 ret = PTR_ERR(skb); 1700 ret = PTR_ERR(skb);
1467 BT_ERR("%s: changing Intel device address failed (%ld)", 1701 BT_ERR("%s: changing Intel device address failed (%ld)",
1468 hdev->name, ret); 1702 hdev->name, ret);
1469 return ret; 1703 return ret;
1470 } 1704 }
1471 kfree_skb(skb); 1705 kfree_skb(skb);
@@ -1540,19 +1774,19 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
1540 if (IS_ERR(skb)) { 1774 if (IS_ERR(skb)) {
1541 ret = PTR_ERR(skb); 1775 ret = PTR_ERR(skb);
1542 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)", 1776 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)",
1543 hdev->name, ret); 1777 hdev->name, ret);
1544 goto done; 1778 goto done;
1545 } 1779 }
1546 1780
1547 if (skb->len != sizeof(*ver)) { 1781 if (skb->len != sizeof(*ver)) {
1548 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch", 1782 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch",
1549 hdev->name); 1783 hdev->name);
1550 kfree_skb(skb); 1784 kfree_skb(skb);
1551 ret = -EIO; 1785 ret = -EIO;
1552 goto done; 1786 goto done;
1553 } 1787 }
1554 1788
1555 ver = (struct hci_rp_read_local_version *) skb->data; 1789 ver = (struct hci_rp_read_local_version *)skb->data;
1556 BT_INFO("%s: BCM: patching hci_ver=%02x hci_rev=%04x lmp_ver=%02x " 1790 BT_INFO("%s: BCM: patching hci_ver=%02x hci_rev=%04x lmp_ver=%02x "
1557 "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev, 1791 "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev,
1558 ver->lmp_ver, ver->lmp_subver); 1792 ver->lmp_ver, ver->lmp_subver);
@@ -1563,7 +1797,7 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
1563 if (IS_ERR(skb)) { 1797 if (IS_ERR(skb)) {
1564 ret = PTR_ERR(skb); 1798 ret = PTR_ERR(skb);
1565 BT_ERR("%s: BCM: Download Minidrv command failed (%ld)", 1799 BT_ERR("%s: BCM: Download Minidrv command failed (%ld)",
1566 hdev->name, ret); 1800 hdev->name, ret);
1567 goto reset_fw; 1801 goto reset_fw;
1568 } 1802 }
1569 kfree_skb(skb); 1803 kfree_skb(skb);
@@ -1575,13 +1809,13 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
1575 fw_size = fw->size; 1809 fw_size = fw->size;
1576 1810
1577 while (fw_size >= sizeof(*cmd)) { 1811 while (fw_size >= sizeof(*cmd)) {
1578 cmd = (struct hci_command_hdr *) fw_ptr; 1812 cmd = (struct hci_command_hdr *)fw_ptr;
1579 fw_ptr += sizeof(*cmd); 1813 fw_ptr += sizeof(*cmd);
1580 fw_size -= sizeof(*cmd); 1814 fw_size -= sizeof(*cmd);
1581 1815
1582 if (fw_size < cmd->plen) { 1816 if (fw_size < cmd->plen) {
1583 BT_ERR("%s: BCM: patch %s is corrupted", 1817 BT_ERR("%s: BCM: patch %s is corrupted",
1584 hdev->name, fw_name); 1818 hdev->name, fw_name);
1585 ret = -EINVAL; 1819 ret = -EINVAL;
1586 goto reset_fw; 1820 goto reset_fw;
1587 } 1821 }
@@ -1597,7 +1831,7 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
1597 if (IS_ERR(skb)) { 1831 if (IS_ERR(skb)) {
1598 ret = PTR_ERR(skb); 1832 ret = PTR_ERR(skb);
1599 BT_ERR("%s: BCM: patch command %04x failed (%ld)", 1833 BT_ERR("%s: BCM: patch command %04x failed (%ld)",
1600 hdev->name, opcode, ret); 1834 hdev->name, opcode, ret);
1601 goto reset_fw; 1835 goto reset_fw;
1602 } 1836 }
1603 kfree_skb(skb); 1837 kfree_skb(skb);
@@ -1622,19 +1856,19 @@ reset_fw:
1622 if (IS_ERR(skb)) { 1856 if (IS_ERR(skb)) {
1623 ret = PTR_ERR(skb); 1857 ret = PTR_ERR(skb);
1624 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)", 1858 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION failed (%ld)",
1625 hdev->name, ret); 1859 hdev->name, ret);
1626 goto done; 1860 goto done;
1627 } 1861 }
1628 1862
1629 if (skb->len != sizeof(*ver)) { 1863 if (skb->len != sizeof(*ver)) {
1630 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch", 1864 BT_ERR("%s: HCI_OP_READ_LOCAL_VERSION event length mismatch",
1631 hdev->name); 1865 hdev->name);
1632 kfree_skb(skb); 1866 kfree_skb(skb);
1633 ret = -EIO; 1867 ret = -EIO;
1634 goto done; 1868 goto done;
1635 } 1869 }
1636 1870
1637 ver = (struct hci_rp_read_local_version *) skb->data; 1871 ver = (struct hci_rp_read_local_version *)skb->data;
1638 BT_INFO("%s: BCM: firmware hci_ver=%02x hci_rev=%04x lmp_ver=%02x " 1872 BT_INFO("%s: BCM: firmware hci_ver=%02x hci_rev=%04x lmp_ver=%02x "
1639 "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev, 1873 "lmp_subver=%04x", hdev->name, ver->hci_ver, ver->hci_rev,
1640 ver->lmp_ver, ver->lmp_subver); 1874 ver->lmp_ver, ver->lmp_subver);
@@ -1646,19 +1880,19 @@ reset_fw:
1646 if (IS_ERR(skb)) { 1880 if (IS_ERR(skb)) {
1647 ret = PTR_ERR(skb); 1881 ret = PTR_ERR(skb);
1648 BT_ERR("%s: HCI_OP_READ_BD_ADDR failed (%ld)", 1882 BT_ERR("%s: HCI_OP_READ_BD_ADDR failed (%ld)",
1649 hdev->name, ret); 1883 hdev->name, ret);
1650 goto done; 1884 goto done;
1651 } 1885 }
1652 1886
1653 if (skb->len != sizeof(*bda)) { 1887 if (skb->len != sizeof(*bda)) {
1654 BT_ERR("%s: HCI_OP_READ_BD_ADDR event length mismatch", 1888 BT_ERR("%s: HCI_OP_READ_BD_ADDR event length mismatch",
1655 hdev->name); 1889 hdev->name);
1656 kfree_skb(skb); 1890 kfree_skb(skb);
1657 ret = -EIO; 1891 ret = -EIO;
1658 goto done; 1892 goto done;
1659 } 1893 }
1660 1894
1661 bda = (struct hci_rp_read_bd_addr *) skb->data; 1895 bda = (struct hci_rp_read_bd_addr *)skb->data;
1662 if (bda->status) { 1896 if (bda->status) {
1663 BT_ERR("%s: HCI_OP_READ_BD_ADDR error status (%02x)", 1897 BT_ERR("%s: HCI_OP_READ_BD_ADDR error status (%02x)",
1664 hdev->name, bda->status); 1898 hdev->name, bda->status);
@@ -1693,7 +1927,7 @@ static int btusb_set_bdaddr_bcm(struct hci_dev *hdev, const bdaddr_t *bdaddr)
1693 if (IS_ERR(skb)) { 1927 if (IS_ERR(skb)) {
1694 ret = PTR_ERR(skb); 1928 ret = PTR_ERR(skb);
1695 BT_ERR("%s: BCM: Change address command failed (%ld)", 1929 BT_ERR("%s: BCM: Change address command failed (%ld)",
1696 hdev->name, ret); 1930 hdev->name, ret);
1697 return ret; 1931 return ret;
1698 } 1932 }
1699 kfree_skb(skb); 1933 kfree_skb(skb);
@@ -1702,7 +1936,7 @@ static int btusb_set_bdaddr_bcm(struct hci_dev *hdev, const bdaddr_t *bdaddr)
1702} 1936}
1703 1937
1704static int btusb_probe(struct usb_interface *intf, 1938static int btusb_probe(struct usb_interface *intf,
1705 const struct usb_device_id *id) 1939 const struct usb_device_id *id)
1706{ 1940{
1707 struct usb_endpoint_descriptor *ep_desc; 1941 struct usb_endpoint_descriptor *ep_desc;
1708 struct btusb_data *data; 1942 struct btusb_data *data;
@@ -1717,6 +1951,7 @@ static int btusb_probe(struct usb_interface *intf,
1717 1951
1718 if (!id->driver_info) { 1952 if (!id->driver_info) {
1719 const struct usb_device_id *match; 1953 const struct usb_device_id *match;
1954
1720 match = usb_match_id(intf, blacklist_table); 1955 match = usb_match_id(intf, blacklist_table);
1721 if (match) 1956 if (match)
1722 id = match; 1957 id = match;
@@ -1765,17 +2000,16 @@ static int btusb_probe(struct usb_interface *intf,
1765 data->udev = interface_to_usbdev(intf); 2000 data->udev = interface_to_usbdev(intf);
1766 data->intf = intf; 2001 data->intf = intf;
1767 2002
1768 spin_lock_init(&data->lock);
1769
1770 INIT_WORK(&data->work, btusb_work); 2003 INIT_WORK(&data->work, btusb_work);
1771 INIT_WORK(&data->waker, btusb_waker); 2004 INIT_WORK(&data->waker, btusb_waker);
2005 init_usb_anchor(&data->deferred);
2006 init_usb_anchor(&data->tx_anchor);
1772 spin_lock_init(&data->txlock); 2007 spin_lock_init(&data->txlock);
1773 2008
1774 init_usb_anchor(&data->tx_anchor);
1775 init_usb_anchor(&data->intr_anchor); 2009 init_usb_anchor(&data->intr_anchor);
1776 init_usb_anchor(&data->bulk_anchor); 2010 init_usb_anchor(&data->bulk_anchor);
1777 init_usb_anchor(&data->isoc_anchor); 2011 init_usb_anchor(&data->isoc_anchor);
1778 init_usb_anchor(&data->deferred); 2012 spin_lock_init(&data->rxlock);
1779 2013
1780 hdev = hci_alloc_dev(); 2014 hdev = hci_alloc_dev();
1781 if (!hdev) 2015 if (!hdev)
@@ -1867,7 +2101,7 @@ static int btusb_probe(struct usb_interface *intf,
1867 2101
1868 if (data->isoc) { 2102 if (data->isoc) {
1869 err = usb_driver_claim_interface(&btusb_driver, 2103 err = usb_driver_claim_interface(&btusb_driver,
1870 data->isoc, data); 2104 data->isoc, data);
1871 if (err < 0) { 2105 if (err < 0) {
1872 hci_free_dev(hdev); 2106 hci_free_dev(hdev);
1873 return err; 2107 return err;
@@ -1908,6 +2142,7 @@ static void btusb_disconnect(struct usb_interface *intf)
1908 else if (data->isoc) 2142 else if (data->isoc)
1909 usb_driver_release_interface(&btusb_driver, data->isoc); 2143 usb_driver_release_interface(&btusb_driver, data->isoc);
1910 2144
2145 btusb_free_frags(data);
1911 hci_free_dev(hdev); 2146 hci_free_dev(hdev);
1912} 2147}
1913 2148
diff --git a/drivers/net/ieee802154/mrf24j40.c b/drivers/net/ieee802154/mrf24j40.c
index 9e6a124b13f2..07e0b887c350 100644
--- a/drivers/net/ieee802154/mrf24j40.c
+++ b/drivers/net/ieee802154/mrf24j40.c
@@ -323,8 +323,8 @@ static int mrf24j40_read_rx_buf(struct mrf24j40 *devrec,
323#ifdef DEBUG 323#ifdef DEBUG
324 print_hex_dump(KERN_DEBUG, "mrf24j40 rx: ", 324 print_hex_dump(KERN_DEBUG, "mrf24j40 rx: ",
325 DUMP_PREFIX_OFFSET, 16, 1, data, *len, 0); 325 DUMP_PREFIX_OFFSET, 16, 1, data, *len, 0);
326 printk(KERN_DEBUG "mrf24j40 rx: lqi: %02hhx rssi: %02hhx\n", 326 pr_debug("mrf24j40 rx: lqi: %02hhx rssi: %02hhx\n",
327 lqi_rssi[0], lqi_rssi[1]); 327 lqi_rssi[0], lqi_rssi[1]);
328#endif 328#endif
329 329
330out: 330out:
@@ -385,7 +385,7 @@ err:
385static int mrf24j40_ed(struct ieee802154_dev *dev, u8 *level) 385static int mrf24j40_ed(struct ieee802154_dev *dev, u8 *level)
386{ 386{
387 /* TODO: */ 387 /* TODO: */
388 printk(KERN_WARNING "mrf24j40: ed not implemented\n"); 388 pr_warn("mrf24j40: ed not implemented\n");
389 *level = 0; 389 *level = 0;
390 return 0; 390 return 0;
391} 391}
@@ -412,6 +412,7 @@ static void mrf24j40_stop(struct ieee802154_dev *dev)
412 struct mrf24j40 *devrec = dev->priv; 412 struct mrf24j40 *devrec = dev->priv;
413 u8 val; 413 u8 val;
414 int ret; 414 int ret;
415
415 dev_dbg(printdev(devrec), "stop\n"); 416 dev_dbg(printdev(devrec), "stop\n");
416 417
417 ret = read_short_reg(devrec, REG_INTCON, &val); 418 ret = read_short_reg(devrec, REG_INTCON, &val);
@@ -419,8 +420,6 @@ static void mrf24j40_stop(struct ieee802154_dev *dev)
419 return; 420 return;
420 val |= 0x1|0x8; /* Set TXNIE and RXIE. Disable Interrupts */ 421 val |= 0x1|0x8; /* Set TXNIE and RXIE. Disable Interrupts */
421 write_short_reg(devrec, REG_INTCON, val); 422 write_short_reg(devrec, REG_INTCON, val);
422
423 return;
424} 423}
425 424
426static int mrf24j40_set_channel(struct ieee802154_dev *dev, 425static int mrf24j40_set_channel(struct ieee802154_dev *dev,
@@ -465,6 +464,7 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,
465 if (changed & IEEE802515_AFILT_SADDR_CHANGED) { 464 if (changed & IEEE802515_AFILT_SADDR_CHANGED) {
466 /* Short Addr */ 465 /* Short Addr */
467 u8 addrh, addrl; 466 u8 addrh, addrl;
467
468 addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff; 468 addrh = le16_to_cpu(filt->short_addr) >> 8 & 0xff;
469 addrl = le16_to_cpu(filt->short_addr) & 0xff; 469 addrl = le16_to_cpu(filt->short_addr) & 0xff;
470 470
@@ -483,16 +483,17 @@ static int mrf24j40_filter(struct ieee802154_dev *dev,
483 write_short_reg(devrec, REG_EADR0 + i, addr[i]); 483 write_short_reg(devrec, REG_EADR0 + i, addr[i]);
484 484
485#ifdef DEBUG 485#ifdef DEBUG
486 printk(KERN_DEBUG "Set long addr to: "); 486 pr_debug("Set long addr to: ");
487 for (i = 0; i < 8; i++) 487 for (i = 0; i < 8; i++)
488 printk("%02hhx ", addr[7 - i]); 488 pr_debug("%02hhx ", addr[7 - i]);
489 printk(KERN_DEBUG "\n"); 489 pr_debug("\n");
490#endif 490#endif
491 } 491 }
492 492
493 if (changed & IEEE802515_AFILT_PANID_CHANGED) { 493 if (changed & IEEE802515_AFILT_PANID_CHANGED) {
494 /* PAN ID */ 494 /* PAN ID */
495 u8 panidl, panidh; 495 u8 panidl, panidh;
496
496 panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff; 497 panidh = le16_to_cpu(filt->pan_id) >> 8 & 0xff;
497 panidl = le16_to_cpu(filt->pan_id) & 0xff; 498 panidl = le16_to_cpu(filt->pan_id) & 0xff;
498 write_short_reg(devrec, REG_PANIDH, panidh); 499 write_short_reg(devrec, REG_PANIDH, panidh);
@@ -701,7 +702,7 @@ static int mrf24j40_probe(struct spi_device *spi)
701 int ret = -ENOMEM; 702 int ret = -ENOMEM;
702 struct mrf24j40 *devrec; 703 struct mrf24j40 *devrec;
703 704
704 printk(KERN_INFO "mrf24j40: probe(). IRQ: %d\n", spi->irq); 705 dev_info(&spi->dev, "probe(). IRQ: %d\n", spi->irq);
705 706
706 devrec = devm_kzalloc(&spi->dev, sizeof(struct mrf24j40), GFP_KERNEL); 707 devrec = devm_kzalloc(&spi->dev, sizeof(struct mrf24j40), GFP_KERNEL);
707 if (!devrec) 708 if (!devrec)
diff --git a/drivers/net/wireless/ath/Kconfig b/drivers/net/wireless/ath/Kconfig
index c63d1159db5c..ce7826009eeb 100644
--- a/drivers/net/wireless/ath/Kconfig
+++ b/drivers/net/wireless/ath/Kconfig
@@ -25,6 +25,14 @@ config ATH_DEBUG
25 Say Y, if you want to debug atheros wireless drivers. 25 Say Y, if you want to debug atheros wireless drivers.
26 Right now only ath9k makes use of this. 26 Right now only ath9k makes use of this.
27 27
28config ATH_TRACEPOINTS
29 bool "Atheros wireless tracing"
30 depends on ATH_DEBUG
31 depends on EVENT_TRACING
32 ---help---
33 This option enables tracepoints for atheros wireless drivers.
34 Currently, ath9k makes use of this facility.
35
28config ATH_REG_DYNAMIC_USER_REG_HINTS 36config ATH_REG_DYNAMIC_USER_REG_HINTS
29 bool "Atheros dynamic user regulatory hints" 37 bool "Atheros dynamic user regulatory hints"
30 depends on CFG80211_CERTIFICATION_ONUS 38 depends on CFG80211_CERTIFICATION_ONUS
diff --git a/drivers/net/wireless/ath/Makefile b/drivers/net/wireless/ath/Makefile
index 7d023b0f13b4..89f8d5979402 100644
--- a/drivers/net/wireless/ath/Makefile
+++ b/drivers/net/wireless/ath/Makefile
@@ -17,4 +17,8 @@ ath-objs := main.o \
17 dfs_pri_detector.o 17 dfs_pri_detector.o
18 18
19ath-$(CONFIG_ATH_DEBUG) += debug.o 19ath-$(CONFIG_ATH_DEBUG) += debug.o
20ath-$(CONFIG_ATH_TRACEPOINTS) += trace.o
21
20ccflags-y += -D__CHECK_ENDIAN__ 22ccflags-y += -D__CHECK_ENDIAN__
23
24CFLAGS_trace.o := -I$(src)
diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h
index a3b6e27d9121..e5ba6faf3281 100644
--- a/drivers/net/wireless/ath/ath.h
+++ b/drivers/net/wireless/ath/ath.h
@@ -268,6 +268,7 @@ enum ATH_DEBUG {
268}; 268};
269 269
270#define ATH_DBG_DEFAULT (ATH_DBG_FATAL) 270#define ATH_DBG_DEFAULT (ATH_DBG_FATAL)
271#define ATH_DBG_MAX_LEN 512
271 272
272#ifdef CONFIG_ATH_DEBUG 273#ifdef CONFIG_ATH_DEBUG
273 274
diff --git a/drivers/net/wireless/ath/ath10k/Kconfig b/drivers/net/wireless/ath/ath10k/Kconfig
index 1053bb5f2cdc..72acb822bb11 100644
--- a/drivers/net/wireless/ath/ath10k/Kconfig
+++ b/drivers/net/wireless/ath/ath10k/Kconfig
@@ -24,7 +24,7 @@ config ATH10K_DEBUG
24 24
25config ATH10K_DEBUGFS 25config ATH10K_DEBUGFS
26 bool "Atheros ath10k debugfs support" 26 bool "Atheros ath10k debugfs support"
27 depends on ATH10K 27 depends on ATH10K && DEBUG_FS
28 select RELAY 28 select RELAY
29 ---help--- 29 ---help---
30 Enabled debugfs support 30 Enabled debugfs support
diff --git a/drivers/net/wireless/ath/ath10k/Makefile b/drivers/net/wireless/ath/ath10k/Makefile
index 2cfb63ca9327..8b1b1adb477a 100644
--- a/drivers/net/wireless/ath/ath10k/Makefile
+++ b/drivers/net/wireless/ath/ath10k/Makefile
@@ -11,6 +11,7 @@ ath10k_core-y += mac.o \
11 bmi.o 11 bmi.o
12 12
13ath10k_core-$(CONFIG_ATH10K_DEBUGFS) += spectral.o 13ath10k_core-$(CONFIG_ATH10K_DEBUGFS) += spectral.o
14ath10k_core-$(CONFIG_NL80211_TESTMODE) += testmode.o
14ath10k_core-$(CONFIG_ATH10K_TRACING) += trace.o 15ath10k_core-$(CONFIG_ATH10K_TRACING) += trace.o
15 16
16obj-$(CONFIG_ATH10K_PCI) += ath10k_pci.o 17obj-$(CONFIG_ATH10K_PCI) += ath10k_pci.o
diff --git a/drivers/net/wireless/ath/ath10k/bmi.h b/drivers/net/wireless/ath/ath10k/bmi.h
index 111ab701465c..31a990635490 100644
--- a/drivers/net/wireless/ath/ath10k/bmi.h
+++ b/drivers/net/wireless/ath/ath10k/bmi.h
@@ -177,7 +177,6 @@ struct bmi_target_info {
177 u32 type; 177 u32 type;
178}; 178};
179 179
180
181/* in msec */ 180/* in msec */
182#define BMI_COMMUNICATION_TIMEOUT_HZ (1*HZ) 181#define BMI_COMMUNICATION_TIMEOUT_HZ (1*HZ)
183 182
diff --git a/drivers/net/wireless/ath/ath10k/ce.c b/drivers/net/wireless/ath/ath10k/ce.c
index 71eef233bd01..101cadb6e4ba 100644
--- a/drivers/net/wireless/ath/ath10k/ce.c
+++ b/drivers/net/wireless/ath/ath10k/ce.c
@@ -260,7 +260,6 @@ static inline void ath10k_ce_engine_int_status_clear(struct ath10k *ar,
260 ath10k_pci_write32(ar, ce_ctrl_addr + HOST_IS_ADDRESS, mask); 260 ath10k_pci_write32(ar, ce_ctrl_addr + HOST_IS_ADDRESS, mask);
261} 261}
262 262
263
264/* 263/*
265 * Guts of ath10k_ce_send, used by both ath10k_ce_send and 264 * Guts of ath10k_ce_send, used by both ath10k_ce_send and
266 * ath10k_ce_sendlist_send. 265 * ath10k_ce_sendlist_send.
@@ -385,7 +384,6 @@ int ath10k_ce_num_free_src_entries(struct ath10k_ce_pipe *pipe)
385 return delta; 384 return delta;
386} 385}
387 386
388
389int __ath10k_ce_rx_num_free_bufs(struct ath10k_ce_pipe *pipe) 387int __ath10k_ce_rx_num_free_bufs(struct ath10k_ce_pipe *pipe)
390{ 388{
391 struct ath10k *ar = pipe->ar; 389 struct ath10k *ar = pipe->ar;
diff --git a/drivers/net/wireless/ath/ath10k/ce.h b/drivers/net/wireless/ath/ath10k/ce.h
index 82d1f23546b9..329b7340fa72 100644
--- a/drivers/net/wireless/ath/ath10k/ce.h
+++ b/drivers/net/wireless/ath/ath10k/ce.h
@@ -20,7 +20,6 @@
20 20
21#include "hif.h" 21#include "hif.h"
22 22
23
24/* Maximum number of Copy Engine's supported */ 23/* Maximum number of Copy Engine's supported */
25#define CE_COUNT_MAX 8 24#define CE_COUNT_MAX 8
26#define CE_HTT_H2T_MSG_SRC_NENTRIES 4096 25#define CE_HTT_H2T_MSG_SRC_NENTRIES 4096
@@ -37,7 +36,6 @@
37 36
38struct ath10k_ce_pipe; 37struct ath10k_ce_pipe;
39 38
40
41#define CE_DESC_FLAGS_GATHER (1 << 0) 39#define CE_DESC_FLAGS_GATHER (1 << 0)
42#define CE_DESC_FLAGS_BYTE_SWAP (1 << 1) 40#define CE_DESC_FLAGS_BYTE_SWAP (1 << 1)
43#define CE_DESC_FLAGS_META_DATA_MASK 0xFFFC 41#define CE_DESC_FLAGS_META_DATA_MASK 0xFFFC
@@ -189,10 +187,10 @@ int ath10k_ce_completed_recv_next(struct ath10k_ce_pipe *ce_state,
189 * Pops 1 completed send buffer from Source ring. 187 * Pops 1 completed send buffer from Source ring.
190 */ 188 */
191int ath10k_ce_completed_send_next(struct ath10k_ce_pipe *ce_state, 189int ath10k_ce_completed_send_next(struct ath10k_ce_pipe *ce_state,
192 void **per_transfer_contextp, 190 void **per_transfer_contextp,
193 u32 *bufferp, 191 u32 *bufferp,
194 unsigned int *nbytesp, 192 unsigned int *nbytesp,
195 unsigned int *transfer_idp); 193 unsigned int *transfer_idp);
196 194
197/*==================CE Engine Initialization=======================*/ 195/*==================CE Engine Initialization=======================*/
198 196
@@ -202,7 +200,7 @@ int ath10k_ce_init_pipe(struct ath10k *ar, unsigned int ce_id,
202 void (*recv_cb)(struct ath10k_ce_pipe *)); 200 void (*recv_cb)(struct ath10k_ce_pipe *));
203void ath10k_ce_deinit_pipe(struct ath10k *ar, unsigned int ce_id); 201void ath10k_ce_deinit_pipe(struct ath10k *ar, unsigned int ce_id);
204int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id, 202int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id,
205 const struct ce_attr *attr); 203 const struct ce_attr *attr);
206void ath10k_ce_free_pipe(struct ath10k *ar, int ce_id); 204void ath10k_ce_free_pipe(struct ath10k *ar, int ce_id);
207 205
208/*==================CE Engine Shutdown=======================*/ 206/*==================CE Engine Shutdown=======================*/
@@ -383,7 +381,6 @@ struct ce_attr {
383#define DST_WATERMARK_HIGH_RESET 0 381#define DST_WATERMARK_HIGH_RESET 0
384#define DST_WATERMARK_ADDRESS 0x0050 382#define DST_WATERMARK_ADDRESS 0x0050
385 383
386
387static inline u32 ath10k_ce_base_address(unsigned int ce_id) 384static inline u32 ath10k_ce_base_address(unsigned int ce_id)
388{ 385{
389 return CE0_BASE_ADDRESS + (CE1_BASE_ADDRESS - CE0_BASE_ADDRESS) * ce_id; 386 return CE0_BASE_ADDRESS + (CE1_BASE_ADDRESS - CE0_BASE_ADDRESS) * ce_id;
diff --git a/drivers/net/wireless/ath/ath10k/core.c b/drivers/net/wireless/ath/ath10k/core.c
index 651a6da8adf5..cee18c89d7f2 100644
--- a/drivers/net/wireless/ath/ath10k/core.c
+++ b/drivers/net/wireless/ath/ath10k/core.c
@@ -26,6 +26,7 @@
26#include "bmi.h" 26#include "bmi.h"
27#include "debug.h" 27#include "debug.h"
28#include "htt.h" 28#include "htt.h"
29#include "testmode.h"
29 30
30unsigned int ath10k_debug_mask; 31unsigned int ath10k_debug_mask;
31static bool uart_print; 32static bool uart_print;
@@ -257,21 +258,42 @@ static int ath10k_download_and_run_otp(struct ath10k *ar)
257 return 0; 258 return 0;
258} 259}
259 260
260static int ath10k_download_fw(struct ath10k *ar) 261static int ath10k_download_fw(struct ath10k *ar, enum ath10k_firmware_mode mode)
261{ 262{
262 u32 address; 263 u32 address, data_len;
264 const char *mode_name;
265 const void *data;
263 int ret; 266 int ret;
264 267
265 address = ar->hw_params.patch_load_addr; 268 address = ar->hw_params.patch_load_addr;
266 269
267 ret = ath10k_bmi_fast_download(ar, address, ar->firmware_data, 270 switch (mode) {
268 ar->firmware_len); 271 case ATH10K_FIRMWARE_MODE_NORMAL:
272 data = ar->firmware_data;
273 data_len = ar->firmware_len;
274 mode_name = "normal";
275 break;
276 case ATH10K_FIRMWARE_MODE_UTF:
277 data = ar->testmode.utf->data;
278 data_len = ar->testmode.utf->size;
279 mode_name = "utf";
280 break;
281 default:
282 ath10k_err(ar, "unknown firmware mode: %d\n", mode);
283 return -EINVAL;
284 }
285
286 ath10k_dbg(ar, ATH10K_DBG_BOOT,
287 "boot uploading firmware image %p len %d mode %s\n",
288 data, data_len, mode_name);
289
290 ret = ath10k_bmi_fast_download(ar, address, data, data_len);
269 if (ret) { 291 if (ret) {
270 ath10k_err(ar, "could not write fw (%d)\n", ret); 292 ath10k_err(ar, "failed to download %s firmware: %d\n",
271 goto exit; 293 mode_name, ret);
294 return ret;
272 } 295 }
273 296
274exit:
275 return ret; 297 return ret;
276} 298}
277 299
@@ -567,7 +589,8 @@ success:
567 return 0; 589 return 0;
568} 590}
569 591
570static int ath10k_init_download_firmware(struct ath10k *ar) 592static int ath10k_init_download_firmware(struct ath10k *ar,
593 enum ath10k_firmware_mode mode)
571{ 594{
572 int ret; 595 int ret;
573 596
@@ -583,7 +606,7 @@ static int ath10k_init_download_firmware(struct ath10k *ar)
583 return ret; 606 return ret;
584 } 607 }
585 608
586 ret = ath10k_download_fw(ar); 609 ret = ath10k_download_fw(ar, mode);
587 if (ret) { 610 if (ret) {
588 ath10k_err(ar, "failed to download firmware: %d\n", ret); 611 ath10k_err(ar, "failed to download firmware: %d\n", ret);
589 return ret; 612 return ret;
@@ -685,12 +708,15 @@ static void ath10k_core_restart(struct work_struct *work)
685 case ATH10K_STATE_WEDGED: 708 case ATH10K_STATE_WEDGED:
686 ath10k_warn(ar, "device is wedged, will not restart\n"); 709 ath10k_warn(ar, "device is wedged, will not restart\n");
687 break; 710 break;
711 case ATH10K_STATE_UTF:
712 ath10k_warn(ar, "firmware restart in UTF mode not supported\n");
713 break;
688 } 714 }
689 715
690 mutex_unlock(&ar->conf_mutex); 716 mutex_unlock(&ar->conf_mutex);
691} 717}
692 718
693int ath10k_core_start(struct ath10k *ar) 719int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode)
694{ 720{
695 int status; 721 int status;
696 722
@@ -703,7 +729,7 @@ int ath10k_core_start(struct ath10k *ar)
703 goto err; 729 goto err;
704 } 730 }
705 731
706 status = ath10k_init_download_firmware(ar); 732 status = ath10k_init_download_firmware(ar, mode);
707 if (status) 733 if (status)
708 goto err; 734 goto err;
709 735
@@ -760,10 +786,12 @@ int ath10k_core_start(struct ath10k *ar)
760 goto err_hif_stop; 786 goto err_hif_stop;
761 } 787 }
762 788
763 status = ath10k_htt_connect(&ar->htt); 789 if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
764 if (status) { 790 status = ath10k_htt_connect(&ar->htt);
765 ath10k_err(ar, "failed to connect htt (%d)\n", status); 791 if (status) {
766 goto err_hif_stop; 792 ath10k_err(ar, "failed to connect htt (%d)\n", status);
793 goto err_hif_stop;
794 }
767 } 795 }
768 796
769 status = ath10k_wmi_connect(ar); 797 status = ath10k_wmi_connect(ar);
@@ -778,11 +806,13 @@ int ath10k_core_start(struct ath10k *ar)
778 goto err_hif_stop; 806 goto err_hif_stop;
779 } 807 }
780 808
781 status = ath10k_wmi_wait_for_service_ready(ar); 809 if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
782 if (status <= 0) { 810 status = ath10k_wmi_wait_for_service_ready(ar);
783 ath10k_warn(ar, "wmi service ready event not received"); 811 if (status <= 0) {
784 status = -ETIMEDOUT; 812 ath10k_warn(ar, "wmi service ready event not received");
785 goto err_hif_stop; 813 status = -ETIMEDOUT;
814 goto err_hif_stop;
815 }
786 } 816 }
787 817
788 ath10k_dbg(ar, ATH10K_DBG_BOOT, "firmware %s booted\n", 818 ath10k_dbg(ar, ATH10K_DBG_BOOT, "firmware %s booted\n",
@@ -802,10 +832,13 @@ int ath10k_core_start(struct ath10k *ar)
802 goto err_hif_stop; 832 goto err_hif_stop;
803 } 833 }
804 834
805 status = ath10k_htt_setup(&ar->htt); 835 /* we don't care about HTT in UTF mode */
806 if (status) { 836 if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
807 ath10k_err(ar, "failed to setup htt: %d\n", status); 837 status = ath10k_htt_setup(&ar->htt);
808 goto err_hif_stop; 838 if (status) {
839 ath10k_err(ar, "failed to setup htt: %d\n", status);
840 goto err_hif_stop;
841 }
809 } 842 }
810 843
811 status = ath10k_debug_start(ar); 844 status = ath10k_debug_start(ar);
@@ -861,7 +894,8 @@ void ath10k_core_stop(struct ath10k *ar)
861 lockdep_assert_held(&ar->conf_mutex); 894 lockdep_assert_held(&ar->conf_mutex);
862 895
863 /* try to suspend target */ 896 /* try to suspend target */
864 if (ar->state != ATH10K_STATE_RESTARTING) 897 if (ar->state != ATH10K_STATE_RESTARTING &&
898 ar->state != ATH10K_STATE_UTF)
865 ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND_AND_DISABLE_INTR); 899 ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND_AND_DISABLE_INTR);
866 900
867 ath10k_debug_stop(ar); 901 ath10k_debug_stop(ar);
@@ -914,7 +948,7 @@ static int ath10k_core_probe_fw(struct ath10k *ar)
914 948
915 mutex_lock(&ar->conf_mutex); 949 mutex_lock(&ar->conf_mutex);
916 950
917 ret = ath10k_core_start(ar); 951 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
918 if (ret) { 952 if (ret) {
919 ath10k_err(ar, "could not init core (%d)\n", ret); 953 ath10k_err(ar, "could not init core (%d)\n", ret);
920 ath10k_core_free_firmware_files(ar); 954 ath10k_core_free_firmware_files(ar);
@@ -977,7 +1011,7 @@ static void ath10k_core_register_work(struct work_struct *work)
977 goto err_release_fw; 1011 goto err_release_fw;
978 } 1012 }
979 1013
980 status = ath10k_debug_create(ar); 1014 status = ath10k_debug_register(ar);
981 if (status) { 1015 if (status) {
982 ath10k_err(ar, "unable to initialize debugfs\n"); 1016 ath10k_err(ar, "unable to initialize debugfs\n");
983 goto err_unregister_mac; 1017 goto err_unregister_mac;
@@ -1041,9 +1075,11 @@ void ath10k_core_unregister(struct ath10k *ar)
1041 * unhappy about callback failures. */ 1075 * unhappy about callback failures. */
1042 ath10k_mac_unregister(ar); 1076 ath10k_mac_unregister(ar);
1043 1077
1078 ath10k_testmode_destroy(ar);
1079
1044 ath10k_core_free_firmware_files(ar); 1080 ath10k_core_free_firmware_files(ar);
1045 1081
1046 ath10k_debug_destroy(ar); 1082 ath10k_debug_unregister(ar);
1047} 1083}
1048EXPORT_SYMBOL(ath10k_core_unregister); 1084EXPORT_SYMBOL(ath10k_core_unregister);
1049 1085
@@ -1051,6 +1087,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
1051 const struct ath10k_hif_ops *hif_ops) 1087 const struct ath10k_hif_ops *hif_ops)
1052{ 1088{
1053 struct ath10k *ar; 1089 struct ath10k *ar;
1090 int ret;
1054 1091
1055 ar = ath10k_mac_create(priv_size); 1092 ar = ath10k_mac_create(priv_size);
1056 if (!ar) 1093 if (!ar)
@@ -1076,7 +1113,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
1076 1113
1077 ar->workqueue = create_singlethread_workqueue("ath10k_wq"); 1114 ar->workqueue = create_singlethread_workqueue("ath10k_wq");
1078 if (!ar->workqueue) 1115 if (!ar->workqueue)
1079 goto err_wq; 1116 goto err_free_mac;
1080 1117
1081 mutex_init(&ar->conf_mutex); 1118 mutex_init(&ar->conf_mutex);
1082 spin_lock_init(&ar->data_lock); 1119 spin_lock_init(&ar->data_lock);
@@ -1094,10 +1131,18 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
1094 INIT_WORK(&ar->register_work, ath10k_core_register_work); 1131 INIT_WORK(&ar->register_work, ath10k_core_register_work);
1095 INIT_WORK(&ar->restart_work, ath10k_core_restart); 1132 INIT_WORK(&ar->restart_work, ath10k_core_restart);
1096 1133
1134 ret = ath10k_debug_create(ar);
1135 if (ret)
1136 goto err_free_wq;
1137
1097 return ar; 1138 return ar;
1098 1139
1099err_wq: 1140err_free_wq:
1141 destroy_workqueue(ar->workqueue);
1142
1143err_free_mac:
1100 ath10k_mac_destroy(ar); 1144 ath10k_mac_destroy(ar);
1145
1101 return NULL; 1146 return NULL;
1102} 1147}
1103EXPORT_SYMBOL(ath10k_core_create); 1148EXPORT_SYMBOL(ath10k_core_create);
@@ -1107,6 +1152,7 @@ void ath10k_core_destroy(struct ath10k *ar)
1107 flush_workqueue(ar->workqueue); 1152 flush_workqueue(ar->workqueue);
1108 destroy_workqueue(ar->workqueue); 1153 destroy_workqueue(ar->workqueue);
1109 1154
1155 ath10k_debug_destroy(ar);
1110 ath10k_mac_destroy(ar); 1156 ath10k_mac_destroy(ar);
1111} 1157}
1112EXPORT_SYMBOL(ath10k_core_destroy); 1158EXPORT_SYMBOL(ath10k_core_destroy);
diff --git a/drivers/net/wireless/ath/ath10k/core.h b/drivers/net/wireless/ath/ath10k/core.h
index 4ef476099225..fe531ea6926c 100644
--- a/drivers/net/wireless/ath/ath10k/core.h
+++ b/drivers/net/wireless/ath/ath10k/core.h
@@ -293,7 +293,7 @@ struct ath10k_debug {
293 struct dentry *debugfs_phy; 293 struct dentry *debugfs_phy;
294 294
295 struct ath10k_target_stats target_stats; 295 struct ath10k_target_stats target_stats;
296 DECLARE_BITMAP(wmi_service_bitmap, WMI_SERVICE_BM_SIZE); 296 DECLARE_BITMAP(wmi_service_bitmap, WMI_SERVICE_MAX);
297 297
298 struct completion event_stats_compl; 298 struct completion event_stats_compl;
299 299
@@ -330,6 +330,17 @@ enum ath10k_state {
330 * prevents completion timeouts and makes the driver more responsive to 330 * prevents completion timeouts and makes the driver more responsive to
331 * userspace commands. This is also prevents recursive recovery. */ 331 * userspace commands. This is also prevents recursive recovery. */
332 ATH10K_STATE_WEDGED, 332 ATH10K_STATE_WEDGED,
333
334 /* factory tests */
335 ATH10K_STATE_UTF,
336};
337
338enum ath10k_firmware_mode {
339 /* the default mode, standard 802.11 functionality */
340 ATH10K_FIRMWARE_MODE_NORMAL,
341
342 /* factory tests etc */
343 ATH10K_FIRMWARE_MODE_UTF,
333}; 344};
334 345
335enum ath10k_fw_features { 346enum ath10k_fw_features {
@@ -472,7 +483,6 @@ struct ath10k {
472 struct cfg80211_chan_def chandef; 483 struct cfg80211_chan_def chandef;
473 484
474 int free_vdev_map; 485 int free_vdev_map;
475 bool promisc;
476 bool monitor; 486 bool monitor;
477 int monitor_vdev_id; 487 int monitor_vdev_id;
478 bool monitor_started; 488 bool monitor_started;
@@ -544,6 +554,15 @@ struct ath10k {
544 struct ath10k_spec_scan config; 554 struct ath10k_spec_scan config;
545 } spectral; 555 } spectral;
546 556
557 struct {
558 /* protected by conf_mutex */
559 const struct firmware *utf;
560 DECLARE_BITMAP(orig_fw_features, ATH10K_FW_FEATURE_COUNT);
561
562 /* protected by data_lock */
563 bool utf_monitor;
564 } testmode;
565
547 /* must be last */ 566 /* must be last */
548 u8 drv_priv[0] __aligned(sizeof(void *)); 567 u8 drv_priv[0] __aligned(sizeof(void *));
549}; 568};
@@ -552,7 +571,7 @@ struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
552 const struct ath10k_hif_ops *hif_ops); 571 const struct ath10k_hif_ops *hif_ops);
553void ath10k_core_destroy(struct ath10k *ar); 572void ath10k_core_destroy(struct ath10k *ar);
554 573
555int ath10k_core_start(struct ath10k *ar); 574int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode);
556int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt); 575int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt);
557void ath10k_core_stop(struct ath10k *ar); 576void ath10k_core_stop(struct ath10k *ar);
558int ath10k_core_register(struct ath10k *ar, u32 chip_id); 577int ath10k_core_register(struct ath10k *ar, u32 chip_id);
diff --git a/drivers/net/wireless/ath/ath10k/debug.c b/drivers/net/wireless/ath/ath10k/debug.c
index f3f0a80f8bab..3756feba3223 100644
--- a/drivers/net/wireless/ath/ath10k/debug.c
+++ b/drivers/net/wireless/ath/ath10k/debug.c
@@ -117,7 +117,7 @@ int ath10k_info(struct ath10k *ar, const char *fmt, ...)
117 va_start(args, fmt); 117 va_start(args, fmt);
118 vaf.va = &args; 118 vaf.va = &args;
119 ret = dev_info(ar->dev, "%pV", &vaf); 119 ret = dev_info(ar->dev, "%pV", &vaf);
120 trace_ath10k_log_info(&vaf); 120 trace_ath10k_log_info(ar, &vaf);
121 va_end(args); 121 va_end(args);
122 122
123 return ret; 123 return ret;
@@ -134,11 +134,12 @@ void ath10k_print_driver_info(struct ath10k *ar)
134 ar->fw_api, 134 ar->fw_api,
135 ar->htt.target_version_major, 135 ar->htt.target_version_major,
136 ar->htt.target_version_minor); 136 ar->htt.target_version_minor);
137 ath10k_info(ar, "debug %d debugfs %d tracing %d dfs %d\n", 137 ath10k_info(ar, "debug %d debugfs %d tracing %d dfs %d testmode %d\n",
138 config_enabled(CONFIG_ATH10K_DEBUG), 138 config_enabled(CONFIG_ATH10K_DEBUG),
139 config_enabled(CONFIG_ATH10K_DEBUGFS), 139 config_enabled(CONFIG_ATH10K_DEBUGFS),
140 config_enabled(CONFIG_ATH10K_TRACING), 140 config_enabled(CONFIG_ATH10K_TRACING),
141 config_enabled(CONFIG_ATH10K_DFS_CERTIFIED)); 141 config_enabled(CONFIG_ATH10K_DFS_CERTIFIED),
142 config_enabled(CONFIG_NL80211_TESTMODE));
142} 143}
143EXPORT_SYMBOL(ath10k_print_driver_info); 144EXPORT_SYMBOL(ath10k_print_driver_info);
144 145
@@ -153,7 +154,7 @@ int ath10k_err(struct ath10k *ar, const char *fmt, ...)
153 va_start(args, fmt); 154 va_start(args, fmt);
154 vaf.va = &args; 155 vaf.va = &args;
155 ret = dev_err(ar->dev, "%pV", &vaf); 156 ret = dev_err(ar->dev, "%pV", &vaf);
156 trace_ath10k_log_err(&vaf); 157 trace_ath10k_log_err(ar, &vaf);
157 va_end(args); 158 va_end(args);
158 159
159 return ret; 160 return ret;
@@ -170,7 +171,7 @@ int ath10k_warn(struct ath10k *ar, const char *fmt, ...)
170 va_start(args, fmt); 171 va_start(args, fmt);
171 vaf.va = &args; 172 vaf.va = &args;
172 dev_warn_ratelimited(ar->dev, "%pV", &vaf); 173 dev_warn_ratelimited(ar->dev, "%pV", &vaf);
173 trace_ath10k_log_warn(&vaf); 174 trace_ath10k_log_warn(ar, &vaf);
174 175
175 va_end(args); 176 va_end(args);
176 177
@@ -208,7 +209,7 @@ static ssize_t ath10k_read_wmi_services(struct file *file,
208 if (len > buf_len) 209 if (len > buf_len)
209 len = buf_len; 210 len = buf_len;
210 211
211 for (i = 0; i < WMI_MAX_SERVICE; i++) { 212 for (i = 0; i < WMI_SERVICE_MAX; i++) {
212 enabled = test_bit(i, ar->debug.wmi_service_bitmap); 213 enabled = test_bit(i, ar->debug.wmi_service_bitmap);
213 name = wmi_service_name(i); 214 name = wmi_service_name(i);
214 215
@@ -564,16 +565,35 @@ static const struct file_operations fops_fw_stats = {
564 .llseek = default_llseek, 565 .llseek = default_llseek,
565}; 566};
566 567
568/* This is a clean assert crash in firmware. */
569static int ath10k_debug_fw_assert(struct ath10k *ar)
570{
571 struct wmi_vdev_install_key_cmd *cmd;
572 struct sk_buff *skb;
573
574 skb = ath10k_wmi_alloc_skb(ar, sizeof(*cmd) + 16);
575 if (!skb)
576 return -ENOMEM;
577
578 cmd = (struct wmi_vdev_install_key_cmd *)skb->data;
579 memset(cmd, 0, sizeof(*cmd));
580
581 /* big enough number so that firmware asserts */
582 cmd->vdev_id = __cpu_to_le32(0x7ffe);
583
584 return ath10k_wmi_cmd_send(ar, skb,
585 ar->wmi.cmd->vdev_install_key_cmdid);
586}
587
567static ssize_t ath10k_read_simulate_fw_crash(struct file *file, 588static ssize_t ath10k_read_simulate_fw_crash(struct file *file,
568 char __user *user_buf, 589 char __user *user_buf,
569 size_t count, loff_t *ppos) 590 size_t count, loff_t *ppos)
570{ 591{
571 const char buf[] = "To simulate firmware crash write one of the" 592 const char buf[] =
572 " keywords to this file:\n `soft` - this will send" 593 "To simulate firmware crash write one of the keywords to this file:\n"
573 " WMI_FORCE_FW_HANG_ASSERT to firmware if FW" 594 "`soft` - this will send WMI_FORCE_FW_HANG_ASSERT to firmware if FW supports that command.\n"
574 " supports that command.\n `hard` - this will send" 595 "`hard` - this will send to firmware command with illegal parameters causing firmware crash.\n"
575 " to firmware command with illegal parameters" 596 "`assert` - this will send special illegal parameter to firmware to cause assert failure and crash.\n";
576 " causing firmware crash.\n";
577 597
578 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf)); 598 return simple_read_from_buffer(user_buf, count, ppos, buf, strlen(buf));
579} 599}
@@ -621,7 +641,11 @@ static ssize_t ath10k_write_simulate_fw_crash(struct file *file,
621 * firmware variants in order to force a firmware crash. 641 * firmware variants in order to force a firmware crash.
622 */ 642 */
623 ret = ath10k_wmi_vdev_set_param(ar, 0x7fff, 643 ret = ath10k_wmi_vdev_set_param(ar, 0x7fff,
624 ar->wmi.vdev_param->rts_threshold, 0); 644 ar->wmi.vdev_param->rts_threshold,
645 0);
646 } else if (!strcmp(buf, "assert")) {
647 ath10k_info(ar, "simulating firmware assert crash\n");
648 ret = ath10k_debug_fw_assert(ar);
625 } else { 649 } else {
626 ret = -EINVAL; 650 ret = -EINVAL;
627 goto exit; 651 goto exit;
@@ -840,8 +864,8 @@ static void ath10k_debug_htt_stats_dwork(struct work_struct *work)
840} 864}
841 865
842static ssize_t ath10k_read_htt_stats_mask(struct file *file, 866static ssize_t ath10k_read_htt_stats_mask(struct file *file,
843 char __user *user_buf, 867 char __user *user_buf,
844 size_t count, loff_t *ppos) 868 size_t count, loff_t *ppos)
845{ 869{
846 struct ath10k *ar = file->private_data; 870 struct ath10k *ar = file->private_data;
847 char buf[32]; 871 char buf[32];
@@ -853,8 +877,8 @@ static ssize_t ath10k_read_htt_stats_mask(struct file *file,
853} 877}
854 878
855static ssize_t ath10k_write_htt_stats_mask(struct file *file, 879static ssize_t ath10k_write_htt_stats_mask(struct file *file,
856 const char __user *user_buf, 880 const char __user *user_buf,
857 size_t count, loff_t *ppos) 881 size_t count, loff_t *ppos)
858{ 882{
859 struct ath10k *ar = file->private_data; 883 struct ath10k *ar = file->private_data;
860 unsigned long mask; 884 unsigned long mask;
@@ -959,8 +983,8 @@ static const struct file_operations fops_htt_max_amsdu_ampdu = {
959}; 983};
960 984
961static ssize_t ath10k_read_fw_dbglog(struct file *file, 985static ssize_t ath10k_read_fw_dbglog(struct file *file,
962 char __user *user_buf, 986 char __user *user_buf,
963 size_t count, loff_t *ppos) 987 size_t count, loff_t *ppos)
964{ 988{
965 struct ath10k *ar = file->private_data; 989 struct ath10k *ar = file->private_data;
966 unsigned int len; 990 unsigned int len;
@@ -1132,19 +1156,28 @@ static const struct file_operations fops_dfs_stats = {
1132 1156
1133int ath10k_debug_create(struct ath10k *ar) 1157int ath10k_debug_create(struct ath10k *ar)
1134{ 1158{
1135 int ret;
1136
1137 ar->debug.fw_crash_data = vzalloc(sizeof(*ar->debug.fw_crash_data)); 1159 ar->debug.fw_crash_data = vzalloc(sizeof(*ar->debug.fw_crash_data));
1138 if (!ar->debug.fw_crash_data) { 1160 if (!ar->debug.fw_crash_data)
1139 ret = -ENOMEM; 1161 return -ENOMEM;
1140 goto err;
1141 }
1142 1162
1163 return 0;
1164}
1165
1166void ath10k_debug_destroy(struct ath10k *ar)
1167{
1168 vfree(ar->debug.fw_crash_data);
1169 ar->debug.fw_crash_data = NULL;
1170}
1171
1172int ath10k_debug_register(struct ath10k *ar)
1173{
1143 ar->debug.debugfs_phy = debugfs_create_dir("ath10k", 1174 ar->debug.debugfs_phy = debugfs_create_dir("ath10k",
1144 ar->hw->wiphy->debugfsdir); 1175 ar->hw->wiphy->debugfsdir);
1145 if (!ar->debug.debugfs_phy) { 1176 if (IS_ERR_OR_NULL(ar->debug.debugfs_phy)) {
1146 ret = -ENOMEM; 1177 if (IS_ERR(ar->debug.debugfs_phy))
1147 goto err_free_fw_crash_data; 1178 return PTR_ERR(ar->debug.debugfs_phy);
1179
1180 return -ENOMEM;
1148 } 1181 }
1149 1182
1150 INIT_DELAYED_WORK(&ar->debug.htt_stats_dwork, 1183 INIT_DELAYED_WORK(&ar->debug.htt_stats_dwork,
@@ -1192,17 +1225,10 @@ int ath10k_debug_create(struct ath10k *ar)
1192 } 1225 }
1193 1226
1194 return 0; 1227 return 0;
1195
1196err_free_fw_crash_data:
1197 vfree(ar->debug.fw_crash_data);
1198
1199err:
1200 return ret;
1201} 1228}
1202 1229
1203void ath10k_debug_destroy(struct ath10k *ar) 1230void ath10k_debug_unregister(struct ath10k *ar)
1204{ 1231{
1205 vfree(ar->debug.fw_crash_data);
1206 cancel_delayed_work_sync(&ar->debug.htt_stats_dwork); 1232 cancel_delayed_work_sync(&ar->debug.htt_stats_dwork);
1207} 1233}
1208 1234
@@ -1223,7 +1249,7 @@ void ath10k_dbg(struct ath10k *ar, enum ath10k_debug_mask mask,
1223 if (ath10k_debug_mask & mask) 1249 if (ath10k_debug_mask & mask)
1224 dev_printk(KERN_DEBUG, ar->dev, "%pV", &vaf); 1250 dev_printk(KERN_DEBUG, ar->dev, "%pV", &vaf);
1225 1251
1226 trace_ath10k_log_dbg(mask, &vaf); 1252 trace_ath10k_log_dbg(ar, mask, &vaf);
1227 1253
1228 va_end(args); 1254 va_end(args);
1229} 1255}
@@ -1242,7 +1268,7 @@ void ath10k_dbg_dump(struct ath10k *ar,
1242 } 1268 }
1243 1269
1244 /* tracing code doesn't like null strings :/ */ 1270 /* tracing code doesn't like null strings :/ */
1245 trace_ath10k_log_dbg_dump(msg ? msg : "", prefix ? prefix : "", 1271 trace_ath10k_log_dbg_dump(ar, msg ? msg : "", prefix ? prefix : "",
1246 buf, len); 1272 buf, len);
1247} 1273}
1248EXPORT_SYMBOL(ath10k_dbg_dump); 1274EXPORT_SYMBOL(ath10k_dbg_dump);
diff --git a/drivers/net/wireless/ath/ath10k/debug.h b/drivers/net/wireless/ath/ath10k/debug.h
index 56746539bea2..b3774f7f492c 100644
--- a/drivers/net/wireless/ath/ath10k/debug.h
+++ b/drivers/net/wireless/ath/ath10k/debug.h
@@ -34,6 +34,7 @@ enum ath10k_debug_mask {
34 ATH10K_DBG_DATA = 0x00000200, 34 ATH10K_DBG_DATA = 0x00000200,
35 ATH10K_DBG_BMI = 0x00000400, 35 ATH10K_DBG_BMI = 0x00000400,
36 ATH10K_DBG_REGULATORY = 0x00000800, 36 ATH10K_DBG_REGULATORY = 0x00000800,
37 ATH10K_DBG_TESTMODE = 0x00001000,
37 ATH10K_DBG_ANY = 0xffffffff, 38 ATH10K_DBG_ANY = 0xffffffff,
38}; 39};
39 40
@@ -49,6 +50,8 @@ int ath10k_debug_start(struct ath10k *ar);
49void ath10k_debug_stop(struct ath10k *ar); 50void ath10k_debug_stop(struct ath10k *ar);
50int ath10k_debug_create(struct ath10k *ar); 51int ath10k_debug_create(struct ath10k *ar);
51void ath10k_debug_destroy(struct ath10k *ar); 52void ath10k_debug_destroy(struct ath10k *ar);
53int ath10k_debug_register(struct ath10k *ar);
54void ath10k_debug_unregister(struct ath10k *ar);
52void ath10k_debug_read_service_map(struct ath10k *ar, 55void ath10k_debug_read_service_map(struct ath10k *ar,
53 void *service_map, 56 void *service_map,
54 size_t map_size); 57 size_t map_size);
@@ -80,6 +83,15 @@ static inline void ath10k_debug_destroy(struct ath10k *ar)
80{ 83{
81} 84}
82 85
86static inline int ath10k_debug_register(struct ath10k *ar)
87{
88 return 0;
89}
90
91static inline void ath10k_debug_unregister(struct ath10k *ar)
92{
93}
94
83static inline void ath10k_debug_read_service_map(struct ath10k *ar, 95static inline void ath10k_debug_read_service_map(struct ath10k *ar,
84 void *service_map, 96 void *service_map,
85 size_t map_size) 97 size_t map_size)
diff --git a/drivers/net/wireless/ath/ath10k/hif.h b/drivers/net/wireless/ath/ath10k/hif.h
index 2ac7beacddca..62323fea27e1 100644
--- a/drivers/net/wireless/ath/ath10k/hif.h
+++ b/drivers/net/wireless/ath/ath10k/hif.h
@@ -91,7 +91,6 @@ struct ath10k_hif_ops {
91 int (*resume)(struct ath10k *ar); 91 int (*resume)(struct ath10k *ar);
92}; 92};
93 93
94
95static inline int ath10k_hif_tx_sg(struct ath10k *ar, u8 pipe_id, 94static inline int ath10k_hif_tx_sg(struct ath10k *ar, u8 pipe_id,
96 struct ath10k_hif_sg_item *items, 95 struct ath10k_hif_sg_item *items,
97 int n_items) 96 int n_items)
diff --git a/drivers/net/wireless/ath/ath10k/htc.c b/drivers/net/wireless/ath/ath10k/htc.c
index fd9a251f0659..676bd4ed969b 100644
--- a/drivers/net/wireless/ath/ath10k/htc.c
+++ b/drivers/net/wireless/ath/ath10k/htc.c
@@ -45,10 +45,8 @@ static struct sk_buff *ath10k_htc_build_tx_ctrl_skb(void *ar)
45 struct ath10k_skb_cb *skb_cb; 45 struct ath10k_skb_cb *skb_cb;
46 46
47 skb = dev_alloc_skb(ATH10K_HTC_CONTROL_BUFFER_SIZE); 47 skb = dev_alloc_skb(ATH10K_HTC_CONTROL_BUFFER_SIZE);
48 if (!skb) { 48 if (!skb)
49 ath10k_warn(ar, "Unable to allocate ctrl skb\n");
50 return NULL; 49 return NULL;
51 }
52 50
53 skb_reserve(skb, 20); /* FIXME: why 20 bytes? */ 51 skb_reserve(skb, 20); /* FIXME: why 20 bytes? */
54 WARN_ONCE((unsigned long)skb->data & 3, "unaligned skb"); 52 WARN_ONCE((unsigned long)skb->data & 3, "unaligned skb");
@@ -569,7 +567,7 @@ int ath10k_htc_wait_target(struct ath10k_htc *htc)
569 ath10k_hif_send_complete_check(htc->ar, i, 1); 567 ath10k_hif_send_complete_check(htc->ar, i, 1);
570 568
571 status = wait_for_completion_timeout(&htc->ctl_resp, 569 status = wait_for_completion_timeout(&htc->ctl_resp,
572 ATH10K_HTC_WAIT_TIMEOUT_HZ); 570 ATH10K_HTC_WAIT_TIMEOUT_HZ);
573 571
574 if (status == 0) 572 if (status == 0)
575 status = -ETIMEDOUT; 573 status = -ETIMEDOUT;
@@ -806,10 +804,8 @@ struct sk_buff *ath10k_htc_alloc_skb(struct ath10k *ar, int size)
806 struct sk_buff *skb; 804 struct sk_buff *skb;
807 805
808 skb = dev_alloc_skb(size + sizeof(struct ath10k_htc_hdr)); 806 skb = dev_alloc_skb(size + sizeof(struct ath10k_htc_hdr));
809 if (!skb) { 807 if (!skb)
810 ath10k_warn(ar, "could not allocate HTC tx skb\n");
811 return NULL; 808 return NULL;
812 }
813 809
814 skb_reserve(skb, sizeof(struct ath10k_htc_hdr)); 810 skb_reserve(skb, sizeof(struct ath10k_htc_hdr));
815 811
diff --git a/drivers/net/wireless/ath/ath10k/htc.h b/drivers/net/wireless/ath/ath10k/htc.h
index bf532f671189..527179c0edce 100644
--- a/drivers/net/wireless/ath/ath10k/htc.h
+++ b/drivers/net/wireless/ath/ath10k/htc.h
@@ -214,7 +214,6 @@ struct ath10k_htc_frame {
214 struct ath10k_htc_record trailer[0]; 214 struct ath10k_htc_record trailer[0];
215} __packed __aligned(4); 215} __packed __aligned(4);
216 216
217
218/*******************/ 217/*******************/
219/* Host-side stuff */ 218/* Host-side stuff */
220/*******************/ 219/*******************/
diff --git a/drivers/net/wireless/ath/ath10k/htt.c b/drivers/net/wireless/ath/ath10k/htt.c
index 87daae11f116..56cb4aceb383 100644
--- a/drivers/net/wireless/ath/ath10k/htt.c
+++ b/drivers/net/wireless/ath/ath10k/htt.c
@@ -101,7 +101,7 @@ int ath10k_htt_setup(struct ath10k_htt *htt)
101 return status; 101 return status;
102 102
103 status = wait_for_completion_timeout(&htt->target_version_received, 103 status = wait_for_completion_timeout(&htt->target_version_received,
104 HTT_TARGET_VERSION_TIMEOUT_HZ); 104 HTT_TARGET_VERSION_TIMEOUT_HZ);
105 if (status <= 0) { 105 if (status <= 0) {
106 ath10k_warn(ar, "htt version request timed out\n"); 106 ath10k_warn(ar, "htt version request timed out\n");
107 return -ETIMEDOUT; 107 return -ETIMEDOUT;
diff --git a/drivers/net/wireless/ath/ath10k/htt.h b/drivers/net/wireless/ath/ath10k/htt.h
index 6c93f3885ee5..3b44217a6c19 100644
--- a/drivers/net/wireless/ath/ath10k/htt.h
+++ b/drivers/net/wireless/ath/ath10k/htt.h
@@ -265,7 +265,6 @@ enum htt_mgmt_tx_status {
265 265
266/*=== target -> host messages ===============================================*/ 266/*=== target -> host messages ===============================================*/
267 267
268
269enum htt_t2h_msg_type { 268enum htt_t2h_msg_type {
270 HTT_T2H_MSG_TYPE_VERSION_CONF = 0x0, 269 HTT_T2H_MSG_TYPE_VERSION_CONF = 0x0,
271 HTT_T2H_MSG_TYPE_RX_IND = 0x1, 270 HTT_T2H_MSG_TYPE_RX_IND = 0x1,
@@ -1032,6 +1031,7 @@ static inline struct htt_stats_conf_item *htt_stats_conf_next_item(
1032{ 1031{
1033 return (void *)item + sizeof(*item) + roundup(item->length, 4); 1032 return (void *)item + sizeof(*item) + roundup(item->length, 4);
1034} 1033}
1034
1035/* 1035/*
1036 * host -> target FRAG DESCRIPTOR/MSDU_EXT DESC bank 1036 * host -> target FRAG DESCRIPTOR/MSDU_EXT DESC bank
1037 * 1037 *
@@ -1148,7 +1148,6 @@ struct htt_resp {
1148 }; 1148 };
1149} __packed; 1149} __packed;
1150 1150
1151
1152/*** host side structures follow ***/ 1151/*** host side structures follow ***/
1153 1152
1154struct htt_tx_done { 1153struct htt_tx_done {
diff --git a/drivers/net/wireless/ath/ath10k/htt_rx.c b/drivers/net/wireless/ath/ath10k/htt_rx.c
index 30927b1d7109..60d40a04508b 100644
--- a/drivers/net/wireless/ath/ath10k/htt_rx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_rx.c
@@ -42,7 +42,6 @@
42/* when under memory pressure rx ring refill may fail and needs a retry */ 42/* when under memory pressure rx ring refill may fail and needs a retry */
43#define HTT_RX_RING_REFILL_RETRY_MS 50 43#define HTT_RX_RING_REFILL_RETRY_MS 50
44 44
45
46static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb); 45static int ath10k_htt_rx_get_csum_state(struct sk_buff *skb);
47static void ath10k_htt_txrx_compl_task(unsigned long ptr); 46static void ath10k_htt_txrx_compl_task(unsigned long ptr);
48 47
@@ -133,7 +132,7 @@ static int __ath10k_htt_rx_ring_fill_n(struct ath10k_htt *htt, int num)
133 dma_addr_t paddr; 132 dma_addr_t paddr;
134 int ret = 0, idx; 133 int ret = 0, idx;
135 134
136 idx = __le32_to_cpu(*(htt->rx_ring.alloc_idx.vaddr)); 135 idx = __le32_to_cpu(*htt->rx_ring.alloc_idx.vaddr);
137 while (num > 0) { 136 while (num > 0) {
138 skb = dev_alloc_skb(HTT_RX_BUF_SIZE + HTT_RX_DESC_ALIGN); 137 skb = dev_alloc_skb(HTT_RX_BUF_SIZE + HTT_RX_DESC_ALIGN);
139 if (!skb) { 138 if (!skb) {
@@ -171,7 +170,7 @@ static int __ath10k_htt_rx_ring_fill_n(struct ath10k_htt *htt, int num)
171 } 170 }
172 171
173fail: 172fail:
174 *(htt->rx_ring.alloc_idx.vaddr) = __cpu_to_le32(idx); 173 *htt->rx_ring.alloc_idx.vaddr = __cpu_to_le32(idx);
175 return ret; 174 return ret;
176} 175}
177 176
@@ -223,6 +222,7 @@ static void ath10k_htt_rx_msdu_buff_replenish(struct ath10k_htt *htt)
223static void ath10k_htt_rx_ring_refill_retry(unsigned long arg) 222static void ath10k_htt_rx_ring_refill_retry(unsigned long arg)
224{ 223{
225 struct ath10k_htt *htt = (struct ath10k_htt *)arg; 224 struct ath10k_htt *htt = (struct ath10k_htt *)arg;
225
226 ath10k_htt_rx_msdu_buff_replenish(htt); 226 ath10k_htt_rx_msdu_buff_replenish(htt);
227} 227}
228 228
@@ -314,7 +314,7 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
314{ 314{
315 struct ath10k *ar = htt->ar; 315 struct ath10k *ar = htt->ar;
316 int msdu_len, msdu_chaining = 0; 316 int msdu_len, msdu_chaining = 0;
317 struct sk_buff *msdu; 317 struct sk_buff *msdu, *next;
318 struct htt_rx_desc *rx_desc; 318 struct htt_rx_desc *rx_desc;
319 319
320 lockdep_assert_held(&htt->rx_ring.lock); 320 lockdep_assert_held(&htt->rx_ring.lock);
@@ -450,11 +450,11 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
450 if (last_msdu) { 450 if (last_msdu) {
451 msdu->next = NULL; 451 msdu->next = NULL;
452 break; 452 break;
453 } else {
454 struct sk_buff *next = ath10k_htt_rx_netbuf_pop(htt);
455 msdu->next = next;
456 msdu = next;
457 } 453 }
454
455 next = ath10k_htt_rx_netbuf_pop(htt);
456 msdu->next = next;
457 msdu = next;
458 } 458 }
459 *tail_msdu = msdu; 459 *tail_msdu = msdu;
460 460
@@ -480,6 +480,7 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
480static void ath10k_htt_rx_replenish_task(unsigned long ptr) 480static void ath10k_htt_rx_replenish_task(unsigned long ptr)
481{ 481{
482 struct ath10k_htt *htt = (struct ath10k_htt *)ptr; 482 struct ath10k_htt *htt = (struct ath10k_htt *)ptr;
483
483 ath10k_htt_rx_msdu_buff_replenish(htt); 484 ath10k_htt_rx_msdu_buff_replenish(htt);
484} 485}
485 486
@@ -488,6 +489,7 @@ int ath10k_htt_rx_alloc(struct ath10k_htt *htt)
488 struct ath10k *ar = htt->ar; 489 struct ath10k *ar = htt->ar;
489 dma_addr_t paddr; 490 dma_addr_t paddr;
490 void *vaddr; 491 void *vaddr;
492 size_t size;
491 struct timer_list *timer = &htt->rx_ring.refill_retry_timer; 493 struct timer_list *timer = &htt->rx_ring.refill_retry_timer;
492 494
493 htt->rx_ring.size = ath10k_htt_rx_ring_size(htt); 495 htt->rx_ring.size = ath10k_htt_rx_ring_size(htt);
@@ -515,9 +517,9 @@ int ath10k_htt_rx_alloc(struct ath10k_htt *htt)
515 if (!htt->rx_ring.netbufs_ring) 517 if (!htt->rx_ring.netbufs_ring)
516 goto err_netbuf; 518 goto err_netbuf;
517 519
518 vaddr = dma_alloc_coherent(htt->ar->dev, 520 size = htt->rx_ring.size * sizeof(htt->rx_ring.paddrs_ring);
519 (htt->rx_ring.size * sizeof(htt->rx_ring.paddrs_ring)), 521
520 &paddr, GFP_DMA); 522 vaddr = dma_alloc_coherent(htt->ar->dev, size, &paddr, GFP_DMA);
521 if (!vaddr) 523 if (!vaddr)
522 goto err_dma_ring; 524 goto err_dma_ring;
523 525
@@ -625,19 +627,21 @@ static struct ieee80211_hdr *ath10k_htt_rx_skb_get_hdr(struct sk_buff *skb)
625 627
626 rxd = (void *)skb->data - sizeof(*rxd); 628 rxd = (void *)skb->data - sizeof(*rxd);
627 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1), 629 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1),
628 RX_MSDU_START_INFO1_DECAP_FORMAT); 630 RX_MSDU_START_INFO1_DECAP_FORMAT);
629 631
630 if (fmt == RX_MSDU_DECAP_RAW) 632 if (fmt == RX_MSDU_DECAP_RAW)
631 return (void *)skb->data; 633 return (void *)skb->data;
632 else 634
633 return (void *)skb->data - RX_HTT_HDR_STATUS_LEN; 635 return (void *)skb->data - RX_HTT_HDR_STATUS_LEN;
634} 636}
635 637
636/* This function only applies for first msdu in an msdu chain */ 638/* This function only applies for first msdu in an msdu chain */
637static bool ath10k_htt_rx_hdr_is_amsdu(struct ieee80211_hdr *hdr) 639static bool ath10k_htt_rx_hdr_is_amsdu(struct ieee80211_hdr *hdr)
638{ 640{
641 u8 *qc;
642
639 if (ieee80211_is_data_qos(hdr->frame_control)) { 643 if (ieee80211_is_data_qos(hdr->frame_control)) {
640 u8 *qc = ieee80211_get_qos_ctl(hdr); 644 qc = ieee80211_get_qos_ctl(hdr);
641 if (qc[0] & 0x80) 645 if (qc[0] & 0x80)
642 return true; 646 return true;
643 } 647 }
@@ -914,7 +918,7 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
914 918
915 rxd = (void *)skb->data - sizeof(*rxd); 919 rxd = (void *)skb->data - sizeof(*rxd);
916 enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0), 920 enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0),
917 RX_MPDU_START_INFO0_ENCRYPT_TYPE); 921 RX_MPDU_START_INFO0_ENCRYPT_TYPE);
918 922
919 hdr = (struct ieee80211_hdr *)rxd->rx_hdr_status; 923 hdr = (struct ieee80211_hdr *)rxd->rx_hdr_status;
920 hdr_len = ieee80211_hdrlen(hdr->frame_control); 924 hdr_len = ieee80211_hdrlen(hdr->frame_control);
@@ -950,8 +954,8 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
950 /* pull decapped header and copy SA & DA */ 954 /* pull decapped header and copy SA & DA */
951 hdr = (struct ieee80211_hdr *)skb->data; 955 hdr = (struct ieee80211_hdr *)skb->data;
952 hdr_len = ath10k_htt_rx_nwifi_hdrlen(hdr); 956 hdr_len = ath10k_htt_rx_nwifi_hdrlen(hdr);
953 memcpy(da, ieee80211_get_DA(hdr), ETH_ALEN); 957 ether_addr_copy(da, ieee80211_get_DA(hdr));
954 memcpy(sa, ieee80211_get_SA(hdr), ETH_ALEN); 958 ether_addr_copy(sa, ieee80211_get_SA(hdr));
955 skb_pull(skb, hdr_len); 959 skb_pull(skb, hdr_len);
956 960
957 /* push original 802.11 header */ 961 /* push original 802.11 header */
@@ -968,8 +972,8 @@ static void ath10k_htt_rx_amsdu(struct ath10k_htt *htt,
968 /* original 802.11 header has a different DA and in 972 /* original 802.11 header has a different DA and in
969 * case of 4addr it may also have different SA 973 * case of 4addr it may also have different SA
970 */ 974 */
971 memcpy(ieee80211_get_DA(hdr), da, ETH_ALEN); 975 ether_addr_copy(ieee80211_get_DA(hdr), da);
972 memcpy(ieee80211_get_SA(hdr), sa, ETH_ALEN); 976 ether_addr_copy(ieee80211_get_SA(hdr), sa);
973 break; 977 break;
974 case RX_MSDU_DECAP_ETHERNET2_DIX: 978 case RX_MSDU_DECAP_ETHERNET2_DIX:
975 /* strip ethernet header and insert decapped 802.11 979 /* strip ethernet header and insert decapped 802.11
@@ -1029,9 +1033,9 @@ static void ath10k_htt_rx_msdu(struct ath10k_htt *htt,
1029 1033
1030 rxd = (void *)skb->data - sizeof(*rxd); 1034 rxd = (void *)skb->data - sizeof(*rxd);
1031 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1), 1035 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1),
1032 RX_MSDU_START_INFO1_DECAP_FORMAT); 1036 RX_MSDU_START_INFO1_DECAP_FORMAT);
1033 enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0), 1037 enctype = MS(__le32_to_cpu(rxd->mpdu_start.info0),
1034 RX_MPDU_START_INFO0_ENCRYPT_TYPE); 1038 RX_MPDU_START_INFO0_ENCRYPT_TYPE);
1035 hdr = (struct ieee80211_hdr *)rxd->rx_hdr_status; 1039 hdr = (struct ieee80211_hdr *)rxd->rx_hdr_status;
1036 hdr_len = ieee80211_hdrlen(hdr->frame_control); 1040 hdr_len = ieee80211_hdrlen(hdr->frame_control);
1037 1041
@@ -1332,7 +1336,7 @@ static void ath10k_htt_rx_handler(struct ath10k_htt *htt,
1332} 1336}
1333 1337
1334static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt, 1338static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1335 struct htt_rx_fragment_indication *frag) 1339 struct htt_rx_fragment_indication *frag)
1336{ 1340{
1337 struct ath10k *ar = htt->ar; 1341 struct ath10k *ar = htt->ar;
1338 struct sk_buff *msdu_head, *msdu_tail; 1342 struct sk_buff *msdu_head, *msdu_tail;
@@ -1378,7 +1382,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
1378 tkip_mic_err = !!(attention & RX_ATTENTION_FLAGS_TKIP_MIC_ERR); 1382 tkip_mic_err = !!(attention & RX_ATTENTION_FLAGS_TKIP_MIC_ERR);
1379 decrypt_err = !!(attention & RX_ATTENTION_FLAGS_DECRYPT_ERR); 1383 decrypt_err = !!(attention & RX_ATTENTION_FLAGS_DECRYPT_ERR);
1380 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1), 1384 fmt = MS(__le32_to_cpu(rxd->msdu_start.info1),
1381 RX_MSDU_START_INFO1_DECAP_FORMAT); 1385 RX_MSDU_START_INFO1_DECAP_FORMAT);
1382 1386
1383 if (fmt != RX_MSDU_DECAP_RAW) { 1387 if (fmt != RX_MSDU_DECAP_RAW) {
1384 ath10k_warn(ar, "we dont support non-raw fragmented rx yet\n"); 1388 ath10k_warn(ar, "we dont support non-raw fragmented rx yet\n");
@@ -1654,7 +1658,7 @@ void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
1654 /* FIX THIS */ 1658 /* FIX THIS */
1655 break; 1659 break;
1656 case HTT_T2H_MSG_TYPE_STATS_CONF: 1660 case HTT_T2H_MSG_TYPE_STATS_CONF:
1657 trace_ath10k_htt_stats(skb->data, skb->len); 1661 trace_ath10k_htt_stats(ar, skb->data, skb->len);
1658 break; 1662 break;
1659 case HTT_T2H_MSG_TYPE_TX_INSPECT_IND: 1663 case HTT_T2H_MSG_TYPE_TX_INSPECT_IND:
1660 /* Firmware can return tx frames if it's unable to fully 1664 /* Firmware can return tx frames if it's unable to fully
diff --git a/drivers/net/wireless/ath/ath10k/htt_tx.c b/drivers/net/wireless/ath/ath10k/htt_tx.c
index eaa73aa99c20..bd87a35201d8 100644
--- a/drivers/net/wireless/ath/ath10k/htt_tx.c
+++ b/drivers/net/wireless/ath/ath10k/htt_tx.c
@@ -154,7 +154,6 @@ void ath10k_htt_tx_free(struct ath10k_htt *htt)
154 kfree(htt->pending_tx); 154 kfree(htt->pending_tx);
155 kfree(htt->used_msdu_ids); 155 kfree(htt->used_msdu_ids);
156 dma_pool_destroy(htt->tx_pool); 156 dma_pool_destroy(htt->tx_pool);
157 return;
158} 157}
159 158
160void ath10k_htt_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb) 159void ath10k_htt_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
@@ -377,7 +376,6 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
377 int msdu_id = -1; 376 int msdu_id = -1;
378 int res; 377 int res;
379 378
380
381 res = ath10k_htt_tx_inc_pending(htt); 379 res = ath10k_htt_tx_inc_pending(htt);
382 if (res) 380 if (res)
383 goto err; 381 goto err;
diff --git a/drivers/net/wireless/ath/ath10k/hw.h b/drivers/net/wireless/ath/ath10k/hw.h
index 13568b01de9f..3cf5702c1e7e 100644
--- a/drivers/net/wireless/ath/ath10k/hw.h
+++ b/drivers/net/wireless/ath/ath10k/hw.h
@@ -36,6 +36,8 @@
36#define ATH10K_FW_API2_FILE "firmware-2.bin" 36#define ATH10K_FW_API2_FILE "firmware-2.bin"
37#define ATH10K_FW_API3_FILE "firmware-3.bin" 37#define ATH10K_FW_API3_FILE "firmware-3.bin"
38 38
39#define ATH10K_FW_UTF_FILE "utf.bin"
40
39/* includes also the null byte */ 41/* includes also the null byte */
40#define ATH10K_FIRMWARE_MAGIC "QCA-ATH10K" 42#define ATH10K_FIRMWARE_MAGIC "QCA-ATH10K"
41 43
diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 1f35bd1ef563..46709301a51e 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -26,6 +26,7 @@
26#include "wmi.h" 26#include "wmi.h"
27#include "htt.h" 27#include "htt.h"
28#include "txrx.h" 28#include "txrx.h"
29#include "testmode.h"
29 30
30/**********/ 31/**********/
31/* Crypto */ 32/* Crypto */
@@ -198,7 +199,7 @@ static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
198 list_for_each_entry(peer, &ar->peers, list) { 199 list_for_each_entry(peer, &ar->peers, list) {
199 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) { 200 for (i = 0; i < ARRAY_SIZE(peer->keys); i++) {
200 if (peer->keys[i] == key) { 201 if (peer->keys[i] == key) {
201 memcpy(addr, peer->addr, ETH_ALEN); 202 ether_addr_copy(addr, peer->addr);
202 peer->keys[i] = NULL; 203 peer->keys[i] = NULL;
203 break; 204 break;
204 } 205 }
@@ -224,7 +225,6 @@ static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
224 return first_errno; 225 return first_errno;
225} 226}
226 227
227
228/*********************/ 228/*********************/
229/* General utilities */ 229/* General utilities */
230/*********************/ 230/*********************/
@@ -493,19 +493,6 @@ static inline int ath10k_vdev_setup_sync(struct ath10k *ar)
493 return 0; 493 return 0;
494} 494}
495 495
496static bool ath10k_monitor_is_enabled(struct ath10k *ar)
497{
498 lockdep_assert_held(&ar->conf_mutex);
499
500 ath10k_dbg(ar, ATH10K_DBG_MAC,
501 "mac monitor refs: promisc %d monitor %d cac %d\n",
502 ar->promisc, ar->monitor,
503 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags));
504
505 return ar->promisc || ar->monitor ||
506 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
507}
508
509static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id) 496static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
510{ 497{
511 struct cfg80211_chan_def *chandef = &ar->chandef; 498 struct cfg80211_chan_def *chandef = &ar->chandef;
@@ -649,16 +636,6 @@ static int ath10k_monitor_start(struct ath10k *ar)
649 636
650 lockdep_assert_held(&ar->conf_mutex); 637 lockdep_assert_held(&ar->conf_mutex);
651 638
652 if (!ath10k_monitor_is_enabled(ar)) {
653 ath10k_warn(ar, "trying to start monitor with no references\n");
654 return 0;
655 }
656
657 if (ar->monitor_started) {
658 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor already started\n");
659 return 0;
660 }
661
662 ret = ath10k_monitor_vdev_create(ar); 639 ret = ath10k_monitor_vdev_create(ar);
663 if (ret) { 640 if (ret) {
664 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret); 641 ath10k_warn(ar, "failed to create monitor vdev: %d\n", ret);
@@ -678,34 +655,51 @@ static int ath10k_monitor_start(struct ath10k *ar)
678 return 0; 655 return 0;
679} 656}
680 657
681static void ath10k_monitor_stop(struct ath10k *ar) 658static int ath10k_monitor_stop(struct ath10k *ar)
682{ 659{
683 int ret; 660 int ret;
684 661
685 lockdep_assert_held(&ar->conf_mutex); 662 lockdep_assert_held(&ar->conf_mutex);
686 663
687 if (ath10k_monitor_is_enabled(ar)) {
688 ath10k_dbg(ar, ATH10K_DBG_MAC,
689 "mac monitor will be stopped later\n");
690 return;
691 }
692
693 if (!ar->monitor_started) {
694 ath10k_dbg(ar, ATH10K_DBG_MAC,
695 "mac monitor probably failed to start earlier\n");
696 return;
697 }
698
699 ret = ath10k_monitor_vdev_stop(ar); 664 ret = ath10k_monitor_vdev_stop(ar);
700 if (ret) 665 if (ret) {
701 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret); 666 ath10k_warn(ar, "failed to stop monitor vdev: %d\n", ret);
667 return ret;
668 }
702 669
703 ret = ath10k_monitor_vdev_delete(ar); 670 ret = ath10k_monitor_vdev_delete(ar);
704 if (ret) 671 if (ret) {
705 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret); 672 ath10k_warn(ar, "failed to delete monitor vdev: %d\n", ret);
673 return ret;
674 }
706 675
707 ar->monitor_started = false; 676 ar->monitor_started = false;
708 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n"); 677 ath10k_dbg(ar, ATH10K_DBG_MAC, "mac monitor stopped\n");
678
679 return 0;
680}
681
682static int ath10k_monitor_recalc(struct ath10k *ar)
683{
684 bool should_start;
685
686 lockdep_assert_held(&ar->conf_mutex);
687
688 should_start = ar->monitor ||
689 ar->filter_flags & FIF_PROMISC_IN_BSS ||
690 test_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
691
692 ath10k_dbg(ar, ATH10K_DBG_MAC,
693 "mac monitor recalc started? %d should? %d\n",
694 ar->monitor_started, should_start);
695
696 if (should_start == ar->monitor_started)
697 return 0;
698
699 if (should_start)
700 return ath10k_monitor_start(ar);
701
702 return ath10k_monitor_stop(ar);
709} 703}
710 704
711static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif) 705static int ath10k_recalc_rtscts_prot(struct ath10k_vif *arvif)
@@ -736,7 +730,7 @@ static int ath10k_start_cac(struct ath10k *ar)
736 730
737 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); 731 set_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
738 732
739 ret = ath10k_monitor_start(ar); 733 ret = ath10k_monitor_recalc(ar);
740 if (ret) { 734 if (ret) {
741 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret); 735 ath10k_warn(ar, "failed to start monitor (cac): %d\n", ret);
742 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); 736 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
@@ -901,7 +895,7 @@ static int ath10k_vdev_stop(struct ath10k_vif *arvif)
901} 895}
902 896
903static void ath10k_control_beaconing(struct ath10k_vif *arvif, 897static void ath10k_control_beaconing(struct ath10k_vif *arvif,
904 struct ieee80211_bss_conf *info) 898 struct ieee80211_bss_conf *info)
905{ 899{
906 struct ath10k *ar = arvif->ar; 900 struct ath10k *ar = arvif->ar;
907 int ret = 0; 901 int ret = 0;
@@ -936,7 +930,7 @@ static void ath10k_control_beaconing(struct ath10k_vif *arvif,
936 return; 930 return;
937 931
938 arvif->aid = 0; 932 arvif->aid = 0;
939 memcpy(arvif->bssid, info->bssid, ETH_ALEN); 933 ether_addr_copy(arvif->bssid, info->bssid);
940 934
941 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid, 935 ret = ath10k_wmi_vdev_up(arvif->ar, arvif->vdev_id, arvif->aid,
942 arvif->bssid); 936 arvif->bssid);
@@ -1056,7 +1050,7 @@ static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
1056{ 1050{
1057 lockdep_assert_held(&ar->conf_mutex); 1051 lockdep_assert_held(&ar->conf_mutex);
1058 1052
1059 memcpy(arg->addr, sta->addr, ETH_ALEN); 1053 ether_addr_copy(arg->addr, sta->addr);
1060 arg->vdev_id = arvif->vdev_id; 1054 arg->vdev_id = arvif->vdev_id;
1061 arg->peer_aid = sta->aid; 1055 arg->peer_aid = sta->aid;
1062 arg->peer_flags |= WMI_PEER_AUTH; 1056 arg->peer_flags |= WMI_PEER_AUTH;
@@ -1111,9 +1105,9 @@ static void ath10k_peer_assoc_h_crypto(struct ath10k *ar,
1111 ies = rcu_dereference(bss->ies); 1105 ies = rcu_dereference(bss->ies);
1112 1106
1113 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, 1107 wpaie = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
1114 WLAN_OUI_TYPE_MICROSOFT_WPA, 1108 WLAN_OUI_TYPE_MICROSOFT_WPA,
1115 ies->data, 1109 ies->data,
1116 ies->len); 1110 ies->len);
1117 rcu_read_unlock(); 1111 rcu_read_unlock();
1118 cfg80211_put_bss(ar->hw->wiphy, bss); 1112 cfg80211_put_bss(ar->hw->wiphy, bss);
1119 } 1113 }
@@ -1163,6 +1157,7 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1163{ 1157{
1164 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap; 1158 const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
1165 int i, n; 1159 int i, n;
1160 u32 stbc;
1166 1161
1167 lockdep_assert_held(&ar->conf_mutex); 1162 lockdep_assert_held(&ar->conf_mutex);
1168 1163
@@ -1199,7 +1194,6 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
1199 } 1194 }
1200 1195
1201 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) { 1196 if (ht_cap->cap & IEEE80211_HT_CAP_RX_STBC) {
1202 u32 stbc;
1203 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC; 1197 stbc = ht_cap->cap & IEEE80211_HT_CAP_RX_STBC;
1204 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT; 1198 stbc = stbc >> IEEE80211_HT_CAP_RX_STBC_SHIFT;
1205 stbc = stbc << WMI_RC_RX_STBC_FLAG_S; 1199 stbc = stbc << WMI_RC_RX_STBC_FLAG_S;
@@ -1267,7 +1261,6 @@ static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1267 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN | 1261 uapsd |= WMI_AP_PS_UAPSD_AC0_DELIVERY_EN |
1268 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN; 1262 WMI_AP_PS_UAPSD_AC0_TRIGGER_EN;
1269 1263
1270
1271 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP) 1264 if (sta->max_sp < MAX_WMI_AP_PS_PEER_PARAM_MAX_SP)
1272 max_sp = sta->max_sp; 1265 max_sp = sta->max_sp;
1273 1266
@@ -1296,7 +1289,8 @@ static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
1296 sta->listen_interval - mac80211 patch required. 1289 sta->listen_interval - mac80211 patch required.
1297 Currently use 10 seconds */ 1290 Currently use 10 seconds */
1298 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr, 1291 ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
1299 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME, 10); 1292 WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
1293 10);
1300 if (ret) { 1294 if (ret) {
1301 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n", 1295 ath10k_warn(ar, "failed to set ap ps peer param ageout time for vdev %i: %d\n",
1302 arvif->vdev_id, ret); 1296 arvif->vdev_id, ret);
@@ -1320,7 +1314,6 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
1320 arg->peer_flags |= WMI_PEER_VHT; 1314 arg->peer_flags |= WMI_PEER_VHT;
1321 arg->peer_vht_caps = vht_cap->cap; 1315 arg->peer_vht_caps = vht_cap->cap;
1322 1316
1323
1324 ampdu_factor = (vht_cap->cap & 1317 ampdu_factor = (vht_cap->cap &
1325 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >> 1318 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK) >>
1326 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 1319 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
@@ -1531,7 +1524,7 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
1531 arvif->vdev_id, bss_conf->bssid, bss_conf->aid); 1524 arvif->vdev_id, bss_conf->bssid, bss_conf->aid);
1532 1525
1533 arvif->aid = bss_conf->aid; 1526 arvif->aid = bss_conf->aid;
1534 memcpy(arvif->bssid, bss_conf->bssid, ETH_ALEN); 1527 ether_addr_copy(arvif->bssid, bss_conf->bssid);
1535 1528
1536 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid); 1529 ret = ath10k_wmi_vdev_up(ar, arvif->vdev_id, arvif->aid, arvif->bssid);
1537 if (ret) { 1530 if (ret) {
@@ -1615,7 +1608,7 @@ static int ath10k_station_assoc(struct ath10k *ar, struct ath10k_vif *arvif,
1615 return ret; 1608 return ret;
1616 } 1609 }
1617 1610
1618 if (!sta->wme) { 1611 if (!sta->wme && !reassoc) {
1619 arvif->num_legacy_stations++; 1612 arvif->num_legacy_stations++;
1620 ret = ath10k_recalc_rtscts_prot(arvif); 1613 ret = ath10k_recalc_rtscts_prot(arvif);
1621 if (ret) { 1614 if (ret) {
@@ -1863,11 +1856,10 @@ static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
1863 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK; 1856 return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
1864} 1857}
1865 1858
1866static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, 1859static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
1867 struct ieee80211_tx_info *info)
1868{ 1860{
1869 if (info->control.vif) 1861 if (vif)
1870 return ath10k_vif_to_arvif(info->control.vif)->vdev_id; 1862 return ath10k_vif_to_arvif(vif)->vdev_id;
1871 1863
1872 if (ar->monitor_started) 1864 if (ar->monitor_started)
1873 return ar->monitor_vdev_id; 1865 return ar->monitor_vdev_id;
@@ -2323,7 +2315,7 @@ static void ath10k_tx(struct ieee80211_hw *hw,
2323 2315
2324 ATH10K_SKB_CB(skb)->htt.is_offchan = false; 2316 ATH10K_SKB_CB(skb)->htt.is_offchan = false;
2325 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr); 2317 ATH10K_SKB_CB(skb)->htt.tid = ath10k_tx_h_get_tid(hdr);
2326 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, info); 2318 ATH10K_SKB_CB(skb)->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
2327 2319
2328 /* it makes no sense to process injected frames like that */ 2320 /* it makes no sense to process injected frames like that */
2329 if (vif && vif->type != NL80211_IFTYPE_MONITOR) { 2321 if (vif && vif->type != NL80211_IFTYPE_MONITOR) {
@@ -2369,12 +2361,14 @@ void ath10k_halt(struct ath10k *ar)
2369 2361
2370 lockdep_assert_held(&ar->conf_mutex); 2362 lockdep_assert_held(&ar->conf_mutex);
2371 2363
2372 if (ath10k_monitor_is_enabled(ar)) { 2364 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags);
2373 clear_bit(ATH10K_CAC_RUNNING, &ar->dev_flags); 2365 ar->filter_flags = 0;
2374 ar->promisc = false; 2366 ar->monitor = false;
2375 ar->monitor = false; 2367
2368 if (ar->monitor_started)
2376 ath10k_monitor_stop(ar); 2369 ath10k_monitor_stop(ar);
2377 } 2370
2371 ar->monitor_started = false;
2378 2372
2379 ath10k_scan_finish(ar); 2373 ath10k_scan_finish(ar);
2380 ath10k_peer_cleanup_all(ar); 2374 ath10k_peer_cleanup_all(ar);
@@ -2485,6 +2479,9 @@ static int ath10k_start(struct ieee80211_hw *hw)
2485 WARN_ON(1); 2479 WARN_ON(1);
2486 ret = -EINVAL; 2480 ret = -EINVAL;
2487 goto err; 2481 goto err;
2482 case ATH10K_STATE_UTF:
2483 ret = -EBUSY;
2484 goto err;
2488 } 2485 }
2489 2486
2490 ret = ath10k_hif_power_up(ar); 2487 ret = ath10k_hif_power_up(ar);
@@ -2493,7 +2490,7 @@ static int ath10k_start(struct ieee80211_hw *hw)
2493 goto err_off; 2490 goto err_off;
2494 } 2491 }
2495 2492
2496 ret = ath10k_core_start(ar); 2493 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL);
2497 if (ret) { 2494 if (ret) {
2498 ath10k_err(ar, "Could not init core: %d\n", ret); 2495 ath10k_err(ar, "Could not init core: %d\n", ret);
2499 goto err_power_down; 2496 goto err_power_down;
@@ -2629,7 +2626,7 @@ static void ath10k_config_chan(struct ath10k *ar)
2629 /* First stop monitor interface. Some FW versions crash if there's a 2626 /* First stop monitor interface. Some FW versions crash if there's a
2630 * lone monitor interface. */ 2627 * lone monitor interface. */
2631 if (ar->monitor_started) 2628 if (ar->monitor_started)
2632 ath10k_monitor_vdev_stop(ar); 2629 ath10k_monitor_stop(ar);
2633 2630
2634 list_for_each_entry(arvif, &ar->arvifs, list) { 2631 list_for_each_entry(arvif, &ar->arvifs, list) {
2635 if (!arvif->is_started) 2632 if (!arvif->is_started)
@@ -2677,8 +2674,7 @@ static void ath10k_config_chan(struct ath10k *ar)
2677 } 2674 }
2678 } 2675 }
2679 2676
2680 if (ath10k_monitor_is_enabled(ar)) 2677 ath10k_monitor_recalc(ar);
2681 ath10k_monitor_vdev_start(ar, ar->monitor_vdev_id);
2682} 2678}
2683 2679
2684static int ath10k_config(struct ieee80211_hw *hw, u32 changed) 2680static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
@@ -2733,19 +2729,10 @@ static int ath10k_config(struct ieee80211_hw *hw, u32 changed)
2733 ath10k_config_ps(ar); 2729 ath10k_config_ps(ar);
2734 2730
2735 if (changed & IEEE80211_CONF_CHANGE_MONITOR) { 2731 if (changed & IEEE80211_CONF_CHANGE_MONITOR) {
2736 if (conf->flags & IEEE80211_CONF_MONITOR && !ar->monitor) { 2732 ar->monitor = conf->flags & IEEE80211_CONF_MONITOR;
2737 ar->monitor = true; 2733 ret = ath10k_monitor_recalc(ar);
2738 ret = ath10k_monitor_start(ar); 2734 if (ret)
2739 if (ret) { 2735 ath10k_warn(ar, "failed to recalc monitor: %d\n", ret);
2740 ath10k_warn(ar, "failed to start monitor (config): %d\n",
2741 ret);
2742 ar->monitor = false;
2743 }
2744 } else if (!(conf->flags & IEEE80211_CONF_MONITOR) &&
2745 ar->monitor) {
2746 ar->monitor = false;
2747 ath10k_monitor_stop(ar);
2748 }
2749 } 2736 }
2750 2737
2751 mutex_unlock(&ar->conf_mutex); 2738 mutex_unlock(&ar->conf_mutex);
@@ -3009,18 +2996,9 @@ static void ath10k_configure_filter(struct ieee80211_hw *hw,
3009 *total_flags &= SUPPORTED_FILTERS; 2996 *total_flags &= SUPPORTED_FILTERS;
3010 ar->filter_flags = *total_flags; 2997 ar->filter_flags = *total_flags;
3011 2998
3012 if (ar->filter_flags & FIF_PROMISC_IN_BSS && !ar->promisc) { 2999 ret = ath10k_monitor_recalc(ar);
3013 ar->promisc = true; 3000 if (ret)
3014 ret = ath10k_monitor_start(ar); 3001 ath10k_warn(ar, "failed to recalc montior: %d\n", ret);
3015 if (ret) {
3016 ath10k_warn(ar, "failed to start monitor (promisc): %d\n",
3017 ret);
3018 ar->promisc = false;
3019 }
3020 } else if (!(ar->filter_flags & FIF_PROMISC_IN_BSS) && ar->promisc) {
3021 ar->promisc = false;
3022 ath10k_monitor_stop(ar);
3023 }
3024 3002
3025 mutex_unlock(&ar->conf_mutex); 3003 mutex_unlock(&ar->conf_mutex);
3026} 3004}
@@ -3033,7 +3011,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3033 struct ath10k *ar = hw->priv; 3011 struct ath10k *ar = hw->priv;
3034 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 3012 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3035 int ret = 0; 3013 int ret = 0;
3036 u32 vdev_param, pdev_param; 3014 u32 vdev_param, pdev_param, slottime, preamble;
3037 3015
3038 mutex_lock(&ar->conf_mutex); 3016 mutex_lock(&ar->conf_mutex);
3039 3017
@@ -3112,7 +3090,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3112 * this is never erased as we it for crypto key 3090 * this is never erased as we it for crypto key
3113 * clearing; this is FW requirement 3091 * clearing; this is FW requirement
3114 */ 3092 */
3115 memcpy(arvif->bssid, info->bssid, ETH_ALEN); 3093 ether_addr_copy(arvif->bssid, info->bssid);
3116 3094
3117 ath10k_dbg(ar, ATH10K_DBG_MAC, 3095 ath10k_dbg(ar, ATH10K_DBG_MAC,
3118 "mac vdev %d start %pM\n", 3096 "mac vdev %d start %pM\n",
@@ -3154,7 +3132,6 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3154 } 3132 }
3155 3133
3156 if (changed & BSS_CHANGED_ERP_SLOT) { 3134 if (changed & BSS_CHANGED_ERP_SLOT) {
3157 u32 slottime;
3158 if (info->use_short_slot) 3135 if (info->use_short_slot)
3159 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */ 3136 slottime = WMI_VDEV_SLOT_TIME_SHORT; /* 9us */
3160 3137
@@ -3173,7 +3150,6 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3173 } 3150 }
3174 3151
3175 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 3152 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
3176 u32 preamble;
3177 if (info->use_short_preamble) 3153 if (info->use_short_preamble)
3178 preamble = WMI_VDEV_PREAMBLE_SHORT; 3154 preamble = WMI_VDEV_PREAMBLE_SHORT;
3179 else 3155 else
@@ -3192,8 +3168,16 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
3192 } 3168 }
3193 3169
3194 if (changed & BSS_CHANGED_ASSOC) { 3170 if (changed & BSS_CHANGED_ASSOC) {
3195 if (info->assoc) 3171 if (info->assoc) {
3172 /* Workaround: Make sure monitor vdev is not running
3173 * when associating to prevent some firmware revisions
3174 * (e.g. 10.1 and 10.2) from crashing.
3175 */
3176 if (ar->monitor_started)
3177 ath10k_monitor_stop(ar);
3196 ath10k_bss_assoc(hw, vif, info); 3178 ath10k_bss_assoc(hw, vif, info);
3179 ath10k_monitor_recalc(ar);
3180 }
3197 } 3181 }
3198 3182
3199exit: 3183exit:
@@ -3580,7 +3564,7 @@ exit:
3580} 3564}
3581 3565
3582static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif, 3566static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
3583 u16 ac, bool enable) 3567 u16 ac, bool enable)
3584{ 3568{
3585 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); 3569 struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
3586 u32 value = 0; 3570 u32 value = 0;
@@ -4081,8 +4065,8 @@ ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4081 continue; 4065 continue;
4082 else if (mask->control[band].ht_mcs[i] == 0x00) 4066 else if (mask->control[band].ht_mcs[i] == 0x00)
4083 break; 4067 break;
4084 else 4068
4085 return false; 4069 return false;
4086 } 4070 }
4087 4071
4088 ht_nss = i; 4072 ht_nss = i;
@@ -4093,8 +4077,8 @@ ath10k_bitrate_mask_nss(const struct cfg80211_bitrate_mask *mask,
4093 continue; 4077 continue;
4094 else if (mask->control[band].vht_mcs[i] == 0x0000) 4078 else if (mask->control[band].vht_mcs[i] == 0x0000)
4095 break; 4079 break;
4096 else 4080
4097 return false; 4081 return false;
4098 } 4082 }
4099 4083
4100 vht_nss = i; 4084 vht_nss = i;
@@ -4472,6 +4456,9 @@ static const struct ieee80211_ops ath10k_ops = {
4472 .sta_rc_update = ath10k_sta_rc_update, 4456 .sta_rc_update = ath10k_sta_rc_update,
4473 .get_tsf = ath10k_get_tsf, 4457 .get_tsf = ath10k_get_tsf,
4474 .ampdu_action = ath10k_ampdu_action, 4458 .ampdu_action = ath10k_ampdu_action,
4459
4460 CFG80211_TESTMODE_CMD(ath10k_tm_cmd)
4461
4475#ifdef CONFIG_PM 4462#ifdef CONFIG_PM
4476 .suspend = ath10k_suspend, 4463 .suspend = ath10k_suspend,
4477 .resume = ath10k_resume, 4464 .resume = ath10k_resume,
@@ -4723,7 +4710,6 @@ static struct ieee80211_sta_ht_cap ath10k_get_ht_cap(struct ath10k *ar)
4723 return ht_cap; 4710 return ht_cap;
4724} 4711}
4725 4712
4726
4727static void ath10k_get_arvif_iter(void *data, u8 *mac, 4713static void ath10k_get_arvif_iter(void *data, u8 *mac,
4728 struct ieee80211_vif *vif) 4714 struct ieee80211_vif *vif)
4729{ 4715{
diff --git a/drivers/net/wireless/ath/ath10k/pci.c b/drivers/net/wireless/ath/ath10k/pci.c
index 056a35a77133..59e0ea83be50 100644
--- a/drivers/net/wireless/ath/ath10k/pci.c
+++ b/drivers/net/wireless/ath/ath10k/pci.c
@@ -64,9 +64,6 @@ static const struct pci_device_id ath10k_pci_id_table[] = {
64 {0} 64 {0}
65}; 65};
66 66
67static int ath10k_pci_diag_read_access(struct ath10k *ar, u32 address,
68 u32 *data);
69
70static void ath10k_pci_buffer_cleanup(struct ath10k *ar); 67static void ath10k_pci_buffer_cleanup(struct ath10k *ar);
71static int ath10k_pci_cold_reset(struct ath10k *ar); 68static int ath10k_pci_cold_reset(struct ath10k *ar);
72static int ath10k_pci_warm_reset(struct ath10k *ar); 69static int ath10k_pci_warm_reset(struct ath10k *ar);
@@ -343,8 +340,8 @@ static void ath10k_pci_disable_and_clear_legacy_irq(struct ath10k *ar)
343 340
344 /* IMPORTANT: this extra read transaction is required to 341 /* IMPORTANT: this extra read transaction is required to
345 * flush the posted write buffer. */ 342 * flush the posted write buffer. */
346 (void) ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS + 343 (void)ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
347 PCIE_INTR_ENABLE_ADDRESS); 344 PCIE_INTR_ENABLE_ADDRESS);
348} 345}
349 346
350static void ath10k_pci_enable_legacy_irq(struct ath10k *ar) 347static void ath10k_pci_enable_legacy_irq(struct ath10k *ar)
@@ -355,8 +352,8 @@ static void ath10k_pci_enable_legacy_irq(struct ath10k *ar)
355 352
356 /* IMPORTANT: this extra read transaction is required to 353 /* IMPORTANT: this extra read transaction is required to
357 * flush the posted write buffer. */ 354 * flush the posted write buffer. */
358 (void) ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS + 355 (void)ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
359 PCIE_INTR_ENABLE_ADDRESS); 356 PCIE_INTR_ENABLE_ADDRESS);
360} 357}
361 358
362static inline const char *ath10k_pci_get_irq_method(struct ath10k *ar) 359static inline const char *ath10k_pci_get_irq_method(struct ath10k *ar)
@@ -365,10 +362,11 @@ static inline const char *ath10k_pci_get_irq_method(struct ath10k *ar)
365 362
366 if (ar_pci->num_msi_intrs > 1) 363 if (ar_pci->num_msi_intrs > 1)
367 return "msi-x"; 364 return "msi-x";
368 else if (ar_pci->num_msi_intrs == 1) 365
366 if (ar_pci->num_msi_intrs == 1)
369 return "msi"; 367 return "msi";
370 else 368
371 return "legacy"; 369 return "legacy";
372} 370}
373 371
374static int __ath10k_pci_rx_post_buf(struct ath10k_pci_pipe *pipe) 372static int __ath10k_pci_rx_post_buf(struct ath10k_pci_pipe *pipe)
@@ -487,25 +485,6 @@ static int ath10k_pci_diag_read_mem(struct ath10k *ar, u32 address, void *data,
487 void *data_buf = NULL; 485 void *data_buf = NULL;
488 int i; 486 int i;
489 487
490 /*
491 * This code cannot handle reads to non-memory space. Redirect to the
492 * register read fn but preserve the multi word read capability of
493 * this fn
494 */
495 if (address < DRAM_BASE_ADDRESS) {
496 if (!IS_ALIGNED(address, 4) ||
497 !IS_ALIGNED((unsigned long)data, 4))
498 return -EIO;
499
500 while ((nbytes >= 4) && ((ret = ath10k_pci_diag_read_access(
501 ar, address, (u32 *)data)) == 0)) {
502 nbytes -= sizeof(u32);
503 address += sizeof(u32);
504 data += sizeof(u32);
505 }
506 return ret;
507 }
508
509 ce_diag = ar_pci->ce_diag; 488 ce_diag = ar_pci->ce_diag;
510 489
511 /* 490 /*
@@ -549,7 +528,7 @@ static int ath10k_pci_diag_read_mem(struct ath10k *ar, u32 address, void *data,
549 address); 528 address);
550 529
551 ret = ath10k_ce_send(ce_diag, NULL, (u32)address, nbytes, 0, 530 ret = ath10k_ce_send(ce_diag, NULL, (u32)address, nbytes, 0,
552 0); 531 0);
553 if (ret) 532 if (ret)
554 goto done; 533 goto done;
555 534
@@ -569,7 +548,7 @@ static int ath10k_pci_diag_read_mem(struct ath10k *ar, u32 address, void *data,
569 goto done; 548 goto done;
570 } 549 }
571 550
572 if (buf != (u32) address) { 551 if (buf != (u32)address) {
573 ret = -EIO; 552 ret = -EIO;
574 goto done; 553 goto done;
575 } 554 }
@@ -652,19 +631,7 @@ static int __ath10k_pci_diag_read_hi(struct ath10k *ar, void *dest,
652} 631}
653 632
654#define ath10k_pci_diag_read_hi(ar, dest, src, len) \ 633#define ath10k_pci_diag_read_hi(ar, dest, src, len) \
655 __ath10k_pci_diag_read_hi(ar, dest, HI_ITEM(src), len); 634 __ath10k_pci_diag_read_hi(ar, dest, HI_ITEM(src), len)
656
657/* Read 4-byte aligned data from Target memory or register */
658static int ath10k_pci_diag_read_access(struct ath10k *ar, u32 address,
659 u32 *data)
660{
661 /* Assume range doesn't cross this boundary */
662 if (address >= DRAM_BASE_ADDRESS)
663 return ath10k_pci_diag_read32(ar, address, data);
664
665 *data = ath10k_pci_read32(ar, address);
666 return 0;
667}
668 635
669static int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address, 636static int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address,
670 const void *data, int nbytes) 637 const void *data, int nbytes)
@@ -729,7 +696,7 @@ static int ath10k_pci_diag_write_mem(struct ath10k *ar, u32 address,
729 * Request CE to send caller-supplied data that 696 * Request CE to send caller-supplied data that
730 * was copied to bounce buffer to Target(!) address. 697 * was copied to bounce buffer to Target(!) address.
731 */ 698 */
732 ret = ath10k_ce_send(ce_diag, NULL, (u32) ce_data, 699 ret = ath10k_ce_send(ce_diag, NULL, (u32)ce_data,
733 nbytes, 0, 0); 700 nbytes, 0, 0);
734 if (ret != 0) 701 if (ret != 0)
735 goto done; 702 goto done;
@@ -803,18 +770,6 @@ static int ath10k_pci_diag_write32(struct ath10k *ar, u32 address, u32 value)
803 return ath10k_pci_diag_write_mem(ar, address, &val, sizeof(val)); 770 return ath10k_pci_diag_write_mem(ar, address, &val, sizeof(val));
804} 771}
805 772
806/* Write 4B data to Target memory or register */
807static int ath10k_pci_diag_write_access(struct ath10k *ar, u32 address,
808 u32 data)
809{
810 /* Assume range doesn't cross this boundary */
811 if (address >= DRAM_BASE_ADDRESS)
812 return ath10k_pci_diag_write32(ar, address, data);
813
814 ath10k_pci_write32(ar, address, data);
815 return 0;
816}
817
818static bool ath10k_pci_is_awake(struct ath10k *ar) 773static bool ath10k_pci_is_awake(struct ath10k *ar)
819{ 774{
820 u32 val = ath10k_pci_reg_read32(ar, RTC_STATE_ADDRESS); 775 u32 val = ath10k_pci_reg_read32(ar, RTC_STATE_ADDRESS);
@@ -1152,7 +1107,7 @@ static int ath10k_pci_hif_map_service_to_pipe(struct ath10k *ar,
1152} 1107}
1153 1108
1154static void ath10k_pci_hif_get_default_pipe(struct ath10k *ar, 1109static void ath10k_pci_hif_get_default_pipe(struct ath10k *ar,
1155 u8 *ul_pipe, u8 *dl_pipe) 1110 u8 *ul_pipe, u8 *dl_pipe)
1156{ 1111{
1157 int ul_is_polled, dl_is_polled; 1112 int ul_is_polled, dl_is_polled;
1158 1113
@@ -1172,16 +1127,8 @@ static void ath10k_pci_irq_disable(struct ath10k *ar)
1172 int i; 1127 int i;
1173 1128
1174 ath10k_ce_disable_interrupts(ar); 1129 ath10k_ce_disable_interrupts(ar);
1175 1130 ath10k_pci_disable_and_clear_legacy_irq(ar);
1176 /* Regardless how many interrupts were assigned for MSI the first one 1131 /* FIXME: How to mask all MSI interrupts? */
1177 * is always used for firmware indications (crashes). There's no way to
1178 * mask the irq in the device so call disable_irq(). Legacy (shared)
1179 * interrupts can be masked on the device though.
1180 */
1181 if (ar_pci->num_msi_intrs > 0)
1182 disable_irq(ar_pci->pdev->irq);
1183 else
1184 ath10k_pci_disable_and_clear_legacy_irq(ar);
1185 1132
1186 for (i = 0; i < max(1, ar_pci->num_msi_intrs); i++) 1133 for (i = 0; i < max(1, ar_pci->num_msi_intrs); i++)
1187 synchronize_irq(ar_pci->pdev->irq + i); 1134 synchronize_irq(ar_pci->pdev->irq + i);
@@ -1189,15 +1136,9 @@ static void ath10k_pci_irq_disable(struct ath10k *ar)
1189 1136
1190static void ath10k_pci_irq_enable(struct ath10k *ar) 1137static void ath10k_pci_irq_enable(struct ath10k *ar)
1191{ 1138{
1192 struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
1193
1194 ath10k_ce_enable_interrupts(ar); 1139 ath10k_ce_enable_interrupts(ar);
1195 1140 ath10k_pci_enable_legacy_irq(ar);
1196 /* See comment in ath10k_pci_irq_disable() */ 1141 /* FIXME: How to unmask all MSI interrupts? */
1197 if (ar_pci->num_msi_intrs > 0)
1198 enable_irq(ar_pci->pdev->irq);
1199 else
1200 ath10k_pci_enable_legacy_irq(ar);
1201} 1142}
1202 1143
1203static int ath10k_pci_hif_start(struct ath10k *ar) 1144static int ath10k_pci_hif_start(struct ath10k *ar)
@@ -1311,14 +1252,21 @@ static void ath10k_pci_hif_stop(struct ath10k *ar)
1311{ 1252{
1312 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif stop\n"); 1253 ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif stop\n");
1313 1254
1314 ath10k_pci_irq_disable(ar);
1315 ath10k_pci_flush(ar);
1316
1317 /* Most likely the device has HTT Rx ring configured. The only way to 1255 /* Most likely the device has HTT Rx ring configured. The only way to
1318 * prevent the device from accessing (and possible corrupting) host 1256 * prevent the device from accessing (and possible corrupting) host
1319 * memory is to reset the chip now. 1257 * memory is to reset the chip now.
1258 *
1259 * There's also no known way of masking MSI interrupts on the device.
1260 * For ranged MSI the CE-related interrupts can be masked. However
1261 * regardless how many MSI interrupts are assigned the first one
1262 * is always used for firmware indications (crashes) and cannot be
1263 * masked. To prevent the device from asserting the interrupt reset it
1264 * before proceeding with cleanup.
1320 */ 1265 */
1321 ath10k_pci_warm_reset(ar); 1266 ath10k_pci_warm_reset(ar);
1267
1268 ath10k_pci_irq_disable(ar);
1269 ath10k_pci_flush(ar);
1322} 1270}
1323 1271
1324static int ath10k_pci_hif_exchange_bmi_msg(struct ath10k *ar, 1272static int ath10k_pci_hif_exchange_bmi_msg(struct ath10k *ar,
@@ -1472,28 +1420,12 @@ static int ath10k_pci_bmi_wait(struct ath10k_ce_pipe *tx_pipe,
1472 */ 1420 */
1473static int ath10k_pci_wake_target_cpu(struct ath10k *ar) 1421static int ath10k_pci_wake_target_cpu(struct ath10k *ar)
1474{ 1422{
1475 int ret; 1423 u32 addr, val;
1476 u32 core_ctrl;
1477
1478 ret = ath10k_pci_diag_read_access(ar, SOC_CORE_BASE_ADDRESS |
1479 CORE_CTRL_ADDRESS,
1480 &core_ctrl);
1481 if (ret) {
1482 ath10k_warn(ar, "failed to read core_ctrl: %d\n", ret);
1483 return ret;
1484 }
1485
1486 /* A_INUM_FIRMWARE interrupt to Target CPU */
1487 core_ctrl |= CORE_CTRL_CPU_INTR_MASK;
1488 1424
1489 ret = ath10k_pci_diag_write_access(ar, SOC_CORE_BASE_ADDRESS | 1425 addr = SOC_CORE_BASE_ADDRESS | CORE_CTRL_ADDRESS;
1490 CORE_CTRL_ADDRESS, 1426 val = ath10k_pci_read32(ar, addr);
1491 core_ctrl); 1427 val |= CORE_CTRL_CPU_INTR_MASK;
1492 if (ret) { 1428 ath10k_pci_write32(ar, addr, val);
1493 ath10k_warn(ar, "failed to set target CPU interrupt mask: %d\n",
1494 ret);
1495 return ret;
1496 }
1497 1429
1498 return 0; 1430 return 0;
1499} 1431}
@@ -1516,8 +1448,8 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1516 host_interest_item_address(HI_ITEM(hi_interconnect_state)); 1448 host_interest_item_address(HI_ITEM(hi_interconnect_state));
1517 1449
1518 /* Supply Target-side CE configuration */ 1450 /* Supply Target-side CE configuration */
1519 ret = ath10k_pci_diag_read_access(ar, interconnect_targ_addr, 1451 ret = ath10k_pci_diag_read32(ar, interconnect_targ_addr,
1520 &pcie_state_targ_addr); 1452 &pcie_state_targ_addr);
1521 if (ret != 0) { 1453 if (ret != 0) {
1522 ath10k_err(ar, "Failed to get pcie state addr: %d\n", ret); 1454 ath10k_err(ar, "Failed to get pcie state addr: %d\n", ret);
1523 return ret; 1455 return ret;
@@ -1529,10 +1461,10 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1529 return ret; 1461 return ret;
1530 } 1462 }
1531 1463
1532 ret = ath10k_pci_diag_read_access(ar, pcie_state_targ_addr + 1464 ret = ath10k_pci_diag_read32(ar, (pcie_state_targ_addr +
1533 offsetof(struct pcie_state, 1465 offsetof(struct pcie_state,
1534 pipe_cfg_addr), 1466 pipe_cfg_addr)),
1535 &pipe_cfg_targ_addr); 1467 &pipe_cfg_targ_addr);
1536 if (ret != 0) { 1468 if (ret != 0) {
1537 ath10k_err(ar, "Failed to get pipe cfg addr: %d\n", ret); 1469 ath10k_err(ar, "Failed to get pipe cfg addr: %d\n", ret);
1538 return ret; 1470 return ret;
@@ -1545,18 +1477,18 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1545 } 1477 }
1546 1478
1547 ret = ath10k_pci_diag_write_mem(ar, pipe_cfg_targ_addr, 1479 ret = ath10k_pci_diag_write_mem(ar, pipe_cfg_targ_addr,
1548 target_ce_config_wlan, 1480 target_ce_config_wlan,
1549 sizeof(target_ce_config_wlan)); 1481 sizeof(target_ce_config_wlan));
1550 1482
1551 if (ret != 0) { 1483 if (ret != 0) {
1552 ath10k_err(ar, "Failed to write pipe cfg: %d\n", ret); 1484 ath10k_err(ar, "Failed to write pipe cfg: %d\n", ret);
1553 return ret; 1485 return ret;
1554 } 1486 }
1555 1487
1556 ret = ath10k_pci_diag_read_access(ar, pcie_state_targ_addr + 1488 ret = ath10k_pci_diag_read32(ar, (pcie_state_targ_addr +
1557 offsetof(struct pcie_state, 1489 offsetof(struct pcie_state,
1558 svc_to_pipe_map), 1490 svc_to_pipe_map)),
1559 &svc_to_pipe_map); 1491 &svc_to_pipe_map);
1560 if (ret != 0) { 1492 if (ret != 0) {
1561 ath10k_err(ar, "Failed to get svc/pipe map: %d\n", ret); 1493 ath10k_err(ar, "Failed to get svc/pipe map: %d\n", ret);
1562 return ret; 1494 return ret;
@@ -1569,17 +1501,17 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1569 } 1501 }
1570 1502
1571 ret = ath10k_pci_diag_write_mem(ar, svc_to_pipe_map, 1503 ret = ath10k_pci_diag_write_mem(ar, svc_to_pipe_map,
1572 target_service_to_ce_map_wlan, 1504 target_service_to_ce_map_wlan,
1573 sizeof(target_service_to_ce_map_wlan)); 1505 sizeof(target_service_to_ce_map_wlan));
1574 if (ret != 0) { 1506 if (ret != 0) {
1575 ath10k_err(ar, "Failed to write svc/pipe map: %d\n", ret); 1507 ath10k_err(ar, "Failed to write svc/pipe map: %d\n", ret);
1576 return ret; 1508 return ret;
1577 } 1509 }
1578 1510
1579 ret = ath10k_pci_diag_read_access(ar, pcie_state_targ_addr + 1511 ret = ath10k_pci_diag_read32(ar, (pcie_state_targ_addr +
1580 offsetof(struct pcie_state, 1512 offsetof(struct pcie_state,
1581 config_flags), 1513 config_flags)),
1582 &pcie_config_flags); 1514 &pcie_config_flags);
1583 if (ret != 0) { 1515 if (ret != 0) {
1584 ath10k_err(ar, "Failed to get pcie config_flags: %d\n", ret); 1516 ath10k_err(ar, "Failed to get pcie config_flags: %d\n", ret);
1585 return ret; 1517 return ret;
@@ -1587,9 +1519,10 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1587 1519
1588 pcie_config_flags &= ~PCIE_CONFIG_FLAG_ENABLE_L1; 1520 pcie_config_flags &= ~PCIE_CONFIG_FLAG_ENABLE_L1;
1589 1521
1590 ret = ath10k_pci_diag_write_access(ar, pcie_state_targ_addr + 1522 ret = ath10k_pci_diag_write32(ar, (pcie_state_targ_addr +
1591 offsetof(struct pcie_state, config_flags), 1523 offsetof(struct pcie_state,
1592 pcie_config_flags); 1524 config_flags)),
1525 pcie_config_flags);
1593 if (ret != 0) { 1526 if (ret != 0) {
1594 ath10k_err(ar, "Failed to write pcie config_flags: %d\n", ret); 1527 ath10k_err(ar, "Failed to write pcie config_flags: %d\n", ret);
1595 return ret; 1528 return ret;
@@ -1598,7 +1531,7 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1598 /* configure early allocation */ 1531 /* configure early allocation */
1599 ealloc_targ_addr = host_interest_item_address(HI_ITEM(hi_early_alloc)); 1532 ealloc_targ_addr = host_interest_item_address(HI_ITEM(hi_early_alloc));
1600 1533
1601 ret = ath10k_pci_diag_read_access(ar, ealloc_targ_addr, &ealloc_value); 1534 ret = ath10k_pci_diag_read32(ar, ealloc_targ_addr, &ealloc_value);
1602 if (ret != 0) { 1535 if (ret != 0) {
1603 ath10k_err(ar, "Faile to get early alloc val: %d\n", ret); 1536 ath10k_err(ar, "Faile to get early alloc val: %d\n", ret);
1604 return ret; 1537 return ret;
@@ -1610,7 +1543,7 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1610 ealloc_value |= ((1 << HI_EARLY_ALLOC_IRAM_BANKS_SHIFT) & 1543 ealloc_value |= ((1 << HI_EARLY_ALLOC_IRAM_BANKS_SHIFT) &
1611 HI_EARLY_ALLOC_IRAM_BANKS_MASK); 1544 HI_EARLY_ALLOC_IRAM_BANKS_MASK);
1612 1545
1613 ret = ath10k_pci_diag_write_access(ar, ealloc_targ_addr, ealloc_value); 1546 ret = ath10k_pci_diag_write32(ar, ealloc_targ_addr, ealloc_value);
1614 if (ret != 0) { 1547 if (ret != 0) {
1615 ath10k_err(ar, "Failed to set early alloc val: %d\n", ret); 1548 ath10k_err(ar, "Failed to set early alloc val: %d\n", ret);
1616 return ret; 1549 return ret;
@@ -1619,7 +1552,7 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1619 /* Tell Target to proceed with initialization */ 1552 /* Tell Target to proceed with initialization */
1620 flag2_targ_addr = host_interest_item_address(HI_ITEM(hi_option_flag2)); 1553 flag2_targ_addr = host_interest_item_address(HI_ITEM(hi_option_flag2));
1621 1554
1622 ret = ath10k_pci_diag_read_access(ar, flag2_targ_addr, &flag2_value); 1555 ret = ath10k_pci_diag_read32(ar, flag2_targ_addr, &flag2_value);
1623 if (ret != 0) { 1556 if (ret != 0) {
1624 ath10k_err(ar, "Failed to get option val: %d\n", ret); 1557 ath10k_err(ar, "Failed to get option val: %d\n", ret);
1625 return ret; 1558 return ret;
@@ -1627,7 +1560,7 @@ static int ath10k_pci_init_config(struct ath10k *ar)
1627 1560
1628 flag2_value |= HI_OPTION_EARLY_CFG_DONE; 1561 flag2_value |= HI_OPTION_EARLY_CFG_DONE;
1629 1562
1630 ret = ath10k_pci_diag_write_access(ar, flag2_targ_addr, flag2_value); 1563 ret = ath10k_pci_diag_write32(ar, flag2_targ_addr, flag2_value);
1631 if (ret != 0) { 1564 if (ret != 0) {
1632 ath10k_err(ar, "Failed to set option val: %d\n", ret); 1565 ath10k_err(ar, "Failed to set option val: %d\n", ret);
1633 return ret; 1566 return ret;
@@ -1692,7 +1625,7 @@ static int ath10k_pci_ce_init(struct ath10k *ar)
1692 continue; 1625 continue;
1693 } 1626 }
1694 1627
1695 pipe_info->buf_sz = (size_t) (attr->src_sz_max); 1628 pipe_info->buf_sz = (size_t)(attr->src_sz_max);
1696 } 1629 }
1697 1630
1698 return 0; 1631 return 0;
@@ -2228,7 +2161,7 @@ static int ath10k_pci_init_irq(struct ath10k *ar)
2228 if (ath10k_pci_irq_mode == ATH10K_PCI_IRQ_AUTO) { 2161 if (ath10k_pci_irq_mode == ATH10K_PCI_IRQ_AUTO) {
2229 ar_pci->num_msi_intrs = MSI_NUM_REQUEST; 2162 ar_pci->num_msi_intrs = MSI_NUM_REQUEST;
2230 ret = pci_enable_msi_range(ar_pci->pdev, ar_pci->num_msi_intrs, 2163 ret = pci_enable_msi_range(ar_pci->pdev, ar_pci->num_msi_intrs,
2231 ar_pci->num_msi_intrs); 2164 ar_pci->num_msi_intrs);
2232 if (ret > 0) 2165 if (ret > 0)
2233 return 0; 2166 return 0;
2234 2167
@@ -2554,6 +2487,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
2554 2487
2555err_free_irq: 2488err_free_irq:
2556 ath10k_pci_free_irq(ar); 2489 ath10k_pci_free_irq(ar);
2490 ath10k_pci_kill_tasklet(ar);
2557 2491
2558err_deinit_irq: 2492err_deinit_irq:
2559 ath10k_pci_deinit_irq(ar); 2493 ath10k_pci_deinit_irq(ar);
@@ -2590,6 +2524,7 @@ static void ath10k_pci_remove(struct pci_dev *pdev)
2590 2524
2591 ath10k_core_unregister(ar); 2525 ath10k_core_unregister(ar);
2592 ath10k_pci_free_irq(ar); 2526 ath10k_pci_free_irq(ar);
2527 ath10k_pci_kill_tasklet(ar);
2593 ath10k_pci_deinit_irq(ar); 2528 ath10k_pci_deinit_irq(ar);
2594 ath10k_pci_ce_deinit(ar); 2529 ath10k_pci_ce_deinit(ar);
2595 ath10k_pci_free_ce(ar); 2530 ath10k_pci_free_ce(ar);
diff --git a/drivers/net/wireless/ath/ath10k/rx_desc.h b/drivers/net/wireless/ath/ath10k/rx_desc.h
index 1c584c4b019c..e1ffdd57a18c 100644
--- a/drivers/net/wireless/ath/ath10k/rx_desc.h
+++ b/drivers/net/wireless/ath/ath10k/rx_desc.h
@@ -839,7 +839,6 @@ struct rx_ppdu_start {
839 * Reserved: HW should fill with 0, FW should ignore. 839 * Reserved: HW should fill with 0, FW should ignore.
840*/ 840*/
841 841
842
843#define RX_PPDU_END_FLAGS_PHY_ERR (1 << 0) 842#define RX_PPDU_END_FLAGS_PHY_ERR (1 << 0)
844#define RX_PPDU_END_FLAGS_RX_LOCATION (1 << 1) 843#define RX_PPDU_END_FLAGS_RX_LOCATION (1 << 1)
845#define RX_PPDU_END_FLAGS_TXBF_H_INFO (1 << 2) 844#define RX_PPDU_END_FLAGS_TXBF_H_INFO (1 << 2)
diff --git a/drivers/net/wireless/ath/ath10k/targaddrs.h b/drivers/net/wireless/ath/ath10k/targaddrs.h
index be7ba1e78afe..9d0ae30f9ff1 100644
--- a/drivers/net/wireless/ath/ath10k/targaddrs.h
+++ b/drivers/net/wireless/ath/ath10k/targaddrs.h
@@ -284,7 +284,6 @@ Fw Mode/SubMode Mask
284#define HI_OPTION_ALL_FW_SUBMODE_MASK 0xFF00 284#define HI_OPTION_ALL_FW_SUBMODE_MASK 0xFF00
285#define HI_OPTION_ALL_FW_SUBMODE_SHIFT 0x8 285#define HI_OPTION_ALL_FW_SUBMODE_SHIFT 0x8
286 286
287
288/* hi_option_flag2 options */ 287/* hi_option_flag2 options */
289#define HI_OPTION_OFFLOAD_AMSDU 0x01 288#define HI_OPTION_OFFLOAD_AMSDU 0x01
290#define HI_OPTION_DFS_SUPPORT 0x02 /* Enable DFS support */ 289#define HI_OPTION_DFS_SUPPORT 0x02 /* Enable DFS support */
diff --git a/drivers/net/wireless/ath/ath10k/testmode.c b/drivers/net/wireless/ath/ath10k/testmode.c
new file mode 100644
index 000000000000..483db9cb8c96
--- /dev/null
+++ b/drivers/net/wireless/ath/ath10k/testmode.c
@@ -0,0 +1,382 @@
1/*
2 * Copyright (c) 2014 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 "testmode.h"
18
19#include <net/netlink.h>
20#include <linux/firmware.h>
21
22#include "debug.h"
23#include "wmi.h"
24#include "hif.h"
25#include "hw.h"
26
27#include "testmode_i.h"
28
29static const struct nla_policy ath10k_tm_policy[ATH10K_TM_ATTR_MAX + 1] = {
30 [ATH10K_TM_ATTR_CMD] = { .type = NLA_U32 },
31 [ATH10K_TM_ATTR_DATA] = { .type = NLA_BINARY,
32 .len = ATH10K_TM_DATA_MAX_LEN },
33 [ATH10K_TM_ATTR_WMI_CMDID] = { .type = NLA_U32 },
34 [ATH10K_TM_ATTR_VERSION_MAJOR] = { .type = NLA_U32 },
35 [ATH10K_TM_ATTR_VERSION_MINOR] = { .type = NLA_U32 },
36};
37
38/* Returns true if callee consumes the skb and the skb should be discarded.
39 * Returns false if skb is not used. Does not sleep.
40 */
41bool ath10k_tm_event_wmi(struct ath10k *ar, u32 cmd_id, struct sk_buff *skb)
42{
43 struct sk_buff *nl_skb;
44 bool consumed;
45 int ret;
46
47 ath10k_dbg(ar, ATH10K_DBG_TESTMODE,
48 "testmode event wmi cmd_id %d skb %p skb->len %d\n",
49 cmd_id, skb, skb->len);
50
51 ath10k_dbg_dump(ar, ATH10K_DBG_TESTMODE, NULL, "", skb->data, skb->len);
52
53 spin_lock_bh(&ar->data_lock);
54
55 if (!ar->testmode.utf_monitor) {
56 consumed = false;
57 goto out;
58 }
59
60 /* Only testmode.c should be handling events from utf firmware,
61 * otherwise all sort of problems will arise as mac80211 operations
62 * are not initialised.
63 */
64 consumed = true;
65
66 nl_skb = cfg80211_testmode_alloc_event_skb(ar->hw->wiphy,
67 2 * sizeof(u32) + skb->len,
68 GFP_ATOMIC);
69 if (!nl_skb) {
70 ath10k_warn(ar,
71 "failed to allocate skb for testmode wmi event\n");
72 goto out;
73 }
74
75 ret = nla_put_u32(nl_skb, ATH10K_TM_ATTR_CMD, ATH10K_TM_CMD_WMI);
76 if (ret) {
77 ath10k_warn(ar,
78 "failed to to put testmode wmi event cmd attribute: %d\n",
79 ret);
80 kfree_skb(nl_skb);
81 goto out;
82 }
83
84 ret = nla_put_u32(nl_skb, ATH10K_TM_ATTR_WMI_CMDID, cmd_id);
85 if (ret) {
86 ath10k_warn(ar,
87 "failed to to put testmode wmi even cmd_id: %d\n",
88 ret);
89 kfree_skb(nl_skb);
90 goto out;
91 }
92
93 ret = nla_put(nl_skb, ATH10K_TM_ATTR_DATA, skb->len, skb->data);
94 if (ret) {
95 ath10k_warn(ar,
96 "failed to copy skb to testmode wmi event: %d\n",
97 ret);
98 kfree_skb(nl_skb);
99 goto out;
100 }
101
102 cfg80211_testmode_event(nl_skb, GFP_ATOMIC);
103
104out:
105 spin_unlock_bh(&ar->data_lock);
106
107 return consumed;
108}
109
110static int ath10k_tm_cmd_get_version(struct ath10k *ar, struct nlattr *tb[])
111{
112 struct sk_buff *skb;
113 int ret;
114
115 ath10k_dbg(ar, ATH10K_DBG_TESTMODE,
116 "testmode cmd get version_major %d version_minor %d\n",
117 ATH10K_TESTMODE_VERSION_MAJOR,
118 ATH10K_TESTMODE_VERSION_MINOR);
119
120 skb = cfg80211_testmode_alloc_reply_skb(ar->hw->wiphy,
121 nla_total_size(sizeof(u32)));
122 if (!skb)
123 return -ENOMEM;
124
125 ret = nla_put_u32(skb, ATH10K_TM_ATTR_VERSION_MAJOR,
126 ATH10K_TESTMODE_VERSION_MAJOR);
127 if (ret) {
128 kfree_skb(skb);
129 return ret;
130 }
131
132 ret = nla_put_u32(skb, ATH10K_TM_ATTR_VERSION_MINOR,
133 ATH10K_TESTMODE_VERSION_MINOR);
134 if (ret) {
135 kfree_skb(skb);
136 return ret;
137 }
138
139 return cfg80211_testmode_reply(skb);
140}
141
142static int ath10k_tm_cmd_utf_start(struct ath10k *ar, struct nlattr *tb[])
143{
144 char filename[100];
145 int ret;
146
147 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode cmd utf start\n");
148
149 mutex_lock(&ar->conf_mutex);
150
151 if (ar->state == ATH10K_STATE_UTF) {
152 ret = -EALREADY;
153 goto err;
154 }
155
156 /* start utf only when the driver is not in use */
157 if (ar->state != ATH10K_STATE_OFF) {
158 ret = -EBUSY;
159 goto err;
160 }
161
162 if (WARN_ON(ar->testmode.utf != NULL)) {
163 /* utf image is already downloaded, it shouldn't be */
164 ret = -EEXIST;
165 goto err;
166 }
167
168 snprintf(filename, sizeof(filename), "%s/%s",
169 ar->hw_params.fw.dir, ATH10K_FW_UTF_FILE);
170
171 /* load utf firmware image */
172 ret = request_firmware(&ar->testmode.utf, filename, ar->dev);
173 if (ret) {
174 ath10k_warn(ar, "failed to retrieve utf firmware '%s': %d\n",
175 filename, ret);
176 goto err;
177 }
178
179 spin_lock_bh(&ar->data_lock);
180
181 ar->testmode.utf_monitor = true;
182
183 spin_unlock_bh(&ar->data_lock);
184
185 BUILD_BUG_ON(sizeof(ar->fw_features) !=
186 sizeof(ar->testmode.orig_fw_features));
187
188 memcpy(ar->testmode.orig_fw_features, ar->fw_features,
189 sizeof(ar->fw_features));
190
191 /* utf.bin firmware image does not advertise firmware features. Do
192 * an ugly hack where we force the firmware features so that wmi.c
193 * will use the correct WMI interface.
194 */
195 memset(ar->fw_features, 0, sizeof(ar->fw_features));
196 __set_bit(ATH10K_FW_FEATURE_WMI_10X, ar->fw_features);
197
198 ret = ath10k_hif_power_up(ar);
199 if (ret) {
200 ath10k_err(ar, "failed to power up hif (testmode): %d\n", ret);
201 ar->state = ATH10K_STATE_OFF;
202 goto err_fw_features;
203 }
204
205 ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_UTF);
206 if (ret) {
207 ath10k_err(ar, "failed to start core (testmode): %d\n", ret);
208 ar->state = ATH10K_STATE_OFF;
209 goto err_power_down;
210 }
211
212 ar->state = ATH10K_STATE_UTF;
213
214 ath10k_info(ar, "UTF firmware started\n");
215
216 mutex_unlock(&ar->conf_mutex);
217
218 return 0;
219
220err_power_down:
221 ath10k_hif_power_down(ar);
222
223err_fw_features:
224 /* return the original firmware features */
225 memcpy(ar->fw_features, ar->testmode.orig_fw_features,
226 sizeof(ar->fw_features));
227
228 release_firmware(ar->testmode.utf);
229 ar->testmode.utf = NULL;
230
231err:
232 mutex_unlock(&ar->conf_mutex);
233
234 return ret;
235}
236
237static void __ath10k_tm_cmd_utf_stop(struct ath10k *ar)
238{
239 lockdep_assert_held(&ar->conf_mutex);
240
241 ath10k_core_stop(ar);
242 ath10k_hif_power_down(ar);
243
244 spin_lock_bh(&ar->data_lock);
245
246 ar->testmode.utf_monitor = false;
247
248 spin_unlock_bh(&ar->data_lock);
249
250 /* return the original firmware features */
251 memcpy(ar->fw_features, ar->testmode.orig_fw_features,
252 sizeof(ar->fw_features));
253
254 release_firmware(ar->testmode.utf);
255 ar->testmode.utf = NULL;
256
257 ar->state = ATH10K_STATE_OFF;
258}
259
260static int ath10k_tm_cmd_utf_stop(struct ath10k *ar, struct nlattr *tb[])
261{
262 int ret;
263
264 ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode cmd utf stop\n");
265
266 mutex_lock(&ar->conf_mutex);
267
268 if (ar->state != ATH10K_STATE_UTF) {
269 ret = -ENETDOWN;
270 goto out;
271 }
272
273 __ath10k_tm_cmd_utf_stop(ar);
274
275 ret = 0;
276
277 ath10k_info(ar, "UTF firmware stopped\n");
278
279out:
280 mutex_unlock(&ar->conf_mutex);
281 return ret;
282}
283
284static int ath10k_tm_cmd_wmi(struct ath10k *ar, struct nlattr *tb[])
285{
286 struct sk_buff *skb;
287 int ret, buf_len;
288 u32 cmd_id;
289 void *buf;
290
291 mutex_lock(&ar->conf_mutex);
292
293 if (ar->state != ATH10K_STATE_UTF) {
294 ret = -ENETDOWN;
295 goto out;
296 }
297
298 if (!tb[ATH10K_TM_ATTR_DATA]) {
299 ret = -EINVAL;
300 goto out;
301 }
302
303 if (!tb[ATH10K_TM_ATTR_WMI_CMDID]) {
304 ret = -EINVAL;
305 goto out;
306 }
307
308 buf = nla_data(tb[ATH10K_TM_ATTR_DATA]);
309 buf_len = nla_len(tb[ATH10K_TM_ATTR_DATA]);
310 cmd_id = nla_get_u32(tb[ATH10K_TM_ATTR_WMI_CMDID]);
311
312 ath10k_dbg(ar, ATH10K_DBG_TESTMODE,
313 "testmode cmd wmi cmd_id %d buf %p buf_len %d\n",
314 cmd_id, buf, buf_len);
315
316 ath10k_dbg_dump(ar, ATH10K_DBG_TESTMODE, NULL, "", buf, buf_len);
317
318 skb = ath10k_wmi_alloc_skb(ar, buf_len);
319 if (!skb) {
320 ret = -ENOMEM;
321 goto out;
322 }
323
324 memcpy(skb->data, buf, buf_len);
325
326 ret = ath10k_wmi_cmd_send(ar, skb, cmd_id);
327 if (ret) {
328 ath10k_warn(ar, "failed to transmit wmi command (testmode): %d\n",
329 ret);
330 goto out;
331 }
332
333 ret = 0;
334
335out:
336 mutex_unlock(&ar->conf_mutex);
337 return ret;
338}
339
340int ath10k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
341 void *data, int len)
342{
343 struct ath10k *ar = hw->priv;
344 struct nlattr *tb[ATH10K_TM_ATTR_MAX + 1];
345 int ret;
346
347 ret = nla_parse(tb, ATH10K_TM_ATTR_MAX, data, len,
348 ath10k_tm_policy);
349 if (ret)
350 return ret;
351
352 if (!tb[ATH10K_TM_ATTR_CMD])
353 return -EINVAL;
354
355 switch (nla_get_u32(tb[ATH10K_TM_ATTR_CMD])) {
356 case ATH10K_TM_CMD_GET_VERSION:
357 return ath10k_tm_cmd_get_version(ar, tb);
358 case ATH10K_TM_CMD_UTF_START:
359 return ath10k_tm_cmd_utf_start(ar, tb);
360 case ATH10K_TM_CMD_UTF_STOP:
361 return ath10k_tm_cmd_utf_stop(ar, tb);
362 case ATH10K_TM_CMD_WMI:
363 return ath10k_tm_cmd_wmi(ar, tb);
364 default:
365 return -EOPNOTSUPP;
366 }
367}
368
369void ath10k_testmode_destroy(struct ath10k *ar)
370{
371 mutex_lock(&ar->conf_mutex);
372
373 if (ar->state != ATH10K_STATE_UTF) {
374 /* utf firmware is not running, nothing to do */
375 goto out;
376 }
377
378 __ath10k_tm_cmd_utf_stop(ar);
379
380out:
381 mutex_unlock(&ar->conf_mutex);
382}
diff --git a/drivers/net/wireless/ath/ath10k/testmode.h b/drivers/net/wireless/ath/ath10k/testmode.h
new file mode 100644
index 000000000000..9cdd150815db
--- /dev/null
+++ b/drivers/net/wireless/ath/ath10k/testmode.h
@@ -0,0 +1,46 @@
1/*
2 * Copyright (c) 2014 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 "core.h"
18
19#ifdef CONFIG_NL80211_TESTMODE
20
21void ath10k_testmode_destroy(struct ath10k *ar);
22
23bool ath10k_tm_event_wmi(struct ath10k *ar, u32 cmd_id, struct sk_buff *skb);
24int ath10k_tm_cmd(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
25 void *data, int len);
26
27#else
28
29static inline void ath10k_testmode_destroy(struct ath10k *ar)
30{
31}
32
33static inline bool ath10k_tm_event_wmi(struct ath10k *ar, u32 cmd_id,
34 struct sk_buff *skb)
35{
36 return false;
37}
38
39static inline int ath10k_tm_cmd(struct ieee80211_hw *hw,
40 struct ieee80211_vif *vif,
41 void *data, int len)
42{
43 return 0;
44}
45
46#endif
diff --git a/drivers/net/wireless/ath/ath10k/testmode_i.h b/drivers/net/wireless/ath/ath10k/testmode_i.h
new file mode 100644
index 000000000000..ba81bf66ce85
--- /dev/null
+++ b/drivers/net/wireless/ath/ath10k/testmode_i.h
@@ -0,0 +1,70 @@
1/*
2 * Copyright (c) 2014 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/* "API" level of the ath10k testmode interface. Bump it after every
18 * incompatible interface change.
19 */
20#define ATH10K_TESTMODE_VERSION_MAJOR 1
21
22/* Bump this after every _compatible_ interface change, for example
23 * addition of a new command or an attribute.
24 */
25#define ATH10K_TESTMODE_VERSION_MINOR 0
26
27#define ATH10K_TM_DATA_MAX_LEN 5000
28
29enum ath10k_tm_attr {
30 __ATH10K_TM_ATTR_INVALID = 0,
31 ATH10K_TM_ATTR_CMD = 1,
32 ATH10K_TM_ATTR_DATA = 2,
33 ATH10K_TM_ATTR_WMI_CMDID = 3,
34 ATH10K_TM_ATTR_VERSION_MAJOR = 4,
35 ATH10K_TM_ATTR_VERSION_MINOR = 5,
36
37 /* keep last */
38 __ATH10K_TM_ATTR_AFTER_LAST,
39 ATH10K_TM_ATTR_MAX = __ATH10K_TM_ATTR_AFTER_LAST - 1,
40};
41
42/* All ath10k testmode interface commands specified in
43 * ATH10K_TM_ATTR_CMD
44 */
45enum ath10k_tm_cmd {
46 /* Returns the supported ath10k testmode interface version in
47 * ATH10K_TM_ATTR_VERSION. Always guaranteed to work. User space
48 * uses this to verify it's using the correct version of the
49 * testmode interface
50 */
51 ATH10K_TM_CMD_GET_VERSION = 0,
52
53 /* Boots the UTF firmware, the netdev interface must be down at the
54 * time.
55 */
56 ATH10K_TM_CMD_UTF_START = 1,
57
58 /* Shuts down the UTF firmware and puts the driver back into OFF
59 * state.
60 */
61 ATH10K_TM_CMD_UTF_STOP = 2,
62
63 /* The command used to transmit a WMI command to the firmware and
64 * the event to receive WMI events from the firmware. Without
65 * struct wmi_cmd_hdr header, only the WMI payload. Command id is
66 * provided with ATH10K_TM_ATTR_WMI_CMDID and payload in
67 * ATH10K_TM_ATTR_DATA.
68 */
69 ATH10K_TM_CMD_WMI = 3,
70};
diff --git a/drivers/net/wireless/ath/ath10k/trace.h b/drivers/net/wireless/ath/ath10k/trace.h
index 4eb2ecbc06ef..574b75ab2609 100644
--- a/drivers/net/wireless/ath/ath10k/trace.h
+++ b/drivers/net/wireless/ath/ath10k/trace.h
@@ -18,6 +18,7 @@
18#if !defined(_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ) 18#if !defined(_TRACE_H_) || defined(TRACE_HEADER_MULTI_READ)
19 19
20#include <linux/tracepoint.h> 20#include <linux/tracepoint.h>
21#include "core.h"
21 22
22#define _TRACE_H_ 23#define _TRACE_H_
23 24
@@ -39,59 +40,79 @@ static inline void trace_ ## name(proto) {}
39#define ATH10K_MSG_MAX 200 40#define ATH10K_MSG_MAX 200
40 41
41DECLARE_EVENT_CLASS(ath10k_log_event, 42DECLARE_EVENT_CLASS(ath10k_log_event,
42 TP_PROTO(struct va_format *vaf), 43 TP_PROTO(struct ath10k *ar, struct va_format *vaf),
43 TP_ARGS(vaf), 44 TP_ARGS(ar, vaf),
44 TP_STRUCT__entry( 45 TP_STRUCT__entry(
46 __string(device, dev_name(ar->dev))
47 __string(driver, dev_driver_string(ar->dev))
45 __dynamic_array(char, msg, ATH10K_MSG_MAX) 48 __dynamic_array(char, msg, ATH10K_MSG_MAX)
46 ), 49 ),
47 TP_fast_assign( 50 TP_fast_assign(
51 __assign_str(device, dev_name(ar->dev));
52 __assign_str(driver, dev_driver_string(ar->dev));
48 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 53 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
49 ATH10K_MSG_MAX, 54 ATH10K_MSG_MAX,
50 vaf->fmt, 55 vaf->fmt,
51 *vaf->va) >= ATH10K_MSG_MAX); 56 *vaf->va) >= ATH10K_MSG_MAX);
52 ), 57 ),
53 TP_printk("%s", __get_str(msg)) 58 TP_printk(
59 "%s %s %s",
60 __get_str(driver),
61 __get_str(device),
62 __get_str(msg)
63 )
54); 64);
55 65
56DEFINE_EVENT(ath10k_log_event, ath10k_log_err, 66DEFINE_EVENT(ath10k_log_event, ath10k_log_err,
57 TP_PROTO(struct va_format *vaf), 67 TP_PROTO(struct ath10k *ar, struct va_format *vaf),
58 TP_ARGS(vaf) 68 TP_ARGS(ar, vaf)
59); 69);
60 70
61DEFINE_EVENT(ath10k_log_event, ath10k_log_warn, 71DEFINE_EVENT(ath10k_log_event, ath10k_log_warn,
62 TP_PROTO(struct va_format *vaf), 72 TP_PROTO(struct ath10k *ar, struct va_format *vaf),
63 TP_ARGS(vaf) 73 TP_ARGS(ar, vaf)
64); 74);
65 75
66DEFINE_EVENT(ath10k_log_event, ath10k_log_info, 76DEFINE_EVENT(ath10k_log_event, ath10k_log_info,
67 TP_PROTO(struct va_format *vaf), 77 TP_PROTO(struct ath10k *ar, struct va_format *vaf),
68 TP_ARGS(vaf) 78 TP_ARGS(ar, vaf)
69); 79);
70 80
71TRACE_EVENT(ath10k_log_dbg, 81TRACE_EVENT(ath10k_log_dbg,
72 TP_PROTO(unsigned int level, struct va_format *vaf), 82 TP_PROTO(struct ath10k *ar, unsigned int level, struct va_format *vaf),
73 TP_ARGS(level, vaf), 83 TP_ARGS(ar, level, vaf),
74 TP_STRUCT__entry( 84 TP_STRUCT__entry(
85 __string(device, dev_name(ar->dev))
86 __string(driver, dev_driver_string(ar->dev))
75 __field(unsigned int, level) 87 __field(unsigned int, level)
76 __dynamic_array(char, msg, ATH10K_MSG_MAX) 88 __dynamic_array(char, msg, ATH10K_MSG_MAX)
77 ), 89 ),
78 TP_fast_assign( 90 TP_fast_assign(
91 __assign_str(device, dev_name(ar->dev));
92 __assign_str(driver, dev_driver_string(ar->dev));
79 __entry->level = level; 93 __entry->level = level;
80 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg), 94 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
81 ATH10K_MSG_MAX, 95 ATH10K_MSG_MAX,
82 vaf->fmt, 96 vaf->fmt,
83 *vaf->va) >= ATH10K_MSG_MAX); 97 *vaf->va) >= ATH10K_MSG_MAX);
84 ), 98 ),
85 TP_printk("%s", __get_str(msg)) 99 TP_printk(
100 "%s %s %s",
101 __get_str(driver),
102 __get_str(device),
103 __get_str(msg)
104 )
86); 105);
87 106
88TRACE_EVENT(ath10k_log_dbg_dump, 107TRACE_EVENT(ath10k_log_dbg_dump,
89 TP_PROTO(const char *msg, const char *prefix, 108 TP_PROTO(struct ath10k *ar, const char *msg, const char *prefix,
90 const void *buf, size_t buf_len), 109 const void *buf, size_t buf_len),
91 110
92 TP_ARGS(msg, prefix, buf, buf_len), 111 TP_ARGS(ar, msg, prefix, buf, buf_len),
93 112
94 TP_STRUCT__entry( 113 TP_STRUCT__entry(
114 __string(device, dev_name(ar->dev))
115 __string(driver, dev_driver_string(ar->dev))
95 __string(msg, msg) 116 __string(msg, msg)
96 __string(prefix, prefix) 117 __string(prefix, prefix)
97 __field(size_t, buf_len) 118 __field(size_t, buf_len)
@@ -99,6 +120,8 @@ TRACE_EVENT(ath10k_log_dbg_dump,
99 ), 120 ),
100 121
101 TP_fast_assign( 122 TP_fast_assign(
123 __assign_str(device, dev_name(ar->dev));
124 __assign_str(driver, dev_driver_string(ar->dev));
102 __assign_str(msg, msg); 125 __assign_str(msg, msg);
103 __assign_str(prefix, prefix); 126 __assign_str(prefix, prefix);
104 __entry->buf_len = buf_len; 127 __entry->buf_len = buf_len;
@@ -106,16 +129,22 @@ TRACE_EVENT(ath10k_log_dbg_dump,
106 ), 129 ),
107 130
108 TP_printk( 131 TP_printk(
109 "%s/%s\n", __get_str(prefix), __get_str(msg) 132 "%s %s %s/%s\n",
133 __get_str(driver),
134 __get_str(device),
135 __get_str(prefix),
136 __get_str(msg)
110 ) 137 )
111); 138);
112 139
113TRACE_EVENT(ath10k_wmi_cmd, 140TRACE_EVENT(ath10k_wmi_cmd,
114 TP_PROTO(int id, void *buf, size_t buf_len, int ret), 141 TP_PROTO(struct ath10k *ar, int id, void *buf, size_t buf_len, int ret),
115 142
116 TP_ARGS(id, buf, buf_len, ret), 143 TP_ARGS(ar, id, buf, buf_len, ret),
117 144
118 TP_STRUCT__entry( 145 TP_STRUCT__entry(
146 __string(device, dev_name(ar->dev))
147 __string(driver, dev_driver_string(ar->dev))
119 __field(unsigned int, id) 148 __field(unsigned int, id)
120 __field(size_t, buf_len) 149 __field(size_t, buf_len)
121 __dynamic_array(u8, buf, buf_len) 150 __dynamic_array(u8, buf, buf_len)
@@ -123,6 +152,8 @@ TRACE_EVENT(ath10k_wmi_cmd,
123 ), 152 ),
124 153
125 TP_fast_assign( 154 TP_fast_assign(
155 __assign_str(device, dev_name(ar->dev));
156 __assign_str(driver, dev_driver_string(ar->dev));
126 __entry->id = id; 157 __entry->id = id;
127 __entry->buf_len = buf_len; 158 __entry->buf_len = buf_len;
128 __entry->ret = ret; 159 __entry->ret = ret;
@@ -130,7 +161,9 @@ TRACE_EVENT(ath10k_wmi_cmd,
130 ), 161 ),
131 162
132 TP_printk( 163 TP_printk(
133 "id %d len %zu ret %d", 164 "%s %s id %d len %zu ret %d",
165 __get_str(driver),
166 __get_str(device),
134 __entry->id, 167 __entry->id,
135 __entry->buf_len, 168 __entry->buf_len,
136 __entry->ret 169 __entry->ret
@@ -138,67 +171,85 @@ TRACE_EVENT(ath10k_wmi_cmd,
138); 171);
139 172
140TRACE_EVENT(ath10k_wmi_event, 173TRACE_EVENT(ath10k_wmi_event,
141 TP_PROTO(int id, void *buf, size_t buf_len), 174 TP_PROTO(struct ath10k *ar, int id, void *buf, size_t buf_len),
142 175
143 TP_ARGS(id, buf, buf_len), 176 TP_ARGS(ar, id, buf, buf_len),
144 177
145 TP_STRUCT__entry( 178 TP_STRUCT__entry(
179 __string(device, dev_name(ar->dev))
180 __string(driver, dev_driver_string(ar->dev))
146 __field(unsigned int, id) 181 __field(unsigned int, id)
147 __field(size_t, buf_len) 182 __field(size_t, buf_len)
148 __dynamic_array(u8, buf, buf_len) 183 __dynamic_array(u8, buf, buf_len)
149 ), 184 ),
150 185
151 TP_fast_assign( 186 TP_fast_assign(
187 __assign_str(device, dev_name(ar->dev));
188 __assign_str(driver, dev_driver_string(ar->dev));
152 __entry->id = id; 189 __entry->id = id;
153 __entry->buf_len = buf_len; 190 __entry->buf_len = buf_len;
154 memcpy(__get_dynamic_array(buf), buf, buf_len); 191 memcpy(__get_dynamic_array(buf), buf, buf_len);
155 ), 192 ),
156 193
157 TP_printk( 194 TP_printk(
158 "id %d len %zu", 195 "%s %s id %d len %zu",
196 __get_str(driver),
197 __get_str(device),
159 __entry->id, 198 __entry->id,
160 __entry->buf_len 199 __entry->buf_len
161 ) 200 )
162); 201);
163 202
164TRACE_EVENT(ath10k_htt_stats, 203TRACE_EVENT(ath10k_htt_stats,
165 TP_PROTO(void *buf, size_t buf_len), 204 TP_PROTO(struct ath10k *ar, void *buf, size_t buf_len),
166 205
167 TP_ARGS(buf, buf_len), 206 TP_ARGS(ar, buf, buf_len),
168 207
169 TP_STRUCT__entry( 208 TP_STRUCT__entry(
209 __string(device, dev_name(ar->dev))
210 __string(driver, dev_driver_string(ar->dev))
170 __field(size_t, buf_len) 211 __field(size_t, buf_len)
171 __dynamic_array(u8, buf, buf_len) 212 __dynamic_array(u8, buf, buf_len)
172 ), 213 ),
173 214
174 TP_fast_assign( 215 TP_fast_assign(
216 __assign_str(device, dev_name(ar->dev));
217 __assign_str(driver, dev_driver_string(ar->dev));
175 __entry->buf_len = buf_len; 218 __entry->buf_len = buf_len;
176 memcpy(__get_dynamic_array(buf), buf, buf_len); 219 memcpy(__get_dynamic_array(buf), buf, buf_len);
177 ), 220 ),
178 221
179 TP_printk( 222 TP_printk(
180 "len %zu", 223 "%s %s len %zu",
224 __get_str(driver),
225 __get_str(device),
181 __entry->buf_len 226 __entry->buf_len
182 ) 227 )
183); 228);
184 229
185TRACE_EVENT(ath10k_wmi_dbglog, 230TRACE_EVENT(ath10k_wmi_dbglog,
186 TP_PROTO(void *buf, size_t buf_len), 231 TP_PROTO(struct ath10k *ar, void *buf, size_t buf_len),
187 232
188 TP_ARGS(buf, buf_len), 233 TP_ARGS(ar, buf, buf_len),
189 234
190 TP_STRUCT__entry( 235 TP_STRUCT__entry(
236 __string(device, dev_name(ar->dev))
237 __string(driver, dev_driver_string(ar->dev))
191 __field(size_t, buf_len) 238 __field(size_t, buf_len)
192 __dynamic_array(u8, buf, buf_len) 239 __dynamic_array(u8, buf, buf_len)
193 ), 240 ),
194 241
195 TP_fast_assign( 242 TP_fast_assign(
243 __assign_str(device, dev_name(ar->dev));
244 __assign_str(driver, dev_driver_string(ar->dev));
196 __entry->buf_len = buf_len; 245 __entry->buf_len = buf_len;
197 memcpy(__get_dynamic_array(buf), buf, buf_len); 246 memcpy(__get_dynamic_array(buf), buf, buf_len);
198 ), 247 ),
199 248
200 TP_printk( 249 TP_printk(
201 "len %zu", 250 "%s %s len %zu",
251 __get_str(driver),
252 __get_str(device),
202 __entry->buf_len 253 __entry->buf_len
203 ) 254 )
204); 255);
diff --git a/drivers/net/wireless/ath/ath10k/txrx.c b/drivers/net/wireless/ath/ath10k/txrx.c
index 2eeec8a63d5c..a0cbc21d0d4b 100644
--- a/drivers/net/wireless/ath/ath10k/txrx.c
+++ b/drivers/net/wireless/ath/ath10k/txrx.c
@@ -178,7 +178,7 @@ void ath10k_peer_map_event(struct ath10k_htt *htt,
178 goto exit; 178 goto exit;
179 179
180 peer->vdev_id = ev->vdev_id; 180 peer->vdev_id = ev->vdev_id;
181 memcpy(peer->addr, ev->addr, ETH_ALEN); 181 ether_addr_copy(peer->addr, ev->addr);
182 list_add(&peer->list, &ar->peers); 182 list_add(&peer->list, &ar->peers);
183 wake_up(&ar->peer_mapping_wq); 183 wake_up(&ar->peer_mapping_wq);
184 } 184 }
diff --git a/drivers/net/wireless/ath/ath10k/wmi.c b/drivers/net/wireless/ath/ath10k/wmi.c
index e500a3cc905e..2c42bd504b79 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.c
+++ b/drivers/net/wireless/ath/ath10k/wmi.c
@@ -23,6 +23,7 @@
23#include "debug.h" 23#include "debug.h"
24#include "wmi.h" 24#include "wmi.h"
25#include "mac.h" 25#include "mac.h"
26#include "testmode.h"
26 27
27/* MAIN WMI cmd track */ 28/* MAIN WMI cmd track */
28static struct wmi_cmd_map wmi_cmd_map = { 29static struct wmi_cmd_map wmi_cmd_map = {
@@ -611,6 +612,7 @@ static struct wmi_cmd_map wmi_10_2_cmd_map = {
611int ath10k_wmi_wait_for_service_ready(struct ath10k *ar) 612int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
612{ 613{
613 int ret; 614 int ret;
615
614 ret = wait_for_completion_timeout(&ar->wmi.service_ready, 616 ret = wait_for_completion_timeout(&ar->wmi.service_ready,
615 WMI_SERVICE_READY_TIMEOUT_HZ); 617 WMI_SERVICE_READY_TIMEOUT_HZ);
616 return ret; 618 return ret;
@@ -619,12 +621,13 @@ int ath10k_wmi_wait_for_service_ready(struct ath10k *ar)
619int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar) 621int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar)
620{ 622{
621 int ret; 623 int ret;
624
622 ret = wait_for_completion_timeout(&ar->wmi.unified_ready, 625 ret = wait_for_completion_timeout(&ar->wmi.unified_ready,
623 WMI_UNIFIED_READY_TIMEOUT_HZ); 626 WMI_UNIFIED_READY_TIMEOUT_HZ);
624 return ret; 627 return ret;
625} 628}
626 629
627static struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len) 630struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len)
628{ 631{
629 struct sk_buff *skb; 632 struct sk_buff *skb;
630 u32 round_len = roundup(len, 4); 633 u32 round_len = roundup(len, 4);
@@ -666,7 +669,7 @@ static int ath10k_wmi_cmd_send_nowait(struct ath10k *ar, struct sk_buff *skb,
666 669
667 memset(skb_cb, 0, sizeof(*skb_cb)); 670 memset(skb_cb, 0, sizeof(*skb_cb));
668 ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb); 671 ret = ath10k_htc_send(&ar->htc, ar->wmi.eid, skb);
669 trace_ath10k_wmi_cmd(cmd_id, skb->data, skb->len, ret); 672 trace_ath10k_wmi_cmd(ar, cmd_id, skb->data, skb->len, ret);
670 673
671 if (ret) 674 if (ret)
672 goto err_pull; 675 goto err_pull;
@@ -725,8 +728,7 @@ static void ath10k_wmi_op_ep_tx_credits(struct ath10k *ar)
725 wake_up(&ar->wmi.tx_credits_wq); 728 wake_up(&ar->wmi.tx_credits_wq);
726} 729}
727 730
728static int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, 731int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
729 u32 cmd_id)
730{ 732{
731 int ret = -EOPNOTSUPP; 733 int ret = -EOPNOTSUPP;
732 734
@@ -792,7 +794,7 @@ int ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *skb)
792 cmd->hdr.tx_power = 0; 794 cmd->hdr.tx_power = 0;
793 cmd->hdr.buf_len = __cpu_to_le32(buf_len); 795 cmd->hdr.buf_len = __cpu_to_le32(buf_len);
794 796
795 memcpy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr), ETH_ALEN); 797 ether_addr_copy(cmd->hdr.peer_macaddr.addr, ieee80211_get_DA(hdr));
796 memcpy(cmd->buf, skb->data, skb->len); 798 memcpy(cmd->buf, skb->data, skb->len);
797 799
798 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %p len %d ftype %02x stype %02x\n", 800 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi mgmt tx skb %p len %d ftype %02x stype %02x\n",
@@ -1288,7 +1290,7 @@ static int ath10k_wmi_event_debug_mesg(struct ath10k *ar, struct sk_buff *skb)
1288 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n", 1290 ath10k_dbg(ar, ATH10K_DBG_WMI, "wmi event debug mesg len %d\n",
1289 skb->len); 1291 skb->len);
1290 1292
1291 trace_ath10k_wmi_dbglog(skb->data, skb->len); 1293 trace_ath10k_wmi_dbglog(ar, skb->data, skb->len);
1292 1294
1293 return 0; 1295 return 0;
1294} 1296}
@@ -1384,6 +1386,8 @@ static void ath10k_wmi_update_tim(struct ath10k *ar,
1384 struct ieee80211_tim_ie *tim; 1386 struct ieee80211_tim_ie *tim;
1385 u8 *ies, *ie; 1387 u8 *ies, *ie;
1386 u8 ie_len, pvm_len; 1388 u8 ie_len, pvm_len;
1389 __le32 t;
1390 u32 v;
1387 1391
1388 /* if next SWBA has no tim_changed the tim_bitmap is garbage. 1392 /* if next SWBA has no tim_changed the tim_bitmap is garbage.
1389 * we must copy the bitmap upon change and reuse it later */ 1393 * we must copy the bitmap upon change and reuse it later */
@@ -1394,8 +1398,8 @@ static void ath10k_wmi_update_tim(struct ath10k *ar,
1394 sizeof(bcn_info->tim_info.tim_bitmap)); 1398 sizeof(bcn_info->tim_info.tim_bitmap));
1395 1399
1396 for (i = 0; i < sizeof(arvif->u.ap.tim_bitmap); i++) { 1400 for (i = 0; i < sizeof(arvif->u.ap.tim_bitmap); i++) {
1397 __le32 t = bcn_info->tim_info.tim_bitmap[i / 4]; 1401 t = bcn_info->tim_info.tim_bitmap[i / 4];
1398 u32 v = __le32_to_cpu(t); 1402 v = __le32_to_cpu(t);
1399 arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF; 1403 arvif->u.ap.tim_bitmap[i] = (v >> ((i % 4) * 8)) & 0xFF;
1400 } 1404 }
1401 1405
@@ -1511,7 +1515,6 @@ static u32 ath10k_p2p_calc_noa_ie_len(struct wmi_p2p_noa_info *noa)
1511 u8 opp_ps_info = noa->ctwindow_oppps; 1515 u8 opp_ps_info = noa->ctwindow_oppps;
1512 bool opps_enabled = !!(opp_ps_info & WMI_P2P_OPPPS_ENABLE_BIT); 1516 bool opps_enabled = !!(opp_ps_info & WMI_P2P_OPPPS_ENABLE_BIT);
1513 1517
1514
1515 if (!noa_descriptors && !opps_enabled) 1518 if (!noa_descriptors && !opps_enabled)
1516 return len; 1519 return len;
1517 1520
@@ -1568,7 +1571,6 @@ cleanup:
1568 kfree(old_data); 1571 kfree(old_data);
1569} 1572}
1570 1573
1571
1572static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb) 1574static void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
1573{ 1575{
1574 struct wmi_host_swba_event *ev; 1576 struct wmi_host_swba_event *ev;
@@ -1859,9 +1861,10 @@ static void ath10k_wmi_event_dfs(struct ath10k *ar,
1859 } 1861 }
1860} 1862}
1861 1863
1862static void ath10k_wmi_event_spectral_scan(struct ath10k *ar, 1864static void
1863 struct wmi_single_phyerr_rx_event *event, 1865ath10k_wmi_event_spectral_scan(struct ath10k *ar,
1864 u64 tsf) 1866 struct wmi_single_phyerr_rx_event *event,
1867 u64 tsf)
1865{ 1868{
1866 int buf_len, tlv_len, res, i = 0; 1869 int buf_len, tlv_len, res, i = 0;
1867 struct phyerr_tlv *tlv; 1870 struct phyerr_tlv *tlv;
@@ -1989,7 +1992,7 @@ static void ath10k_wmi_event_roam(struct ath10k *ar, struct sk_buff *skb)
1989} 1992}
1990 1993
1991static void ath10k_wmi_event_profile_match(struct ath10k *ar, 1994static void ath10k_wmi_event_profile_match(struct ath10k *ar,
1992 struct sk_buff *skb) 1995 struct sk_buff *skb)
1993{ 1996{
1994 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n"); 1997 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PROFILE_MATCH\n");
1995} 1998}
@@ -2040,13 +2043,13 @@ static void ath10k_wmi_event_wlan_profile_data(struct ath10k *ar,
2040} 2043}
2041 2044
2042static void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar, 2045static void ath10k_wmi_event_rtt_measurement_report(struct ath10k *ar,
2043 struct sk_buff *skb) 2046 struct sk_buff *skb)
2044{ 2047{
2045 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n"); 2048 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_RTT_MEASUREMENT_REPORT_EVENTID\n");
2046} 2049}
2047 2050
2048static void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar, 2051static void ath10k_wmi_event_tsf_measurement_report(struct ath10k *ar,
2049 struct sk_buff *skb) 2052 struct sk_buff *skb)
2050{ 2053{
2051 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n"); 2054 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_TSF_MEASUREMENT_REPORT_EVENTID\n");
2052} 2055}
@@ -2082,7 +2085,7 @@ static void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar,
2082} 2085}
2083 2086
2084static void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar, 2087static void ath10k_wmi_event_gtk_offload_status(struct ath10k *ar,
2085 struct sk_buff *skb) 2088 struct sk_buff *skb)
2086{ 2089{
2087 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n"); 2090 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_GTK_OFFLOAD_STATUS_EVENTID\n");
2088} 2091}
@@ -2106,7 +2109,7 @@ static void ath10k_wmi_event_addba_complete(struct ath10k *ar,
2106} 2109}
2107 2110
2108static void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar, 2111static void ath10k_wmi_event_vdev_install_key_complete(struct ath10k *ar,
2109 struct sk_buff *skb) 2112 struct sk_buff *skb)
2110{ 2113{
2111 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n"); 2114 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_VDEV_INSTALL_KEY_COMPLETE_EVENTID\n");
2112} 2115}
@@ -2130,7 +2133,7 @@ static void ath10k_wmi_event_vdev_resume_req(struct ath10k *ar,
2130} 2133}
2131 2134
2132static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id, 2135static int ath10k_wmi_alloc_host_mem(struct ath10k *ar, u32 req_id,
2133 u32 num_units, u32 unit_len) 2136 u32 num_units, u32 unit_len)
2134{ 2137{
2135 dma_addr_t paddr; 2138 dma_addr_t paddr;
2136 u32 pool_size; 2139 u32 pool_size;
@@ -2164,7 +2167,7 @@ static void ath10k_wmi_service_ready_event_rx(struct ath10k *ar,
2164 struct sk_buff *skb) 2167 struct sk_buff *skb)
2165{ 2168{
2166 struct wmi_service_ready_event *ev = (void *)skb->data; 2169 struct wmi_service_ready_event *ev = (void *)skb->data;
2167 DECLARE_BITMAP(svc_bmap, WMI_SERVICE_BM_SIZE) = {}; 2170 DECLARE_BITMAP(svc_bmap, WMI_SERVICE_MAX) = {};
2168 2171
2169 if (skb->len < sizeof(*ev)) { 2172 if (skb->len < sizeof(*ev)) {
2170 ath10k_warn(ar, "Service ready event was %d B but expected %zu B. Wrong firmware version?\n", 2173 ath10k_warn(ar, "Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
@@ -2241,7 +2244,7 @@ static void ath10k_wmi_10x_service_ready_event_rx(struct ath10k *ar,
2241 u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i; 2244 u32 num_units, req_id, unit_size, num_mem_reqs, num_unit_info, i;
2242 int ret; 2245 int ret;
2243 struct wmi_service_ready_event_10x *ev = (void *)skb->data; 2246 struct wmi_service_ready_event_10x *ev = (void *)skb->data;
2244 DECLARE_BITMAP(svc_bmap, WMI_SERVICE_BM_SIZE) = {}; 2247 DECLARE_BITMAP(svc_bmap, WMI_SERVICE_MAX) = {};
2245 2248
2246 if (skb->len < sizeof(*ev)) { 2249 if (skb->len < sizeof(*ev)) {
2247 ath10k_warn(ar, "Service ready event was %d B but expected %zu B. Wrong firmware version?\n", 2250 ath10k_warn(ar, "Service ready event was %d B but expected %zu B. Wrong firmware version?\n",
@@ -2347,7 +2350,7 @@ static int ath10k_wmi_ready_event_rx(struct ath10k *ar, struct sk_buff *skb)
2347 if (WARN_ON(skb->len < sizeof(*ev))) 2350 if (WARN_ON(skb->len < sizeof(*ev)))
2348 return -EINVAL; 2351 return -EINVAL;
2349 2352
2350 memcpy(ar->mac_addr, ev->mac_addr.addr, ETH_ALEN); 2353 ether_addr_copy(ar->mac_addr, ev->mac_addr.addr);
2351 2354
2352 ath10k_dbg(ar, ATH10K_DBG_WMI, 2355 ath10k_dbg(ar, ATH10K_DBG_WMI,
2353 "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d skb->len %i ev-sz %zu\n", 2356 "wmi event ready sw_version %u abi_version %u mac_addr %pM status %d skb->len %i ev-sz %zu\n",
@@ -2371,7 +2374,7 @@ static void ath10k_wmi_main_process_rx(struct ath10k *ar, struct sk_buff *skb)
2371 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 2374 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
2372 return; 2375 return;
2373 2376
2374 trace_ath10k_wmi_event(id, skb->data, skb->len); 2377 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
2375 2378
2376 switch (id) { 2379 switch (id) {
2377 case WMI_MGMT_RX_EVENTID: 2380 case WMI_MGMT_RX_EVENTID:
@@ -2480,6 +2483,7 @@ static void ath10k_wmi_10x_process_rx(struct ath10k *ar, struct sk_buff *skb)
2480{ 2483{
2481 struct wmi_cmd_hdr *cmd_hdr; 2484 struct wmi_cmd_hdr *cmd_hdr;
2482 enum wmi_10x_event_id id; 2485 enum wmi_10x_event_id id;
2486 bool consumed;
2483 2487
2484 cmd_hdr = (struct wmi_cmd_hdr *)skb->data; 2488 cmd_hdr = (struct wmi_cmd_hdr *)skb->data;
2485 id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID); 2489 id = MS(__le32_to_cpu(cmd_hdr->cmd_id), WMI_CMD_HDR_CMD_ID);
@@ -2487,7 +2491,19 @@ static void ath10k_wmi_10x_process_rx(struct ath10k *ar, struct sk_buff *skb)
2487 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 2491 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
2488 return; 2492 return;
2489 2493
2490 trace_ath10k_wmi_event(id, skb->data, skb->len); 2494 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
2495
2496 consumed = ath10k_tm_event_wmi(ar, id, skb);
2497
2498 /* Ready event must be handled normally also in UTF mode so that we
2499 * know the UTF firmware has booted, others we are just bypass WMI
2500 * events to testmode.
2501 */
2502 if (consumed && id != WMI_10X_READY_EVENTID) {
2503 ath10k_dbg(ar, ATH10K_DBG_WMI,
2504 "wmi testmode consumed 0x%x\n", id);
2505 goto out;
2506 }
2491 2507
2492 switch (id) { 2508 switch (id) {
2493 case WMI_10X_MGMT_RX_EVENTID: 2509 case WMI_10X_MGMT_RX_EVENTID:
@@ -2575,11 +2591,15 @@ static void ath10k_wmi_10x_process_rx(struct ath10k *ar, struct sk_buff *skb)
2575 case WMI_10X_READY_EVENTID: 2591 case WMI_10X_READY_EVENTID:
2576 ath10k_wmi_ready_event_rx(ar, skb); 2592 ath10k_wmi_ready_event_rx(ar, skb);
2577 break; 2593 break;
2594 case WMI_10X_PDEV_UTF_EVENTID:
2595 /* ignore utf events */
2596 break;
2578 default: 2597 default:
2579 ath10k_warn(ar, "Unknown eventid: %d\n", id); 2598 ath10k_warn(ar, "Unknown eventid: %d\n", id);
2580 break; 2599 break;
2581 } 2600 }
2582 2601
2602out:
2583 dev_kfree_skb(skb); 2603 dev_kfree_skb(skb);
2584} 2604}
2585 2605
@@ -2594,7 +2614,7 @@ static void ath10k_wmi_10_2_process_rx(struct ath10k *ar, struct sk_buff *skb)
2594 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL) 2614 if (skb_pull(skb, sizeof(struct wmi_cmd_hdr)) == NULL)
2595 return; 2615 return;
2596 2616
2597 trace_ath10k_wmi_event(id, skb->data, skb->len); 2617 trace_ath10k_wmi_event(ar, id, skb->data, skb->len);
2598 2618
2599 switch (id) { 2619 switch (id) {
2600 case WMI_10_2_MGMT_RX_EVENTID: 2620 case WMI_10_2_MGMT_RX_EVENTID:
@@ -3476,7 +3496,7 @@ int ath10k_wmi_vdev_create(struct ath10k *ar, u32 vdev_id,
3476 cmd->vdev_id = __cpu_to_le32(vdev_id); 3496 cmd->vdev_id = __cpu_to_le32(vdev_id);
3477 cmd->vdev_type = __cpu_to_le32(type); 3497 cmd->vdev_type = __cpu_to_le32(type);
3478 cmd->vdev_subtype = __cpu_to_le32(subtype); 3498 cmd->vdev_subtype = __cpu_to_le32(subtype);
3479 memcpy(cmd->vdev_macaddr.addr, macaddr, ETH_ALEN); 3499 ether_addr_copy(cmd->vdev_macaddr.addr, macaddr);
3480 3500
3481 ath10k_dbg(ar, ATH10K_DBG_WMI, 3501 ath10k_dbg(ar, ATH10K_DBG_WMI,
3482 "WMI vdev create: id %d type %d subtype %d macaddr %pM\n", 3502 "WMI vdev create: id %d type %d subtype %d macaddr %pM\n",
@@ -3503,9 +3523,10 @@ int ath10k_wmi_vdev_delete(struct ath10k *ar, u32 vdev_id)
3503 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid); 3523 return ath10k_wmi_cmd_send(ar, skb, ar->wmi.cmd->vdev_delete_cmdid);
3504} 3524}
3505 3525
3506static int ath10k_wmi_vdev_start_restart(struct ath10k *ar, 3526static int
3507 const struct wmi_vdev_start_request_arg *arg, 3527ath10k_wmi_vdev_start_restart(struct ath10k *ar,
3508 u32 cmd_id) 3528 const struct wmi_vdev_start_request_arg *arg,
3529 u32 cmd_id)
3509{ 3530{
3510 struct wmi_vdev_start_request_cmd *cmd; 3531 struct wmi_vdev_start_request_cmd *cmd;
3511 struct sk_buff *skb; 3532 struct sk_buff *skb;
@@ -3569,8 +3590,8 @@ static int ath10k_wmi_vdev_start_restart(struct ath10k *ar,
3569 cmd->chan.antenna_max = arg->channel.max_antenna_gain; 3590 cmd->chan.antenna_max = arg->channel.max_antenna_gain;
3570 3591
3571 ath10k_dbg(ar, ATH10K_DBG_WMI, 3592 ath10k_dbg(ar, ATH10K_DBG_WMI,
3572 "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, " 3593 "wmi vdev %s id 0x%x flags: 0x%0X, freq %d, mode %d, ch_flags: 0x%0X, max_power: %d\n",
3573 "ch_flags: 0x%0X, max_power: %d\n", cmdname, arg->vdev_id, 3594 cmdname, arg->vdev_id,
3574 flags, arg->channel.freq, arg->channel.mode, 3595 flags, arg->channel.freq, arg->channel.mode,
3575 cmd->chan.flags, arg->channel.max_power); 3596 cmd->chan.flags, arg->channel.max_power);
3576 3597
@@ -3586,7 +3607,7 @@ int ath10k_wmi_vdev_start(struct ath10k *ar,
3586} 3607}
3587 3608
3588int ath10k_wmi_vdev_restart(struct ath10k *ar, 3609int ath10k_wmi_vdev_restart(struct ath10k *ar,
3589 const struct wmi_vdev_start_request_arg *arg) 3610 const struct wmi_vdev_start_request_arg *arg)
3590{ 3611{
3591 u32 cmd_id = ar->wmi.cmd->vdev_restart_request_cmdid; 3612 u32 cmd_id = ar->wmi.cmd->vdev_restart_request_cmdid;
3592 3613
@@ -3622,7 +3643,7 @@ int ath10k_wmi_vdev_up(struct ath10k *ar, u32 vdev_id, u32 aid, const u8 *bssid)
3622 cmd = (struct wmi_vdev_up_cmd *)skb->data; 3643 cmd = (struct wmi_vdev_up_cmd *)skb->data;
3623 cmd->vdev_id = __cpu_to_le32(vdev_id); 3644 cmd->vdev_id = __cpu_to_le32(vdev_id);
3624 cmd->vdev_assoc_id = __cpu_to_le32(aid); 3645 cmd->vdev_assoc_id = __cpu_to_le32(aid);
3625 memcpy(&cmd->vdev_bssid.addr, bssid, ETH_ALEN); 3646 ether_addr_copy(cmd->vdev_bssid.addr, bssid);
3626 3647
3627 ath10k_dbg(ar, ATH10K_DBG_WMI, 3648 ath10k_dbg(ar, ATH10K_DBG_WMI,
3628 "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n", 3649 "wmi mgmt vdev up id 0x%x assoc id %d bssid %pM\n",
@@ -3703,7 +3724,7 @@ int ath10k_wmi_vdev_install_key(struct ath10k *ar,
3703 cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len); 3724 cmd->key_rxmic_len = __cpu_to_le32(arg->key_rxmic_len);
3704 3725
3705 if (arg->macaddr) 3726 if (arg->macaddr)
3706 memcpy(cmd->peer_macaddr.addr, arg->macaddr, ETH_ALEN); 3727 ether_addr_copy(cmd->peer_macaddr.addr, arg->macaddr);
3707 if (arg->key_data) 3728 if (arg->key_data)
3708 memcpy(cmd->key_data, arg->key_data, arg->key_len); 3729 memcpy(cmd->key_data, arg->key_data, arg->key_len);
3709 3730
@@ -3782,7 +3803,7 @@ int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
3782 3803
3783 cmd = (struct wmi_peer_create_cmd *)skb->data; 3804 cmd = (struct wmi_peer_create_cmd *)skb->data;
3784 cmd->vdev_id = __cpu_to_le32(vdev_id); 3805 cmd->vdev_id = __cpu_to_le32(vdev_id);
3785 memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN); 3806 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
3786 3807
3787 ath10k_dbg(ar, ATH10K_DBG_WMI, 3808 ath10k_dbg(ar, ATH10K_DBG_WMI,
3788 "wmi peer create vdev_id %d peer_addr %pM\n", 3809 "wmi peer create vdev_id %d peer_addr %pM\n",
@@ -3802,7 +3823,7 @@ int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
3802 3823
3803 cmd = (struct wmi_peer_delete_cmd *)skb->data; 3824 cmd = (struct wmi_peer_delete_cmd *)skb->data;
3804 cmd->vdev_id = __cpu_to_le32(vdev_id); 3825 cmd->vdev_id = __cpu_to_le32(vdev_id);
3805 memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN); 3826 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
3806 3827
3807 ath10k_dbg(ar, ATH10K_DBG_WMI, 3828 ath10k_dbg(ar, ATH10K_DBG_WMI,
3808 "wmi peer delete vdev_id %d peer_addr %pM\n", 3829 "wmi peer delete vdev_id %d peer_addr %pM\n",
@@ -3823,7 +3844,7 @@ int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
3823 cmd = (struct wmi_peer_flush_tids_cmd *)skb->data; 3844 cmd = (struct wmi_peer_flush_tids_cmd *)skb->data;
3824 cmd->vdev_id = __cpu_to_le32(vdev_id); 3845 cmd->vdev_id = __cpu_to_le32(vdev_id);
3825 cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap); 3846 cmd->peer_tid_bitmap = __cpu_to_le32(tid_bitmap);
3826 memcpy(cmd->peer_macaddr.addr, peer_addr, ETH_ALEN); 3847 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
3827 3848
3828 ath10k_dbg(ar, ATH10K_DBG_WMI, 3849 ath10k_dbg(ar, ATH10K_DBG_WMI,
3829 "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n", 3850 "wmi peer flush vdev_id %d peer_addr %pM tids %08x\n",
@@ -3846,7 +3867,7 @@ int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id,
3846 cmd->vdev_id = __cpu_to_le32(vdev_id); 3867 cmd->vdev_id = __cpu_to_le32(vdev_id);
3847 cmd->param_id = __cpu_to_le32(param_id); 3868 cmd->param_id = __cpu_to_le32(param_id);
3848 cmd->param_value = __cpu_to_le32(param_value); 3869 cmd->param_value = __cpu_to_le32(param_value);
3849 memcpy(&cmd->peer_macaddr.addr, peer_addr, ETH_ALEN); 3870 ether_addr_copy(cmd->peer_macaddr.addr, peer_addr);
3850 3871
3851 ath10k_dbg(ar, ATH10K_DBG_WMI, 3872 ath10k_dbg(ar, ATH10K_DBG_WMI,
3852 "wmi vdev %d peer 0x%pM set param %d value %d\n", 3873 "wmi vdev %d peer 0x%pM set param %d value %d\n",
@@ -3917,7 +3938,7 @@ int ath10k_wmi_set_ap_ps_param(struct ath10k *ar, u32 vdev_id, const u8 *mac,
3917 cmd->vdev_id = __cpu_to_le32(vdev_id); 3938 cmd->vdev_id = __cpu_to_le32(vdev_id);
3918 cmd->param_id = __cpu_to_le32(param_id); 3939 cmd->param_id = __cpu_to_le32(param_id);
3919 cmd->param_value = __cpu_to_le32(value); 3940 cmd->param_value = __cpu_to_le32(value);
3920 memcpy(&cmd->peer_macaddr, mac, ETH_ALEN); 3941 ether_addr_copy(cmd->peer_macaddr.addr, mac);
3921 3942
3922 ath10k_dbg(ar, ATH10K_DBG_WMI, 3943 ath10k_dbg(ar, ATH10K_DBG_WMI,
3923 "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n", 3944 "wmi ap ps param vdev_id 0x%X param %d value %d mac_addr %pM\n",
@@ -4001,7 +4022,7 @@ ath10k_wmi_peer_assoc_fill(struct ath10k *ar, void *buf,
4001 cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps); 4022 cmd->peer_vht_caps = __cpu_to_le32(arg->peer_vht_caps);
4002 cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode); 4023 cmd->peer_phymode = __cpu_to_le32(arg->peer_phymode);
4003 4024
4004 memcpy(cmd->peer_macaddr.addr, arg->addr, ETH_ALEN); 4025 ether_addr_copy(cmd->peer_macaddr.addr, arg->addr);
4005 4026
4006 cmd->peer_legacy_rates.num_rates = 4027 cmd->peer_legacy_rates.num_rates =
4007 __cpu_to_le32(arg->peer_legacy_rates.num_rates); 4028 __cpu_to_le32(arg->peer_legacy_rates.num_rates);
@@ -4155,7 +4176,7 @@ static void ath10k_wmi_pdev_set_wmm_param(struct wmi_wmm_params *params,
4155} 4176}
4156 4177
4157int ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar, 4178int ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
4158 const struct wmi_pdev_set_wmm_params_arg *arg) 4179 const struct wmi_pdev_set_wmm_params_arg *arg)
4159{ 4180{
4160 struct wmi_pdev_set_wmm_params *cmd; 4181 struct wmi_pdev_set_wmm_params *cmd;
4161 struct sk_buff *skb; 4182 struct sk_buff *skb;
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index e70836586756..86f5ebccfe79 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -109,6 +109,9 @@ enum wmi_service {
109 WMI_SERVICE_BURST, 109 WMI_SERVICE_BURST,
110 WMI_SERVICE_SMART_ANTENNA_SW_SUPPORT, 110 WMI_SERVICE_SMART_ANTENNA_SW_SUPPORT,
111 WMI_SERVICE_SMART_ANTENNA_HW_SUPPORT, 111 WMI_SERVICE_SMART_ANTENNA_HW_SUPPORT,
112
113 /* keep last */
114 WMI_SERVICE_MAX,
112}; 115};
113 116
114enum wmi_10x_service { 117enum wmi_10x_service {
@@ -219,8 +222,6 @@ static inline char *wmi_service_name(int service_id)
219#undef SVCSTR 222#undef SVCSTR
220} 223}
221 224
222#define WMI_MAX_SERVICE 64
223
224#define WMI_SERVICE_IS_ENABLED(wmi_svc_bmap, svc_id) \ 225#define WMI_SERVICE_IS_ENABLED(wmi_svc_bmap, svc_id) \
225 (__le32_to_cpu((wmi_svc_bmap)[(svc_id)/(sizeof(u32))]) & \ 226 (__le32_to_cpu((wmi_svc_bmap)[(svc_id)/(sizeof(u32))]) & \
226 BIT((svc_id)%(sizeof(u32)))) 227 BIT((svc_id)%(sizeof(u32))))
@@ -347,9 +348,6 @@ static inline void wmi_main_svc_map(const __le32 *in, unsigned long *out)
347 348
348#undef SVCMAP 349#undef SVCMAP
349 350
350#define WMI_SERVICE_BM_SIZE \
351 ((WMI_MAX_SERVICE + sizeof(u32) - 1)/sizeof(u32))
352
353/* 2 word representation of MAC addr */ 351/* 2 word representation of MAC addr */
354struct wmi_mac_addr { 352struct wmi_mac_addr {
355 union { 353 union {
@@ -1271,7 +1269,6 @@ enum wmi_channel_change_cause {
1271 WMI_HT_CAP_RX_STBC | \ 1269 WMI_HT_CAP_RX_STBC | \
1272 WMI_HT_CAP_LDPC) 1270 WMI_HT_CAP_LDPC)
1273 1271
1274
1275/* 1272/*
1276 * WMI_VHT_CAP_* these maps to ieee 802.11ac vht capability information 1273 * WMI_VHT_CAP_* these maps to ieee 802.11ac vht capability information
1277 * field. The fields not defined here are not supported, or reserved. 1274 * field. The fields not defined here are not supported, or reserved.
@@ -1405,7 +1402,7 @@ struct wmi_service_ready_event {
1405 __le32 phy_capability; 1402 __le32 phy_capability;
1406 /* Maximum number of frag table entries that SW will populate less 1 */ 1403 /* Maximum number of frag table entries that SW will populate less 1 */
1407 __le32 max_frag_entry; 1404 __le32 max_frag_entry;
1408 __le32 wmi_service_bitmap[WMI_SERVICE_BM_SIZE]; 1405 __le32 wmi_service_bitmap[16];
1409 __le32 num_rf_chains; 1406 __le32 num_rf_chains;
1410 /* 1407 /*
1411 * The following field is only valid for service type 1408 * The following field is only valid for service type
@@ -1444,7 +1441,7 @@ struct wmi_service_ready_event_10x {
1444 1441
1445 /* Maximum number of frag table entries that SW will populate less 1 */ 1442 /* Maximum number of frag table entries that SW will populate less 1 */
1446 __le32 max_frag_entry; 1443 __le32 max_frag_entry;
1447 __le32 wmi_service_bitmap[WMI_SERVICE_BM_SIZE]; 1444 __le32 wmi_service_bitmap[16];
1448 __le32 num_rf_chains; 1445 __le32 num_rf_chains;
1449 1446
1450 /* 1447 /*
@@ -1473,7 +1470,6 @@ struct wmi_service_ready_event_10x {
1473 struct wlan_host_mem_req mem_reqs[1]; 1470 struct wlan_host_mem_req mem_reqs[1];
1474} __packed; 1471} __packed;
1475 1472
1476
1477#define WMI_SERVICE_READY_TIMEOUT_HZ (5*HZ) 1473#define WMI_SERVICE_READY_TIMEOUT_HZ (5*HZ)
1478#define WMI_UNIFIED_READY_TIMEOUT_HZ (5*HZ) 1474#define WMI_UNIFIED_READY_TIMEOUT_HZ (5*HZ)
1479 1475
@@ -2127,7 +2123,6 @@ struct wmi_start_scan_cmd_10x {
2127 */ 2123 */
2128} __packed; 2124} __packed;
2129 2125
2130
2131struct wmi_ssid_arg { 2126struct wmi_ssid_arg {
2132 int len; 2127 int len;
2133 const u8 *ssid; 2128 const u8 *ssid;
@@ -2188,7 +2183,6 @@ struct wmi_start_scan_arg {
2188/* WMI_SCAN_CLASS_MASK must be the same value as IEEE80211_SCAN_CLASS_MASK */ 2183/* WMI_SCAN_CLASS_MASK must be the same value as IEEE80211_SCAN_CLASS_MASK */
2189#define WMI_SCAN_CLASS_MASK 0xFF000000 2184#define WMI_SCAN_CLASS_MASK 0xFF000000
2190 2185
2191
2192enum wmi_stop_scan_type { 2186enum wmi_stop_scan_type {
2193 WMI_SCAN_STOP_ONE = 0x00000000, /* stop by scan_id */ 2187 WMI_SCAN_STOP_ONE = 0x00000000, /* stop by scan_id */
2194 WMI_SCAN_STOP_VDEV_ALL = 0x01000000, /* stop by vdev_id */ 2188 WMI_SCAN_STOP_VDEV_ALL = 0x01000000, /* stop by vdev_id */
@@ -2373,7 +2367,6 @@ struct wmi_single_phyerr_rx_hdr {
2373 __le32 nf_list_1; 2367 __le32 nf_list_1;
2374 __le32 nf_list_2; 2368 __le32 nf_list_2;
2375 2369
2376
2377 /* Length of the frame */ 2370 /* Length of the frame */
2378 __le32 buf_len; 2371 __le32 buf_len;
2379} __packed; 2372} __packed;
@@ -2475,7 +2468,6 @@ struct phyerr_fft_report {
2475#define SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB_MASK 0x000000FF 2468#define SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB_MASK 0x000000FF
2476#define SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB_LSB 0 2469#define SEARCH_FFT_REPORT_REG1_NUM_STR_BINS_IB_LSB 0
2477 2470
2478
2479struct phyerr_tlv { 2471struct phyerr_tlv {
2480 __le16 len; 2472 __le16 len;
2481 u8 tag; 2473 u8 tag;
@@ -2506,7 +2498,6 @@ struct wmi_echo_cmd {
2506 __le32 value; 2498 __le32 value;
2507} __packed; 2499} __packed;
2508 2500
2509
2510struct wmi_pdev_set_regdomain_cmd { 2501struct wmi_pdev_set_regdomain_cmd {
2511 __le32 reg_domain; 2502 __le32 reg_domain;
2512 __le32 reg_domain_2G; 2503 __le32 reg_domain_2G;
@@ -2555,7 +2546,6 @@ struct wmi_pdev_set_quiet_cmd {
2555 __le32 enabled; 2546 __le32 enabled;
2556} __packed; 2547} __packed;
2557 2548
2558
2559/* 2549/*
2560 * 802.11g protection mode. 2550 * 802.11g protection mode.
2561 */ 2551 */
@@ -4293,7 +4283,6 @@ struct wmi_tbtt_offset_event {
4293 __le32 tbttoffset_list[WMI_MAX_AP_VDEV]; 4283 __le32 tbttoffset_list[WMI_MAX_AP_VDEV];
4294} __packed; 4284} __packed;
4295 4285
4296
4297struct wmi_peer_create_cmd { 4286struct wmi_peer_create_cmd {
4298 __le32 vdev_id; 4287 __le32 vdev_id;
4299 struct wmi_mac_addr peer_macaddr; 4288 struct wmi_mac_addr peer_macaddr;
@@ -4739,6 +4728,10 @@ int ath10k_wmi_wait_for_service_ready(struct ath10k *ar);
4739int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar); 4728int ath10k_wmi_wait_for_unified_ready(struct ath10k *ar);
4740 4729
4741int ath10k_wmi_connect(struct ath10k *ar); 4730int ath10k_wmi_connect(struct ath10k *ar);
4731
4732struct sk_buff *ath10k_wmi_alloc_skb(struct ath10k *ar, u32 len);
4733int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id);
4734
4742int ath10k_wmi_pdev_set_channel(struct ath10k *ar, 4735int ath10k_wmi_pdev_set_channel(struct ath10k *ar,
4743 const struct wmi_channel_arg *); 4736 const struct wmi_channel_arg *);
4744int ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt); 4737int ath10k_wmi_pdev_suspend_target(struct ath10k *ar, u32 suspend_opt);
@@ -4774,11 +4767,11 @@ int ath10k_wmi_vdev_spectral_conf(struct ath10k *ar,
4774int ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger, 4767int ath10k_wmi_vdev_spectral_enable(struct ath10k *ar, u32 vdev_id, u32 trigger,
4775 u32 enable); 4768 u32 enable);
4776int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id, 4769int ath10k_wmi_peer_create(struct ath10k *ar, u32 vdev_id,
4777 const u8 peer_addr[ETH_ALEN]); 4770 const u8 peer_addr[ETH_ALEN]);
4778int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id, 4771int ath10k_wmi_peer_delete(struct ath10k *ar, u32 vdev_id,
4779 const u8 peer_addr[ETH_ALEN]); 4772 const u8 peer_addr[ETH_ALEN]);
4780int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id, 4773int ath10k_wmi_peer_flush(struct ath10k *ar, u32 vdev_id,
4781 const u8 peer_addr[ETH_ALEN], u32 tid_bitmap); 4774 const u8 peer_addr[ETH_ALEN], u32 tid_bitmap);
4782int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id, 4775int ath10k_wmi_peer_set_param(struct ath10k *ar, u32 vdev_id,
4783 const u8 *peer_addr, 4776 const u8 *peer_addr,
4784 enum wmi_peer_param param_id, u32 param_value); 4777 enum wmi_peer_param param_id, u32 param_value);
@@ -4795,7 +4788,7 @@ int ath10k_wmi_scan_chan_list(struct ath10k *ar,
4795 const struct wmi_scan_chan_list_arg *arg); 4788 const struct wmi_scan_chan_list_arg *arg);
4796int ath10k_wmi_beacon_send_ref_nowait(struct ath10k_vif *arvif); 4789int ath10k_wmi_beacon_send_ref_nowait(struct ath10k_vif *arvif);
4797int ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar, 4790int ath10k_wmi_pdev_set_wmm_params(struct ath10k *ar,
4798 const struct wmi_pdev_set_wmm_params_arg *arg); 4791 const struct wmi_pdev_set_wmm_params_arg *arg);
4799int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id); 4792int ath10k_wmi_request_stats(struct ath10k *ar, enum wmi_stats_id stats_id);
4800int ath10k_wmi_force_fw_hang(struct ath10k *ar, 4793int ath10k_wmi_force_fw_hang(struct ath10k *ar,
4801 enum wmi_force_fw_hang_type type, u32 delay_ms); 4794 enum wmi_force_fw_hang_type type, u32 delay_ms);
diff --git a/drivers/net/wireless/ath/ath5k/Kconfig b/drivers/net/wireless/ath/ath5k/Kconfig
index c9f81a388f15..93caf8e68901 100644
--- a/drivers/net/wireless/ath/ath5k/Kconfig
+++ b/drivers/net/wireless/ath/ath5k/Kconfig
@@ -1,13 +1,12 @@
1config ATH5K 1config ATH5K
2 tristate "Atheros 5xxx wireless cards support" 2 tristate "Atheros 5xxx wireless cards support"
3 depends on (PCI || ATHEROS_AR231X) && MAC80211 3 depends on PCI && MAC80211
4 select ATH_COMMON 4 select ATH_COMMON
5 select MAC80211_LEDS 5 select MAC80211_LEDS
6 select LEDS_CLASS 6 select LEDS_CLASS
7 select NEW_LEDS 7 select NEW_LEDS
8 select AVERAGE 8 select AVERAGE
9 select ATH5K_AHB if (ATHEROS_AR231X && !PCI) 9 select ATH5K_PCI
10 select ATH5K_PCI if (!ATHEROS_AR231X && PCI)
11 ---help--- 10 ---help---
12 This module adds support for wireless adapters based on 11 This module adds support for wireless adapters based on
13 Atheros 5xxx chipset. 12 Atheros 5xxx chipset.
@@ -52,16 +51,9 @@ config ATH5K_TRACER
52 51
53 If unsure, say N. 52 If unsure, say N.
54 53
55config ATH5K_AHB
56 bool "Atheros 5xxx AHB bus support"
57 depends on (ATHEROS_AR231X && !PCI)
58 ---help---
59 This adds support for WiSoC type chipsets of the 5xxx Atheros
60 family.
61
62config ATH5K_PCI 54config ATH5K_PCI
63 bool "Atheros 5xxx PCI bus support" 55 bool "Atheros 5xxx PCI bus support"
64 depends on (!ATHEROS_AR231X && PCI) 56 depends on PCI
65 ---help--- 57 ---help---
66 This adds support for PCI type chipsets of the 5xxx Atheros 58 This adds support for PCI type chipsets of the 5xxx Atheros
67 family. 59 family.
diff --git a/drivers/net/wireless/ath/ath5k/Makefile b/drivers/net/wireless/ath/ath5k/Makefile
index 1b3a34f7f224..51e2d8668041 100644
--- a/drivers/net/wireless/ath/ath5k/Makefile
+++ b/drivers/net/wireless/ath/ath5k/Makefile
@@ -17,6 +17,5 @@ ath5k-y += ani.o
17ath5k-y += sysfs.o 17ath5k-y += sysfs.o
18ath5k-y += mac80211-ops.o 18ath5k-y += mac80211-ops.o
19ath5k-$(CONFIG_ATH5K_DEBUG) += debug.o 19ath5k-$(CONFIG_ATH5K_DEBUG) += debug.o
20ath5k-$(CONFIG_ATH5K_AHB) += ahb.o
21ath5k-$(CONFIG_ATH5K_PCI) += pci.o 20ath5k-$(CONFIG_ATH5K_PCI) += pci.o
22obj-$(CONFIG_ATH5K) += ath5k.o 21obj-$(CONFIG_ATH5K) += ath5k.o
diff --git a/drivers/net/wireless/ath/ath5k/ahb.c b/drivers/net/wireless/ath/ath5k/ahb.c
deleted file mode 100644
index 79bffe165cab..000000000000
--- a/drivers/net/wireless/ath/ath5k/ahb.c
+++ /dev/null
@@ -1,234 +0,0 @@
1/*
2 * Copyright (c) 2008-2009 Atheros Communications Inc.
3 * Copyright (c) 2009 Gabor Juhos <juhosg@openwrt.org>
4 * Copyright (c) 2009 Imre Kaloz <kaloz@openwrt.org>
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19#include <linux/nl80211.h>
20#include <linux/platform_device.h>
21#include <linux/etherdevice.h>
22#include <linux/export.h>
23#include <ar231x_platform.h>
24#include "ath5k.h"
25#include "debug.h"
26#include "base.h"
27#include "reg.h"
28
29/* return bus cachesize in 4B word units */
30static void ath5k_ahb_read_cachesize(struct ath_common *common, int *csz)
31{
32 *csz = L1_CACHE_BYTES >> 2;
33}
34
35static bool
36ath5k_ahb_eeprom_read(struct ath_common *common, u32 off, u16 *data)
37{
38 struct ath5k_hw *ah = common->priv;
39 struct platform_device *pdev = to_platform_device(ah->dev);
40 struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);
41 u16 *eeprom, *eeprom_end;
42
43 eeprom = (u16 *) bcfg->radio;
44 eeprom_end = ((void *) bcfg->config) + BOARD_CONFIG_BUFSZ;
45
46 eeprom += off;
47 if (eeprom > eeprom_end)
48 return false;
49
50 *data = *eeprom;
51 return true;
52}
53
54int ath5k_hw_read_srev(struct ath5k_hw *ah)
55{
56 struct platform_device *pdev = to_platform_device(ah->dev);
57 struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);
58 ah->ah_mac_srev = bcfg->devid;
59 return 0;
60}
61
62static int ath5k_ahb_eeprom_read_mac(struct ath5k_hw *ah, u8 *mac)
63{
64 struct platform_device *pdev = to_platform_device(ah->dev);
65 struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);
66 u8 *cfg_mac;
67
68 if (to_platform_device(ah->dev)->id == 0)
69 cfg_mac = bcfg->config->wlan0_mac;
70 else
71 cfg_mac = bcfg->config->wlan1_mac;
72
73 memcpy(mac, cfg_mac, ETH_ALEN);
74 return 0;
75}
76
77static const struct ath_bus_ops ath_ahb_bus_ops = {
78 .ath_bus_type = ATH_AHB,
79 .read_cachesize = ath5k_ahb_read_cachesize,
80 .eeprom_read = ath5k_ahb_eeprom_read,
81 .eeprom_read_mac = ath5k_ahb_eeprom_read_mac,
82};
83
84/*Initialization*/
85static int ath_ahb_probe(struct platform_device *pdev)
86{
87 struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);
88 struct ath5k_hw *ah;
89 struct ieee80211_hw *hw;
90 struct resource *res;
91 void __iomem *mem;
92 int irq;
93 int ret = 0;
94 u32 reg;
95
96 if (!dev_get_platdata(&pdev->dev)) {
97 dev_err(&pdev->dev, "no platform data specified\n");
98 ret = -EINVAL;
99 goto err_out;
100 }
101
102 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
103 if (res == NULL) {
104 dev_err(&pdev->dev, "no memory resource found\n");
105 ret = -ENXIO;
106 goto err_out;
107 }
108
109 mem = ioremap_nocache(res->start, resource_size(res));
110 if (mem == NULL) {
111 dev_err(&pdev->dev, "ioremap failed\n");
112 ret = -ENOMEM;
113 goto err_out;
114 }
115
116 res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
117 if (res == NULL) {
118 dev_err(&pdev->dev, "no IRQ resource found\n");
119 ret = -ENXIO;
120 goto err_iounmap;
121 }
122
123 irq = res->start;
124
125 hw = ieee80211_alloc_hw(sizeof(struct ath5k_hw), &ath5k_hw_ops);
126 if (hw == NULL) {
127 dev_err(&pdev->dev, "no memory for ieee80211_hw\n");
128 ret = -ENOMEM;
129 goto err_iounmap;
130 }
131
132 ah = hw->priv;
133 ah->hw = hw;
134 ah->dev = &pdev->dev;
135 ah->iobase = mem;
136 ah->irq = irq;
137 ah->devid = bcfg->devid;
138
139 if (bcfg->devid >= AR5K_SREV_AR2315_R6) {
140 /* Enable WMAC AHB arbitration */
141 reg = ioread32((void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
142 reg |= AR5K_AR2315_AHB_ARB_CTL_WLAN;
143 iowrite32(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
144
145 /* Enable global WMAC swapping */
146 reg = ioread32((void __iomem *) AR5K_AR2315_BYTESWAP);
147 reg |= AR5K_AR2315_BYTESWAP_WMAC;
148 iowrite32(reg, (void __iomem *) AR5K_AR2315_BYTESWAP);
149 } else {
150 /* Enable WMAC DMA access (assuming 5312 or 231x*/
151 /* TODO: check other platforms */
152 reg = ioread32((void __iomem *) AR5K_AR5312_ENABLE);
153 if (to_platform_device(ah->dev)->id == 0)
154 reg |= AR5K_AR5312_ENABLE_WLAN0;
155 else
156 reg |= AR5K_AR5312_ENABLE_WLAN1;
157 iowrite32(reg, (void __iomem *) AR5K_AR5312_ENABLE);
158
159 /*
160 * On a dual-band AR5312, the multiband radio is only
161 * used as pass-through. Disable 2 GHz support in the
162 * driver for it
163 */
164 if (to_platform_device(ah->dev)->id == 0 &&
165 (bcfg->config->flags & (BD_WLAN0 | BD_WLAN1)) ==
166 (BD_WLAN1 | BD_WLAN0))
167 ah->ah_capabilities.cap_needs_2GHz_ovr = true;
168 else
169 ah->ah_capabilities.cap_needs_2GHz_ovr = false;
170 }
171
172 ret = ath5k_init_ah(ah, &ath_ahb_bus_ops);
173 if (ret != 0) {
174 dev_err(&pdev->dev, "failed to attach device, err=%d\n", ret);
175 ret = -ENODEV;
176 goto err_free_hw;
177 }
178
179 platform_set_drvdata(pdev, hw);
180
181 return 0;
182
183 err_free_hw:
184 ieee80211_free_hw(hw);
185 err_iounmap:
186 iounmap(mem);
187 err_out:
188 return ret;
189}
190
191static int ath_ahb_remove(struct platform_device *pdev)
192{
193 struct ar231x_board_config *bcfg = dev_get_platdata(&pdev->dev);
194 struct ieee80211_hw *hw = platform_get_drvdata(pdev);
195 struct ath5k_hw *ah;
196 u32 reg;
197
198 if (!hw)
199 return 0;
200
201 ah = hw->priv;
202
203 if (bcfg->devid >= AR5K_SREV_AR2315_R6) {
204 /* Disable WMAC AHB arbitration */
205 reg = ioread32((void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
206 reg &= ~AR5K_AR2315_AHB_ARB_CTL_WLAN;
207 iowrite32(reg, (void __iomem *) AR5K_AR2315_AHB_ARB_CTL);
208 } else {
209 /*Stop DMA access */
210 reg = ioread32((void __iomem *) AR5K_AR5312_ENABLE);
211 if (to_platform_device(ah->dev)->id == 0)
212 reg &= ~AR5K_AR5312_ENABLE_WLAN0;
213 else
214 reg &= ~AR5K_AR5312_ENABLE_WLAN1;
215 iowrite32(reg, (void __iomem *) AR5K_AR5312_ENABLE);
216 }
217
218 ath5k_deinit_ah(ah);
219 iounmap(ah->iobase);
220 ieee80211_free_hw(hw);
221
222 return 0;
223}
224
225static struct platform_driver ath_ahb_driver = {
226 .probe = ath_ahb_probe,
227 .remove = ath_ahb_remove,
228 .driver = {
229 .name = "ar231x-wmac",
230 .owner = THIS_MODULE,
231 },
232};
233
234module_platform_driver(ath_ahb_driver);
diff --git a/drivers/net/wireless/ath/ath5k/ath5k.h b/drivers/net/wireless/ath/ath5k/ath5k.h
index 85316bb3f8c6..ed2468220216 100644
--- a/drivers/net/wireless/ath/ath5k/ath5k.h
+++ b/drivers/net/wireless/ath/ath5k/ath5k.h
@@ -1647,32 +1647,6 @@ static inline struct ath_regulatory *ath5k_hw_regulatory(struct ath5k_hw *ah)
1647 return &(ath5k_hw_common(ah)->regulatory); 1647 return &(ath5k_hw_common(ah)->regulatory);
1648} 1648}
1649 1649
1650#ifdef CONFIG_ATHEROS_AR231X
1651#define AR5K_AR2315_PCI_BASE ((void __iomem *)0xb0100000)
1652
1653static inline void __iomem *ath5k_ahb_reg(struct ath5k_hw *ah, u16 reg)
1654{
1655 /* On AR2315 and AR2317 the PCI clock domain registers
1656 * are outside of the WMAC register space */
1657 if (unlikely((reg >= 0x4000) && (reg < 0x5000) &&
1658 (ah->ah_mac_srev >= AR5K_SREV_AR2315_R6)))
1659 return AR5K_AR2315_PCI_BASE + reg;
1660
1661 return ah->iobase + reg;
1662}
1663
1664static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg)
1665{
1666 return ioread32(ath5k_ahb_reg(ah, reg));
1667}
1668
1669static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg)
1670{
1671 iowrite32(val, ath5k_ahb_reg(ah, reg));
1672}
1673
1674#else
1675
1676static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg) 1650static inline u32 ath5k_hw_reg_read(struct ath5k_hw *ah, u16 reg)
1677{ 1651{
1678 return ioread32(ah->iobase + reg); 1652 return ioread32(ah->iobase + reg);
@@ -1683,8 +1657,6 @@ static inline void ath5k_hw_reg_write(struct ath5k_hw *ah, u32 val, u16 reg)
1683 iowrite32(val, ah->iobase + reg); 1657 iowrite32(val, ah->iobase + reg);
1684} 1658}
1685 1659
1686#endif
1687
1688static inline enum ath_bus_type ath5k_get_bus_type(struct ath5k_hw *ah) 1660static inline enum ath_bus_type ath5k_get_bus_type(struct ath5k_hw *ah)
1689{ 1661{
1690 return ath5k_hw_common(ah)->bus_ops->ath_bus_type; 1662 return ath5k_hw_common(ah)->bus_ops->ath_bus_type;
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c
index 59a87247aac4..a4a09bb8f2f3 100644
--- a/drivers/net/wireless/ath/ath5k/base.c
+++ b/drivers/net/wireless/ath/ath5k/base.c
@@ -99,15 +99,6 @@ static int ath5k_reset(struct ath5k_hw *ah, struct ieee80211_channel *chan,
99 99
100/* Known SREVs */ 100/* Known SREVs */
101static const struct ath5k_srev_name srev_names[] = { 101static const struct ath5k_srev_name srev_names[] = {
102#ifdef CONFIG_ATHEROS_AR231X
103 { "5312", AR5K_VERSION_MAC, AR5K_SREV_AR5312_R2 },
104 { "5312", AR5K_VERSION_MAC, AR5K_SREV_AR5312_R7 },
105 { "2313", AR5K_VERSION_MAC, AR5K_SREV_AR2313_R8 },
106 { "2315", AR5K_VERSION_MAC, AR5K_SREV_AR2315_R6 },
107 { "2315", AR5K_VERSION_MAC, AR5K_SREV_AR2315_R7 },
108 { "2317", AR5K_VERSION_MAC, AR5K_SREV_AR2317_R1 },
109 { "2317", AR5K_VERSION_MAC, AR5K_SREV_AR2317_R2 },
110#else
111 { "5210", AR5K_VERSION_MAC, AR5K_SREV_AR5210 }, 102 { "5210", AR5K_VERSION_MAC, AR5K_SREV_AR5210 },
112 { "5311", AR5K_VERSION_MAC, AR5K_SREV_AR5311 }, 103 { "5311", AR5K_VERSION_MAC, AR5K_SREV_AR5311 },
113 { "5311A", AR5K_VERSION_MAC, AR5K_SREV_AR5311A }, 104 { "5311A", AR5K_VERSION_MAC, AR5K_SREV_AR5311A },
@@ -126,7 +117,6 @@ static const struct ath5k_srev_name srev_names[] = {
126 { "5418", AR5K_VERSION_MAC, AR5K_SREV_AR5418 }, 117 { "5418", AR5K_VERSION_MAC, AR5K_SREV_AR5418 },
127 { "2425", AR5K_VERSION_MAC, AR5K_SREV_AR2425 }, 118 { "2425", AR5K_VERSION_MAC, AR5K_SREV_AR2425 },
128 { "2417", AR5K_VERSION_MAC, AR5K_SREV_AR2417 }, 119 { "2417", AR5K_VERSION_MAC, AR5K_SREV_AR2417 },
129#endif
130 { "xxxxx", AR5K_VERSION_MAC, AR5K_SREV_UNKNOWN }, 120 { "xxxxx", AR5K_VERSION_MAC, AR5K_SREV_UNKNOWN },
131 { "5110", AR5K_VERSION_RAD, AR5K_SREV_RAD_5110 }, 121 { "5110", AR5K_VERSION_RAD, AR5K_SREV_RAD_5110 },
132 { "5111", AR5K_VERSION_RAD, AR5K_SREV_RAD_5111 }, 122 { "5111", AR5K_VERSION_RAD, AR5K_SREV_RAD_5111 },
@@ -142,10 +132,6 @@ static const struct ath5k_srev_name srev_names[] = {
142 { "5413", AR5K_VERSION_RAD, AR5K_SREV_RAD_5413 }, 132 { "5413", AR5K_VERSION_RAD, AR5K_SREV_RAD_5413 },
143 { "5424", AR5K_VERSION_RAD, AR5K_SREV_RAD_5424 }, 133 { "5424", AR5K_VERSION_RAD, AR5K_SREV_RAD_5424 },
144 { "5133", AR5K_VERSION_RAD, AR5K_SREV_RAD_5133 }, 134 { "5133", AR5K_VERSION_RAD, AR5K_SREV_RAD_5133 },
145#ifdef CONFIG_ATHEROS_AR231X
146 { "2316", AR5K_VERSION_RAD, AR5K_SREV_RAD_2316 },
147 { "2317", AR5K_VERSION_RAD, AR5K_SREV_RAD_2317 },
148#endif
149 { "xxxxx", AR5K_VERSION_RAD, AR5K_SREV_UNKNOWN }, 135 { "xxxxx", AR5K_VERSION_RAD, AR5K_SREV_UNKNOWN },
150}; 136};
151 137
diff --git a/drivers/net/wireless/ath/ath5k/debug.c b/drivers/net/wireless/ath/ath5k/debug.c
index 399728618fb9..c70782e8f07b 100644
--- a/drivers/net/wireless/ath/ath5k/debug.c
+++ b/drivers/net/wireless/ath/ath5k/debug.c
@@ -66,6 +66,7 @@
66 66
67#include <linux/seq_file.h> 67#include <linux/seq_file.h>
68#include <linux/list.h> 68#include <linux/list.h>
69#include <linux/vmalloc.h>
69#include "debug.h" 70#include "debug.h"
70#include "ath5k.h" 71#include "ath5k.h"
71#include "reg.h" 72#include "reg.h"
diff --git a/drivers/net/wireless/ath/ath5k/led.c b/drivers/net/wireless/ath/ath5k/led.c
index 2062d1190556..0beb7e7d6075 100644
--- a/drivers/net/wireless/ath/ath5k/led.c
+++ b/drivers/net/wireless/ath/ath5k/led.c
@@ -163,20 +163,14 @@ int ath5k_init_leds(struct ath5k_hw *ah)
163{ 163{
164 int ret = 0; 164 int ret = 0;
165 struct ieee80211_hw *hw = ah->hw; 165 struct ieee80211_hw *hw = ah->hw;
166#ifndef CONFIG_ATHEROS_AR231X
167 struct pci_dev *pdev = ah->pdev; 166 struct pci_dev *pdev = ah->pdev;
168#endif
169 char name[ATH5K_LED_MAX_NAME_LEN + 1]; 167 char name[ATH5K_LED_MAX_NAME_LEN + 1];
170 const struct pci_device_id *match; 168 const struct pci_device_id *match;
171 169
172 if (!ah->pdev) 170 if (!ah->pdev)
173 return 0; 171 return 0;
174 172
175#ifdef CONFIG_ATHEROS_AR231X
176 match = NULL;
177#else
178 match = pci_match_id(&ath5k_led_devices[0], pdev); 173 match = pci_match_id(&ath5k_led_devices[0], pdev);
179#endif
180 if (match) { 174 if (match) {
181 __set_bit(ATH_STAT_LEDSOFT, ah->status); 175 __set_bit(ATH_STAT_LEDSOFT, ah->status);
182 ah->led_pin = ATH_PIN(match->driver_data); 176 ah->led_pin = ATH_PIN(match->driver_data);
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
index 00fb8badbacc..b72d0be716db 100644
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
@@ -1004,9 +1004,11 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,
1004 case ATH9K_ANI_FIRSTEP_LEVEL:{ 1004 case ATH9K_ANI_FIRSTEP_LEVEL:{
1005 u32 level = param; 1005 u32 level = param;
1006 1006
1007 value = level; 1007 value = level * 2;
1008 REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, 1008 REG_RMW_FIELD(ah, AR_PHY_FIND_SIG,
1009 AR_PHY_FIND_SIG_FIRSTEP, value); 1009 AR_PHY_FIND_SIG_FIRSTEP, value);
1010 REG_RMW_FIELD(ah, AR_PHY_FIND_SIG_LOW,
1011 AR_PHY_FIND_SIG_FIRSTEP_LOW, value);
1010 1012
1011 if (level != aniState->firstepLevel) { 1013 if (level != aniState->firstepLevel) {
1012 ath_dbg(common, ANI, 1014 ath_dbg(common, ANI,
@@ -1040,9 +1042,8 @@ static bool ar5008_hw_ani_control_new(struct ath_hw *ah,
1040 REG_RMW_FIELD(ah, AR_PHY_TIMING5, 1042 REG_RMW_FIELD(ah, AR_PHY_TIMING5,
1041 AR_PHY_TIMING5_CYCPWR_THR1, value); 1043 AR_PHY_TIMING5_CYCPWR_THR1, value);
1042 1044
1043 if (IS_CHAN_HT40(ah->curchan)) 1045 REG_RMW_FIELD(ah, AR_PHY_EXT_CCA,
1044 REG_RMW_FIELD(ah, AR_PHY_EXT_CCA, 1046 AR_PHY_EXT_TIMING5_CYCPWR_THR1, value - 1);
1045 AR_PHY_EXT_TIMING5_CYCPWR_THR1, value);
1046 1047
1047 if (level != aniState->spurImmunityLevel) { 1048 if (level != aniState->spurImmunityLevel) {
1048 ath_dbg(common, ANI, 1049 ath_dbg(common, ANI,
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
index 669cb3747208..2a93519f4bdf 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
@@ -381,16 +381,27 @@ static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds,
381 ts->evm1 = ads->AR_TxEVM1; 381 ts->evm1 = ads->AR_TxEVM1;
382 ts->evm2 = ads->AR_TxEVM2; 382 ts->evm2 = ads->AR_TxEVM2;
383 383
384 status = ACCESS_ONCE(ads->ds_ctl4);
385 ts->duration[0] = MS(status, AR_PacketDur0);
386 ts->duration[1] = MS(status, AR_PacketDur1);
387 status = ACCESS_ONCE(ads->ds_ctl5);
388 ts->duration[2] = MS(status, AR_PacketDur2);
389 ts->duration[3] = MS(status, AR_PacketDur3);
390
391 return 0; 384 return 0;
392} 385}
393 386
387static int ar9002_hw_get_duration(struct ath_hw *ah, const void *ds, int index)
388{
389 struct ar5416_desc *ads = AR5416DESC(ds);
390
391 switch (index) {
392 case 0:
393 return MS(ACCESS_ONCE(ads->ds_ctl4), AR_PacketDur0);
394 case 1:
395 return MS(ACCESS_ONCE(ads->ds_ctl4), AR_PacketDur1);
396 case 2:
397 return MS(ACCESS_ONCE(ads->ds_ctl5), AR_PacketDur2);
398 case 3:
399 return MS(ACCESS_ONCE(ads->ds_ctl5), AR_PacketDur3);
400 default:
401 return -1;
402 }
403}
404
394void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds, 405void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds,
395 u32 size, u32 flags) 406 u32 size, u32 flags)
396{ 407{
@@ -413,4 +424,5 @@ void ar9002_hw_attach_mac_ops(struct ath_hw *ah)
413 ops->get_isr = ar9002_hw_get_isr; 424 ops->get_isr = ar9002_hw_get_isr;
414 ops->set_txdesc = ar9002_set_txdesc; 425 ops->set_txdesc = ar9002_set_txdesc;
415 ops->proc_txdesc = ar9002_hw_proc_txdesc; 426 ops->proc_txdesc = ar9002_hw_proc_txdesc;
427 ops->get_duration = ar9002_hw_get_duration;
416} 428}
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
index e5f7c11fa144..057b1657c428 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
@@ -355,11 +355,9 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
355 struct ath_tx_status *ts) 355 struct ath_tx_status *ts)
356{ 356{
357 struct ar9003_txs *ads; 357 struct ar9003_txs *ads;
358 struct ar9003_txc *adc;
359 u32 status; 358 u32 status;
360 359
361 ads = &ah->ts_ring[ah->ts_tail]; 360 ads = &ah->ts_ring[ah->ts_tail];
362 adc = (struct ar9003_txc *)ads;
363 361
364 status = ACCESS_ONCE(ads->status8); 362 status = ACCESS_ONCE(ads->status8);
365 if ((status & AR_TxDone) == 0) 363 if ((status & AR_TxDone) == 0)
@@ -428,18 +426,29 @@ static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds,
428 ts->ts_rssi_ext1 = MS(status, AR_TxRSSIAnt11); 426 ts->ts_rssi_ext1 = MS(status, AR_TxRSSIAnt11);
429 ts->ts_rssi_ext2 = MS(status, AR_TxRSSIAnt12); 427 ts->ts_rssi_ext2 = MS(status, AR_TxRSSIAnt12);
430 428
431 status = ACCESS_ONCE(adc->ctl15);
432 ts->duration[0] = MS(status, AR_PacketDur0);
433 ts->duration[1] = MS(status, AR_PacketDur1);
434 status = ACCESS_ONCE(adc->ctl16);
435 ts->duration[2] = MS(status, AR_PacketDur2);
436 ts->duration[3] = MS(status, AR_PacketDur3);
437
438 memset(ads, 0, sizeof(*ads)); 429 memset(ads, 0, sizeof(*ads));
439 430
440 return 0; 431 return 0;
441} 432}
442 433
434static int ar9003_hw_get_duration(struct ath_hw *ah, const void *ds, int index)
435{
436 const struct ar9003_txc *adc = ds;
437
438 switch (index) {
439 case 0:
440 return MS(ACCESS_ONCE(adc->ctl15), AR_PacketDur0);
441 case 1:
442 return MS(ACCESS_ONCE(adc->ctl15), AR_PacketDur1);
443 case 2:
444 return MS(ACCESS_ONCE(adc->ctl16), AR_PacketDur2);
445 case 3:
446 return MS(ACCESS_ONCE(adc->ctl16), AR_PacketDur3);
447 default:
448 return 0;
449 }
450}
451
443void ar9003_hw_attach_mac_ops(struct ath_hw *hw) 452void ar9003_hw_attach_mac_ops(struct ath_hw *hw)
444{ 453{
445 struct ath_hw_ops *ops = ath9k_hw_ops(hw); 454 struct ath_hw_ops *ops = ath9k_hw_ops(hw);
@@ -449,6 +458,7 @@ void ar9003_hw_attach_mac_ops(struct ath_hw *hw)
449 ops->get_isr = ar9003_hw_get_isr; 458 ops->get_isr = ar9003_hw_get_isr;
450 ops->set_txdesc = ar9003_set_txdesc; 459 ops->set_txdesc = ar9003_set_txdesc;
451 ops->proc_txdesc = ar9003_hw_proc_txdesc; 460 ops->proc_txdesc = ar9003_hw_proc_txdesc;
461 ops->get_duration = ar9003_hw_get_duration;
452} 462}
453 463
454void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size) 464void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size)
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
index 542a8d51d3b0..697c4ae90af0 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
@@ -517,6 +517,23 @@ static void ar9003_hw_spur_mitigate(struct ath_hw *ah,
517 ar9003_hw_spur_mitigate_ofdm(ah, chan); 517 ar9003_hw_spur_mitigate_ofdm(ah, chan);
518} 518}
519 519
520static u32 ar9003_hw_compute_pll_control_soc(struct ath_hw *ah,
521 struct ath9k_channel *chan)
522{
523 u32 pll;
524
525 pll = SM(0x5, AR_RTC_9300_SOC_PLL_REFDIV);
526
527 if (chan && IS_CHAN_HALF_RATE(chan))
528 pll |= SM(0x1, AR_RTC_9300_SOC_PLL_CLKSEL);
529 else if (chan && IS_CHAN_QUARTER_RATE(chan))
530 pll |= SM(0x2, AR_RTC_9300_SOC_PLL_CLKSEL);
531
532 pll |= SM(0x2c, AR_RTC_9300_SOC_PLL_DIV_INT);
533
534 return pll;
535}
536
520static u32 ar9003_hw_compute_pll_control(struct ath_hw *ah, 537static u32 ar9003_hw_compute_pll_control(struct ath_hw *ah,
521 struct ath9k_channel *chan) 538 struct ath9k_channel *chan)
522{ 539{
@@ -1781,7 +1798,12 @@ void ar9003_hw_attach_phy_ops(struct ath_hw *ah)
1781 1798
1782 priv_ops->rf_set_freq = ar9003_hw_set_channel; 1799 priv_ops->rf_set_freq = ar9003_hw_set_channel;
1783 priv_ops->spur_mitigate_freq = ar9003_hw_spur_mitigate; 1800 priv_ops->spur_mitigate_freq = ar9003_hw_spur_mitigate;
1784 priv_ops->compute_pll_control = ar9003_hw_compute_pll_control; 1801
1802 if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah))
1803 priv_ops->compute_pll_control = ar9003_hw_compute_pll_control_soc;
1804 else
1805 priv_ops->compute_pll_control = ar9003_hw_compute_pll_control;
1806
1785 priv_ops->set_channel_regs = ar9003_hw_set_channel_regs; 1807 priv_ops->set_channel_regs = ar9003_hw_set_channel_regs;
1786 priv_ops->init_bb = ar9003_hw_init_bb; 1808 priv_ops->init_bb = ar9003_hw_init_bb;
1787 priv_ops->process_ini = ar9003_hw_process_ini; 1809 priv_ops->process_ini = ar9003_hw_process_ini;
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h
index 8cd116efe3ea..bfa0b1518da1 100644
--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
@@ -354,6 +354,7 @@ struct ath_chanctx {
354 bool switch_after_beacon; 354 bool switch_after_beacon;
355 355
356 short nvifs; 356 short nvifs;
357 short nvifs_assigned;
357 unsigned int rxfilter; 358 unsigned int rxfilter;
358}; 359};
359 360
@@ -454,7 +455,8 @@ void ath9k_p2p_bss_info_changed(struct ath_softc *sc,
454void ath9k_beacon_add_noa(struct ath_softc *sc, struct ath_vif *avp, 455void ath9k_beacon_add_noa(struct ath_softc *sc, struct ath_vif *avp,
455 struct sk_buff *skb); 456 struct sk_buff *skb);
456void ath9k_p2p_ps_timer(void *priv); 457void ath9k_p2p_ps_timer(void *priv);
457void ath9k_chanctx_wake_queues(struct ath_softc *sc); 458void ath9k_chanctx_wake_queues(struct ath_softc *sc, struct ath_chanctx *ctx);
459void ath9k_chanctx_stop_queues(struct ath_softc *sc, struct ath_chanctx *ctx);
458void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx); 460void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx);
459 461
460void ath_chanctx_beacon_recv_ev(struct ath_softc *sc, 462void ath_chanctx_beacon_recv_ev(struct ath_softc *sc,
@@ -524,7 +526,12 @@ static inline void ath9k_beacon_add_noa(struct ath_softc *sc, struct ath_vif *av
524static inline void ath9k_p2p_ps_timer(struct ath_softc *sc) 526static inline void ath9k_p2p_ps_timer(struct ath_softc *sc)
525{ 527{
526} 528}
527static inline void ath9k_chanctx_wake_queues(struct ath_softc *sc) 529static inline void ath9k_chanctx_wake_queues(struct ath_softc *sc,
530 struct ath_chanctx *ctx)
531{
532}
533static inline void ath9k_chanctx_stop_queues(struct ath_softc *sc,
534 struct ath_chanctx *ctx)
528{ 535{
529} 536}
530static inline void ath_chanctx_check_active(struct ath_softc *sc, 537static inline void ath_chanctx_check_active(struct ath_softc *sc,
@@ -585,6 +592,11 @@ void ath9k_release_buffered_frames(struct ieee80211_hw *hw,
585struct ath_vif { 592struct ath_vif {
586 struct list_head list; 593 struct list_head list;
587 594
595 /* BSS info */
596 u8 bssid[ETH_ALEN];
597 u16 aid;
598 bool assoc;
599
588 struct ieee80211_vif *vif; 600 struct ieee80211_vif *vif;
589 struct ath_node mcast_node; 601 struct ath_node mcast_node;
590 int av_bslot; 602 int av_bslot;
diff --git a/drivers/net/wireless/ath/ath9k/channel.c b/drivers/net/wireless/ath/ath9k/channel.c
index 77c99eb55834..945c89826b14 100644
--- a/drivers/net/wireless/ath/ath9k/channel.c
+++ b/drivers/net/wireless/ath/ath9k/channel.c
@@ -211,7 +211,7 @@ void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
211 switch (vif->type) { 211 switch (vif->type) {
212 case NL80211_IFTYPE_P2P_CLIENT: 212 case NL80211_IFTYPE_P2P_CLIENT:
213 case NL80211_IFTYPE_STATION: 213 case NL80211_IFTYPE_STATION:
214 if (vif->bss_conf.assoc) 214 if (avp->assoc)
215 active = true; 215 active = true;
216 break; 216 break;
217 default: 217 default:
@@ -761,6 +761,13 @@ void ath_offchannel_next(struct ath_softc *sc)
761 761
762void ath_roc_complete(struct ath_softc *sc, bool abort) 762void ath_roc_complete(struct ath_softc *sc, bool abort)
763{ 763{
764 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
765
766 if (abort)
767 ath_dbg(common, CHAN_CTX, "RoC aborted\n");
768 else
769 ath_dbg(common, CHAN_CTX, "RoC expired\n");
770
764 sc->offchannel.roc_vif = NULL; 771 sc->offchannel.roc_vif = NULL;
765 sc->offchannel.roc_chan = NULL; 772 sc->offchannel.roc_chan = NULL;
766 if (!abort) 773 if (!abort)
@@ -917,7 +924,7 @@ ath_chanctx_send_vif_ps_frame(struct ath_softc *sc, struct ath_vif *avp,
917 924
918 switch (vif->type) { 925 switch (vif->type) {
919 case NL80211_IFTYPE_STATION: 926 case NL80211_IFTYPE_STATION:
920 if (!vif->bss_conf.assoc) 927 if (!avp->assoc)
921 return false; 928 return false;
922 929
923 skb = ieee80211_nullfunc_get(sc->hw, vif); 930 skb = ieee80211_nullfunc_get(sc->hw, vif);
@@ -1037,9 +1044,11 @@ static void ath_offchannel_channel_change(struct ath_softc *sc)
1037void ath_chanctx_set_next(struct ath_softc *sc, bool force) 1044void ath_chanctx_set_next(struct ath_softc *sc, bool force)
1038{ 1045{
1039 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 1046 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1047 struct ath_chanctx *old_ctx;
1040 struct timespec ts; 1048 struct timespec ts;
1041 bool measure_time = false; 1049 bool measure_time = false;
1042 bool send_ps = false; 1050 bool send_ps = false;
1051 bool queues_stopped = false;
1043 1052
1044 spin_lock_bh(&sc->chan_lock); 1053 spin_lock_bh(&sc->chan_lock);
1045 if (!sc->next_chan) { 1054 if (!sc->next_chan) {
@@ -1069,6 +1078,10 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
1069 getrawmonotonic(&ts); 1078 getrawmonotonic(&ts);
1070 measure_time = true; 1079 measure_time = true;
1071 } 1080 }
1081
1082 ath9k_chanctx_stop_queues(sc, sc->cur_chan);
1083 queues_stopped = true;
1084
1072 __ath9k_flush(sc->hw, ~0, true); 1085 __ath9k_flush(sc->hw, ~0, true);
1073 1086
1074 if (ath_chanctx_send_ps_frame(sc, true)) 1087 if (ath_chanctx_send_ps_frame(sc, true))
@@ -1082,6 +1095,7 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
1082 sc->cur_chan->tsf_val = ath9k_hw_gettsf64(sc->sc_ah); 1095 sc->cur_chan->tsf_val = ath9k_hw_gettsf64(sc->sc_ah);
1083 } 1096 }
1084 } 1097 }
1098 old_ctx = sc->cur_chan;
1085 sc->cur_chan = sc->next_chan; 1099 sc->cur_chan = sc->next_chan;
1086 sc->cur_chan->stopped = false; 1100 sc->cur_chan->stopped = false;
1087 sc->next_chan = NULL; 1101 sc->next_chan = NULL;
@@ -1104,7 +1118,16 @@ void ath_chanctx_set_next(struct ath_softc *sc, bool force)
1104 if (measure_time) 1118 if (measure_time)
1105 sc->sched.channel_switch_time = 1119 sc->sched.channel_switch_time =
1106 ath9k_hw_get_tsf_offset(&ts, NULL); 1120 ath9k_hw_get_tsf_offset(&ts, NULL);
1121 /*
1122 * A reset will ensure that all queues are woken up,
1123 * so there is no need to awaken them again.
1124 */
1125 goto out;
1107 } 1126 }
1127
1128 if (queues_stopped)
1129 ath9k_chanctx_wake_queues(sc, old_ctx);
1130out:
1108 if (send_ps) 1131 if (send_ps)
1109 ath_chanctx_send_ps_frame(sc, false); 1132 ath_chanctx_send_ps_frame(sc, false);
1110 1133
@@ -1170,18 +1193,37 @@ bool ath9k_is_chanctx_enabled(void)
1170/* Queue management */ 1193/* Queue management */
1171/********************/ 1194/********************/
1172 1195
1173void ath9k_chanctx_wake_queues(struct ath_softc *sc) 1196void ath9k_chanctx_stop_queues(struct ath_softc *sc, struct ath_chanctx *ctx)
1197{
1198 struct ath_hw *ah = sc->sc_ah;
1199 int i;
1200
1201 if (ctx == &sc->offchannel.chan) {
1202 ieee80211_stop_queue(sc->hw,
1203 sc->hw->offchannel_tx_hw_queue);
1204 } else {
1205 for (i = 0; i < IEEE80211_NUM_ACS; i++)
1206 ieee80211_stop_queue(sc->hw,
1207 ctx->hw_queue_base + i);
1208 }
1209
1210 if (ah->opmode == NL80211_IFTYPE_AP)
1211 ieee80211_stop_queue(sc->hw, sc->hw->queues - 2);
1212}
1213
1214
1215void ath9k_chanctx_wake_queues(struct ath_softc *sc, struct ath_chanctx *ctx)
1174{ 1216{
1175 struct ath_hw *ah = sc->sc_ah; 1217 struct ath_hw *ah = sc->sc_ah;
1176 int i; 1218 int i;
1177 1219
1178 if (sc->cur_chan == &sc->offchannel.chan) { 1220 if (ctx == &sc->offchannel.chan) {
1179 ieee80211_wake_queue(sc->hw, 1221 ieee80211_wake_queue(sc->hw,
1180 sc->hw->offchannel_tx_hw_queue); 1222 sc->hw->offchannel_tx_hw_queue);
1181 } else { 1223 } else {
1182 for (i = 0; i < IEEE80211_NUM_ACS; i++) 1224 for (i = 0; i < IEEE80211_NUM_ACS; i++)
1183 ieee80211_wake_queue(sc->hw, 1225 ieee80211_wake_queue(sc->hw,
1184 sc->cur_chan->hw_queue_base + i); 1226 ctx->hw_queue_base + i);
1185 } 1227 }
1186 1228
1187 if (ah->opmode == NL80211_IFTYPE_AP) 1229 if (ah->opmode == NL80211_IFTYPE_AP)
@@ -1339,7 +1381,7 @@ void ath9k_p2p_ps_timer(void *priv)
1339 rcu_read_lock(); 1381 rcu_read_lock();
1340 1382
1341 vif = avp->vif; 1383 vif = avp->vif;
1342 sta = ieee80211_find_sta(vif, vif->bss_conf.bssid); 1384 sta = ieee80211_find_sta(vif, avp->bssid);
1343 if (!sta) 1385 if (!sta)
1344 goto out; 1386 goto out;
1345 1387
diff --git a/drivers/net/wireless/ath/ath9k/dynack.c b/drivers/net/wireless/ath/ath9k/dynack.c
index 6ae8e0bc9e1f..22b3cc4c27cd 100644
--- a/drivers/net/wireless/ath/ath9k/dynack.c
+++ b/drivers/net/wireless/ath/ath9k/dynack.c
@@ -202,7 +202,7 @@ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
202 ridx = ts->ts_rateindex; 202 ridx = ts->ts_rateindex;
203 203
204 da->st_rbf.ts[da->st_rbf.t_rb].tstamp = ts->ts_tstamp; 204 da->st_rbf.ts[da->st_rbf.t_rb].tstamp = ts->ts_tstamp;
205 da->st_rbf.ts[da->st_rbf.t_rb].dur = ts->duration[ts->ts_rateindex]; 205 da->st_rbf.ts[da->st_rbf.t_rb].dur = ts->duration;
206 ether_addr_copy(da->st_rbf.addr[da->st_rbf.t_rb].h_dest, hdr->addr1); 206 ether_addr_copy(da->st_rbf.addr[da->st_rbf.t_rb].h_dest, hdr->addr1);
207 ether_addr_copy(da->st_rbf.addr[da->st_rbf.t_rb].h_src, hdr->addr2); 207 ether_addr_copy(da->st_rbf.addr[da->st_rbf.t_rb].h_src, hdr->addr2);
208 208
diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h
index a47ea8423f1e..8e85efeaeffc 100644
--- a/drivers/net/wireless/ath/ath9k/hw-ops.h
+++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
@@ -67,6 +67,12 @@ static inline int ath9k_hw_txprocdesc(struct ath_hw *ah, void *ds,
67 return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts); 67 return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts);
68} 68}
69 69
70static inline int ath9k_hw_get_duration(struct ath_hw *ah, const void *ds,
71 int index)
72{
73 return ath9k_hw_ops(ah)->get_duration(ah, ds, index);
74}
75
70static inline void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah, 76static inline void ath9k_hw_antdiv_comb_conf_get(struct ath_hw *ah,
71 struct ath_hw_antcomb_conf *antconf) 77 struct ath_hw_antcomb_conf *antconf)
72{ 78{
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 3aed729e4d5e..8be4b1453394 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -222,31 +222,28 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah)
222{ 222{
223 u32 val; 223 u32 val;
224 224
225 if (ah->get_mac_revision)
226 ah->hw_version.macRev = ah->get_mac_revision();
227
225 switch (ah->hw_version.devid) { 228 switch (ah->hw_version.devid) {
226 case AR5416_AR9100_DEVID: 229 case AR5416_AR9100_DEVID:
227 ah->hw_version.macVersion = AR_SREV_VERSION_9100; 230 ah->hw_version.macVersion = AR_SREV_VERSION_9100;
228 break; 231 break;
229 case AR9300_DEVID_AR9330: 232 case AR9300_DEVID_AR9330:
230 ah->hw_version.macVersion = AR_SREV_VERSION_9330; 233 ah->hw_version.macVersion = AR_SREV_VERSION_9330;
231 if (ah->get_mac_revision) { 234 if (!ah->get_mac_revision) {
232 ah->hw_version.macRev = ah->get_mac_revision();
233 } else {
234 val = REG_READ(ah, AR_SREV); 235 val = REG_READ(ah, AR_SREV);
235 ah->hw_version.macRev = MS(val, AR_SREV_REVISION2); 236 ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
236 } 237 }
237 return; 238 return;
238 case AR9300_DEVID_AR9340: 239 case AR9300_DEVID_AR9340:
239 ah->hw_version.macVersion = AR_SREV_VERSION_9340; 240 ah->hw_version.macVersion = AR_SREV_VERSION_9340;
240 val = REG_READ(ah, AR_SREV);
241 ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
242 return; 241 return;
243 case AR9300_DEVID_QCA955X: 242 case AR9300_DEVID_QCA955X:
244 ah->hw_version.macVersion = AR_SREV_VERSION_9550; 243 ah->hw_version.macVersion = AR_SREV_VERSION_9550;
245 return; 244 return;
246 case AR9300_DEVID_AR953X: 245 case AR9300_DEVID_AR953X:
247 ah->hw_version.macVersion = AR_SREV_VERSION_9531; 246 ah->hw_version.macVersion = AR_SREV_VERSION_9531;
248 if (ah->get_mac_revision)
249 ah->hw_version.macRev = ah->get_mac_revision();
250 return; 247 return;
251 } 248 }
252 249
@@ -704,6 +701,8 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
704{ 701{
705 u32 pll; 702 u32 pll;
706 703
704 pll = ath9k_hw_compute_pll_control(ah, chan);
705
707 if (AR_SREV_9485(ah) || AR_SREV_9565(ah)) { 706 if (AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
708 /* program BB PLL ki and kd value, ki=0x4, kd=0x40 */ 707 /* program BB PLL ki and kd value, ki=0x4, kd=0x40 */
709 REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2, 708 REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
@@ -754,7 +753,8 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
754 REG_RMW_FIELD(ah, AR_CH0_DDR_DPLL3, 753 REG_RMW_FIELD(ah, AR_CH0_DDR_DPLL3,
755 AR_CH0_DPLL3_PHASE_SHIFT, 0x1); 754 AR_CH0_DPLL3_PHASE_SHIFT, 0x1);
756 755
757 REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c); 756 REG_WRITE(ah, AR_RTC_PLL_CONTROL,
757 pll | AR_RTC_9300_PLL_BYPASS);
758 udelay(1000); 758 udelay(1000);
759 759
760 /* program refdiv, nint, frac to RTC register */ 760 /* program refdiv, nint, frac to RTC register */
@@ -770,7 +770,8 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
770 } else if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah)) { 770 } else if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
771 u32 regval, pll2_divint, pll2_divfrac, refdiv; 771 u32 regval, pll2_divint, pll2_divfrac, refdiv;
772 772
773 REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c); 773 REG_WRITE(ah, AR_RTC_PLL_CONTROL,
774 pll | AR_RTC_9300_SOC_PLL_BYPASS);
774 udelay(1000); 775 udelay(1000);
775 776
776 REG_SET_BIT(ah, AR_PHY_PLL_MODE, 0x1 << 16); 777 REG_SET_BIT(ah, AR_PHY_PLL_MODE, 0x1 << 16);
@@ -843,7 +844,6 @@ static void ath9k_hw_init_pll(struct ath_hw *ah,
843 udelay(1000); 844 udelay(1000);
844 } 845 }
845 846
846 pll = ath9k_hw_compute_pll_control(ah, chan);
847 if (AR_SREV_9565(ah)) 847 if (AR_SREV_9565(ah))
848 pll |= 0x40000; 848 pll |= 0x40000;
849 REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); 849 REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
@@ -1192,9 +1192,12 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
1192 1192
1193 switch (opmode) { 1193 switch (opmode) {
1194 case NL80211_IFTYPE_ADHOC: 1194 case NL80211_IFTYPE_ADHOC:
1195 set |= AR_STA_ID1_ADHOC; 1195 if (!AR_SREV_9340_13(ah)) {
1196 REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION); 1196 set |= AR_STA_ID1_ADHOC;
1197 break; 1197 REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1198 break;
1199 }
1200 /* fall through */
1198 case NL80211_IFTYPE_MESH_POINT: 1201 case NL80211_IFTYPE_MESH_POINT:
1199 case NL80211_IFTYPE_AP: 1202 case NL80211_IFTYPE_AP:
1200 set |= AR_STA_ID1_STA_AP; 1203 set |= AR_STA_ID1_STA_AP;
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index b9eef3362fbb..975074fc11bc 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -691,6 +691,7 @@ struct ath_hw_ops {
691 struct ath_tx_info *i); 691 struct ath_tx_info *i);
692 int (*proc_txdesc)(struct ath_hw *ah, void *ds, 692 int (*proc_txdesc)(struct ath_hw *ah, void *ds,
693 struct ath_tx_status *ts); 693 struct ath_tx_status *ts);
694 int (*get_duration)(struct ath_hw *ah, const void *ds, int index);
694 void (*antdiv_comb_conf_get)(struct ath_hw *ah, 695 void (*antdiv_comb_conf_get)(struct ath_hw *ah,
695 struct ath_hw_antcomb_conf *antconf); 696 struct ath_hw_antcomb_conf *antconf);
696 void (*antdiv_comb_conf_set)(struct ath_hw *ah, 697 void (*antdiv_comb_conf_set)(struct ath_hw *ah,
diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h
index cd05a7791073..aa69ceaad0be 100644
--- a/drivers/net/wireless/ath/ath9k/mac.h
+++ b/drivers/net/wireless/ath/ath9k/mac.h
@@ -121,7 +121,7 @@ struct ath_tx_status {
121 u32 evm0; 121 u32 evm0;
122 u32 evm1; 122 u32 evm1;
123 u32 evm2; 123 u32 evm2;
124 u32 duration[4]; 124 u32 duration;
125}; 125};
126 126
127struct ath_rx_status { 127struct ath_rx_status {
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c
index fbf23ac61c97..205162449b72 100644
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
@@ -60,8 +60,10 @@ static bool ath9k_has_pending_frames(struct ath_softc *sc, struct ath_txq *txq)
60 60
61 spin_lock_bh(&txq->axq_lock); 61 spin_lock_bh(&txq->axq_lock);
62 62
63 if (txq->axq_depth) 63 if (txq->axq_depth) {
64 pending = true; 64 pending = true;
65 goto out;
66 }
65 67
66 if (txq->mac80211_qnum >= 0) { 68 if (txq->mac80211_qnum >= 0) {
67 struct list_head *list; 69 struct list_head *list;
@@ -70,6 +72,7 @@ static bool ath9k_has_pending_frames(struct ath_softc *sc, struct ath_txq *txq)
70 if (!list_empty(list)) 72 if (!list_empty(list))
71 pending = true; 73 pending = true;
72 } 74 }
75out:
73 spin_unlock_bh(&txq->axq_lock); 76 spin_unlock_bh(&txq->axq_lock);
74 return pending; 77 return pending;
75} 78}
@@ -261,12 +264,7 @@ static bool ath_complete_reset(struct ath_softc *sc, bool start)
261 264
262 ath9k_hw_set_interrupts(ah); 265 ath9k_hw_set_interrupts(ah);
263 ath9k_hw_enable_interrupts(ah); 266 ath9k_hw_enable_interrupts(ah);
264 267 ieee80211_wake_queues(sc->hw);
265 if (!ath9k_is_chanctx_enabled())
266 ieee80211_wake_queues(sc->hw);
267 else
268 ath9k_chanctx_wake_queues(sc);
269
270 ath9k_p2p_ps_timer(sc); 268 ath9k_p2p_ps_timer(sc);
271 269
272 return true; 270 return true;
@@ -898,6 +896,7 @@ static bool ath9k_uses_beacons(int type)
898static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data, 896static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data,
899 u8 *mac, struct ieee80211_vif *vif) 897 u8 *mac, struct ieee80211_vif *vif)
900{ 898{
899 struct ath_vif *avp = (struct ath_vif *)vif->drv_priv;
901 int i; 900 int i;
902 901
903 if (iter_data->has_hw_macaddr) { 902 if (iter_data->has_hw_macaddr) {
@@ -918,7 +917,7 @@ static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data,
918 break; 917 break;
919 case NL80211_IFTYPE_STATION: 918 case NL80211_IFTYPE_STATION:
920 iter_data->nstations++; 919 iter_data->nstations++;
921 if (vif->bss_conf.assoc && !iter_data->primary_sta) 920 if (avp->assoc && !iter_data->primary_sta)
922 iter_data->primary_sta = vif; 921 iter_data->primary_sta = vif;
923 break; 922 break;
924 case NL80211_IFTYPE_ADHOC: 923 case NL80211_IFTYPE_ADHOC:
@@ -939,6 +938,34 @@ static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data,
939 } 938 }
940} 939}
941 940
941static void ath9k_update_bssid_mask(struct ath_softc *sc,
942 struct ath_chanctx *ctx,
943 struct ath9k_vif_iter_data *iter_data)
944{
945 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
946 struct ath_vif *avp;
947 int i;
948
949 if (!ath9k_is_chanctx_enabled())
950 return;
951
952 list_for_each_entry(avp, &ctx->vifs, list) {
953 if (ctx->nvifs_assigned != 1)
954 continue;
955
956 if (!avp->vif->p2p || !iter_data->has_hw_macaddr)
957 continue;
958
959 ether_addr_copy(common->curbssid, avp->bssid);
960
961 /* perm_addr will be used as the p2p device address. */
962 for (i = 0; i < ETH_ALEN; i++)
963 iter_data->mask[i] &=
964 ~(iter_data->hw_macaddr[i] ^
965 sc->hw->wiphy->perm_addr[i]);
966 }
967}
968
942/* Called with sc->mutex held. */ 969/* Called with sc->mutex held. */
943void ath9k_calculate_iter_data(struct ath_softc *sc, 970void ath9k_calculate_iter_data(struct ath_softc *sc,
944 struct ath_chanctx *ctx, 971 struct ath_chanctx *ctx,
@@ -957,19 +984,21 @@ void ath9k_calculate_iter_data(struct ath_softc *sc,
957 984
958 list_for_each_entry(avp, &ctx->vifs, list) 985 list_for_each_entry(avp, &ctx->vifs, list)
959 ath9k_vif_iter(iter_data, avp->vif->addr, avp->vif); 986 ath9k_vif_iter(iter_data, avp->vif->addr, avp->vif);
987
988 ath9k_update_bssid_mask(sc, ctx, iter_data);
960} 989}
961 990
962static void ath9k_set_assoc_state(struct ath_softc *sc, 991static void ath9k_set_assoc_state(struct ath_softc *sc,
963 struct ieee80211_vif *vif, bool changed) 992 struct ieee80211_vif *vif, bool changed)
964{ 993{
965 struct ath_common *common = ath9k_hw_common(sc->sc_ah); 994 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
966 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 995 struct ath_vif *avp = (struct ath_vif *)vif->drv_priv;
967 unsigned long flags; 996 unsigned long flags;
968 997
969 set_bit(ATH_OP_PRIM_STA_VIF, &common->op_flags); 998 set_bit(ATH_OP_PRIM_STA_VIF, &common->op_flags);
970 999
971 ether_addr_copy(common->curbssid, bss_conf->bssid); 1000 ether_addr_copy(common->curbssid, avp->bssid);
972 common->curaid = bss_conf->aid; 1001 common->curaid = avp->aid;
973 ath9k_hw_write_associd(sc->sc_ah); 1002 ath9k_hw_write_associd(sc->sc_ah);
974 1003
975 if (changed) { 1004 if (changed) {
@@ -1121,6 +1150,10 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
1121 else 1150 else
1122 clear_bit(ATH_OP_PRIM_STA_VIF, &common->op_flags); 1151 clear_bit(ATH_OP_PRIM_STA_VIF, &common->op_flags);
1123 1152
1153 ath_dbg(common, CONFIG,
1154 "macaddr: %pM, bssid: %pM, bssidmask: %pM\n",
1155 common->macaddr, common->curbssid, common->bssidmask);
1156
1124 ath9k_ps_restore(sc); 1157 ath9k_ps_restore(sc);
1125} 1158}
1126 1159
@@ -1698,6 +1731,10 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
1698 ath_dbg(common, CONFIG, "BSSID %pM Changed ASSOC %d\n", 1731 ath_dbg(common, CONFIG, "BSSID %pM Changed ASSOC %d\n",
1699 bss_conf->bssid, bss_conf->assoc); 1732 bss_conf->bssid, bss_conf->assoc);
1700 1733
1734 ether_addr_copy(avp->bssid, bss_conf->bssid);
1735 avp->aid = bss_conf->aid;
1736 avp->assoc = bss_conf->assoc;
1737
1701 ath9k_calculate_summary_state(sc, avp->chanctx); 1738 ath9k_calculate_summary_state(sc, avp->chanctx);
1702 1739
1703 if (ath9k_is_chanctx_enabled()) { 1740 if (ath9k_is_chanctx_enabled()) {
@@ -1932,9 +1969,6 @@ static bool ath9k_has_tx_pending(struct ath_softc *sc)
1932 if (!ATH_TXQ_SETUP(sc, i)) 1969 if (!ATH_TXQ_SETUP(sc, i))
1933 continue; 1970 continue;
1934 1971
1935 if (!sc->tx.txq[i].axq_depth)
1936 continue;
1937
1938 npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]); 1972 npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]);
1939 if (npend) 1973 if (npend)
1940 break; 1974 break;
@@ -1960,7 +1994,6 @@ void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
1960 struct ath_common *common = ath9k_hw_common(ah); 1994 struct ath_common *common = ath9k_hw_common(ah);
1961 int timeout = HZ / 5; /* 200 ms */ 1995 int timeout = HZ / 5; /* 200 ms */
1962 bool drain_txq; 1996 bool drain_txq;
1963 int i;
1964 1997
1965 cancel_delayed_work_sync(&sc->tx_complete_work); 1998 cancel_delayed_work_sync(&sc->tx_complete_work);
1966 1999
@@ -1988,10 +2021,6 @@ void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
1988 ath_reset(sc); 2021 ath_reset(sc);
1989 2022
1990 ath9k_ps_restore(sc); 2023 ath9k_ps_restore(sc);
1991 for (i = 0; i < IEEE80211_NUM_ACS; i++) {
1992 ieee80211_wake_queue(sc->hw,
1993 sc->cur_chan->hw_queue_base + i);
1994 }
1995 } 2024 }
1996 2025
1997 ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0); 2026 ieee80211_queue_delayed_work(hw, &sc->tx_complete_work, 0);
@@ -2000,16 +2029,8 @@ void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
2000static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw) 2029static bool ath9k_tx_frames_pending(struct ieee80211_hw *hw)
2001{ 2030{
2002 struct ath_softc *sc = hw->priv; 2031 struct ath_softc *sc = hw->priv;
2003 int i;
2004 2032
2005 for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) { 2033 return ath9k_has_tx_pending(sc);
2006 if (!ATH_TXQ_SETUP(sc, i))
2007 continue;
2008
2009 if (ath9k_has_pending_frames(sc, &sc->tx.txq[i]))
2010 return true;
2011 }
2012 return false;
2013} 2034}
2014 2035
2015static int ath9k_tx_last_beacon(struct ieee80211_hw *hw) 2036static int ath9k_tx_last_beacon(struct ieee80211_hw *hw)
@@ -2351,6 +2372,7 @@ static int ath9k_assign_vif_chanctx(struct ieee80211_hw *hw,
2351 conf->def.chan->center_freq); 2372 conf->def.chan->center_freq);
2352 2373
2353 avp->chanctx = ctx; 2374 avp->chanctx = ctx;
2375 ctx->nvifs_assigned++;
2354 list_add_tail(&avp->list, &ctx->vifs); 2376 list_add_tail(&avp->list, &ctx->vifs);
2355 ath9k_calculate_summary_state(sc, ctx); 2377 ath9k_calculate_summary_state(sc, ctx);
2356 for (i = 0; i < IEEE80211_NUM_ACS; i++) 2378 for (i = 0; i < IEEE80211_NUM_ACS; i++)
@@ -2379,6 +2401,7 @@ static void ath9k_unassign_vif_chanctx(struct ieee80211_hw *hw,
2379 conf->def.chan->center_freq); 2401 conf->def.chan->center_freq);
2380 2402
2381 avp->chanctx = NULL; 2403 avp->chanctx = NULL;
2404 ctx->nvifs_assigned--;
2382 list_del(&avp->list); 2405 list_del(&avp->list);
2383 ath9k_calculate_summary_state(sc, ctx); 2406 ath9k_calculate_summary_state(sc, ctx);
2384 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) 2407 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
index a1499700bcf2..2a938f4feac5 100644
--- a/drivers/net/wireless/ath/ath9k/reg.h
+++ b/drivers/net/wireless/ath/ath9k/reg.h
@@ -903,6 +903,10 @@
903#define AR_SREV_9340(_ah) \ 903#define AR_SREV_9340(_ah) \
904 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9340)) 904 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9340))
905 905
906#define AR_SREV_9340_13(_ah) \
907 (AR_SREV_9340((_ah)) && \
908 ((_ah)->hw_version.macRev == AR_SREV_REVISION_9340_13))
909
906#define AR_SREV_9340_13_OR_LATER(_ah) \ 910#define AR_SREV_9340_13_OR_LATER(_ah) \
907 (AR_SREV_9340((_ah)) && \ 911 (AR_SREV_9340((_ah)) && \
908 ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9340_13)) 912 ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9340_13))
@@ -1240,12 +1244,23 @@ enum {
1240#define AR_CH0_DPLL3_PHASE_SHIFT_S 23 1244#define AR_CH0_DPLL3_PHASE_SHIFT_S 23
1241#define AR_PHY_CCA_NOM_VAL_2GHZ -118 1245#define AR_PHY_CCA_NOM_VAL_2GHZ -118
1242 1246
1247#define AR_RTC_9300_SOC_PLL_DIV_INT 0x0000003f
1248#define AR_RTC_9300_SOC_PLL_DIV_INT_S 0
1249#define AR_RTC_9300_SOC_PLL_DIV_FRAC 0x000fffc0
1250#define AR_RTC_9300_SOC_PLL_DIV_FRAC_S 6
1251#define AR_RTC_9300_SOC_PLL_REFDIV 0x01f00000
1252#define AR_RTC_9300_SOC_PLL_REFDIV_S 20
1253#define AR_RTC_9300_SOC_PLL_CLKSEL 0x06000000
1254#define AR_RTC_9300_SOC_PLL_CLKSEL_S 25
1255#define AR_RTC_9300_SOC_PLL_BYPASS 0x08000000
1256
1243#define AR_RTC_9300_PLL_DIV 0x000003ff 1257#define AR_RTC_9300_PLL_DIV 0x000003ff
1244#define AR_RTC_9300_PLL_DIV_S 0 1258#define AR_RTC_9300_PLL_DIV_S 0
1245#define AR_RTC_9300_PLL_REFDIV 0x00003C00 1259#define AR_RTC_9300_PLL_REFDIV 0x00003C00
1246#define AR_RTC_9300_PLL_REFDIV_S 10 1260#define AR_RTC_9300_PLL_REFDIV_S 10
1247#define AR_RTC_9300_PLL_CLKSEL 0x0000C000 1261#define AR_RTC_9300_PLL_CLKSEL 0x0000C000
1248#define AR_RTC_9300_PLL_CLKSEL_S 14 1262#define AR_RTC_9300_PLL_CLKSEL_S 14
1263#define AR_RTC_9300_PLL_BYPASS 0x00010000
1249 1264
1250#define AR_RTC_9160_PLL_DIV 0x000003ff 1265#define AR_RTC_9160_PLL_DIV 0x000003ff
1251#define AR_RTC_9160_PLL_DIV_S 0 1266#define AR_RTC_9160_PLL_DIV_S 0
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c
index 93ad31be0ada..151ae49fa57e 100644
--- a/drivers/net/wireless/ath/ath9k/xmit.c
+++ b/drivers/net/wireless/ath/ath9k/xmit.c
@@ -158,7 +158,6 @@ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
158{ 158{
159 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 159 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
160 struct ath_frame_info *fi = get_frame_info(skb); 160 struct ath_frame_info *fi = get_frame_info(skb);
161 int hw_queue;
162 int q = fi->txq; 161 int q = fi->txq;
163 162
164 if (q < 0) 163 if (q < 0)
@@ -168,10 +167,9 @@ static void ath_txq_skb_done(struct ath_softc *sc, struct ath_txq *txq,
168 if (WARN_ON(--txq->pending_frames < 0)) 167 if (WARN_ON(--txq->pending_frames < 0))
169 txq->pending_frames = 0; 168 txq->pending_frames = 0;
170 169
171 hw_queue = (info->hw_queue >= sc->hw->queues - 2) ? q : info->hw_queue;
172 if (txq->stopped && 170 if (txq->stopped &&
173 txq->pending_frames < sc->tx.txq_max_pending[q]) { 171 txq->pending_frames < sc->tx.txq_max_pending[q]) {
174 ieee80211_wake_queue(sc->hw, hw_queue); 172 ieee80211_wake_queue(sc->hw, info->hw_queue);
175 txq->stopped = false; 173 txq->stopped = false;
176 } 174 }
177} 175}
@@ -685,6 +683,8 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
685 if (bf_is_ampdu_not_probing(bf)) 683 if (bf_is_ampdu_not_probing(bf))
686 txq->axq_ampdu_depth--; 684 txq->axq_ampdu_depth--;
687 685
686 ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc,
687 ts->ts_rateindex);
688 if (!bf_isampdu(bf)) { 688 if (!bf_isampdu(bf)) {
689 if (!flush) { 689 if (!flush) {
690 info = IEEE80211_SKB_CB(bf->bf_mpdu); 690 info = IEEE80211_SKB_CB(bf->bf_mpdu);
@@ -1841,15 +1841,17 @@ void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq)
1841 if (txq->mac80211_qnum < 0) 1841 if (txq->mac80211_qnum < 0)
1842 return; 1842 return;
1843 1843
1844 if (test_bit(ATH_OP_HW_RESET, &common->op_flags))
1845 return;
1846
1844 spin_lock_bh(&sc->chan_lock); 1847 spin_lock_bh(&sc->chan_lock);
1845 ac_list = &sc->cur_chan->acq[txq->mac80211_qnum]; 1848 ac_list = &sc->cur_chan->acq[txq->mac80211_qnum];
1846 spin_unlock_bh(&sc->chan_lock);
1847 1849
1848 if (test_bit(ATH_OP_HW_RESET, &common->op_flags) || 1850 if (list_empty(ac_list)) {
1849 list_empty(ac_list)) 1851 spin_unlock_bh(&sc->chan_lock);
1850 return; 1852 return;
1853 }
1851 1854
1852 spin_lock_bh(&sc->chan_lock);
1853 rcu_read_lock(); 1855 rcu_read_lock();
1854 1856
1855 last_ac = list_entry(ac_list->prev, struct ath_atx_ac, list); 1857 last_ac = list_entry(ac_list->prev, struct ath_atx_ac, list);
@@ -2207,9 +2209,8 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
2207 struct ath_txq *txq = txctl->txq; 2209 struct ath_txq *txq = txctl->txq;
2208 struct ath_atx_tid *tid = NULL; 2210 struct ath_atx_tid *tid = NULL;
2209 struct ath_buf *bf; 2211 struct ath_buf *bf;
2210 bool queue; 2212 bool queue, skip_uapsd = false;
2211 int q, hw_queue; 2213 int q, ret;
2212 int ret;
2213 2214
2214 if (vif) 2215 if (vif)
2215 avp = (void *)vif->drv_priv; 2216 avp = (void *)vif->drv_priv;
@@ -2228,14 +2229,13 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
2228 */ 2229 */
2229 2230
2230 q = skb_get_queue_mapping(skb); 2231 q = skb_get_queue_mapping(skb);
2231 hw_queue = (info->hw_queue >= sc->hw->queues - 2) ? q : info->hw_queue;
2232 2232
2233 ath_txq_lock(sc, txq); 2233 ath_txq_lock(sc, txq);
2234 if (txq == sc->tx.txq_map[q]) { 2234 if (txq == sc->tx.txq_map[q]) {
2235 fi->txq = q; 2235 fi->txq = q;
2236 if (++txq->pending_frames > sc->tx.txq_max_pending[q] && 2236 if (++txq->pending_frames > sc->tx.txq_max_pending[q] &&
2237 !txq->stopped) { 2237 !txq->stopped) {
2238 ieee80211_stop_queue(sc->hw, hw_queue); 2238 ieee80211_stop_queue(sc->hw, info->hw_queue);
2239 txq->stopped = true; 2239 txq->stopped = true;
2240 } 2240 }
2241 } 2241 }
@@ -2250,15 +2250,14 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb,
2250 sc->cur_chan->stopped) && !txctl->force_channel) { 2250 sc->cur_chan->stopped) && !txctl->force_channel) {
2251 if (!txctl->an) 2251 if (!txctl->an)
2252 txctl->an = &avp->mcast_node; 2252 txctl->an = &avp->mcast_node;
2253 info->flags &= ~IEEE80211_TX_CTL_PS_RESPONSE;
2254 queue = true; 2253 queue = true;
2254 skip_uapsd = true;
2255 } 2255 }
2256 2256
2257 if (txctl->an && queue) 2257 if (txctl->an && queue)
2258 tid = ath_get_skb_tid(sc, txctl->an, skb); 2258 tid = ath_get_skb_tid(sc, txctl->an, skb);
2259 2259
2260 if (info->flags & (IEEE80211_TX_CTL_PS_RESPONSE | 2260 if (!skip_uapsd && (info->flags & IEEE80211_TX_CTL_PS_RESPONSE)) {
2261 IEEE80211_TX_CTL_TX_OFFCHAN)) {
2262 ath_txq_unlock(sc, txq); 2261 ath_txq_unlock(sc, txq);
2263 txq = sc->tx.uapsdq; 2262 txq = sc->tx.uapsdq;
2264 ath_txq_lock(sc, txq); 2263 ath_txq_lock(sc, txq);
diff --git a/drivers/net/wireless/ath/main.c b/drivers/net/wireless/ath/main.c
index 8b0ac14d5c32..83f47af19280 100644
--- a/drivers/net/wireless/ath/main.c
+++ b/drivers/net/wireless/ath/main.c
@@ -20,6 +20,7 @@
20#include <linux/module.h> 20#include <linux/module.h>
21 21
22#include "ath.h" 22#include "ath.h"
23#include "trace.h"
23 24
24MODULE_AUTHOR("Atheros Communications"); 25MODULE_AUTHOR("Atheros Communications");
25MODULE_DESCRIPTION("Shared library for Atheros wireless LAN cards."); 26MODULE_DESCRIPTION("Shared library for Atheros wireless LAN cards.");
@@ -84,6 +85,8 @@ void ath_printk(const char *level, const struct ath_common* common,
84 else 85 else
85 printk("%sath: %pV", level, &vaf); 86 printk("%sath: %pV", level, &vaf);
86 87
88 trace_ath_log(common->hw->wiphy, &vaf);
89
87 va_end(args); 90 va_end(args);
88} 91}
89EXPORT_SYMBOL(ath_printk); 92EXPORT_SYMBOL(ath_printk);
diff --git a/drivers/net/wireless/ath/trace.c b/drivers/net/wireless/ath/trace.c
new file mode 100644
index 000000000000..18fb3a071931
--- /dev/null
+++ b/drivers/net/wireless/ath/trace.c
@@ -0,0 +1,20 @@
1/*
2 * Copyright (c) 2014 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 <linux/module.h>
18
19#define CREATE_TRACE_POINTS
20#include "trace.h"
diff --git a/drivers/net/wireless/ath/trace.h b/drivers/net/wireless/ath/trace.h
new file mode 100644
index 000000000000..ba711644d27e
--- /dev/null
+++ b/drivers/net/wireless/ath/trace.h
@@ -0,0 +1,71 @@
1/*
2 * Copyright (c) 2014 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#if !defined(_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
18#define _TRACE_H
19
20#include <linux/tracepoint.h>
21#include "ath.h"
22
23#undef TRACE_SYSTEM
24#define TRACE_SYSTEM ath
25
26#if !defined(CONFIG_ATH_TRACEPOINTS)
27
28#undef TRACE_EVENT
29#define TRACE_EVENT(name, proto, ...) static inline void trace_ ## name(proto) {}
30
31#endif /* CONFIG_ATH_TRACEPOINTS */
32
33TRACE_EVENT(ath_log,
34
35 TP_PROTO(struct wiphy *wiphy,
36 struct va_format *vaf),
37
38 TP_ARGS(wiphy, vaf),
39
40 TP_STRUCT__entry(
41 __string(device, wiphy_name(wiphy))
42 __string(driver, KBUILD_MODNAME)
43 __dynamic_array(char, msg, ATH_DBG_MAX_LEN)
44 ),
45
46 TP_fast_assign(
47 __assign_str(device, wiphy_name(wiphy));
48 __assign_str(driver, KBUILD_MODNAME);
49 WARN_ON_ONCE(vsnprintf(__get_dynamic_array(msg),
50 ATH_DBG_MAX_LEN,
51 vaf->fmt,
52 *vaf->va) >= ATH_DBG_MAX_LEN);
53 ),
54
55 TP_printk(
56 "%s %s %s",
57 __get_str(driver),
58 __get_str(device),
59 __get_str(msg)
60 )
61);
62
63#endif /* _TRACE_H || TRACE_HEADER_MULTI_READ */
64
65#undef TRACE_INCLUDE_PATH
66#define TRACE_INCLUDE_PATH .
67#undef TRACE_INCLUDE_FILE
68#define TRACE_INCLUDE_FILE trace
69
70/* This part must be outside protection */
71#include <trace/define_trace.h>
diff --git a/drivers/net/wireless/ath/wil6210/Makefile b/drivers/net/wireless/ath/wil6210/Makefile
index a471d74ae409..8ad4b5f97e04 100644
--- a/drivers/net/wireless/ath/wil6210/Makefile
+++ b/drivers/net/wireless/ath/wil6210/Makefile
@@ -10,10 +10,12 @@ wil6210-y += interrupt.o
10wil6210-y += txrx.o 10wil6210-y += txrx.o
11wil6210-y += debug.o 11wil6210-y += debug.o
12wil6210-y += rx_reorder.o 12wil6210-y += rx_reorder.o
13wil6210-y += ioctl.o
13wil6210-y += fw.o 14wil6210-y += fw.o
14wil6210-$(CONFIG_WIL6210_TRACING) += trace.o 15wil6210-$(CONFIG_WIL6210_TRACING) += trace.o
15wil6210-y += wil_platform.o 16wil6210-y += wil_platform.o
16wil6210-$(CONFIG_WIL6210_PLATFORM_MSM) += wil_platform_msm.o 17wil6210-$(CONFIG_WIL6210_PLATFORM_MSM) += wil_platform_msm.o
18wil6210-y += ethtool.o
17 19
18# for tracing framework to find trace.h 20# for tracing framework to find trace.h
19CFLAGS_trace.o := -I$(src) 21CFLAGS_trace.o := -I$(src)
diff --git a/drivers/net/wireless/ath/wil6210/cfg80211.c b/drivers/net/wireless/ath/wil6210/cfg80211.c
index f3a31e8c2535..d9f4b30dd343 100644
--- a/drivers/net/wireless/ath/wil6210/cfg80211.c
+++ b/drivers/net/wireless/ath/wil6210/cfg80211.c
@@ -728,6 +728,8 @@ static int wil_cfg80211_start_ap(struct wiphy *wiphy,
728 wil_print_bcon_data(bcon); 728 wil_print_bcon_data(bcon);
729 } 729 }
730 730
731 wil_set_recovery_state(wil, fw_recovery_idle);
732
731 mutex_lock(&wil->mutex); 733 mutex_lock(&wil->mutex);
732 734
733 __wil_down(wil); 735 __wil_down(wil);
@@ -775,6 +777,8 @@ static int wil_cfg80211_stop_ap(struct wiphy *wiphy,
775 777
776 wil_dbg_misc(wil, "%s()\n", __func__); 778 wil_dbg_misc(wil, "%s()\n", __func__);
777 779
780 wil_set_recovery_state(wil, fw_recovery_idle);
781
778 mutex_lock(&wil->mutex); 782 mutex_lock(&wil->mutex);
779 783
780 rc = wmi_pcp_stop(wil); 784 rc = wmi_pcp_stop(wil);
diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c
index eb2204e5fdd4..54a6ddc6301b 100644
--- a/drivers/net/wireless/ath/wil6210/debugfs.c
+++ b/drivers/net/wireless/ath/wil6210/debugfs.c
@@ -1041,6 +1041,71 @@ static const struct file_operations fops_info = {
1041 .llseek = seq_lseek, 1041 .llseek = seq_lseek,
1042}; 1042};
1043 1043
1044/*---------recovery------------*/
1045/* mode = [manual|auto]
1046 * state = [idle|pending|running]
1047 */
1048static ssize_t wil_read_file_recovery(struct file *file, char __user *user_buf,
1049 size_t count, loff_t *ppos)
1050{
1051 struct wil6210_priv *wil = file->private_data;
1052 char buf[80];
1053 int n;
1054 static const char * const sstate[] = {"idle", "pending", "running"};
1055
1056 n = snprintf(buf, sizeof(buf), "mode = %s\nstate = %s\n",
1057 no_fw_recovery ? "manual" : "auto",
1058 sstate[wil->recovery_state]);
1059
1060 n = min_t(int, n, sizeof(buf));
1061
1062 return simple_read_from_buffer(user_buf, count, ppos,
1063 buf, n);
1064}
1065
1066static ssize_t wil_write_file_recovery(struct file *file,
1067 const char __user *buf_,
1068 size_t count, loff_t *ppos)
1069{
1070 struct wil6210_priv *wil = file->private_data;
1071 static const char run_command[] = "run";
1072 char buf[sizeof(run_command) + 1]; /* to detect "runx" */
1073 ssize_t rc;
1074
1075 if (wil->recovery_state != fw_recovery_pending) {
1076 wil_err(wil, "No recovery pending\n");
1077 return -EINVAL;
1078 }
1079
1080 if (*ppos != 0) {
1081 wil_err(wil, "Offset [%d]\n", (int)*ppos);
1082 return -EINVAL;
1083 }
1084
1085 if (count > sizeof(buf)) {
1086 wil_err(wil, "Input too long, len = %d\n", (int)count);
1087 return -EINVAL;
1088 }
1089
1090 rc = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, buf_, count);
1091 if (rc < 0)
1092 return rc;
1093
1094 buf[rc] = '\0';
1095 if (0 == strcmp(buf, run_command))
1096 wil_set_recovery_state(wil, fw_recovery_running);
1097 else
1098 wil_err(wil, "Bad recovery command \"%s\"\n", buf);
1099
1100 return rc;
1101}
1102
1103static const struct file_operations fops_recovery = {
1104 .read = wil_read_file_recovery,
1105 .write = wil_write_file_recovery,
1106 .open = simple_open,
1107};
1108
1044/*---------Station matrix------------*/ 1109/*---------Station matrix------------*/
1045static void wil_print_rxtid(struct seq_file *s, struct wil_tid_ampdu_rx *r) 1110static void wil_print_rxtid(struct seq_file *s, struct wil_tid_ampdu_rx *r)
1046{ 1111{
@@ -1152,6 +1217,7 @@ static const struct {
1152 {"freq", S_IRUGO, &fops_freq}, 1217 {"freq", S_IRUGO, &fops_freq},
1153 {"link", S_IRUGO, &fops_link}, 1218 {"link", S_IRUGO, &fops_link},
1154 {"info", S_IRUGO, &fops_info}, 1219 {"info", S_IRUGO, &fops_info},
1220 {"recovery", S_IRUGO | S_IWUSR, &fops_recovery},
1155}; 1221};
1156 1222
1157static void wil6210_debugfs_init_files(struct wil6210_priv *wil, 1223static void wil6210_debugfs_init_files(struct wil6210_priv *wil,
@@ -1194,6 +1260,7 @@ static const struct dbg_off dbg_wil_off[] = {
1194 WIL_FIELD(status, S_IRUGO | S_IWUSR, doff_ulong), 1260 WIL_FIELD(status, S_IRUGO | S_IWUSR, doff_ulong),
1195 WIL_FIELD(fw_version, S_IRUGO, doff_u32), 1261 WIL_FIELD(fw_version, S_IRUGO, doff_u32),
1196 WIL_FIELD(hw_version, S_IRUGO, doff_x32), 1262 WIL_FIELD(hw_version, S_IRUGO, doff_x32),
1263 WIL_FIELD(recovery_count, S_IRUGO, doff_u32),
1197 {}, 1264 {},
1198}; 1265};
1199 1266
diff --git a/drivers/net/wireless/ath/wil6210/ethtool.c b/drivers/net/wireless/ath/wil6210/ethtool.c
new file mode 100644
index 000000000000..d686638972be
--- /dev/null
+++ b/drivers/net/wireless/ath/wil6210/ethtool.c
@@ -0,0 +1,103 @@
1/*
2 * Copyright (c) 2014 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 <linux/etherdevice.h>
18#include <linux/pci.h>
19#include <linux/rtnetlink.h>
20#include <net/cfg80211.h>
21
22#include "wil6210.h"
23
24static int wil_ethtoolops_begin(struct net_device *ndev)
25{
26 struct wil6210_priv *wil = ndev_to_wil(ndev);
27
28 mutex_lock(&wil->mutex);
29
30 wil_dbg_misc(wil, "%s()\n", __func__);
31
32 return 0;
33}
34
35static void wil_ethtoolops_complete(struct net_device *ndev)
36{
37 struct wil6210_priv *wil = ndev_to_wil(ndev);
38
39 wil_dbg_misc(wil, "%s()\n", __func__);
40
41 mutex_unlock(&wil->mutex);
42}
43
44static int wil_ethtoolops_get_coalesce(struct net_device *ndev,
45 struct ethtool_coalesce *cp)
46{
47 struct wil6210_priv *wil = ndev_to_wil(ndev);
48 u32 itr_en, itr_val = 0;
49
50 wil_dbg_misc(wil, "%s()\n", __func__);
51
52 itr_en = ioread32(wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL));
53 if (itr_en & BIT_DMA_ITR_CNT_CRL_EN)
54 itr_val = ioread32(wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_TRSH));
55
56 cp->rx_coalesce_usecs = itr_val;
57
58 return 0;
59}
60
61static int wil_ethtoolops_set_coalesce(struct net_device *ndev,
62 struct ethtool_coalesce *cp)
63{
64 struct wil6210_priv *wil = ndev_to_wil(ndev);
65
66 wil_dbg_misc(wil, "%s(%d usec)\n", __func__, cp->rx_coalesce_usecs);
67
68 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) {
69 wil_dbg_misc(wil, "No IRQ coalescing in monitor mode\n");
70 return -EINVAL;
71 }
72
73 /* only @rx_coalesce_usecs supported, ignore
74 * other parameters
75 */
76
77 if (cp->rx_coalesce_usecs > WIL6210_ITR_TRSH_MAX)
78 goto out_bad;
79
80 wil->itr_trsh = cp->rx_coalesce_usecs;
81 wil_set_itr_trsh(wil);
82
83 return 0;
84
85out_bad:
86 wil_dbg_misc(wil, "Unsupported coalescing params. Raw command:\n");
87 print_hex_dump_debug("DBG[MISC] coal ", DUMP_PREFIX_OFFSET, 16, 4,
88 cp, sizeof(*cp), false);
89 return -EINVAL;
90}
91
92static const struct ethtool_ops wil_ethtool_ops = {
93 .begin = wil_ethtoolops_begin,
94 .complete = wil_ethtoolops_complete,
95 .get_drvinfo = cfg80211_get_drvinfo,
96 .get_coalesce = wil_ethtoolops_get_coalesce,
97 .set_coalesce = wil_ethtoolops_set_coalesce,
98};
99
100void wil_set_ethtoolops(struct net_device *ndev)
101{
102 ndev->ethtool_ops = &wil_ethtool_ops;
103}
diff --git a/drivers/net/wireless/ath/wil6210/interrupt.c b/drivers/net/wireless/ath/wil6210/interrupt.c
index 7269bac111b9..90f416f239bd 100644
--- a/drivers/net/wireless/ath/wil6210/interrupt.c
+++ b/drivers/net/wireless/ath/wil6210/interrupt.c
@@ -157,17 +157,7 @@ void wil_unmask_irq(struct wil6210_priv *wil)
157 offsetof(struct RGF_ICR, ICC)); 157 offsetof(struct RGF_ICR, ICC));
158 158
159 /* interrupt moderation parameters */ 159 /* interrupt moderation parameters */
160 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR) { 160 wil_set_itr_trsh(wil);
161 /* disable interrupt moderation for monitor
162 * to get better timestamp precision
163 */
164 iowrite32(0, wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL));
165 } else {
166 iowrite32(WIL6210_ITR_TRSH,
167 wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_TRSH));
168 iowrite32(BIT_DMA_ITR_CNT_CRL_EN,
169 wil->csr + HOSTADDR(RGF_DMA_ITR_CNT_CRL));
170 }
171 161
172 wil6210_unmask_irq_pseudo(wil); 162 wil6210_unmask_irq_pseudo(wil);
173 wil6210_unmask_irq_tx(wil); 163 wil6210_unmask_irq_tx(wil);
diff --git a/drivers/net/wireless/ath/wil6210/ioctl.c b/drivers/net/wireless/ath/wil6210/ioctl.c
new file mode 100644
index 000000000000..e9c0673819c6
--- /dev/null
+++ b/drivers/net/wireless/ath/wil6210/ioctl.c
@@ -0,0 +1,173 @@
1/*
2 * Copyright (c) 2014 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 <linux/uaccess.h>
18
19#include "wil6210.h"
20#include <uapi/linux/wil6210_uapi.h>
21
22#define wil_hex_dump_ioctl(prefix_str, buf, len) \
23 print_hex_dump_debug("DBG[IOC ]" prefix_str, \
24 DUMP_PREFIX_OFFSET, 16, 1, buf, len, true)
25#define wil_dbg_ioctl(wil, fmt, arg...) wil_dbg(wil, "DBG[IOC ]" fmt, ##arg)
26
27static void __iomem *wil_ioc_addr(struct wil6210_priv *wil, uint32_t addr,
28 uint32_t size, enum wil_memio_op op)
29{
30 void __iomem *a;
31 u32 off;
32
33 switch (op & wil_mmio_addr_mask) {
34 case wil_mmio_addr_linker:
35 a = wmi_buffer(wil, cpu_to_le32(addr));
36 break;
37 case wil_mmio_addr_ahb:
38 a = wmi_addr(wil, addr);
39 break;
40 case wil_mmio_addr_bar:
41 a = wmi_addr(wil, addr + WIL6210_FW_HOST_OFF);
42 break;
43 default:
44 wil_err(wil, "Unsupported address mode, op = 0x%08x\n", op);
45 return NULL;
46 }
47
48 off = a - wil->csr;
49 if (size >= WIL6210_MEM_SIZE - off) {
50 wil_err(wil, "Requested block does not fit into memory: "
51 "off = 0x%08x size = 0x%08x\n", off, size);
52 return NULL;
53 }
54
55 return a;
56}
57
58static int wil_ioc_memio_dword(struct wil6210_priv *wil, void __user *data)
59{
60 struct wil_memio io;
61 void __iomem *a;
62 bool need_copy = false;
63
64 if (copy_from_user(&io, data, sizeof(io)))
65 return -EFAULT;
66
67 wil_dbg_ioctl(wil, "IO: addr = 0x%08x val = 0x%08x op = 0x%08x\n",
68 io.addr, io.val, io.op);
69
70 a = wil_ioc_addr(wil, io.addr, sizeof(u32), io.op);
71 if (!a) {
72 wil_err(wil, "invalid address 0x%08x, op = 0x%08x\n", io.addr,
73 io.op);
74 return -EINVAL;
75 }
76 /* operation */
77 switch (io.op & wil_mmio_op_mask) {
78 case wil_mmio_read:
79 io.val = ioread32(a);
80 need_copy = true;
81 break;
82 case wil_mmio_write:
83 iowrite32(io.val, a);
84 wmb(); /* make sure write propagated to HW */
85 break;
86 default:
87 wil_err(wil, "Unsupported operation, op = 0x%08x\n", io.op);
88 return -EINVAL;
89 }
90
91 if (need_copy) {
92 wil_dbg_ioctl(wil, "IO done: addr = 0x%08x"
93 " val = 0x%08x op = 0x%08x\n",
94 io.addr, io.val, io.op);
95 if (copy_to_user(data, &io, sizeof(io)))
96 return -EFAULT;
97 }
98
99 return 0;
100}
101
102static int wil_ioc_memio_block(struct wil6210_priv *wil, void __user *data)
103{
104 struct wil_memio_block io;
105 void *block;
106 void __iomem *a;
107 int rc = 0;
108
109 if (copy_from_user(&io, data, sizeof(io)))
110 return -EFAULT;
111
112 wil_dbg_ioctl(wil, "IO: addr = 0x%08x size = 0x%08x op = 0x%08x\n",
113 io.addr, io.size, io.op);
114
115 /* size */
116 if (io.size % 4) {
117 wil_err(wil, "size is not multiple of 4: 0x%08x\n", io.size);
118 return -EINVAL;
119 }
120
121 a = wil_ioc_addr(wil, io.addr, io.size, io.op);
122 if (!a) {
123 wil_err(wil, "invalid address 0x%08x, op = 0x%08x\n", io.addr,
124 io.op);
125 return -EINVAL;
126 }
127
128 block = kmalloc(io.size, GFP_USER);
129 if (!block)
130 return -ENOMEM;
131
132 /* operation */
133 switch (io.op & wil_mmio_op_mask) {
134 case wil_mmio_read:
135 wil_memcpy_fromio_32(block, a, io.size);
136 wil_hex_dump_ioctl("Read ", block, io.size);
137 if (copy_to_user(io.block, block, io.size)) {
138 rc = -EFAULT;
139 goto out_free;
140 }
141 break;
142 case wil_mmio_write:
143 if (copy_from_user(block, io.block, io.size)) {
144 rc = -EFAULT;
145 goto out_free;
146 }
147 wil_memcpy_toio_32(a, block, io.size);
148 wmb(); /* make sure write propagated to HW */
149 wil_hex_dump_ioctl("Write ", block, io.size);
150 break;
151 default:
152 wil_err(wil, "Unsupported operation, op = 0x%08x\n", io.op);
153 rc = -EINVAL;
154 break;
155 }
156
157out_free:
158 kfree(block);
159 return rc;
160}
161
162int wil_ioctl(struct wil6210_priv *wil, void __user *data, int cmd)
163{
164 switch (cmd) {
165 case WIL_IOCTL_MEMIO:
166 return wil_ioc_memio_dword(wil, data);
167 case WIL_IOCTL_MEMIO_BLOCK:
168 return wil_ioc_memio_block(wil, data);
169 default:
170 wil_dbg_ioctl(wil, "Unsupported IOCTL 0x%04x\n", cmd);
171 return -ENOIOCTLCMD;
172 }
173}
diff --git a/drivers/net/wireless/ath/wil6210/main.c b/drivers/net/wireless/ath/wil6210/main.c
index 21667e0c3d14..6500caf8d609 100644
--- a/drivers/net/wireless/ath/wil6210/main.c
+++ b/drivers/net/wireless/ath/wil6210/main.c
@@ -25,14 +25,19 @@
25#define WAIT_FOR_DISCONNECT_TIMEOUT_MS 2000 25#define WAIT_FOR_DISCONNECT_TIMEOUT_MS 2000
26#define WAIT_FOR_DISCONNECT_INTERVAL_MS 10 26#define WAIT_FOR_DISCONNECT_INTERVAL_MS 10
27 27
28static bool no_fw_recovery; 28bool 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 FW error recovery"); 30MODULE_PARM_DESC(no_fw_recovery, " disable automatic FW error recovery");
31 31
32static bool no_fw_load = true; 32static bool no_fw_load = true;
33module_param(no_fw_load, bool, S_IRUGO | S_IWUSR); 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."); 34MODULE_PARM_DESC(no_fw_load, " do not download FW, use one in on-card flash.");
35 35
36static unsigned int itr_trsh = WIL6210_ITR_TRSH_DEFAULT;
37
38module_param(itr_trsh, uint, S_IRUGO);
39MODULE_PARM_DESC(itr_trsh, " Interrupt moderation threshold, usecs.");
40
36#define RST_DELAY (20) /* msec, for loop in @wil_target_reset */ 41#define RST_DELAY (20) /* msec, for loop in @wil_target_reset */
37#define RST_COUNT (1 + 1000/RST_DELAY) /* round up to be above 1 sec total */ 42#define RST_COUNT (1 + 1000/RST_DELAY) /* round up to be above 1 sec total */
38 43
@@ -186,17 +191,38 @@ static void wil_scan_timer_fn(ulong x)
186 schedule_work(&wil->fw_error_worker); 191 schedule_work(&wil->fw_error_worker);
187} 192}
188 193
194static int wil_wait_for_recovery(struct wil6210_priv *wil)
195{
196 if (wait_event_interruptible(wil->wq, wil->recovery_state !=
197 fw_recovery_pending)) {
198 wil_err(wil, "Interrupt, canceling recovery\n");
199 return -ERESTARTSYS;
200 }
201 if (wil->recovery_state != fw_recovery_running) {
202 wil_info(wil, "Recovery cancelled\n");
203 return -EINTR;
204 }
205 wil_info(wil, "Proceed with recovery\n");
206 return 0;
207}
208
209void wil_set_recovery_state(struct wil6210_priv *wil, int state)
210{
211 wil_dbg_misc(wil, "%s(%d -> %d)\n", __func__,
212 wil->recovery_state, state);
213
214 wil->recovery_state = state;
215 wake_up_interruptible(&wil->wq);
216}
217
189static void wil_fw_error_worker(struct work_struct *work) 218static void wil_fw_error_worker(struct work_struct *work)
190{ 219{
191 struct wil6210_priv *wil = container_of(work, 220 struct wil6210_priv *wil = container_of(work, struct wil6210_priv,
192 struct wil6210_priv, fw_error_worker); 221 fw_error_worker);
193 struct wireless_dev *wdev = wil->wdev; 222 struct wireless_dev *wdev = wil->wdev;
194 223
195 wil_dbg_misc(wil, "fw error worker\n"); 224 wil_dbg_misc(wil, "fw error worker\n");
196 225
197 if (no_fw_recovery)
198 return;
199
200 /* increment @recovery_count if less then WIL6210_FW_RECOVERY_TO 226 /* increment @recovery_count if less then WIL6210_FW_RECOVERY_TO
201 * passed since last recovery attempt 227 * passed since last recovery attempt
202 */ 228 */
@@ -219,8 +245,13 @@ static void wil_fw_error_worker(struct work_struct *work)
219 case NL80211_IFTYPE_STATION: 245 case NL80211_IFTYPE_STATION:
220 case NL80211_IFTYPE_P2P_CLIENT: 246 case NL80211_IFTYPE_P2P_CLIENT:
221 case NL80211_IFTYPE_MONITOR: 247 case NL80211_IFTYPE_MONITOR:
222 wil_info(wil, "fw error recovery started (try %d)...\n", 248 wil_info(wil, "fw error recovery requested (try %d)...\n",
223 wil->recovery_count); 249 wil->recovery_count);
250 if (!no_fw_recovery)
251 wil->recovery_state = fw_recovery_running;
252 if (0 != wil_wait_for_recovery(wil))
253 break;
254
224 __wil_down(wil); 255 __wil_down(wil);
225 __wil_up(wil); 256 __wil_up(wil);
226 break; 257 break;
@@ -297,6 +328,7 @@ int wil_priv_init(struct wil6210_priv *wil)
297 328
298 INIT_LIST_HEAD(&wil->pending_wmi_ev); 329 INIT_LIST_HEAD(&wil->pending_wmi_ev);
299 spin_lock_init(&wil->wmi_ev_lock); 330 spin_lock_init(&wil->wmi_ev_lock);
331 init_waitqueue_head(&wil->wq);
300 332
301 wil->wmi_wq = create_singlethread_workqueue(WIL_NAME"_wmi"); 333 wil->wmi_wq = create_singlethread_workqueue(WIL_NAME"_wmi");
302 if (!wil->wmi_wq) 334 if (!wil->wmi_wq)
@@ -309,6 +341,7 @@ int wil_priv_init(struct wil6210_priv *wil)
309 } 341 }
310 342
311 wil->last_fw_recovery = jiffies; 343 wil->last_fw_recovery = jiffies;
344 wil->itr_trsh = itr_trsh;
312 345
313 return 0; 346 return 0;
314} 347}
@@ -325,6 +358,7 @@ void wil_priv_deinit(struct wil6210_priv *wil)
325{ 358{
326 wil_dbg_misc(wil, "%s()\n", __func__); 359 wil_dbg_misc(wil, "%s()\n", __func__);
327 360
361 wil_set_recovery_state(wil, fw_recovery_idle);
328 del_timer_sync(&wil->scan_timer); 362 del_timer_sync(&wil->scan_timer);
329 cancel_work_sync(&wil->disconnect_worker); 363 cancel_work_sync(&wil->disconnect_worker);
330 cancel_work_sync(&wil->fw_error_worker); 364 cancel_work_sync(&wil->fw_error_worker);
@@ -437,6 +471,26 @@ static int wil_target_reset(struct wil6210_priv *wil)
437 return 0; 471 return 0;
438} 472}
439 473
474/**
475 * wil_set_itr_trsh: - apply interrupt coalescing params
476 */
477void wil_set_itr_trsh(struct wil6210_priv *wil)
478{
479 /* disable, use usec resolution */
480 W(RGF_DMA_ITR_CNT_CRL, BIT_DMA_ITR_CNT_CRL_EXT_TICK);
481
482 /* disable interrupt moderation for monitor
483 * to get better timestamp precision
484 */
485 if (wil->wdev->iftype == NL80211_IFTYPE_MONITOR)
486 return;
487
488 wil_info(wil, "set ITR_TRSH = %d usec\n", wil->itr_trsh);
489 W(RGF_DMA_ITR_CNT_TRSH, wil->itr_trsh);
490 W(RGF_DMA_ITR_CNT_CRL, BIT_DMA_ITR_CNT_CRL_EN |
491 BIT_DMA_ITR_CNT_CRL_EXT_TICK); /* start it */
492}
493
440#undef R 494#undef R
441#undef W 495#undef W
442#undef S 496#undef S
@@ -547,6 +601,7 @@ int wil_reset(struct wil6210_priv *wil)
547void wil_fw_error_recovery(struct wil6210_priv *wil) 601void wil_fw_error_recovery(struct wil6210_priv *wil)
548{ 602{
549 wil_dbg_misc(wil, "starting fw error recovery\n"); 603 wil_dbg_misc(wil, "starting fw error recovery\n");
604 wil->recovery_state = fw_recovery_pending;
550 schedule_work(&wil->fw_error_worker); 605 schedule_work(&wil->fw_error_worker);
551} 606}
552 607
@@ -698,6 +753,7 @@ int wil_down(struct wil6210_priv *wil)
698 753
699 wil_dbg_misc(wil, "%s()\n", __func__); 754 wil_dbg_misc(wil, "%s()\n", __func__);
700 755
756 wil_set_recovery_state(wil, fw_recovery_idle);
701 mutex_lock(&wil->mutex); 757 mutex_lock(&wil->mutex);
702 rc = __wil_down(wil); 758 rc = __wil_down(wil);
703 mutex_unlock(&wil->mutex); 759 mutex_unlock(&wil->mutex);
diff --git a/drivers/net/wireless/ath/wil6210/netdev.c b/drivers/net/wireless/ath/wil6210/netdev.c
index 1c0c77d9a14f..239965106c05 100644
--- a/drivers/net/wireless/ath/wil6210/netdev.c
+++ b/drivers/net/wireless/ath/wil6210/netdev.c
@@ -52,6 +52,17 @@ static int wil_change_mtu(struct net_device *ndev, int new_mtu)
52 return 0; 52 return 0;
53} 53}
54 54
55static int wil_do_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd)
56{
57 struct wil6210_priv *wil = ndev_to_wil(ndev);
58
59 int ret = wil_ioctl(wil, ifr->ifr_data, cmd);
60
61 wil_dbg_misc(wil, "ioctl(0x%04x) -> %d\n", cmd, ret);
62
63 return ret;
64}
65
55static const struct net_device_ops wil_netdev_ops = { 66static const struct net_device_ops wil_netdev_ops = {
56 .ndo_open = wil_open, 67 .ndo_open = wil_open,
57 .ndo_stop = wil_stop, 68 .ndo_stop = wil_stop,
@@ -59,6 +70,7 @@ static const struct net_device_ops wil_netdev_ops = {
59 .ndo_set_mac_address = eth_mac_addr, 70 .ndo_set_mac_address = eth_mac_addr,
60 .ndo_validate_addr = eth_validate_addr, 71 .ndo_validate_addr = eth_validate_addr,
61 .ndo_change_mtu = wil_change_mtu, 72 .ndo_change_mtu = wil_change_mtu,
73 .ndo_do_ioctl = wil_do_ioctl,
62}; 74};
63 75
64static int wil6210_netdev_poll_rx(struct napi_struct *napi, int budget) 76static int wil6210_netdev_poll_rx(struct napi_struct *napi, int budget)
@@ -149,6 +161,7 @@ void *wil_if_alloc(struct device *dev, void __iomem *csr)
149 } 161 }
150 162
151 ndev->netdev_ops = &wil_netdev_ops; 163 ndev->netdev_ops = &wil_netdev_ops;
164 wil_set_ethtoolops(ndev);
152 ndev->ieee80211_ptr = wdev; 165 ndev->ieee80211_ptr = wdev;
153 ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM | 166 ndev->hw_features = NETIF_F_HW_CSUM | NETIF_F_RXCSUM |
154 NETIF_F_SG | NETIF_F_GRO; 167 NETIF_F_SG | NETIF_F_GRO;
diff --git a/drivers/net/wireless/ath/wil6210/wil6210.h b/drivers/net/wireless/ath/wil6210/wil6210.h
index 41aa79327584..ce6488e42091 100644
--- a/drivers/net/wireless/ath/wil6210/wil6210.h
+++ b/drivers/net/wireless/ath/wil6210/wil6210.h
@@ -23,6 +23,7 @@
23#include <linux/timex.h> 23#include <linux/timex.h>
24#include "wil_platform.h" 24#include "wil_platform.h"
25 25
26extern bool no_fw_recovery;
26 27
27#define WIL_NAME "wil6210" 28#define WIL_NAME "wil6210"
28#define WIL_FW_NAME "wil6210.fw" 29#define WIL_FW_NAME "wil6210.fw"
@@ -52,7 +53,9 @@ static inline u32 WIL_GET_BITS(u32 x, int b0, int b1)
52#define WIL6210_MAX_TX_RINGS (24) /* HW limit */ 53#define WIL6210_MAX_TX_RINGS (24) /* HW limit */
53#define WIL6210_MAX_CID (8) /* HW limit */ 54#define WIL6210_MAX_CID (8) /* HW limit */
54#define WIL6210_NAPI_BUDGET (16) /* arbitrary */ 55#define WIL6210_NAPI_BUDGET (16) /* arbitrary */
55#define WIL6210_ITR_TRSH (10000) /* arbitrary - about 15 IRQs/msec */ 56/* Max supported by wil6210 value for interrupt threshold is 5sec. */
57#define WIL6210_ITR_TRSH_MAX (5000000)
58#define WIL6210_ITR_TRSH_DEFAULT (300) /* usec */
56#define WIL6210_FW_RECOVERY_RETRIES (5) /* try to recover this many times */ 59#define WIL6210_FW_RECOVERY_RETRIES (5) /* try to recover this many times */
57#define WIL6210_FW_RECOVERY_TO msecs_to_jiffies(5000) 60#define WIL6210_FW_RECOVERY_TO msecs_to_jiffies(5000)
58#define WIL6210_SCAN_TO msecs_to_jiffies(10000) 61#define WIL6210_SCAN_TO msecs_to_jiffies(10000)
@@ -377,6 +380,12 @@ struct wil_sta_info {
377 unsigned long tid_rx_stop_requested[BITS_TO_LONGS(WIL_STA_TID_NUM)]; 380 unsigned long tid_rx_stop_requested[BITS_TO_LONGS(WIL_STA_TID_NUM)];
378}; 381};
379 382
383enum {
384 fw_recovery_idle = 0,
385 fw_recovery_pending = 1,
386 fw_recovery_running = 2,
387};
388
380struct wil6210_priv { 389struct wil6210_priv {
381 struct pci_dev *pdev; 390 struct pci_dev *pdev;
382 int n_msi; 391 int n_msi;
@@ -387,12 +396,15 @@ struct wil6210_priv {
387 u32 hw_version; 396 u32 hw_version;
388 struct wil_board *board; 397 struct wil_board *board;
389 u8 n_mids; /* number of additional MIDs as reported by FW */ 398 u8 n_mids; /* number of additional MIDs as reported by FW */
390 int recovery_count; /* num of FW recovery attempts in a short time */ 399 u32 recovery_count; /* num of FW recovery attempts in a short time */
400 u32 recovery_state; /* FW recovery state machine */
391 unsigned long last_fw_recovery; /* jiffies of last fw recovery */ 401 unsigned long last_fw_recovery; /* jiffies of last fw recovery */
402 wait_queue_head_t wq; /* for all wait_event() use */
392 /* profile */ 403 /* profile */
393 u32 monitor_flags; 404 u32 monitor_flags;
394 u32 secure_pcp; /* create secure PCP? */ 405 u32 secure_pcp; /* create secure PCP? */
395 int sinfo_gen; 406 int sinfo_gen;
407 u32 itr_trsh;
396 /* cached ISR registers */ 408 /* cached ISR registers */
397 u32 isr_misc; 409 u32 isr_misc;
398 /* mailbox related */ 410 /* mailbox related */
@@ -502,7 +514,9 @@ void wil_if_remove(struct wil6210_priv *wil);
502int wil_priv_init(struct wil6210_priv *wil); 514int wil_priv_init(struct wil6210_priv *wil);
503void wil_priv_deinit(struct wil6210_priv *wil); 515void wil_priv_deinit(struct wil6210_priv *wil);
504int wil_reset(struct wil6210_priv *wil); 516int wil_reset(struct wil6210_priv *wil);
517void wil_set_itr_trsh(struct wil6210_priv *wil);
505void wil_fw_error_recovery(struct wil6210_priv *wil); 518void wil_fw_error_recovery(struct wil6210_priv *wil);
519void wil_set_recovery_state(struct wil6210_priv *wil, int state);
506void wil_link_on(struct wil6210_priv *wil); 520void wil_link_on(struct wil6210_priv *wil);
507void wil_link_off(struct wil6210_priv *wil); 521void wil_link_off(struct wil6210_priv *wil);
508int wil_up(struct wil6210_priv *wil); 522int wil_up(struct wil6210_priv *wil);
@@ -511,6 +525,7 @@ int wil_down(struct wil6210_priv *wil);
511int __wil_down(struct wil6210_priv *wil); 525int __wil_down(struct wil6210_priv *wil);
512void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r); 526void wil_mbox_ring_le2cpus(struct wil6210_mbox_ring *r);
513int wil_find_cid(struct wil6210_priv *wil, const u8 *mac); 527int wil_find_cid(struct wil6210_priv *wil, const u8 *mac);
528void wil_set_ethtoolops(struct net_device *ndev);
514 529
515void __iomem *wmi_buffer(struct wil6210_priv *wil, __le32 ptr); 530void __iomem *wmi_buffer(struct wil6210_priv *wil, __le32 ptr);
516void __iomem *wmi_addr(struct wil6210_priv *wil, u32 ptr); 531void __iomem *wmi_addr(struct wil6210_priv *wil, u32 ptr);
@@ -580,5 +595,7 @@ void wil6210_unmask_irq_rx(struct wil6210_priv *wil);
580 595
581int wil_iftype_nl2wmi(enum nl80211_iftype type); 596int wil_iftype_nl2wmi(enum nl80211_iftype type);
582 597
598int wil_ioctl(struct wil6210_priv *wil, void __user *data, int cmd);
583int wil_request_firmware(struct wil6210_priv *wil, const char *name); 599int wil_request_firmware(struct wil6210_priv *wil, const char *name);
600
584#endif /* __WIL6210_H__ */ 601#endif /* __WIL6210_H__ */
diff --git a/drivers/net/wireless/ath/wil6210/wmi.c b/drivers/net/wireless/ath/wil6210/wmi.c
index bd781c7adf2a..4311df982c60 100644
--- a/drivers/net/wireless/ath/wil6210/wmi.c
+++ b/drivers/net/wireless/ath/wil6210/wmi.c
@@ -299,6 +299,7 @@ static void wmi_evt_fw_ready(struct wil6210_priv *wil, int id, void *d,
299{ 299{
300 wil_dbg_wmi(wil, "WMI: got FW ready event\n"); 300 wil_dbg_wmi(wil, "WMI: got FW ready event\n");
301 301
302 wil_set_recovery_state(wil, fw_recovery_idle);
302 set_bit(wil_status_fwready, &wil->status); 303 set_bit(wil_status_fwready, &wil->status);
303 /* let the reset sequence continue */ 304 /* let the reset sequence continue */
304 complete(&wil->wmi_ready); 305 complete(&wil->wmi_ready);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
index 3122b86050a1..80e73a1262be 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
@@ -67,6 +67,7 @@ struct brcmf_bus_dcmd {
67 * @txctl: transmit a control request message to dongle. 67 * @txctl: transmit a control request message to dongle.
68 * @rxctl: receive a control response message from dongle. 68 * @rxctl: receive a control response message from dongle.
69 * @gettxq: obtain a reference of bus transmit queue (optional). 69 * @gettxq: obtain a reference of bus transmit queue (optional).
70 * @wowl_config: specify if dongle is configured for wowl when going to suspend
70 * 71 *
71 * This structure provides an abstract interface towards the 72 * This structure provides an abstract interface towards the
72 * bus specific driver. For control messages to common driver 73 * bus specific driver. For control messages to common driver
@@ -80,6 +81,7 @@ struct brcmf_bus_ops {
80 int (*txctl)(struct device *dev, unsigned char *msg, uint len); 81 int (*txctl)(struct device *dev, unsigned char *msg, uint len);
81 int (*rxctl)(struct device *dev, unsigned char *msg, uint len); 82 int (*rxctl)(struct device *dev, unsigned char *msg, uint len);
82 struct pktq * (*gettxq)(struct device *dev); 83 struct pktq * (*gettxq)(struct device *dev);
84 void (*wowl_config)(struct device *dev, bool enabled);
83}; 85};
84 86
85 87
@@ -114,6 +116,7 @@ struct brcmf_bus_msgbuf {
114 * @dstats: dongle-based statistical data. 116 * @dstats: dongle-based statistical data.
115 * @dcmd_list: bus/device specific dongle initialization commands. 117 * @dcmd_list: bus/device specific dongle initialization commands.
116 * @chip: device identifier of the dongle chip. 118 * @chip: device identifier of the dongle chip.
119 * @wowl_supported: is wowl supported by bus driver.
117 * @chiprev: revision of the dongle chip. 120 * @chiprev: revision of the dongle chip.
118 */ 121 */
119struct brcmf_bus { 122struct brcmf_bus {
@@ -131,6 +134,7 @@ struct brcmf_bus {
131 u32 chip; 134 u32 chip;
132 u32 chiprev; 135 u32 chiprev;
133 bool always_use_fws_queue; 136 bool always_use_fws_queue;
137 bool wowl_supported;
134 138
135 struct brcmf_bus_ops *ops; 139 struct brcmf_bus_ops *ops;
136 struct brcmf_bus_msgbuf *msgbuf; 140 struct brcmf_bus_msgbuf *msgbuf;
@@ -177,6 +181,13 @@ struct pktq *brcmf_bus_gettxq(struct brcmf_bus *bus)
177 return bus->ops->gettxq(bus->dev); 181 return bus->ops->gettxq(bus->dev);
178} 182}
179 183
184static inline
185void brcmf_bus_wowl_config(struct brcmf_bus *bus, bool enabled)
186{
187 if (bus->ops->wowl_config)
188 bus->ops->wowl_config(bus->dev, enabled);
189}
190
180static inline bool brcmf_bus_ready(struct brcmf_bus *bus) 191static inline bool brcmf_bus_ready(struct brcmf_bus *bus)
181{ 192{
182 return bus->state == BRCMF_BUS_LOAD || bus->state == BRCMF_BUS_DATA; 193 return bus->state == BRCMF_BUS_LOAD || bus->state == BRCMF_BUS_DATA;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/feature.c b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
index 50877e3c5d2f..aed53acef456 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/feature.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.c
@@ -107,6 +107,8 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
107 struct brcmf_if *ifp = drvr->iflist[0]; 107 struct brcmf_if *ifp = drvr->iflist[0];
108 108
109 brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MCHAN, "mchan"); 109 brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_MCHAN, "mchan");
110 if (drvr->bus_if->wowl_supported)
111 brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
110 112
111 /* set chip related quirks */ 113 /* set chip related quirks */
112 switch (drvr->bus_if->chip) { 114 switch (drvr->bus_if->chip) {
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/feature.h b/drivers/net/wireless/brcm80211/brcmfmac/feature.h
index 961d175f8afb..b9a796d0a44d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/feature.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/feature.h
@@ -22,7 +22,8 @@
22 * MCHAN: multi-channel for concurrent P2P. 22 * MCHAN: multi-channel for concurrent P2P.
23 */ 23 */
24#define BRCMF_FEAT_LIST \ 24#define BRCMF_FEAT_LIST \
25 BRCMF_FEAT_DEF(MCHAN) 25 BRCMF_FEAT_DEF(MCHAN) \
26 BRCMF_FEAT_DEF(WOWL)
26/* 27/*
27 * Quirks: 28 * Quirks:
28 * 29 *
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
index a1016b811284..1faa929f5fff 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/flowring.c
@@ -354,7 +354,7 @@ struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings)
354 struct brcmf_flowring *flow; 354 struct brcmf_flowring *flow;
355 u32 i; 355 u32 i;
356 356
357 flow = kzalloc(sizeof(*flow), GFP_ATOMIC); 357 flow = kzalloc(sizeof(*flow), GFP_KERNEL);
358 if (flow) { 358 if (flow) {
359 flow->dev = dev; 359 flow->dev = dev;
360 flow->nrofrings = nrofrings; 360 flow->nrofrings = nrofrings;
@@ -364,7 +364,7 @@ struct brcmf_flowring *brcmf_flowring_attach(struct device *dev, u16 nrofrings)
364 for (i = 0; i < ARRAY_SIZE(flow->hash); i++) 364 for (i = 0; i < ARRAY_SIZE(flow->hash); i++)
365 flow->hash[i].ifidx = BRCMF_FLOWRING_INVALID_IFIDX; 365 flow->hash[i].ifidx = BRCMF_FLOWRING_INVALID_IFIDX;
366 flow->rings = kcalloc(nrofrings, sizeof(*flow->rings), 366 flow->rings = kcalloc(nrofrings, sizeof(*flow->rings),
367 GFP_ATOMIC); 367 GFP_KERNEL);
368 if (!flow->rings) { 368 if (!flow->rings) {
369 kfree(flow); 369 kfree(flow);
370 flow = NULL; 370 flow = NULL;
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
index 2bc68a2137fc..5ff5cd0bb032 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwil_types.h
@@ -53,6 +53,62 @@
53#define BRCMF_OBSS_COEX_OFF 0 53#define BRCMF_OBSS_COEX_OFF 0
54#define BRCMF_OBSS_COEX_ON 1 54#define BRCMF_OBSS_COEX_ON 1
55 55
56/* WOWL bits */
57/* Wakeup on Magic packet: */
58#define WL_WOWL_MAGIC (1 << 0)
59/* Wakeup on Netpattern */
60#define WL_WOWL_NET (1 << 1)
61/* Wakeup on loss-of-link due to Disassoc/Deauth: */
62#define WL_WOWL_DIS (1 << 2)
63/* Wakeup on retrograde TSF: */
64#define WL_WOWL_RETR (1 << 3)
65/* Wakeup on loss of beacon: */
66#define WL_WOWL_BCN (1 << 4)
67/* Wakeup after test: */
68#define WL_WOWL_TST (1 << 5)
69/* Wakeup after PTK refresh: */
70#define WL_WOWL_M1 (1 << 6)
71/* Wakeup after receipt of EAP-Identity Req: */
72#define WL_WOWL_EAPID (1 << 7)
73/* Wakeind via PME(0) or GPIO(1): */
74#define WL_WOWL_PME_GPIO (1 << 8)
75/* need tkip phase 1 key to be updated by the driver: */
76#define WL_WOWL_NEEDTKIP1 (1 << 9)
77/* enable wakeup if GTK fails: */
78#define WL_WOWL_GTK_FAILURE (1 << 10)
79/* support extended magic packets: */
80#define WL_WOWL_EXTMAGPAT (1 << 11)
81/* support ARP/NS/keepalive offloading: */
82#define WL_WOWL_ARPOFFLOAD (1 << 12)
83/* read protocol version for EAPOL frames: */
84#define WL_WOWL_WPA2 (1 << 13)
85/* If the bit is set, use key rotaton: */
86#define WL_WOWL_KEYROT (1 << 14)
87/* If the bit is set, frm received was bcast frame: */
88#define WL_WOWL_BCAST (1 << 15)
89/* If the bit is set, scan offload is enabled: */
90#define WL_WOWL_SCANOL (1 << 16)
91/* Wakeup on tcpkeep alive timeout: */
92#define WL_WOWL_TCPKEEP_TIME (1 << 17)
93/* Wakeup on mDNS Conflict Resolution: */
94#define WL_WOWL_MDNS_CONFLICT (1 << 18)
95/* Wakeup on mDNS Service Connect: */
96#define WL_WOWL_MDNS_SERVICE (1 << 19)
97/* tcp keepalive got data: */
98#define WL_WOWL_TCPKEEP_DATA (1 << 20)
99/* Firmware died in wowl mode: */
100#define WL_WOWL_FW_HALT (1 << 21)
101/* Enable detection of radio button changes: */
102#define WL_WOWL_ENAB_HWRADIO (1 << 22)
103/* Offloads detected MIC failure(s): */
104#define WL_WOWL_MIC_FAIL (1 << 23)
105/* Wakeup in Unassociated state (Net/Magic Pattern): */
106#define WL_WOWL_UNASSOC (1 << 24)
107/* Wakeup if received matched secured pattern: */
108#define WL_WOWL_SECURE (1 << 25)
109/* Link Down indication in WoWL mode: */
110#define WL_WOWL_LINKDOWN (1 << 31)
111
56/* join preference types for join_pref iovar */ 112/* join preference types for join_pref iovar */
57enum brcmf_join_pref_types { 113enum brcmf_join_pref_types {
58 BRCMF_JOIN_PREF_RSSI = 1, 114 BRCMF_JOIN_PREF_RSSI = 1,
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
index d42f7d04b65f..183f08d7fc8c 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/fwsignal.c
@@ -1636,7 +1636,7 @@ int brcmf_fws_hdrpull(struct brcmf_pub *drvr, int ifidx, s16 signal_len,
1636 if (!signal_len) 1636 if (!signal_len)
1637 return 0; 1637 return 0;
1638 /* if flow control disabled, skip to packet data and leave */ 1638 /* if flow control disabled, skip to packet data and leave */
1639 if (!fws->fw_signals) { 1639 if ((!fws) || (!fws->fw_signals)) {
1640 skb_pull(skb, signal_len); 1640 skb_pull(skb, signal_len);
1641 return 0; 1641 return 0;
1642 } 1642 }
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
index 8f8b9373de95..11cc051f97cd 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/msgbuf.c
@@ -208,6 +208,14 @@ struct msgbuf_flowring_flush_resp {
208 __le32 rsvd0[3]; 208 __le32 rsvd0[3];
209}; 209};
210 210
211struct brcmf_msgbuf_work_item {
212 struct list_head queue;
213 u32 flowid;
214 int ifidx;
215 u8 sa[ETH_ALEN];
216 u8 da[ETH_ALEN];
217};
218
211struct brcmf_msgbuf { 219struct brcmf_msgbuf {
212 struct brcmf_pub *drvr; 220 struct brcmf_pub *drvr;
213 221
@@ -230,7 +238,7 @@ struct brcmf_msgbuf {
230 dma_addr_t ioctbuf_handle; 238 dma_addr_t ioctbuf_handle;
231 u32 ioctbuf_phys_hi; 239 u32 ioctbuf_phys_hi;
232 u32 ioctbuf_phys_lo; 240 u32 ioctbuf_phys_lo;
233 u32 ioctl_resp_status; 241 int ioctl_resp_status;
234 u32 ioctl_resp_ret_len; 242 u32 ioctl_resp_ret_len;
235 u32 ioctl_resp_pktid; 243 u32 ioctl_resp_pktid;
236 244
@@ -248,6 +256,10 @@ struct brcmf_msgbuf {
248 struct work_struct txflow_work; 256 struct work_struct txflow_work;
249 unsigned long *flow_map; 257 unsigned long *flow_map;
250 unsigned long *txstatus_done_map; 258 unsigned long *txstatus_done_map;
259
260 struct work_struct flowring_work;
261 spinlock_t flowring_work_lock;
262 struct list_head work_queue;
251}; 263};
252 264
253struct brcmf_msgbuf_pktid { 265struct brcmf_msgbuf_pktid {
@@ -284,11 +296,11 @@ brcmf_msgbuf_init_pktids(u32 nr_array_entries,
284 struct brcmf_msgbuf_pktid *array; 296 struct brcmf_msgbuf_pktid *array;
285 struct brcmf_msgbuf_pktids *pktids; 297 struct brcmf_msgbuf_pktids *pktids;
286 298
287 array = kcalloc(nr_array_entries, sizeof(*array), GFP_ATOMIC); 299 array = kcalloc(nr_array_entries, sizeof(*array), GFP_KERNEL);
288 if (!array) 300 if (!array)
289 return NULL; 301 return NULL;
290 302
291 pktids = kzalloc(sizeof(*pktids), GFP_ATOMIC); 303 pktids = kzalloc(sizeof(*pktids), GFP_KERNEL);
292 if (!pktids) { 304 if (!pktids) {
293 kfree(array); 305 kfree(array);
294 return NULL; 306 return NULL;
@@ -544,11 +556,29 @@ brcmf_msgbuf_remove_flowring(struct brcmf_msgbuf *msgbuf, u16 flowid)
544} 556}
545 557
546 558
547static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx, 559static struct brcmf_msgbuf_work_item *
548 struct sk_buff *skb) 560brcmf_msgbuf_dequeue_work(struct brcmf_msgbuf *msgbuf)
561{
562 struct brcmf_msgbuf_work_item *work = NULL;
563 ulong flags;
564
565 spin_lock_irqsave(&msgbuf->flowring_work_lock, flags);
566 if (!list_empty(&msgbuf->work_queue)) {
567 work = list_first_entry(&msgbuf->work_queue,
568 struct brcmf_msgbuf_work_item, queue);
569 list_del(&work->queue);
570 }
571 spin_unlock_irqrestore(&msgbuf->flowring_work_lock, flags);
572
573 return work;
574}
575
576
577static u32
578brcmf_msgbuf_flowring_create_worker(struct brcmf_msgbuf *msgbuf,
579 struct brcmf_msgbuf_work_item *work)
549{ 580{
550 struct msgbuf_tx_flowring_create_req *create; 581 struct msgbuf_tx_flowring_create_req *create;
551 struct ethhdr *eh = (struct ethhdr *)(skb->data);
552 struct brcmf_commonring *commonring; 582 struct brcmf_commonring *commonring;
553 void *ret_ptr; 583 void *ret_ptr;
554 u32 flowid; 584 u32 flowid;
@@ -557,16 +587,11 @@ static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx,
557 long long address; 587 long long address;
558 int err; 588 int err;
559 589
560 flowid = brcmf_flowring_create(msgbuf->flow, eh->h_dest, 590 flowid = work->flowid;
561 skb->priority, ifidx);
562 if (flowid == BRCMF_FLOWRING_INVALID_ID)
563 return flowid;
564
565 dma_sz = BRCMF_H2D_TXFLOWRING_MAX_ITEM * BRCMF_H2D_TXFLOWRING_ITEMSIZE; 591 dma_sz = BRCMF_H2D_TXFLOWRING_MAX_ITEM * BRCMF_H2D_TXFLOWRING_ITEMSIZE;
566
567 dma_buf = dma_alloc_coherent(msgbuf->drvr->bus_if->dev, dma_sz, 592 dma_buf = dma_alloc_coherent(msgbuf->drvr->bus_if->dev, dma_sz,
568 &msgbuf->flowring_dma_handle[flowid], 593 &msgbuf->flowring_dma_handle[flowid],
569 GFP_ATOMIC); 594 GFP_KERNEL);
570 if (!dma_buf) { 595 if (!dma_buf) {
571 brcmf_err("dma_alloc_coherent failed\n"); 596 brcmf_err("dma_alloc_coherent failed\n");
572 brcmf_flowring_delete(msgbuf->flow, flowid); 597 brcmf_flowring_delete(msgbuf->flow, flowid);
@@ -589,13 +614,13 @@ static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx,
589 614
590 create = (struct msgbuf_tx_flowring_create_req *)ret_ptr; 615 create = (struct msgbuf_tx_flowring_create_req *)ret_ptr;
591 create->msg.msgtype = MSGBUF_TYPE_FLOW_RING_CREATE; 616 create->msg.msgtype = MSGBUF_TYPE_FLOW_RING_CREATE;
592 create->msg.ifidx = ifidx; 617 create->msg.ifidx = work->ifidx;
593 create->msg.request_id = 0; 618 create->msg.request_id = 0;
594 create->tid = brcmf_flowring_tid(msgbuf->flow, flowid); 619 create->tid = brcmf_flowring_tid(msgbuf->flow, flowid);
595 create->flow_ring_id = cpu_to_le16(flowid + 620 create->flow_ring_id = cpu_to_le16(flowid +
596 BRCMF_NROF_H2D_COMMON_MSGRINGS); 621 BRCMF_NROF_H2D_COMMON_MSGRINGS);
597 memcpy(create->sa, eh->h_source, ETH_ALEN); 622 memcpy(create->sa, work->sa, ETH_ALEN);
598 memcpy(create->da, eh->h_dest, ETH_ALEN); 623 memcpy(create->da, work->da, ETH_ALEN);
599 address = (long long)(long)msgbuf->flowring_dma_handle[flowid]; 624 address = (long long)(long)msgbuf->flowring_dma_handle[flowid];
600 create->flow_ring_addr.high_addr = cpu_to_le32(address >> 32); 625 create->flow_ring_addr.high_addr = cpu_to_le32(address >> 32);
601 create->flow_ring_addr.low_addr = cpu_to_le32(address & 0xffffffff); 626 create->flow_ring_addr.low_addr = cpu_to_le32(address & 0xffffffff);
@@ -603,7 +628,7 @@ static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx,
603 create->len_item = cpu_to_le16(BRCMF_H2D_TXFLOWRING_ITEMSIZE); 628 create->len_item = cpu_to_le16(BRCMF_H2D_TXFLOWRING_ITEMSIZE);
604 629
605 brcmf_dbg(MSGBUF, "Send Flow Create Req flow ID %d for peer %pM prio %d ifindex %d\n", 630 brcmf_dbg(MSGBUF, "Send Flow Create Req flow ID %d for peer %pM prio %d ifindex %d\n",
606 flowid, eh->h_dest, create->tid, ifidx); 631 flowid, work->da, create->tid, work->ifidx);
607 632
608 err = brcmf_commonring_write_complete(commonring); 633 err = brcmf_commonring_write_complete(commonring);
609 brcmf_commonring_unlock(commonring); 634 brcmf_commonring_unlock(commonring);
@@ -617,6 +642,53 @@ static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx,
617} 642}
618 643
619 644
645static void brcmf_msgbuf_flowring_worker(struct work_struct *work)
646{
647 struct brcmf_msgbuf *msgbuf;
648 struct brcmf_msgbuf_work_item *create;
649
650 msgbuf = container_of(work, struct brcmf_msgbuf, flowring_work);
651
652 while ((create = brcmf_msgbuf_dequeue_work(msgbuf))) {
653 brcmf_msgbuf_flowring_create_worker(msgbuf, create);
654 kfree(create);
655 }
656}
657
658
659static u32 brcmf_msgbuf_flowring_create(struct brcmf_msgbuf *msgbuf, int ifidx,
660 struct sk_buff *skb)
661{
662 struct brcmf_msgbuf_work_item *create;
663 struct ethhdr *eh = (struct ethhdr *)(skb->data);
664 u32 flowid;
665 ulong flags;
666
667 create = kzalloc(sizeof(*create), GFP_ATOMIC);
668 if (create == NULL)
669 return BRCMF_FLOWRING_INVALID_ID;
670
671 flowid = brcmf_flowring_create(msgbuf->flow, eh->h_dest,
672 skb->priority, ifidx);
673 if (flowid == BRCMF_FLOWRING_INVALID_ID) {
674 kfree(create);
675 return flowid;
676 }
677
678 create->flowid = flowid;
679 create->ifidx = ifidx;
680 memcpy(create->sa, eh->h_source, ETH_ALEN);
681 memcpy(create->da, eh->h_dest, ETH_ALEN);
682
683 spin_lock_irqsave(&msgbuf->flowring_work_lock, flags);
684 list_add_tail(&create->queue, &msgbuf->work_queue);
685 spin_unlock_irqrestore(&msgbuf->flowring_work_lock, flags);
686 schedule_work(&msgbuf->flowring_work);
687
688 return flowid;
689}
690
691
620static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u8 flowid) 692static void brcmf_msgbuf_txflow(struct brcmf_msgbuf *msgbuf, u8 flowid)
621{ 693{
622 struct brcmf_flowring *flow = msgbuf->flow; 694 struct brcmf_flowring *flow = msgbuf->flow;
@@ -767,7 +839,8 @@ brcmf_msgbuf_process_ioctl_complete(struct brcmf_msgbuf *msgbuf, void *buf)
767 839
768 ioctl_resp = (struct msgbuf_ioctl_resp_hdr *)buf; 840 ioctl_resp = (struct msgbuf_ioctl_resp_hdr *)buf;
769 841
770 msgbuf->ioctl_resp_status = le16_to_cpu(ioctl_resp->compl_hdr.status); 842 msgbuf->ioctl_resp_status =
843 (s16)le16_to_cpu(ioctl_resp->compl_hdr.status);
771 msgbuf->ioctl_resp_ret_len = le16_to_cpu(ioctl_resp->resp_len); 844 msgbuf->ioctl_resp_ret_len = le16_to_cpu(ioctl_resp->resp_len);
772 msgbuf->ioctl_resp_pktid = le32_to_cpu(ioctl_resp->msg.request_id); 845 msgbuf->ioctl_resp_pktid = le32_to_cpu(ioctl_resp->msg.request_id);
773 846
@@ -1271,7 +1344,7 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
1271 u32 count; 1344 u32 count;
1272 1345
1273 if_msgbuf = drvr->bus_if->msgbuf; 1346 if_msgbuf = drvr->bus_if->msgbuf;
1274 msgbuf = kzalloc(sizeof(*msgbuf), GFP_ATOMIC); 1347 msgbuf = kzalloc(sizeof(*msgbuf), GFP_KERNEL);
1275 if (!msgbuf) 1348 if (!msgbuf)
1276 goto fail; 1349 goto fail;
1277 1350
@@ -1282,11 +1355,11 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
1282 } 1355 }
1283 INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker); 1356 INIT_WORK(&msgbuf->txflow_work, brcmf_msgbuf_txflow_worker);
1284 count = BITS_TO_LONGS(if_msgbuf->nrof_flowrings); 1357 count = BITS_TO_LONGS(if_msgbuf->nrof_flowrings);
1285 msgbuf->flow_map = kzalloc(count, GFP_ATOMIC); 1358 msgbuf->flow_map = kzalloc(count, GFP_KERNEL);
1286 if (!msgbuf->flow_map) 1359 if (!msgbuf->flow_map)
1287 goto fail; 1360 goto fail;
1288 1361
1289 msgbuf->txstatus_done_map = kzalloc(count, GFP_ATOMIC); 1362 msgbuf->txstatus_done_map = kzalloc(count, GFP_KERNEL);
1290 if (!msgbuf->txstatus_done_map) 1363 if (!msgbuf->txstatus_done_map)
1291 goto fail; 1364 goto fail;
1292 1365
@@ -1294,7 +1367,7 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
1294 msgbuf->ioctbuf = dma_alloc_coherent(drvr->bus_if->dev, 1367 msgbuf->ioctbuf = dma_alloc_coherent(drvr->bus_if->dev,
1295 BRCMF_TX_IOCTL_MAX_MSG_SIZE, 1368 BRCMF_TX_IOCTL_MAX_MSG_SIZE,
1296 &msgbuf->ioctbuf_handle, 1369 &msgbuf->ioctbuf_handle,
1297 GFP_ATOMIC); 1370 GFP_KERNEL);
1298 if (!msgbuf->ioctbuf) 1371 if (!msgbuf->ioctbuf)
1299 goto fail; 1372 goto fail;
1300 address = (long long)(long)msgbuf->ioctbuf_handle; 1373 address = (long long)(long)msgbuf->ioctbuf_handle;
@@ -1317,7 +1390,7 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
1317 msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings; 1390 msgbuf->flowrings = (struct brcmf_commonring **)if_msgbuf->flowrings;
1318 msgbuf->nrof_flowrings = if_msgbuf->nrof_flowrings; 1391 msgbuf->nrof_flowrings = if_msgbuf->nrof_flowrings;
1319 msgbuf->flowring_dma_handle = kzalloc(msgbuf->nrof_flowrings * 1392 msgbuf->flowring_dma_handle = kzalloc(msgbuf->nrof_flowrings *
1320 sizeof(*msgbuf->flowring_dma_handle), GFP_ATOMIC); 1393 sizeof(*msgbuf->flowring_dma_handle), GFP_KERNEL);
1321 if (!msgbuf->flowring_dma_handle) 1394 if (!msgbuf->flowring_dma_handle)
1322 goto fail; 1395 goto fail;
1323 1396
@@ -1357,6 +1430,10 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drvr)
1357 brcmf_msgbuf_rxbuf_event_post(msgbuf); 1430 brcmf_msgbuf_rxbuf_event_post(msgbuf);
1358 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf); 1431 brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf);
1359 1432
1433 INIT_WORK(&msgbuf->flowring_work, brcmf_msgbuf_flowring_worker);
1434 spin_lock_init(&msgbuf->flowring_work_lock);
1435 INIT_LIST_HEAD(&msgbuf->work_queue);
1436
1360 return 0; 1437 return 0;
1361 1438
1362fail: 1439fail:
@@ -1379,11 +1456,19 @@ fail:
1379void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr) 1456void brcmf_proto_msgbuf_detach(struct brcmf_pub *drvr)
1380{ 1457{
1381 struct brcmf_msgbuf *msgbuf; 1458 struct brcmf_msgbuf *msgbuf;
1459 struct brcmf_msgbuf_work_item *work;
1382 1460
1383 brcmf_dbg(TRACE, "Enter\n"); 1461 brcmf_dbg(TRACE, "Enter\n");
1384 if (drvr->proto->pd) { 1462 if (drvr->proto->pd) {
1385 msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd; 1463 msgbuf = (struct brcmf_msgbuf *)drvr->proto->pd;
1386 1464 cancel_work_sync(&msgbuf->flowring_work);
1465 while (!list_empty(&msgbuf->work_queue)) {
1466 work = list_first_entry(&msgbuf->work_queue,
1467 struct brcmf_msgbuf_work_item,
1468 queue);
1469 list_del(&work->queue);
1470 kfree(work);
1471 }
1387 kfree(msgbuf->flow_map); 1472 kfree(msgbuf->flow_map);
1388 kfree(msgbuf->txstatus_done_map); 1473 kfree(msgbuf->txstatus_done_map);
1389 if (msgbuf->txflow_wq) 1474 if (msgbuf->txflow_wq)
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
index 1d78a91db594..d54c58a32faa 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
@@ -440,8 +440,11 @@ static int brcmf_p2p_set_firmware(struct brcmf_if *ifp, u8 *p2p_mac)
440 440
441 /* In case of COB type, firmware has default mac address 441 /* In case of COB type, firmware has default mac address
442 * After Initializing firmware, we have to set current mac address to 442 * After Initializing firmware, we have to set current mac address to
443 * firmware for P2P device address 443 * firmware for P2P device address. This must be done with discovery
444 * disabled.
444 */ 445 */
446 brcmf_fil_iovar_int_set(ifp, "p2p_disc", 0);
447
445 ret = brcmf_fil_iovar_data_set(ifp, "p2p_da_override", p2p_mac, 448 ret = brcmf_fil_iovar_data_set(ifp, "p2p_da_override", p2p_mac,
446 ETH_ALEN); 449 ETH_ALEN);
447 if (ret) 450 if (ret)
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
index e5101b287e4e..8c0632ec9f7a 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/pcie.c
@@ -165,6 +165,8 @@ enum brcmf_pcie_state {
165 165
166#define BRCMF_H2D_HOST_D3_INFORM 0x00000001 166#define BRCMF_H2D_HOST_D3_INFORM 0x00000001
167#define BRCMF_H2D_HOST_DS_ACK 0x00000002 167#define BRCMF_H2D_HOST_DS_ACK 0x00000002
168#define BRCMF_H2D_HOST_D0_INFORM_IN_USE 0x00000008
169#define BRCMF_H2D_HOST_D0_INFORM 0x00000010
168 170
169#define BRCMF_PCIE_MBDATA_TIMEOUT 2000 171#define BRCMF_PCIE_MBDATA_TIMEOUT 2000
170 172
@@ -243,6 +245,7 @@ struct brcmf_pciedev_info {
243 wait_queue_head_t mbdata_resp_wait; 245 wait_queue_head_t mbdata_resp_wait;
244 bool mbdata_completed; 246 bool mbdata_completed;
245 bool irq_allocated; 247 bool irq_allocated;
248 bool wowl_enabled;
246}; 249};
247 250
248struct brcmf_pcie_ringbuf { 251struct brcmf_pcie_ringbuf {
@@ -537,7 +540,7 @@ static int brcmf_pcie_exit_download_state(struct brcmf_pciedev_info *devinfo,
537} 540}
538 541
539 542
540static void 543static int
541brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data) 544brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data)
542{ 545{
543 struct brcmf_pcie_shared_info *shared; 546 struct brcmf_pcie_shared_info *shared;
@@ -558,13 +561,15 @@ brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devinfo, u32 htod_mb_data)
558 msleep(10); 561 msleep(10);
559 i++; 562 i++;
560 if (i > 100) 563 if (i > 100)
561 break; 564 return -EIO;
562 cur_htod_mb_data = brcmf_pcie_read_tcm32(devinfo, addr); 565 cur_htod_mb_data = brcmf_pcie_read_tcm32(devinfo, addr);
563 } 566 }
564 567
565 brcmf_pcie_write_tcm32(devinfo, addr, htod_mb_data); 568 brcmf_pcie_write_tcm32(devinfo, addr, htod_mb_data);
566 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1); 569 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
567 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1); 570 pci_write_config_dword(devinfo->pdev, BRCMF_PCIE_REG_SBMBX, 1);
571
572 return 0;
568} 573}
569 574
570 575
@@ -1229,11 +1234,27 @@ static int brcmf_pcie_rx_ctlpkt(struct device *dev, unsigned char *msg,
1229} 1234}
1230 1235
1231 1236
1237static void brcmf_pcie_wowl_config(struct device *dev, bool enabled)
1238{
1239 struct brcmf_bus *bus_if = dev_get_drvdata(dev);
1240 struct brcmf_pciedev *buspub = bus_if->bus_priv.pcie;
1241 struct brcmf_pciedev_info *devinfo = buspub->devinfo;
1242
1243 brcmf_dbg(PCIE, "Configuring WOWL, enabled=%d\n", enabled);
1244 devinfo->wowl_enabled = enabled;
1245 if (enabled)
1246 device_set_wakeup_enable(&devinfo->pdev->dev, true);
1247 else
1248 device_set_wakeup_enable(&devinfo->pdev->dev, false);
1249}
1250
1251
1232static struct brcmf_bus_ops brcmf_pcie_bus_ops = { 1252static struct brcmf_bus_ops brcmf_pcie_bus_ops = {
1233 .txdata = brcmf_pcie_tx, 1253 .txdata = brcmf_pcie_tx,
1234 .stop = brcmf_pcie_down, 1254 .stop = brcmf_pcie_down,
1235 .txctl = brcmf_pcie_tx_ctlpkt, 1255 .txctl = brcmf_pcie_tx_ctlpkt,
1236 .rxctl = brcmf_pcie_rx_ctlpkt, 1256 .rxctl = brcmf_pcie_rx_ctlpkt,
1257 .wowl_config = brcmf_pcie_wowl_config,
1237}; 1258};
1238 1259
1239 1260
@@ -1668,6 +1689,7 @@ brcmf_pcie_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1668 bus->ops = &brcmf_pcie_bus_ops; 1689 bus->ops = &brcmf_pcie_bus_ops;
1669 bus->proto_type = BRCMF_PROTO_MSGBUF; 1690 bus->proto_type = BRCMF_PROTO_MSGBUF;
1670 bus->chip = devinfo->coreid; 1691 bus->chip = devinfo->coreid;
1692 bus->wowl_supported = pci_pme_capable(pdev, PCI_D3hot);
1671 dev_set_drvdata(&pdev->dev, bus); 1693 dev_set_drvdata(&pdev->dev, bus);
1672 1694
1673 ret = brcmf_pcie_get_fwnames(devinfo); 1695 ret = brcmf_pcie_get_fwnames(devinfo);
@@ -1759,36 +1781,62 @@ static int brcmf_pcie_suspend(struct pci_dev *pdev, pm_message_t state)
1759 brcmf_err("Timeout on response for entering D3 substate\n"); 1781 brcmf_err("Timeout on response for entering D3 substate\n");
1760 return -EIO; 1782 return -EIO;
1761 } 1783 }
1762 brcmf_pcie_release_irq(devinfo); 1784 brcmf_pcie_send_mb_data(devinfo, BRCMF_H2D_HOST_D0_INFORM_IN_USE);
1763 1785
1764 err = pci_save_state(pdev); 1786 err = pci_save_state(pdev);
1765 if (err) { 1787 if (err)
1766 brcmf_err("pci_save_state failed, err=%d\n", err); 1788 brcmf_err("pci_save_state failed, err=%d\n", err);
1767 return err; 1789 if ((err) || (!devinfo->wowl_enabled)) {
1790 brcmf_chip_detach(devinfo->ci);
1791 devinfo->ci = NULL;
1792 brcmf_pcie_remove(pdev);
1793 return 0;
1768 } 1794 }
1769 1795
1770 brcmf_chip_detach(devinfo->ci);
1771 devinfo->ci = NULL;
1772
1773 brcmf_pcie_remove(pdev);
1774
1775 return pci_prepare_to_sleep(pdev); 1796 return pci_prepare_to_sleep(pdev);
1776} 1797}
1777 1798
1778
1779static int brcmf_pcie_resume(struct pci_dev *pdev) 1799static int brcmf_pcie_resume(struct pci_dev *pdev)
1780{ 1800{
1801 struct brcmf_pciedev_info *devinfo;
1802 struct brcmf_bus *bus;
1781 int err; 1803 int err;
1782 1804
1783 brcmf_dbg(PCIE, "Enter, pdev=%p\n", pdev); 1805 bus = dev_get_drvdata(&pdev->dev);
1806 brcmf_dbg(PCIE, "Enter, pdev=%p, bus=%p\n", pdev, bus);
1784 1807
1785 err = pci_set_power_state(pdev, PCI_D0); 1808 err = pci_set_power_state(pdev, PCI_D0);
1786 if (err) { 1809 if (err) {
1787 brcmf_err("pci_set_power_state failed, err=%d\n", err); 1810 brcmf_err("pci_set_power_state failed, err=%d\n", err);
1788 return err; 1811 goto cleanup;
1789 } 1812 }
1790 pci_restore_state(pdev); 1813 pci_restore_state(pdev);
1814 pci_enable_wake(pdev, PCI_D3hot, false);
1815 pci_enable_wake(pdev, PCI_D3cold, false);
1816
1817 /* Check if device is still up and running, if so we are ready */
1818 if (bus) {
1819 devinfo = bus->bus_priv.pcie->devinfo;
1820 if (brcmf_pcie_read_reg32(devinfo,
1821 BRCMF_PCIE_PCIE2REG_INTMASK) != 0) {
1822 if (brcmf_pcie_send_mb_data(devinfo,
1823 BRCMF_H2D_HOST_D0_INFORM))
1824 goto cleanup;
1825 brcmf_dbg(PCIE, "Hot resume, continue....\n");
1826 brcmf_pcie_select_core(devinfo, BCMA_CORE_PCIE2);
1827 brcmf_bus_change_state(bus, BRCMF_BUS_DATA);
1828 brcmf_pcie_intr_enable(devinfo);
1829 return 0;
1830 }
1831 }
1791 1832
1833cleanup:
1834 if (bus) {
1835 devinfo = bus->bus_priv.pcie->devinfo;
1836 brcmf_chip_detach(devinfo->ci);
1837 devinfo->ci = NULL;
1838 brcmf_pcie_remove(pdev);
1839 }
1792 err = brcmf_pcie_probe(pdev, NULL); 1840 err = brcmf_pcie_probe(pdev, NULL);
1793 if (err) 1841 if (err)
1794 brcmf_err("probe after resume failed, err=%d\n", err); 1842 brcmf_err("probe after resume failed, err=%d\n", err);
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
index 1db11b00001c..28fa25b509db 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
@@ -37,6 +37,7 @@
37#include "fwil.h" 37#include "fwil.h"
38#include "proto.h" 38#include "proto.h"
39#include "vendor.h" 39#include "vendor.h"
40#include "dhd_bus.h"
40 41
41#define BRCMF_SCAN_IE_LEN_MAX 2048 42#define BRCMF_SCAN_IE_LEN_MAX 2048
42#define BRCMF_PNO_VERSION 2 43#define BRCMF_PNO_VERSION 2
@@ -2429,7 +2430,7 @@ static s32 brcmf_inform_bss(struct brcmf_cfg80211_info *cfg)
2429 s32 err = 0; 2430 s32 err = 0;
2430 int i; 2431 int i;
2431 2432
2432 bss_list = cfg->bss_list; 2433 bss_list = (struct brcmf_scan_results *)cfg->escan_info.escan_buf;
2433 if (bss_list->count != 0 && 2434 if (bss_list->count != 0 &&
2434 bss_list->version != BRCMF_BSS_INFO_VERSION) { 2435 bss_list->version != BRCMF_BSS_INFO_VERSION) {
2435 brcmf_err("Version %d != WL_BSS_INFO_VERSION\n", 2436 brcmf_err("Version %d != WL_BSS_INFO_VERSION\n",
@@ -2605,6 +2606,7 @@ static void brcmf_cfg80211_escan_timeout_worker(struct work_struct *work)
2605 container_of(work, struct brcmf_cfg80211_info, 2606 container_of(work, struct brcmf_cfg80211_info,
2606 escan_timeout_work); 2607 escan_timeout_work);
2607 2608
2609 brcmf_inform_bss(cfg);
2608 brcmf_notify_escan_complete(cfg, cfg->escan_info.ifp, true, true); 2610 brcmf_notify_escan_complete(cfg, cfg->escan_info.ifp, true, true);
2609} 2611}
2610 2612
@@ -2743,12 +2745,9 @@ brcmf_cfg80211_escan_handler(struct brcmf_if *ifp,
2743 if (brcmf_p2p_scan_finding_common_channel(cfg, NULL)) 2745 if (brcmf_p2p_scan_finding_common_channel(cfg, NULL))
2744 goto exit; 2746 goto exit;
2745 if (cfg->scan_request) { 2747 if (cfg->scan_request) {
2746 cfg->bss_list = (struct brcmf_scan_results *)
2747 cfg->escan_info.escan_buf;
2748 brcmf_inform_bss(cfg); 2748 brcmf_inform_bss(cfg);
2749 aborted = status != BRCMF_E_STATUS_SUCCESS; 2749 aborted = status != BRCMF_E_STATUS_SUCCESS;
2750 brcmf_notify_escan_complete(cfg, ifp, aborted, 2750 brcmf_notify_escan_complete(cfg, ifp, aborted, false);
2751 false);
2752 } else 2751 } else
2753 brcmf_dbg(SCAN, "Ignored scan complete result 0x%x\n", 2752 brcmf_dbg(SCAN, "Ignored scan complete result 0x%x\n",
2754 status); 2753 status);
@@ -2782,50 +2781,91 @@ static __always_inline void brcmf_delay(u32 ms)
2782 2781
2783static s32 brcmf_cfg80211_resume(struct wiphy *wiphy) 2782static s32 brcmf_cfg80211_resume(struct wiphy *wiphy)
2784{ 2783{
2784 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2785 struct net_device *ndev = cfg_to_ndev(cfg);
2786 struct brcmf_if *ifp = netdev_priv(ndev);
2787
2785 brcmf_dbg(TRACE, "Enter\n"); 2788 brcmf_dbg(TRACE, "Enter\n");
2786 2789
2790 if (cfg->wowl_enabled) {
2791 brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM,
2792 cfg->pre_wowl_pmmode);
2793 brcmf_fil_iovar_data_set(ifp, "wowl_pattern", "clr", 4);
2794 brcmf_fil_iovar_int_set(ifp, "wowl_clear", 0);
2795 cfg->wowl_enabled = false;
2796 }
2787 return 0; 2797 return 0;
2788} 2798}
2789 2799
2800static void brcmf_configure_wowl(struct brcmf_cfg80211_info *cfg,
2801 struct brcmf_if *ifp,
2802 struct cfg80211_wowlan *wowl)
2803{
2804 u32 wowl_config;
2805
2806 brcmf_dbg(TRACE, "Suspend, wowl config.\n");
2807
2808 brcmf_fil_cmd_int_get(ifp, BRCMF_C_GET_PM, &cfg->pre_wowl_pmmode);
2809 brcmf_fil_cmd_int_set(ifp, BRCMF_C_SET_PM, PM_MAX);
2810
2811 wowl_config = 0;
2812 if (wowl->disconnect)
2813 wowl_config |= WL_WOWL_DIS | WL_WOWL_BCN | WL_WOWL_RETR;
2814 /* Note: if "wowl" target and not "wowlpf" then wowl_bcn_loss
2815 * should be configured. This paramater is not supported by
2816 * wowlpf.
2817 */
2818 if (wowl->magic_pkt)
2819 wowl_config |= WL_WOWL_MAGIC;
2820 brcmf_fil_iovar_int_set(ifp, "wowl", wowl_config);
2821 brcmf_fil_iovar_int_set(ifp, "wowl_activate", 1);
2822 brcmf_bus_wowl_config(cfg->pub->bus_if, true);
2823 cfg->wowl_enabled = true;
2824}
2825
2790static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy, 2826static s32 brcmf_cfg80211_suspend(struct wiphy *wiphy,
2791 struct cfg80211_wowlan *wow) 2827 struct cfg80211_wowlan *wowl)
2792{ 2828{
2793 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy); 2829 struct brcmf_cfg80211_info *cfg = wiphy_to_cfg(wiphy);
2794 struct net_device *ndev = cfg_to_ndev(cfg); 2830 struct net_device *ndev = cfg_to_ndev(cfg);
2831 struct brcmf_if *ifp = netdev_priv(ndev);
2795 struct brcmf_cfg80211_vif *vif; 2832 struct brcmf_cfg80211_vif *vif;
2796 2833
2797 brcmf_dbg(TRACE, "Enter\n"); 2834 brcmf_dbg(TRACE, "Enter\n");
2798 2835
2799 /* 2836 /* if the primary net_device is not READY there is nothing
2800 * if the primary net_device is not READY there is nothing
2801 * we can do but pray resume goes smoothly. 2837 * we can do but pray resume goes smoothly.
2802 */ 2838 */
2803 vif = ((struct brcmf_if *)netdev_priv(ndev))->vif; 2839 if (!check_vif_up(ifp->vif))
2804 if (!check_vif_up(vif))
2805 goto exit; 2840 goto exit;
2806 2841
2807 list_for_each_entry(vif, &cfg->vif_list, list) {
2808 if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state))
2809 continue;
2810 /*
2811 * While going to suspend if associated with AP disassociate
2812 * from AP to save power while system is in suspended state
2813 */
2814 brcmf_link_down(vif);
2815
2816 /* Make sure WPA_Supplicant receives all the event
2817 * generated due to DISASSOC call to the fw to keep
2818 * the state fw and WPA_Supplicant state consistent
2819 */
2820 brcmf_delay(500);
2821 }
2822
2823 /* end any scanning */ 2842 /* end any scanning */
2824 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status)) 2843 if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status))
2825 brcmf_abort_scanning(cfg); 2844 brcmf_abort_scanning(cfg);
2826 2845
2827 /* Turn off watchdog timer */ 2846 if (wowl == NULL) {
2828 brcmf_set_mpc(netdev_priv(ndev), 1); 2847 brcmf_bus_wowl_config(cfg->pub->bus_if, false);
2848 list_for_each_entry(vif, &cfg->vif_list, list) {
2849 if (!test_bit(BRCMF_VIF_STATUS_READY, &vif->sme_state))
2850 continue;
2851 /* While going to suspend if associated with AP
2852 * disassociate from AP to save power while system is
2853 * in suspended state
2854 */
2855 brcmf_link_down(vif);
2856 /* Make sure WPA_Supplicant receives all the event
2857 * generated due to DISASSOC call to the fw to keep
2858 * the state fw and WPA_Supplicant state consistent
2859 */
2860 brcmf_delay(500);
2861 }
2862 /* Configure MPC */
2863 brcmf_set_mpc(ifp, 1);
2864
2865 } else {
2866 /* Configure WOWL paramaters */
2867 brcmf_configure_wowl(cfg, ifp, wowl);
2868 }
2829 2869
2830exit: 2870exit:
2831 brcmf_dbg(TRACE, "Exit\n"); 2871 brcmf_dbg(TRACE, "Exit\n");
@@ -5400,6 +5440,21 @@ static void brcmf_wiphy_pno_params(struct wiphy *wiphy)
5400 wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; 5440 wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
5401} 5441}
5402 5442
5443
5444#ifdef CONFIG_PM
5445static const struct wiphy_wowlan_support brcmf_wowlan_support = {
5446 .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
5447};
5448#endif
5449
5450static void brcmf_wiphy_wowl_params(struct wiphy *wiphy)
5451{
5452#ifdef CONFIG_PM
5453 /* wowl settings */
5454 wiphy->wowlan = &brcmf_wowlan_support;
5455#endif
5456}
5457
5403static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp) 5458static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
5404{ 5459{
5405 struct ieee80211_iface_combination ifc_combo; 5460 struct ieee80211_iface_combination ifc_combo;
@@ -5437,6 +5492,9 @@ static int brcmf_setup_wiphy(struct wiphy *wiphy, struct brcmf_if *ifp)
5437 wiphy->vendor_commands = brcmf_vendor_cmds; 5492 wiphy->vendor_commands = brcmf_vendor_cmds;
5438 wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1; 5493 wiphy->n_vendor_commands = BRCMF_VNDR_CMDS_LAST - 1;
5439 5494
5495 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_WOWL))
5496 brcmf_wiphy_wowl_params(wiphy);
5497
5440 return brcmf_setup_wiphybands(wiphy); 5498 return brcmf_setup_wiphybands(wiphy);
5441} 5499}
5442 5500
diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
index f9fb10998e79..6abf94e41d3d 100644
--- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
+++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.h
@@ -35,7 +35,7 @@
35#define WL_SCAN_PASSIVE_TIME 120 35#define WL_SCAN_PASSIVE_TIME 120
36 36
37#define WL_ESCAN_BUF_SIZE (1024 * 64) 37#define WL_ESCAN_BUF_SIZE (1024 * 64)
38#define WL_ESCAN_TIMER_INTERVAL_MS 8000 /* E-Scan timeout */ 38#define WL_ESCAN_TIMER_INTERVAL_MS 10000 /* E-Scan timeout */
39 39
40#define WL_ESCAN_ACTION_START 1 40#define WL_ESCAN_ACTION_START 1
41#define WL_ESCAN_ACTION_CONTINUE 2 41#define WL_ESCAN_ACTION_CONTINUE 2
@@ -363,6 +363,8 @@ struct brcmf_cfg80211_vif_event {
363 * @vif_list: linked list of vif instances. 363 * @vif_list: linked list of vif instances.
364 * @vif_cnt: number of vif instances. 364 * @vif_cnt: number of vif instances.
365 * @vif_event: vif event signalling. 365 * @vif_event: vif event signalling.
366 * @wowl_enabled; set during suspend, is wowl used.
367 * @pre_wowl_pmmode: intermediate storage of pm mode during wowl.
366 */ 368 */
367struct brcmf_cfg80211_info { 369struct brcmf_cfg80211_info {
368 struct wiphy *wiphy; 370 struct wiphy *wiphy;
@@ -371,7 +373,6 @@ struct brcmf_cfg80211_info {
371 struct brcmf_btcoex_info *btcoex; 373 struct brcmf_btcoex_info *btcoex;
372 struct cfg80211_scan_request *scan_request; 374 struct cfg80211_scan_request *scan_request;
373 struct mutex usr_sync; 375 struct mutex usr_sync;
374 struct brcmf_scan_results *bss_list;
375 struct brcmf_cfg80211_scan_req scan_req_int; 376 struct brcmf_cfg80211_scan_req scan_req_int;
376 struct wl_cfg80211_bss_info *bss_info; 377 struct wl_cfg80211_bss_info *bss_info;
377 struct brcmf_cfg80211_ie ie; 378 struct brcmf_cfg80211_ie ie;
@@ -397,6 +398,8 @@ struct brcmf_cfg80211_info {
397 struct brcmf_cfg80211_vif_event vif_event; 398 struct brcmf_cfg80211_vif_event vif_event;
398 struct completion vif_disabled; 399 struct completion vif_disabled;
399 struct brcmu_d11inf d11inf; 400 struct brcmu_d11inf d11inf;
401 bool wowl_enabled;
402 u32 pre_wowl_pmmode;
400}; 403};
401 404
402/** 405/**
diff --git a/drivers/net/wireless/brcm80211/include/defs.h b/drivers/net/wireless/brcm80211/include/defs.h
index fb7cbcf81179..8d1e85e0ed51 100644
--- a/drivers/net/wireless/brcm80211/include/defs.h
+++ b/drivers/net/wireless/brcm80211/include/defs.h
@@ -74,10 +74,6 @@
74#define BRCM_BAND_2G 2 /* 2.4 Ghz */ 74#define BRCM_BAND_2G 2 /* 2.4 Ghz */
75#define BRCM_BAND_ALL 3 /* all bands */ 75#define BRCM_BAND_ALL 3 /* all bands */
76 76
77/* Values for PM */
78#define PM_OFF 0
79#define PM_MAX 1
80
81/* Debug levels */ 77/* Debug levels */
82#define BRCM_DL_INFO 0x00000001 78#define BRCM_DL_INFO 0x00000001
83#define BRCM_DL_MAC80211 0x00000002 79#define BRCM_DL_MAC80211 0x00000002
@@ -87,6 +83,7 @@
87#define BRCM_DL_DMA 0x00000020 83#define BRCM_DL_DMA 0x00000020
88#define BRCM_DL_HT 0x00000040 84#define BRCM_DL_HT 0x00000040
89 85
86/* Values for PM */
90#define PM_OFF 0 87#define PM_OFF 0
91#define PM_MAX 1 88#define PM_MAX 1
92#define PM_FAST 2 89#define PM_FAST 2
diff --git a/drivers/net/wireless/iwlwifi/iwl-8000.c b/drivers/net/wireless/iwlwifi/iwl-8000.c
index 4ae8ba6ccfff..e4351487ca72 100644
--- a/drivers/net/wireless/iwlwifi/iwl-8000.c
+++ b/drivers/net/wireless/iwlwifi/iwl-8000.c
@@ -81,7 +81,7 @@
81#define IWL8000_NVM_VERSION 0x0a1d 81#define IWL8000_NVM_VERSION 0x0a1d
82#define IWL8000_TX_POWER_VERSION 0xffff /* meaningless */ 82#define IWL8000_TX_POWER_VERSION 0xffff /* meaningless */
83 83
84#define IWL8000_FW_PRE "iwlwifi-8000-" 84#define IWL8000_FW_PRE "iwlwifi-8000"
85#define IWL8000_MODULE_FIRMWARE(api) IWL8000_FW_PRE __stringify(api) ".ucode" 85#define IWL8000_MODULE_FIRMWARE(api) IWL8000_FW_PRE __stringify(api) ".ucode"
86 86
87#define NVM_HW_SECTION_NUM_FAMILY_8000 10 87#define NVM_HW_SECTION_NUM_FAMILY_8000 10
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c
index ed673baedfd7..0f1084f09caa 100644
--- a/drivers/net/wireless/iwlwifi/iwl-drv.c
+++ b/drivers/net/wireless/iwlwifi/iwl-drv.c
@@ -69,6 +69,7 @@
69#include <linux/vmalloc.h> 69#include <linux/vmalloc.h>
70 70
71#include "iwl-drv.h" 71#include "iwl-drv.h"
72#include "iwl-csr.h"
72#include "iwl-debug.h" 73#include "iwl-debug.h"
73#include "iwl-trans.h" 74#include "iwl-trans.h"
74#include "iwl-op-mode.h" 75#include "iwl-op-mode.h"
@@ -244,6 +245,23 @@ static int iwl_request_firmware(struct iwl_drv *drv, bool first)
244 snprintf(drv->firmware_name, sizeof(drv->firmware_name), "%s%s.ucode", 245 snprintf(drv->firmware_name, sizeof(drv->firmware_name), "%s%s.ucode",
245 name_pre, tag); 246 name_pre, tag);
246 247
248 /*
249 * Starting 8000B - FW name format has changed. This overwrites the
250 * previous name and uses the new format.
251 */
252 if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) {
253 char rev_step[2] = {
254 'A' + CSR_HW_REV_STEP(drv->trans->hw_rev), 0
255 };
256
257 /* A-step doesn't have an indication */
258 if (CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_A_STEP)
259 rev_step[0] = 0;
260
261 snprintf(drv->firmware_name, sizeof(drv->firmware_name),
262 "%s%s-%s.ucode", name_pre, rev_step, tag);
263 }
264
247 IWL_DEBUG_INFO(drv, "attempting to load firmware %s'%s'\n", 265 IWL_DEBUG_INFO(drv, "attempting to load firmware %s'%s'\n",
248 (drv->fw_index == UCODE_EXPERIMENTAL_INDEX) 266 (drv->fw_index == UCODE_EXPERIMENTAL_INDEX)
249 ? "EXPERIMENTAL " : "", 267 ? "EXPERIMENTAL " : "",
diff --git a/drivers/net/wireless/iwlwifi/iwl-fw.h b/drivers/net/wireless/iwlwifi/iwl-fw.h
index 62c46eb8b99c..4f6e66892acc 100644
--- a/drivers/net/wireless/iwlwifi/iwl-fw.h
+++ b/drivers/net/wireless/iwlwifi/iwl-fw.h
@@ -145,9 +145,24 @@ enum iwl_ucode_tlv_api {
145/** 145/**
146 * enum iwl_ucode_tlv_capa - ucode capabilities 146 * enum iwl_ucode_tlv_capa - ucode capabilities
147 * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3 147 * @IWL_UCODE_TLV_CAPA_D0I3_SUPPORT: supports D0i3
148 * @IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT: supports insertion of current
149 * tx power value into TPC Report action frame and Link Measurement Report
150 * action frame
151 * @IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT: supports adding DS params
152 * element in probe requests.
153 * @IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT: supports adding TPC Report IE in
154 * probe requests.
155 * @IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT: supports Quiet Period requests
156 * @IWL_UCODE_TLV_CAPA_DQA_SUPPORT: supports dynamic queue allocation (DQA),
157 * which also implies support for the scheduler configuration command
148 */ 158 */
149enum iwl_ucode_tlv_capa { 159enum iwl_ucode_tlv_capa {
150 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0), 160 IWL_UCODE_TLV_CAPA_D0I3_SUPPORT = BIT(0),
161 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT = BIT(8),
162 IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT = BIT(9),
163 IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT = BIT(10),
164 IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT = BIT(11),
165 IWL_UCODE_TLV_CAPA_DQA_SUPPORT = BIT(12),
151}; 166};
152 167
153/* The default calibrate table size if not specified by firmware file */ 168/* The default calibrate table size if not specified by firmware file */
diff --git a/drivers/net/wireless/iwlwifi/mvm/constants.h b/drivers/net/wireless/iwlwifi/mvm/constants.h
index a355788b1166..d4dfbe4cb66d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/constants.h
+++ b/drivers/net/wireless/iwlwifi/mvm/constants.h
@@ -90,9 +90,10 @@
90#define IWL_MVM_BT_COEX_EN_RED_TXP_THRESH 62 90#define IWL_MVM_BT_COEX_EN_RED_TXP_THRESH 62
91#define IWL_MVM_BT_COEX_DIS_RED_TXP_THRESH 65 91#define IWL_MVM_BT_COEX_DIS_RED_TXP_THRESH 65
92#define IWL_MVM_BT_COEX_SYNC2SCO 1 92#define IWL_MVM_BT_COEX_SYNC2SCO 1
93#define IWL_MVM_BT_COEX_CORUNNING 1 93#define IWL_MVM_BT_COEX_CORUNNING 0
94#define IWL_MVM_BT_COEX_MPLUT 1 94#define IWL_MVM_BT_COEX_MPLUT 1
95#define IWL_MVM_FW_MCAST_FILTER_PASS_ALL 0 95#define IWL_MVM_FW_MCAST_FILTER_PASS_ALL 0
96#define IWL_MVM_QUOTA_THRESHOLD 8 96#define IWL_MVM_QUOTA_THRESHOLD 8
97#define IWL_MVM_RS_RSSI_BASED_INIT_RATE 0
97 98
98#endif /* __MVM_CONSTANTS_H */ 99#endif /* __MVM_CONSTANTS_H */
diff --git a/drivers/net/wireless/iwlwifi/mvm/debugfs.c b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
index 95eb9a5ef693..50527a9bb267 100644
--- a/drivers/net/wireless/iwlwifi/mvm/debugfs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/debugfs.c
@@ -326,6 +326,29 @@ out:
326 return count; 326 return count;
327} 327}
328 328
329static ssize_t iwl_dbgfs_nic_temp_read(struct file *file,
330 char __user *user_buf,
331 size_t count, loff_t *ppos)
332{
333 struct iwl_mvm *mvm = file->private_data;
334 char buf[16];
335 int pos, temp;
336
337 if (!mvm->ucode_loaded)
338 return -EIO;
339
340 mutex_lock(&mvm->mutex);
341 temp = iwl_mvm_get_temp(mvm);
342 mutex_unlock(&mvm->mutex);
343
344 if (temp < 0)
345 return temp;
346
347 pos = scnprintf(buf , sizeof(buf), "%d\n", temp);
348
349 return simple_read_from_buffer(user_buf, count, ppos, buf, pos);
350}
351
329static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf, 352static ssize_t iwl_dbgfs_stations_read(struct file *file, char __user *user_buf,
330 size_t count, loff_t *ppos) 353 size_t count, loff_t *ppos)
331{ 354{
@@ -1378,6 +1401,7 @@ MVM_DEBUGFS_WRITE_FILE_OPS(tx_flush, 16);
1378MVM_DEBUGFS_WRITE_FILE_OPS(sta_drain, 8); 1401MVM_DEBUGFS_WRITE_FILE_OPS(sta_drain, 8);
1379MVM_DEBUGFS_READ_WRITE_FILE_OPS(sram, 64); 1402MVM_DEBUGFS_READ_WRITE_FILE_OPS(sram, 64);
1380MVM_DEBUGFS_READ_WRITE_FILE_OPS(set_nic_temperature, 64); 1403MVM_DEBUGFS_READ_WRITE_FILE_OPS(set_nic_temperature, 64);
1404MVM_DEBUGFS_READ_FILE_OPS(nic_temp);
1381MVM_DEBUGFS_READ_FILE_OPS(stations); 1405MVM_DEBUGFS_READ_FILE_OPS(stations);
1382MVM_DEBUGFS_READ_FILE_OPS(bt_notif); 1406MVM_DEBUGFS_READ_FILE_OPS(bt_notif);
1383MVM_DEBUGFS_READ_FILE_OPS(bt_cmd); 1407MVM_DEBUGFS_READ_FILE_OPS(bt_cmd);
@@ -1420,6 +1444,7 @@ int iwl_mvm_dbgfs_register(struct iwl_mvm *mvm, struct dentry *dbgfs_dir)
1420 MVM_DEBUGFS_ADD_FILE(sram, mvm->debugfs_dir, S_IWUSR | S_IRUSR); 1444 MVM_DEBUGFS_ADD_FILE(sram, mvm->debugfs_dir, S_IWUSR | S_IRUSR);
1421 MVM_DEBUGFS_ADD_FILE(set_nic_temperature, mvm->debugfs_dir, 1445 MVM_DEBUGFS_ADD_FILE(set_nic_temperature, mvm->debugfs_dir,
1422 S_IWUSR | S_IRUSR); 1446 S_IWUSR | S_IRUSR);
1447 MVM_DEBUGFS_ADD_FILE(nic_temp, dbgfs_dir, S_IRUSR);
1423 MVM_DEBUGFS_ADD_FILE(stations, dbgfs_dir, S_IRUSR); 1448 MVM_DEBUGFS_ADD_FILE(stations, dbgfs_dir, S_IRUSR);
1424 MVM_DEBUGFS_ADD_FILE(fw_error_dump, dbgfs_dir, S_IRUSR); 1449 MVM_DEBUGFS_ADD_FILE(fw_error_dump, dbgfs_dir, S_IRUSR);
1425 MVM_DEBUGFS_ADD_FILE(bt_notif, dbgfs_dir, S_IRUSR); 1450 MVM_DEBUGFS_ADD_FILE(bt_notif, dbgfs_dir, S_IRUSR);
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
index 8f2216694004..1354c68f6468 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-scan.h
@@ -670,6 +670,8 @@ struct iwl_scan_channel_opt {
670 * @IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE: send iteration complete notification 670 * @IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE: send iteration complete notification
671 * @IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS multiple SSID matching 671 * @IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS multiple SSID matching
672 * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented 672 * @IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED: all passive scans will be fragmented
673 * @IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED: insert WFA vendor-specific TPC report
674 * and DS parameter set IEs into probe requests.
673 */ 675 */
674enum iwl_mvm_lmac_scan_flags { 676enum iwl_mvm_lmac_scan_flags {
675 IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0), 677 IWL_MVM_LMAC_SCAN_FLAG_PASS_ALL = BIT(0),
@@ -678,6 +680,7 @@ enum iwl_mvm_lmac_scan_flags {
678 IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE = BIT(3), 680 IWL_MVM_LMAC_SCAN_FLAG_ITER_COMPLETE = BIT(3),
679 IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4), 681 IWL_MVM_LMAC_SCAN_FLAG_MULTIPLE_SSIDS = BIT(4),
680 IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5), 682 IWL_MVM_LMAC_SCAN_FLAG_FRAGMENTED = BIT(5),
683 IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED = BIT(6),
681}; 684};
682 685
683enum iwl_scan_priority { 686enum iwl_scan_priority {
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h b/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
index d6073f67b212..5bca1f8bfebf 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api-tx.h
@@ -66,6 +66,7 @@
66/** 66/**
67 * enum iwl_tx_flags - bitmasks for tx_flags in TX command 67 * enum iwl_tx_flags - bitmasks for tx_flags in TX command
68 * @TX_CMD_FLG_PROT_REQUIRE: use RTS or CTS-to-self to protect the frame 68 * @TX_CMD_FLG_PROT_REQUIRE: use RTS or CTS-to-self to protect the frame
69 * @TX_CMD_FLG_WRITE_TX_POWER: update current tx power value in the mgmt frame
69 * @TX_CMD_FLG_ACK: expect ACK from receiving station 70 * @TX_CMD_FLG_ACK: expect ACK from receiving station
70 * @TX_CMD_FLG_STA_RATE: use RS table with initial index from the TX command. 71 * @TX_CMD_FLG_STA_RATE: use RS table with initial index from the TX command.
71 * Otherwise, use rate_n_flags from the TX command 72 * Otherwise, use rate_n_flags from the TX command
@@ -97,6 +98,7 @@
97 */ 98 */
98enum iwl_tx_flags { 99enum iwl_tx_flags {
99 TX_CMD_FLG_PROT_REQUIRE = BIT(0), 100 TX_CMD_FLG_PROT_REQUIRE = BIT(0),
101 TX_CMD_FLG_WRITE_TX_POWER = BIT(1),
100 TX_CMD_FLG_ACK = BIT(3), 102 TX_CMD_FLG_ACK = BIT(3),
101 TX_CMD_FLG_STA_RATE = BIT(4), 103 TX_CMD_FLG_STA_RATE = BIT(4),
102 TX_CMD_FLG_BAR = BIT(6), 104 TX_CMD_FLG_BAR = BIT(6),
diff --git a/drivers/net/wireless/iwlwifi/mvm/fw-api.h b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
index a2c662808a88..667a92274c87 100644
--- a/drivers/net/wireless/iwlwifi/mvm/fw-api.h
+++ b/drivers/net/wireless/iwlwifi/mvm/fw-api.h
@@ -116,6 +116,9 @@ enum {
116 TXPATH_FLUSH = 0x1e, 116 TXPATH_FLUSH = 0x1e,
117 MGMT_MCAST_KEY = 0x1f, 117 MGMT_MCAST_KEY = 0x1f,
118 118
119 /* scheduler config */
120 SCD_QUEUE_CFG = 0x1d,
121
119 /* global key */ 122 /* global key */
120 WEP_KEY = 0x20, 123 WEP_KEY = 0x20,
121 124
@@ -1650,4 +1653,61 @@ struct iwl_dts_measurement_notif {
1650 __le32 voltage; 1653 __le32 voltage;
1651} __packed; /* TEMPERATURE_MEASUREMENT_TRIGGER_NTFY_S */ 1654} __packed; /* TEMPERATURE_MEASUREMENT_TRIGGER_NTFY_S */
1652 1655
1656/**
1657 * enum iwl_scd_control - scheduler config command control flags
1658 * @IWL_SCD_CONTROL_RM_TID: remove TID from this queue
1659 * @IWL_SCD_CONTROL_SET_SSN: use the SSN and program it into HW
1660 */
1661enum iwl_scd_control {
1662 IWL_SCD_CONTROL_RM_TID = BIT(4),
1663 IWL_SCD_CONTROL_SET_SSN = BIT(5),
1664};
1665
1666/**
1667 * enum iwl_scd_flags - scheduler config command flags
1668 * @IWL_SCD_FLAGS_SHARE_TID: multiple TIDs map to this queue
1669 * @IWL_SCD_FLAGS_SHARE_RA: multiple RAs map to this queue
1670 * @IWL_SCD_FLAGS_DQA_ENABLED: DQA is enabled
1671 */
1672enum iwl_scd_flags {
1673 IWL_SCD_FLAGS_SHARE_TID = BIT(0),
1674 IWL_SCD_FLAGS_SHARE_RA = BIT(1),
1675 IWL_SCD_FLAGS_DQA_ENABLED = BIT(2),
1676};
1677
1678#define IWL_SCDQ_INVALID_STA 0xff
1679
1680/**
1681 * struct iwl_scd_txq_cfg_cmd - New txq hw scheduler config command
1682 * @token: dialog token addba - unused legacy
1683 * @sta_id: station id 4-bit
1684 * @tid: TID 0..7
1685 * @scd_queue: TFD queue num 0 .. 31
1686 * @enable: 1 queue enable, 0 queue disable
1687 * @aggregate: 1 aggregated queue, 0 otherwise
1688 * @tx_fifo: tx fifo num 0..7
1689 * @window: up to 64
1690 * @ssn: starting seq num 12-bit
1691 * @control: command control flags
1692 * @flags: flags - see &enum iwl_scd_flags
1693 *
1694 * Note that every time the command is sent, all parameters must
1695 * be filled with the exception of
1696 * - the SSN, which is only used with @IWL_SCD_CONTROL_SET_SSN
1697 * - the window, which is only relevant when starting aggregation
1698 */
1699struct iwl_scd_txq_cfg_cmd {
1700 u8 token;
1701 u8 sta_id;
1702 u8 tid;
1703 u8 scd_queue;
1704 u8 enable;
1705 u8 aggregate;
1706 u8 tx_fifo;
1707 u8 window;
1708 __le16 ssn;
1709 u8 control;
1710 u8 flags;
1711} __packed;
1712
1653#endif /* __fw_api_h__ */ 1713#endif /* __fw_api_h__ */
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
index 834267145929..0c5c0b0e23f5 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac-ctxt.c
@@ -427,17 +427,17 @@ int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
427 427
428 switch (vif->type) { 428 switch (vif->type) {
429 case NL80211_IFTYPE_P2P_DEVICE: 429 case NL80211_IFTYPE_P2P_DEVICE:
430 iwl_trans_ac_txq_enable(mvm->trans, IWL_MVM_OFFCHANNEL_QUEUE, 430 iwl_mvm_enable_ac_txq(mvm, IWL_MVM_OFFCHANNEL_QUEUE,
431 IWL_MVM_TX_FIFO_VO); 431 IWL_MVM_TX_FIFO_VO);
432 break; 432 break;
433 case NL80211_IFTYPE_AP: 433 case NL80211_IFTYPE_AP:
434 iwl_trans_ac_txq_enable(mvm->trans, vif->cab_queue, 434 iwl_mvm_enable_ac_txq(mvm, vif->cab_queue,
435 IWL_MVM_TX_FIFO_MCAST); 435 IWL_MVM_TX_FIFO_MCAST);
436 /* fall through */ 436 /* fall through */
437 default: 437 default:
438 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) 438 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
439 iwl_trans_ac_txq_enable(mvm->trans, vif->hw_queue[ac], 439 iwl_mvm_enable_ac_txq(mvm, vif->hw_queue[ac],
440 iwl_mvm_ac_to_tx_fifo[ac]); 440 iwl_mvm_ac_to_tx_fifo[ac]);
441 break; 441 break;
442 } 442 }
443 443
@@ -452,16 +452,14 @@ void iwl_mvm_mac_ctxt_release(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
452 452
453 switch (vif->type) { 453 switch (vif->type) {
454 case NL80211_IFTYPE_P2P_DEVICE: 454 case NL80211_IFTYPE_P2P_DEVICE:
455 iwl_trans_txq_disable(mvm->trans, IWL_MVM_OFFCHANNEL_QUEUE, 455 iwl_mvm_disable_txq(mvm, IWL_MVM_OFFCHANNEL_QUEUE);
456 true);
457 break; 456 break;
458 case NL80211_IFTYPE_AP: 457 case NL80211_IFTYPE_AP:
459 iwl_trans_txq_disable(mvm->trans, vif->cab_queue, true); 458 iwl_mvm_disable_txq(mvm, vif->cab_queue);
460 /* fall through */ 459 /* fall through */
461 default: 460 default:
462 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) 461 for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
463 iwl_trans_txq_disable(mvm->trans, vif->hw_queue[ac], 462 iwl_mvm_disable_txq(mvm, vif->hw_queue[ac]);
464 true);
465 } 463 }
466} 464}
467 465
diff --git a/drivers/net/wireless/iwlwifi/mvm/mac80211.c b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
index 4c2121094a0b..c7a73c68bdab 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mac80211.c
+++ b/drivers/net/wireless/iwlwifi/mvm/mac80211.c
@@ -279,14 +279,6 @@ static void iwl_mvm_reset_phy_ctxts(struct iwl_mvm *mvm)
279 } 279 }
280} 280}
281 281
282static int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm)
283{
284 /* we create the 802.11 header and SSID element */
285 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID)
286 return mvm->fw->ucode_capa.max_probe_length - 24 - 2;
287 return mvm->fw->ucode_capa.max_probe_length - 24 - 34;
288}
289
290int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) 282int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
291{ 283{
292 struct ieee80211_hw *hw = mvm->hw; 284 struct ieee80211_hw *hw = mvm->hw;
@@ -303,7 +295,8 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
303 IEEE80211_HW_AMPDU_AGGREGATION | 295 IEEE80211_HW_AMPDU_AGGREGATION |
304 IEEE80211_HW_TIMING_BEACON_ONLY | 296 IEEE80211_HW_TIMING_BEACON_ONLY |
305 IEEE80211_HW_CONNECTION_MONITOR | 297 IEEE80211_HW_CONNECTION_MONITOR |
306 IEEE80211_HW_CHANCTX_STA_CSA; 298 IEEE80211_HW_CHANCTX_STA_CSA |
299 IEEE80211_HW_SUPPORTS_CLONED_SKBS;
307 300
308 hw->queues = mvm->first_agg_queue; 301 hw->queues = mvm->first_agg_queue;
309 hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE; 302 hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE;
@@ -378,7 +371,7 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
378 371
379 iwl_mvm_reset_phy_ctxts(mvm); 372 iwl_mvm_reset_phy_ctxts(mvm);
380 373
381 hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm); 374 hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm, false);
382 375
383 hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; 376 hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
384 377
@@ -411,6 +404,22 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
411 NL80211_FEATURE_DYNAMIC_SMPS | 404 NL80211_FEATURE_DYNAMIC_SMPS |
412 NL80211_FEATURE_STATIC_SMPS; 405 NL80211_FEATURE_STATIC_SMPS;
413 406
407 if (mvm->fw->ucode_capa.capa[0] &
408 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT)
409 hw->wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
410 if (mvm->fw->ucode_capa.capa[0] &
411 IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT)
412 hw->wiphy->features |= NL80211_FEATURE_QUIET;
413
414 if (mvm->fw->ucode_capa.capa[0] &
415 IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT)
416 hw->wiphy->features |=
417 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES;
418
419 if (mvm->fw->ucode_capa.capa[0] &
420 IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT)
421 hw->wiphy->features |= NL80211_FEATURE_WFA_TPC_IE_IN_PROBES;
422
414 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD; 423 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
415 424
416 /* currently FW API supports only one optional cipher scheme */ 425 /* currently FW API supports only one optional cipher scheme */
@@ -2135,7 +2144,13 @@ static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
2135 2144
2136 mutex_lock(&mvm->mutex); 2145 mutex_lock(&mvm->mutex);
2137 2146
2138 if (!iwl_mvm_is_idle(mvm)) { 2147 /* Newest FW fixes sched scan while connected on another interface */
2148 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) {
2149 if (!vif->bss_conf.idle) {
2150 ret = -EBUSY;
2151 goto out;
2152 }
2153 } else if (!iwl_mvm_is_idle(mvm)) {
2139 ret = -EBUSY; 2154 ret = -EBUSY;
2140 goto out; 2155 goto out;
2141 } 2156 }
diff --git a/drivers/net/wireless/iwlwifi/mvm/mvm.h b/drivers/net/wireless/iwlwifi/mvm/mvm.h
index 552995810f9e..b153ced7015b 100644
--- a/drivers/net/wireless/iwlwifi/mvm/mvm.h
+++ b/drivers/net/wireless/iwlwifi/mvm/mvm.h
@@ -779,6 +779,11 @@ static inline bool iwl_mvm_is_d0i3_supported(struct iwl_mvm *mvm)
779 (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_D0I3_SUPPORT); 779 (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_D0I3_SUPPORT);
780} 780}
781 781
782static inline bool iwl_mvm_is_dqa_supported(struct iwl_mvm *mvm)
783{
784 return mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_DQA_SUPPORT;
785}
786
782extern const u8 iwl_mvm_ac_to_tx_fifo[]; 787extern const u8 iwl_mvm_ac_to_tx_fifo[];
783 788
784struct iwl_rate_info { 789struct iwl_rate_info {
@@ -930,6 +935,7 @@ int iwl_mvm_rx_scan_response(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
930int iwl_mvm_rx_scan_complete(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, 935int iwl_mvm_rx_scan_complete(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
931 struct iwl_device_cmd *cmd); 936 struct iwl_device_cmd *cmd);
932int iwl_mvm_cancel_scan(struct iwl_mvm *mvm); 937int iwl_mvm_cancel_scan(struct iwl_mvm *mvm);
938int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan);
933 939
934/* Scheduled scan */ 940/* Scheduled scan */
935int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm, 941int iwl_mvm_rx_scan_offload_complete_notif(struct iwl_mvm *mvm,
@@ -984,6 +990,9 @@ void iwl_mvm_update_frame_stats(struct iwl_mvm *mvm,
984 struct iwl_mvm_frame_stats *stats, 990 struct iwl_mvm_frame_stats *stats,
985 u32 rate, bool agg); 991 u32 rate, bool agg);
986int rs_pretty_print_rate(char *buf, const u32 rate); 992int rs_pretty_print_rate(char *buf, const u32 rate);
993void rs_update_last_rssi(struct iwl_mvm *mvm,
994 struct iwl_lq_sta *lq_sta,
995 struct ieee80211_rx_status *rx_status);
987 996
988/* power management */ 997/* power management */
989int iwl_mvm_power_update_device(struct iwl_mvm *mvm); 998int iwl_mvm_power_update_device(struct iwl_mvm *mvm);
@@ -1141,6 +1150,39 @@ static inline bool iwl_mvm_vif_low_latency(struct iwl_mvm_vif *mvmvif)
1141 return mvmvif->low_latency; 1150 return mvmvif->low_latency;
1142} 1151}
1143 1152
1153/* hw scheduler queue config */
1154void iwl_mvm_enable_txq(struct iwl_mvm *mvm, int queue, u16 ssn,
1155 const struct iwl_trans_txq_scd_cfg *cfg);
1156void iwl_mvm_disable_txq(struct iwl_mvm *mvm, int queue);
1157
1158static inline void iwl_mvm_enable_ac_txq(struct iwl_mvm *mvm, int queue,
1159 u8 fifo)
1160{
1161 struct iwl_trans_txq_scd_cfg cfg = {
1162 .fifo = fifo,
1163 .tid = IWL_MAX_TID_COUNT,
1164 .aggregate = false,
1165 .frame_limit = IWL_FRAME_LIMIT,
1166 };
1167
1168 iwl_mvm_enable_txq(mvm, queue, 0, &cfg);
1169}
1170
1171static inline void iwl_mvm_enable_agg_txq(struct iwl_mvm *mvm, int queue,
1172 int fifo, int sta_id, int tid,
1173 int frame_limit, u16 ssn)
1174{
1175 struct iwl_trans_txq_scd_cfg cfg = {
1176 .fifo = fifo,
1177 .sta_id = sta_id,
1178 .tid = tid,
1179 .frame_limit = frame_limit,
1180 .aggregate = true,
1181 };
1182
1183 iwl_mvm_enable_txq(mvm, queue, ssn, &cfg);
1184}
1185
1144/* Assoc status */ 1186/* Assoc status */
1145bool iwl_mvm_is_idle(struct iwl_mvm *mvm); 1187bool iwl_mvm_is_idle(struct iwl_mvm *mvm);
1146 1188
@@ -1150,6 +1192,7 @@ void iwl_mvm_tt_handler(struct iwl_mvm *mvm);
1150void iwl_mvm_tt_initialize(struct iwl_mvm *mvm, u32 min_backoff); 1192void iwl_mvm_tt_initialize(struct iwl_mvm *mvm, u32 min_backoff);
1151void iwl_mvm_tt_exit(struct iwl_mvm *mvm); 1193void iwl_mvm_tt_exit(struct iwl_mvm *mvm);
1152void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state); 1194void iwl_mvm_set_hw_ctkill_state(struct iwl_mvm *mvm, bool state);
1195int iwl_mvm_get_temp(struct iwl_mvm *mvm);
1153 1196
1154/* smart fifo */ 1197/* smart fifo */
1155int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 1198int iwl_mvm_sf_update(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
diff --git a/drivers/net/wireless/iwlwifi/mvm/ops.c b/drivers/net/wireless/iwlwifi/mvm/ops.c
index f887779717d5..15aa298ee79c 100644
--- a/drivers/net/wireless/iwlwifi/mvm/ops.c
+++ b/drivers/net/wireless/iwlwifi/mvm/ops.c
@@ -342,6 +342,7 @@ static const char *const iwl_mvm_cmd_strings[REPLY_MAX] = {
342 CMD(BT_COEX_UPDATE_REDUCED_TXP), 342 CMD(BT_COEX_UPDATE_REDUCED_TXP),
343 CMD(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION), 343 CMD(PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION),
344 CMD(ANTENNA_COUPLING_NOTIFICATION), 344 CMD(ANTENNA_COUPLING_NOTIFICATION),
345 CMD(SCD_QUEUE_CFG),
345}; 346};
346#undef CMD 347#undef CMD
347 348
@@ -421,7 +422,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
421 mvm->first_agg_queue = 12; 422 mvm->first_agg_queue = 12;
422 } 423 }
423 mvm->sf_state = SF_UNINIT; 424 mvm->sf_state = SF_UNINIT;
424 mvm->low_latency_agg_frame_limit = 1; 425 mvm->low_latency_agg_frame_limit = 6;
425 426
426 mutex_init(&mvm->mutex); 427 mutex_init(&mvm->mutex);
427 mutex_init(&mvm->d0i3_suspend_mutex); 428 mutex_init(&mvm->d0i3_suspend_mutex);
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index f77dfe4df074..18a539999580 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -377,9 +377,9 @@ static int iwl_hwrate_to_plcp_idx(u32 rate_n_flags)
377} 377}
378 378
379static void rs_rate_scale_perform(struct iwl_mvm *mvm, 379static void rs_rate_scale_perform(struct iwl_mvm *mvm,
380 struct sk_buff *skb, 380 struct ieee80211_sta *sta,
381 struct ieee80211_sta *sta, 381 struct iwl_lq_sta *lq_sta,
382 struct iwl_lq_sta *lq_sta); 382 int tid);
383static void rs_fill_lq_cmd(struct iwl_mvm *mvm, 383static void rs_fill_lq_cmd(struct iwl_mvm *mvm,
384 struct ieee80211_sta *sta, 384 struct ieee80211_sta *sta,
385 struct iwl_lq_sta *lq_sta, 385 struct iwl_lq_sta *lq_sta,
@@ -1007,27 +1007,35 @@ static u32 rs_ch_width_from_mac_flags(enum mac80211_rate_control_flags flags)
1007 return RATE_MCS_CHAN_WIDTH_20; 1007 return RATE_MCS_CHAN_WIDTH_20;
1008} 1008}
1009 1009
1010/* 1010static u8 rs_get_tid(struct ieee80211_hdr *hdr)
1011 * mac80211 sends us Tx status 1011{
1012 */ 1012 u8 tid = IWL_MAX_TID_COUNT;
1013static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband, 1013
1014 struct ieee80211_sta *sta, void *priv_sta, 1014 if (ieee80211_is_data_qos(hdr->frame_control)) {
1015 struct sk_buff *skb) 1015 u8 *qc = ieee80211_get_qos_ctl(hdr);
1016 tid = qc[0] & 0xf;
1017 }
1018
1019 if (unlikely(tid > IWL_MAX_TID_COUNT))
1020 tid = IWL_MAX_TID_COUNT;
1021
1022 return tid;
1023}
1024
1025void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
1026 int tid, struct ieee80211_tx_info *info)
1016{ 1027{
1017 int legacy_success; 1028 int legacy_success;
1018 int retries; 1029 int retries;
1019 int mac_index, i; 1030 int mac_index, i;
1020 struct iwl_lq_sta *lq_sta = priv_sta;
1021 struct iwl_lq_cmd *table; 1031 struct iwl_lq_cmd *table;
1022 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1023 struct iwl_op_mode *op_mode = (struct iwl_op_mode *)mvm_r;
1024 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
1025 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1026 enum mac80211_rate_control_flags mac_flags; 1032 enum mac80211_rate_control_flags mac_flags;
1027 u32 ucode_rate; 1033 u32 ucode_rate;
1028 struct rs_rate rate; 1034 struct rs_rate rate;
1029 struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl; 1035 struct iwl_scale_tbl_info *curr_tbl, *other_tbl, *tmp_tbl;
1030 u8 reduced_txp = (uintptr_t)info->status.status_driver_data[0]; 1036 u8 reduced_txp = (uintptr_t)info->status.status_driver_data[0];
1037 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
1038 struct iwl_lq_sta *lq_sta = &mvmsta->lq_sta;
1031 1039
1032 /* Treat uninitialized rate scaling data same as non-existing. */ 1040 /* Treat uninitialized rate scaling data same as non-existing. */
1033 if (!lq_sta) { 1041 if (!lq_sta) {
@@ -1045,10 +1053,6 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
1045 return; 1053 return;
1046 } 1054 }
1047#endif 1055#endif
1048 if (!ieee80211_is_data(hdr->frame_control) ||
1049 info->flags & IEEE80211_TX_CTL_NO_ACK)
1050 return;
1051
1052 /* This packet was aggregated but doesn't carry status info */ 1056 /* This packet was aggregated but doesn't carry status info */
1053 if ((info->flags & IEEE80211_TX_CTL_AMPDU) && 1057 if ((info->flags & IEEE80211_TX_CTL_AMPDU) &&
1054 !(info->flags & IEEE80211_TX_STAT_AMPDU)) 1058 !(info->flags & IEEE80211_TX_STAT_AMPDU))
@@ -1094,7 +1098,7 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
1094 for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) 1098 for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++)
1095 ieee80211_stop_tx_ba_session(sta, tid); 1099 ieee80211_stop_tx_ba_session(sta, tid);
1096 1100
1097 iwl_mvm_rs_rate_init(mvm, sta, sband->band, false); 1101 iwl_mvm_rs_rate_init(mvm, sta, info->band, false);
1098 return; 1102 return;
1099 } 1103 }
1100 lq_sta->last_tx = jiffies; 1104 lq_sta->last_tx = jiffies;
@@ -1221,8 +1225,28 @@ static void rs_tx_status(void *mvm_r, struct ieee80211_supported_band *sband,
1221 IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp); 1225 IWL_DEBUG_RATE(mvm, "reduced txpower: %d\n", reduced_txp);
1222done: 1226done:
1223 /* See if there's a better rate or modulation mode to try. */ 1227 /* See if there's a better rate or modulation mode to try. */
1224 if (sta && sta->supp_rates[sband->band]) 1228 if (sta && sta->supp_rates[info->band])
1225 rs_rate_scale_perform(mvm, skb, sta, lq_sta); 1229 rs_rate_scale_perform(mvm, sta, lq_sta, tid);
1230}
1231
1232/*
1233 * mac80211 sends us Tx status
1234 */
1235static void rs_mac80211_tx_status(void *mvm_r,
1236 struct ieee80211_supported_band *sband,
1237 struct ieee80211_sta *sta, void *priv_sta,
1238 struct sk_buff *skb)
1239{
1240 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1241 struct iwl_op_mode *op_mode = (struct iwl_op_mode *)mvm_r;
1242 struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode);
1243 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1244
1245 if (!ieee80211_is_data(hdr->frame_control) ||
1246 info->flags & IEEE80211_TX_CTL_NO_ACK)
1247 return;
1248
1249 iwl_mvm_rs_tx_status(mvm, sta, rs_get_tid(hdr), info);
1226} 1250}
1227 1251
1228/* 1252/*
@@ -1493,22 +1517,6 @@ static void rs_update_rate_tbl(struct iwl_mvm *mvm,
1493 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false); 1517 iwl_mvm_send_lq_cmd(mvm, &lq_sta->lq, false);
1494} 1518}
1495 1519
1496static u8 rs_get_tid(struct iwl_lq_sta *lq_data,
1497 struct ieee80211_hdr *hdr)
1498{
1499 u8 tid = IWL_MAX_TID_COUNT;
1500
1501 if (ieee80211_is_data_qos(hdr->frame_control)) {
1502 u8 *qc = ieee80211_get_qos_ctl(hdr);
1503 tid = qc[0] & 0xf;
1504 }
1505
1506 if (unlikely(tid > IWL_MAX_TID_COUNT))
1507 tid = IWL_MAX_TID_COUNT;
1508
1509 return tid;
1510}
1511
1512static enum rs_column rs_get_next_column(struct iwl_mvm *mvm, 1520static enum rs_column rs_get_next_column(struct iwl_mvm *mvm,
1513 struct iwl_lq_sta *lq_sta, 1521 struct iwl_lq_sta *lq_sta,
1514 struct ieee80211_sta *sta, 1522 struct ieee80211_sta *sta,
@@ -1947,12 +1955,10 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
1947 * Do rate scaling and search for new modulation mode. 1955 * Do rate scaling and search for new modulation mode.
1948 */ 1956 */
1949static void rs_rate_scale_perform(struct iwl_mvm *mvm, 1957static void rs_rate_scale_perform(struct iwl_mvm *mvm,
1950 struct sk_buff *skb,
1951 struct ieee80211_sta *sta, 1958 struct ieee80211_sta *sta,
1952 struct iwl_lq_sta *lq_sta) 1959 struct iwl_lq_sta *lq_sta,
1960 int tid)
1953{ 1961{
1954 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1955 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
1956 int low = IWL_RATE_INVALID; 1962 int low = IWL_RATE_INVALID;
1957 int high = IWL_RATE_INVALID; 1963 int high = IWL_RATE_INVALID;
1958 int index; 1964 int index;
@@ -1969,29 +1975,12 @@ static void rs_rate_scale_perform(struct iwl_mvm *mvm,
1969 u8 done_search = 0; 1975 u8 done_search = 0;
1970 u16 high_low; 1976 u16 high_low;
1971 s32 sr; 1977 s32 sr;
1972 u8 tid = IWL_MAX_TID_COUNT;
1973 u8 prev_agg = lq_sta->is_agg; 1978 u8 prev_agg = lq_sta->is_agg;
1974 struct iwl_mvm_sta *sta_priv = (void *)sta->drv_priv; 1979 struct iwl_mvm_sta *sta_priv = (void *)sta->drv_priv;
1975 struct iwl_mvm_tid_data *tid_data; 1980 struct iwl_mvm_tid_data *tid_data;
1976 struct rs_rate *rate; 1981 struct rs_rate *rate;
1977 1982
1978 /* Send management frames and NO_ACK data using lowest rate. */ 1983 lq_sta->is_agg = !!sta_priv->agg_tids;
1979 /* TODO: this could probably be improved.. */
1980 if (!ieee80211_is_data(hdr->frame_control) ||
1981 info->flags & IEEE80211_TX_CTL_NO_ACK)
1982 return;
1983
1984 tid = rs_get_tid(lq_sta, hdr);
1985 if ((tid != IWL_MAX_TID_COUNT) &&
1986 (lq_sta->tx_agg_tid_en & (1 << tid))) {
1987 tid_data = &sta_priv->tid_data[tid];
1988 if (tid_data->state == IWL_AGG_OFF)
1989 lq_sta->is_agg = 0;
1990 else
1991 lq_sta->is_agg = 1;
1992 } else {
1993 lq_sta->is_agg = 0;
1994 }
1995 1984
1996 /* 1985 /*
1997 * Select rate-scale / modulation-mode table to work with in 1986 * Select rate-scale / modulation-mode table to work with in
@@ -2288,6 +2277,110 @@ out:
2288 lq_sta->last_txrate_idx = index; 2277 lq_sta->last_txrate_idx = index;
2289} 2278}
2290 2279
2280struct rs_init_rate_info {
2281 s8 rssi;
2282 u8 rate_idx;
2283};
2284
2285static const struct rs_init_rate_info rs_init_rates_24ghz[] = {
2286 { -60, IWL_RATE_54M_INDEX },
2287 { -64, IWL_RATE_48M_INDEX },
2288 { -68, IWL_RATE_36M_INDEX },
2289 { -80, IWL_RATE_24M_INDEX },
2290 { -84, IWL_RATE_18M_INDEX },
2291 { -85, IWL_RATE_12M_INDEX },
2292 { -86, IWL_RATE_11M_INDEX },
2293 { -88, IWL_RATE_5M_INDEX },
2294 { -90, IWL_RATE_2M_INDEX },
2295 { S8_MIN, IWL_RATE_1M_INDEX },
2296};
2297
2298static const struct rs_init_rate_info rs_init_rates_5ghz[] = {
2299 { -60, IWL_RATE_54M_INDEX },
2300 { -64, IWL_RATE_48M_INDEX },
2301 { -72, IWL_RATE_36M_INDEX },
2302 { -80, IWL_RATE_24M_INDEX },
2303 { -84, IWL_RATE_18M_INDEX },
2304 { -85, IWL_RATE_12M_INDEX },
2305 { -87, IWL_RATE_9M_INDEX },
2306 { S8_MIN, IWL_RATE_6M_INDEX },
2307};
2308
2309/* Choose an initial legacy rate and antenna to use based on the RSSI
2310 * of last Rx
2311 */
2312static void rs_get_initial_rate(struct iwl_mvm *mvm,
2313 struct iwl_lq_sta *lq_sta,
2314 enum ieee80211_band band,
2315 struct rs_rate *rate)
2316{
2317 int i, nentries;
2318 s8 best_rssi = S8_MIN;
2319 u8 best_ant = ANT_NONE;
2320 u8 valid_tx_ant = mvm->fw->valid_tx_ant;
2321 const struct rs_init_rate_info *initial_rates;
2322
2323 for (i = 0; i < ARRAY_SIZE(lq_sta->pers.chain_signal); i++) {
2324 if (!(lq_sta->pers.chains & BIT(i)))
2325 continue;
2326
2327 if (lq_sta->pers.chain_signal[i] > best_rssi) {
2328 best_rssi = lq_sta->pers.chain_signal[i];
2329 best_ant = BIT(i);
2330 }
2331 }
2332
2333 IWL_DEBUG_RATE(mvm, "Best ANT: %s Best RSSI: %d\n",
2334 rs_pretty_ant(best_ant), best_rssi);
2335
2336 if (best_ant != ANT_A && best_ant != ANT_B)
2337 rate->ant = first_antenna(valid_tx_ant);
2338 else
2339 rate->ant = best_ant;
2340
2341 rate->sgi = false;
2342 rate->ldpc = false;
2343 rate->bw = RATE_MCS_CHAN_WIDTH_20;
2344
2345 rate->index = find_first_bit(&lq_sta->active_legacy_rate,
2346 BITS_PER_LONG);
2347
2348 if (band == IEEE80211_BAND_5GHZ) {
2349 rate->type = LQ_LEGACY_A;
2350 initial_rates = rs_init_rates_5ghz;
2351 nentries = ARRAY_SIZE(rs_init_rates_5ghz);
2352 } else {
2353 rate->type = LQ_LEGACY_G;
2354 initial_rates = rs_init_rates_24ghz;
2355 nentries = ARRAY_SIZE(rs_init_rates_24ghz);
2356 }
2357
2358 if (IWL_MVM_RS_RSSI_BASED_INIT_RATE) {
2359 for (i = 0; i < nentries; i++) {
2360 int rate_idx = initial_rates[i].rate_idx;
2361 if ((best_rssi >= initial_rates[i].rssi) &&
2362 (BIT(rate_idx) & lq_sta->active_legacy_rate)) {
2363 rate->index = rate_idx;
2364 break;
2365 }
2366 }
2367 }
2368
2369 IWL_DEBUG_RATE(mvm, "rate_idx %d ANT %s\n", rate->index,
2370 rs_pretty_ant(rate->ant));
2371}
2372
2373/* Save info about RSSI of last Rx */
2374void rs_update_last_rssi(struct iwl_mvm *mvm,
2375 struct iwl_lq_sta *lq_sta,
2376 struct ieee80211_rx_status *rx_status)
2377{
2378 lq_sta->pers.chains = rx_status->chains;
2379 lq_sta->pers.chain_signal[0] = rx_status->chain_signal[0];
2380 lq_sta->pers.chain_signal[1] = rx_status->chain_signal[1];
2381 lq_sta->pers.chain_signal[2] = rx_status->chain_signal[2];
2382}
2383
2291/** 2384/**
2292 * rs_initialize_lq - Initialize a station's hardware rate table 2385 * rs_initialize_lq - Initialize a station's hardware rate table
2293 * 2386 *
@@ -2310,17 +2403,11 @@ static void rs_initialize_lq(struct iwl_mvm *mvm,
2310{ 2403{
2311 struct iwl_scale_tbl_info *tbl; 2404 struct iwl_scale_tbl_info *tbl;
2312 struct rs_rate *rate; 2405 struct rs_rate *rate;
2313 int i;
2314 u8 active_tbl = 0; 2406 u8 active_tbl = 0;
2315 u8 valid_tx_ant;
2316 2407
2317 if (!sta || !lq_sta) 2408 if (!sta || !lq_sta)
2318 return; 2409 return;
2319 2410
2320 i = lq_sta->last_txrate_idx;
2321
2322 valid_tx_ant = mvm->fw->valid_tx_ant;
2323
2324 if (!lq_sta->search_better_tbl) 2411 if (!lq_sta->search_better_tbl)
2325 active_tbl = lq_sta->active_tbl; 2412 active_tbl = lq_sta->active_tbl;
2326 else 2413 else
@@ -2329,18 +2416,8 @@ static void rs_initialize_lq(struct iwl_mvm *mvm,
2329 tbl = &(lq_sta->lq_info[active_tbl]); 2416 tbl = &(lq_sta->lq_info[active_tbl]);
2330 rate = &tbl->rate; 2417 rate = &tbl->rate;
2331 2418
2332 if ((i < 0) || (i >= IWL_RATE_COUNT)) 2419 rs_get_initial_rate(mvm, lq_sta, band, rate);
2333 i = 0; 2420 lq_sta->last_txrate_idx = rate->index;
2334
2335 rate->index = i;
2336 rate->ant = first_antenna(valid_tx_ant);
2337 rate->sgi = false;
2338 rate->ldpc = false;
2339 rate->bw = RATE_MCS_CHAN_WIDTH_20;
2340 if (band == IEEE80211_BAND_5GHZ)
2341 rate->type = LQ_LEGACY_A;
2342 else
2343 rate->type = LQ_LEGACY_G;
2344 2421
2345 WARN_ON_ONCE(rate->ant != ANT_A && rate->ant != ANT_B); 2422 WARN_ON_ONCE(rate->ant != ANT_A && rate->ant != ANT_B);
2346 if (rate->ant == ANT_A) 2423 if (rate->ant == ANT_A)
@@ -2397,6 +2474,8 @@ static void *rs_alloc_sta(void *mvm_rate, struct ieee80211_sta *sta,
2397 lq_sta->pers.dbg_fixed_rate = 0; 2474 lq_sta->pers.dbg_fixed_rate = 0;
2398 lq_sta->pers.dbg_fixed_txp_reduction = TPC_INVALID; 2475 lq_sta->pers.dbg_fixed_txp_reduction = TPC_INVALID;
2399#endif 2476#endif
2477 lq_sta->pers.chains = 0;
2478 memset(lq_sta->pers.chain_signal, 0, sizeof(lq_sta->pers.chain_signal));
2400 2479
2401 return &sta_priv->lq_sta; 2480 return &sta_priv->lq_sta;
2402} 2481}
@@ -2630,11 +2709,6 @@ void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
2630 2709
2631 /* as default allow aggregation for all tids */ 2710 /* as default allow aggregation for all tids */
2632 lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID; 2711 lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID;
2633
2634 /* Set last_txrate_idx to lowest rate */
2635 lq_sta->last_txrate_idx = rate_lowest_index(sband, sta);
2636 if (sband->band == IEEE80211_BAND_5GHZ)
2637 lq_sta->last_txrate_idx += IWL_FIRST_OFDM_RATE;
2638 lq_sta->is_agg = 0; 2712 lq_sta->is_agg = 0;
2639#ifdef CONFIG_IWLWIFI_DEBUGFS 2713#ifdef CONFIG_IWLWIFI_DEBUGFS
2640 iwl_mvm_reset_frame_stats(mvm, &mvm->drv_rx_stats); 2714 iwl_mvm_reset_frame_stats(mvm, &mvm->drv_rx_stats);
@@ -3238,7 +3312,7 @@ static void rs_rate_init_stub(void *mvm_r,
3238 3312
3239static const struct rate_control_ops rs_mvm_ops = { 3313static const struct rate_control_ops rs_mvm_ops = {
3240 .name = RS_NAME, 3314 .name = RS_NAME,
3241 .tx_status = rs_tx_status, 3315 .tx_status = rs_mac80211_tx_status,
3242 .get_rate = rs_get_rate, 3316 .get_rate = rs_get_rate,
3243 .rate_init = rs_rate_init_stub, 3317 .rate_init = rs_rate_init_stub,
3244 .alloc = rs_alloc, 3318 .alloc = rs_alloc,
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.h b/drivers/net/wireless/iwlwifi/mvm/rs.h
index 95c4b960fd71..eb34c1209acc 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.h
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.h
@@ -376,6 +376,10 @@ struct iwl_lq_sta {
376void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta, 376void iwl_mvm_rs_rate_init(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
377 enum ieee80211_band band, bool init); 377 enum ieee80211_band band, bool init);
378 378
379/* Notify RS about Tx status */
380void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
381 int tid, struct ieee80211_tx_info *info);
382
379/** 383/**
380 * iwl_rate_control_register - Register the rate control algorithm callbacks 384 * iwl_rate_control_register - Register the rate control algorithm callbacks
381 * 385 *
diff --git a/drivers/net/wireless/iwlwifi/mvm/rx.c b/drivers/net/wireless/iwlwifi/mvm/rx.c
index a6cb84ed653f..3cf40f3f58ec 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rx.c
@@ -246,6 +246,7 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
246 struct iwl_rx_packet *pkt = rxb_addr(rxb); 246 struct iwl_rx_packet *pkt = rxb_addr(rxb);
247 struct iwl_rx_phy_info *phy_info; 247 struct iwl_rx_phy_info *phy_info;
248 struct iwl_rx_mpdu_res_start *rx_res; 248 struct iwl_rx_mpdu_res_start *rx_res;
249 struct ieee80211_sta *sta;
249 u32 len; 250 u32 len;
250 u32 ampdu_status; 251 u32 ampdu_status;
251 u32 rate_n_flags; 252 u32 rate_n_flags;
@@ -261,23 +262,6 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
261 memset(&rx_status, 0, sizeof(rx_status)); 262 memset(&rx_status, 0, sizeof(rx_status));
262 263
263 /* 264 /*
264 * We have tx blocked stations (with CS bit). If we heard frames from
265 * a blocked station on a new channel we can TX to it again.
266 */
267 if (unlikely(mvm->csa_tx_block_bcn_timeout)) {
268 struct ieee80211_sta *sta;
269
270 rcu_read_lock();
271
272 sta = ieee80211_find_sta(
273 rcu_dereference(mvm->csa_tx_blocked_vif), hdr->addr2);
274 if (sta)
275 iwl_mvm_sta_modify_disable_tx_ap(mvm, sta, false);
276
277 rcu_read_unlock();
278 }
279
280 /*
281 * drop the packet if it has failed being decrypted by HW 265 * drop the packet if it has failed being decrypted by HW
282 */ 266 */
283 if (iwl_mvm_set_mac80211_rx_flag(mvm, hdr, &rx_status, rx_pkt_status)) { 267 if (iwl_mvm_set_mac80211_rx_flag(mvm, hdr, &rx_status, rx_pkt_status)) {
@@ -325,6 +309,29 @@ int iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
325 IWL_DEBUG_STATS_LIMIT(mvm, "Rssi %d, TSF %llu\n", rx_status.signal, 309 IWL_DEBUG_STATS_LIMIT(mvm, "Rssi %d, TSF %llu\n", rx_status.signal,
326 (unsigned long long)rx_status.mactime); 310 (unsigned long long)rx_status.mactime);
327 311
312 rcu_read_lock();
313 /*
314 * We have tx blocked stations (with CS bit). If we heard frames from
315 * a blocked station on a new channel we can TX to it again.
316 */
317 if (unlikely(mvm->csa_tx_block_bcn_timeout)) {
318 sta = ieee80211_find_sta(
319 rcu_dereference(mvm->csa_tx_blocked_vif), hdr->addr2);
320 if (sta)
321 iwl_mvm_sta_modify_disable_tx_ap(mvm, sta, false);
322 }
323
324 /* This is fine since we don't support multiple AP interfaces */
325 sta = ieee80211_find_sta_by_ifaddr(mvm->hw, hdr->addr2, NULL);
326 if (sta) {
327 struct iwl_mvm_sta *mvmsta;
328 mvmsta = iwl_mvm_sta_from_mac80211(sta);
329 rs_update_last_rssi(mvm, &mvmsta->lq_sta,
330 &rx_status);
331 }
332
333 rcu_read_unlock();
334
328 /* set the preamble flag if appropriate */ 335 /* set the preamble flag if appropriate */
329 if (phy_info->phy_flags & cpu_to_le16(RX_RES_PHY_FLAGS_SHORT_PREAMBLE)) 336 if (phy_info->phy_flags & cpu_to_le16(RX_RES_PHY_FLAGS_SHORT_PREAMBLE))
330 rx_status.flag |= RX_FLAG_SHORTPRE; 337 rx_status.flag |= RX_FLAG_SHORTPRE;
diff --git a/drivers/net/wireless/iwlwifi/mvm/scan.c b/drivers/net/wireless/iwlwifi/mvm/scan.c
index 09545f23b24f..cb85e63c20aa 100644
--- a/drivers/net/wireless/iwlwifi/mvm/scan.c
+++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
@@ -339,6 +339,55 @@ not_bound:
339 } 339 }
340} 340}
341 341
342static inline bool iwl_mvm_rrm_scan_needed(struct iwl_mvm *mvm)
343{
344 /* require rrm scan whenever the fw supports it */
345 return mvm->fw->ucode_capa.capa[0] &
346 IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT;
347}
348
349static int iwl_mvm_max_scan_ie_fw_cmd_room(struct iwl_mvm *mvm,
350 bool is_sched_scan)
351{
352 int max_probe_len;
353
354 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN)
355 max_probe_len = SCAN_OFFLOAD_PROBE_REQ_SIZE;
356 else
357 max_probe_len = mvm->fw->ucode_capa.max_probe_length;
358
359 /* we create the 802.11 header and SSID element */
360 max_probe_len -= 24 + 2;
361
362 /* basic ssid is added only for hw_scan with and old api */
363 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_NO_BASIC_SSID) &&
364 !(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) &&
365 !is_sched_scan)
366 max_probe_len -= 32;
367
368 return max_probe_len;
369}
370
371int iwl_mvm_max_scan_ie_len(struct iwl_mvm *mvm, bool is_sched_scan)
372{
373 int max_ie_len = iwl_mvm_max_scan_ie_fw_cmd_room(mvm, is_sched_scan);
374
375 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN))
376 return max_ie_len;
377
378 /* TODO: [BUG] This function should return the maximum allowed size of
379 * scan IEs, however the LMAC scan api contains both 2GHZ and 5GHZ IEs
380 * in the same command. So the correct implementation of this function
381 * is just iwl_mvm_max_scan_ie_fw_cmd_room() / 2. Currently the scan
382 * command has only 512 bytes and it would leave us with about 240
383 * bytes for scan IEs, which is clearly not enough. So meanwhile
384 * we will report an incorrect value. This may result in a failure to
385 * issue a scan in unified_scan_lmac and unified_sched_scan_lmac
386 * functions with -ENOBUFS, if a large enough probe will be provided.
387 */
388 return max_ie_len;
389}
390
342int iwl_mvm_scan_request(struct iwl_mvm *mvm, 391int iwl_mvm_scan_request(struct iwl_mvm *mvm,
343 struct ieee80211_vif *vif, 392 struct ieee80211_vif *vif,
344 struct cfg80211_scan_request *req) 393 struct cfg80211_scan_request *req)
@@ -1153,6 +1202,10 @@ iwl_mvm_build_generic_unified_scan_cmd(struct iwl_mvm *mvm,
1153 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE | 1202 IWL_SCAN_CHANNEL_FLAG_EBS_ACCURATE |
1154 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD); 1203 IWL_SCAN_CHANNEL_FLAG_CACHE_ADD);
1155 } 1204 }
1205
1206 if (iwl_mvm_rrm_scan_needed(mvm))
1207 cmd->scan_flags |=
1208 cpu_to_le32(IWL_MVM_LMAC_SCAN_FLAGS_RRM_ENABLED);
1156} 1209}
1157 1210
1158int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm, 1211int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm,
@@ -1180,13 +1233,12 @@ int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm,
1180 if (WARN_ON(mvm->scan_cmd == NULL)) 1233 if (WARN_ON(mvm->scan_cmd == NULL))
1181 return -ENOMEM; 1234 return -ENOMEM;
1182 1235
1183 if (WARN_ON_ONCE(req->req.n_ssids > PROBE_OPTION_MAX || 1236 if (req->req.n_ssids > PROBE_OPTION_MAX ||
1184 req->ies.common_ie_len + req->ies.len[0] + 1237 req->ies.common_ie_len + req->ies.len[NL80211_BAND_2GHZ] +
1185 req->ies.len[1] + 24 + 2 > 1238 req->ies.len[NL80211_BAND_5GHZ] >
1186 SCAN_OFFLOAD_PROBE_REQ_SIZE || 1239 iwl_mvm_max_scan_ie_fw_cmd_room(mvm, false) ||
1187 req->req.n_channels > 1240 req->req.n_channels > mvm->fw->ucode_capa.n_scan_channels)
1188 mvm->fw->ucode_capa.n_scan_channels)) 1241 return -ENOBUFS;
1189 return -1;
1190 1242
1191 mvm->scan_status = IWL_MVM_SCAN_OS; 1243 mvm->scan_status = IWL_MVM_SCAN_OS;
1192 1244
@@ -1208,7 +1260,7 @@ int iwl_mvm_unified_scan_lmac(struct iwl_mvm *mvm,
1208 if (req->req.n_ssids == 0) 1260 if (req->req.n_ssids == 0)
1209 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASSIVE; 1261 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASSIVE;
1210 1262
1211 cmd->scan_flags = cpu_to_le32(flags); 1263 cmd->scan_flags |= cpu_to_le32(flags);
1212 1264
1213 cmd->flags = iwl_mvm_scan_rxon_flags(req->req.channels[0]->band); 1265 cmd->flags = iwl_mvm_scan_rxon_flags(req->req.channels[0]->band);
1214 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP | 1266 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP |
@@ -1274,10 +1326,11 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
1274 if (WARN_ON(mvm->scan_cmd == NULL)) 1326 if (WARN_ON(mvm->scan_cmd == NULL))
1275 return -ENOMEM; 1327 return -ENOMEM;
1276 1328
1277 if (WARN_ON_ONCE(req->n_ssids > PROBE_OPTION_MAX || 1329 if (req->n_ssids > PROBE_OPTION_MAX ||
1278 ies->common_ie_len + ies->len[0] + ies->len[1] + 24 + 2 1330 ies->common_ie_len + ies->len[NL80211_BAND_2GHZ] +
1279 > SCAN_OFFLOAD_PROBE_REQ_SIZE || 1331 ies->len[NL80211_BAND_5GHZ] >
1280 req->n_channels > mvm->fw->ucode_capa.n_scan_channels)) 1332 iwl_mvm_max_scan_ie_fw_cmd_room(mvm, true) ||
1333 req->n_channels > mvm->fw->ucode_capa.n_scan_channels)
1281 return -ENOBUFS; 1334 return -ENOBUFS;
1282 1335
1283 iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, 0, &params); 1336 iwl_mvm_scan_calc_params(mvm, vif, req->n_ssids, 0, &params);
@@ -1305,7 +1358,7 @@ int iwl_mvm_unified_sched_scan_lmac(struct iwl_mvm *mvm,
1305 if (req->n_ssids == 0) 1358 if (req->n_ssids == 0)
1306 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASSIVE; 1359 flags |= IWL_MVM_LMAC_SCAN_FLAG_PASSIVE;
1307 1360
1308 cmd->scan_flags = cpu_to_le32(flags); 1361 cmd->scan_flags |= cpu_to_le32(flags);
1309 1362
1310 cmd->flags = iwl_mvm_scan_rxon_flags(req->channels[0]->band); 1363 cmd->flags = iwl_mvm_scan_rxon_flags(req->channels[0]->band);
1311 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP | 1364 cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP |
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.c b/drivers/net/wireless/iwlwifi/mvm/sta.c
index 666f16b4bed9..1731c205c81d 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sta.c
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.c
@@ -247,6 +247,7 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
247 memset(&mvm_sta->tid_data[i], 0, sizeof(mvm_sta->tid_data[i])); 247 memset(&mvm_sta->tid_data[i], 0, sizeof(mvm_sta->tid_data[i]));
248 mvm_sta->tid_data[i].seq_number = seq; 248 mvm_sta->tid_data[i].seq_number = seq;
249 } 249 }
250 mvm_sta->agg_tids = 0;
250 251
251 ret = iwl_mvm_sta_send_to_fw(mvm, sta, false); 252 ret = iwl_mvm_sta_send_to_fw(mvm, sta, false);
252 if (ret) 253 if (ret)
@@ -535,8 +536,8 @@ int iwl_mvm_add_aux_sta(struct iwl_mvm *mvm)
535 lockdep_assert_held(&mvm->mutex); 536 lockdep_assert_held(&mvm->mutex);
536 537
537 /* Map Aux queue to fifo - needs to happen before adding Aux station */ 538 /* Map Aux queue to fifo - needs to happen before adding Aux station */
538 iwl_trans_ac_txq_enable(mvm->trans, mvm->aux_queue, 539 iwl_mvm_enable_ac_txq(mvm, mvm->aux_queue,
539 IWL_MVM_TX_FIFO_MCAST); 540 IWL_MVM_TX_FIFO_MCAST);
540 541
541 /* Allocate aux station and assign to it the aux queue */ 542 /* Allocate aux station and assign to it the aux queue */
542 ret = iwl_mvm_allocate_int_sta(mvm, &mvm->aux_sta, BIT(mvm->aux_queue), 543 ret = iwl_mvm_allocate_int_sta(mvm, &mvm->aux_sta, BIT(mvm->aux_queue),
@@ -872,12 +873,16 @@ int iwl_mvm_sta_tx_agg_oper(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
872 int queue, fifo, ret; 873 int queue, fifo, ret;
873 u16 ssn; 874 u16 ssn;
874 875
876 BUILD_BUG_ON((sizeof(mvmsta->agg_tids) * BITS_PER_BYTE)
877 != IWL_MAX_TID_COUNT);
878
875 buf_size = min_t(int, buf_size, LINK_QUAL_AGG_FRAME_LIMIT_DEF); 879 buf_size = min_t(int, buf_size, LINK_QUAL_AGG_FRAME_LIMIT_DEF);
876 880
877 spin_lock_bh(&mvmsta->lock); 881 spin_lock_bh(&mvmsta->lock);
878 ssn = tid_data->ssn; 882 ssn = tid_data->ssn;
879 queue = tid_data->txq_id; 883 queue = tid_data->txq_id;
880 tid_data->state = IWL_AGG_ON; 884 tid_data->state = IWL_AGG_ON;
885 mvmsta->agg_tids |= BIT(tid);
881 tid_data->ssn = 0xffff; 886 tid_data->ssn = 0xffff;
882 spin_unlock_bh(&mvmsta->lock); 887 spin_unlock_bh(&mvmsta->lock);
883 888
@@ -887,8 +892,8 @@ int iwl_mvm_sta_tx_agg_oper(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
887 if (ret) 892 if (ret)
888 return -EIO; 893 return -EIO;
889 894
890 iwl_trans_txq_enable(mvm->trans, queue, fifo, mvmsta->sta_id, tid, 895 iwl_mvm_enable_agg_txq(mvm, queue, fifo, mvmsta->sta_id, tid,
891 buf_size, ssn); 896 buf_size, ssn);
892 897
893 /* 898 /*
894 * Even though in theory the peer could have different 899 * Even though in theory the peer could have different
@@ -932,6 +937,8 @@ int iwl_mvm_sta_tx_agg_stop(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
932 IWL_DEBUG_TX_QUEUES(mvm, "Stop AGG: sta %d tid %d q %d state %d\n", 937 IWL_DEBUG_TX_QUEUES(mvm, "Stop AGG: sta %d tid %d q %d state %d\n",
933 mvmsta->sta_id, tid, txq_id, tid_data->state); 938 mvmsta->sta_id, tid, txq_id, tid_data->state);
934 939
940 mvmsta->agg_tids &= ~BIT(tid);
941
935 switch (tid_data->state) { 942 switch (tid_data->state) {
936 case IWL_AGG_ON: 943 case IWL_AGG_ON:
937 tid_data->ssn = IEEE80211_SEQ_TO_SN(tid_data->seq_number); 944 tid_data->ssn = IEEE80211_SEQ_TO_SN(tid_data->seq_number);
@@ -956,7 +963,7 @@ int iwl_mvm_sta_tx_agg_stop(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
956 963
957 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false); 964 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false);
958 965
959 iwl_trans_txq_disable(mvm->trans, txq_id, true); 966 iwl_mvm_disable_txq(mvm, txq_id);
960 return 0; 967 return 0;
961 case IWL_AGG_STARTING: 968 case IWL_AGG_STARTING:
962 case IWL_EMPTYING_HW_QUEUE_ADDBA: 969 case IWL_EMPTYING_HW_QUEUE_ADDBA:
@@ -1005,6 +1012,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1005 mvmsta->sta_id, tid, txq_id, tid_data->state); 1012 mvmsta->sta_id, tid, txq_id, tid_data->state);
1006 old_state = tid_data->state; 1013 old_state = tid_data->state;
1007 tid_data->state = IWL_AGG_OFF; 1014 tid_data->state = IWL_AGG_OFF;
1015 mvmsta->agg_tids &= ~BIT(tid);
1008 spin_unlock_bh(&mvmsta->lock); 1016 spin_unlock_bh(&mvmsta->lock);
1009 1017
1010 if (old_state >= IWL_AGG_ON) { 1018 if (old_state >= IWL_AGG_ON) {
@@ -1013,7 +1021,7 @@ int iwl_mvm_sta_tx_agg_flush(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1013 1021
1014 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false); 1022 iwl_mvm_sta_tx_agg(mvm, sta, tid, txq_id, false);
1015 1023
1016 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id, true); 1024 iwl_mvm_disable_txq(mvm, tid_data->txq_id);
1017 } 1025 }
1018 1026
1019 mvm->queue_to_mac80211[tid_data->txq_id] = 1027 mvm->queue_to_mac80211[tid_data->txq_id] =
diff --git a/drivers/net/wireless/iwlwifi/mvm/sta.h b/drivers/net/wireless/iwlwifi/mvm/sta.h
index aeb3a7f80ceb..d9c0d7b0e9d4 100644
--- a/drivers/net/wireless/iwlwifi/mvm/sta.h
+++ b/drivers/net/wireless/iwlwifi/mvm/sta.h
@@ -299,6 +299,7 @@ static inline u16 iwl_mvm_tid_queued(struct iwl_mvm_tid_data *tid_data)
299 * @tx_protection: reference counter for controlling the Tx protection. 299 * @tx_protection: reference counter for controlling the Tx protection.
300 * @tt_tx_protection: is thermal throttling enable Tx protection? 300 * @tt_tx_protection: is thermal throttling enable Tx protection?
301 * @disable_tx: is tx to this STA disabled? 301 * @disable_tx: is tx to this STA disabled?
302 * @agg_tids: bitmap of tids whose status is operational aggregated (IWL_AGG_ON)
302 * 303 *
303 * When mac80211 creates a station it reserves some space (hw->sta_data_size) 304 * When mac80211 creates a station it reserves some space (hw->sta_data_size)
304 * in the structure for use by driver. This structure is placed in that 305 * in the structure for use by driver. This structure is placed in that
@@ -323,6 +324,7 @@ struct iwl_mvm_sta {
323 bool tt_tx_protection; 324 bool tt_tx_protection;
324 325
325 bool disable_tx; 326 bool disable_tx;
327 u8 agg_tids;
326}; 328};
327 329
328static inline struct iwl_mvm_sta * 330static inline struct iwl_mvm_sta *
diff --git a/drivers/net/wireless/iwlwifi/mvm/tt.c b/drivers/net/wireless/iwlwifi/mvm/tt.c
index c750ca7b8269..acca44a45086 100644
--- a/drivers/net/wireless/iwlwifi/mvm/tt.c
+++ b/drivers/net/wireless/iwlwifi/mvm/tt.c
@@ -135,7 +135,7 @@ static int iwl_mvm_get_temp_cmd(struct iwl_mvm *mvm)
135 sizeof(cmd), &cmd); 135 sizeof(cmd), &cmd);
136} 136}
137 137
138static int iwl_mvm_get_temp(struct iwl_mvm *mvm) 138int iwl_mvm_get_temp(struct iwl_mvm *mvm)
139{ 139{
140 struct iwl_notification_wait wait_temp_notif; 140 struct iwl_notification_wait wait_temp_notif;
141 static const u8 temp_notif[] = { DTS_MEASUREMENT_NOTIFICATION }; 141 static const u8 temp_notif[] = { DTS_MEASUREMENT_NOTIFICATION };
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c
index c67296efa04d..1cb793a498ac 100644
--- a/drivers/net/wireless/iwlwifi/mvm/tx.c
+++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
@@ -133,6 +133,11 @@ static void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
133 !is_multicast_ether_addr(ieee80211_get_DA(hdr))) 133 !is_multicast_ether_addr(ieee80211_get_DA(hdr)))
134 tx_flags |= TX_CMD_FLG_PROT_REQUIRE; 134 tx_flags |= TX_CMD_FLG_PROT_REQUIRE;
135 135
136 if ((mvm->fw->ucode_capa.capa[0] &
137 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT) &&
138 ieee80211_action_contains_tpc(skb))
139 tx_flags |= TX_CMD_FLG_WRITE_TX_POWER;
140
136 tx_cmd->tx_flags = cpu_to_le32(tx_flags); 141 tx_cmd->tx_flags = cpu_to_le32(tx_flags);
137 /* Total # bytes to be transmitted */ 142 /* Total # bytes to be transmitted */
138 tx_cmd->len = cpu_to_le16((u16)skb->len); 143 tx_cmd->len = cpu_to_le16((u16)skb->len);
@@ -488,11 +493,11 @@ static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm,
488 IWL_DEBUG_TX_QUEUES(mvm, 493 IWL_DEBUG_TX_QUEUES(mvm,
489 "Can continue DELBA flow ssn = next_recl = %d\n", 494 "Can continue DELBA flow ssn = next_recl = %d\n",
490 tid_data->next_reclaimed); 495 tid_data->next_reclaimed);
491 iwl_trans_txq_disable(mvm->trans, tid_data->txq_id, true); 496 iwl_mvm_disable_txq(mvm, tid_data->txq_id);
492 tid_data->state = IWL_AGG_OFF; 497 tid_data->state = IWL_AGG_OFF;
493 /* 498 /*
494 * we can't hold the mutex - but since we are after a sequence 499 * we can't hold the mutex - but since we are after a sequence
495 * point (call to iwl_trans_txq_disable), so we don't even need 500 * point (call to iwl_mvm_disable_txq(), so we don't even need
496 * a memory barrier. 501 * a memory barrier.
497 */ 502 */
498 mvm->queue_to_mac80211[tid_data->txq_id] = 503 mvm->queue_to_mac80211[tid_data->txq_id] =
@@ -868,6 +873,19 @@ int iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
868 return 0; 873 return 0;
869} 874}
870 875
876static void iwl_mvm_tx_info_from_ba_notif(struct ieee80211_tx_info *info,
877 struct iwl_mvm_ba_notif *ba_notif,
878 struct iwl_mvm_tid_data *tid_data)
879{
880 info->flags |= IEEE80211_TX_STAT_AMPDU;
881 info->status.ampdu_ack_len = ba_notif->txed_2_done;
882 info->status.ampdu_len = ba_notif->txed;
883 iwl_mvm_hwrate_to_tx_status(tid_data->rate_n_flags,
884 info);
885 info->status.status_driver_data[0] =
886 (void *)(uintptr_t)tid_data->reduced_tpc;
887}
888
871int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, 889int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
872 struct iwl_device_cmd *cmd) 890 struct iwl_device_cmd *cmd)
873{ 891{
@@ -954,21 +972,37 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
954 */ 972 */
955 info->flags |= IEEE80211_TX_STAT_ACK; 973 info->flags |= IEEE80211_TX_STAT_ACK;
956 974
957 if (freed == 1) { 975 /* this is the first skb we deliver in this batch */
958 /* this is the first skb we deliver in this batch */ 976 /* put the rate scaling data there */
959 /* put the rate scaling data there */ 977 if (freed == 1)
960 info->flags |= IEEE80211_TX_STAT_AMPDU; 978 iwl_mvm_tx_info_from_ba_notif(info, ba_notif, tid_data);
961 info->status.ampdu_ack_len = ba_notif->txed_2_done;
962 info->status.ampdu_len = ba_notif->txed;
963 iwl_mvm_hwrate_to_tx_status(tid_data->rate_n_flags,
964 info);
965 info->status.status_driver_data[0] =
966 (void *)(uintptr_t)tid_data->reduced_tpc;
967 }
968 } 979 }
969 980
970 spin_unlock_bh(&mvmsta->lock); 981 spin_unlock_bh(&mvmsta->lock);
971 982
983 /* We got a BA notif with 0 acked or scd_ssn didn't progress which is
984 * possible (i.e. first MPDU in the aggregation wasn't acked)
985 * Still it's important to update RS about sent vs. acked.
986 */
987 if (skb_queue_empty(&reclaimed_skbs)) {
988 struct ieee80211_tx_info ba_info = {};
989 struct ieee80211_chanctx_conf *chanctx_conf = NULL;
990
991 if (mvmsta->vif)
992 chanctx_conf =
993 rcu_dereference(mvmsta->vif->chanctx_conf);
994
995 if (WARN_ON_ONCE(!chanctx_conf))
996 goto out;
997
998 ba_info.band = chanctx_conf->def.chan->band;
999 iwl_mvm_tx_info_from_ba_notif(&ba_info, ba_notif, tid_data);
1000
1001 IWL_DEBUG_TX_REPLY(mvm, "No reclaim. Update rs directly\n");
1002 iwl_mvm_rs_tx_status(mvm, sta, tid, &ba_info);
1003 }
1004
1005out:
972 rcu_read_unlock(); 1006 rcu_read_unlock();
973 1007
974 while (!skb_queue_empty(&reclaimed_skbs)) { 1008 while (!skb_queue_empty(&reclaimed_skbs)) {
diff --git a/drivers/net/wireless/iwlwifi/mvm/utils.c b/drivers/net/wireless/iwlwifi/mvm/utils.c
index 1958f298ac8b..8021f6eec27f 100644
--- a/drivers/net/wireless/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/iwlwifi/mvm/utils.c
@@ -530,6 +530,52 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
530 iwl_mvm_dump_umac_error_log(mvm); 530 iwl_mvm_dump_umac_error_log(mvm);
531} 531}
532 532
533void iwl_mvm_enable_txq(struct iwl_mvm *mvm, int queue, u16 ssn,
534 const struct iwl_trans_txq_scd_cfg *cfg)
535{
536 if (iwl_mvm_is_dqa_supported(mvm)) {
537 struct iwl_scd_txq_cfg_cmd cmd = {
538 .scd_queue = queue,
539 .enable = 1,
540 .window = cfg->frame_limit,
541 .sta_id = cfg->sta_id,
542 .ssn = cpu_to_le16(ssn),
543 .tx_fifo = cfg->fifo,
544 .aggregate = cfg->aggregate,
545 .flags = IWL_SCD_FLAGS_DQA_ENABLED,
546 .tid = cfg->tid,
547 .control = IWL_SCD_CONTROL_SET_SSN,
548 };
549 int ret = iwl_mvm_send_cmd_pdu(mvm, SCD_QUEUE_CFG, 0,
550 sizeof(cmd), &cmd);
551 if (ret)
552 IWL_ERR(mvm,
553 "Failed to configure queue %d on FIFO %d\n",
554 queue, cfg->fifo);
555 }
556
557 iwl_trans_txq_enable_cfg(mvm->trans, queue, ssn,
558 iwl_mvm_is_dqa_supported(mvm) ? NULL : cfg);
559}
560
561void iwl_mvm_disable_txq(struct iwl_mvm *mvm, int queue)
562{
563 iwl_trans_txq_disable(mvm->trans, queue,
564 !iwl_mvm_is_dqa_supported(mvm));
565
566 if (iwl_mvm_is_dqa_supported(mvm)) {
567 struct iwl_scd_txq_cfg_cmd cmd = {
568 .scd_queue = queue,
569 .enable = 0,
570 };
571 int ret = iwl_mvm_send_cmd_pdu(mvm, SCD_QUEUE_CFG, CMD_ASYNC,
572 sizeof(cmd), &cmd);
573 if (ret)
574 IWL_ERR(mvm, "Failed to disable queue %d (ret=%d)\n",
575 queue, ret);
576 }
577}
578
533/** 579/**
534 * iwl_mvm_send_lq_cmd() - Send link quality command 580 * iwl_mvm_send_lq_cmd() - Send link quality command
535 * @init: This command is sent as part of station initialization right 581 * @init: This command is sent as part of station initialization right
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c
index ca68c3ccf633..6ced8549eb3a 100644
--- a/drivers/net/wireless/iwlwifi/pcie/drv.c
+++ b/drivers/net/wireless/iwlwifi/pcie/drv.c
@@ -275,6 +275,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
275 {IWL_PCI_DEVICE(0x08B1, 0x4070, iwl7260_2ac_cfg)}, 275 {IWL_PCI_DEVICE(0x08B1, 0x4070, iwl7260_2ac_cfg)},
276 {IWL_PCI_DEVICE(0x08B1, 0x4072, iwl7260_2ac_cfg)}, 276 {IWL_PCI_DEVICE(0x08B1, 0x4072, iwl7260_2ac_cfg)},
277 {IWL_PCI_DEVICE(0x08B1, 0x4170, iwl7260_2ac_cfg)}, 277 {IWL_PCI_DEVICE(0x08B1, 0x4170, iwl7260_2ac_cfg)},
278 {IWL_PCI_DEVICE(0x08B1, 0x4C60, iwl7260_2ac_cfg)},
279 {IWL_PCI_DEVICE(0x08B1, 0x4C70, iwl7260_2ac_cfg)},
278 {IWL_PCI_DEVICE(0x08B1, 0x4060, iwl7260_2n_cfg)}, 280 {IWL_PCI_DEVICE(0x08B1, 0x4060, iwl7260_2n_cfg)},
279 {IWL_PCI_DEVICE(0x08B1, 0x406A, iwl7260_2n_cfg)}, 281 {IWL_PCI_DEVICE(0x08B1, 0x406A, iwl7260_2n_cfg)},
280 {IWL_PCI_DEVICE(0x08B1, 0x4160, iwl7260_2n_cfg)}, 282 {IWL_PCI_DEVICE(0x08B1, 0x4160, iwl7260_2n_cfg)},
@@ -318,6 +320,8 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
318 {IWL_PCI_DEVICE(0x08B1, 0xC770, iwl7260_2ac_cfg)}, 320 {IWL_PCI_DEVICE(0x08B1, 0xC770, iwl7260_2ac_cfg)},
319 {IWL_PCI_DEVICE(0x08B1, 0xC760, iwl7260_2n_cfg)}, 321 {IWL_PCI_DEVICE(0x08B1, 0xC760, iwl7260_2n_cfg)},
320 {IWL_PCI_DEVICE(0x08B2, 0xC270, iwl7260_2ac_cfg)}, 322 {IWL_PCI_DEVICE(0x08B2, 0xC270, iwl7260_2ac_cfg)},
323 {IWL_PCI_DEVICE(0x08B1, 0xCC70, iwl7260_2ac_cfg)},
324 {IWL_PCI_DEVICE(0x08B1, 0xCC60, iwl7260_2ac_cfg)},
321 {IWL_PCI_DEVICE(0x08B2, 0xC272, iwl7260_2ac_cfg)}, 325 {IWL_PCI_DEVICE(0x08B2, 0xC272, iwl7260_2ac_cfg)},
322 {IWL_PCI_DEVICE(0x08B2, 0xC260, iwl7260_2n_cfg)}, 326 {IWL_PCI_DEVICE(0x08B2, 0xC260, iwl7260_2n_cfg)},
323 {IWL_PCI_DEVICE(0x08B2, 0xC26A, iwl7260_n_cfg)}, 327 {IWL_PCI_DEVICE(0x08B2, 0xC26A, iwl7260_n_cfg)},
diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
index ae99240dcde4..1393bac0025c 100644
--- a/drivers/net/wireless/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
@@ -2190,7 +2190,7 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
2190 */ 2190 */
2191 if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000) 2191 if (trans->cfg->device_family == IWL_DEVICE_FAMILY_8000)
2192 trans->hw_rev = (trans->hw_rev & 0xfff0) | 2192 trans->hw_rev = (trans->hw_rev & 0xfff0) |
2193 (CSR_HW_REV_STEP(trans->hw_rev << 2)); 2193 (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2);
2194 2194
2195 trans->hw_id = (pdev->device << 16) + pdev->subsystem_device; 2195 trans->hw_id = (pdev->device << 16) + pdev->subsystem_device;
2196 snprintf(trans->hw_id_str, sizeof(trans->hw_id_str), 2196 snprintf(trans->hw_id_str, sizeof(trans->hw_id_str),
diff --git a/drivers/net/wireless/mwifiex/Kconfig b/drivers/net/wireless/mwifiex/Kconfig
index ecdf34505b54..e70d0df9b0da 100644
--- a/drivers/net/wireless/mwifiex/Kconfig
+++ b/drivers/net/wireless/mwifiex/Kconfig
@@ -9,12 +9,12 @@ config MWIFIEX
9 mwifiex. 9 mwifiex.
10 10
11config MWIFIEX_SDIO 11config MWIFIEX_SDIO
12 tristate "Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8897" 12 tristate "Marvell WiFi-Ex Driver for SD8786/SD8787/SD8797/SD8887/SD8897"
13 depends on MWIFIEX && MMC 13 depends on MWIFIEX && MMC
14 select FW_LOADER 14 select FW_LOADER
15 ---help--- 15 ---help---
16 This adds support for wireless adapters based on Marvell 16 This adds support for wireless adapters based on Marvell
17 8786/8787/8797 chipsets with SDIO interface. 17 8786/8787/8797/8887/8897 chipsets with SDIO interface.
18 18
19 If you choose to build it as a module, it will be called 19 If you choose to build it as a module, it will be called
20 mwifiex_sdio. 20 mwifiex_sdio.
diff --git a/drivers/net/wireless/mwifiex/init.c b/drivers/net/wireless/mwifiex/init.c
index f7c97cf3840b..580aa45ec4bc 100644
--- a/drivers/net/wireless/mwifiex/init.c
+++ b/drivers/net/wireless/mwifiex/init.c
@@ -447,7 +447,6 @@ int mwifiex_init_lock_list(struct mwifiex_adapter *adapter)
447 spin_lock_init(&adapter->cmd_free_q_lock); 447 spin_lock_init(&adapter->cmd_free_q_lock);
448 spin_lock_init(&adapter->cmd_pending_q_lock); 448 spin_lock_init(&adapter->cmd_pending_q_lock);
449 spin_lock_init(&adapter->scan_pending_q_lock); 449 spin_lock_init(&adapter->scan_pending_q_lock);
450 spin_lock_init(&adapter->rx_q_lock);
451 spin_lock_init(&adapter->rx_proc_lock); 450 spin_lock_init(&adapter->rx_proc_lock);
452 451
453 skb_queue_head_init(&adapter->usb_rx_data_q); 452 skb_queue_head_init(&adapter->usb_rx_data_q);
diff --git a/drivers/net/wireless/mwifiex/main.c b/drivers/net/wireless/mwifiex/main.c
index b522f7c36901..d5070c444fe1 100644
--- a/drivers/net/wireless/mwifiex/main.c
+++ b/drivers/net/wireless/mwifiex/main.c
@@ -130,7 +130,6 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
130{ 130{
131 unsigned long flags; 131 unsigned long flags;
132 struct sk_buff *skb; 132 struct sk_buff *skb;
133 bool delay_main_work = adapter->delay_main_work;
134 133
135 spin_lock_irqsave(&adapter->rx_proc_lock, flags); 134 spin_lock_irqsave(&adapter->rx_proc_lock, flags);
136 if (adapter->rx_processing || adapter->rx_locked) { 135 if (adapter->rx_processing || adapter->rx_locked) {
@@ -145,10 +144,9 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
145 while ((skb = skb_dequeue(&adapter->rx_data_q))) { 144 while ((skb = skb_dequeue(&adapter->rx_data_q))) {
146 atomic_dec(&adapter->rx_pending); 145 atomic_dec(&adapter->rx_pending);
147 if (adapter->delay_main_work && 146 if (adapter->delay_main_work &&
148 (atomic_dec_return(&adapter->rx_pending) < 147 (atomic_read(&adapter->rx_pending) < LOW_RX_PENDING)) {
149 LOW_RX_PENDING)) {
150 adapter->delay_main_work = false; 148 adapter->delay_main_work = false;
151 queue_work(adapter->rx_workqueue, &adapter->rx_work); 149 queue_work(adapter->workqueue, &adapter->main_work);
152 } 150 }
153 mwifiex_handle_rx_packet(adapter, skb); 151 mwifiex_handle_rx_packet(adapter, skb);
154 } 152 }
@@ -156,8 +154,6 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
156 adapter->rx_processing = false; 154 adapter->rx_processing = false;
157 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags); 155 spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
158 156
159 if (delay_main_work)
160 queue_work(adapter->workqueue, &adapter->main_work);
161exit_rx_proc: 157exit_rx_proc:
162 return 0; 158 return 0;
163} 159}
@@ -330,7 +326,8 @@ process_start:
330 } while (true); 326 } while (true);
331 327
332 spin_lock_irqsave(&adapter->main_proc_lock, flags); 328 spin_lock_irqsave(&adapter->main_proc_lock, flags);
333 if ((adapter->int_status) || IS_CARD_RX_RCVD(adapter)) { 329 if (!adapter->delay_main_work &&
330 (adapter->int_status || IS_CARD_RX_RCVD(adapter))) {
334 spin_unlock_irqrestore(&adapter->main_proc_lock, flags); 331 spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
335 goto process_start; 332 goto process_start;
336 } 333 }
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h
index 1a999999b391..e2635747d966 100644
--- a/drivers/net/wireless/mwifiex/main.h
+++ b/drivers/net/wireless/mwifiex/main.h
@@ -413,6 +413,7 @@ struct mwifiex_roc_cfg {
413#define FW_DUMP_MAX_NAME_LEN 8 413#define FW_DUMP_MAX_NAME_LEN 8
414#define FW_DUMP_HOST_READY 0xEE 414#define FW_DUMP_HOST_READY 0xEE
415#define FW_DUMP_DONE 0xFF 415#define FW_DUMP_DONE 0xFF
416#define FW_DUMP_READ_DONE 0xFE
416 417
417struct memory_type_mapping { 418struct memory_type_mapping {
418 u8 mem_name[FW_DUMP_MAX_NAME_LEN]; 419 u8 mem_name[FW_DUMP_MAX_NAME_LEN];
@@ -763,8 +764,6 @@ struct mwifiex_adapter {
763 struct list_head scan_pending_q; 764 struct list_head scan_pending_q;
764 /* spin lock for scan_pending_q */ 765 /* spin lock for scan_pending_q */
765 spinlock_t scan_pending_q_lock; 766 spinlock_t scan_pending_q_lock;
766 /* spin lock for RX queue */
767 spinlock_t rx_q_lock;
768 /* spin lock for RX processing routine */ 767 /* spin lock for RX processing routine */
769 spinlock_t rx_proc_lock; 768 spinlock_t rx_proc_lock;
770 struct sk_buff_head usb_rx_data_q; 769 struct sk_buff_head usb_rx_data_q;
diff --git a/drivers/net/wireless/mwifiex/pcie.c b/drivers/net/wireless/mwifiex/pcie.c
index 1504b16e248e..c3a20f94f3c9 100644
--- a/drivers/net/wireless/mwifiex/pcie.c
+++ b/drivers/net/wireless/mwifiex/pcie.c
@@ -42,6 +42,10 @@ static struct memory_type_mapping mem_type_mapping_tbl[] = {
42 {"DTCM", NULL, 0, 0xF1}, 42 {"DTCM", NULL, 0, 0xF1},
43 {"SQRAM", NULL, 0, 0xF2}, 43 {"SQRAM", NULL, 0, 0xF2},
44 {"IRAM", NULL, 0, 0xF3}, 44 {"IRAM", NULL, 0, 0xF3},
45 {"APU", NULL, 0, 0xF4},
46 {"CIU", NULL, 0, 0xF5},
47 {"ICU", NULL, 0, 0xF6},
48 {"MAC", NULL, 0, 0xF7},
45}; 49};
46 50
47static int 51static int
@@ -1233,7 +1237,6 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1233 struct sk_buff *skb_tmp = NULL; 1237 struct sk_buff *skb_tmp = NULL;
1234 struct mwifiex_pcie_buf_desc *desc; 1238 struct mwifiex_pcie_buf_desc *desc;
1235 struct mwifiex_pfu_buf_desc *desc2; 1239 struct mwifiex_pfu_buf_desc *desc2;
1236 unsigned long flags;
1237 1240
1238 if (!mwifiex_pcie_ok_to_access_hw(adapter)) 1241 if (!mwifiex_pcie_ok_to_access_hw(adapter))
1239 mwifiex_pm_wakeup_card(adapter); 1242 mwifiex_pm_wakeup_card(adapter);
@@ -1285,10 +1288,7 @@ static int mwifiex_pcie_process_recv_data(struct mwifiex_adapter *adapter)
1285 card->rxbd_rdptr, wrptr, rx_len); 1288 card->rxbd_rdptr, wrptr, rx_len);
1286 skb_pull(skb_data, INTF_HEADER_LEN); 1289 skb_pull(skb_data, INTF_HEADER_LEN);
1287 if (adapter->rx_work_enabled) { 1290 if (adapter->rx_work_enabled) {
1288 spin_lock_irqsave(&adapter->rx_q_lock, flags);
1289 skb_queue_tail(&adapter->rx_data_q, skb_data); 1291 skb_queue_tail(&adapter->rx_data_q, skb_data);
1290 spin_unlock_irqrestore(&adapter->rx_q_lock,
1291 flags);
1292 adapter->data_received = true; 1292 adapter->data_received = true;
1293 atomic_inc(&adapter->rx_pending); 1293 atomic_inc(&adapter->rx_pending);
1294 } else { 1294 } else {
@@ -2243,8 +2243,8 @@ mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
2243 if (ctrl_data != FW_DUMP_HOST_READY) { 2243 if (ctrl_data != FW_DUMP_HOST_READY) {
2244 dev_info(adapter->dev, 2244 dev_info(adapter->dev,
2245 "The ctrl reg was changed, re-try again!\n"); 2245 "The ctrl reg was changed, re-try again!\n");
2246 mwifiex_write_reg(adapter, reg->fw_dump_ctrl, 2246 ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
2247 FW_DUMP_HOST_READY); 2247 FW_DUMP_HOST_READY);
2248 if (ret) { 2248 if (ret) {
2249 dev_err(adapter->dev, "PCIE write err\n"); 2249 dev_err(adapter->dev, "PCIE write err\n");
2250 return RDWR_STATUS_FAILURE; 2250 return RDWR_STATUS_FAILURE;
@@ -2266,6 +2266,7 @@ static void mwifiex_pcie_fw_dump_work(struct mwifiex_adapter *adapter)
2266 u8 *dbg_ptr, *end_ptr, dump_num, idx, i, read_reg, doneflag = 0; 2266 u8 *dbg_ptr, *end_ptr, dump_num, idx, i, read_reg, doneflag = 0;
2267 enum rdwr_status stat; 2267 enum rdwr_status stat;
2268 u32 memory_size; 2268 u32 memory_size;
2269 int ret;
2269 static char *env[] = { "DRIVER=mwifiex_pcie", "EVENT=fw_dump", NULL }; 2270 static char *env[] = { "DRIVER=mwifiex_pcie", "EVENT=fw_dump", NULL };
2270 2271
2271 if (!card->pcie.supports_fw_dump) 2272 if (!card->pcie.supports_fw_dump)
@@ -2309,6 +2310,12 @@ static void mwifiex_pcie_fw_dump_work(struct mwifiex_adapter *adapter)
2309 2310
2310 if (memory_size == 0) { 2311 if (memory_size == 0) {
2311 dev_info(adapter->dev, "Firmware dump Finished!\n"); 2312 dev_info(adapter->dev, "Firmware dump Finished!\n");
2313 ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
2314 FW_DUMP_READ_DONE);
2315 if (ret) {
2316 dev_err(adapter->dev, "PCIE write err\n");
2317 goto done;
2318 }
2312 break; 2319 break;
2313 } 2320 }
2314 2321
@@ -2337,11 +2344,13 @@ static void mwifiex_pcie_fw_dump_work(struct mwifiex_adapter *adapter)
2337 reg_end = creg->fw_dump_end; 2344 reg_end = creg->fw_dump_end;
2338 for (reg = reg_start; reg <= reg_end; reg++) { 2345 for (reg = reg_start; reg <= reg_end; reg++) {
2339 mwifiex_read_reg_byte(adapter, reg, dbg_ptr); 2346 mwifiex_read_reg_byte(adapter, reg, dbg_ptr);
2340 if (dbg_ptr < end_ptr) 2347 if (dbg_ptr < end_ptr) {
2341 dbg_ptr++; 2348 dbg_ptr++;
2342 else 2349 } else {
2343 dev_err(adapter->dev, 2350 dev_err(adapter->dev,
2344 "Allocated buf not enough\n"); 2351 "Allocated buf not enough\n");
2352 goto done;
2353 }
2345 } 2354 }
2346 2355
2347 if (stat != RDWR_STATUS_DONE) 2356 if (stat != RDWR_STATUS_DONE)
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c
index c09ebeee6ddf..ca64d4c94112 100644
--- a/drivers/net/wireless/mwifiex/scan.c
+++ b/drivers/net/wireless/mwifiex/scan.c
@@ -926,6 +926,23 @@ mwifiex_config_scan(struct mwifiex_private *priv,
926 if ((i && ssid_filter) || 926 if ((i && ssid_filter) ||
927 !is_zero_ether_addr(scan_cfg_out->specific_bssid)) 927 !is_zero_ether_addr(scan_cfg_out->specific_bssid))
928 *filtered_scan = true; 928 *filtered_scan = true;
929
930 if (user_scan_in->scan_chan_gap) {
931 dev_dbg(adapter->dev, "info: scan: channel gap = %d\n",
932 user_scan_in->scan_chan_gap);
933 *max_chan_per_scan =
934 MWIFIEX_MAX_CHANNELS_PER_SPECIFIC_SCAN;
935
936 chan_gap_tlv = (void *)tlv_pos;
937 chan_gap_tlv->header.type =
938 cpu_to_le16(TLV_TYPE_SCAN_CHANNEL_GAP);
939 chan_gap_tlv->header.len =
940 cpu_to_le16(sizeof(chan_gap_tlv->chan_gap));
941 chan_gap_tlv->chan_gap =
942 cpu_to_le16((user_scan_in->scan_chan_gap));
943 tlv_pos +=
944 sizeof(struct mwifiex_ie_types_scan_chan_gap);
945 }
929 } else { 946 } else {
930 scan_cfg_out->bss_mode = (u8) adapter->scan_mode; 947 scan_cfg_out->bss_mode = (u8) adapter->scan_mode;
931 num_probes = adapter->scan_probes; 948 num_probes = adapter->scan_probes;
@@ -940,22 +957,6 @@ mwifiex_config_scan(struct mwifiex_private *priv,
940 else 957 else
941 *max_chan_per_scan = MWIFIEX_DEF_CHANNELS_PER_SCAN_CMD; 958 *max_chan_per_scan = MWIFIEX_DEF_CHANNELS_PER_SCAN_CMD;
942 959
943 if (user_scan_in->scan_chan_gap) {
944 *max_chan_per_scan = MWIFIEX_MAX_CHANNELS_PER_SPECIFIC_SCAN;
945 dev_dbg(adapter->dev, "info: scan: channel gap = %d\n",
946 user_scan_in->scan_chan_gap);
947
948 chan_gap_tlv = (void *)tlv_pos;
949 chan_gap_tlv->header.type =
950 cpu_to_le16(TLV_TYPE_SCAN_CHANNEL_GAP);
951 chan_gap_tlv->header.len =
952 cpu_to_le16(sizeof(chan_gap_tlv->chan_gap));
953 chan_gap_tlv->chan_gap =
954 cpu_to_le16((user_scan_in->scan_chan_gap));
955
956 tlv_pos += sizeof(struct mwifiex_ie_types_scan_chan_gap);
957 }
958
959 /* If the input config or adapter has the number of Probes set, 960 /* If the input config or adapter has the number of Probes set,
960 add tlv */ 961 add tlv */
961 if (num_probes) { 962 if (num_probes) {
diff --git a/drivers/net/wireless/mwifiex/sdio.c b/drivers/net/wireless/mwifiex/sdio.c
index ea8fc587e90f..b25766b43b9f 100644
--- a/drivers/net/wireless/mwifiex/sdio.c
+++ b/drivers/net/wireless/mwifiex/sdio.c
@@ -279,6 +279,8 @@ static int mwifiex_sdio_suspend(struct device *dev)
279#define SDIO_DEVICE_ID_MARVELL_8797 (0x9129) 279#define SDIO_DEVICE_ID_MARVELL_8797 (0x9129)
280/* Device ID for SD8897 */ 280/* Device ID for SD8897 */
281#define SDIO_DEVICE_ID_MARVELL_8897 (0x912d) 281#define SDIO_DEVICE_ID_MARVELL_8897 (0x912d)
282/* Device ID for SD8887 */
283#define SDIO_DEVICE_ID_MARVELL_8887 (0x9135)
282 284
283/* WLAN IDs */ 285/* WLAN IDs */
284static const struct sdio_device_id mwifiex_ids[] = { 286static const struct sdio_device_id mwifiex_ids[] = {
@@ -290,6 +292,8 @@ static const struct sdio_device_id mwifiex_ids[] = {
290 .driver_data = (unsigned long) &mwifiex_sdio_sd8797}, 292 .driver_data = (unsigned long) &mwifiex_sdio_sd8797},
291 {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8897), 293 {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8897),
292 .driver_data = (unsigned long) &mwifiex_sdio_sd8897}, 294 .driver_data = (unsigned long) &mwifiex_sdio_sd8897},
295 {SDIO_DEVICE(SDIO_VENDOR_ID_MARVELL, SDIO_DEVICE_ID_MARVELL_8887),
296 .driver_data = (unsigned long)&mwifiex_sdio_sd8887},
293 {}, 297 {},
294}; 298};
295 299
@@ -448,28 +452,31 @@ static int mwifiex_pm_wakeup_card_complete(struct mwifiex_adapter *adapter)
448static int mwifiex_init_sdio_new_mode(struct mwifiex_adapter *adapter) 452static int mwifiex_init_sdio_new_mode(struct mwifiex_adapter *adapter)
449{ 453{
450 u8 reg; 454 u8 reg;
455 struct sdio_mmc_card *card = adapter->card;
451 456
452 adapter->ioport = MEM_PORT; 457 adapter->ioport = MEM_PORT;
453 458
454 /* enable sdio new mode */ 459 /* enable sdio new mode */
455 if (mwifiex_read_reg(adapter, CARD_CONFIG_2_1_REG, &reg)) 460 if (mwifiex_read_reg(adapter, card->reg->card_cfg_2_1_reg, &reg))
456 return -1; 461 return -1;
457 if (mwifiex_write_reg(adapter, CARD_CONFIG_2_1_REG, 462 if (mwifiex_write_reg(adapter, card->reg->card_cfg_2_1_reg,
458 reg | CMD53_NEW_MODE)) 463 reg | CMD53_NEW_MODE))
459 return -1; 464 return -1;
460 465
461 /* Configure cmd port and enable reading rx length from the register */ 466 /* Configure cmd port and enable reading rx length from the register */
462 if (mwifiex_read_reg(adapter, CMD_CONFIG_0, &reg)) 467 if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_0, &reg))
463 return -1; 468 return -1;
464 if (mwifiex_write_reg(adapter, CMD_CONFIG_0, reg | CMD_PORT_RD_LEN_EN)) 469 if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_0,
470 reg | CMD_PORT_RD_LEN_EN))
465 return -1; 471 return -1;
466 472
467 /* Enable Dnld/Upld ready auto reset for cmd port after cmd53 is 473 /* Enable Dnld/Upld ready auto reset for cmd port after cmd53 is
468 * completed 474 * completed
469 */ 475 */
470 if (mwifiex_read_reg(adapter, CMD_CONFIG_1, &reg)) 476 if (mwifiex_read_reg(adapter, card->reg->cmd_cfg_1, &reg))
471 return -1; 477 return -1;
472 if (mwifiex_write_reg(adapter, CMD_CONFIG_1, reg | CMD_PORT_AUTO_EN)) 478 if (mwifiex_write_reg(adapter, card->reg->cmd_cfg_1,
479 reg | CMD_PORT_AUTO_EN))
473 return -1; 480 return -1;
474 481
475 return 0; 482 return 0;
@@ -496,17 +503,17 @@ static int mwifiex_init_sdio_ioport(struct mwifiex_adapter *adapter)
496 } 503 }
497 504
498 /* Read the IO port */ 505 /* Read the IO port */
499 if (!mwifiex_read_reg(adapter, IO_PORT_0_REG, &reg)) 506 if (!mwifiex_read_reg(adapter, card->reg->io_port_0_reg, &reg))
500 adapter->ioport |= (reg & 0xff); 507 adapter->ioport |= (reg & 0xff);
501 else 508 else
502 return -1; 509 return -1;
503 510
504 if (!mwifiex_read_reg(adapter, IO_PORT_1_REG, &reg)) 511 if (!mwifiex_read_reg(adapter, card->reg->io_port_1_reg, &reg))
505 adapter->ioport |= ((reg & 0xff) << 8); 512 adapter->ioport |= ((reg & 0xff) << 8);
506 else 513 else
507 return -1; 514 return -1;
508 515
509 if (!mwifiex_read_reg(adapter, IO_PORT_2_REG, &reg)) 516 if (!mwifiex_read_reg(adapter, card->reg->io_port_2_reg, &reg))
510 adapter->ioport |= ((reg & 0xff) << 16); 517 adapter->ioport |= ((reg & 0xff) << 16);
511 else 518 else
512 return -1; 519 return -1;
@@ -514,8 +521,8 @@ cont:
514 pr_debug("info: SDIO FUNC1 IO port: %#x\n", adapter->ioport); 521 pr_debug("info: SDIO FUNC1 IO port: %#x\n", adapter->ioport);
515 522
516 /* Set Host interrupt reset to read to clear */ 523 /* Set Host interrupt reset to read to clear */
517 if (!mwifiex_read_reg(adapter, HOST_INT_RSR_REG, &reg)) 524 if (!mwifiex_read_reg(adapter, card->reg->host_int_rsr_reg, &reg))
518 mwifiex_write_reg(adapter, HOST_INT_RSR_REG, 525 mwifiex_write_reg(adapter, card->reg->host_int_rsr_reg,
519 reg | card->reg->sdio_int_mask); 526 reg | card->reg->sdio_int_mask);
520 else 527 else
521 return -1; 528 return -1;
@@ -708,7 +715,7 @@ static void mwifiex_sdio_disable_host_int(struct mwifiex_adapter *adapter)
708 struct sdio_func *func = card->func; 715 struct sdio_func *func = card->func;
709 716
710 sdio_claim_host(func); 717 sdio_claim_host(func);
711 mwifiex_write_reg_locked(func, HOST_INT_MASK_REG, 0); 718 mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg, 0);
712 sdio_release_irq(func); 719 sdio_release_irq(func);
713 sdio_release_host(func); 720 sdio_release_host(func);
714} 721}
@@ -729,7 +736,7 @@ static void mwifiex_interrupt_status(struct mwifiex_adapter *adapter)
729 return; 736 return;
730 } 737 }
731 738
732 sdio_ireg = card->mp_regs[HOST_INTSTATUS_REG]; 739 sdio_ireg = card->mp_regs[card->reg->host_int_status_reg];
733 if (sdio_ireg) { 740 if (sdio_ireg) {
734 /* 741 /*
735 * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS 742 * DN_LD_HOST_INT_STATUS and/or UP_LD_HOST_INT_STATUS
@@ -794,7 +801,7 @@ static int mwifiex_sdio_enable_host_int(struct mwifiex_adapter *adapter)
794 } 801 }
795 802
796 /* Simply write the mask to the register */ 803 /* Simply write the mask to the register */
797 ret = mwifiex_write_reg_locked(func, HOST_INT_MASK_REG, 804 ret = mwifiex_write_reg_locked(func, card->reg->host_int_mask_reg,
798 card->reg->host_int_enable); 805 card->reg->host_int_enable);
799 if (ret) { 806 if (ret) {
800 dev_err(adapter->dev, "enable host interrupt failed\n"); 807 dev_err(adapter->dev, "enable host interrupt failed\n");
@@ -1039,7 +1046,6 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,
1039 struct sk_buff *skb, u32 upld_typ) 1046 struct sk_buff *skb, u32 upld_typ)
1040{ 1047{
1041 u8 *cmd_buf; 1048 u8 *cmd_buf;
1042 unsigned long flags;
1043 __le16 *curr_ptr = (__le16 *)skb->data; 1049 __le16 *curr_ptr = (__le16 *)skb->data;
1044 u16 pkt_len = le16_to_cpu(*curr_ptr); 1050 u16 pkt_len = le16_to_cpu(*curr_ptr);
1045 1051
@@ -1050,9 +1056,7 @@ static int mwifiex_decode_rx_packet(struct mwifiex_adapter *adapter,
1050 case MWIFIEX_TYPE_DATA: 1056 case MWIFIEX_TYPE_DATA:
1051 dev_dbg(adapter->dev, "info: --- Rx: Data packet ---\n"); 1057 dev_dbg(adapter->dev, "info: --- Rx: Data packet ---\n");
1052 if (adapter->rx_work_enabled) { 1058 if (adapter->rx_work_enabled) {
1053 spin_lock_irqsave(&adapter->rx_q_lock, flags);
1054 skb_queue_tail(&adapter->rx_data_q, skb); 1059 skb_queue_tail(&adapter->rx_data_q, skb);
1055 spin_unlock_irqrestore(&adapter->rx_q_lock, flags);
1056 adapter->data_received = true; 1060 adapter->data_received = true;
1057 atomic_inc(&adapter->rx_pending); 1061 atomic_inc(&adapter->rx_pending);
1058 } else { 1062 } else {
@@ -1337,8 +1341,8 @@ static int mwifiex_process_int_status(struct mwifiex_adapter *adapter)
1337 u32 pkt_type; 1341 u32 pkt_type;
1338 1342
1339 /* read the len of control packet */ 1343 /* read the len of control packet */
1340 rx_len = card->mp_regs[CMD_RD_LEN_1] << 8; 1344 rx_len = card->mp_regs[reg->cmd_rd_len_1] << 8;
1341 rx_len |= (u16) card->mp_regs[CMD_RD_LEN_0]; 1345 rx_len |= (u16)card->mp_regs[reg->cmd_rd_len_0];
1342 rx_blocks = DIV_ROUND_UP(rx_len, MWIFIEX_SDIO_BLOCK_SIZE); 1346 rx_blocks = DIV_ROUND_UP(rx_len, MWIFIEX_SDIO_BLOCK_SIZE);
1343 if (rx_len <= INTF_HEADER_LEN || 1347 if (rx_len <= INTF_HEADER_LEN ||
1344 (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) > 1348 (rx_blocks * MWIFIEX_SDIO_BLOCK_SIZE) >
@@ -1826,11 +1830,11 @@ static int mwifiex_init_sdio(struct mwifiex_adapter *adapter)
1826 sdio_set_drvdata(card->func, card); 1830 sdio_set_drvdata(card->func, card);
1827 1831
1828 /* 1832 /*
1829 * Read the HOST_INT_STATUS_REG for ACK the first interrupt got 1833 * Read the host_int_status_reg for ACK the first interrupt got
1830 * from the bootloader. If we don't do this we get a interrupt 1834 * from the bootloader. If we don't do this we get a interrupt
1831 * as soon as we register the irq. 1835 * as soon as we register the irq.
1832 */ 1836 */
1833 mwifiex_read_reg(adapter, HOST_INTSTATUS_REG, &sdio_ireg); 1837 mwifiex_read_reg(adapter, card->reg->host_int_status_reg, &sdio_ireg);
1834 1838
1835 /* Get SDIO ioport */ 1839 /* Get SDIO ioport */
1836 mwifiex_init_sdio_ioport(adapter); 1840 mwifiex_init_sdio_ioport(adapter);
@@ -2233,3 +2237,4 @@ MODULE_FIRMWARE(SD8786_DEFAULT_FW_NAME);
2233MODULE_FIRMWARE(SD8787_DEFAULT_FW_NAME); 2237MODULE_FIRMWARE(SD8787_DEFAULT_FW_NAME);
2234MODULE_FIRMWARE(SD8797_DEFAULT_FW_NAME); 2238MODULE_FIRMWARE(SD8797_DEFAULT_FW_NAME);
2235MODULE_FIRMWARE(SD8897_DEFAULT_FW_NAME); 2239MODULE_FIRMWARE(SD8897_DEFAULT_FW_NAME);
2240MODULE_FIRMWARE(SD8887_DEFAULT_FW_NAME);
diff --git a/drivers/net/wireless/mwifiex/sdio.h b/drivers/net/wireless/mwifiex/sdio.h
index 6b8835ec88f1..20cd9adc98d3 100644
--- a/drivers/net/wireless/mwifiex/sdio.h
+++ b/drivers/net/wireless/mwifiex/sdio.h
@@ -33,6 +33,7 @@
33#define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin" 33#define SD8787_DEFAULT_FW_NAME "mrvl/sd8787_uapsta.bin"
34#define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin" 34#define SD8797_DEFAULT_FW_NAME "mrvl/sd8797_uapsta.bin"
35#define SD8897_DEFAULT_FW_NAME "mrvl/sd8897_uapsta.bin" 35#define SD8897_DEFAULT_FW_NAME "mrvl/sd8897_uapsta.bin"
36#define SD8887_DEFAULT_FW_NAME "mrvl/sd8887_uapsta.bin"
36 37
37#define BLOCK_MODE 1 38#define BLOCK_MODE 1
38#define BYTE_MODE 0 39#define BYTE_MODE 0
@@ -52,13 +53,9 @@
52#define HOST_TERM_CMD53 (0x1U << 2) 53#define HOST_TERM_CMD53 (0x1U << 2)
53#define REG_PORT 0 54#define REG_PORT 0
54#define MEM_PORT 0x10000 55#define MEM_PORT 0x10000
55#define CMD_RD_LEN_0 0xB4 56
56#define CMD_RD_LEN_1 0xB5
57#define CARD_CONFIG_2_1_REG 0xCD
58#define CMD53_NEW_MODE (0x1U << 0) 57#define CMD53_NEW_MODE (0x1U << 0)
59#define CMD_CONFIG_0 0xB8
60#define CMD_PORT_RD_LEN_EN (0x1U << 2) 58#define CMD_PORT_RD_LEN_EN (0x1U << 2)
61#define CMD_CONFIG_1 0xB9
62#define CMD_PORT_AUTO_EN (0x1U << 0) 59#define CMD_PORT_AUTO_EN (0x1U << 0)
63#define CMD_PORT_SLCT 0x8000 60#define CMD_PORT_SLCT 0x8000
64#define UP_LD_CMD_PORT_HOST_INT_STATUS (0x40U) 61#define UP_LD_CMD_PORT_HOST_INT_STATUS (0x40U)
@@ -70,38 +67,23 @@
70/* Misc. Config Register : Auto Re-enable interrupts */ 67/* Misc. Config Register : Auto Re-enable interrupts */
71#define AUTO_RE_ENABLE_INT BIT(4) 68#define AUTO_RE_ENABLE_INT BIT(4)
72 69
73/* Host Control Registers */
74/* Host Control Registers : I/O port 0 */
75#define IO_PORT_0_REG 0x78
76/* Host Control Registers : I/O port 1 */
77#define IO_PORT_1_REG 0x79
78/* Host Control Registers : I/O port 2 */
79#define IO_PORT_2_REG 0x7A
80
81/* Host Control Registers : Configuration */ 70/* Host Control Registers : Configuration */
82#define CONFIGURATION_REG 0x00 71#define CONFIGURATION_REG 0x00
83/* Host Control Registers : Host power up */ 72/* Host Control Registers : Host power up */
84#define HOST_POWER_UP (0x1U << 1) 73#define HOST_POWER_UP (0x1U << 1)
85 74
86/* Host Control Registers : Host interrupt mask */
87#define HOST_INT_MASK_REG 0x02
88/* Host Control Registers : Upload host interrupt mask */ 75/* Host Control Registers : Upload host interrupt mask */
89#define UP_LD_HOST_INT_MASK (0x1U) 76#define UP_LD_HOST_INT_MASK (0x1U)
90/* Host Control Registers : Download host interrupt mask */ 77/* Host Control Registers : Download host interrupt mask */
91#define DN_LD_HOST_INT_MASK (0x2U) 78#define DN_LD_HOST_INT_MASK (0x2U)
92 79
93/* Host Control Registers : Host interrupt status */
94#define HOST_INTSTATUS_REG 0x03
95/* Host Control Registers : Upload host interrupt status */ 80/* Host Control Registers : Upload host interrupt status */
96#define UP_LD_HOST_INT_STATUS (0x1U) 81#define UP_LD_HOST_INT_STATUS (0x1U)
97/* Host Control Registers : Download host interrupt status */ 82/* Host Control Registers : Download host interrupt status */
98#define DN_LD_HOST_INT_STATUS (0x2U) 83#define DN_LD_HOST_INT_STATUS (0x2U)
99 84
100/* Host Control Registers : Host interrupt RSR */
101#define HOST_INT_RSR_REG 0x01
102
103/* Host Control Registers : Host interrupt status */ 85/* Host Control Registers : Host interrupt status */
104#define HOST_INT_STATUS_REG 0x28 86#define CARD_INT_STATUS_REG 0x28
105 87
106/* Card Control Registers : Card I/O ready */ 88/* Card Control Registers : Card I/O ready */
107#define CARD_IO_READY (0x1U << 3) 89#define CARD_IO_READY (0x1U << 3)
@@ -203,10 +185,16 @@ struct mwifiex_sdio_card_reg {
203 u8 base_1_reg; 185 u8 base_1_reg;
204 u8 poll_reg; 186 u8 poll_reg;
205 u8 host_int_enable; 187 u8 host_int_enable;
188 u8 host_int_rsr_reg;
189 u8 host_int_status_reg;
190 u8 host_int_mask_reg;
206 u8 status_reg_0; 191 u8 status_reg_0;
207 u8 status_reg_1; 192 u8 status_reg_1;
208 u8 sdio_int_mask; 193 u8 sdio_int_mask;
209 u32 data_port_mask; 194 u32 data_port_mask;
195 u8 io_port_0_reg;
196 u8 io_port_1_reg;
197 u8 io_port_2_reg;
210 u8 max_mp_regs; 198 u8 max_mp_regs;
211 u8 rd_bitmap_l; 199 u8 rd_bitmap_l;
212 u8 rd_bitmap_u; 200 u8 rd_bitmap_u;
@@ -219,6 +207,15 @@ struct mwifiex_sdio_card_reg {
219 u8 rd_len_p0_l; 207 u8 rd_len_p0_l;
220 u8 rd_len_p0_u; 208 u8 rd_len_p0_u;
221 u8 card_misc_cfg_reg; 209 u8 card_misc_cfg_reg;
210 u8 card_cfg_2_1_reg;
211 u8 cmd_rd_len_0;
212 u8 cmd_rd_len_1;
213 u8 cmd_rd_len_2;
214 u8 cmd_rd_len_3;
215 u8 cmd_cfg_0;
216 u8 cmd_cfg_1;
217 u8 cmd_cfg_2;
218 u8 cmd_cfg_3;
222 u8 fw_dump_ctrl; 219 u8 fw_dump_ctrl;
223 u8 fw_dump_start; 220 u8 fw_dump_start;
224 u8 fw_dump_end; 221 u8 fw_dump_end;
@@ -274,10 +271,16 @@ static const struct mwifiex_sdio_card_reg mwifiex_reg_sd87xx = {
274 .base_1_reg = 0x0041, 271 .base_1_reg = 0x0041,
275 .poll_reg = 0x30, 272 .poll_reg = 0x30,
276 .host_int_enable = UP_LD_HOST_INT_MASK | DN_LD_HOST_INT_MASK, 273 .host_int_enable = UP_LD_HOST_INT_MASK | DN_LD_HOST_INT_MASK,
274 .host_int_rsr_reg = 0x1,
275 .host_int_mask_reg = 0x02,
276 .host_int_status_reg = 0x03,
277 .status_reg_0 = 0x60, 277 .status_reg_0 = 0x60,
278 .status_reg_1 = 0x61, 278 .status_reg_1 = 0x61,
279 .sdio_int_mask = 0x3f, 279 .sdio_int_mask = 0x3f,
280 .data_port_mask = 0x0000fffe, 280 .data_port_mask = 0x0000fffe,
281 .io_port_0_reg = 0x78,
282 .io_port_1_reg = 0x79,
283 .io_port_2_reg = 0x7A,
281 .max_mp_regs = 64, 284 .max_mp_regs = 64,
282 .rd_bitmap_l = 0x04, 285 .rd_bitmap_l = 0x04,
283 .rd_bitmap_u = 0x05, 286 .rd_bitmap_u = 0x05,
@@ -296,10 +299,16 @@ static const struct mwifiex_sdio_card_reg mwifiex_reg_sd8897 = {
296 .poll_reg = 0x50, 299 .poll_reg = 0x50,
297 .host_int_enable = UP_LD_HOST_INT_MASK | DN_LD_HOST_INT_MASK | 300 .host_int_enable = UP_LD_HOST_INT_MASK | DN_LD_HOST_INT_MASK |
298 CMD_PORT_UPLD_INT_MASK | CMD_PORT_DNLD_INT_MASK, 301 CMD_PORT_UPLD_INT_MASK | CMD_PORT_DNLD_INT_MASK,
302 .host_int_rsr_reg = 0x1,
303 .host_int_status_reg = 0x03,
304 .host_int_mask_reg = 0x02,
299 .status_reg_0 = 0xc0, 305 .status_reg_0 = 0xc0,
300 .status_reg_1 = 0xc1, 306 .status_reg_1 = 0xc1,
301 .sdio_int_mask = 0xff, 307 .sdio_int_mask = 0xff,
302 .data_port_mask = 0xffffffff, 308 .data_port_mask = 0xffffffff,
309 .io_port_0_reg = 0xD8,
310 .io_port_1_reg = 0xD9,
311 .io_port_2_reg = 0xDA,
303 .max_mp_regs = 184, 312 .max_mp_regs = 184,
304 .rd_bitmap_l = 0x04, 313 .rd_bitmap_l = 0x04,
305 .rd_bitmap_u = 0x05, 314 .rd_bitmap_u = 0x05,
@@ -312,11 +321,61 @@ static const struct mwifiex_sdio_card_reg mwifiex_reg_sd8897 = {
312 .rd_len_p0_l = 0x0c, 321 .rd_len_p0_l = 0x0c,
313 .rd_len_p0_u = 0x0d, 322 .rd_len_p0_u = 0x0d,
314 .card_misc_cfg_reg = 0xcc, 323 .card_misc_cfg_reg = 0xcc,
324 .card_cfg_2_1_reg = 0xcd,
325 .cmd_rd_len_0 = 0xb4,
326 .cmd_rd_len_1 = 0xb5,
327 .cmd_rd_len_2 = 0xb6,
328 .cmd_rd_len_3 = 0xb7,
329 .cmd_cfg_0 = 0xb8,
330 .cmd_cfg_1 = 0xb9,
331 .cmd_cfg_2 = 0xba,
332 .cmd_cfg_3 = 0xbb,
315 .fw_dump_ctrl = 0xe2, 333 .fw_dump_ctrl = 0xe2,
316 .fw_dump_start = 0xe3, 334 .fw_dump_start = 0xe3,
317 .fw_dump_end = 0xea, 335 .fw_dump_end = 0xea,
318}; 336};
319 337
338static const struct mwifiex_sdio_card_reg mwifiex_reg_sd8887 = {
339 .start_rd_port = 0,
340 .start_wr_port = 0,
341 .base_0_reg = 0x6C,
342 .base_1_reg = 0x6D,
343 .poll_reg = 0x5C,
344 .host_int_enable = UP_LD_HOST_INT_MASK | DN_LD_HOST_INT_MASK |
345 CMD_PORT_UPLD_INT_MASK | CMD_PORT_DNLD_INT_MASK,
346 .host_int_rsr_reg = 0x4,
347 .host_int_status_reg = 0x0C,
348 .host_int_mask_reg = 0x08,
349 .status_reg_0 = 0x90,
350 .status_reg_1 = 0x91,
351 .sdio_int_mask = 0xff,
352 .data_port_mask = 0xffffffff,
353 .io_port_0_reg = 0xE4,
354 .io_port_1_reg = 0xE5,
355 .io_port_2_reg = 0xE6,
356 .max_mp_regs = 196,
357 .rd_bitmap_l = 0x10,
358 .rd_bitmap_u = 0x11,
359 .rd_bitmap_1l = 0x12,
360 .rd_bitmap_1u = 0x13,
361 .wr_bitmap_l = 0x14,
362 .wr_bitmap_u = 0x15,
363 .wr_bitmap_1l = 0x16,
364 .wr_bitmap_1u = 0x17,
365 .rd_len_p0_l = 0x18,
366 .rd_len_p0_u = 0x19,
367 .card_misc_cfg_reg = 0xd8,
368 .card_cfg_2_1_reg = 0xd9,
369 .cmd_rd_len_0 = 0xc0,
370 .cmd_rd_len_1 = 0xc1,
371 .cmd_rd_len_2 = 0xc2,
372 .cmd_rd_len_3 = 0xc3,
373 .cmd_cfg_0 = 0xc4,
374 .cmd_cfg_1 = 0xc5,
375 .cmd_cfg_2 = 0xc6,
376 .cmd_cfg_3 = 0xc7,
377};
378
320static const struct mwifiex_sdio_device mwifiex_sdio_sd8786 = { 379static const struct mwifiex_sdio_device mwifiex_sdio_sd8786 = {
321 .firmware = SD8786_DEFAULT_FW_NAME, 380 .firmware = SD8786_DEFAULT_FW_NAME,
322 .reg = &mwifiex_reg_sd87xx, 381 .reg = &mwifiex_reg_sd87xx,
@@ -369,6 +428,19 @@ static const struct mwifiex_sdio_device mwifiex_sdio_sd8897 = {
369 .supports_fw_dump = true, 428 .supports_fw_dump = true,
370}; 429};
371 430
431static const struct mwifiex_sdio_device mwifiex_sdio_sd8887 = {
432 .firmware = SD8887_DEFAULT_FW_NAME,
433 .reg = &mwifiex_reg_sd8887,
434 .max_ports = 32,
435 .mp_agg_pkt_limit = 16,
436 .supports_sdio_new_mode = true,
437 .has_control_mask = false,
438 .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
439 .mp_tx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K,
440 .mp_rx_agg_buf_size = MWIFIEX_MP_AGGR_BUF_SIZE_32K,
441 .supports_fw_dump = false,
442};
443
372/* 444/*
373 * .cmdrsp_complete handler 445 * .cmdrsp_complete handler
374 */ 446 */
diff --git a/drivers/net/wireless/mwifiex/sta_cmd.c b/drivers/net/wireless/mwifiex/sta_cmd.c
index 225f7498048b..1c2ca291d1f5 100644
--- a/drivers/net/wireless/mwifiex/sta_cmd.c
+++ b/drivers/net/wireless/mwifiex/sta_cmd.c
@@ -938,7 +938,7 @@ mwifiex_cmd_802_11_key_material_v1(struct mwifiex_private *priv,
938 cmd->size = cpu_to_le16(sizeof(key_material->action) + S_DS_GEN 938 cmd->size = cpu_to_le16(sizeof(key_material->action) + S_DS_GEN
939 + key_param_len); 939 + key_param_len);
940 940
941 if (priv->bss_type == MWIFIEX_BSS_TYPE_UAP) { 941 if (GET_BSS_ROLE(priv) == MWIFIEX_BSS_ROLE_UAP) {
942 tlv_mac = (void *)((u8 *)&key_material->key_param_set + 942 tlv_mac = (void *)((u8 *)&key_material->key_param_set +
943 key_param_len); 943 key_param_len);
944 tlv_mac->header.type = 944 tlv_mac->header.type =
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index b7434df51e7c..ebd5625d13f1 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -2041,7 +2041,7 @@ struct mac_iveiv_entry {
2041 * 2 - drop tx power by 12dBm, 2041 * 2 - drop tx power by 12dBm,
2042 * 3 - increase tx power by 6dBm 2042 * 3 - increase tx power by 6dBm
2043 */ 2043 */
2044#define BBP1_TX_POWER_CTRL FIELD8(0x07) 2044#define BBP1_TX_POWER_CTRL FIELD8(0x03)
2045#define BBP1_TX_ANTENNA FIELD8(0x18) 2045#define BBP1_TX_ANTENNA FIELD8(0x18)
2046 2046
2047/* 2047/*
diff --git a/drivers/net/wireless/rtl818x/rtl8180/dev.c b/drivers/net/wireless/rtl818x/rtl8180/dev.c
index 026d912f516b..ded967aa6ecb 100644
--- a/drivers/net/wireless/rtl818x/rtl8180/dev.c
+++ b/drivers/net/wireless/rtl818x/rtl8180/dev.c
@@ -189,6 +189,9 @@ static const int rtl8187se_queues_map[RTL8187SE_NR_TX_QUEUES] = {5, 4, 3, 2, 7};
189 189
190static const int rtl8180_queues_map[RTL8180_NR_TX_QUEUES] = {4, 7}; 190static const int rtl8180_queues_map[RTL8180_NR_TX_QUEUES] = {4, 7};
191 191
192/* LNA gain table for rtl8187se */
193static const u8 rtl8187se_lna_gain[4] = {02, 17, 29, 39};
194
192void rtl8180_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data) 195void rtl8180_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data)
193{ 196{
194 struct rtl8180_priv *priv = dev->priv; 197 struct rtl8180_priv *priv = dev->priv;
@@ -210,13 +213,14 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
210 struct rtl8180_priv *priv = dev->priv; 213 struct rtl8180_priv *priv = dev->priv;
211 struct rtl818x_rx_cmd_desc *cmd_desc; 214 struct rtl818x_rx_cmd_desc *cmd_desc;
212 unsigned int count = 32; 215 unsigned int count = 32;
213 u8 agc, sq, signal = 1; 216 u8 agc, sq;
217 s8 signal = 1;
214 dma_addr_t mapping; 218 dma_addr_t mapping;
215 219
216 while (count--) { 220 while (count--) {
217 void *entry = priv->rx_ring + priv->rx_idx * priv->rx_ring_sz; 221 void *entry = priv->rx_ring + priv->rx_idx * priv->rx_ring_sz;
218 struct sk_buff *skb = priv->rx_buf[priv->rx_idx]; 222 struct sk_buff *skb = priv->rx_buf[priv->rx_idx];
219 u32 flags, flags2; 223 u32 flags, flags2, flags3 = 0;
220 u64 tsft; 224 u64 tsft;
221 225
222 if (priv->chip_family == RTL818X_CHIP_FAMILY_RTL8187SE) { 226 if (priv->chip_family == RTL818X_CHIP_FAMILY_RTL8187SE) {
@@ -229,6 +233,7 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
229 * the ownership flag 233 * the ownership flag
230 */ 234 */
231 rmb(); 235 rmb();
236 flags3 = le32_to_cpu(desc->flags3);
232 flags2 = le32_to_cpu(desc->flags2); 237 flags2 = le32_to_cpu(desc->flags2);
233 tsft = le64_to_cpu(desc->tsft); 238 tsft = le64_to_cpu(desc->tsft);
234 } else { 239 } else {
@@ -287,8 +292,21 @@ static void rtl8180_handle_rx(struct ieee80211_hw *dev)
287 signal = priv->rf->calc_rssi(agc, sq); 292 signal = priv->rf->calc_rssi(agc, sq);
288 break; 293 break;
289 case RTL818X_CHIP_FAMILY_RTL8187SE: 294 case RTL818X_CHIP_FAMILY_RTL8187SE:
290 /* TODO: rtl8187se rssi */ 295 /* OFDM measure reported by HW is signed,
291 signal = 10; 296 * in 0.5dBm unit, with zero centered @ -41dBm
297 * input signal.
298 */
299 if (rx_status.rate_idx > 3) {
300 signal = (s8)((flags3 >> 16) & 0xff);
301 signal = signal / 2 - 41;
302 } else {
303 int idx, bb;
304
305 idx = (agc & 0x60) >> 5;
306 bb = (agc & 0x1F) * 2;
307 /* bias + BB gain + LNA gain */
308 signal = 4 - bb - rtl8187se_lna_gain[idx];
309 }
292 break; 310 break;
293 } 311 }
294 rx_status.signal = signal; 312 rx_status.signal = signal;
@@ -1835,7 +1853,7 @@ static int rtl8180_probe(struct pci_dev *pdev,
1835 pci_try_set_mwi(pdev); 1853 pci_try_set_mwi(pdev);
1836 } 1854 }
1837 1855
1838 if (priv->chip_family == RTL818X_CHIP_FAMILY_RTL8185) 1856 if (priv->chip_family != RTL818X_CHIP_FAMILY_RTL8180)
1839 dev->flags |= IEEE80211_HW_SIGNAL_DBM; 1857 dev->flags |= IEEE80211_HW_SIGNAL_DBM;
1840 else 1858 else
1841 dev->flags |= IEEE80211_HW_SIGNAL_UNSPEC; 1859 dev->flags |= IEEE80211_HW_SIGNAL_UNSPEC;
diff --git a/drivers/net/wireless/rtlwifi/Kconfig b/drivers/net/wireless/rtlwifi/Kconfig
index bf3cf124e4ea..5cf509d346e8 100644
--- a/drivers/net/wireless/rtlwifi/Kconfig
+++ b/drivers/net/wireless/rtlwifi/Kconfig
@@ -5,7 +5,8 @@ menuconfig RTL_CARDS
5 ---help--- 5 ---help---
6 This option will enable support for the Realtek mac80211-based 6 This option will enable support for the Realtek mac80211-based
7 wireless drivers. Drivers rtl8192ce, rtl8192cu, rtl8192se, rtl8192de, 7 wireless drivers. Drivers rtl8192ce, rtl8192cu, rtl8192se, rtl8192de,
8 rtl8723ae, rtl8723be, and rtl8188ae share some common code. 8 rtl8723ae, rtl8723be, rtl8188ee, rtl8192ee, and rtl8821ae share
9 some common code.
9 10
10if RTL_CARDS 11if RTL_CARDS
11 12
@@ -80,6 +81,30 @@ config RTL8188EE
80 81
81 If you choose to build it as a module, it will be called rtl8188ee 82 If you choose to build it as a module, it will be called rtl8188ee
82 83
84config RTL8192EE
85 tristate "Realtek RTL8192EE Wireless Network Adapter"
86 depends on PCI
87 select RTLWIFI
88 select RTLWIFI_PCI
89 select RTLBTCOEXIST
90 ---help---
91 This is the driver for Realtek RTL8192EE 802.11n PCIe
92 wireless network adapters.
93
94 If you choose to build it as a module, it will be called rtl8192ee
95
96config RTL8821AE
97 tristate "Realtek RTL8821AE/RTL8812AE Wireless Network Adapter"
98 depends on PCI
99 select RTLWIFI
100 select RTLWIFI_PCI
101 select RTLBTCOEXIST
102 ---help---
103 This is the driver for Realtek RTL8i821AE/RTL8812AE 802.11av PCIe
104 wireless network adapters.
105
106 If you choose to build it as a module, it will be called rtl8821ae
107
83config RTL8192CU 108config RTL8192CU
84 tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter" 109 tristate "Realtek RTL8192CU/RTL8188CU USB Wireless Network Adapter"
85 depends on USB 110 depends on USB
@@ -123,7 +148,7 @@ config RTL8723_COMMON
123 148
124config RTLBTCOEXIST 149config RTLBTCOEXIST
125 tristate 150 tristate
126 depends on RTL8723AE || RTL8723BE 151 depends on RTL8723AE || RTL8723BE || RTL8821AE || RTL8192EE
127 default y 152 default y
128 153
129endif 154endif
diff --git a/drivers/net/wireless/rtlwifi/Makefile b/drivers/net/wireless/rtlwifi/Makefile
index bba36a06abcc..ad6d3c52ec57 100644
--- a/drivers/net/wireless/rtlwifi/Makefile
+++ b/drivers/net/wireless/rtlwifi/Makefile
@@ -28,5 +28,7 @@ obj-$(CONFIG_RTL8723BE) += rtl8723be/
28obj-$(CONFIG_RTL8188EE) += rtl8188ee/ 28obj-$(CONFIG_RTL8188EE) += rtl8188ee/
29obj-$(CONFIG_RTLBTCOEXIST) += btcoexist/ 29obj-$(CONFIG_RTLBTCOEXIST) += btcoexist/
30obj-$(CONFIG_RTL8723_COMMON) += rtl8723com/ 30obj-$(CONFIG_RTL8723_COMMON) += rtl8723com/
31obj-$(CONFIG_RTL8821AE) += rtl8821ae/
32obj-$(CONFIG_RTL8192EE) += rtl8192ee/
31 33
32ccflags-y += -D__CHECK_ENDIAN__ 34ccflags-y += -D__CHECK_ENDIAN__
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c
index 93bb384eb001..58ba71830886 100644
--- a/drivers/net/wireless/rtlwifi/base.c
+++ b/drivers/net/wireless/rtlwifi/base.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -34,7 +30,7 @@
34#include "cam.h" 30#include "cam.h"
35#include "ps.h" 31#include "ps.h"
36#include "regd.h" 32#include "regd.h"
37 33#include "pci.h"
38#include <linux/ip.h> 34#include <linux/ip.h>
39#include <linux/module.h> 35#include <linux/module.h>
40#include <linux/udp.h> 36#include <linux/udp.h>
@@ -211,7 +207,6 @@ static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
211 *highest supported RX rate 207 *highest supported RX rate
212 */ 208 */
213 if (rtlpriv->dm.supp_phymode_switch) { 209 if (rtlpriv->dm.supp_phymode_switch) {
214
215 RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, 210 RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG,
216 "Support phy mode switch\n"); 211 "Support phy mode switch\n");
217 212
@@ -244,6 +239,83 @@ static void _rtl_init_hw_ht_capab(struct ieee80211_hw *hw,
244 } 239 }
245} 240}
246 241
242static void _rtl_init_hw_vht_capab(struct ieee80211_hw *hw,
243 struct ieee80211_sta_vht_cap *vht_cap)
244{
245 struct rtl_priv *rtlpriv = rtl_priv(hw);
246 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
247
248 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
249 u16 mcs_map;
250
251 vht_cap->vht_supported = true;
252 vht_cap->cap =
253 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 |
254 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 |
255 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
256 IEEE80211_VHT_CAP_SHORT_GI_80 |
257 IEEE80211_VHT_CAP_TXSTBC |
258 IEEE80211_VHT_CAP_RXSTBC_1 |
259 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
260 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
261 IEEE80211_VHT_CAP_HTC_VHT |
262 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |
263 IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN |
264 IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN |
265 0;
266
267 mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
268 IEEE80211_VHT_MCS_SUPPORT_0_9 << 2 |
269 IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
270 IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
271 IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
272 IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
273 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
274 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
275
276 vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
277 vht_cap->vht_mcs.rx_highest =
278 cpu_to_le16(MAX_BIT_RATE_SHORT_GI_2NSS_80MHZ_MCS9);
279 vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
280 vht_cap->vht_mcs.tx_highest =
281 cpu_to_le16(MAX_BIT_RATE_SHORT_GI_2NSS_80MHZ_MCS9);
282 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
283 u16 mcs_map;
284
285 vht_cap->vht_supported = true;
286 vht_cap->cap =
287 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_3895 |
288 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991 |
289 IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_11454 |
290 IEEE80211_VHT_CAP_SHORT_GI_80 |
291 IEEE80211_VHT_CAP_TXSTBC |
292 IEEE80211_VHT_CAP_RXSTBC_1 |
293 IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE |
294 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
295 IEEE80211_VHT_CAP_HTC_VHT |
296 IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK |
297 IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN |
298 IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN |
299 0;
300
301 mcs_map = IEEE80211_VHT_MCS_SUPPORT_0_9 << 0 |
302 IEEE80211_VHT_MCS_NOT_SUPPORTED << 2 |
303 IEEE80211_VHT_MCS_NOT_SUPPORTED << 4 |
304 IEEE80211_VHT_MCS_NOT_SUPPORTED << 6 |
305 IEEE80211_VHT_MCS_NOT_SUPPORTED << 8 |
306 IEEE80211_VHT_MCS_NOT_SUPPORTED << 10 |
307 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
308 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14;
309
310 vht_cap->vht_mcs.rx_mcs_map = cpu_to_le16(mcs_map);
311 vht_cap->vht_mcs.rx_highest =
312 cpu_to_le16(MAX_BIT_RATE_SHORT_GI_1NSS_80MHZ_MCS9);
313 vht_cap->vht_mcs.tx_mcs_map = cpu_to_le16(mcs_map);
314 vht_cap->vht_mcs.tx_highest =
315 cpu_to_le16(MAX_BIT_RATE_SHORT_GI_1NSS_80MHZ_MCS9);
316 }
317}
318
247static void _rtl_init_mac80211(struct ieee80211_hw *hw) 319static void _rtl_init_mac80211(struct ieee80211_hw *hw)
248{ 320{
249 struct rtl_priv *rtlpriv = rtl_priv(hw); 321 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -252,9 +324,8 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
252 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 324 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
253 struct ieee80211_supported_band *sband; 325 struct ieee80211_supported_band *sband;
254 326
255 327 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
256 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY && rtlhal->bandset == 328 rtlhal->bandset == BAND_ON_BOTH) {
257 BAND_ON_BOTH) {
258 /* 1: 2.4 G bands */ 329 /* 1: 2.4 G bands */
259 /* <1> use mac->bands as mem for hw->wiphy->bands */ 330 /* <1> use mac->bands as mem for hw->wiphy->bands */
260 sband = &(rtlmac->bands[IEEE80211_BAND_2GHZ]); 331 sband = &(rtlmac->bands[IEEE80211_BAND_2GHZ]);
@@ -282,6 +353,7 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
282 /* <3> init ht cap base on ant_num */ 353 /* <3> init ht cap base on ant_num */
283 _rtl_init_hw_ht_capab(hw, &sband->ht_cap); 354 _rtl_init_hw_ht_capab(hw, &sband->ht_cap);
284 355
356 _rtl_init_hw_vht_capab(hw, &sband->vht_cap);
285 /* <4> set mac->sband to wiphy->sband */ 357 /* <4> set mac->sband to wiphy->sband */
286 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband; 358 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband;
287 } else { 359 } else {
@@ -292,8 +364,8 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
292 /* <2> set hw->wiphy->bands[IEEE80211_BAND_2GHZ] 364 /* <2> set hw->wiphy->bands[IEEE80211_BAND_2GHZ]
293 * to default value(1T1R) */ 365 * to default value(1T1R) */
294 memcpy(&(rtlmac->bands[IEEE80211_BAND_2GHZ]), 366 memcpy(&(rtlmac->bands[IEEE80211_BAND_2GHZ]),
295 &rtl_band_2ghz, 367 &rtl_band_2ghz,
296 sizeof(struct ieee80211_supported_band)); 368 sizeof(struct ieee80211_supported_band));
297 369
298 /* <3> init ht cap base on ant_num */ 370 /* <3> init ht cap base on ant_num */
299 _rtl_init_hw_ht_capab(hw, &sband->ht_cap); 371 _rtl_init_hw_ht_capab(hw, &sband->ht_cap);
@@ -307,12 +379,13 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
307 /* <2> set hw->wiphy->bands[IEEE80211_BAND_5GHZ] 379 /* <2> set hw->wiphy->bands[IEEE80211_BAND_5GHZ]
308 * to default value(1T1R) */ 380 * to default value(1T1R) */
309 memcpy(&(rtlmac->bands[IEEE80211_BAND_5GHZ]), 381 memcpy(&(rtlmac->bands[IEEE80211_BAND_5GHZ]),
310 &rtl_band_5ghz, 382 &rtl_band_5ghz,
311 sizeof(struct ieee80211_supported_band)); 383 sizeof(struct ieee80211_supported_band));
312 384
313 /* <3> init ht cap base on ant_num */ 385 /* <3> init ht cap base on ant_num */
314 _rtl_init_hw_ht_capab(hw, &sband->ht_cap); 386 _rtl_init_hw_ht_capab(hw, &sband->ht_cap);
315 387
388 _rtl_init_hw_vht_capab(hw, &sband->vht_cap);
316 /* <4> set mac->sband to wiphy->sband */ 389 /* <4> set mac->sband to wiphy->sband */
317 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband; 390 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = sband;
318 } else { 391 } else {
@@ -326,7 +399,6 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
326 IEEE80211_HW_AMPDU_AGGREGATION | 399 IEEE80211_HW_AMPDU_AGGREGATION |
327 IEEE80211_HW_CONNECTION_MONITOR | 400 IEEE80211_HW_CONNECTION_MONITOR |
328 /* IEEE80211_HW_SUPPORTS_CQM_RSSI | */ 401 /* IEEE80211_HW_SUPPORTS_CQM_RSSI | */
329 IEEE80211_HW_CONNECTION_MONITOR |
330 IEEE80211_HW_MFP_CAPABLE | 402 IEEE80211_HW_MFP_CAPABLE |
331 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 0; 403 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 0;
332 404
@@ -336,7 +408,6 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
336 IEEE80211_HW_PS_NULLFUNC_STACK | 408 IEEE80211_HW_PS_NULLFUNC_STACK |
337 /* IEEE80211_HW_SUPPORTS_DYNAMIC_PS | */ 409 /* IEEE80211_HW_SUPPORTS_DYNAMIC_PS | */
338 0; 410 0;
339
340 hw->wiphy->interface_modes = 411 hw->wiphy->interface_modes =
341 BIT(NL80211_IFTYPE_AP) | 412 BIT(NL80211_IFTYPE_AP) |
342 BIT(NL80211_IFTYPE_STATION) | 413 BIT(NL80211_IFTYPE_STATION) |
@@ -344,8 +415,10 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
344 BIT(NL80211_IFTYPE_MESH_POINT) | 415 BIT(NL80211_IFTYPE_MESH_POINT) |
345 BIT(NL80211_IFTYPE_P2P_CLIENT) | 416 BIT(NL80211_IFTYPE_P2P_CLIENT) |
346 BIT(NL80211_IFTYPE_P2P_GO); 417 BIT(NL80211_IFTYPE_P2P_GO);
347
348 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 418 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
419
420 hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
421
349 hw->wiphy->rts_threshold = 2347; 422 hw->wiphy->rts_threshold = 2347;
350 423
351 hw->queues = AC_MAX; 424 hw->queues = AC_MAX;
@@ -358,6 +431,21 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
358 /* hw->max_rates = 1; */ 431 /* hw->max_rates = 1; */
359 hw->sta_data_size = sizeof(struct rtl_sta_info); 432 hw->sta_data_size = sizeof(struct rtl_sta_info);
360 433
434/* wowlan is not supported by kernel if CONFIG_PM is not defined */
435#ifdef CONFIG_PM
436 if (rtlpriv->psc.wo_wlan_mode) {
437 if (rtlpriv->psc.wo_wlan_mode & WAKE_ON_MAGIC_PACKET)
438 rtlpriv->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT;
439 if (rtlpriv->psc.wo_wlan_mode & WAKE_ON_PATTERN_MATCH) {
440 rtlpriv->wowlan.n_patterns =
441 MAX_SUPPORT_WOL_PATTERN_NUM;
442 rtlpriv->wowlan.pattern_min_len = MIN_WOL_PATTERN_SIZE;
443 rtlpriv->wowlan.pattern_max_len = MAX_WOL_PATTERN_SIZE;
444 }
445 hw->wiphy->wowlan = &rtlpriv->wowlan;
446 }
447#endif
448
361 /* <6> mac address */ 449 /* <6> mac address */
362 if (is_valid_ether_addr(rtlefuse->dev_addr)) { 450 if (is_valid_ether_addr(rtlefuse->dev_addr)) {
363 SET_IEEE80211_PERM_ADDR(hw, rtlefuse->dev_addr); 451 SET_IEEE80211_PERM_ADDR(hw, rtlefuse->dev_addr);
@@ -366,7 +454,6 @@ static void _rtl_init_mac80211(struct ieee80211_hw *hw)
366 get_random_bytes((rtlmac1 + (ETH_ALEN - 1)), 1); 454 get_random_bytes((rtlmac1 + (ETH_ALEN - 1)), 1);
367 SET_IEEE80211_PERM_ADDR(hw, rtlmac1); 455 SET_IEEE80211_PERM_ADDR(hw, rtlmac1);
368 } 456 }
369
370} 457}
371 458
372static void _rtl_init_deferred_work(struct ieee80211_hw *hw) 459static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
@@ -378,10 +465,9 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
378 rtl_watch_dog_timer_callback, (unsigned long)hw); 465 rtl_watch_dog_timer_callback, (unsigned long)hw);
379 setup_timer(&rtlpriv->works.dualmac_easyconcurrent_retrytimer, 466 setup_timer(&rtlpriv->works.dualmac_easyconcurrent_retrytimer,
380 rtl_easy_concurrent_retrytimer_callback, (unsigned long)hw); 467 rtl_easy_concurrent_retrytimer_callback, (unsigned long)hw);
381
382 /* <2> work queue */ 468 /* <2> work queue */
383 rtlpriv->works.hw = hw; 469 rtlpriv->works.hw = hw;
384 rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name); 470 rtlpriv->works.rtl_wq = alloc_workqueue(rtlpriv->cfg->name, 0, 0);
385 INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq, 471 INIT_DELAYED_WORK(&rtlpriv->works.watchdog_wq,
386 (void *)rtl_watchdog_wq_callback); 472 (void *)rtl_watchdog_wq_callback);
387 INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq, 473 INIT_DELAYED_WORK(&rtlpriv->works.ips_nic_off_wq,
@@ -424,7 +510,7 @@ void rtl_init_rfkill(struct ieee80211_hw *hw)
424 radio_state = rtlpriv->cfg->ops->radio_onoff_checking(hw, &valid); 510 radio_state = rtlpriv->cfg->ops->radio_onoff_checking(hw, &valid);
425 511
426 if (valid) { 512 if (valid) {
427 pr_info("wireless switch is %s\n", 513 pr_info("rtlwifi: wireless switch is %s\n",
428 rtlpriv->rfkill.rfkill_state ? "on" : "off"); 514 rtlpriv->rfkill.rfkill_state ? "on" : "off");
429 515
430 rtlpriv->rfkill.rfkill_state = radio_state; 516 rtlpriv->rfkill.rfkill_state = radio_state;
@@ -466,22 +552,18 @@ int rtl_init_core(struct ieee80211_hw *hw)
466 552
467 /* <4> locks */ 553 /* <4> locks */
468 mutex_init(&rtlpriv->locks.conf_mutex); 554 mutex_init(&rtlpriv->locks.conf_mutex);
469 mutex_init(&rtlpriv->locks.ps_mutex);
470 spin_lock_init(&rtlpriv->locks.ips_lock); 555 spin_lock_init(&rtlpriv->locks.ips_lock);
471 spin_lock_init(&rtlpriv->locks.irq_th_lock); 556 spin_lock_init(&rtlpriv->locks.irq_th_lock);
472 spin_lock_init(&rtlpriv->locks.irq_pci_lock);
473 spin_lock_init(&rtlpriv->locks.tx_lock);
474 spin_lock_init(&rtlpriv->locks.h2c_lock); 557 spin_lock_init(&rtlpriv->locks.h2c_lock);
475 spin_lock_init(&rtlpriv->locks.rf_ps_lock); 558 spin_lock_init(&rtlpriv->locks.rf_ps_lock);
476 spin_lock_init(&rtlpriv->locks.rf_lock); 559 spin_lock_init(&rtlpriv->locks.rf_lock);
477 spin_lock_init(&rtlpriv->locks.waitq_lock); 560 spin_lock_init(&rtlpriv->locks.waitq_lock);
478 spin_lock_init(&rtlpriv->locks.entry_list_lock); 561 spin_lock_init(&rtlpriv->locks.entry_list_lock);
479 spin_lock_init(&rtlpriv->locks.fw_ps_lock);
480 spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock); 562 spin_lock_init(&rtlpriv->locks.cck_and_rw_pagea_lock);
481 spin_lock_init(&rtlpriv->locks.check_sendpkt_lock); 563 spin_lock_init(&rtlpriv->locks.check_sendpkt_lock);
482 spin_lock_init(&rtlpriv->locks.fw_ps_lock); 564 spin_lock_init(&rtlpriv->locks.fw_ps_lock);
483 spin_lock_init(&rtlpriv->locks.lps_lock); 565 spin_lock_init(&rtlpriv->locks.lps_lock);
484 566 spin_lock_init(&rtlpriv->locks.iqk_lock);
485 /* <5> init list */ 567 /* <5> init list */
486 INIT_LIST_HEAD(&rtlpriv->entry_list); 568 INIT_LIST_HEAD(&rtlpriv->entry_list);
487 569
@@ -539,6 +621,7 @@ static void _rtl_query_shortgi(struct ieee80211_hw *hw,
539 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 621 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
540 u8 rate_flag = info->control.rates[0].flags; 622 u8 rate_flag = info->control.rates[0].flags;
541 u8 sgi_40 = 0, sgi_20 = 0, bw_40 = 0; 623 u8 sgi_40 = 0, sgi_20 = 0, bw_40 = 0;
624 u8 sgi_80 = 0, bw_80 = 0;
542 tcb_desc->use_shortgi = false; 625 tcb_desc->use_shortgi = false;
543 626
544 if (sta == NULL) 627 if (sta == NULL)
@@ -546,24 +629,35 @@ static void _rtl_query_shortgi(struct ieee80211_hw *hw,
546 629
547 sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40; 630 sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
548 sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20; 631 sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
632 sgi_80 = sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
549 633
550 if (!(sta->ht_cap.ht_supported)) 634 if ((!sta->ht_cap.ht_supported) && (!sta->vht_cap.vht_supported))
551 return; 635 return;
552 636
553 if (!sgi_40 && !sgi_20) 637 if (!sgi_40 && !sgi_20)
554 return; 638 return;
555 639
556 if (mac->opmode == NL80211_IFTYPE_STATION) 640 if (mac->opmode == NL80211_IFTYPE_STATION) {
557 bw_40 = mac->bw_40; 641 bw_40 = mac->bw_40;
558 else if (mac->opmode == NL80211_IFTYPE_AP || 642 bw_80 = mac->bw_80;
643 } else if (mac->opmode == NL80211_IFTYPE_AP ||
559 mac->opmode == NL80211_IFTYPE_ADHOC || 644 mac->opmode == NL80211_IFTYPE_ADHOC ||
560 mac->opmode == NL80211_IFTYPE_MESH_POINT) 645 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
561 bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40; 646 bw_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40;
647 bw_80 = sta->vht_cap.vht_supported;
648 }
562 649
563 if (bw_40 && sgi_40) 650 if (bw_80) {
564 tcb_desc->use_shortgi = true; 651 if (sgi_80)
565 else if ((bw_40 == false) && sgi_20) 652 tcb_desc->use_shortgi = true;
566 tcb_desc->use_shortgi = true; 653 else
654 tcb_desc->use_shortgi = false;
655 } else {
656 if (bw_40 && sgi_40)
657 tcb_desc->use_shortgi = true;
658 else if (!bw_40 && sgi_20)
659 tcb_desc->use_shortgi = true;
660 }
567 661
568 if (!(rate_flag & IEEE80211_TX_RC_SHORT_GI)) 662 if (!(rate_flag & IEEE80211_TX_RC_SHORT_GI))
569 tcb_desc->use_shortgi = false; 663 tcb_desc->use_shortgi = false;
@@ -613,7 +707,7 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw,
613 if (mac->opmode == NL80211_IFTYPE_STATION) { 707 if (mac->opmode == NL80211_IFTYPE_STATION) {
614 tcb_desc->ratr_index = 0; 708 tcb_desc->ratr_index = 0;
615 } else if (mac->opmode == NL80211_IFTYPE_ADHOC || 709 } else if (mac->opmode == NL80211_IFTYPE_ADHOC ||
616 mac->opmode == NL80211_IFTYPE_MESH_POINT) { 710 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
617 if (tcb_desc->multicast || tcb_desc->broadcast) { 711 if (tcb_desc->multicast || tcb_desc->broadcast) {
618 tcb_desc->hw_rate = 712 tcb_desc->hw_rate =
619 rtlpriv->cfg->maps[RTL_RC_CCK_RATE2M]; 713 rtlpriv->cfg->maps[RTL_RC_CCK_RATE2M];
@@ -634,7 +728,13 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw,
634 mac->opmode == NL80211_IFTYPE_MESH_POINT) { 728 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
635 tcb_desc->mac_id = 0; 729 tcb_desc->mac_id = 0;
636 730
637 if (mac->mode == WIRELESS_MODE_N_24G) 731 if (mac->mode == WIRELESS_MODE_AC_5G)
732 tcb_desc->ratr_index =
733 RATR_INX_WIRELESS_AC_5N;
734 else if (mac->mode == WIRELESS_MODE_AC_24G)
735 tcb_desc->ratr_index =
736 RATR_INX_WIRELESS_AC_24N;
737 else if (mac->mode == WIRELESS_MODE_N_24G)
638 tcb_desc->ratr_index = RATR_INX_WIRELESS_NGB; 738 tcb_desc->ratr_index = RATR_INX_WIRELESS_NGB;
639 else if (mac->mode == WIRELESS_MODE_N_5G) 739 else if (mac->mode == WIRELESS_MODE_N_5G)
640 tcb_desc->ratr_index = RATR_INX_WIRELESS_NG; 740 tcb_desc->ratr_index = RATR_INX_WIRELESS_NG;
@@ -644,8 +744,9 @@ static void _rtl_txrate_selectmode(struct ieee80211_hw *hw,
644 tcb_desc->ratr_index = RATR_INX_WIRELESS_B; 744 tcb_desc->ratr_index = RATR_INX_WIRELESS_B;
645 else if (mac->mode & WIRELESS_MODE_A) 745 else if (mac->mode & WIRELESS_MODE_A)
646 tcb_desc->ratr_index = RATR_INX_WIRELESS_G; 746 tcb_desc->ratr_index = RATR_INX_WIRELESS_G;
747
647 } else if (mac->opmode == NL80211_IFTYPE_AP || 748 } else if (mac->opmode == NL80211_IFTYPE_AP ||
648 mac->opmode == NL80211_IFTYPE_ADHOC) { 749 mac->opmode == NL80211_IFTYPE_ADHOC) {
649 if (NULL != sta) { 750 if (NULL != sta) {
650 if (sta->aid > 0) 751 if (sta->aid > 0)
651 tcb_desc->mac_id = sta->aid + 1; 752 tcb_desc->mac_id = sta->aid + 1;
@@ -671,7 +772,8 @@ static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw,
671 if (mac->opmode == NL80211_IFTYPE_AP || 772 if (mac->opmode == NL80211_IFTYPE_AP ||
672 mac->opmode == NL80211_IFTYPE_ADHOC || 773 mac->opmode == NL80211_IFTYPE_ADHOC ||
673 mac->opmode == NL80211_IFTYPE_MESH_POINT) { 774 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
674 if (sta->bandwidth == IEEE80211_STA_RX_BW_20) 775 if (!(sta->ht_cap.ht_supported) ||
776 !(sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
675 return; 777 return;
676 } else if (mac->opmode == NL80211_IFTYPE_STATION) { 778 } else if (mac->opmode == NL80211_IFTYPE_STATION) {
677 if (!mac->bw_40 || !(sta->ht_cap.ht_supported)) 779 if (!mac->bw_40 || !(sta->ht_cap.ht_supported))
@@ -684,16 +786,74 @@ static void _rtl_query_bandwidth_mode(struct ieee80211_hw *hw,
684 if (tcb_desc->hw_rate <= rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M]) 786 if (tcb_desc->hw_rate <= rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M])
685 return; 787 return;
686 788
687 tcb_desc->packet_bw = true; 789 tcb_desc->packet_bw = HT_CHANNEL_WIDTH_20_40;
790
791 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE ||
792 rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8821AE) {
793 if (mac->opmode == NL80211_IFTYPE_AP ||
794 mac->opmode == NL80211_IFTYPE_ADHOC ||
795 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
796 if (!(sta->vht_cap.vht_supported))
797 return;
798 } else if (mac->opmode == NL80211_IFTYPE_STATION) {
799 if (!mac->bw_80 ||
800 !(sta->vht_cap.vht_supported))
801 return;
802 }
803 if (tcb_desc->hw_rate <=
804 rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15])
805 return;
806 tcb_desc->packet_bw = HT_CHANNEL_WIDTH_80;
807 }
688} 808}
689 809
690static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw) 810static u8 _rtl_get_vht_highest_n_rate(struct ieee80211_hw *hw,
811 struct ieee80211_sta *sta)
691{ 812{
692 struct rtl_priv *rtlpriv = rtl_priv(hw); 813 struct rtl_priv *rtlpriv = rtl_priv(hw);
693 struct rtl_phy *rtlphy = &(rtlpriv->phy); 814 struct rtl_phy *rtlphy = &(rtlpriv->phy);
694 u8 hw_rate; 815 u8 hw_rate;
816 u16 tx_mcs_map = le16_to_cpu(sta->vht_cap.vht_mcs.tx_mcs_map);
817
818 if ((get_rf_type(rtlphy) == RF_2T2R) &&
819 (tx_mcs_map & 0x000c) != 0x000c) {
820 if ((tx_mcs_map & 0x000c) >> 2 ==
821 IEEE80211_VHT_MCS_SUPPORT_0_7)
822 hw_rate =
823 rtlpriv->cfg->maps[RTL_RC_VHT_RATE_2SS_MCS7];
824 else if ((tx_mcs_map & 0x000c) >> 2 ==
825 IEEE80211_VHT_MCS_SUPPORT_0_8)
826 hw_rate =
827 rtlpriv->cfg->maps[RTL_RC_VHT_RATE_2SS_MCS9];
828 else
829 hw_rate =
830 rtlpriv->cfg->maps[RTL_RC_VHT_RATE_2SS_MCS9];
831 } else {
832 if ((tx_mcs_map & 0x0003) ==
833 IEEE80211_VHT_MCS_SUPPORT_0_7)
834 hw_rate =
835 rtlpriv->cfg->maps[RTL_RC_VHT_RATE_1SS_MCS7];
836 else if ((tx_mcs_map & 0x0003) ==
837 IEEE80211_VHT_MCS_SUPPORT_0_8)
838 hw_rate =
839 rtlpriv->cfg->maps[RTL_RC_VHT_RATE_1SS_MCS9];
840 else
841 hw_rate =
842 rtlpriv->cfg->maps[RTL_RC_VHT_RATE_1SS_MCS9];
843 }
695 844
696 if (get_rf_type(rtlphy) == RF_2T2R) 845 return hw_rate;
846}
847
848static u8 _rtl_get_highest_n_rate(struct ieee80211_hw *hw,
849 struct ieee80211_sta *sta)
850{
851 struct rtl_priv *rtlpriv = rtl_priv(hw);
852 struct rtl_phy *rtlphy = &rtlpriv->phy;
853 u8 hw_rate;
854
855 if ((get_rf_type(rtlphy) == RF_2T2R) &&
856 (sta->ht_cap.mcs.rx_mask[1] != 0))
697 hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15]; 857 hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS15];
698 else 858 else
699 hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS7]; 859 hw_rate = rtlpriv->cfg->maps[RTL_RC_HT_RATEMCS7];
@@ -801,9 +961,7 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
801 break; 961 break;
802 } 962 }
803 } 963 }
804
805 } else { 964 } else {
806
807 switch (desc_rate) { 965 switch (desc_rate) {
808 case DESC92_RATEMCS0: 966 case DESC92_RATEMCS0:
809 rate_idx = 0; 967 rate_idx = 0;
@@ -862,31 +1020,6 @@ int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
862} 1020}
863EXPORT_SYMBOL(rtlwifi_rate_mapping); 1021EXPORT_SYMBOL(rtlwifi_rate_mapping);
864 1022
865bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
866{
867 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
868 struct rtl_priv *rtlpriv = rtl_priv(hw);
869 __le16 fc = rtl_get_fc(skb);
870
871 if (rtlpriv->dm.supp_phymode_switch &&
872 mac->link_state < MAC80211_LINKED &&
873 (ieee80211_is_auth(fc) || ieee80211_is_probe_req(fc))) {
874 if (rtlpriv->cfg->ops->chk_switch_dmdp)
875 rtlpriv->cfg->ops->chk_switch_dmdp(hw);
876 }
877 if (ieee80211_is_auth(fc)) {
878 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "MAC80211_LINKING\n");
879 rtl_ips_nic_on(hw);
880
881 mac->link_state = MAC80211_LINKING;
882 /* Dual mac */
883 rtlpriv->phy.need_iqk = true;
884 }
885
886 return true;
887}
888EXPORT_SYMBOL_GPL(rtl_tx_mgmt_proc);
889
890void rtl_get_tcb_desc(struct ieee80211_hw *hw, 1023void rtl_get_tcb_desc(struct ieee80211_hw *hw,
891 struct ieee80211_tx_info *info, 1024 struct ieee80211_tx_info *info,
892 struct ieee80211_sta *sta, 1025 struct ieee80211_sta *sta,
@@ -896,13 +1029,11 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,
896 struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw)); 1029 struct rtl_mac *rtlmac = rtl_mac(rtl_priv(hw));
897 struct ieee80211_hdr *hdr = rtl_get_hdr(skb); 1030 struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
898 struct ieee80211_rate *txrate; 1031 struct ieee80211_rate *txrate;
899 __le16 fc = hdr->frame_control; 1032 __le16 fc = rtl_get_fc(skb);
900 1033
901 txrate = ieee80211_get_tx_rate(hw, info); 1034 txrate = ieee80211_get_tx_rate(hw, info);
902 if (txrate) 1035 if (txrate)
903 tcb_desc->hw_rate = txrate->hw_value; 1036 tcb_desc->hw_rate = txrate->hw_value;
904 else
905 tcb_desc->hw_rate = 0;
906 1037
907 if (ieee80211_is_data(fc)) { 1038 if (ieee80211_is_data(fc)) {
908 /* 1039 /*
@@ -929,15 +1060,21 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,
929 *and N rate will all be controlled by FW 1060 *and N rate will all be controlled by FW
930 *when tcb_desc->use_driver_rate = false 1061 *when tcb_desc->use_driver_rate = false
931 */ 1062 */
932 if (sta && (sta->ht_cap.ht_supported)) { 1063 if (sta && sta->vht_cap.vht_supported) {
933 tcb_desc->hw_rate = _rtl_get_highest_n_rate(hw); 1064 tcb_desc->hw_rate =
1065 _rtl_get_vht_highest_n_rate(hw, sta);
934 } else { 1066 } else {
935 if (rtlmac->mode == WIRELESS_MODE_B) { 1067 if (sta && (sta->ht_cap.ht_supported)) {
936 tcb_desc->hw_rate = 1068 tcb_desc->hw_rate =
937 rtlpriv->cfg->maps[RTL_RC_CCK_RATE11M]; 1069 _rtl_get_highest_n_rate(hw, sta);
938 } else { 1070 } else {
939 tcb_desc->hw_rate = 1071 if (rtlmac->mode == WIRELESS_MODE_B) {
940 rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M]; 1072 tcb_desc->hw_rate =
1073 rtlpriv->cfg->maps[RTL_RC_CCK_RATE11M];
1074 } else {
1075 tcb_desc->hw_rate =
1076 rtlpriv->cfg->maps[RTL_RC_OFDM_RATE54M];
1077 }
941 } 1078 }
942 } 1079 }
943 } 1080 }
@@ -962,54 +1099,58 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,
962} 1099}
963EXPORT_SYMBOL(rtl_get_tcb_desc); 1100EXPORT_SYMBOL(rtl_get_tcb_desc);
964 1101
965static bool addbareq_rx(struct ieee80211_hw *hw, struct sk_buff *skb) 1102bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb)
966{ 1103{
1104 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
967 struct rtl_priv *rtlpriv = rtl_priv(hw); 1105 struct rtl_priv *rtlpriv = rtl_priv(hw);
968 struct ieee80211_sta *sta = NULL; 1106 __le16 fc = rtl_get_fc(skb);
969 struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
970 struct rtl_sta_info *sta_entry = NULL;
971 struct ieee80211_mgmt *mgmt = (void *)skb->data;
972 u16 capab = 0, tid = 0;
973 struct rtl_tid_data *tid_data;
974 struct sk_buff *skb_delba = NULL;
975 struct ieee80211_rx_status rx_status = { 0 };
976 1107
977 rcu_read_lock(); 1108 if (rtlpriv->dm.supp_phymode_switch &&
978 sta = rtl_find_sta(hw, hdr->addr3); 1109 mac->link_state < MAC80211_LINKED &&
979 if (sta == NULL) { 1110 (ieee80211_is_auth(fc) || ieee80211_is_probe_req(fc))) {
980 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_EMERG, 1111 if (rtlpriv->cfg->ops->chk_switch_dmdp)
981 "sta is NULL\n"); 1112 rtlpriv->cfg->ops->chk_switch_dmdp(hw);
982 rcu_read_unlock();
983 return true;
984 } 1113 }
1114 if (ieee80211_is_auth(fc)) {
1115 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "MAC80211_LINKING\n");
1116 rtl_ips_nic_on(hw);
1117
1118 mac->link_state = MAC80211_LINKING;
1119 /* Dul mac */
1120 rtlpriv->phy.need_iqk = true;
985 1121
986 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
987 if (!sta_entry) {
988 rcu_read_unlock();
989 return true;
990 } 1122 }
991 capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab); 1123
992 tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2; 1124 return true;
993 tid_data = &sta_entry->tids[tid]; 1125}
994 if (tid_data->agg.rx_agg_state == RTL_RX_AGG_START) { 1126EXPORT_SYMBOL_GPL(rtl_tx_mgmt_proc);
995 skb_delba = rtl_make_del_ba(hw, hdr->addr2, hdr->addr3, tid); 1127
996 if (skb_delba) { 1128struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw, u8 *sa,
997 rx_status.freq = hw->conf.chandef.chan->center_freq; 1129 u8 *bssid, u16 tid);
998 rx_status.band = hw->conf.chandef.chan->band; 1130
999 rx_status.flag |= RX_FLAG_DECRYPTED; 1131static void process_agg_start(struct ieee80211_hw *hw,
1000 rx_status.flag |= RX_FLAG_MACTIME_END; 1132 struct ieee80211_hdr *hdr, u16 tid)
1001 rx_status.rate_idx = 0; 1133{
1002 rx_status.signal = 50 + 10; 1134 struct rtl_priv *rtlpriv = rtl_priv(hw);
1003 memcpy(IEEE80211_SKB_RXCB(skb_delba), &rx_status, 1135 struct ieee80211_rx_status rx_status = { 0 };
1004 sizeof(rx_status)); 1136 struct sk_buff *skb_delba = NULL;
1005 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, 1137
1006 "fake del\n", skb_delba->data, 1138 skb_delba = rtl_make_del_ba(hw, hdr->addr2, hdr->addr3, tid);
1007 skb_delba->len); 1139 if (skb_delba) {
1008 ieee80211_rx_irqsafe(hw, skb_delba); 1140 rx_status.freq = hw->conf.chandef.chan->center_freq;
1009 } 1141 rx_status.band = hw->conf.chandef.chan->band;
1142 rx_status.flag |= RX_FLAG_DECRYPTED;
1143 rx_status.flag |= RX_FLAG_MACTIME_START;
1144 rx_status.rate_idx = 0;
1145 rx_status.signal = 50 + 10;
1146 memcpy(IEEE80211_SKB_RXCB(skb_delba),
1147 &rx_status, sizeof(rx_status));
1148 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG,
1149 "fake del\n",
1150 skb_delba->data,
1151 skb_delba->len);
1152 ieee80211_rx_irqsafe(hw, skb_delba);
1010 } 1153 }
1011 rcu_read_unlock();
1012 return false;
1013} 1154}
1014 1155
1015bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) 1156bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
@@ -1017,8 +1158,8 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1017 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1158 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1018 struct ieee80211_hdr *hdr = rtl_get_hdr(skb); 1159 struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
1019 struct rtl_priv *rtlpriv = rtl_priv(hw); 1160 struct rtl_priv *rtlpriv = rtl_priv(hw);
1020 __le16 fc = hdr->frame_control; 1161 __le16 fc = rtl_get_fc(skb);
1021 u8 *act = (u8 *)skb->data + MAC80211_3ADDR_LEN; 1162 u8 *act = (u8 *)(((u8 *)skb->data + MAC80211_3ADDR_LEN));
1022 u8 category; 1163 u8 category;
1023 1164
1024 if (!ieee80211_is_action(fc)) 1165 if (!ieee80211_is_action(fc))
@@ -1034,18 +1175,47 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1034 return false; 1175 return false;
1035 1176
1036 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, 1177 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1037 "%s ACT_ADDBAREQ From :%pM\n", 1178 "%s ACT_ADDBAREQ From :%pM\n",
1038 is_tx ? "Tx" : "Rx", hdr->addr2); 1179 is_tx ? "Tx" : "Rx", hdr->addr2);
1039 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "req\n", 1180 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "req\n",
1040 skb->data, skb->len); 1181 skb->data, skb->len);
1041 if (!is_tx) 1182 if (!is_tx) {
1042 if (addbareq_rx(hw, skb)) 1183 struct ieee80211_sta *sta = NULL;
1184 struct rtl_sta_info *sta_entry = NULL;
1185 struct rtl_tid_data *tid_data;
1186 struct ieee80211_mgmt *mgmt = (void *)skb->data;
1187 u16 capab = 0, tid = 0;
1188
1189 rcu_read_lock();
1190 sta = rtl_find_sta(hw, hdr->addr3);
1191 if (sta == NULL) {
1192 RT_TRACE(rtlpriv, COMP_SEND | COMP_RECV,
1193 DBG_DMESG, "sta is NULL\n");
1194 rcu_read_unlock();
1195 return true;
1196 }
1197
1198 sta_entry =
1199 (struct rtl_sta_info *)sta->drv_priv;
1200 if (!sta_entry) {
1201 rcu_read_unlock();
1043 return true; 1202 return true;
1203 }
1204 capab =
1205 le16_to_cpu(mgmt->u.action.u.addba_req.capab);
1206 tid = (capab &
1207 IEEE80211_ADDBA_PARAM_TID_MASK) >> 2;
1208 tid_data = &sta_entry->tids[tid];
1209 if (tid_data->agg.rx_agg_state ==
1210 RTL_RX_AGG_START)
1211 process_agg_start(hw, hdr, tid);
1212 rcu_read_unlock();
1213 }
1044 break; 1214 break;
1045 case ACT_ADDBARSP: 1215 case ACT_ADDBARSP:
1046 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, 1216 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1047 "%s ACT_ADDBARSP From :%pM\n", 1217 "%s ACT_ADDBARSP From :%pM\n",
1048 is_tx ? "Tx" : "Rx", hdr->addr2); 1218 is_tx ? "Tx" : "Rx", hdr->addr2);
1049 break; 1219 break;
1050 case ACT_DELBA: 1220 case ACT_DELBA:
1051 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, 1221 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
@@ -1061,6 +1231,17 @@ bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1061} 1231}
1062EXPORT_SYMBOL_GPL(rtl_action_proc); 1232EXPORT_SYMBOL_GPL(rtl_action_proc);
1063 1233
1234static void setup_arp_tx(struct rtl_priv *rtlpriv, struct rtl_ps_ctl *ppsc)
1235{
1236 rtlpriv->ra.is_special_data = true;
1237 if (rtlpriv->cfg->ops->get_btc_status())
1238 rtlpriv->btcoexist.btc_ops->btc_special_packet_notify(
1239 rtlpriv, 1);
1240 rtlpriv->enter_ps = false;
1241 schedule_work(&rtlpriv->works.lps_change_work);
1242 ppsc->last_delaylps_stamp_jiffies = jiffies;
1243}
1244
1064/*should call before software enc*/ 1245/*should call before software enc*/
1065u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx) 1246u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1066{ 1247{
@@ -1069,57 +1250,77 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx)
1069 __le16 fc = rtl_get_fc(skb); 1250 __le16 fc = rtl_get_fc(skb);
1070 u16 ether_type; 1251 u16 ether_type;
1071 u8 mac_hdr_len = ieee80211_get_hdrlen_from_skb(skb); 1252 u8 mac_hdr_len = ieee80211_get_hdrlen_from_skb(skb);
1253 u8 encrypt_header_len = 0;
1254 u8 offset;
1072 const struct iphdr *ip; 1255 const struct iphdr *ip;
1073 1256
1074 if (!ieee80211_is_data(fc)) 1257 if (!ieee80211_is_data(fc))
1075 return false; 1258 goto end;
1076
1077 ip = (const struct iphdr *)(skb->data + mac_hdr_len +
1078 SNAP_SIZE + PROTOC_TYPE_SIZE);
1079 ether_type = be16_to_cpup((__be16 *)
1080 (skb->data + mac_hdr_len + SNAP_SIZE));
1081
1082 switch (ether_type) {
1083 case ETH_P_IP: {
1084 struct udphdr *udp;
1085 u16 src;
1086 u16 dst;
1087 1259
1088 if (ip->protocol != IPPROTO_UDP) 1260 switch (rtlpriv->sec.pairwise_enc_algorithm) {
1089 return false; 1261 case WEP40_ENCRYPTION:
1090 udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2)); 1262 case WEP104_ENCRYPTION:
1091 src = be16_to_cpu(udp->source); 1263 encrypt_header_len = 4;/*WEP_IV_LEN*/
1092 dst = be16_to_cpu(udp->dest);
1093
1094 /* If this case involves port 68 (UDP BOOTP client) connecting
1095 * with port 67 (UDP BOOTP server), then return true so that
1096 * the lowest speed is used.
1097 */
1098 if (!((src == 68 && dst == 67) || (src == 67 && dst == 68)))
1099 return false;
1100
1101 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1102 "dhcp %s !!\n", is_tx ? "Tx" : "Rx");
1103 break; 1264 break;
1104 } 1265 case TKIP_ENCRYPTION:
1105 case ETH_P_ARP: 1266 encrypt_header_len = 8;/*TKIP_IV_LEN*/
1106 break; 1267 break;
1107 case ETH_P_PAE: 1268 case AESCCMP_ENCRYPTION:
1108 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG, 1269 encrypt_header_len = 8;/*CCMP_HDR_LEN;*/
1109 "802.1X %s EAPOL pkt!!\n", is_tx ? "Tx" : "Rx");
1110 break; 1270 break;
1111 case ETH_P_IPV6:
1112 /* TODO: Is this right? */
1113 return false;
1114 default: 1271 default:
1115 return false; 1272 break;
1116 } 1273 }
1117 if (is_tx) { 1274
1118 rtlpriv->enter_ps = false; 1275 offset = mac_hdr_len + SNAP_SIZE + encrypt_header_len;
1119 schedule_work(&rtlpriv->works.lps_change_work); 1276 ether_type = be16_to_cpup((__be16 *)(skb->data + offset));
1120 ppsc->last_delaylps_stamp_jiffies = jiffies; 1277
1278 if (ETH_P_IP == ether_type) {
1279 ip = (struct iphdr *)((u8 *)skb->data + offset +
1280 PROTOC_TYPE_SIZE);
1281 if (IPPROTO_UDP == ip->protocol) {
1282 struct udphdr *udp = (struct udphdr *)((u8 *)ip +
1283 (ip->ihl << 2));
1284 if (((((u8 *)udp)[1] == 68) &&
1285 (((u8 *)udp)[3] == 67)) ||
1286 ((((u8 *)udp)[1] == 67) &&
1287 (((u8 *)udp)[3] == 68))) {
1288 /* 68 : UDP BOOTP client
1289 * 67 : UDP BOOTP server
1290 */
1291 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV),
1292 DBG_DMESG, "dhcp %s !!\n",
1293 (is_tx) ? "Tx" : "Rx");
1294
1295 if (is_tx)
1296 setup_arp_tx(rtlpriv, ppsc);
1297 return true;
1298 }
1299 }
1300 } else if (ETH_P_ARP == ether_type) {
1301 if (is_tx)
1302 setup_arp_tx(rtlpriv, ppsc);
1303
1304 return true;
1305 } else if (ETH_P_PAE == ether_type) {
1306 RT_TRACE(rtlpriv, (COMP_SEND | COMP_RECV), DBG_DMESG,
1307 "802.1X %s EAPOL pkt!!\n", (is_tx) ? "Tx" : "Rx");
1308
1309 if (is_tx) {
1310 rtlpriv->ra.is_special_data = true;
1311 rtlpriv->enter_ps = false;
1312 schedule_work(&rtlpriv->works.lps_change_work);
1313 ppsc->last_delaylps_stamp_jiffies = jiffies;
1314 }
1315
1316 return true;
1317 } else if (0x86DD == ether_type) {
1318 return true;
1121 } 1319 }
1122 return true; 1320
1321end:
1322 rtlpriv->ra.is_special_data = false;
1323 return false;
1123} 1324}
1124EXPORT_SYMBOL_GPL(rtl_is_special_data); 1325EXPORT_SYMBOL_GPL(rtl_is_special_data);
1125 1326
@@ -1128,12 +1329,11 @@ EXPORT_SYMBOL_GPL(rtl_is_special_data);
1128 * functions called by core.c 1329 * functions called by core.c
1129 * 1330 *
1130 *********************************************************/ 1331 *********************************************************/
1131int rtl_tx_agg_start(struct ieee80211_hw *hw, 1332int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1132 struct ieee80211_sta *sta, u16 tid, u16 *ssn) 1333 struct ieee80211_sta *sta, u16 tid, u16 *ssn)
1133{ 1334{
1134 struct rtl_priv *rtlpriv = rtl_priv(hw); 1335 struct rtl_priv *rtlpriv = rtl_priv(hw);
1135 struct rtl_tid_data *tid_data; 1336 struct rtl_tid_data *tid_data;
1136 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1137 struct rtl_sta_info *sta_entry = NULL; 1337 struct rtl_sta_info *sta_entry = NULL;
1138 1338
1139 if (sta == NULL) 1339 if (sta == NULL)
@@ -1147,43 +1347,38 @@ int rtl_tx_agg_start(struct ieee80211_hw *hw,
1147 return -ENXIO; 1347 return -ENXIO;
1148 tid_data = &sta_entry->tids[tid]; 1348 tid_data = &sta_entry->tids[tid];
1149 1349
1150 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d seq:%d\n", 1350 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
1151 sta->addr, tid, tid_data->seq_number); 1351 "on ra = %pM tid = %d seq:%d\n", sta->addr, tid,
1352 tid_data->seq_number);
1152 1353
1153 *ssn = tid_data->seq_number; 1354 *ssn = tid_data->seq_number;
1154 tid_data->agg.agg_state = RTL_AGG_START; 1355 tid_data->agg.agg_state = RTL_AGG_START;
1155 1356
1156 ieee80211_start_tx_ba_cb_irqsafe(mac->vif, sta->addr, tid); 1357 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1157
1158 return 0; 1358 return 0;
1159} 1359}
1160 1360
1161int rtl_tx_agg_stop(struct ieee80211_hw *hw, 1361int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1162 struct ieee80211_sta *sta, u16 tid) 1362 struct ieee80211_sta *sta, u16 tid)
1163{ 1363{
1164 struct rtl_priv *rtlpriv = rtl_priv(hw); 1364 struct rtl_priv *rtlpriv = rtl_priv(hw);
1165 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1365 struct rtl_tid_data *tid_data;
1166 struct rtl_sta_info *sta_entry = NULL; 1366 struct rtl_sta_info *sta_entry = NULL;
1167 1367
1168 if (sta == NULL) 1368 if (sta == NULL)
1169 return -EINVAL; 1369 return -EINVAL;
1170 1370
1171 if (!sta->addr) { 1371 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
1172 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "ra = NULL\n"); 1372 "on ra = %pM tid = %d\n", sta->addr, tid);
1173 return -EINVAL;
1174 }
1175
1176 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d\n",
1177 sta->addr, tid);
1178 1373
1179 if (unlikely(tid >= MAX_TID_COUNT)) 1374 if (unlikely(tid >= MAX_TID_COUNT))
1180 return -EINVAL; 1375 return -EINVAL;
1181 1376
1182 sta_entry = (struct rtl_sta_info *)sta->drv_priv; 1377 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1378 tid_data = &sta_entry->tids[tid];
1183 sta_entry->tids[tid].agg.agg_state = RTL_AGG_STOP; 1379 sta_entry->tids[tid].agg.agg_state = RTL_AGG_STOP;
1184 1380
1185 ieee80211_stop_tx_ba_cb_irqsafe(mac->vif, sta->addr, tid); 1381 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
1186
1187 return 0; 1382 return 0;
1188} 1383}
1189 1384
@@ -1222,11 +1417,6 @@ int rtl_rx_agg_stop(struct ieee80211_hw *hw,
1222 if (sta == NULL) 1417 if (sta == NULL)
1223 return -EINVAL; 1418 return -EINVAL;
1224 1419
1225 if (!sta->addr) {
1226 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "ra = NULL\n");
1227 return -EINVAL;
1228 }
1229
1230 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, 1420 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
1231 "on ra = %pM tid = %d\n", sta->addr, tid); 1421 "on ra = %pM tid = %d\n", sta->addr, tid);
1232 1422
@@ -1238,7 +1428,6 @@ int rtl_rx_agg_stop(struct ieee80211_hw *hw,
1238 1428
1239 return 0; 1429 return 0;
1240} 1430}
1241
1242int rtl_tx_agg_oper(struct ieee80211_hw *hw, 1431int rtl_tx_agg_oper(struct ieee80211_hw *hw,
1243 struct ieee80211_sta *sta, u16 tid) 1432 struct ieee80211_sta *sta, u16 tid)
1244{ 1433{
@@ -1248,13 +1437,8 @@ int rtl_tx_agg_oper(struct ieee80211_hw *hw,
1248 if (sta == NULL) 1437 if (sta == NULL)
1249 return -EINVAL; 1438 return -EINVAL;
1250 1439
1251 if (!sta->addr) { 1440 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
1252 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "ra = NULL\n"); 1441 "on ra = %pM tid = %d\n", sta->addr, tid);
1253 return -EINVAL;
1254 }
1255
1256 RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG, "on ra = %pM tid = %d\n",
1257 sta->addr, tid);
1258 1442
1259 if (unlikely(tid >= MAX_TID_COUNT)) 1443 if (unlikely(tid >= MAX_TID_COUNT))
1260 return -EINVAL; 1444 return -EINVAL;
@@ -1292,7 +1476,7 @@ void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb)
1292 return; 1476 return;
1293 1477
1294 /* and only beacons from the associated BSSID, please */ 1478 /* and only beacons from the associated BSSID, please */
1295 if (!ether_addr_equal_64bits(hdr->addr3, rtlpriv->mac80211.bssid)) 1479 if (!ether_addr_equal(hdr->addr3, rtlpriv->mac80211.bssid))
1296 return; 1480 return;
1297 1481
1298 rtlpriv->link_info.bcn_rx_inperiod++; 1482 rtlpriv->link_info.bcn_rx_inperiod++;
@@ -1332,8 +1516,7 @@ void rtl_watchdog_wq_callback(void *data)
1332 mac->cnt_after_linked = 0; 1516 mac->cnt_after_linked = 0;
1333 } 1517 }
1334 1518
1335 /* 1519 /* <2> to check if traffic busy, if
1336 *<2> to check if traffic busy, if
1337 * busytraffic we don't change channel 1520 * busytraffic we don't change channel
1338 */ 1521 */
1339 if (mac->link_state >= MAC80211_LINKED) { 1522 if (mac->link_state >= MAC80211_LINKED) {
@@ -1381,32 +1564,29 @@ void rtl_watchdog_wq_callback(void *data)
1381 for (tid = 0; tid <= 7; tid++) { 1564 for (tid = 0; tid <= 7; tid++) {
1382 for (idx = 0; idx <= 2; idx++) 1565 for (idx = 0; idx <= 2; idx++)
1383 rtlpriv->link_info.tidtx_in4period[tid][idx] = 1566 rtlpriv->link_info.tidtx_in4period[tid][idx] =
1384 rtlpriv->link_info.tidtx_in4period[tid] 1567 rtlpriv->link_info.tidtx_in4period[tid]
1385 [idx + 1]; 1568 [idx + 1];
1386 rtlpriv->link_info.tidtx_in4period[tid][3] = 1569 rtlpriv->link_info.tidtx_in4period[tid][3] =
1387 rtlpriv->link_info.tidtx_inperiod[tid]; 1570 rtlpriv->link_info.tidtx_inperiod[tid];
1388 1571
1389 for (idx = 0; idx <= 3; idx++) 1572 for (idx = 0; idx <= 3; idx++)
1390 tidtx_inp4eriod[tid] += 1573 tidtx_inp4eriod[tid] +=
1391 rtlpriv->link_info.tidtx_in4period[tid][idx]; 1574 rtlpriv->link_info.tidtx_in4period[tid][idx];
1392 aver_tidtx_inperiod[tid] = tidtx_inp4eriod[tid] / 4; 1575 aver_tidtx_inperiod[tid] = tidtx_inp4eriod[tid] / 4;
1393 if (aver_tidtx_inperiod[tid] > 5000) 1576 if (aver_tidtx_inperiod[tid] > 5000)
1394 rtlpriv->link_info.higher_busytxtraffic[tid] = 1577 rtlpriv->link_info.higher_busytxtraffic[tid] =
1395 true; 1578 true;
1396 else 1579 else
1397 rtlpriv->link_info.higher_busytxtraffic[tid] = 1580 rtlpriv->link_info.higher_busytxtraffic[tid] =
1398 false; 1581 false;
1399 } 1582 }
1400 1583
1401 if (((rtlpriv->link_info.num_rx_inperiod + 1584 if (((rtlpriv->link_info.num_rx_inperiod +
1402 rtlpriv->link_info.num_tx_inperiod) > 8) || 1585 rtlpriv->link_info.num_tx_inperiod) > 8) ||
1403 (rtlpriv->link_info.num_rx_inperiod > 2)) 1586 (rtlpriv->link_info.num_rx_inperiod > 2))
1404 rtlpriv->enter_ps = true; 1587 rtl_lps_enter(hw);
1405 else 1588 else
1406 rtlpriv->enter_ps = false; 1589 rtl_lps_leave(hw);
1407
1408 /* LeisurePS only work in infra mode. */
1409 schedule_work(&rtlpriv->works.lps_change_work);
1410 } 1590 }
1411 1591
1412 rtlpriv->link_info.num_rx_inperiod = 0; 1592 rtlpriv->link_info.num_rx_inperiod = 0;
@@ -1421,32 +1601,37 @@ void rtl_watchdog_wq_callback(void *data)
1421 rtlpriv->link_info.higher_busyrxtraffic = higher_busyrxtraffic; 1601 rtlpriv->link_info.higher_busyrxtraffic = higher_busyrxtraffic;
1422 1602
1423 /* <3> DM */ 1603 /* <3> DM */
1424 rtlpriv->cfg->ops->dm_watchdog(hw); 1604 if (!rtlpriv->cfg->mod_params->disable_watchdog)
1605 rtlpriv->cfg->ops->dm_watchdog(hw);
1425 1606
1426 /* <4> roaming */ 1607 /* <4> roaming */
1427 if (mac->link_state == MAC80211_LINKED && 1608 if (mac->link_state == MAC80211_LINKED &&
1428 mac->opmode == NL80211_IFTYPE_STATION) { 1609 mac->opmode == NL80211_IFTYPE_STATION) {
1429 if ((rtlpriv->link_info.bcn_rx_inperiod + 1610 if ((rtlpriv->link_info.bcn_rx_inperiod +
1430 rtlpriv->link_info.num_rx_inperiod) == 0) { 1611 rtlpriv->link_info.num_rx_inperiod) == 0) {
1431 rtlpriv->link_info.roam_times++; 1612 rtlpriv->link_info.roam_times++;
1432 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG, 1613 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
1433 "AP off for %d s\n", 1614 "AP off for %d s\n",
1434 (rtlpriv->link_info.roam_times * 2)); 1615 (rtlpriv->link_info.roam_times * 2));
1435 1616
1436 /* if we can't recv beacon for 6s, we should 1617 /* if we can't recv beacon for 10s,
1437 * reconnect this AP 1618 * we should reconnect this AP
1438 */ 1619 */
1439 if ((rtlpriv->link_info.roam_times >= 3) && 1620 if (rtlpriv->link_info.roam_times >= 5) {
1440 !is_zero_ether_addr(rtlpriv->mac80211.bssid)) {
1441 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1621 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1442 "AP off, try to reconnect now\n"); 1622 "AP off, try to reconnect now\n");
1443 rtlpriv->link_info.roam_times = 0; 1623 rtlpriv->link_info.roam_times = 0;
1444 ieee80211_connection_loss(rtlpriv->mac80211.vif); 1624 ieee80211_connection_loss(
1625 rtlpriv->mac80211.vif);
1445 } 1626 }
1446 } else { 1627 } else {
1447 rtlpriv->link_info.roam_times = 0; 1628 rtlpriv->link_info.roam_times = 0;
1448 } 1629 }
1449 } 1630 }
1631
1632 if (rtlpriv->cfg->ops->get_btc_status())
1633 rtlpriv->btcoexist.btc_ops->btc_periodical(rtlpriv);
1634
1450 rtlpriv->link_info.bcn_rx_inperiod = 0; 1635 rtlpriv->link_info.bcn_rx_inperiod = 0;
1451} 1636}
1452 1637
@@ -1461,7 +1646,6 @@ void rtl_watch_dog_timer_callback(unsigned long data)
1461 mod_timer(&rtlpriv->works.watchdog_timer, 1646 mod_timer(&rtlpriv->works.watchdog_timer,
1462 jiffies + MSECS(RTL_WATCH_DOG_TIME)); 1647 jiffies + MSECS(RTL_WATCH_DOG_TIME));
1463} 1648}
1464
1465void rtl_fwevt_wq_callback(void *data) 1649void rtl_fwevt_wq_callback(void *data)
1466{ 1650{
1467 struct rtl_works *rtlworks = 1651 struct rtl_works *rtlworks =
@@ -1471,7 +1655,6 @@ void rtl_fwevt_wq_callback(void *data)
1471 1655
1472 rtlpriv->cfg->ops->c2h_command_handle(hw); 1656 rtlpriv->cfg->ops->c2h_command_handle(hw);
1473} 1657}
1474
1475void rtl_easy_concurrent_retrytimer_callback(unsigned long data) 1658void rtl_easy_concurrent_retrytimer_callback(unsigned long data)
1476{ 1659{
1477 struct ieee80211_hw *hw = (struct ieee80211_hw *)data; 1660 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
@@ -1483,7 +1666,6 @@ void rtl_easy_concurrent_retrytimer_callback(unsigned long data)
1483 1666
1484 rtlpriv->cfg->ops->dualmac_easy_concurrent(hw); 1667 rtlpriv->cfg->ops->dualmac_easy_concurrent(hw);
1485} 1668}
1486
1487/********************************************************* 1669/*********************************************************
1488 * 1670 *
1489 * frame process functions 1671 * frame process functions
@@ -1511,7 +1693,8 @@ u8 *rtl_find_ie(u8 *data, unsigned int len, u8 ie)
1511/* when we use 2 rx ants we send IEEE80211_SMPS_OFF */ 1693/* when we use 2 rx ants we send IEEE80211_SMPS_OFF */
1512/* when we use 1 rx ant we send IEEE80211_SMPS_STATIC */ 1694/* when we use 1 rx ant we send IEEE80211_SMPS_STATIC */
1513static struct sk_buff *rtl_make_smps_action(struct ieee80211_hw *hw, 1695static struct sk_buff *rtl_make_smps_action(struct ieee80211_hw *hw,
1514 enum ieee80211_smps_mode smps, u8 *da, u8 *bssid) 1696 enum ieee80211_smps_mode smps,
1697 u8 *da, u8 *bssid)
1515{ 1698{
1516 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1699 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1517 struct sk_buff *skb; 1700 struct sk_buff *skb;
@@ -1536,6 +1719,9 @@ static struct sk_buff *rtl_make_smps_action(struct ieee80211_hw *hw,
1536 case IEEE80211_SMPS_AUTOMATIC:/* 0 */ 1719 case IEEE80211_SMPS_AUTOMATIC:/* 0 */
1537 case IEEE80211_SMPS_NUM_MODES:/* 4 */ 1720 case IEEE80211_SMPS_NUM_MODES:/* 4 */
1538 WARN_ON(1); 1721 WARN_ON(1);
1722 /* Here will get a 'MISSING_BREAK' in Coverity Test, just ignore it.
1723 * According to Kernel Code, here is right.
1724 */
1539 case IEEE80211_SMPS_OFF:/* 1 */ /*MIMO_PS_NOLIMIT*/ 1725 case IEEE80211_SMPS_OFF:/* 1 */ /*MIMO_PS_NOLIMIT*/
1540 action_frame->u.action.u.ht_smps.smps_control = 1726 action_frame->u.action.u.ht_smps.smps_control =
1541 WLAN_HT_SMPS_CONTROL_DISABLED;/* 0 */ 1727 WLAN_HT_SMPS_CONTROL_DISABLED;/* 0 */
@@ -1554,8 +1740,8 @@ static struct sk_buff *rtl_make_smps_action(struct ieee80211_hw *hw,
1554} 1740}
1555 1741
1556int rtl_send_smps_action(struct ieee80211_hw *hw, 1742int rtl_send_smps_action(struct ieee80211_hw *hw,
1557 struct ieee80211_sta *sta, 1743 struct ieee80211_sta *sta,
1558 enum ieee80211_smps_mode smps) 1744 enum ieee80211_smps_mode smps)
1559{ 1745{
1560 struct rtl_priv *rtlpriv = rtl_priv(hw); 1746 struct rtl_priv *rtlpriv = rtl_priv(hw);
1561 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1747 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
@@ -1590,6 +1776,7 @@ int rtl_send_smps_action(struct ieee80211_hw *hw,
1590 struct rtl_sta_info *sta_entry = 1776 struct rtl_sta_info *sta_entry =
1591 (struct rtl_sta_info *) sta->drv_priv; 1777 (struct rtl_sta_info *) sta->drv_priv;
1592 sta_entry->mimo_ps = smps; 1778 sta_entry->mimo_ps = smps;
1779 /* rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0); */
1593 1780
1594 info->control.rates[0].idx = 0; 1781 info->control.rates[0].idx = 0;
1595 info->band = hw->conf.chandef.chan->band; 1782 info->band = hw->conf.chandef.chan->band;
@@ -1631,10 +1818,10 @@ void rtl_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1631} 1818}
1632EXPORT_SYMBOL(rtl_phy_scan_operation_backup); 1819EXPORT_SYMBOL(rtl_phy_scan_operation_backup);
1633 1820
1634/* There seem to be issues in mac80211 regarding when del ba frames can be 1821/* because mac80211 have issues when can receive del ba
1635 * received. As a work around, we make a fake del_ba if we receive a ba_req; 1822 * so here we just make a fake del_ba if we receive a ba_req
1636 * however, rx_agg was opened to let mac80211 release some ba related 1823 * but rx_agg was opened to let mac80211 release some ba
1637 * resources. This del_ba is for tx only. 1824 * related resources, so please this del_ba for tx
1638 */ 1825 */
1639struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw, 1826struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw,
1640 u8 *sa, u8 *bssid, u16 tid) 1827 u8 *sa, u8 *bssid, u16 tid)
@@ -1660,7 +1847,7 @@ struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw,
1660 action_frame->u.action.category = WLAN_CATEGORY_BACK; 1847 action_frame->u.action.category = WLAN_CATEGORY_BACK;
1661 action_frame->u.action.u.delba.action_code = WLAN_ACTION_DELBA; 1848 action_frame->u.action.u.delba.action_code = WLAN_ACTION_DELBA;
1662 params = (u16)(1 << 11); /* bit 11 initiator */ 1849 params = (u16)(1 << 11); /* bit 11 initiator */
1663 params |= (u16)(tid << 12); /* bit 15:12 TID number */ 1850 params |= (u16)(tid << 12); /* bit 15:12 TID number */
1664 1851
1665 action_frame->u.action.u.delba.params = cpu_to_le16(params); 1852 action_frame->u.action.u.delba.params = cpu_to_le16(params);
1666 action_frame->u.action.u.delba.reason_code = 1853 action_frame->u.action.u.delba.reason_code =
@@ -1675,7 +1862,7 @@ struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw,
1675 * 1862 *
1676 *********************************************************/ 1863 *********************************************************/
1677static bool rtl_chk_vendor_ouisub(struct ieee80211_hw *hw, 1864static bool rtl_chk_vendor_ouisub(struct ieee80211_hw *hw,
1678 struct octet_string vendor_ie) 1865 struct octet_string vendor_ie)
1679{ 1866{
1680 struct rtl_priv *rtlpriv = rtl_priv(hw); 1867 struct rtl_priv *rtlpriv = rtl_priv(hw);
1681 bool matched = false; 1868 bool matched = false;
@@ -1848,11 +2035,13 @@ static ssize_t rtl_store_debug_level(struct device *d,
1848 2035
1849 ret = kstrtoul(buf, 0, &val); 2036 ret = kstrtoul(buf, 0, &val);
1850 if (ret) { 2037 if (ret) {
1851 printk(KERN_DEBUG "%s is not in hex or decimal form.\n", buf); 2038 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
2039 "%s is not in hex or decimal form.\n", buf);
1852 } else { 2040 } else {
1853 rtlpriv->dbg.global_debuglevel = val; 2041 rtlpriv->dbg.global_debuglevel = val;
1854 printk(KERN_DEBUG "debuglevel:%x\n", 2042 RT_TRACE(rtlpriv, COMP_ERR, DBG_DMESG,
1855 rtlpriv->dbg.global_debuglevel); 2043 "debuglevel:%x\n",
2044 rtlpriv->dbg.global_debuglevel);
1856 } 2045 }
1857 2046
1858 return strnlen(buf, count); 2047 return strnlen(buf, count);
@@ -1892,7 +2081,7 @@ EXPORT_SYMBOL_GPL(rtl_global_var);
1892static int __init rtl_core_module_init(void) 2081static int __init rtl_core_module_init(void)
1893{ 2082{
1894 if (rtl_rate_control_register()) 2083 if (rtl_rate_control_register())
1895 pr_err("Unable to register rtl_rc, use default RC !!\n"); 2084 pr_err("rtl: Unable to register rtl_rc, use default RC !!\n");
1896 2085
1897 /* init some global vars */ 2086 /* init some global vars */
1898 INIT_LIST_HEAD(&rtl_global_var.glb_priv_list); 2087 INIT_LIST_HEAD(&rtl_global_var.glb_priv_list);
diff --git a/drivers/net/wireless/rtlwifi/base.h b/drivers/net/wireless/rtlwifi/base.h
index 0cd07420777a..982f2450feea 100644
--- a/drivers/net/wireless/rtlwifi/base.h
+++ b/drivers/net/wireless/rtlwifi/base.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -41,7 +37,7 @@ enum ap_peer {
41 PEER_MARV = 7, 37 PEER_MARV = 7,
42 PEER_AIRGO = 9, 38 PEER_AIRGO = 9,
43 PEER_MAX = 10, 39 PEER_MAX = 10,
44} ; 40};
45 41
46#define RTL_DUMMY_OFFSET 0 42#define RTL_DUMMY_OFFSET 0
47#define RTL_DUMMY_UNIT 8 43#define RTL_DUMMY_UNIT 8
@@ -55,6 +51,16 @@ enum ap_peer {
55#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */ 51#define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */
56#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */ 52#define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */
57 53
54#define MAX_BIT_RATE_SHORT_GI_2NSS_80MHZ_MCS9 867 /* Mbps */
55#define MAX_BIT_RATE_SHORT_GI_2NSS_80MHZ_MCS7 650 /* Mbps */
56#define MAX_BIT_RATE_LONG_GI_2NSS_80MHZ_MCS9 780 /* Mbps */
57#define MAX_BIT_RATE_LONG_GI_2NSS_80MHZ_MCS7 585 /* Mbps */
58
59#define MAX_BIT_RATE_SHORT_GI_1NSS_80MHZ_MCS9 434 /* Mbps */
60#define MAX_BIT_RATE_SHORT_GI_1NSS_80MHZ_MCS7 325 /* Mbps */
61#define MAX_BIT_RATE_LONG_GI_1NSS_80MHZ_MCS9 390 /* Mbps */
62#define MAX_BIT_RATE_LONG_GI_1NSS_80MHZ_MCS7 293 /* Mbps */
63
58#define RTL_RATE_COUNT_LEGACY 12 64#define RTL_RATE_COUNT_LEGACY 12
59#define RTL_CHANNEL_COUNT 14 65#define RTL_CHANNEL_COUNT 14
60 66
@@ -78,9 +84,9 @@ enum ap_peer {
78#define SET_80211_PS_POLL_AID(_hdr, _val) \ 84#define SET_80211_PS_POLL_AID(_hdr, _val) \
79 (*(u16 *)((u8 *)(_hdr) + 2) = _val) 85 (*(u16 *)((u8 *)(_hdr) + 2) = _val)
80#define SET_80211_PS_POLL_BSSID(_hdr, _val) \ 86#define SET_80211_PS_POLL_BSSID(_hdr, _val) \
81 memcpy(((u8 *)(_hdr)) + 4, (u8 *)(_val), ETH_ALEN) 87 ether_addr_copy(((u8 *)(_hdr)) + 4, (u8 *)(_val))
82#define SET_80211_PS_POLL_TA(_hdr, _val) \ 88#define SET_80211_PS_POLL_TA(_hdr, _val) \
83 memcpy(((u8 *)(_hdr)) + 10, (u8 *)(_val), ETH_ALEN) 89 ether_addr_copy(((u8 *)(_hdr))+10, (u8 *)(_val))
84 90
85#define SET_80211_HDR_DURATION(_hdr, _val) \ 91#define SET_80211_HDR_DURATION(_hdr, _val) \
86 (*(u16 *)((u8 *)(_hdr) + FRAME_OFFSET_DURATION) = le16_to_cpu(_val)) 92 (*(u16 *)((u8 *)(_hdr) + FRAME_OFFSET_DURATION) = le16_to_cpu(_val))
@@ -113,23 +119,27 @@ void rtl_init_rx_config(struct ieee80211_hw *hw);
113void rtl_init_rfkill(struct ieee80211_hw *hw); 119void rtl_init_rfkill(struct ieee80211_hw *hw);
114void rtl_deinit_rfkill(struct ieee80211_hw *hw); 120void rtl_deinit_rfkill(struct ieee80211_hw *hw);
115 121
116void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb); 122void rtl_watch_dog_timer_callback(unsigned long data);
117void rtl_deinit_deferred_work(struct ieee80211_hw *hw); 123void rtl_deinit_deferred_work(struct ieee80211_hw *hw);
118 124
119bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx); 125bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
126int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
127 bool isht, u8 desc_rate, bool first_ampdu);
128bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
120u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx); 129u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
121 130
131void rtl_beacon_statistic(struct ieee80211_hw *hw, struct sk_buff *skb);
122void rtl_watch_dog_timer_callback(unsigned long data); 132void rtl_watch_dog_timer_callback(unsigned long data);
123int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_sta *sta, 133int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
124 u16 tid, u16 *ssn); 134 struct ieee80211_sta *sta, u16 tid, u16 *ssn);
125int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_sta *sta, 135int rtl_tx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
126 u16 tid); 136 struct ieee80211_sta *sta, u16 tid);
127int rtl_tx_agg_oper(struct ieee80211_hw *hw, struct ieee80211_sta *sta, 137int rtl_tx_agg_oper(struct ieee80211_hw *hw,
128 u16 tid); 138 struct ieee80211_sta *sta, u16 tid);
129int rtl_rx_agg_start(struct ieee80211_hw *hw, struct ieee80211_sta *sta, 139int rtl_rx_agg_start(struct ieee80211_hw *hw,
130 u16 tid); 140 struct ieee80211_sta *sta, u16 tid);
131int rtl_rx_agg_stop(struct ieee80211_hw *hw, struct ieee80211_sta *sta, 141int rtl_rx_agg_stop(struct ieee80211_hw *hw,
132 u16 tid); 142 struct ieee80211_sta *sta, u16 tid);
133void rtl_watchdog_wq_callback(void *data); 143void rtl_watchdog_wq_callback(void *data);
134void rtl_fwevt_wq_callback(void *data); 144void rtl_fwevt_wq_callback(void *data);
135 145
@@ -139,19 +149,14 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw,
139 struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc); 149 struct sk_buff *skb, struct rtl_tcb_desc *tcb_desc);
140 150
141int rtl_send_smps_action(struct ieee80211_hw *hw, 151int rtl_send_smps_action(struct ieee80211_hw *hw,
142 struct ieee80211_sta *sta, 152 struct ieee80211_sta *sta,
143 enum ieee80211_smps_mode smps); 153 enum ieee80211_smps_mode smps);
144u8 *rtl_find_ie(u8 *data, unsigned int len, u8 ie); 154u8 *rtl_find_ie(u8 *data, unsigned int len, u8 ie);
145void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len); 155void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len);
146u8 rtl_tid_to_ac(u8 tid); 156u8 rtl_tid_to_ac(u8 tid);
147extern struct attribute_group rtl_attribute_group; 157extern struct attribute_group rtl_attribute_group;
148void rtl_easy_concurrent_retrytimer_callback(unsigned long data); 158void rtl_easy_concurrent_retrytimer_callback(unsigned long data);
149extern struct rtl_global_var rtl_global_var; 159extern struct rtl_global_var rtl_global_var;
150int rtlwifi_rate_mapping(struct ieee80211_hw *hw,
151 bool isht, u8 desc_rate, bool first_ampdu);
152bool rtl_tx_mgmt_proc(struct ieee80211_hw *hw, struct sk_buff *skb);
153struct sk_buff *rtl_make_del_ba(struct ieee80211_hw *hw,
154 u8 *sa, u8 *bssid, u16 tid);
155void rtl_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation); 160void rtl_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation);
156 161
157#endif 162#endif
diff --git a/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.c b/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.c
index fcf7459b5d66..b2791c893417 100644
--- a/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.c
+++ b/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.c
@@ -505,7 +505,7 @@ static void halbtc_write_1byte(void *bt_context, u32 reg_addr, u32 data)
505} 505}
506 506
507static void halbtc_bitmask_write_1byte(void *bt_context, u32 reg_addr, 507static void halbtc_bitmask_write_1byte(void *bt_context, u32 reg_addr,
508 u8 bit_mask, u8 data) 508 u32 bit_mask, u8 data)
509{ 509{
510 struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 510 struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context;
511 struct rtl_priv *rtlpriv = btcoexist->adapter; 511 struct rtl_priv *rtlpriv = btcoexist->adapter;
diff --git a/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.h b/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.h
index 1345545f66bc..0a903ea179ef 100644
--- a/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.h
+++ b/drivers/net/wireless/rtlwifi/btcoexist/halbtcoutsrc.h
@@ -359,7 +359,7 @@ typedef u32 (*bfp_btc_r4)(void *btc_context, u32 reg_addr);
359typedef void (*bfp_btc_w1)(void *btc_context, u32 reg_addr, u32 data); 359typedef void (*bfp_btc_w1)(void *btc_context, u32 reg_addr, u32 data);
360 360
361typedef void (*bfp_btc_w1_bit_mak)(void *btc_context, u32 reg_addr, 361typedef void (*bfp_btc_w1_bit_mak)(void *btc_context, u32 reg_addr,
362 u8 bit_mask, u8 data1b); 362 u32 bit_mask, u8 data1b);
363 363
364typedef void (*bfp_btc_w2)(void *btc_context, u32 reg_addr, u16 data); 364typedef void (*bfp_btc_w2)(void *btc_context, u32 reg_addr, u16 data);
365 365
diff --git a/drivers/net/wireless/rtlwifi/cam.c b/drivers/net/wireless/rtlwifi/cam.c
index 0276153c72cc..8fe8b4cfae6c 100644
--- a/drivers/net/wireless/rtlwifi/cam.c
+++ b/drivers/net/wireless/rtlwifi/cam.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -26,10 +22,9 @@
26 * Larry Finger <Larry.Finger@lwfinger.net> 22 * Larry Finger <Larry.Finger@lwfinger.net>
27 * 23 *
28 *****************************************************************************/ 24 *****************************************************************************/
29
30#include <linux/export.h>
31#include "wifi.h" 25#include "wifi.h"
32#include "cam.h" 26#include "cam.h"
27#include <linux/export.h>
33 28
34void rtl_cam_reset_sec_info(struct ieee80211_hw *hw) 29void rtl_cam_reset_sec_info(struct ieee80211_hw *hw)
35{ 30{
@@ -52,8 +47,8 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
52 u32 target_content = 0; 47 u32 target_content = 0;
53 u8 entry_i; 48 u8 entry_i;
54 49
55 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "key_cont_128: %6phC\n", 50 RT_PRINT_DATA(rtlpriv, COMP_SEC, DBG_DMESG, "Key content :",
56 key_cont_128); 51 key_cont_128, 16);
57 52
58 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) { 53 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
59 target_command = entry_i + CAM_CONTENT_COUNT * entry_no; 54 target_command = entry_i + CAM_CONTENT_COUNT * entry_no;
@@ -68,11 +63,13 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
68 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], 63 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM],
69 target_command); 64 target_command);
70 65
71 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE %x: %x\n", 66 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
67 "WRITE %x: %x\n",
72 rtlpriv->cfg->maps[WCAMI], target_content); 68 rtlpriv->cfg->maps[WCAMI], target_content);
73 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, 69 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
74 "The Key ID is %d\n", entry_no); 70 "The Key ID is %d\n", entry_no);
75 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE %x: %x\n", 71 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
72 "WRITE %x: %x\n",
76 rtlpriv->cfg->maps[RWCAM], target_command); 73 rtlpriv->cfg->maps[RWCAM], target_command);
77 74
78 } else if (entry_i == 1) { 75 } else if (entry_i == 1) {
@@ -87,10 +84,10 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
87 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM], 84 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[RWCAM],
88 target_command); 85 target_command);
89 86
90 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A4: %x\n", 87 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
91 target_content); 88 "WRITE A4: %x\n", target_content);
92 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A0: %x\n", 89 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
93 target_command); 90 "WRITE A0: %x\n", target_command);
94 91
95 } else { 92 } else {
96 93
@@ -107,15 +104,15 @@ static void rtl_cam_program_entry(struct ieee80211_hw *hw, u32 entry_no,
107 target_command); 104 target_command);
108 udelay(100); 105 udelay(100);
109 106
110 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A4: %x\n", 107 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
111 target_content); 108 "WRITE A4: %x\n", target_content);
112 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "WRITE A0: %x\n", 109 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
113 target_command); 110 "WRITE A0: %x\n", target_command);
114 } 111 }
115 } 112 }
116 113
117 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, "after set key, usconfig:%x\n", 114 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD,
118 us_config); 115 "after set key, usconfig:%x\n", us_config);
119} 116}
120 117
121u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr, 118u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
@@ -125,27 +122,26 @@ u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
125 u32 us_config; 122 u32 us_config;
126 struct rtl_priv *rtlpriv = rtl_priv(hw); 123 struct rtl_priv *rtlpriv = rtl_priv(hw);
127 124
128 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, 125 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
129 "EntryNo:%x, ulKeyId=%x, ulEncAlg=%x, ulUseDK=%x MacAddr %pM\n", 126 "EntryNo:%x, ulKeyId=%x, ulEncAlg=%x, ulUseDK=%x MacAddr %pM\n",
130 ul_entry_idx, ul_key_id, ul_enc_alg, 127 ul_entry_idx, ul_key_id, ul_enc_alg,
131 ul_default_key, mac_addr); 128 ul_default_key, mac_addr);
132 129
133 if (ul_key_id == TOTAL_CAM_ENTRY) { 130 if (ul_key_id == TOTAL_CAM_ENTRY) {
134 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 131 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
135 "<=== ulKeyId exceed!\n"); 132 "ulKeyId exceed!\n");
136 return 0; 133 return 0;
137 } 134 }
138 135
139 if (ul_default_key == 1) { 136 if (ul_default_key == 1)
140 us_config = CFG_VALID | ((u16) (ul_enc_alg) << 2); 137 us_config = CFG_VALID | ((u16) (ul_enc_alg) << 2);
141 } else { 138 else
142 us_config = CFG_VALID | ((ul_enc_alg) << 2) | ul_key_id; 139 us_config = CFG_VALID | ((ul_enc_alg) << 2) | ul_key_id;
143 }
144 140
145 rtl_cam_program_entry(hw, ul_entry_idx, mac_addr, 141 rtl_cam_program_entry(hw, ul_entry_idx, mac_addr,
146 key_content, us_config); 142 (u8 *)key_content, us_config);
147 143
148 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "<===\n"); 144 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "end\n");
149 145
150 return 1; 146 return 1;
151 147
@@ -289,7 +285,8 @@ u8 rtl_cam_get_free_entry(struct ieee80211_hw *hw, u8 *sta_addr)
289 u8 i, *addr; 285 u8 i, *addr;
290 286
291 if (NULL == sta_addr) { 287 if (NULL == sta_addr) {
292 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG, "sta_addr is NULL\n"); 288 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
289 "sta_addr is NULL.\n");
293 return TOTAL_CAM_ENTRY; 290 return TOTAL_CAM_ENTRY;
294 } 291 }
295 /* Does STA already exist? */ 292 /* Does STA already exist? */
@@ -322,7 +319,9 @@ void rtl_cam_del_entry(struct ieee80211_hw *hw, u8 *sta_addr)
322 u8 i, *addr; 319 u8 i, *addr;
323 320
324 if (NULL == sta_addr) { 321 if (NULL == sta_addr) {
325 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG, "sta_addr is NULL\n"); 322 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
323 "sta_addr is NULL.\n");
324 return;
326 } 325 }
327 326
328 if (is_zero_ether_addr(sta_addr)) { 327 if (is_zero_ether_addr(sta_addr)) {
@@ -339,8 +338,8 @@ void rtl_cam_del_entry(struct ieee80211_hw *hw, u8 *sta_addr)
339 /* Remove from HW Security CAM */ 338 /* Remove from HW Security CAM */
340 eth_zero_addr(rtlpriv->sec.hwsec_cam_sta_addr[i]); 339 eth_zero_addr(rtlpriv->sec.hwsec_cam_sta_addr[i]);
341 rtlpriv->sec.hwsec_cam_bitmap &= ~(BIT(0) << i); 340 rtlpriv->sec.hwsec_cam_bitmap &= ~(BIT(0) << i);
342 RT_TRACE(rtlpriv, COMP_SEC, DBG_LOUD, 341 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
343 "del CAM entry %d\n", i); 342 "&&&&&&&&&del entry %d\n", i);
344 } 343 }
345 } 344 }
346 return; 345 return;
diff --git a/drivers/net/wireless/rtlwifi/cam.h b/drivers/net/wireless/rtlwifi/cam.h
index 0105e6c1901e..35508087c0c5 100644
--- a/drivers/net/wireless/rtlwifi/cam.h
+++ b/drivers/net/wireless/rtlwifi/cam.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -36,15 +32,15 @@
36#define CFG_VALID BIT(15) 32#define CFG_VALID BIT(15)
37 33
38#define PAIRWISE_KEYIDX 0 34#define PAIRWISE_KEYIDX 0
39#define CAM_PAIRWISE_KEY_POSITION 4 35#define CAM_PAIRWISE_KEY_POSITION 4
40 36
41#define CAM_CONFIG_USEDK 1 37#define CAM_CONFIG_USEDK 1
42#define CAM_CONFIG_NO_USEDK 0 38#define CAM_CONFIG_NO_USEDK 0
43 39
44void rtl_cam_reset_all_entry(struct ieee80211_hw *hw); 40void rtl_cam_reset_all_entry(struct ieee80211_hw *hw);
45u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr, 41u8 rtl_cam_add_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
46 u32 ul_key_id, u32 ul_entry_idx, u32 ul_enc_alg, 42 u32 ul_key_id, u32 ul_entry_idx, u32 ul_enc_alg,
47 u32 ul_default_key, u8 *key_content); 43 u32 ul_default_key, u8 *key_content);
48int rtl_cam_delete_one_entry(struct ieee80211_hw *hw, u8 *mac_addr, 44int rtl_cam_delete_one_entry(struct ieee80211_hw *hw, u8 *mac_addr,
49 u32 ul_key_id); 45 u32 ul_key_id);
50void rtl_cam_mark_invalid(struct ieee80211_hw *hw, u8 uc_index); 46void rtl_cam_mark_invalid(struct ieee80211_hw *hw, u8 uc_index);
diff --git a/drivers/net/wireless/rtlwifi/core.c b/drivers/net/wireless/rtlwifi/core.c
index 56e218e0469c..f6179bc06086 100644
--- a/drivers/net/wireless/rtlwifi/core.c
+++ b/drivers/net/wireless/rtlwifi/core.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -31,10 +27,13 @@
31#include "core.h" 27#include "core.h"
32#include "cam.h" 28#include "cam.h"
33#include "base.h" 29#include "base.h"
34#include "pci.h"
35#include "ps.h" 30#include "ps.h"
31#include "pwrseqcmd.h"
36 32
33#include "btcoexist/rtl_btc.h"
34#include <linux/firmware.h>
37#include <linux/export.h> 35#include <linux/export.h>
36#include <net/cfg80211.h>
38 37
39void rtl_addr_delay(u32 addr) 38void rtl_addr_delay(u32 addr)
40{ 39{
@@ -103,7 +102,7 @@ void rtl_fw_cb(const struct firmware *firmware, void *context)
103 int err; 102 int err;
104 103
105 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD, 104 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
106 "Firmware callback routine entered!\n"); 105 "Firmware callback routine entered!\n");
107 complete(&rtlpriv->firmware_loading_complete); 106 complete(&rtlpriv->firmware_loading_complete);
108 if (!firmware) { 107 if (!firmware) {
109 if (rtlpriv->cfg->alt_fw_name) { 108 if (rtlpriv->cfg->alt_fw_name) {
@@ -129,26 +128,13 @@ found_alt:
129 memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size); 128 memcpy(rtlpriv->rtlhal.pfirmware, firmware->data, firmware->size);
130 rtlpriv->rtlhal.fwsize = firmware->size; 129 rtlpriv->rtlhal.fwsize = firmware->size;
131 release_firmware(firmware); 130 release_firmware(firmware);
132
133 err = ieee80211_register_hw(hw);
134 if (err) {
135 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
136 "Can't register mac80211 hw\n");
137 return;
138 } else {
139 rtlpriv->mac80211.mac80211_registered = 1;
140 }
141 set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
142
143 /*init rfkill */
144 rtl_init_rfkill(hw);
145} 131}
146EXPORT_SYMBOL(rtl_fw_cb); 132EXPORT_SYMBOL(rtl_fw_cb);
147 133
148/*mutex for start & stop is must here. */ 134/*mutex for start & stop is must here. */
149static int rtl_op_start(struct ieee80211_hw *hw) 135static int rtl_op_start(struct ieee80211_hw *hw)
150{ 136{
151 int err; 137 int err = 0;
152 struct rtl_priv *rtlpriv = rtl_priv(hw); 138 struct rtl_priv *rtlpriv = rtl_priv(hw);
153 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 139 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
154 140
@@ -170,28 +156,33 @@ static void rtl_op_stop(struct ieee80211_hw *hw)
170 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 156 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
171 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 157 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
172 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 158 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
159 bool support_remote_wakeup = false;
173 160
174 if (is_hal_stop(rtlhal)) 161 if (is_hal_stop(rtlhal))
175 return; 162 return;
176 163
164 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
165 (u8 *)(&support_remote_wakeup));
177 /* here is must, because adhoc do stop and start, 166 /* here is must, because adhoc do stop and start,
178 * but stop with RFOFF may cause something wrong, 167 * but stop with RFOFF may cause something wrong,
179 * like adhoc TP 168 * like adhoc TP
180 */ 169 */
181 if (unlikely(ppsc->rfpwr_state == ERFOFF)) { 170 if (unlikely(ppsc->rfpwr_state == ERFOFF))
182 rtl_ips_nic_on(hw); 171 rtl_ips_nic_on(hw);
183 }
184 172
185 mutex_lock(&rtlpriv->locks.conf_mutex); 173 mutex_lock(&rtlpriv->locks.conf_mutex);
174 /* if wowlan supported, DON'T clear connected info */
175 if (!(support_remote_wakeup &&
176 rtlhal->enter_pnp_sleep)) {
177 mac->link_state = MAC80211_NOLINK;
178 memset(mac->bssid, 0, 6);
179 mac->vendor = PEER_UNKNOWN;
186 180
187 mac->link_state = MAC80211_NOLINK; 181 /* reset sec info */
188 memset(mac->bssid, 0, ETH_ALEN); 182 rtl_cam_reset_sec_info(hw);
189 mac->vendor = PEER_UNKNOWN;
190
191 /*reset sec info */
192 rtl_cam_reset_sec_info(hw);
193 183
194 rtl_deinit_deferred_work(hw); 184 rtl_deinit_deferred_work(hw);
185 }
195 rtlpriv->intf_ops->adapter_stop(hw); 186 rtlpriv->intf_ops->adapter_stop(hw);
196 187
197 mutex_unlock(&rtlpriv->locks.conf_mutex); 188 mutex_unlock(&rtlpriv->locks.conf_mutex);
@@ -215,7 +206,6 @@ static void rtl_op_tx(struct ieee80211_hw *hw,
215 206
216 if (!rtlpriv->intf_ops->waitq_insert(hw, control->sta, skb)) 207 if (!rtlpriv->intf_ops->waitq_insert(hw, control->sta, skb))
217 rtlpriv->intf_ops->adapter_tx(hw, control->sta, skb, &tcb_desc); 208 rtlpriv->intf_ops->adapter_tx(hw, control->sta, skb, &tcb_desc);
218
219 return; 209 return;
220 210
221err_free: 211err_free:
@@ -229,18 +219,17 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
229 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 219 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
230 int err = 0; 220 int err = 0;
231 221
232 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
233
234 if (mac->vif) { 222 if (mac->vif) {
235 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 223 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
236 "vif has been set!! mac->vif = 0x%p\n", mac->vif); 224 "vif has been set!! mac->vif = 0x%p\n", mac->vif);
237 return -EOPNOTSUPP; 225 return -EOPNOTSUPP;
238 } 226 }
239 227
228 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER;
229
240 rtl_ips_nic_on(hw); 230 rtl_ips_nic_on(hw);
241 231
242 mutex_lock(&rtlpriv->locks.conf_mutex); 232 mutex_lock(&rtlpriv->locks.conf_mutex);
243
244 switch (ieee80211_vif_type_p2p(vif)) { 233 switch (ieee80211_vif_type_p2p(vif)) {
245 case NL80211_IFTYPE_P2P_CLIENT: 234 case NL80211_IFTYPE_P2P_CLIENT:
246 mac->p2p = P2P_ROLE_CLIENT; 235 mac->p2p = P2P_ROLE_CLIENT;
@@ -251,10 +240,8 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
251 "NL80211_IFTYPE_STATION\n"); 240 "NL80211_IFTYPE_STATION\n");
252 mac->beacon_enabled = 0; 241 mac->beacon_enabled = 0;
253 rtlpriv->cfg->ops->update_interrupt_mask(hw, 0, 242 rtlpriv->cfg->ops->update_interrupt_mask(hw, 0,
254 rtlpriv->cfg->maps 243 rtlpriv->cfg->maps[RTL_IBSS_INT_MASKS]);
255 [RTL_IBSS_INT_MASKS]);
256 } 244 }
257 mac->link_state = MAC80211_LINKED;
258 break; 245 break;
259 case NL80211_IFTYPE_ADHOC: 246 case NL80211_IFTYPE_ADHOC:
260 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 247 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
@@ -267,7 +254,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
267 else 254 else
268 mac->basic_rates = 0xff0; 255 mac->basic_rates = 0xff0;
269 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE, 256 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
270 (u8 *) (&mac->basic_rates)); 257 (u8 *)(&mac->basic_rates));
271 258
272 break; 259 break;
273 case NL80211_IFTYPE_P2P_GO: 260 case NL80211_IFTYPE_P2P_GO:
@@ -284,7 +271,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
284 else 271 else
285 mac->basic_rates = 0xff0; 272 mac->basic_rates = 0xff0;
286 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE, 273 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE,
287 (u8 *) (&mac->basic_rates)); 274 (u8 *)(&mac->basic_rates));
288 break; 275 break;
289 case NL80211_IFTYPE_MESH_POINT: 276 case NL80211_IFTYPE_MESH_POINT:
290 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 277 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
@@ -301,7 +288,7 @@ static int rtl_op_add_interface(struct ieee80211_hw *hw,
301 break; 288 break;
302 default: 289 default:
303 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 290 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
304 "operation mode %d is not supported!\n", vif->type); 291 "operation mode %d is not support!\n", vif->type);
305 err = -EOPNOTSUPP; 292 err = -EOPNOTSUPP;
306 goto out; 293 goto out;
307 } 294 }
@@ -339,8 +326,7 @@ static void rtl_op_remove_interface(struct ieee80211_hw *hw,
339 if (mac->beacon_enabled == 1) { 326 if (mac->beacon_enabled == 1) {
340 mac->beacon_enabled = 0; 327 mac->beacon_enabled = 0;
341 rtlpriv->cfg->ops->update_interrupt_mask(hw, 0, 328 rtlpriv->cfg->ops->update_interrupt_mask(hw, 0,
342 rtlpriv->cfg->maps 329 rtlpriv->cfg->maps[RTL_IBSS_INT_MASKS]);
343 [RTL_IBSS_INT_MASKS]);
344 } 330 }
345 } 331 }
346 332
@@ -355,12 +341,12 @@ static void rtl_op_remove_interface(struct ieee80211_hw *hw,
355 mac->vendor = PEER_UNKNOWN; 341 mac->vendor = PEER_UNKNOWN;
356 mac->opmode = NL80211_IFTYPE_UNSPECIFIED; 342 mac->opmode = NL80211_IFTYPE_UNSPECIFIED;
357 rtlpriv->cfg->ops->set_network_type(hw, mac->opmode); 343 rtlpriv->cfg->ops->set_network_type(hw, mac->opmode);
344
358 mutex_unlock(&rtlpriv->locks.conf_mutex); 345 mutex_unlock(&rtlpriv->locks.conf_mutex);
359} 346}
360
361static int rtl_op_change_interface(struct ieee80211_hw *hw, 347static int rtl_op_change_interface(struct ieee80211_hw *hw,
362 struct ieee80211_vif *vif, 348 struct ieee80211_vif *vif,
363 enum nl80211_iftype new_type, bool p2p) 349 enum nl80211_iftype new_type, bool p2p)
364{ 350{
365 struct rtl_priv *rtlpriv = rtl_priv(hw); 351 struct rtl_priv *rtlpriv = rtl_priv(hw);
366 int ret; 352 int ret;
@@ -370,10 +356,221 @@ static int rtl_op_change_interface(struct ieee80211_hw *hw,
370 vif->p2p = p2p; 356 vif->p2p = p2p;
371 ret = rtl_op_add_interface(hw, vif); 357 ret = rtl_op_add_interface(hw, vif);
372 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 358 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
373 "p2p %x\n", p2p); 359 "p2p %x\n", p2p);
374 return ret; 360 return ret;
375} 361}
376 362
363#ifdef CONFIG_PM
364static u16 crc16_ccitt(u8 data, u16 crc)
365{
366 u8 shift_in, data_bit, crc_bit11, crc_bit4, crc_bit15;
367 u8 i;
368 u16 result;
369
370 for (i = 0; i < 8; i++) {
371 crc_bit15 = ((crc & BIT(15)) ? 1 : 0);
372 data_bit = (data & (BIT(0) << i) ? 1 : 0);
373 shift_in = crc_bit15 ^ data_bit;
374
375 result = crc << 1;
376 if (shift_in == 0)
377 result &= (~BIT(0));
378 else
379 result |= BIT(0);
380
381 crc_bit11 = ((crc & BIT(11)) ? 1 : 0) ^ shift_in;
382 if (crc_bit11 == 0)
383 result &= (~BIT(12));
384 else
385 result |= BIT(12);
386
387 crc_bit4 = ((crc & BIT(4)) ? 1 : 0) ^ shift_in;
388 if (crc_bit4 == 0)
389 result &= (~BIT(5));
390 else
391 result |= BIT(5);
392
393 crc = result;
394 }
395
396 return crc;
397}
398
399static u16 _calculate_wol_pattern_crc(u8 *pattern, u16 len)
400{
401 u16 crc = 0xffff;
402 u32 i;
403
404 for (i = 0; i < len; i++)
405 crc = crc16_ccitt(pattern[i], crc);
406
407 crc = ~crc;
408
409 return crc;
410}
411
412static void _rtl_add_wowlan_patterns(struct ieee80211_hw *hw,
413 struct cfg80211_wowlan *wow)
414{
415 struct rtl_priv *rtlpriv = rtl_priv(hw);
416 struct rtl_mac *mac = &rtlpriv->mac80211;
417 struct cfg80211_pkt_pattern *patterns = wow->patterns;
418 struct rtl_wow_pattern rtl_pattern;
419 const u8 *pattern_os, *mask_os;
420 u8 mask[MAX_WOL_BIT_MASK_SIZE] = {0};
421 u8 content[MAX_WOL_PATTERN_SIZE] = {0};
422 u8 broadcast_addr[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
423 u8 multicast_addr1[2] = {0x33, 0x33};
424 u8 multicast_addr2[3] = {0x01, 0x00, 0x5e};
425 u8 i, mask_len;
426 u16 j, len;
427
428 for (i = 0; i < wow->n_patterns; i++) {
429 memset(&rtl_pattern, 0, sizeof(struct rtl_wow_pattern));
430 memset(mask, 0, MAX_WOL_BIT_MASK_SIZE);
431 if (patterns[i].pattern_len > MAX_WOL_PATTERN_SIZE) {
432 RT_TRACE(rtlpriv, COMP_POWER, DBG_WARNING,
433 "Pattern[%d] is too long\n", i);
434 continue;
435 }
436 pattern_os = patterns[i].pattern;
437 mask_len = DIV_ROUND_UP(patterns[i].pattern_len, 8);
438 mask_os = patterns[i].mask;
439 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
440 "pattern content\n", pattern_os,
441 patterns[i].pattern_len);
442 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
443 "mask content\n", mask_os, mask_len);
444 /* 1. unicast? multicast? or broadcast? */
445 if (memcmp(pattern_os, broadcast_addr, 6) == 0)
446 rtl_pattern.type = BROADCAST_PATTERN;
447 else if (memcmp(pattern_os, multicast_addr1, 2) == 0 ||
448 memcmp(pattern_os, multicast_addr2, 3) == 0)
449 rtl_pattern.type = MULTICAST_PATTERN;
450 else if (memcmp(pattern_os, mac->mac_addr, 6) == 0)
451 rtl_pattern.type = UNICAST_PATTERN;
452 else
453 rtl_pattern.type = UNKNOWN_TYPE;
454
455 /* 2. translate mask_from_os to mask_for_hw */
456
457/******************************************************************************
458 * pattern from OS uses 'ethenet frame', like this:
459
460 | 6 | 6 | 2 | 20 | Variable | 4 |
461 |--------+--------+------+-----------+------------+-----|
462 | 802.3 Mac Header | IP Header | TCP Packet | FCS |
463 | DA | SA | Type |
464
465 * BUT, packet catched by our HW is in '802.11 frame', begin from LLC,
466
467 | 24 or 30 | 6 | 2 | 20 | Variable | 4 |
468 |-------------------+--------+------+-----------+------------+-----|
469 | 802.11 MAC Header | LLC | IP Header | TCP Packet | FCS |
470 | Others | Tpye |
471
472 * Therefore, we need translate mask_from_OS to mask_to_hw.
473 * We should left-shift mask by 6 bits, then set the new bit[0~5] = 0,
474 * because new mask[0~5] means 'SA', but our HW packet begins from LLC,
475 * bit[0~5] corresponds to first 6 Bytes in LLC, they just don't match.
476 ******************************************************************************/
477
478 /* Shift 6 bits */
479 for (j = 0; j < mask_len - 1; j++) {
480 mask[j] = mask_os[j] >> 6;
481 mask[j] |= (mask_os[j + 1] & 0x3F) << 2;
482 }
483 mask[j] = (mask_os[j] >> 6) & 0x3F;
484 /* Set bit 0-5 to zero */
485 mask[0] &= 0xC0;
486
487 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
488 "mask to hw\n", mask, mask_len);
489 for (j = 0; j < (MAX_WOL_BIT_MASK_SIZE + 1) / 4; j++) {
490 rtl_pattern.mask[j] = mask[j * 4];
491 rtl_pattern.mask[j] |= (mask[j * 4 + 1] << 8);
492 rtl_pattern.mask[j] |= (mask[j * 4 + 2] << 16);
493 rtl_pattern.mask[j] |= (mask[j * 4 + 3] << 24);
494 }
495
496 /* To get the wake up pattern from the mask.
497 * We do not count first 12 bits which means
498 * DA[6] and SA[6] in the pattern to match HW design.
499 */
500 len = 0;
501 for (j = 12; j < patterns[i].pattern_len; j++) {
502 if ((mask_os[j / 8] >> (j % 8)) & 0x01) {
503 content[len] = pattern_os[j];
504 len++;
505 }
506 }
507
508 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
509 "pattern to hw\n", content, len);
510 /* 3. calculate crc */
511 rtl_pattern.crc = _calculate_wol_pattern_crc(content, len);
512 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
513 "CRC_Remainder = 0x%x", rtl_pattern.crc);
514
515 /* 4. write crc & mask_for_hw to hw */
516 rtlpriv->cfg->ops->add_wowlan_pattern(hw, &rtl_pattern, i);
517 }
518 rtl_write_byte(rtlpriv, 0x698, wow->n_patterns);
519}
520
521static int rtl_op_suspend(struct ieee80211_hw *hw,
522 struct cfg80211_wowlan *wow)
523{
524 struct rtl_priv *rtlpriv = rtl_priv(hw);
525 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
526 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
527 struct timeval ts;
528
529 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "\n");
530 if (WARN_ON(!wow))
531 return -EINVAL;
532
533 /* to resolve s4 can not wake up*/
534 do_gettimeofday(&ts);
535 rtlhal->last_suspend_sec = ts.tv_sec;
536
537 if ((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) && wow->n_patterns)
538 _rtl_add_wowlan_patterns(hw, wow);
539
540 rtlhal->driver_is_goingto_unload = true;
541 rtlhal->enter_pnp_sleep = true;
542
543 rtl_lps_leave(hw);
544 rtl_op_stop(hw);
545 device_set_wakeup_enable(wiphy_dev(hw->wiphy), true);
546 return 0;
547}
548
549static int rtl_op_resume(struct ieee80211_hw *hw)
550{
551 struct rtl_priv *rtlpriv = rtl_priv(hw);
552 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
553 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
554 struct timeval ts;
555
556 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, "\n");
557 rtlhal->driver_is_goingto_unload = false;
558 rtlhal->enter_pnp_sleep = false;
559 rtlhal->wake_from_pnp_sleep = true;
560
561 /* to resovle s4 can not wake up*/
562 do_gettimeofday(&ts);
563 if (ts.tv_sec - rtlhal->last_suspend_sec < 5)
564 return -1;
565
566 rtl_op_start(hw);
567 device_set_wakeup_enable(wiphy_dev(hw->wiphy), false);
568 ieee80211_resume_disconnect(mac->vif);
569 rtlhal->wake_from_pnp_sleep = false;
570 return 0;
571}
572#endif
573
377static int rtl_op_config(struct ieee80211_hw *hw, u32 changed) 574static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
378{ 575{
379 struct rtl_priv *rtlpriv = rtl_priv(hw); 576 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -386,7 +583,7 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
386 return 1; 583 return 1;
387 584
388 mutex_lock(&rtlpriv->locks.conf_mutex); 585 mutex_lock(&rtlpriv->locks.conf_mutex);
389 if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) { /*BIT(2)*/ 586 if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) { /* BIT(2)*/
390 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 587 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
391 "IEEE80211_CONF_CHANGE_LISTEN_INTERVAL\n"); 588 "IEEE80211_CONF_CHANGE_LISTEN_INTERVAL\n");
392 } 589 }
@@ -421,8 +618,8 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
421 * is worked very well */ 618 * is worked very well */
422 if (!rtlpriv->psc.multi_buffered) 619 if (!rtlpriv->psc.multi_buffered)
423 queue_delayed_work(rtlpriv->works.rtl_wq, 620 queue_delayed_work(rtlpriv->works.rtl_wq,
424 &rtlpriv->works.ps_work, 621 &rtlpriv->works.ps_work,
425 MSECS(5)); 622 MSECS(5));
426 } else { 623 } else {
427 rtl_swlps_rf_awake(hw); 624 rtl_swlps_rf_awake(hw);
428 rtlpriv->psc.sw_ps_enabled = false; 625 rtlpriv->psc.sw_ps_enabled = false;
@@ -436,20 +633,26 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
436 mac->retry_long = hw->conf.long_frame_max_tx_count; 633 mac->retry_long = hw->conf.long_frame_max_tx_count;
437 mac->retry_short = hw->conf.long_frame_max_tx_count; 634 mac->retry_short = hw->conf.long_frame_max_tx_count;
438 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RETRY_LIMIT, 635 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RETRY_LIMIT,
439 (u8 *) (&hw->conf. 636 (u8 *)(&hw->conf.long_frame_max_tx_count));
440 long_frame_max_tx_count));
441 } 637 }
442 638
443 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 639 if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
640 !rtlpriv->proximity.proxim_on) {
444 struct ieee80211_channel *channel = hw->conf.chandef.chan; 641 struct ieee80211_channel *channel = hw->conf.chandef.chan;
642 enum nl80211_chan_width width = hw->conf.chandef.width;
643 enum nl80211_channel_type channel_type = NL80211_CHAN_NO_HT;
445 u8 wide_chan = (u8) channel->hw_value; 644 u8 wide_chan = (u8) channel->hw_value;
446 645
646 /* channel_type is for 20&40M */
647 if (width < NL80211_CHAN_WIDTH_80)
648 channel_type =
649 cfg80211_get_chandef_type(&hw->conf.chandef);
447 if (mac->act_scanning) 650 if (mac->act_scanning)
448 mac->n_channels++; 651 mac->n_channels++;
449 652
450 if (rtlpriv->dm.supp_phymode_switch && 653 if (rtlpriv->dm.supp_phymode_switch &&
451 mac->link_state < MAC80211_LINKED && 654 mac->link_state < MAC80211_LINKED &&
452 !mac->act_scanning) { 655 !mac->act_scanning) {
453 if (rtlpriv->cfg->ops->chk_switch_dmdp) 656 if (rtlpriv->cfg->ops->chk_switch_dmdp)
454 rtlpriv->cfg->ops->chk_switch_dmdp(hw); 657 rtlpriv->cfg->ops->chk_switch_dmdp(hw);
455 } 658 }
@@ -463,48 +666,98 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
463 *info for cisco1253 bw20, so we modify 666 *info for cisco1253 bw20, so we modify
464 *it here based on UPPER & LOWER 667 *it here based on UPPER & LOWER
465 */ 668 */
466 switch (cfg80211_get_chandef_type(&hw->conf.chandef)) { 669
467 case NL80211_CHAN_HT20: 670 if (width >= NL80211_CHAN_WIDTH_80) {
468 case NL80211_CHAN_NO_HT: 671 if (width == NL80211_CHAN_WIDTH_80) {
469 /* SC */ 672 u32 center = hw->conf.chandef.center_freq1;
470 mac->cur_40_prime_sc = 673 u32 primary =
471 PRIME_CHNL_OFFSET_DONT_CARE; 674 (u32)hw->conf.chandef.chan->center_freq;
472 rtlphy->current_chan_bw = HT_CHANNEL_WIDTH_20; 675
473 mac->bw_40 = false; 676 rtlphy->current_chan_bw =
474 break; 677 HT_CHANNEL_WIDTH_80;
475 case NL80211_CHAN_HT40MINUS: 678 mac->bw_80 = true;
476 /* SC */ 679 mac->bw_40 = true;
477 mac->cur_40_prime_sc = PRIME_CHNL_OFFSET_UPPER; 680 if (center > primary) {
478 rtlphy->current_chan_bw = 681 mac->cur_80_prime_sc =
479 HT_CHANNEL_WIDTH_20_40; 682 PRIME_CHNL_OFFSET_LOWER;
480 mac->bw_40 = true; 683 if (center - primary == 10) {
481 684 mac->cur_40_prime_sc =
482 /*wide channel */ 685 PRIME_CHNL_OFFSET_UPPER;
483 wide_chan -= 2; 686
484 687 wide_chan += 2;
485 break; 688 } else if (center - primary == 30) {
486 case NL80211_CHAN_HT40PLUS: 689 mac->cur_40_prime_sc =
487 /* SC */ 690 PRIME_CHNL_OFFSET_LOWER;
488 mac->cur_40_prime_sc = PRIME_CHNL_OFFSET_LOWER; 691
489 rtlphy->current_chan_bw = 692 wide_chan += 6;
490 HT_CHANNEL_WIDTH_20_40; 693 }
491 mac->bw_40 = true; 694 } else {
492 695 mac->cur_80_prime_sc =
493 /*wide channel */ 696 PRIME_CHNL_OFFSET_UPPER;
494 wide_chan += 2; 697 if (primary - center == 10) {
495 698 mac->cur_40_prime_sc =
496 break; 699 PRIME_CHNL_OFFSET_LOWER;
497 default: 700
498 mac->bw_40 = false; 701 wide_chan -= 2;
499 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 702 } else if (primary - center == 30) {
500 "switch case not processed\n"); 703 mac->cur_40_prime_sc =
501 break; 704 PRIME_CHNL_OFFSET_UPPER;
705
706 wide_chan -= 6;
707 }
708 }
709 }
710 } else {
711 switch (channel_type) {
712 case NL80211_CHAN_HT20:
713 case NL80211_CHAN_NO_HT:
714 /* SC */
715 mac->cur_40_prime_sc =
716 PRIME_CHNL_OFFSET_DONT_CARE;
717 rtlphy->current_chan_bw =
718 HT_CHANNEL_WIDTH_20;
719 mac->bw_40 = false;
720 mac->bw_80 = false;
721 break;
722 case NL80211_CHAN_HT40MINUS:
723 /* SC */
724 mac->cur_40_prime_sc =
725 PRIME_CHNL_OFFSET_UPPER;
726 rtlphy->current_chan_bw =
727 HT_CHANNEL_WIDTH_20_40;
728 mac->bw_40 = true;
729 mac->bw_80 = false;
730
731 /*wide channel */
732 wide_chan -= 2;
733
734 break;
735 case NL80211_CHAN_HT40PLUS:
736 /* SC */
737 mac->cur_40_prime_sc =
738 PRIME_CHNL_OFFSET_LOWER;
739 rtlphy->current_chan_bw =
740 HT_CHANNEL_WIDTH_20_40;
741 mac->bw_40 = true;
742 mac->bw_80 = false;
743
744 /*wide channel */
745 wide_chan += 2;
746
747 break;
748 default:
749 mac->bw_40 = false;
750 mac->bw_80 = false;
751 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
752 "switch case not processed\n");
753 break;
754 }
502 } 755 }
503 756
504 if (wide_chan <= 0) 757 if (wide_chan <= 0)
505 wide_chan = 1; 758 wide_chan = 1;
506 759
507 /* In scanning, before we go offchannel we may send a ps = 1 760 /* In scanning, when before we offchannel we may send a ps=1
508 * null to AP, and then we may send a ps = 0 null to AP quickly, 761 * null to AP, and then we may send a ps = 0 null to AP quickly,
509 * but first null may have caused AP to put lots of packet to 762 * but first null may have caused AP to put lots of packet to
510 * hw tx buffer. These packets must be tx'd before we go off 763 * hw tx buffer. These packets must be tx'd before we go off
@@ -516,12 +769,12 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
516 rtlpriv->mac80211.offchan_delay = false; 769 rtlpriv->mac80211.offchan_delay = false;
517 mdelay(50); 770 mdelay(50);
518 } 771 }
772
519 rtlphy->current_channel = wide_chan; 773 rtlphy->current_channel = wide_chan;
520 774
521 rtlpriv->cfg->ops->switch_channel(hw); 775 rtlpriv->cfg->ops->switch_channel(hw);
522 rtlpriv->cfg->ops->set_channel_access(hw); 776 rtlpriv->cfg->ops->set_channel_access(hw);
523 rtlpriv->cfg->ops->set_bw_mode(hw, 777 rtlpriv->cfg->ops->set_bw_mode(hw, channel_type);
524 cfg80211_get_chandef_type(&hw->conf.chandef));
525 } 778 }
526 779
527 mutex_unlock(&rtlpriv->locks.conf_mutex); 780 mutex_unlock(&rtlpriv->locks.conf_mutex);
@@ -530,45 +783,25 @@ static int rtl_op_config(struct ieee80211_hw *hw, u32 changed)
530} 783}
531 784
532static void rtl_op_configure_filter(struct ieee80211_hw *hw, 785static void rtl_op_configure_filter(struct ieee80211_hw *hw,
533 unsigned int changed_flags, 786 unsigned int changed_flags,
534 unsigned int *new_flags, u64 multicast) 787 unsigned int *new_flags, u64 multicast)
535{ 788{
536 struct rtl_priv *rtlpriv = rtl_priv(hw); 789 struct rtl_priv *rtlpriv = rtl_priv(hw);
537 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 790 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
538 u32 rx_conf;
539 791
540 *new_flags &= RTL_SUPPORTED_FILTERS; 792 *new_flags &= RTL_SUPPORTED_FILTERS;
541 if (!changed_flags) 793 if (0 == changed_flags)
542 return; 794 return;
543 795
544 /* if ssid not set to hw don't check bssid
545 * here just used for linked scanning, & linked
546 * and nolink check bssid is set in set network_type */
547 if ((changed_flags & FIF_BCN_PRBRESP_PROMISC) &&
548 (mac->link_state >= MAC80211_LINKED)) {
549 if (mac->opmode != NL80211_IFTYPE_AP &&
550 mac->opmode != NL80211_IFTYPE_MESH_POINT) {
551 if (*new_flags & FIF_BCN_PRBRESP_PROMISC) {
552 rtlpriv->cfg->ops->set_chk_bssid(hw, false);
553 } else {
554 rtlpriv->cfg->ops->set_chk_bssid(hw, true);
555 }
556 }
557 }
558
559 /* must be called after set_chk_bssid since that function modifies the
560 * RCR register too. */
561 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *)(&rx_conf));
562
563 /*TODO: we disable broadcase now, so enable here */ 796 /*TODO: we disable broadcase now, so enable here */
564 if (changed_flags & FIF_ALLMULTI) { 797 if (changed_flags & FIF_ALLMULTI) {
565 if (*new_flags & FIF_ALLMULTI) { 798 if (*new_flags & FIF_ALLMULTI) {
566 rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AM] | 799 mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AM] |
567 rtlpriv->cfg->maps[MAC_RCR_AB]; 800 rtlpriv->cfg->maps[MAC_RCR_AB];
568 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 801 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
569 "Enable receive multicast frame\n"); 802 "Enable receive multicast frame\n");
570 } else { 803 } else {
571 rx_conf &= ~(rtlpriv->cfg->maps[MAC_RCR_AM] | 804 mac->rx_conf &= ~(rtlpriv->cfg->maps[MAC_RCR_AM] |
572 rtlpriv->cfg->maps[MAC_RCR_AB]); 805 rtlpriv->cfg->maps[MAC_RCR_AB]);
573 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 806 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
574 "Disable receive multicast frame\n"); 807 "Disable receive multicast frame\n");
@@ -577,43 +810,55 @@ static void rtl_op_configure_filter(struct ieee80211_hw *hw,
577 810
578 if (changed_flags & FIF_FCSFAIL) { 811 if (changed_flags & FIF_FCSFAIL) {
579 if (*new_flags & FIF_FCSFAIL) { 812 if (*new_flags & FIF_FCSFAIL) {
580 rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACRC32]; 813 mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACRC32];
581 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 814 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
582 "Enable receive FCS error frame\n"); 815 "Enable receive FCS error frame\n");
583 } else { 816 } else {
584 rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACRC32]; 817 mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACRC32];
585 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 818 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
586 "Disable receive FCS error frame\n"); 819 "Disable receive FCS error frame\n");
587 } 820 }
588 } 821 }
589 822
823 /* if ssid not set to hw don't check bssid
824 * here just used for linked scanning, & linked
825 * and nolink check bssid is set in set network_type
826 */
827 if ((changed_flags & FIF_BCN_PRBRESP_PROMISC) &&
828 (mac->link_state >= MAC80211_LINKED)) {
829 if (mac->opmode != NL80211_IFTYPE_AP &&
830 mac->opmode != NL80211_IFTYPE_MESH_POINT) {
831 if (*new_flags & FIF_BCN_PRBRESP_PROMISC)
832 rtlpriv->cfg->ops->set_chk_bssid(hw, false);
833 else
834 rtlpriv->cfg->ops->set_chk_bssid(hw, true);
835 }
836 }
590 837
591 if (changed_flags & FIF_CONTROL) { 838 if (changed_flags & FIF_CONTROL) {
592 if (*new_flags & FIF_CONTROL) { 839 if (*new_flags & FIF_CONTROL) {
593 rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACF]; 840 mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_ACF];
594 841
595 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 842 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
596 "Enable receive control frame\n"); 843 "Enable receive control frame.\n");
597 } else { 844 } else {
598 rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACF]; 845 mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_ACF];
599 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 846 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
600 "Disable receive control frame\n"); 847 "Disable receive control frame.\n");
601 } 848 }
602 } 849 }
603 850
604 if (changed_flags & FIF_OTHER_BSS) { 851 if (changed_flags & FIF_OTHER_BSS) {
605 if (*new_flags & FIF_OTHER_BSS) { 852 if (*new_flags & FIF_OTHER_BSS) {
606 rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AAP]; 853 mac->rx_conf |= rtlpriv->cfg->maps[MAC_RCR_AAP];
607 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 854 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
608 "Enable receive other BSS's frame\n"); 855 "Enable receive other BSS's frame.\n");
609 } else { 856 } else {
610 rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_AAP]; 857 mac->rx_conf &= ~rtlpriv->cfg->maps[MAC_RCR_AAP];
611 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 858 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
612 "Disable receive other BSS's frame\n"); 859 "Disable receive other BSS's frame.\n");
613 } 860 }
614 } 861 }
615
616 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, (u8 *)(&rx_conf));
617} 862}
618static int rtl_op_sta_add(struct ieee80211_hw *hw, 863static int rtl_op_sta_add(struct ieee80211_hw *hw,
619 struct ieee80211_vif *vif, 864 struct ieee80211_vif *vif,
@@ -625,7 +870,7 @@ static int rtl_op_sta_add(struct ieee80211_hw *hw,
625 struct rtl_sta_info *sta_entry; 870 struct rtl_sta_info *sta_entry;
626 871
627 if (sta) { 872 if (sta) {
628 sta_entry = (struct rtl_sta_info *) sta->drv_priv; 873 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
629 spin_lock_bh(&rtlpriv->locks.entry_list_lock); 874 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
630 list_add_tail(&sta_entry->list, &rtlpriv->entry_list); 875 list_add_tail(&sta_entry->list, &rtlpriv->entry_list);
631 spin_unlock_bh(&rtlpriv->locks.entry_list_lock); 876 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
@@ -633,15 +878,17 @@ static int rtl_op_sta_add(struct ieee80211_hw *hw,
633 sta_entry->wireless_mode = WIRELESS_MODE_G; 878 sta_entry->wireless_mode = WIRELESS_MODE_G;
634 if (sta->supp_rates[0] <= 0xf) 879 if (sta->supp_rates[0] <= 0xf)
635 sta_entry->wireless_mode = WIRELESS_MODE_B; 880 sta_entry->wireless_mode = WIRELESS_MODE_B;
636 if (sta->ht_cap.ht_supported == true) 881 if (sta->ht_cap.ht_supported)
637 sta_entry->wireless_mode = WIRELESS_MODE_N_24G; 882 sta_entry->wireless_mode = WIRELESS_MODE_N_24G;
638 883
639 if (vif->type == NL80211_IFTYPE_ADHOC) 884 if (vif->type == NL80211_IFTYPE_ADHOC)
640 sta_entry->wireless_mode = WIRELESS_MODE_G; 885 sta_entry->wireless_mode = WIRELESS_MODE_G;
641 } else if (rtlhal->current_bandtype == BAND_ON_5G) { 886 } else if (rtlhal->current_bandtype == BAND_ON_5G) {
642 sta_entry->wireless_mode = WIRELESS_MODE_A; 887 sta_entry->wireless_mode = WIRELESS_MODE_A;
643 if (sta->ht_cap.ht_supported == true) 888 if (sta->ht_cap.ht_supported)
644 sta_entry->wireless_mode = WIRELESS_MODE_N_24G; 889 sta_entry->wireless_mode = WIRELESS_MODE_N_5G;
890 if (sta->vht_cap.vht_supported)
891 sta_entry->wireless_mode = WIRELESS_MODE_AC_5G;
645 892
646 if (vif->type == NL80211_IFTYPE_ADHOC) 893 if (vif->type == NL80211_IFTYPE_ADHOC)
647 sta_entry->wireless_mode = WIRELESS_MODE_A; 894 sta_entry->wireless_mode = WIRELESS_MODE_A;
@@ -652,9 +899,10 @@ static int rtl_op_sta_add(struct ieee80211_hw *hw,
652 899
653 memcpy(sta_entry->mac_addr, sta->addr, ETH_ALEN); 900 memcpy(sta_entry->mac_addr, sta->addr, ETH_ALEN);
654 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, 901 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
655 "Add sta addr is %pM\n", sta->addr); 902 "Add sta addr is %pM\n", sta->addr);
656 rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0); 903 rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
657 } 904 }
905
658 return 0; 906 return 0;
659} 907}
660 908
@@ -667,17 +915,15 @@ static int rtl_op_sta_remove(struct ieee80211_hw *hw,
667 if (sta) { 915 if (sta) {
668 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, 916 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
669 "Remove sta addr is %pM\n", sta->addr); 917 "Remove sta addr is %pM\n", sta->addr);
670 sta_entry = (struct rtl_sta_info *) sta->drv_priv; 918 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
671 sta_entry->wireless_mode = 0; 919 sta_entry->wireless_mode = 0;
672 sta_entry->ratr_index = 0; 920 sta_entry->ratr_index = 0;
673
674 spin_lock_bh(&rtlpriv->locks.entry_list_lock); 921 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
675 list_del(&sta_entry->list); 922 list_del(&sta_entry->list);
676 spin_unlock_bh(&rtlpriv->locks.entry_list_lock); 923 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
677 } 924 }
678 return 0; 925 return 0;
679} 926}
680
681static int _rtl_get_hal_qnum(u16 queue) 927static int _rtl_get_hal_qnum(u16 queue)
682{ 928{
683 int qnum; 929 int qnum;
@@ -707,8 +953,8 @@ static int _rtl_get_hal_qnum(u16 queue)
707 *for rtl819x BE = 0, BK = 1, VI = 2, VO = 3 953 *for rtl819x BE = 0, BK = 1, VI = 2, VO = 3
708 */ 954 */
709static int rtl_op_conf_tx(struct ieee80211_hw *hw, 955static int rtl_op_conf_tx(struct ieee80211_hw *hw,
710 struct ieee80211_vif *vif, u16 queue, 956 struct ieee80211_vif *vif, u16 queue,
711 const struct ieee80211_tx_queue_params *param) 957 const struct ieee80211_tx_queue_params *param)
712{ 958{
713 struct rtl_priv *rtlpriv = rtl_priv(hw); 959 struct rtl_priv *rtlpriv = rtl_priv(hw);
714 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 960 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -731,14 +977,14 @@ static int rtl_op_conf_tx(struct ieee80211_hw *hw,
731} 977}
732 978
733static void rtl_op_bss_info_changed(struct ieee80211_hw *hw, 979static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
734 struct ieee80211_vif *vif, 980 struct ieee80211_vif *vif,
735 struct ieee80211_bss_conf *bss_conf, u32 changed) 981 struct ieee80211_bss_conf *bss_conf,
982 u32 changed)
736{ 983{
737 struct rtl_priv *rtlpriv = rtl_priv(hw); 984 struct rtl_priv *rtlpriv = rtl_priv(hw);
738 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 985 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
739 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 986 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
740 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 987 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
741 struct ieee80211_sta *sta = NULL;
742 988
743 mutex_lock(&rtlpriv->locks.conf_mutex); 989 mutex_lock(&rtlpriv->locks.conf_mutex);
744 if ((vif->type == NL80211_IFTYPE_ADHOC) || 990 if ((vif->type == NL80211_IFTYPE_ADHOC) ||
@@ -756,15 +1002,14 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
756 mac->beacon_enabled = 1; 1002 mac->beacon_enabled = 1;
757 rtlpriv->cfg->ops->update_interrupt_mask(hw, 1003 rtlpriv->cfg->ops->update_interrupt_mask(hw,
758 rtlpriv->cfg->maps 1004 rtlpriv->cfg->maps
759 [RTL_IBSS_INT_MASKS], 1005 [RTL_IBSS_INT_MASKS], 0);
760 0);
761 1006
762 if (rtlpriv->cfg->ops->linked_set_reg) 1007 if (rtlpriv->cfg->ops->linked_set_reg)
763 rtlpriv->cfg->ops->linked_set_reg(hw); 1008 rtlpriv->cfg->ops->linked_set_reg(hw);
764 } 1009 }
765 } 1010 }
766 if ((changed & BSS_CHANGED_BEACON_ENABLED && 1011 if ((changed & BSS_CHANGED_BEACON_ENABLED &&
767 !bss_conf->enable_beacon)) { 1012 !bss_conf->enable_beacon)) {
768 if (mac->beacon_enabled == 1) { 1013 if (mac->beacon_enabled == 1) {
769 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, 1014 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
770 "ADHOC DISABLE BEACON\n"); 1015 "ADHOC DISABLE BEACON\n");
@@ -785,8 +1030,12 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
785 1030
786 /*TODO: reference to enum ieee80211_bss_change */ 1031 /*TODO: reference to enum ieee80211_bss_change */
787 if (changed & BSS_CHANGED_ASSOC) { 1032 if (changed & BSS_CHANGED_ASSOC) {
1033 u8 mstatus;
788 if (bss_conf->assoc) { 1034 if (bss_conf->assoc) {
789 struct ieee80211_sta *sta = NULL; 1035 struct ieee80211_sta *sta = NULL;
1036 u8 keep_alive = 10;
1037
1038 mstatus = RT_MEDIA_CONNECT;
790 /* we should reset all sec info & cam 1039 /* we should reset all sec info & cam
791 * before set cam after linked, we should not 1040 * before set cam after linked, we should not
792 * reset in disassoc, that will cause tkip->wep 1041 * reset in disassoc, that will cause tkip->wep
@@ -804,47 +1053,89 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
804 1053
805 if (rtlpriv->cfg->ops->linked_set_reg) 1054 if (rtlpriv->cfg->ops->linked_set_reg)
806 rtlpriv->cfg->ops->linked_set_reg(hw); 1055 rtlpriv->cfg->ops->linked_set_reg(hw);
1056
807 rcu_read_lock(); 1057 rcu_read_lock();
808 sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid); 1058 sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
809 if (!sta) { 1059 if (!sta) {
810 pr_err("ieee80211_find_sta returned NULL\n");
811 rcu_read_unlock(); 1060 rcu_read_unlock();
812 goto out; 1061 goto out;
813 } 1062 }
814
815 if (vif->type == NL80211_IFTYPE_STATION && sta)
816 rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
817 RT_TRACE(rtlpriv, COMP_EASY_CONCURRENT, DBG_LOUD, 1063 RT_TRACE(rtlpriv, COMP_EASY_CONCURRENT, DBG_LOUD,
818 "send PS STATIC frame\n"); 1064 "send PS STATIC frame\n");
819 if (rtlpriv->dm.supp_phymode_switch) { 1065 if (rtlpriv->dm.supp_phymode_switch) {
820 if (sta->ht_cap.ht_supported) 1066 if (sta->ht_cap.ht_supported)
821 rtl_send_smps_action(hw, sta, 1067 rtl_send_smps_action(hw, sta,
822 IEEE80211_SMPS_STATIC); 1068 IEEE80211_SMPS_STATIC);
1069 }
1070
1071 if (rtlhal->current_bandtype == BAND_ON_5G) {
1072 mac->mode = WIRELESS_MODE_A;
1073 } else {
1074 if (sta->supp_rates[0] <= 0xf)
1075 mac->mode = WIRELESS_MODE_B;
1076 else
1077 mac->mode = WIRELESS_MODE_G;
1078 }
1079
1080 if (sta->ht_cap.ht_supported) {
1081 if (rtlhal->current_bandtype == BAND_ON_2_4G)
1082 mac->mode = WIRELESS_MODE_N_24G;
1083 else
1084 mac->mode = WIRELESS_MODE_N_5G;
823 } 1085 }
1086
1087 if (sta->vht_cap.vht_supported) {
1088 if (rtlhal->current_bandtype == BAND_ON_5G)
1089 mac->mode = WIRELESS_MODE_AC_5G;
1090 else
1091 mac->mode = WIRELESS_MODE_AC_24G;
1092 }
1093
1094 if (vif->type == NL80211_IFTYPE_STATION && sta)
1095 rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 0);
824 rcu_read_unlock(); 1096 rcu_read_unlock();
825 1097
1098 /* to avoid AP Disassociation caused by inactivity */
1099 rtlpriv->cfg->ops->set_hw_reg(hw,
1100 HW_VAR_KEEP_ALIVE,
1101 (u8 *)(&keep_alive));
1102
826 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, 1103 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
827 "BSS_CHANGED_ASSOC\n"); 1104 "BSS_CHANGED_ASSOC\n");
828 } else { 1105 } else {
1106 mstatus = RT_MEDIA_DISCONNECT;
1107
829 if (mac->link_state == MAC80211_LINKED) { 1108 if (mac->link_state == MAC80211_LINKED) {
830 rtlpriv->enter_ps = false; 1109 rtlpriv->enter_ps = false;
831 schedule_work(&rtlpriv->works.lps_change_work); 1110 schedule_work(&rtlpriv->works.lps_change_work);
832 } 1111 }
833
834 if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE) 1112 if (ppsc->p2p_ps_info.p2p_ps_mode > P2P_PS_NONE)
835 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE); 1113 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
836 mac->link_state = MAC80211_NOLINK; 1114 mac->link_state = MAC80211_NOLINK;
837 memset(mac->bssid, 0, ETH_ALEN); 1115 memset(mac->bssid, 0, ETH_ALEN);
838 mac->vendor = PEER_UNKNOWN; 1116 mac->vendor = PEER_UNKNOWN;
1117 mac->mode = 0;
839 1118
840 if (rtlpriv->dm.supp_phymode_switch) { 1119 if (rtlpriv->dm.supp_phymode_switch) {
841 if (rtlpriv->cfg->ops->chk_switch_dmdp) 1120 if (rtlpriv->cfg->ops->chk_switch_dmdp)
842 rtlpriv->cfg->ops->chk_switch_dmdp(hw); 1121 rtlpriv->cfg->ops->chk_switch_dmdp(hw);
843 } 1122 }
844
845 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, 1123 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
846 "BSS_CHANGED_UN_ASSOC\n"); 1124 "BSS_CHANGED_UN_ASSOC\n");
847 } 1125 }
1126 rtlpriv->cfg->ops->set_network_type(hw, vif->type);
1127 /* For FW LPS:
1128 * To tell firmware we have connected or disconnected
1129 */
1130 rtlpriv->cfg->ops->set_hw_reg(hw,
1131 HW_VAR_H2C_FW_JOINBSSRPT,
1132 (u8 *)(&mstatus));
1133 ppsc->report_linked = (mstatus == RT_MEDIA_CONNECT) ?
1134 true : false;
1135
1136 if (rtlpriv->cfg->ops->get_btc_status())
1137 rtlpriv->btcoexist.btc_ops->btc_mediastatus_notify(
1138 rtlpriv, mstatus);
848 } 1139 }
849 1140
850 if (changed & BSS_CHANGED_ERP_CTS_PROT) { 1141 if (changed & BSS_CHANGED_ERP_CTS_PROT) {
@@ -856,11 +1147,11 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
856 if (changed & BSS_CHANGED_ERP_PREAMBLE) { 1147 if (changed & BSS_CHANGED_ERP_PREAMBLE) {
857 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD, 1148 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_LOUD,
858 "BSS_CHANGED_ERP_PREAMBLE use short preamble:%x\n", 1149 "BSS_CHANGED_ERP_PREAMBLE use short preamble:%x\n",
859 bss_conf->use_short_preamble); 1150 bss_conf->use_short_preamble);
860 1151
861 mac->short_preamble = bss_conf->use_short_preamble; 1152 mac->short_preamble = bss_conf->use_short_preamble;
862 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACK_PREAMBLE, 1153 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACK_PREAMBLE,
863 &mac->short_preamble); 1154 (u8 *)(&mac->short_preamble));
864 } 1155 }
865 1156
866 if (changed & BSS_CHANGED_ERP_SLOT) { 1157 if (changed & BSS_CHANGED_ERP_SLOT) {
@@ -873,13 +1164,17 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
873 mac->slot_time = RTL_SLOT_TIME_20; 1164 mac->slot_time = RTL_SLOT_TIME_20;
874 1165
875 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME, 1166 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
876 &mac->slot_time); 1167 (u8 *)(&mac->slot_time));
877 } 1168 }
878 1169
879 if (changed & BSS_CHANGED_HT) { 1170 if (changed & BSS_CHANGED_HT) {
880 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE, "BSS_CHANGED_HT\n"); 1171 struct ieee80211_sta *sta = NULL;
1172
1173 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
1174 "BSS_CHANGED_HT\n");
1175
881 rcu_read_lock(); 1176 rcu_read_lock();
882 sta = get_sta(hw, vif, bss_conf->bssid); 1177 sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
883 if (sta) { 1178 if (sta) {
884 if (sta->ht_cap.ampdu_density > 1179 if (sta->ht_cap.ampdu_density >
885 mac->current_ampdu_density) 1180 mac->current_ampdu_density)
@@ -893,7 +1188,7 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
893 rcu_read_unlock(); 1188 rcu_read_unlock();
894 1189
895 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SHORTGI_DENSITY, 1190 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SHORTGI_DENSITY,
896 &mac->max_mss_density); 1191 (u8 *)(&mac->max_mss_density));
897 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AMPDU_FACTOR, 1192 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AMPDU_FACTOR,
898 &mac->current_ampdu_factor); 1193 &mac->current_ampdu_factor);
899 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AMPDU_MIN_SPACE, 1194 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AMPDU_MIN_SPACE,
@@ -902,19 +1197,19 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
902 1197
903 if (changed & BSS_CHANGED_BSSID) { 1198 if (changed & BSS_CHANGED_BSSID) {
904 u32 basic_rates; 1199 u32 basic_rates;
1200 struct ieee80211_sta *sta = NULL;
905 1201
906 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BSSID, 1202 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BSSID,
907 (u8 *) bss_conf->bssid); 1203 (u8 *)bss_conf->bssid);
908 1204
909 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG, "%pM\n", 1205 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_DMESG,
910 bss_conf->bssid); 1206 "bssid: %pM\n", bss_conf->bssid);
911 1207
912 mac->vendor = PEER_UNKNOWN; 1208 mac->vendor = PEER_UNKNOWN;
913 memcpy(mac->bssid, bss_conf->bssid, ETH_ALEN); 1209 memcpy(mac->bssid, bss_conf->bssid, ETH_ALEN);
914 rtlpriv->cfg->ops->set_network_type(hw, vif->type);
915 1210
916 rcu_read_lock(); 1211 rcu_read_lock();
917 sta = get_sta(hw, vif, bss_conf->bssid); 1212 sta = ieee80211_find_sta(vif, (u8 *)bss_conf->bssid);
918 if (!sta) { 1213 if (!sta) {
919 rcu_read_unlock(); 1214 rcu_read_unlock();
920 goto out; 1215 goto out;
@@ -936,11 +1231,18 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
936 mac->mode = WIRELESS_MODE_N_5G; 1231 mac->mode = WIRELESS_MODE_N_5G;
937 } 1232 }
938 1233
1234 if (sta->vht_cap.vht_supported) {
1235 if (rtlhal->current_bandtype == BAND_ON_5G)
1236 mac->mode = WIRELESS_MODE_AC_5G;
1237 else
1238 mac->mode = WIRELESS_MODE_AC_24G;
1239 }
1240
939 /* just station need it, because ibss & ap mode will 1241 /* just station need it, because ibss & ap mode will
940 * set in sta_add, and will be NULL here */ 1242 * set in sta_add, and will be NULL here */
941 if (mac->opmode == NL80211_IFTYPE_STATION) { 1243 if (vif->type == NL80211_IFTYPE_STATION) {
942 struct rtl_sta_info *sta_entry; 1244 struct rtl_sta_info *sta_entry;
943 sta_entry = (struct rtl_sta_info *) sta->drv_priv; 1245 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
944 sta_entry->wireless_mode = mac->mode; 1246 sta_entry->wireless_mode = mac->mode;
945 } 1247 }
946 1248
@@ -955,6 +1257,9 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
955 * */ 1257 * */
956 } 1258 }
957 1259
1260 if (sta->vht_cap.vht_supported)
1261 mac->vht_enable = true;
1262
958 if (changed & BSS_CHANGED_BASIC_RATES) { 1263 if (changed & BSS_CHANGED_BASIC_RATES) {
959 /* for 5G must << RATE_6M_INDEX = 4, 1264 /* for 5G must << RATE_6M_INDEX = 4,
960 * because 5G have no cck rate*/ 1265 * because 5G have no cck rate*/
@@ -969,40 +1274,6 @@ static void rtl_op_bss_info_changed(struct ieee80211_hw *hw,
969 } 1274 }
970 rcu_read_unlock(); 1275 rcu_read_unlock();
971 } 1276 }
972
973 /*
974 * For FW LPS:
975 * To tell firmware we have connected
976 * to an AP. For 92SE/CE power save v2.
977 */
978 if (changed & BSS_CHANGED_ASSOC) {
979 if (bss_conf->assoc) {
980 if (ppsc->fwctrl_lps) {
981 u8 mstatus = RT_MEDIA_CONNECT;
982 u8 keep_alive = 10;
983 rtlpriv->cfg->ops->set_hw_reg(hw,
984 HW_VAR_KEEP_ALIVE,
985 &keep_alive);
986
987 rtlpriv->cfg->ops->set_hw_reg(hw,
988 HW_VAR_H2C_FW_JOINBSSRPT,
989 &mstatus);
990 ppsc->report_linked = true;
991 }
992 } else {
993 if (ppsc->fwctrl_lps) {
994 u8 mstatus = RT_MEDIA_DISCONNECT;
995 rtlpriv->cfg->ops->set_hw_reg(hw,
996 HW_VAR_H2C_FW_JOINBSSRPT,
997 &mstatus);
998 ppsc->report_linked = false;
999 }
1000 }
1001 if (rtlpriv->cfg->ops->bt_wifi_media_status_notify)
1002 rtlpriv->cfg->ops->bt_wifi_media_status_notify(hw,
1003 ppsc->report_linked);
1004 }
1005
1006out: 1277out:
1007 mutex_unlock(&rtlpriv->locks.conf_mutex); 1278 mutex_unlock(&rtlpriv->locks.conf_mutex);
1008} 1279}
@@ -1012,28 +1283,27 @@ static u64 rtl_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1012 struct rtl_priv *rtlpriv = rtl_priv(hw); 1283 struct rtl_priv *rtlpriv = rtl_priv(hw);
1013 u64 tsf; 1284 u64 tsf;
1014 1285
1015 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_CORRECT_TSF, (u8 *) (&tsf)); 1286 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_CORRECT_TSF, (u8 *)(&tsf));
1016 return tsf; 1287 return tsf;
1017} 1288}
1018 1289
1019static void rtl_op_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1290static void rtl_op_set_tsf(struct ieee80211_hw *hw,
1020 u64 tsf) 1291 struct ieee80211_vif *vif, u64 tsf)
1021{ 1292{
1022 struct rtl_priv *rtlpriv = rtl_priv(hw); 1293 struct rtl_priv *rtlpriv = rtl_priv(hw);
1023 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1294 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1024 u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0; 1295 u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;
1025 1296
1026 mac->tsf = tsf; 1297 mac->tsf = tsf;
1027 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_CORRECT_TSF, &bibss); 1298 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_CORRECT_TSF, (u8 *)(&bibss));
1028} 1299}
1029 1300
1030static void rtl_op_reset_tsf(struct ieee80211_hw *hw, 1301static void rtl_op_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
1031 struct ieee80211_vif *vif)
1032{ 1302{
1033 struct rtl_priv *rtlpriv = rtl_priv(hw); 1303 struct rtl_priv *rtlpriv = rtl_priv(hw);
1034 u8 tmp = 0; 1304 u8 tmp = 0;
1035 1305
1036 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_DUAL_TSF_RST, &tmp); 1306 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_DUAL_TSF_RST, (u8 *)(&tmp));
1037} 1307}
1038 1308
1039static void rtl_op_sta_notify(struct ieee80211_hw *hw, 1309static void rtl_op_sta_notify(struct ieee80211_hw *hw,
@@ -1063,13 +1333,13 @@ static int rtl_op_ampdu_action(struct ieee80211_hw *hw,
1063 case IEEE80211_AMPDU_TX_START: 1333 case IEEE80211_AMPDU_TX_START:
1064 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE, 1334 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
1065 "IEEE80211_AMPDU_TX_START: TID:%d\n", tid); 1335 "IEEE80211_AMPDU_TX_START: TID:%d\n", tid);
1066 return rtl_tx_agg_start(hw, sta, tid, ssn); 1336 return rtl_tx_agg_start(hw, vif, sta, tid, ssn);
1067 case IEEE80211_AMPDU_TX_STOP_CONT: 1337 case IEEE80211_AMPDU_TX_STOP_CONT:
1068 case IEEE80211_AMPDU_TX_STOP_FLUSH: 1338 case IEEE80211_AMPDU_TX_STOP_FLUSH:
1069 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 1339 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
1070 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE, 1340 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
1071 "IEEE80211_AMPDU_TX_STOP: TID:%d\n", tid); 1341 "IEEE80211_AMPDU_TX_STOP: TID:%d\n", tid);
1072 return rtl_tx_agg_stop(hw, sta, tid); 1342 return rtl_tx_agg_stop(hw, vif, sta, tid);
1073 case IEEE80211_AMPDU_TX_OPERATIONAL: 1343 case IEEE80211_AMPDU_TX_OPERATIONAL:
1074 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE, 1344 RT_TRACE(rtlpriv, COMP_MAC80211, DBG_TRACE,
1075 "IEEE80211_AMPDU_TX_OPERATIONAL:TID:%d\n", tid); 1345 "IEEE80211_AMPDU_TX_OPERATIONAL:TID:%d\n", tid);
@@ -1103,10 +1373,14 @@ static void rtl_op_sw_scan_start(struct ieee80211_hw *hw)
1103 return; 1373 return;
1104 } 1374 }
1105 1375
1376 if (rtlpriv->cfg->ops->get_btc_status())
1377 rtlpriv->btcoexist.btc_ops->btc_scan_notify(rtlpriv, 1);
1378
1106 if (rtlpriv->dm.supp_phymode_switch) { 1379 if (rtlpriv->dm.supp_phymode_switch) {
1107 if (rtlpriv->cfg->ops->chk_switch_dmdp) 1380 if (rtlpriv->cfg->ops->chk_switch_dmdp)
1108 rtlpriv->cfg->ops->chk_switch_dmdp(hw); 1381 rtlpriv->cfg->ops->chk_switch_dmdp(hw);
1109 } 1382 }
1383
1110 if (mac->link_state == MAC80211_LINKED) { 1384 if (mac->link_state == MAC80211_LINKED) {
1111 rtlpriv->enter_ps = false; 1385 rtlpriv->enter_ps = false;
1112 schedule_work(&rtlpriv->works.lps_change_work); 1386 schedule_work(&rtlpriv->works.lps_change_work);
@@ -1115,11 +1389,11 @@ static void rtl_op_sw_scan_start(struct ieee80211_hw *hw)
1115 rtl_ips_nic_on(hw); 1389 rtl_ips_nic_on(hw);
1116 } 1390 }
1117 1391
1118 /* Dual mac */ 1392 /* Dul mac */
1119 rtlpriv->rtlhal.load_imrandiqk_setting_for2g = false; 1393 rtlpriv->rtlhal.load_imrandiqk_setting_for2g = false;
1120 1394
1121 rtlpriv->cfg->ops->led_control(hw, LED_CTL_SITE_SURVEY); 1395 rtlpriv->cfg->ops->led_control(hw, LED_CTL_SITE_SURVEY);
1122 rtlpriv->cfg->ops->scan_operation_backup(hw, SCAN_OPT_BACKUP); 1396 rtlpriv->cfg->ops->scan_operation_backup(hw, SCAN_OPT_BACKUP_BAND0);
1123} 1397}
1124 1398
1125static void rtl_op_sw_scan_complete(struct ieee80211_hw *hw) 1399static void rtl_op_sw_scan_complete(struct ieee80211_hw *hw)
@@ -1133,13 +1407,13 @@ static void rtl_op_sw_scan_complete(struct ieee80211_hw *hw)
1133 if (rtlpriv->link_info.higher_busytraffic) 1407 if (rtlpriv->link_info.higher_busytraffic)
1134 return; 1408 return;
1135 1409
1136 /*p2p will use 1/6/11 to scan */ 1410 /* p2p will use 1/6/11 to scan */
1137 if (mac->n_channels == 3) 1411 if (mac->n_channels == 3)
1138 mac->p2p_in_use = true; 1412 mac->p2p_in_use = true;
1139 else 1413 else
1140 mac->p2p_in_use = false; 1414 mac->p2p_in_use = false;
1141 mac->n_channels = 0; 1415 mac->n_channels = 0;
1142 /* Dual mac */ 1416 /* Dul mac */
1143 rtlpriv->rtlhal.load_imrandiqk_setting_for2g = false; 1417 rtlpriv->rtlhal.load_imrandiqk_setting_for2g = false;
1144 1418
1145 if (mac->link_state == MAC80211_LINKED_SCANNING) { 1419 if (mac->link_state == MAC80211_LINKED_SCANNING) {
@@ -1151,6 +1425,8 @@ static void rtl_op_sw_scan_complete(struct ieee80211_hw *hw)
1151 } 1425 }
1152 1426
1153 rtlpriv->cfg->ops->scan_operation_backup(hw, SCAN_OPT_RESTORE); 1427 rtlpriv->cfg->ops->scan_operation_backup(hw, SCAN_OPT_RESTORE);
1428 if (rtlpriv->cfg->ops->get_btc_status())
1429 rtlpriv->btcoexist.btc_ops->btc_scan_notify(rtlpriv, 0);
1154} 1430}
1155 1431
1156static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd, 1432static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
@@ -1158,7 +1434,6 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1158 struct ieee80211_key_conf *key) 1434 struct ieee80211_key_conf *key)
1159{ 1435{
1160 struct rtl_priv *rtlpriv = rtl_priv(hw); 1436 struct rtl_priv *rtlpriv = rtl_priv(hw);
1161 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1162 u8 key_type = NO_ENCRYPTION; 1437 u8 key_type = NO_ENCRYPTION;
1163 u8 key_idx; 1438 u8 key_idx;
1164 bool group_key = false; 1439 bool group_key = false;
@@ -1174,13 +1449,13 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1174 } 1449 }
1175 /* To support IBSS, use sw-crypto for GTK */ 1450 /* To support IBSS, use sw-crypto for GTK */
1176 if (((vif->type == NL80211_IFTYPE_ADHOC) || 1451 if (((vif->type == NL80211_IFTYPE_ADHOC) ||
1177 (vif->type == NL80211_IFTYPE_MESH_POINT)) && 1452 (vif->type == NL80211_IFTYPE_MESH_POINT)) &&
1178 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) 1453 !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE))
1179 return -ENOSPC; 1454 return -ENOSPC;
1180 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 1455 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1181 "%s hardware based encryption for keyidx: %d, mac: %pM\n", 1456 "%s hardware based encryption for keyidx: %d, mac: %pM\n",
1182 cmd == SET_KEY ? "Using" : "Disabling", key->keyidx, 1457 cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
1183 sta ? sta->addr : bcast_addr); 1458 sta ? sta->addr : bcast_addr);
1184 rtlpriv->sec.being_setkey = true; 1459 rtlpriv->sec.being_setkey = true;
1185 rtl_ips_nic_on(hw); 1460 rtl_ips_nic_on(hw);
1186 mutex_lock(&rtlpriv->locks.conf_mutex); 1461 mutex_lock(&rtlpriv->locks.conf_mutex);
@@ -1204,21 +1479,23 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1204 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:CCMP\n"); 1479 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:CCMP\n");
1205 break; 1480 break;
1206 case WLAN_CIPHER_SUITE_AES_CMAC: 1481 case WLAN_CIPHER_SUITE_AES_CMAC:
1207 /*HW doesn't support CMAC encryption, use software CMAC */ 1482 /* HW don't support CMAC encryption,
1483 * use software CMAC encryption
1484 */
1208 key_type = AESCMAC_ENCRYPTION; 1485 key_type = AESCMAC_ENCRYPTION;
1209 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:CMAC\n"); 1486 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "alg:CMAC\n");
1210 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 1487 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1211 "HW don't support CMAC encryption, use software CMAC\n"); 1488 "HW don't support CMAC encrypiton, use software CMAC encrypiton\n");
1212 err = -EOPNOTSUPP; 1489 err = -EOPNOTSUPP;
1213 goto out_unlock; 1490 goto out_unlock;
1214 default: 1491 default:
1215 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "alg_err:%x!!!!\n", 1492 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1216 key->cipher); 1493 "alg_err:%x!!!!:\n", key->cipher);
1217 goto out_unlock; 1494 goto out_unlock;
1218 } 1495 }
1219 if (key_type == WEP40_ENCRYPTION || 1496 if (key_type == WEP40_ENCRYPTION ||
1220 key_type == WEP104_ENCRYPTION || 1497 key_type == WEP104_ENCRYPTION ||
1221 mac->opmode == NL80211_IFTYPE_ADHOC) 1498 vif->type == NL80211_IFTYPE_ADHOC)
1222 rtlpriv->sec.use_defaultkey = true; 1499 rtlpriv->sec.use_defaultkey = true;
1223 1500
1224 /* <2> get key_idx */ 1501 /* <2> get key_idx */
@@ -1232,14 +1509,14 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1232 * 1) wep only: is just for wep enc, in this condition 1509 * 1) wep only: is just for wep enc, in this condition
1233 * rtlpriv->sec.pairwise_enc_algorithm == NO_ENCRYPTION 1510 * rtlpriv->sec.pairwise_enc_algorithm == NO_ENCRYPTION
1234 * will be true & enable_hw_sec will be set when wep 1511 * will be true & enable_hw_sec will be set when wep
1235 * key setting. 1512 * ke setting.
1236 * 2) wep(group) + AES(pairwise): some AP like cisco 1513 * 2) wep(group) + AES(pairwise): some AP like cisco
1237 * may use it, in this condition enable_hw_sec will not 1514 * may use it, in this condition enable_hw_sec will not
1238 * be set when wep key setting */ 1515 * be set when wep key setting */
1239 /* we must reset sec_info after lingked before set key, 1516 /* we must reset sec_info after lingked before set key,
1240 * or some flag will be wrong*/ 1517 * or some flag will be wrong*/
1241 if (vif->type == NL80211_IFTYPE_AP || 1518 if (vif->type == NL80211_IFTYPE_AP ||
1242 vif->type == NL80211_IFTYPE_MESH_POINT) { 1519 vif->type == NL80211_IFTYPE_MESH_POINT) {
1243 if (!group_key || key_type == WEP40_ENCRYPTION || 1520 if (!group_key || key_type == WEP40_ENCRYPTION ||
1244 key_type == WEP104_ENCRYPTION) { 1521 key_type == WEP104_ENCRYPTION) {
1245 if (group_key) 1522 if (group_key)
@@ -1247,11 +1524,11 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1247 rtlpriv->cfg->ops->enable_hw_sec(hw); 1524 rtlpriv->cfg->ops->enable_hw_sec(hw);
1248 } 1525 }
1249 } else { 1526 } else {
1250 if ((!group_key) || (mac->opmode == NL80211_IFTYPE_ADHOC) || 1527 if ((!group_key) || (vif->type == NL80211_IFTYPE_ADHOC) ||
1251 rtlpriv->sec.pairwise_enc_algorithm == NO_ENCRYPTION) { 1528 rtlpriv->sec.pairwise_enc_algorithm == NO_ENCRYPTION) {
1252 if (rtlpriv->sec.pairwise_enc_algorithm == 1529 if (rtlpriv->sec.pairwise_enc_algorithm ==
1253 NO_ENCRYPTION && 1530 NO_ENCRYPTION &&
1254 (key_type == WEP40_ENCRYPTION || 1531 (key_type == WEP40_ENCRYPTION ||
1255 key_type == WEP104_ENCRYPTION)) 1532 key_type == WEP104_ENCRYPTION))
1256 wep_only = true; 1533 wep_only = true;
1257 rtlpriv->sec.pairwise_enc_algorithm = key_type; 1534 rtlpriv->sec.pairwise_enc_algorithm = key_type;
@@ -1323,7 +1600,7 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1323 "disable key delete one entry\n"); 1600 "disable key delete one entry\n");
1324 /*set local buf about wep key. */ 1601 /*set local buf about wep key. */
1325 if (vif->type == NL80211_IFTYPE_AP || 1602 if (vif->type == NL80211_IFTYPE_AP ||
1326 vif->type == NL80211_IFTYPE_MESH_POINT) { 1603 vif->type == NL80211_IFTYPE_MESH_POINT) {
1327 if (sta) 1604 if (sta)
1328 rtl_cam_del_entry(hw, sta->addr); 1605 rtl_cam_del_entry(hw, sta->addr);
1329 } 1606 }
@@ -1336,13 +1613,10 @@ static int rtl_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1336 *or clear all entry here. 1613 *or clear all entry here.
1337 */ 1614 */
1338 rtl_cam_delete_one_entry(hw, mac_addr, key_idx); 1615 rtl_cam_delete_one_entry(hw, mac_addr, key_idx);
1339
1340 rtl_cam_reset_sec_info(hw);
1341
1342 break; 1616 break;
1343 default: 1617 default:
1344 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1618 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1345 "cmd_err:%x!!!!\n", cmd); 1619 "cmd_err:%x!!!!:\n", cmd);
1346 } 1620 }
1347out_unlock: 1621out_unlock:
1348 mutex_unlock(&rtlpriv->locks.conf_mutex); 1622 mutex_unlock(&rtlpriv->locks.conf_mutex);
@@ -1372,7 +1646,7 @@ static void rtl_op_rfkill_poll(struct ieee80211_hw *hw)
1372 1646
1373 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 1647 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
1374 "wireless radio switch turned %s\n", 1648 "wireless radio switch turned %s\n",
1375 radio_state ? "on" : "off"); 1649 radio_state ? "on" : "off");
1376 1650
1377 blocked = (rtlpriv->rfkill.rfkill_state == 1) ? 0 : 1; 1651 blocked = (rtlpriv->rfkill.rfkill_state == 1) ? 0 : 1;
1378 wiphy_rfkill_set_hw_state(hw->wiphy, blocked); 1652 wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
@@ -1383,18 +1657,148 @@ static void rtl_op_rfkill_poll(struct ieee80211_hw *hw)
1383} 1657}
1384 1658
1385/* this function is called by mac80211 to flush tx buffer 1659/* this function is called by mac80211 to flush tx buffer
1386 * before switch channel or power save, or tx buffer packet 1660 * before switch channle or power save, or tx buffer packet
1387 * maybe send after offchannel or rf sleep, this may cause 1661 * maybe send after offchannel or rf sleep, this may cause
1388 * dis-association by AP */ 1662 * dis-association by AP */
1389static void rtl_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 1663static void rtl_op_flush(struct ieee80211_hw *hw,
1390 u32 queues, bool drop) 1664 struct ieee80211_vif *vif,
1665 u32 queues,
1666 bool drop)
1391{ 1667{
1392 struct rtl_priv *rtlpriv = rtl_priv(hw); 1668 struct rtl_priv *rtlpriv = rtl_priv(hw);
1393 1669
1394 if (rtlpriv->intf_ops->flush) 1670 if (rtlpriv->intf_ops->flush)
1395 rtlpriv->intf_ops->flush(hw, drop); 1671 rtlpriv->intf_ops->flush(hw, queues, drop);
1396} 1672}
1397 1673
1674/* Description:
1675 * This routine deals with the Power Configuration CMD
1676 * parsing for RTL8723/RTL8188E Series IC.
1677 * Assumption:
1678 * We should follow specific format that was released from HW SD.
1679 */
1680bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
1681 u8 faversion, u8 interface_type,
1682 struct wlan_pwr_cfg pwrcfgcmd[])
1683{
1684 struct wlan_pwr_cfg cfg_cmd = {0};
1685 bool polling_bit = false;
1686 u32 ary_idx = 0;
1687 u8 value = 0;
1688 u32 offset = 0;
1689 u32 polling_count = 0;
1690 u32 max_polling_cnt = 5000;
1691
1692 do {
1693 cfg_cmd = pwrcfgcmd[ary_idx];
1694 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1695 "rtl_hal_pwrseqcmdparsing(): offset(%#x),cut_msk(%#x), famsk(%#x), interface_msk(%#x), base(%#x), cmd(%#x), msk(%#x), value(%#x)\n",
1696 GET_PWR_CFG_OFFSET(cfg_cmd),
1697 GET_PWR_CFG_CUT_MASK(cfg_cmd),
1698 GET_PWR_CFG_FAB_MASK(cfg_cmd),
1699 GET_PWR_CFG_INTF_MASK(cfg_cmd),
1700 GET_PWR_CFG_BASE(cfg_cmd), GET_PWR_CFG_CMD(cfg_cmd),
1701 GET_PWR_CFG_MASK(cfg_cmd), GET_PWR_CFG_VALUE(cfg_cmd));
1702
1703 if ((GET_PWR_CFG_FAB_MASK(cfg_cmd)&faversion) &&
1704 (GET_PWR_CFG_CUT_MASK(cfg_cmd)&cut_version) &&
1705 (GET_PWR_CFG_INTF_MASK(cfg_cmd)&interface_type)) {
1706 switch (GET_PWR_CFG_CMD(cfg_cmd)) {
1707 case PWR_CMD_READ:
1708 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1709 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_READ\n");
1710 break;
1711 case PWR_CMD_WRITE:
1712 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1713 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_WRITE\n");
1714 offset = GET_PWR_CFG_OFFSET(cfg_cmd);
1715
1716 /*Read the value from system register*/
1717 value = rtl_read_byte(rtlpriv, offset);
1718 value &= (~(GET_PWR_CFG_MASK(cfg_cmd)));
1719 value |= (GET_PWR_CFG_VALUE(cfg_cmd) &
1720 GET_PWR_CFG_MASK(cfg_cmd));
1721
1722 /*Write the value back to sytem register*/
1723 rtl_write_byte(rtlpriv, offset, value);
1724 break;
1725 case PWR_CMD_POLLING:
1726 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1727 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_POLLING\n");
1728 polling_bit = false;
1729 offset = GET_PWR_CFG_OFFSET(cfg_cmd);
1730
1731 do {
1732 value = rtl_read_byte(rtlpriv, offset);
1733
1734 value &= GET_PWR_CFG_MASK(cfg_cmd);
1735 if (value ==
1736 (GET_PWR_CFG_VALUE(cfg_cmd) &
1737 GET_PWR_CFG_MASK(cfg_cmd)))
1738 polling_bit = true;
1739 else
1740 udelay(10);
1741
1742 if (polling_count++ > max_polling_cnt)
1743 return false;
1744 } while (!polling_bit);
1745 break;
1746 case PWR_CMD_DELAY:
1747 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1748 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_DELAY\n");
1749 if (GET_PWR_CFG_VALUE(cfg_cmd) ==
1750 PWRSEQ_DELAY_US)
1751 udelay(GET_PWR_CFG_OFFSET(cfg_cmd));
1752 else
1753 mdelay(GET_PWR_CFG_OFFSET(cfg_cmd));
1754 break;
1755 case PWR_CMD_END:
1756 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1757 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_END\n");
1758 return true;
1759 default:
1760 RT_ASSERT(false,
1761 "rtl_hal_pwrseqcmdparsing(): Unknown CMD!!\n");
1762 break;
1763 }
1764 }
1765 ary_idx++;
1766 } while (1);
1767
1768 return true;
1769}
1770EXPORT_SYMBOL(rtl_hal_pwrseqcmdparsing);
1771
1772bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb)
1773{
1774 struct rtl_priv *rtlpriv = rtl_priv(hw);
1775 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1776 struct rtl8192_tx_ring *ring;
1777 struct rtl_tx_desc *pdesc;
1778 unsigned long flags;
1779 struct sk_buff *pskb = NULL;
1780
1781 ring = &rtlpci->tx_ring[BEACON_QUEUE];
1782
1783 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
1784 pskb = __skb_dequeue(&ring->queue);
1785 if (pskb)
1786 kfree_skb(pskb);
1787
1788 /*this is wrong, fill_tx_cmddesc needs update*/
1789 pdesc = &ring->desc[0];
1790
1791 rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
1792
1793 __skb_queue_tail(&ring->queue, skb);
1794
1795 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
1796
1797 rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
1798
1799 return true;
1800}
1801EXPORT_SYMBOL(rtl_cmd_send_packet);
1398const struct ieee80211_ops rtl_ops = { 1802const struct ieee80211_ops rtl_ops = {
1399 .start = rtl_op_start, 1803 .start = rtl_op_start,
1400 .stop = rtl_op_stop, 1804 .stop = rtl_op_stop,
@@ -1402,10 +1806,12 @@ const struct ieee80211_ops rtl_ops = {
1402 .add_interface = rtl_op_add_interface, 1806 .add_interface = rtl_op_add_interface,
1403 .remove_interface = rtl_op_remove_interface, 1807 .remove_interface = rtl_op_remove_interface,
1404 .change_interface = rtl_op_change_interface, 1808 .change_interface = rtl_op_change_interface,
1809#ifdef CONFIG_PM
1810 .suspend = rtl_op_suspend,
1811 .resume = rtl_op_resume,
1812#endif
1405 .config = rtl_op_config, 1813 .config = rtl_op_config,
1406 .configure_filter = rtl_op_configure_filter, 1814 .configure_filter = rtl_op_configure_filter,
1407 .sta_add = rtl_op_sta_add,
1408 .sta_remove = rtl_op_sta_remove,
1409 .set_key = rtl_op_set_key, 1815 .set_key = rtl_op_set_key,
1410 .conf_tx = rtl_op_conf_tx, 1816 .conf_tx = rtl_op_conf_tx,
1411 .bss_info_changed = rtl_op_bss_info_changed, 1817 .bss_info_changed = rtl_op_bss_info_changed,
@@ -1417,6 +1823,8 @@ const struct ieee80211_ops rtl_ops = {
1417 .sw_scan_start = rtl_op_sw_scan_start, 1823 .sw_scan_start = rtl_op_sw_scan_start,
1418 .sw_scan_complete = rtl_op_sw_scan_complete, 1824 .sw_scan_complete = rtl_op_sw_scan_complete,
1419 .rfkill_poll = rtl_op_rfkill_poll, 1825 .rfkill_poll = rtl_op_rfkill_poll,
1826 .sta_add = rtl_op_sta_add,
1827 .sta_remove = rtl_op_sta_remove,
1420 .flush = rtl_op_flush, 1828 .flush = rtl_op_flush,
1421}; 1829};
1422EXPORT_SYMBOL_GPL(rtl_ops); 1830EXPORT_SYMBOL_GPL(rtl_ops);
diff --git a/drivers/net/wireless/rtlwifi/core.h b/drivers/net/wireless/rtlwifi/core.h
index 027e75374dcc..59cd3b9dca25 100644
--- a/drivers/net/wireless/rtlwifi/core.h
+++ b/drivers/net/wireless/rtlwifi/core.h
@@ -2,20 +2,16 @@
2 * 2 *
3 * Copyright(c) 2009-2012 Realtek Corporation. 3 * Copyright(c) 2009-2012 Realtek Corporation.
4 * 4 *
5 * Tmis program is free software; you can redistribute it and/or modify it 5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as 6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Tmis program is distributed in the hope that it will be useful, but WITHOUT 9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with 14 * The full GNU General Public License is included in this distribution in the
15 * tmis program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * Tme full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
21 * Contact Information: 17 * Contact Information:
@@ -45,5 +41,6 @@ void rtl_addr_delay(u32 addr);
45void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr, 41void rtl_rfreg_delay(struct ieee80211_hw *hw, enum radio_path rfpath, u32 addr,
46 u32 mask, u32 data); 42 u32 mask, u32 data);
47void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data); 43void rtl_bb_delay(struct ieee80211_hw *hw, u32 addr, u32 data);
44bool rtl_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb);
48 45
49#endif 46#endif
diff --git a/drivers/net/wireless/rtlwifi/debug.c b/drivers/net/wireless/rtlwifi/debug.c
index 76e2086e137e..fd25abad2b9e 100644
--- a/drivers/net/wireless/rtlwifi/debug.c
+++ b/drivers/net/wireless/rtlwifi/debug.c
@@ -2,20 +2,16 @@
2 * 2 *
3 * Copyright(c) 2009-2012 Realtek Corporation. 3 * Copyright(c) 2009-2012 Realtek Corporation.
4 * 4 *
5 * Tmis program is free software; you can redistribute it and/or modify it 5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as 6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Tmis program is distributed in the hope that it will be useful, but WITHOUT 9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with 14 * The full GNU General Public License is included in this distribution in the
15 * tmis program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * Tme full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
21 * Contact Information: 17 * Contact Information:
diff --git a/drivers/net/wireless/rtlwifi/debug.h b/drivers/net/wireless/rtlwifi/debug.h
index 6d669364e3d9..fc794b3e9f4a 100644
--- a/drivers/net/wireless/rtlwifi/debug.h
+++ b/drivers/net/wireless/rtlwifi/debug.h
@@ -2,20 +2,16 @@
2 * 2 *
3 * Copyright(c) 2009-2012 Realtek Corporation. 3 * Copyright(c) 2009-2012 Realtek Corporation.
4 * 4 *
5 * Tmis program is free software; you can redistribute it and/or modify it 5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as 6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Tmis program is distributed in the hope that it will be useful, but WITHOUT 9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with 14 * The full GNU General Public License is included in this distribution in the
15 * tmis program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * Tme full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
21 * Contact Information: 17 * Contact Information:
@@ -108,6 +104,7 @@
108#define COMP_USB BIT(29) 104#define COMP_USB BIT(29)
109#define COMP_EASY_CONCURRENT COMP_USB /* reuse of this bit is OK */ 105#define COMP_EASY_CONCURRENT COMP_USB /* reuse of this bit is OK */
110#define COMP_BT_COEXIST BIT(30) 106#define COMP_BT_COEXIST BIT(30)
107#define COMP_IQK BIT(31)
111 108
112/*-------------------------------------------------------------- 109/*--------------------------------------------------------------
113 Define the rt_print components 110 Define the rt_print components
diff --git a/drivers/net/wireless/rtlwifi/efuse.c b/drivers/net/wireless/rtlwifi/efuse.c
index 2ffc7298f686..0b4082c9272a 100644
--- a/drivers/net/wireless/rtlwifi/efuse.c
+++ b/drivers/net/wireless/rtlwifi/efuse.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * tmis program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * Tme full GNU General Public License is included in this distribution in the 14 * Tme full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -26,10 +22,9 @@
26 * Larry Finger <Larry.Finger@lwfinger.net> 22 * Larry Finger <Larry.Finger@lwfinger.net>
27 * 23 *
28 *****************************************************************************/ 24 *****************************************************************************/
29
30#include <linux/export.h>
31#include "wifi.h" 25#include "wifi.h"
32#include "efuse.h" 26#include "efuse.h"
27#include <linux/export.h>
33 28
34static const u8 MAX_PGPKT_SIZE = 9; 29static const u8 MAX_PGPKT_SIZE = 9;
35static const u8 PGPKT_DATA_SIZE = 8; 30static const u8 PGPKT_DATA_SIZE = 8;
@@ -63,21 +58,19 @@ static void efuse_shadow_write_2byte(struct ieee80211_hw *hw, u16 offset,
63 u16 value); 58 u16 value);
64static void efuse_shadow_write_4byte(struct ieee80211_hw *hw, u16 offset, 59static void efuse_shadow_write_4byte(struct ieee80211_hw *hw, u16 offset,
65 u32 value); 60 u32 value);
66static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr,
67 u8 *data);
68static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, 61static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr,
69 u8 data); 62 u8 data);
70static void efuse_read_all_map(struct ieee80211_hw *hw, u8 *efuse); 63static void efuse_read_all_map(struct ieee80211_hw *hw, u8 *efuse);
71static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, 64static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset,
72 u8 *data); 65 u8 *data);
73static int efuse_pg_packet_write(struct ieee80211_hw *hw, u8 offset, 66static int efuse_pg_packet_write(struct ieee80211_hw *hw, u8 offset,
74 u8 word_en, u8 *data); 67 u8 word_en, u8 *data);
75static void efuse_word_enable_data_read(u8 word_en, u8 *sourdata, 68static void efuse_word_enable_data_read(u8 word_en, u8 *sourdata,
76 u8 *targetdata); 69 u8 *targetdata);
77static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw, 70static u8 enable_efuse_data_write(struct ieee80211_hw *hw,
78 u16 efuse_addr, u8 word_en, u8 *data); 71 u16 efuse_addr, u8 word_en, u8 *data);
79static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, 72static void efuse_power_switch(struct ieee80211_hw *hw, u8 write,
80 u8 pwrstate); 73 u8 pwrstate);
81static u16 efuse_get_current_size(struct ieee80211_hw *hw); 74static u16 efuse_get_current_size(struct ieee80211_hw *hw);
82static u8 efuse_calculate_word_cnts(u8 word_en); 75static u8 efuse_calculate_word_cnts(u8 word_en);
83 76
@@ -258,7 +251,7 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
258 } 251 }
259 252
260 /* allocate memory for efuse_tbl and efuse_word */ 253 /* allocate memory for efuse_tbl and efuse_word */
261 efuse_tbl = kmalloc(rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE] * 254 efuse_tbl = kzalloc(rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE] *
262 sizeof(u8), GFP_ATOMIC); 255 sizeof(u8), GFP_ATOMIC);
263 if (!efuse_tbl) 256 if (!efuse_tbl)
264 return; 257 return;
@@ -266,7 +259,7 @@ void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf)
266 if (!efuse_word) 259 if (!efuse_word)
267 goto out; 260 goto out;
268 for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) { 261 for (i = 0; i < EFUSE_MAX_WORD_UNIT; i++) {
269 efuse_word[i] = kmalloc(efuse_max_section * sizeof(u16), 262 efuse_word[i] = kzalloc(efuse_max_section * sizeof(u16),
270 GFP_ATOMIC); 263 GFP_ATOMIC);
271 if (!efuse_word[i]) 264 if (!efuse_word[i])
272 goto done; 265 goto done;
@@ -413,8 +406,7 @@ bool efuse_shadow_update_chk(struct ieee80211_hw *hw)
413 efuse_used = rtlefuse->efuse_usedbytes; 406 efuse_used = rtlefuse->efuse_usedbytes;
414 407
415 if ((totalbytes + efuse_used) >= 408 if ((totalbytes + efuse_used) >=
416 (EFUSE_MAX_SIZE - 409 (EFUSE_MAX_SIZE - rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))
417 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))
418 result = false; 410 result = false;
419 411
420 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, 412 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
@@ -428,13 +420,14 @@ void efuse_shadow_read(struct ieee80211_hw *hw, u8 type,
428 u16 offset, u32 *value) 420 u16 offset, u32 *value)
429{ 421{
430 if (type == 1) 422 if (type == 1)
431 efuse_shadow_read_1byte(hw, offset, (u8 *) value); 423 efuse_shadow_read_1byte(hw, offset, (u8 *)value);
432 else if (type == 2) 424 else if (type == 2)
433 efuse_shadow_read_2byte(hw, offset, (u16 *) value); 425 efuse_shadow_read_2byte(hw, offset, (u16 *)value);
434 else if (type == 4) 426 else if (type == 4)
435 efuse_shadow_read_4byte(hw, offset, value); 427 efuse_shadow_read_4byte(hw, offset, value);
436 428
437} 429}
430EXPORT_SYMBOL(efuse_shadow_read);
438 431
439void efuse_shadow_write(struct ieee80211_hw *hw, u8 type, u16 offset, 432void efuse_shadow_write(struct ieee80211_hw *hw, u8 type, u16 offset,
440 u32 value) 433 u32 value)
@@ -456,7 +449,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
456 u8 word_en = 0x0F; 449 u8 word_en = 0x0F;
457 u8 first_pg = false; 450 u8 first_pg = false;
458 451
459 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "--->\n"); 452 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
460 453
461 if (!efuse_shadow_update_chk(hw)) { 454 if (!efuse_shadow_update_chk(hw)) {
462 efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]); 455 efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]);
@@ -465,7 +458,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
465 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]); 458 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
466 459
467 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, 460 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
468 "<---efuse out of capacity!!\n"); 461 "efuse out of capacity!!\n");
469 return false; 462 return false;
470 } 463 }
471 efuse_power_switch(hw, true, true); 464 efuse_power_switch(hw, true, true);
@@ -477,7 +470,6 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
477 470
478 for (i = 0; i < 8; i++) { 471 for (i = 0; i < 8; i++) {
479 if (first_pg) { 472 if (first_pg) {
480
481 word_en &= ~(BIT(i / 2)); 473 word_en &= ~(BIT(i / 2));
482 474
483 rtlefuse->efuse_map[EFUSE_INIT_MAP][base + i] = 475 rtlefuse->efuse_map[EFUSE_INIT_MAP][base + i] =
@@ -500,7 +492,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
500 &rtlefuse->efuse_map[EFUSE_MODIFY_MAP][base], 492 &rtlefuse->efuse_map[EFUSE_MODIFY_MAP][base],
501 8); 493 8);
502 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD, 494 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_LOUD,
503 "U-efuse", tmpdata, 8); 495 "U-efuse\n", tmpdata, 8);
504 496
505 if (!efuse_pg_packet_write(hw, (u8) offset, word_en, 497 if (!efuse_pg_packet_write(hw, (u8) offset, word_en,
506 tmpdata)) { 498 tmpdata)) {
@@ -519,7 +511,7 @@ bool efuse_shadow_update(struct ieee80211_hw *hw)
519 &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], 511 &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
520 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]); 512 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
521 513
522 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "<---\n"); 514 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "\n");
523 return true; 515 return true;
524} 516}
525 517
@@ -529,14 +521,14 @@ void rtl_efuse_shadow_map_update(struct ieee80211_hw *hw)
529 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 521 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
530 522
531 if (rtlefuse->autoload_failflag) 523 if (rtlefuse->autoload_failflag)
532 memset(&rtlefuse->efuse_map[EFUSE_INIT_MAP][0], 0xFF, 524 memset((&rtlefuse->efuse_map[EFUSE_INIT_MAP][0]),
533 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]); 525 0xFF, rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
534 else 526 else
535 efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]); 527 efuse_read_all_map(hw, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0]);
536 528
537 memcpy(&rtlefuse->efuse_map[EFUSE_MODIFY_MAP][0], 529 memcpy(&rtlefuse->efuse_map[EFUSE_MODIFY_MAP][0],
538 &rtlefuse->efuse_map[EFUSE_INIT_MAP][0], 530 &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
539 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]); 531 rtlpriv->cfg->maps[EFUSE_HWSET_MAX_SIZE]);
540 532
541} 533}
542EXPORT_SYMBOL(rtl_efuse_shadow_map_update); 534EXPORT_SYMBOL(rtl_efuse_shadow_map_update);
@@ -619,7 +611,7 @@ static void efuse_shadow_write_4byte(struct ieee80211_hw *hw,
619 611
620} 612}
621 613
622static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data) 614int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data)
623{ 615{
624 struct rtl_priv *rtlpriv = rtl_priv(hw); 616 struct rtl_priv *rtlpriv = rtl_priv(hw);
625 u8 tmpidx = 0; 617 u8 tmpidx = 0;
@@ -650,14 +642,15 @@ static int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data)
650 } 642 }
651 return result; 643 return result;
652} 644}
645EXPORT_SYMBOL(efuse_one_byte_read);
653 646
654static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data) 647static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data)
655{ 648{
656 struct rtl_priv *rtlpriv = rtl_priv(hw); 649 struct rtl_priv *rtlpriv = rtl_priv(hw);
657 u8 tmpidx = 0; 650 u8 tmpidx = 0;
658 651
659 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "Addr = %x Data=%x\n", 652 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
660 addr, data); 653 "Addr = %x Data=%x\n", addr, data);
661 654
662 rtl_write_byte(rtlpriv, 655 rtl_write_byte(rtlpriv,
663 rtlpriv->cfg->maps[EFUSE_CTRL] + 1, (u8) (addr & 0xff)); 656 rtlpriv->cfg->maps[EFUSE_CTRL] + 1, (u8) (addr & 0xff));
@@ -677,11 +670,10 @@ static int efuse_one_byte_write(struct ieee80211_hw *hw, u16 addr, u8 data)
677 670
678 if (tmpidx < 100) 671 if (tmpidx < 100)
679 return true; 672 return true;
680
681 return false; 673 return false;
682} 674}
683 675
684static void efuse_read_all_map(struct ieee80211_hw *hw, u8 * efuse) 676static void efuse_read_all_map(struct ieee80211_hw *hw, u8 *efuse)
685{ 677{
686 struct rtl_priv *rtlpriv = rtl_priv(hw); 678 struct rtl_priv *rtlpriv = rtl_priv(hw);
687 efuse_power_switch(hw, false, true); 679 efuse_power_switch(hw, false, true);
@@ -706,14 +698,14 @@ static void efuse_read_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
706 if (hoffset == offset) { 698 if (hoffset == offset) {
707 for (tmpidx = 0; tmpidx < word_cnts * 2; tmpidx++) { 699 for (tmpidx = 0; tmpidx < word_cnts * 2; tmpidx++) {
708 if (efuse_one_byte_read(hw, *efuse_addr + 1 + tmpidx, 700 if (efuse_one_byte_read(hw, *efuse_addr + 1 + tmpidx,
709 &efuse_data)) { 701 &efuse_data)) {
710 tmpdata[tmpidx] = efuse_data; 702 tmpdata[tmpidx] = efuse_data;
711 if (efuse_data != 0xff) 703 if (efuse_data != 0xff)
712 dataempty = true; 704 dataempty = false;
713 } 705 }
714 } 706 }
715 707
716 if (dataempty) { 708 if (!dataempty) {
717 *readstate = PG_STATE_DATA; 709 *readstate = PG_STATE_DATA;
718 } else { 710 } else {
719 *efuse_addr = *efuse_addr + (word_cnts * 2) + 1; 711 *efuse_addr = *efuse_addr + (word_cnts * 2) + 1;
@@ -729,7 +721,9 @@ static void efuse_read_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
729static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data) 721static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)
730{ 722{
731 u8 readstate = PG_STATE_HEADER; 723 u8 readstate = PG_STATE_HEADER;
724
732 bool continual = true; 725 bool continual = true;
726
733 u8 efuse_data, word_cnts = 0; 727 u8 efuse_data, word_cnts = 0;
734 u16 efuse_addr = 0; 728 u16 efuse_addr = 0;
735 u8 tmpdata[8]; 729 u8 tmpdata[8];
@@ -747,9 +741,8 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)
747 if (efuse_one_byte_read(hw, efuse_addr, &efuse_data) 741 if (efuse_one_byte_read(hw, efuse_addr, &efuse_data)
748 && (efuse_data != 0xFF)) 742 && (efuse_data != 0xFF))
749 efuse_read_data_case1(hw, &efuse_addr, 743 efuse_read_data_case1(hw, &efuse_addr,
750 efuse_data, 744 efuse_data, offset,
751 offset, tmpdata, 745 tmpdata, &readstate);
752 &readstate);
753 else 746 else
754 continual = false; 747 continual = false;
755 } else if (readstate & PG_STATE_DATA) { 748 } else if (readstate & PG_STATE_DATA) {
@@ -771,13 +764,14 @@ static int efuse_pg_packet_read(struct ieee80211_hw *hw, u8 offset, u8 *data)
771} 764}
772 765
773static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr, 766static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
774 u8 efuse_data, u8 offset, int *continual, 767 u8 efuse_data, u8 offset,
775 u8 *write_state, struct pgpkt_struct *target_pkt, 768 int *continual, u8 *write_state,
776 int *repeat_times, int *result, u8 word_en) 769 struct pgpkt_struct *target_pkt,
770 int *repeat_times, int *result, u8 word_en)
777{ 771{
778 struct rtl_priv *rtlpriv = rtl_priv(hw); 772 struct rtl_priv *rtlpriv = rtl_priv(hw);
779 struct pgpkt_struct tmp_pkt; 773 struct pgpkt_struct tmp_pkt;
780 bool dataempty = true; 774 int dataempty = true;
781 u8 originaldata[8 * sizeof(u8)]; 775 u8 originaldata[8 * sizeof(u8)];
782 u8 badworden = 0x0F; 776 u8 badworden = 0x0F;
783 u8 match_word_en, tmp_word_en; 777 u8 match_word_en, tmp_word_en;
@@ -794,9 +788,10 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
794 *write_state = PG_STATE_HEADER; 788 *write_state = PG_STATE_HEADER;
795 } else { 789 } else {
796 for (tmpindex = 0; tmpindex < (tmp_word_cnts * 2); tmpindex++) { 790 for (tmpindex = 0; tmpindex < (tmp_word_cnts * 2); tmpindex++) {
797 u16 address = *efuse_addr + 1 + tmpindex; 791 if (efuse_one_byte_read(hw,
798 if (efuse_one_byte_read(hw, address, 792 (*efuse_addr + 1 + tmpindex),
799 &efuse_data) && (efuse_data != 0xFF)) 793 &efuse_data) &&
794 (efuse_data != 0xFF))
800 dataempty = false; 795 dataempty = false;
801 } 796 }
802 797
@@ -806,33 +801,34 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
806 } else { 801 } else {
807 match_word_en = 0x0F; 802 match_word_en = 0x0F;
808 if (!((target_pkt->word_en & BIT(0)) | 803 if (!((target_pkt->word_en & BIT(0)) |
809 (tmp_pkt.word_en & BIT(0)))) 804 (tmp_pkt.word_en & BIT(0))))
810 match_word_en &= (~BIT(0)); 805 match_word_en &= (~BIT(0));
811 806
812 if (!((target_pkt->word_en & BIT(1)) | 807 if (!((target_pkt->word_en & BIT(1)) |
813 (tmp_pkt.word_en & BIT(1)))) 808 (tmp_pkt.word_en & BIT(1))))
814 match_word_en &= (~BIT(1)); 809 match_word_en &= (~BIT(1));
815 810
816 if (!((target_pkt->word_en & BIT(2)) | 811 if (!((target_pkt->word_en & BIT(2)) |
817 (tmp_pkt.word_en & BIT(2)))) 812 (tmp_pkt.word_en & BIT(2))))
818 match_word_en &= (~BIT(2)); 813 match_word_en &= (~BIT(2));
819 814
820 if (!((target_pkt->word_en & BIT(3)) | 815 if (!((target_pkt->word_en & BIT(3)) |
821 (tmp_pkt.word_en & BIT(3)))) 816 (tmp_pkt.word_en & BIT(3))))
822 match_word_en &= (~BIT(3)); 817 match_word_en &= (~BIT(3));
823 818
824 if ((match_word_en & 0x0F) != 0x0F) { 819 if ((match_word_en & 0x0F) != 0x0F) {
825 badworden = efuse_word_enable_data_write( 820 badworden =
826 hw, *efuse_addr + 1, 821 enable_efuse_data_write(hw,
827 tmp_pkt.word_en, 822 *efuse_addr + 1,
828 target_pkt->data); 823 tmp_pkt.word_en,
824 target_pkt->data);
829 825
830 if (0x0F != (badworden & 0x0F)) { 826 if (0x0F != (badworden & 0x0F)) {
831 u8 reorg_offset = offset; 827 u8 reorg_offset = offset;
832 u8 reorg_worden = badworden; 828 u8 reorg_worden = badworden;
833 efuse_pg_packet_write(hw, reorg_offset, 829 efuse_pg_packet_write(hw, reorg_offset,
834 reorg_worden, 830 reorg_worden,
835 originaldata); 831 originaldata);
836 } 832 }
837 833
838 tmp_word_en = 0x0F; 834 tmp_word_en = 0x0F;
@@ -845,11 +841,11 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
845 tmp_word_en &= (~BIT(1)); 841 tmp_word_en &= (~BIT(1));
846 842
847 if ((target_pkt->word_en & BIT(2)) ^ 843 if ((target_pkt->word_en & BIT(2)) ^
848 (match_word_en & BIT(2))) 844 (match_word_en & BIT(2)))
849 tmp_word_en &= (~BIT(2)); 845 tmp_word_en &= (~BIT(2));
850 846
851 if ((target_pkt->word_en & BIT(3)) ^ 847 if ((target_pkt->word_en & BIT(3)) ^
852 (match_word_en & BIT(3))) 848 (match_word_en & BIT(3)))
853 tmp_word_en &= (~BIT(3)); 849 tmp_word_en &= (~BIT(3));
854 850
855 if ((tmp_word_en & 0x0F) != 0x0F) { 851 if ((tmp_word_en & 0x0F) != 0x0F) {
@@ -873,7 +869,7 @@ static void efuse_write_data_case1(struct ieee80211_hw *hw, u16 *efuse_addr,
873 } 869 }
874 } 870 }
875 } 871 }
876 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse PG_STATE_HEADER-1\n"); 872 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse PG_STATE_HEADER-1\n");
877} 873}
878 874
879static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr, 875static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
@@ -908,12 +904,13 @@ static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
908 904
909 tmp_word_cnts = efuse_calculate_word_cnts(tmp_pkt.word_en); 905 tmp_word_cnts = efuse_calculate_word_cnts(tmp_pkt.word_en);
910 906
911 memset(originaldata, 0xff, 8 * sizeof(u8)); 907 memset(originaldata, 0xff, 8 * sizeof(u8));
912 908
913 if (efuse_pg_packet_read(hw, tmp_pkt.offset, originaldata)) { 909 if (efuse_pg_packet_read(hw, tmp_pkt.offset, originaldata)) {
914 badworden = efuse_word_enable_data_write(hw, 910 badworden = enable_efuse_data_write(hw,
915 *efuse_addr + 1, tmp_pkt.word_en, 911 *efuse_addr + 1,
916 originaldata); 912 tmp_pkt.word_en,
913 originaldata);
917 914
918 if (0x0F != (badworden & 0x0F)) { 915 if (0x0F != (badworden & 0x0F)) {
919 u8 reorg_offset = tmp_pkt.offset; 916 u8 reorg_offset = tmp_pkt.offset;
@@ -923,8 +920,8 @@ static void efuse_write_data_case2(struct ieee80211_hw *hw, u16 *efuse_addr,
923 originaldata); 920 originaldata);
924 *efuse_addr = efuse_get_current_size(hw); 921 *efuse_addr = efuse_get_current_size(hw);
925 } else { 922 } else {
926 *efuse_addr = *efuse_addr + (tmp_word_cnts * 2) 923 *efuse_addr = *efuse_addr +
927 + 1; 924 (tmp_word_cnts * 2) + 1;
928 } 925 }
929 } else { 926 } else {
930 *efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1; 927 *efuse_addr = *efuse_addr + (tmp_word_cnts * 2) + 1;
@@ -948,7 +945,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
948 struct rtl_priv *rtlpriv = rtl_priv(hw); 945 struct rtl_priv *rtlpriv = rtl_priv(hw);
949 struct pgpkt_struct target_pkt; 946 struct pgpkt_struct target_pkt;
950 u8 write_state = PG_STATE_HEADER; 947 u8 write_state = PG_STATE_HEADER;
951 int continual = true, result = true; 948 int continual = true, dataempty = true, result = true;
952 u16 efuse_addr = 0; 949 u16 efuse_addr = 0;
953 u8 efuse_data; 950 u8 efuse_data;
954 u8 target_word_cnts = 0; 951 u8 target_word_cnts = 0;
@@ -956,7 +953,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
956 static int repeat_times; 953 static int repeat_times;
957 954
958 if (efuse_get_current_size(hw) >= (EFUSE_MAX_SIZE - 955 if (efuse_get_current_size(hw) >= (EFUSE_MAX_SIZE -
959 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) { 956 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {
960 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, 957 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
961 "efuse_pg_packet_write error\n"); 958 "efuse_pg_packet_write error\n");
962 return false; 959 return false;
@@ -965,17 +962,18 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
965 target_pkt.offset = offset; 962 target_pkt.offset = offset;
966 target_pkt.word_en = word_en; 963 target_pkt.word_en = word_en;
967 964
968 memset(target_pkt.data, 0xFF, 8 * sizeof(u8)); 965 memset(target_pkt.data, 0xFF, 8 * sizeof(u8));
969 966
970 efuse_word_enable_data_read(word_en, data, target_pkt.data); 967 efuse_word_enable_data_read(word_en, data, target_pkt.data);
971 target_word_cnts = efuse_calculate_word_cnts(target_pkt.word_en); 968 target_word_cnts = efuse_calculate_word_cnts(target_pkt.word_en);
972 969
973 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse Power ON\n"); 970 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, "efuse Power ON\n");
974 971
975 while (continual && (efuse_addr < (EFUSE_MAX_SIZE - 972 while (continual && (efuse_addr < (EFUSE_MAX_SIZE -
976 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))) { 973 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN]))) {
977 974
978 if (write_state == PG_STATE_HEADER) { 975 if (write_state == PG_STATE_HEADER) {
976 dataempty = true;
979 badworden = 0x0F; 977 badworden = 0x0F;
980 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, 978 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
981 "efuse PG_STATE_HEADER\n"); 979 "efuse PG_STATE_HEADER\n");
@@ -985,7 +983,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
985 efuse_write_data_case1(hw, &efuse_addr, 983 efuse_write_data_case1(hw, &efuse_addr,
986 efuse_data, offset, 984 efuse_data, offset,
987 &continual, 985 &continual,
988 &write_state, &target_pkt, 986 &write_state,
987 &target_pkt,
989 &repeat_times, &result, 988 &repeat_times, &result,
990 word_en); 989 word_en);
991 else 990 else
@@ -999,15 +998,17 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
999 } else if (write_state == PG_STATE_DATA) { 998 } else if (write_state == PG_STATE_DATA) {
1000 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG, 999 RTPRINT(rtlpriv, FEEPROM, EFUSE_PG,
1001 "efuse PG_STATE_DATA\n"); 1000 "efuse PG_STATE_DATA\n");
1001 badworden = 0x0f;
1002 badworden = 1002 badworden =
1003 efuse_word_enable_data_write(hw, efuse_addr + 1, 1003 enable_efuse_data_write(hw, efuse_addr + 1,
1004 target_pkt.word_en, 1004 target_pkt.word_en,
1005 target_pkt.data); 1005 target_pkt.data);
1006 1006
1007 if ((badworden & 0x0F) == 0x0F) { 1007 if ((badworden & 0x0F) == 0x0F) {
1008 continual = false; 1008 continual = false;
1009 } else { 1009 } else {
1010 efuse_addr += (2 * target_word_cnts) + 1; 1010 efuse_addr =
1011 efuse_addr + (2 * target_word_cnts) + 1;
1011 1012
1012 target_pkt.offset = offset; 1013 target_pkt.offset = offset;
1013 target_pkt.word_en = badworden; 1014 target_pkt.word_en = badworden;
@@ -1027,7 +1028,7 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
1027 } 1028 }
1028 1029
1029 if (efuse_addr >= (EFUSE_MAX_SIZE - 1030 if (efuse_addr >= (EFUSE_MAX_SIZE -
1030 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) { 1031 rtlpriv->cfg->maps[EFUSE_OOB_PROTECT_BYTES_LEN])) {
1031 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, 1032 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
1032 "efuse_addr(%#x) Out of size!!\n", efuse_addr); 1033 "efuse_addr(%#x) Out of size!!\n", efuse_addr);
1033 } 1034 }
@@ -1035,8 +1036,8 @@ static int efuse_pg_packet_write(struct ieee80211_hw *hw,
1035 return true; 1036 return true;
1036} 1037}
1037 1038
1038static void efuse_word_enable_data_read(u8 word_en, 1039static void efuse_word_enable_data_read(u8 word_en, u8 *sourdata,
1039 u8 *sourdata, u8 *targetdata) 1040 u8 *targetdata)
1040{ 1041{
1041 if (!(word_en & BIT(0))) { 1042 if (!(word_en & BIT(0))) {
1042 targetdata[0] = sourdata[0]; 1043 targetdata[0] = sourdata[0];
@@ -1059,8 +1060,8 @@ static void efuse_word_enable_data_read(u8 word_en,
1059 } 1060 }
1060} 1061}
1061 1062
1062static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw, 1063static u8 enable_efuse_data_write(struct ieee80211_hw *hw,
1063 u16 efuse_addr, u8 word_en, u8 *data) 1064 u16 efuse_addr, u8 word_en, u8 *data)
1064{ 1065{
1065 struct rtl_priv *rtlpriv = rtl_priv(hw); 1066 struct rtl_priv *rtlpriv = rtl_priv(hw);
1066 u16 tmpaddr; 1067 u16 tmpaddr;
@@ -1069,8 +1070,8 @@ static u8 efuse_word_enable_data_write(struct ieee80211_hw *hw,
1069 u8 tmpdata[8]; 1070 u8 tmpdata[8];
1070 1071
1071 memset(tmpdata, 0xff, PGPKT_DATA_SIZE); 1072 memset(tmpdata, 0xff, PGPKT_DATA_SIZE);
1072 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD, "word_en = %x efuse_addr=%x\n", 1073 RT_TRACE(rtlpriv, COMP_EFUSE, DBG_LOUD,
1073 word_en, efuse_addr); 1074 "word_en = %x efuse_addr=%x\n", word_en, efuse_addr);
1074 1075
1075 if (!(word_en & BIT(0))) { 1076 if (!(word_en & BIT(0))) {
1076 tmpaddr = start_addr; 1077 tmpaddr = start_addr;
@@ -1127,19 +1128,22 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
1127 u16 tmpV16; 1128 u16 tmpV16;
1128 1129
1129 if (pwrstate && (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE)) { 1130 if (pwrstate && (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE)) {
1130 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8188EE)
1131 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_ACCESS],
1132 0x69);
1133 1131
1134 tmpV16 = rtl_read_word(rtlpriv, 1132 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192CE &&
1135 rtlpriv->cfg->maps[SYS_ISO_CTRL]); 1133 rtlhal->hw_type != HARDWARE_TYPE_RTL8192DE) {
1136 if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_PWC_EV12V])) { 1134 rtl_write_byte(rtlpriv,
1137 tmpV16 |= rtlpriv->cfg->maps[EFUSE_PWC_EV12V]; 1135 rtlpriv->cfg->maps[EFUSE_ACCESS], 0x69);
1138 rtl_write_word(rtlpriv, 1136 } else {
1139 rtlpriv->cfg->maps[SYS_ISO_CTRL], 1137 tmpV16 =
1140 tmpV16); 1138 rtl_read_word(rtlpriv,
1139 rtlpriv->cfg->maps[SYS_ISO_CTRL]);
1140 if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_PWC_EV12V])) {
1141 tmpV16 |= rtlpriv->cfg->maps[EFUSE_PWC_EV12V];
1142 rtl_write_word(rtlpriv,
1143 rtlpriv->cfg->maps[SYS_ISO_CTRL],
1144 tmpV16);
1145 }
1141 } 1146 }
1142
1143 tmpV16 = rtl_read_word(rtlpriv, 1147 tmpV16 = rtl_read_word(rtlpriv,
1144 rtlpriv->cfg->maps[SYS_FUNC_EN]); 1148 rtlpriv->cfg->maps[SYS_FUNC_EN]);
1145 if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_FEN_ELDR])) { 1149 if (!(tmpV16 & rtlpriv->cfg->maps[EFUSE_FEN_ELDR])) {
@@ -1164,7 +1168,10 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
1164 rtlpriv->cfg->maps[EFUSE_TEST] + 1168 rtlpriv->cfg->maps[EFUSE_TEST] +
1165 3); 1169 3);
1166 1170
1167 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE) { 1171 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1172 tempval &= ~(BIT(3) | BIT(4) | BIT(5) | BIT(6));
1173 tempval |= (VOLTAGE_V25 << 3);
1174 } else if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192SE) {
1168 tempval &= 0x0F; 1175 tempval &= 0x0F;
1169 tempval |= (VOLTAGE_V25 << 4); 1176 tempval |= (VOLTAGE_V25 << 4);
1170 } 1177 }
@@ -1176,11 +1183,11 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
1176 1183
1177 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) { 1184 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) {
1178 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK], 1185 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK],
1179 0x03); 1186 0x03);
1180 } 1187 }
1181
1182 } else { 1188 } else {
1183 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8188EE) 1189 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8192CE &&
1190 rtlhal->hw_type != HARDWARE_TYPE_RTL8192DE)
1184 rtl_write_byte(rtlpriv, 1191 rtl_write_byte(rtlpriv,
1185 rtlpriv->cfg->maps[EFUSE_ACCESS], 0); 1192 rtlpriv->cfg->maps[EFUSE_ACCESS], 0);
1186 1193
@@ -1195,27 +1202,28 @@ static void efuse_power_switch(struct ieee80211_hw *hw, u8 write, u8 pwrstate)
1195 1202
1196 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) { 1203 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192SE) {
1197 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK], 1204 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[EFUSE_CLK],
1198 0x02); 1205 0x02);
1199 } 1206 }
1200
1201 } 1207 }
1202
1203} 1208}
1204 1209
1205static u16 efuse_get_current_size(struct ieee80211_hw *hw) 1210static u16 efuse_get_current_size(struct ieee80211_hw *hw)
1206{ 1211{
1212 int continual = true;
1207 u16 efuse_addr = 0; 1213 u16 efuse_addr = 0;
1208 u8 hworden; 1214 u8 hoffset, hworden;
1209 u8 efuse_data, word_cnts; 1215 u8 efuse_data, word_cnts;
1210 1216
1211 while (efuse_one_byte_read(hw, efuse_addr, &efuse_data) && 1217 while (continual && efuse_one_byte_read(hw, efuse_addr, &efuse_data) &&
1212 efuse_addr < EFUSE_MAX_SIZE) { 1218 (efuse_addr < EFUSE_MAX_SIZE)) {
1213 if (efuse_data == 0xFF) 1219 if (efuse_data != 0xFF) {
1214 break; 1220 hoffset = (efuse_data >> 4) & 0x0F;
1215 1221 hworden = efuse_data & 0x0F;
1216 hworden = efuse_data & 0x0F; 1222 word_cnts = efuse_calculate_word_cnts(hworden);
1217 word_cnts = efuse_calculate_word_cnts(hworden); 1223 efuse_addr = efuse_addr + (word_cnts * 2) + 1;
1218 efuse_addr = efuse_addr + (word_cnts * 2) + 1; 1224 } else {
1225 continual = false;
1226 }
1219 } 1227 }
1220 1228
1221 return efuse_addr; 1229 return efuse_addr;
diff --git a/drivers/net/wireless/rtlwifi/efuse.h b/drivers/net/wireless/rtlwifi/efuse.h
index 1663b3afd41e..fdab8240a5d7 100644
--- a/drivers/net/wireless/rtlwifi/efuse.h
+++ b/drivers/net/wireless/rtlwifi/efuse.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -32,7 +28,6 @@
32 28
33#define EFUSE_IC_ID_OFFSET 506 29#define EFUSE_IC_ID_OFFSET 506
34 30
35#define EFUSE_MAP_LEN 128
36#define EFUSE_MAX_WORD_UNIT 4 31#define EFUSE_MAX_WORD_UNIT 4
37 32
38#define EFUSE_INIT_MAP 0 33#define EFUSE_INIT_MAP 0
@@ -107,12 +102,14 @@ struct efuse_priv {
107void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf); 102void read_efuse_byte(struct ieee80211_hw *hw, u16 _offset, u8 *pbuf);
108void efuse_initialize(struct ieee80211_hw *hw); 103void efuse_initialize(struct ieee80211_hw *hw);
109u8 efuse_read_1byte(struct ieee80211_hw *hw, u16 address); 104u8 efuse_read_1byte(struct ieee80211_hw *hw, u16 address);
105int efuse_one_byte_read(struct ieee80211_hw *hw, u16 addr, u8 *data);
110void efuse_write_1byte(struct ieee80211_hw *hw, u16 address, u8 value); 106void efuse_write_1byte(struct ieee80211_hw *hw, u16 address, u8 value);
111void read_efuse(struct ieee80211_hw *hw, u16 _offset, u16 _size_byte, u8 *pbuf); 107void read_efuse(struct ieee80211_hw *hw, u16 _offset,
112void efuse_shadow_read(struct ieee80211_hw *hw, u8 type, u16 offset, 108 u16 _size_byte, u8 *pbuf);
113 u32 *value); 109void efuse_shadow_read(struct ieee80211_hw *hw, u8 type,
114void efuse_shadow_write(struct ieee80211_hw *hw, u8 type, u16 offset, 110 u16 offset, u32 *value);
115 u32 value); 111void efuse_shadow_write(struct ieee80211_hw *hw, u8 type,
112 u16 offset, u32 value);
116bool efuse_shadow_update(struct ieee80211_hw *hw); 113bool efuse_shadow_update(struct ieee80211_hw *hw);
117bool efuse_shadow_update_chk(struct ieee80211_hw *hw); 114bool efuse_shadow_update_chk(struct ieee80211_hw *hw);
118void rtl_efuse_shadow_map_update(struct ieee80211_hw *hw); 115void rtl_efuse_shadow_map_update(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c
index 74a8ba4b8844..667aba81246c 100644
--- a/drivers/net/wireless/rtlwifi/pci.c
+++ b/drivers/net/wireless/rtlwifi/pci.c
@@ -33,6 +33,7 @@
33#include "base.h" 33#include "base.h"
34#include "ps.h" 34#include "ps.h"
35#include "efuse.h" 35#include "efuse.h"
36#include <linux/interrupt.h>
36#include <linux/export.h> 37#include <linux/export.h>
37#include <linux/kmemleak.h> 38#include <linux/kmemleak.h>
38#include <linux/module.h> 39#include <linux/module.h>
@@ -44,10 +45,10 @@ MODULE_LICENSE("GPL");
44MODULE_DESCRIPTION("PCI basic driver for rtlwifi"); 45MODULE_DESCRIPTION("PCI basic driver for rtlwifi");
45 46
46static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = { 47static const u16 pcibridge_vendors[PCI_BRIDGE_VENDOR_MAX] = {
47 PCI_VENDOR_ID_INTEL, 48 INTEL_VENDOR_ID,
48 PCI_VENDOR_ID_ATI, 49 ATI_VENDOR_ID,
49 PCI_VENDOR_ID_AMD, 50 AMD_VENDOR_ID,
50 PCI_VENDOR_ID_SI 51 SIS_VENDOR_ID
51}; 52};
52 53
53static const u8 ac_to_hwq[] = { 54static const u8 ac_to_hwq[] = {
@@ -566,27 +567,25 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
566 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio]; 567 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio];
567 568
568 while (skb_queue_len(&ring->queue)) { 569 while (skb_queue_len(&ring->queue)) {
569 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
570 struct sk_buff *skb; 570 struct sk_buff *skb;
571 struct ieee80211_tx_info *info; 571 struct ieee80211_tx_info *info;
572 __le16 fc; 572 __le16 fc;
573 u8 tid; 573 u8 tid;
574 u8 *entry;
574 575
575 u8 own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) entry, true, 576 if (rtlpriv->use_new_trx_flow)
576 HW_DESC_OWN); 577 entry = (u8 *)(&ring->buffer_desc[ring->idx]);
578 else
579 entry = (u8 *)(&ring->desc[ring->idx]);
577 580
578 /*beacon packet will only use the first 581 if (!rtlpriv->cfg->ops->is_tx_desc_closed(hw, prio, ring->idx))
579 *descriptor by defaut, and the own may not
580 *be cleared by the hardware
581 */
582 if (own)
583 return; 582 return;
584 ring->idx = (ring->idx + 1) % ring->entries; 583 ring->idx = (ring->idx + 1) % ring->entries;
585 584
586 skb = __skb_dequeue(&ring->queue); 585 skb = __skb_dequeue(&ring->queue);
587 pci_unmap_single(rtlpci->pdev, 586 pci_unmap_single(rtlpci->pdev,
588 rtlpriv->cfg->ops-> 587 rtlpriv->cfg->ops->
589 get_desc((u8 *) entry, true, 588 get_desc((u8 *)entry, true,
590 HW_DESC_TXBUFF_ADDR), 589 HW_DESC_TXBUFF_ADDR),
591 skb->len, PCI_DMA_TODEVICE); 590 skb->len, PCI_DMA_TODEVICE);
592 591
@@ -598,7 +597,7 @@ static void _rtl_pci_tx_isr(struct ieee80211_hw *hw, int prio)
598 "new ring->idx:%d, free: skb_queue_len:%d, free: seq:%x\n", 597 "new ring->idx:%d, free: skb_queue_len:%d, free: seq:%x\n",
599 ring->idx, 598 ring->idx,
600 skb_queue_len(&ring->queue), 599 skb_queue_len(&ring->queue),
601 *(u16 *) (skb->data + 22)); 600 *(u16 *)(skb->data + 22));
602 601
603 if (prio == TXCMD_QUEUE) { 602 if (prio == TXCMD_QUEUE) {
604 dev_kfree_skb(skb); 603 dev_kfree_skb(skb);
@@ -666,175 +665,276 @@ tx_status_ok:
666 } 665 }
667} 666}
668 667
669static void _rtl_receive_one(struct ieee80211_hw *hw, struct sk_buff *skb, 668static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,
670 struct ieee80211_rx_status rx_status) 669 u8 *entry, int rxring_idx, int desc_idx)
671{ 670{
672 struct rtl_priv *rtlpriv = rtl_priv(hw); 671 struct rtl_priv *rtlpriv = rtl_priv(hw);
673 struct ieee80211_hdr *hdr = rtl_get_hdr(skb); 672 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
674 __le16 fc = rtl_get_fc(skb); 673 u32 bufferaddress;
675 bool unicast = false; 674 u8 tmp_one = 1;
676 struct sk_buff *uskb = NULL; 675 struct sk_buff *skb;
677 u8 *pdata; 676
678 677 skb = dev_alloc_skb(rtlpci->rxbuffersize);
679 678 if (!skb)
680 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status, sizeof(rx_status)); 679 return 0;
681 680 rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;
682 if (is_broadcast_ether_addr(hdr->addr1)) { 681
683 ;/*TODO*/ 682 /* just set skb->cb to mapping addr for pci_unmap_single use */
684 } else if (is_multicast_ether_addr(hdr->addr1)) { 683 *((dma_addr_t *)skb->cb) =
685 ;/*TODO*/ 684 pci_map_single(rtlpci->pdev, skb_tail_pointer(skb),
685 rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
686 bufferaddress = *((dma_addr_t *)skb->cb);
687 if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
688 return 0;
689 if (rtlpriv->use_new_trx_flow) {
690 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
691 HW_DESC_RX_PREPARE,
692 (u8 *)&bufferaddress);
686 } else { 693 } else {
687 unicast = true; 694 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
688 rtlpriv->stats.rxbytesunicast += skb->len; 695 HW_DESC_RXBUFF_ADDR,
696 (u8 *)&bufferaddress);
697 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
698 HW_DESC_RXPKT_LEN,
699 (u8 *)&rtlpci->rxbuffersize);
700 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
701 HW_DESC_RXOWN,
702 (u8 *)&tmp_one);
689 } 703 }
704 return 1;
705}
690 706
691 if (ieee80211_is_data(fc)) { 707/* inorder to receive 8K AMSDU we have set skb to
692 rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX); 708 * 9100bytes in init rx ring, but if this packet is
693 709 * not a AMSDU, this large packet will be sent to
694 if (unicast) 710 * TCP/IP directly, this cause big packet ping fail
695 rtlpriv->link_info.num_rx_inperiod++; 711 * like: "ping -s 65507", so here we will realloc skb
712 * based on the true size of packet, Mac80211
713 * Probably will do it better, but does not yet.
714 *
715 * Some platform will fail when alloc skb sometimes.
716 * in this condition, we will send the old skb to
717 * mac80211 directly, this will not cause any other
718 * issues, but only this packet will be lost by TCP/IP
719 */
720static void _rtl_pci_rx_to_mac80211(struct ieee80211_hw *hw,
721 struct sk_buff *skb,
722 struct ieee80211_rx_status rx_status)
723{
724 if (unlikely(!rtl_action_proc(hw, skb, false))) {
725 dev_kfree_skb_any(skb);
726 } else {
727 struct sk_buff *uskb = NULL;
728 u8 *pdata;
729
730 uskb = dev_alloc_skb(skb->len + 128);
731 if (likely(uskb)) {
732 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status,
733 sizeof(rx_status));
734 pdata = (u8 *)skb_put(uskb, skb->len);
735 memcpy(pdata, skb->data, skb->len);
736 dev_kfree_skb_any(skb);
737 ieee80211_rx_irqsafe(hw, uskb);
738 } else {
739 ieee80211_rx_irqsafe(hw, skb);
740 }
696 } 741 }
742}
697 743
698 /* static bcn for roaming */ 744/*hsisr interrupt handler*/
699 rtl_beacon_statistic(hw, skb); 745static void _rtl_pci_hs_interrupt(struct ieee80211_hw *hw)
700 rtl_p2p_info(hw, (void *)skb->data, skb->len); 746{
701 747 struct rtl_priv *rtlpriv = rtl_priv(hw);
702 /* for sw lps */ 748 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
703 rtl_swlps_beacon(hw, (void *)skb->data, skb->len);
704 rtl_recognize_peer(hw, (void *)skb->data, skb->len);
705 if ((rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP) &&
706 (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) &&
707 (ieee80211_is_beacon(fc) || ieee80211_is_probe_resp(fc)))
708 return;
709
710 if (unlikely(!rtl_action_proc(hw, skb, false)))
711 return;
712
713 uskb = dev_alloc_skb(skb->len + 128);
714 if (!uskb)
715 return; /* exit if allocation failed */
716 memcpy(IEEE80211_SKB_RXCB(uskb), &rx_status, sizeof(rx_status));
717 pdata = (u8 *)skb_put(uskb, skb->len);
718 memcpy(pdata, skb->data, skb->len);
719 749
720 ieee80211_rx_irqsafe(hw, uskb); 750 rtl_write_byte(rtlpriv, rtlpriv->cfg->maps[MAC_HSISR],
751 rtl_read_byte(rtlpriv, rtlpriv->cfg->maps[MAC_HSISR]) |
752 rtlpci->sys_irq_mask);
721} 753}
722 754
723static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) 755static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw)
724{ 756{
725 struct rtl_priv *rtlpriv = rtl_priv(hw); 757 struct rtl_priv *rtlpriv = rtl_priv(hw);
726 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 758 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
727 int rx_queue_idx = RTL_PCI_RX_MPDU_QUEUE; 759 int rxring_idx = RTL_PCI_RX_MPDU_QUEUE;
728
729 struct ieee80211_rx_status rx_status = { 0 }; 760 struct ieee80211_rx_status rx_status = { 0 };
730 unsigned int count = rtlpci->rxringcount; 761 unsigned int count = rtlpci->rxringcount;
731 u8 own; 762 u8 own;
732 u8 tmp_one; 763 u8 tmp_one;
733 u32 bufferaddress; 764 bool unicast = false;
734 765 u8 hw_queue = 0;
766 unsigned int rx_remained_cnt;
735 struct rtl_stats stats = { 767 struct rtl_stats stats = {
736 .signal = 0, 768 .signal = 0,
737 .rate = 0, 769 .rate = 0,
738 }; 770 };
739 int index = rtlpci->rx_ring[rx_queue_idx].idx;
740 771
741 if (rtlpci->driver_is_goingto_unload)
742 return;
743 /*RX NORMAL PKT */ 772 /*RX NORMAL PKT */
744 while (count--) { 773 while (count--) {
745 /*rx descriptor */ 774 struct ieee80211_hdr *hdr;
746 struct rtl_rx_desc *pdesc = &rtlpci->rx_ring[rx_queue_idx].desc[ 775 __le16 fc;
747 index]; 776 u16 len;
777 /*rx buffer descriptor */
778 struct rtl_rx_buffer_desc *buffer_desc = NULL;
779 /*if use new trx flow, it means wifi info */
780 struct rtl_rx_desc *pdesc = NULL;
748 /*rx pkt */ 781 /*rx pkt */
749 struct sk_buff *skb = rtlpci->rx_ring[rx_queue_idx].rx_buf[ 782 struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[
750 index]; 783 rtlpci->rx_ring[rxring_idx].idx];
751 struct sk_buff *new_skb = NULL; 784
752 785 if (rtlpriv->use_new_trx_flow) {
753 own = (u8) rtlpriv->cfg->ops->get_desc((u8 *) pdesc, 786 rx_remained_cnt =
754 false, HW_DESC_OWN); 787 rtlpriv->cfg->ops->rx_desc_buff_remained_cnt(hw,
755 788 hw_queue);
756 /*wait data to be filled by hardware */ 789 if (rx_remained_cnt < 1)
757 if (own) 790 return;
758 break; 791
792 } else { /* rx descriptor */
793 pdesc = &rtlpci->rx_ring[rxring_idx].desc[
794 rtlpci->rx_ring[rxring_idx].idx];
795
796 own = (u8)rtlpriv->cfg->ops->get_desc((u8 *)pdesc,
797 false,
798 HW_DESC_OWN);
799 if (own) /* wait data to be filled by hardware */
800 return;
801 }
759 802
803 /* Reaching this point means: data is filled already
804 * AAAAAAttention !!!
805 * We can NOT access 'skb' before 'pci_unmap_single'
806 */
807 pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb),
808 rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
809
810 if (rtlpriv->use_new_trx_flow) {
811 buffer_desc =
812 &rtlpci->rx_ring[rxring_idx].buffer_desc
813 [rtlpci->rx_ring[rxring_idx].idx];
814 /*means rx wifi info*/
815 pdesc = (struct rtl_rx_desc *)skb->data;
816 }
817 memset(&rx_status , 0 , sizeof(rx_status));
760 rtlpriv->cfg->ops->query_rx_desc(hw, &stats, 818 rtlpriv->cfg->ops->query_rx_desc(hw, &stats,
761 &rx_status, 819 &rx_status, (u8 *)pdesc, skb);
762 (u8 *) pdesc, skb);
763 820
764 if (stats.crc || stats.hwerror) 821 if (rtlpriv->use_new_trx_flow)
765 goto done; 822 rtlpriv->cfg->ops->rx_check_dma_ok(hw,
823 (u8 *)buffer_desc,
824 hw_queue);
766 825
767 new_skb = dev_alloc_skb(rtlpci->rxbuffersize); 826 len = rtlpriv->cfg->ops->get_desc((u8 *)pdesc, false,
768 if (unlikely(!new_skb)) { 827 HW_DESC_RXPKT_LEN);
769 RT_TRACE(rtlpriv, (COMP_INTR | COMP_RECV), DBG_DMESG,
770 "can't alloc skb for rx\n");
771 goto done;
772 }
773 kmemleak_not_leak(new_skb);
774 828
775 pci_unmap_single(rtlpci->pdev, 829 if (skb->end - skb->tail > len) {
776 *((dma_addr_t *) skb->cb), 830 skb_put(skb, len);
777 rtlpci->rxbuffersize, 831 if (rtlpriv->use_new_trx_flow)
778 PCI_DMA_FROMDEVICE); 832 skb_reserve(skb, stats.rx_drvinfo_size +
833 stats.rx_bufshift + 24);
834 else
835 skb_reserve(skb, stats.rx_drvinfo_size +
836 stats.rx_bufshift);
779 837
780 skb_put(skb, rtlpriv->cfg->ops->get_desc((u8 *) pdesc, false, 838 } else {
781 HW_DESC_RXPKT_LEN)); 839 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
782 skb_reserve(skb, stats.rx_drvinfo_size + stats.rx_bufshift); 840 "skb->end - skb->tail = %d, len is %d\n",
841 skb->end - skb->tail, len);
842 break;
843 }
844 /* handle command packet here */
845 if (rtlpriv->cfg->ops->rx_command_packet(hw, stats, skb)) {
846 dev_kfree_skb_any(skb);
847 goto end;
848 }
783 849
784 /* 850 /*
785 * NOTICE This can not be use for mac80211, 851 * NOTICE This can not be use for mac80211,
786 * this is done in mac80211 code, 852 * this is done in mac80211 code,
787 * if you done here sec DHCP will fail 853 * if done here sec DHCP will fail
788 * skb_trim(skb, skb->len - 4); 854 * skb_trim(skb, skb->len - 4);
789 */ 855 */
790 856
791 _rtl_receive_one(hw, skb, rx_status); 857 hdr = rtl_get_hdr(skb);
858 fc = rtl_get_fc(skb);
859
860 if (!stats.crc && !stats.hwerror) {
861 memcpy(IEEE80211_SKB_RXCB(skb), &rx_status,
862 sizeof(rx_status));
863
864 if (is_broadcast_ether_addr(hdr->addr1)) {
865 ;/*TODO*/
866 } else if (is_multicast_ether_addr(hdr->addr1)) {
867 ;/*TODO*/
868 } else {
869 unicast = true;
870 rtlpriv->stats.rxbytesunicast += skb->len;
871 }
872 rtl_is_special_data(hw, skb, false);
792 873
874 if (ieee80211_is_data(fc)) {
875 rtlpriv->cfg->ops->led_control(hw, LED_CTL_RX);
876 if (unicast)
877 rtlpriv->link_info.num_rx_inperiod++;
878 }
879 /* static bcn for roaming */
880 rtl_beacon_statistic(hw, skb);
881 rtl_p2p_info(hw, (void *)skb->data, skb->len);
882 /* for sw lps */
883 rtl_swlps_beacon(hw, (void *)skb->data, skb->len);
884 rtl_recognize_peer(hw, (void *)skb->data, skb->len);
885 if ((rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP) &&
886 (rtlpriv->rtlhal.current_bandtype ==
887 BAND_ON_2_4G) &&
888 (ieee80211_is_beacon(fc) ||
889 ieee80211_is_probe_resp(fc))) {
890 dev_kfree_skb_any(skb);
891 } else {
892 _rtl_pci_rx_to_mac80211(hw, skb, rx_status);
893 }
894 } else {
895 dev_kfree_skb_any(skb);
896 }
897 if (rtlpriv->use_new_trx_flow) {
898 rtlpci->rx_ring[hw_queue].next_rx_rp += 1;
899 rtlpci->rx_ring[hw_queue].next_rx_rp %=
900 RTL_PCI_MAX_RX_COUNT;
901
902 rx_remained_cnt--;
903 rtl_write_word(rtlpriv, 0x3B4,
904 rtlpci->rx_ring[hw_queue].next_rx_rp);
905 }
793 if (((rtlpriv->link_info.num_rx_inperiod + 906 if (((rtlpriv->link_info.num_rx_inperiod +
794 rtlpriv->link_info.num_tx_inperiod) > 8) || 907 rtlpriv->link_info.num_tx_inperiod) > 8) ||
795 (rtlpriv->link_info.num_rx_inperiod > 2)) { 908 (rtlpriv->link_info.num_rx_inperiod > 2)) {
796 rtlpriv->enter_ps = false; 909 rtlpriv->enter_ps = false;
797 schedule_work(&rtlpriv->works.lps_change_work); 910 schedule_work(&rtlpriv->works.lps_change_work);
798 } 911 }
912end:
913 if (rtlpriv->use_new_trx_flow) {
914 _rtl_pci_init_one_rxdesc(hw, (u8 *)buffer_desc,
915 rxring_idx,
916 rtlpci->rx_ring[rxring_idx].idx);
917 } else {
918 _rtl_pci_init_one_rxdesc(hw, (u8 *)pdesc, rxring_idx,
919 rtlpci->rx_ring[rxring_idx].idx);
799 920
800 dev_kfree_skb_any(skb); 921 if (rtlpci->rx_ring[rxring_idx].idx ==
801 skb = new_skb; 922 rtlpci->rxringcount - 1)
802 923 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc,
803 rtlpci->rx_ring[rx_queue_idx].rx_buf[index] = skb; 924 false,
804 *((dma_addr_t *) skb->cb) = 925 HW_DESC_RXERO,
805 pci_map_single(rtlpci->pdev, skb_tail_pointer(skb), 926 (u8 *)&tmp_one);
806 rtlpci->rxbuffersize, 927 }
807 PCI_DMA_FROMDEVICE); 928 rtlpci->rx_ring[rxring_idx].idx =
808 929 (rtlpci->rx_ring[rxring_idx].idx + 1) %
809done: 930 rtlpci->rxringcount;
810 bufferaddress = (*((dma_addr_t *)skb->cb));
811 if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress))
812 return;
813 tmp_one = 1;
814 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false,
815 HW_DESC_RXBUFF_ADDR,
816 (u8 *)&bufferaddress);
817 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false,
818 HW_DESC_RXPKT_LEN,
819 (u8 *)&rtlpci->rxbuffersize);
820
821 if (index == rtlpci->rxringcount - 1)
822 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false,
823 HW_DESC_RXERO,
824 &tmp_one);
825
826 rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc, false, HW_DESC_RXOWN,
827 &tmp_one);
828
829 index = (index + 1) % rtlpci->rxringcount;
830 } 931 }
831
832 rtlpci->rx_ring[rx_queue_idx].idx = index;
833} 932}
834 933
835static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id) 934static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
836{ 935{
837 struct ieee80211_hw *hw = dev_id; 936 struct ieee80211_hw *hw = dev_id;
937 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
838 struct rtl_priv *rtlpriv = rtl_priv(hw); 938 struct rtl_priv *rtlpriv = rtl_priv(hw);
839 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 939 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
840 unsigned long flags; 940 unsigned long flags;
@@ -842,16 +942,18 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
842 u32 intb = 0; 942 u32 intb = 0;
843 irqreturn_t ret = IRQ_HANDLED; 943 irqreturn_t ret = IRQ_HANDLED;
844 944
845 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 945 if (rtlpci->irq_enabled == 0)
946 return ret;
947
948 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock , flags);
949 rtlpriv->cfg->ops->disable_interrupt(hw);
846 950
847 /*read ISR: 4/8bytes */ 951 /*read ISR: 4/8bytes */
848 rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb); 952 rtlpriv->cfg->ops->interrupt_recognized(hw, &inta, &intb);
849 953
850 /*Shared IRQ or HW disappared */ 954 /*Shared IRQ or HW disappared */
851 if (!inta || inta == 0xffff) { 955 if (!inta || inta == 0xffff)
852 ret = IRQ_NONE;
853 goto done; 956 goto done;
854 }
855 957
856 /*<1> beacon related */ 958 /*<1> beacon related */
857 if (inta & rtlpriv->cfg->maps[RTL_IMR_TBDOK]) { 959 if (inta & rtlpriv->cfg->maps[RTL_IMR_TBDOK]) {
@@ -874,8 +976,8 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
874 tasklet_schedule(&rtlpriv->works.irq_prepare_bcn_tasklet); 976 tasklet_schedule(&rtlpriv->works.irq_prepare_bcn_tasklet);
875 } 977 }
876 978
877 /*<3> Tx related */ 979 /*<2> Tx related */
878 if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_TXFOVW])) 980 if (unlikely(intb & rtlpriv->cfg->maps[RTL_IMR_TXFOVW]))
879 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "IMR_TXFOVW!\n"); 981 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "IMR_TXFOVW!\n");
880 982
881 if (inta & rtlpriv->cfg->maps[RTL_IMR_MGNTDOK]) { 983 if (inta & rtlpriv->cfg->maps[RTL_IMR_MGNTDOK]) {
@@ -932,7 +1034,7 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
932 } 1034 }
933 } 1035 }
934 1036
935 /*<2> Rx related */ 1037 /*<3> Rx related */
936 if (inta & rtlpriv->cfg->maps[RTL_IMR_ROK]) { 1038 if (inta & rtlpriv->cfg->maps[RTL_IMR_ROK]) {
937 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, "Rx ok interrupt!\n"); 1039 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, "Rx ok interrupt!\n");
938 _rtl_pci_rx_interrupt(hw); 1040 _rtl_pci_rx_interrupt(hw);
@@ -944,12 +1046,12 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
944 _rtl_pci_rx_interrupt(hw); 1046 _rtl_pci_rx_interrupt(hw);
945 } 1047 }
946 1048
947 if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_RXFOVW])) { 1049 if (unlikely(intb & rtlpriv->cfg->maps[RTL_IMR_RXFOVW])) {
948 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "rx overflow !\n"); 1050 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "rx overflow !\n");
949 _rtl_pci_rx_interrupt(hw); 1051 _rtl_pci_rx_interrupt(hw);
950 } 1052 }
951 1053
952 /*fw related*/ 1054 /*<4> fw related*/
953 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8723AE) { 1055 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8723AE) {
954 if (inta & rtlpriv->cfg->maps[RTL_IMR_C2HCMD]) { 1056 if (inta & rtlpriv->cfg->maps[RTL_IMR_C2HCMD]) {
955 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE, 1057 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
@@ -959,10 +1061,26 @@ static irqreturn_t _rtl_pci_interrupt(int irq, void *dev_id)
959 } 1061 }
960 } 1062 }
961 1063
1064 /*<5> hsisr related*/
1065 /* Only 8188EE & 8723BE Supported.
1066 * If Other ICs Come in, System will corrupt,
1067 * because maps[RTL_IMR_HSISR_IND] & maps[MAC_HSISR]
1068 * are not initialized
1069 */
1070 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8188EE ||
1071 rtlhal->hw_type == HARDWARE_TYPE_RTL8723BE) {
1072 if (unlikely(inta & rtlpriv->cfg->maps[RTL_IMR_HSISR_IND])) {
1073 RT_TRACE(rtlpriv, COMP_INTR, DBG_TRACE,
1074 "hsisr interrupt!\n");
1075 _rtl_pci_hs_interrupt(hw);
1076 }
1077 }
1078
962 if (rtlpriv->rtlhal.earlymode_enable) 1079 if (rtlpriv->rtlhal.earlymode_enable)
963 tasklet_schedule(&rtlpriv->works.irq_tasklet); 1080 tasklet_schedule(&rtlpriv->works.irq_tasklet);
964 1081
965done: 1082done:
1083 rtlpriv->cfg->ops->enable_interrupt(hw);
966 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 1084 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
967 return ret; 1085 return ret;
968} 1086}
@@ -990,13 +1108,8 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
990 memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); 1108 memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
991 ring = &rtlpci->tx_ring[BEACON_QUEUE]; 1109 ring = &rtlpci->tx_ring[BEACON_QUEUE];
992 pskb = __skb_dequeue(&ring->queue); 1110 pskb = __skb_dequeue(&ring->queue);
993 if (pskb) { 1111 if (pskb)
994 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
995 pci_unmap_single(rtlpci->pdev, rtlpriv->cfg->ops->get_desc(
996 (u8 *) entry, true, HW_DESC_TXBUFF_ADDR),
997 pskb->len, PCI_DMA_TODEVICE);
998 kfree_skb(pskb); 1112 kfree_skb(pskb);
999 }
1000 1113
1001 /*NB: the beacon data buffer must be 32-bit aligned. */ 1114 /*NB: the beacon data buffer must be 32-bit aligned. */
1002 pskb = ieee80211_beacon_get(hw, mac->vif); 1115 pskb = ieee80211_beacon_get(hw, mac->vif);
@@ -1005,7 +1118,10 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
1005 hdr = rtl_get_hdr(pskb); 1118 hdr = rtl_get_hdr(pskb);
1006 info = IEEE80211_SKB_CB(pskb); 1119 info = IEEE80211_SKB_CB(pskb);
1007 pdesc = &ring->desc[0]; 1120 pdesc = &ring->desc[0];
1008 rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *) pdesc, 1121 if (rtlpriv->use_new_trx_flow)
1122 pbuffer_desc = &ring->buffer_desc[0];
1123
1124 rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *)pdesc,
1009 (u8 *)pbuffer_desc, info, NULL, pskb, 1125 (u8 *)pbuffer_desc, info, NULL, pskb,
1010 BEACON_QUEUE, &tcb_desc); 1126 BEACON_QUEUE, &tcb_desc);
1011 1127
@@ -1020,10 +1136,18 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw)
1020static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw) 1136static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
1021{ 1137{
1022 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1138 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1139 struct rtl_priv *rtlpriv = rtl_priv(hw);
1140 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1023 u8 i; 1141 u8 i;
1142 u16 desc_num;
1143
1144 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192EE)
1145 desc_num = TX_DESC_NUM_92E;
1146 else
1147 desc_num = RT_TXDESC_NUM;
1024 1148
1025 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) 1149 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++)
1026 rtlpci->txringcount[i] = RT_TXDESC_NUM; 1150 rtlpci->txringcount[i] = desc_num;
1027 1151
1028 /* 1152 /*
1029 *we just alloc 2 desc for beacon queue, 1153 *we just alloc 2 desc for beacon queue,
@@ -1031,12 +1155,12 @@ static void _rtl_pci_init_trx_var(struct ieee80211_hw *hw)
1031 */ 1155 */
1032 rtlpci->txringcount[BEACON_QUEUE] = 2; 1156 rtlpci->txringcount[BEACON_QUEUE] = 2;
1033 1157
1034 /* 1158 /*BE queue need more descriptor for performance
1035 *BE queue need more descriptor for performance
1036 *consideration or, No more tx desc will happen, 1159 *consideration or, No more tx desc will happen,
1037 *and may cause mac80211 mem leakage. 1160 *and may cause mac80211 mem leakage.
1038 */ 1161 */
1039 rtlpci->txringcount[BE_QUEUE] = RT_TXDESC_NUM_BE_QUEUE; 1162 if (!rtl_priv(hw)->use_new_trx_flow)
1163 rtlpci->txringcount[BE_QUEUE] = RT_TXDESC_NUM_BE_QUEUE;
1040 1164
1041 rtlpci->rxbuffersize = 9100; /*2048/1024; */ 1165 rtlpci->rxbuffersize = 9100; /*2048/1024; */
1042 rtlpci->rxringcount = RTL_PCI_MAX_RX_COUNT; /*64; */ 1166 rtlpci->rxringcount = RTL_PCI_MAX_RX_COUNT; /*64; */
@@ -1087,113 +1211,124 @@ static int _rtl_pci_init_tx_ring(struct ieee80211_hw *hw,
1087{ 1211{
1088 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1212 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1089 struct rtl_priv *rtlpriv = rtl_priv(hw); 1213 struct rtl_priv *rtlpriv = rtl_priv(hw);
1090 struct rtl_tx_desc *ring; 1214 struct rtl_tx_buffer_desc *buffer_desc;
1091 dma_addr_t dma; 1215 struct rtl_tx_desc *desc;
1216 dma_addr_t buffer_desc_dma, desc_dma;
1092 u32 nextdescaddress; 1217 u32 nextdescaddress;
1093 int i; 1218 int i;
1094 1219
1095 ring = pci_zalloc_consistent(rtlpci->pdev, sizeof(*ring) * entries, 1220 /* alloc tx buffer desc for new trx flow*/
1096 &dma); 1221 if (rtlpriv->use_new_trx_flow) {
1097 if (!ring || (unsigned long)ring & 0xFF) { 1222 buffer_desc =
1223 pci_zalloc_consistent(rtlpci->pdev,
1224 sizeof(*buffer_desc) * entries,
1225 &buffer_desc_dma);
1226
1227 if (!buffer_desc || (unsigned long)buffer_desc & 0xFF) {
1228 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1229 "Cannot allocate TX ring (prio = %d)\n",
1230 prio);
1231 return -ENOMEM;
1232 }
1233
1234 rtlpci->tx_ring[prio].buffer_desc = buffer_desc;
1235 rtlpci->tx_ring[prio].buffer_desc_dma = buffer_desc_dma;
1236
1237 rtlpci->tx_ring[prio].cur_tx_rp = 0;
1238 rtlpci->tx_ring[prio].cur_tx_wp = 0;
1239 rtlpci->tx_ring[prio].avl_desc = entries;
1240 }
1241
1242 /* alloc dma for this ring */
1243 desc = pci_zalloc_consistent(rtlpci->pdev,
1244 sizeof(*desc) * entries, &desc_dma);
1245
1246 if (!desc || (unsigned long)desc & 0xFF) {
1098 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1247 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1099 "Cannot allocate TX ring (prio = %d)\n", prio); 1248 "Cannot allocate TX ring (prio = %d)\n", prio);
1100 return -ENOMEM; 1249 return -ENOMEM;
1101 } 1250 }
1102 1251
1103 rtlpci->tx_ring[prio].desc = ring; 1252 rtlpci->tx_ring[prio].desc = desc;
1104 rtlpci->tx_ring[prio].dma = dma; 1253 rtlpci->tx_ring[prio].dma = desc_dma;
1254
1105 rtlpci->tx_ring[prio].idx = 0; 1255 rtlpci->tx_ring[prio].idx = 0;
1106 rtlpci->tx_ring[prio].entries = entries; 1256 rtlpci->tx_ring[prio].entries = entries;
1107 skb_queue_head_init(&rtlpci->tx_ring[prio].queue); 1257 skb_queue_head_init(&rtlpci->tx_ring[prio].queue);
1108 1258
1109 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "queue:%d, ring_addr:%p\n", 1259 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "queue:%d, ring_addr:%p\n",
1110 prio, ring); 1260 prio, desc);
1111 1261
1112 for (i = 0; i < entries; i++) { 1262 /* init every desc in this ring */
1113 nextdescaddress = (u32) dma + 1263 if (!rtlpriv->use_new_trx_flow) {
1114 ((i + 1) % entries) * 1264 for (i = 0; i < entries; i++) {
1115 sizeof(*ring); 1265 nextdescaddress = (u32)desc_dma +
1116 1266 ((i + 1) % entries) *
1117 rtlpriv->cfg->ops->set_desc(hw, (u8 *)&(ring[i]), 1267 sizeof(*desc);
1118 true, HW_DESC_TX_NEXTDESC_ADDR, 1268
1119 (u8 *)&nextdescaddress); 1269 rtlpriv->cfg->ops->set_desc(hw, (u8 *)&desc[i],
1270 true,
1271 HW_DESC_TX_NEXTDESC_ADDR,
1272 (u8 *)&nextdescaddress);
1273 }
1120 } 1274 }
1121
1122 return 0; 1275 return 0;
1123} 1276}
1124 1277
1125static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw) 1278static int _rtl_pci_init_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
1126{ 1279{
1127 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1280 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1128 struct rtl_priv *rtlpriv = rtl_priv(hw); 1281 struct rtl_priv *rtlpriv = rtl_priv(hw);
1129 struct rtl_rx_desc *entry = NULL; 1282 int i;
1130 int i, rx_queue_idx;
1131 u8 tmp_one = 1;
1132 1283
1133 /* 1284 if (rtlpriv->use_new_trx_flow) {
1134 *rx_queue_idx 0:RX_MPDU_QUEUE 1285 struct rtl_rx_buffer_desc *entry = NULL;
1135 *rx_queue_idx 1:RX_CMD_QUEUE 1286 /* alloc dma for this ring */
1136 */ 1287 rtlpci->rx_ring[rxring_idx].buffer_desc =
1137 for (rx_queue_idx = 0; rx_queue_idx < RTL_PCI_MAX_RX_QUEUE; 1288 pci_zalloc_consistent(rtlpci->pdev,
1138 rx_queue_idx++) { 1289 sizeof(*rtlpci->rx_ring[rxring_idx].
1139 rtlpci->rx_ring[rx_queue_idx].desc = 1290 buffer_desc) *
1140 pci_zalloc_consistent(rtlpci->pdev, 1291 rtlpci->rxringcount,
1141 sizeof(*rtlpci->rx_ring[rx_queue_idx].desc) * rtlpci->rxringcount, 1292 &rtlpci->rx_ring[rxring_idx].dma);
1142 &rtlpci->rx_ring[rx_queue_idx].dma); 1293 if (!rtlpci->rx_ring[rxring_idx].buffer_desc ||
1143 1294 (ulong)rtlpci->rx_ring[rxring_idx].buffer_desc & 0xFF) {
1144 if (!rtlpci->rx_ring[rx_queue_idx].desc ||
1145 (unsigned long)rtlpci->rx_ring[rx_queue_idx].desc & 0xFF) {
1146 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1295 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1147 "Cannot allocate RX ring\n"); 1296 "Cannot allocate RX ring\n");
1148 return -ENOMEM; 1297 return -ENOMEM;
1149 } 1298 }
1150 1299
1151 rtlpci->rx_ring[rx_queue_idx].idx = 0; 1300 /* init every desc in this ring */
1301 rtlpci->rx_ring[rxring_idx].idx = 0;
1302 for (i = 0; i < rtlpci->rxringcount; i++) {
1303 entry = &rtlpci->rx_ring[rxring_idx].buffer_desc[i];
1304 if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
1305 rxring_idx, i))
1306 return -ENOMEM;
1307 }
1308 } else {
1309 struct rtl_rx_desc *entry = NULL;
1310 u8 tmp_one = 1;
1311 /* alloc dma for this ring */
1312 rtlpci->rx_ring[rxring_idx].desc =
1313 pci_zalloc_consistent(rtlpci->pdev,
1314 sizeof(*rtlpci->rx_ring[rxring_idx].
1315 desc) * rtlpci->rxringcount,
1316 &rtlpci->rx_ring[rxring_idx].dma);
1317 if (!rtlpci->rx_ring[rxring_idx].desc ||
1318 (unsigned long)rtlpci->rx_ring[rxring_idx].desc & 0xFF) {
1319 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1320 "Cannot allocate RX ring\n");
1321 return -ENOMEM;
1322 }
1152 1323
1153 /* If amsdu_8k is disabled, set buffersize to 4096. This 1324 /* init every desc in this ring */
1154 * change will reduce memory fragmentation. 1325 rtlpci->rx_ring[rxring_idx].idx = 0;
1155 */
1156 if (rtlpci->rxbuffersize > 4096 &&
1157 rtlpriv->rtlhal.disable_amsdu_8k)
1158 rtlpci->rxbuffersize = 4096;
1159 1326
1160 for (i = 0; i < rtlpci->rxringcount; i++) { 1327 for (i = 0; i < rtlpci->rxringcount; i++) {
1161 struct sk_buff *skb = 1328 entry = &rtlpci->rx_ring[rxring_idx].desc[i];
1162 dev_alloc_skb(rtlpci->rxbuffersize); 1329 if (!_rtl_pci_init_one_rxdesc(hw, (u8 *)entry,
1163 u32 bufferaddress; 1330 rxring_idx, i))
1164 if (!skb) 1331 return -ENOMEM;
1165 return 0;
1166 kmemleak_not_leak(skb);
1167 entry = &rtlpci->rx_ring[rx_queue_idx].desc[i];
1168
1169 /*skb->dev = dev; */
1170
1171 rtlpci->rx_ring[rx_queue_idx].rx_buf[i] = skb;
1172
1173 /*
1174 *just set skb->cb to mapping addr
1175 *for pci_unmap_single use
1176 */
1177 *((dma_addr_t *) skb->cb) =
1178 pci_map_single(rtlpci->pdev, skb_tail_pointer(skb),
1179 rtlpci->rxbuffersize,
1180 PCI_DMA_FROMDEVICE);
1181
1182 bufferaddress = (*((dma_addr_t *)skb->cb));
1183 if (pci_dma_mapping_error(rtlpci->pdev, bufferaddress)) {
1184 dev_kfree_skb_any(skb);
1185 return 1;
1186 }
1187 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1188 HW_DESC_RXBUFF_ADDR,
1189 (u8 *)&bufferaddress);
1190 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1191 HW_DESC_RXPKT_LEN,
1192 (u8 *)&rtlpci->
1193 rxbuffersize);
1194 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1195 HW_DESC_RXOWN,
1196 &tmp_one);
1197 } 1332 }
1198 1333
1199 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false, 1334 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
@@ -1209,56 +1344,70 @@ static void _rtl_pci_free_tx_ring(struct ieee80211_hw *hw,
1209 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1344 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1210 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio]; 1345 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[prio];
1211 1346
1347 /* free every desc in this ring */
1212 while (skb_queue_len(&ring->queue)) { 1348 while (skb_queue_len(&ring->queue)) {
1213 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; 1349 u8 *entry;
1214 struct sk_buff *skb = __skb_dequeue(&ring->queue); 1350 struct sk_buff *skb = __skb_dequeue(&ring->queue);
1215 1351
1352 if (rtlpriv->use_new_trx_flow)
1353 entry = (u8 *)(&ring->buffer_desc[ring->idx]);
1354 else
1355 entry = (u8 *)(&ring->desc[ring->idx]);
1356
1216 pci_unmap_single(rtlpci->pdev, 1357 pci_unmap_single(rtlpci->pdev,
1217 rtlpriv->cfg-> 1358 rtlpriv->cfg->
1218 ops->get_desc((u8 *) entry, true, 1359 ops->get_desc((u8 *)entry, true,
1219 HW_DESC_TXBUFF_ADDR), 1360 HW_DESC_TXBUFF_ADDR),
1220 skb->len, PCI_DMA_TODEVICE); 1361 skb->len, PCI_DMA_TODEVICE);
1221 kfree_skb(skb); 1362 kfree_skb(skb);
1222 ring->idx = (ring->idx + 1) % ring->entries; 1363 ring->idx = (ring->idx + 1) % ring->entries;
1223 } 1364 }
1224 1365
1225 if (ring->desc) { 1366 /* free dma of this ring */
1367 pci_free_consistent(rtlpci->pdev,
1368 sizeof(*ring->desc) * ring->entries,
1369 ring->desc, ring->dma);
1370 ring->desc = NULL;
1371 if (rtlpriv->use_new_trx_flow) {
1226 pci_free_consistent(rtlpci->pdev, 1372 pci_free_consistent(rtlpci->pdev,
1227 sizeof(*ring->desc) * ring->entries, 1373 sizeof(*ring->desc) * ring->entries,
1228 ring->desc, ring->dma); 1374 ring->buffer_desc, ring->buffer_desc_dma);
1229 ring->desc = NULL; 1375 ring->desc = NULL;
1230 } 1376 }
1231} 1377}
1232 1378
1233static void _rtl_pci_free_rx_ring(struct rtl_pci *rtlpci) 1379static void _rtl_pci_free_rx_ring(struct ieee80211_hw *hw, int rxring_idx)
1234{ 1380{
1235 int i, rx_queue_idx; 1381 struct rtl_priv *rtlpriv = rtl_priv(hw);
1382 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1383 int i;
1236 1384
1237 /*rx_queue_idx 0:RX_MPDU_QUEUE */ 1385 /* free every desc in this ring */
1238 /*rx_queue_idx 1:RX_CMD_QUEUE */ 1386 for (i = 0; i < rtlpci->rxringcount; i++) {
1239 for (rx_queue_idx = 0; rx_queue_idx < RTL_PCI_MAX_RX_QUEUE; 1387 struct sk_buff *skb = rtlpci->rx_ring[rxring_idx].rx_buf[i];
1240 rx_queue_idx++) {
1241 for (i = 0; i < rtlpci->rxringcount; i++) {
1242 struct sk_buff *skb =
1243 rtlpci->rx_ring[rx_queue_idx].rx_buf[i];
1244 if (!skb)
1245 continue;
1246
1247 pci_unmap_single(rtlpci->pdev,
1248 *((dma_addr_t *) skb->cb),
1249 rtlpci->rxbuffersize,
1250 PCI_DMA_FROMDEVICE);
1251 kfree_skb(skb);
1252 }
1253 1388
1254 if (rtlpci->rx_ring[rx_queue_idx].desc) { 1389 if (!skb)
1255 pci_free_consistent(rtlpci->pdev, 1390 continue;
1256 sizeof(*rtlpci->rx_ring[rx_queue_idx]. 1391 pci_unmap_single(rtlpci->pdev, *((dma_addr_t *)skb->cb),
1257 desc) * rtlpci->rxringcount, 1392 rtlpci->rxbuffersize, PCI_DMA_FROMDEVICE);
1258 rtlpci->rx_ring[rx_queue_idx].desc, 1393 kfree_skb(skb);
1259 rtlpci->rx_ring[rx_queue_idx].dma); 1394 }
1260 rtlpci->rx_ring[rx_queue_idx].desc = NULL; 1395
1261 } 1396 /* free dma of this ring */
1397 if (rtlpriv->use_new_trx_flow) {
1398 pci_free_consistent(rtlpci->pdev,
1399 sizeof(*rtlpci->rx_ring[rxring_idx].
1400 buffer_desc) * rtlpci->rxringcount,
1401 rtlpci->rx_ring[rxring_idx].buffer_desc,
1402 rtlpci->rx_ring[rxring_idx].dma);
1403 rtlpci->rx_ring[rxring_idx].buffer_desc = NULL;
1404 } else {
1405 pci_free_consistent(rtlpci->pdev,
1406 sizeof(*rtlpci->rx_ring[rxring_idx].desc) *
1407 rtlpci->rxringcount,
1408 rtlpci->rx_ring[rxring_idx].desc,
1409 rtlpci->rx_ring[rxring_idx].dma);
1410 rtlpci->rx_ring[rxring_idx].desc = NULL;
1262 } 1411 }
1263} 1412}
1264 1413
@@ -1266,11 +1415,16 @@ static int _rtl_pci_init_trx_ring(struct ieee80211_hw *hw)
1266{ 1415{
1267 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1416 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1268 int ret; 1417 int ret;
1269 int i; 1418 int i, rxring_idx;
1270 1419
1271 ret = _rtl_pci_init_rx_ring(hw); 1420 /* rxring_idx 0:RX_MPDU_QUEUE
1272 if (ret) 1421 * rxring_idx 1:RX_CMD_QUEUE
1273 return ret; 1422 */
1423 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++) {
1424 ret = _rtl_pci_init_rx_ring(hw, rxring_idx);
1425 if (ret)
1426 return ret;
1427 }
1274 1428
1275 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) { 1429 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) {
1276 ret = _rtl_pci_init_tx_ring(hw, i, 1430 ret = _rtl_pci_init_tx_ring(hw, i,
@@ -1282,10 +1436,12 @@ static int _rtl_pci_init_trx_ring(struct ieee80211_hw *hw)
1282 return 0; 1436 return 0;
1283 1437
1284err_free_rings: 1438err_free_rings:
1285 _rtl_pci_free_rx_ring(rtlpci); 1439 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++)
1440 _rtl_pci_free_rx_ring(hw, rxring_idx);
1286 1441
1287 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) 1442 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++)
1288 if (rtlpci->tx_ring[i].desc) 1443 if (rtlpci->tx_ring[i].desc ||
1444 rtlpci->tx_ring[i].buffer_desc)
1289 _rtl_pci_free_tx_ring(hw, i); 1445 _rtl_pci_free_tx_ring(hw, i);
1290 1446
1291 return 1; 1447 return 1;
@@ -1293,11 +1449,11 @@ err_free_rings:
1293 1449
1294static int _rtl_pci_deinit_trx_ring(struct ieee80211_hw *hw) 1450static int _rtl_pci_deinit_trx_ring(struct ieee80211_hw *hw)
1295{ 1451{
1296 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1452 u32 i, rxring_idx;
1297 u32 i;
1298 1453
1299 /*free rx rings */ 1454 /*free rx rings */
1300 _rtl_pci_free_rx_ring(rtlpci); 1455 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++)
1456 _rtl_pci_free_rx_ring(hw, rxring_idx);
1301 1457
1302 /*free tx rings */ 1458 /*free tx rings */
1303 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) 1459 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++)
@@ -1310,48 +1466,76 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
1310{ 1466{
1311 struct rtl_priv *rtlpriv = rtl_priv(hw); 1467 struct rtl_priv *rtlpriv = rtl_priv(hw);
1312 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1468 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1313 int i, rx_queue_idx; 1469 int i, rxring_idx;
1314 unsigned long flags; 1470 unsigned long flags;
1315 u8 tmp_one = 1; 1471 u8 tmp_one = 1;
1316 1472 u32 bufferaddress;
1317 /*rx_queue_idx 0:RX_MPDU_QUEUE */ 1473 /* rxring_idx 0:RX_MPDU_QUEUE */
1318 /*rx_queue_idx 1:RX_CMD_QUEUE */ 1474 /* rxring_idx 1:RX_CMD_QUEUE */
1319 for (rx_queue_idx = 0; rx_queue_idx < RTL_PCI_MAX_RX_QUEUE; 1475 for (rxring_idx = 0; rxring_idx < RTL_PCI_MAX_RX_QUEUE; rxring_idx++) {
1320 rx_queue_idx++) { 1476 /* force the rx_ring[RX_MPDU_QUEUE/
1321 /* 1477 * RX_CMD_QUEUE].idx to the first one
1322 *force the rx_ring[RX_MPDU_QUEUE/ 1478 *new trx flow, do nothing
1323 *RX_CMD_QUEUE].idx to the first one 1479 */
1324 */ 1480 if (!rtlpriv->use_new_trx_flow &&
1325 if (rtlpci->rx_ring[rx_queue_idx].desc) { 1481 rtlpci->rx_ring[rxring_idx].desc) {
1326 struct rtl_rx_desc *entry = NULL; 1482 struct rtl_rx_desc *entry = NULL;
1327 1483
1484 rtlpci->rx_ring[rxring_idx].idx = 0;
1328 for (i = 0; i < rtlpci->rxringcount; i++) { 1485 for (i = 0; i < rtlpci->rxringcount; i++) {
1329 entry = &rtlpci->rx_ring[rx_queue_idx].desc[i]; 1486 entry = &rtlpci->rx_ring[rxring_idx].desc[i];
1330 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, 1487 bufferaddress =
1331 false, 1488 rtlpriv->cfg->ops->get_desc((u8 *)entry,
1332 HW_DESC_RXOWN, 1489 false , HW_DESC_RXBUFF_ADDR);
1333 &tmp_one); 1490 memset((u8 *)entry , 0 ,
1491 sizeof(*rtlpci->rx_ring
1492 [rxring_idx].desc));/*clear one entry*/
1493 if (rtlpriv->use_new_trx_flow) {
1494 rtlpriv->cfg->ops->set_desc(hw,
1495 (u8 *)entry, false,
1496 HW_DESC_RX_PREPARE,
1497 (u8 *)&bufferaddress);
1498 } else {
1499 rtlpriv->cfg->ops->set_desc(hw,
1500 (u8 *)entry, false,
1501 HW_DESC_RXBUFF_ADDR,
1502 (u8 *)&bufferaddress);
1503 rtlpriv->cfg->ops->set_desc(hw,
1504 (u8 *)entry, false,
1505 HW_DESC_RXPKT_LEN,
1506 (u8 *)&rtlpci->rxbuffersize);
1507 rtlpriv->cfg->ops->set_desc(hw,
1508 (u8 *)entry, false,
1509 HW_DESC_RXOWN,
1510 (u8 *)&tmp_one);
1511 }
1334 } 1512 }
1335 rtlpci->rx_ring[rx_queue_idx].idx = 0; 1513 rtlpriv->cfg->ops->set_desc(hw, (u8 *)entry, false,
1514 HW_DESC_RXERO, (u8 *)&tmp_one);
1336 } 1515 }
1516 rtlpci->rx_ring[rxring_idx].idx = 0;
1337 } 1517 }
1338 1518
1339 /* 1519 /*
1340 *after reset, release previous pending packet, 1520 *after reset, release previous pending packet,
1341 *and force the tx idx to the first one 1521 *and force the tx idx to the first one
1342 */ 1522 */
1523 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
1343 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) { 1524 for (i = 0; i < RTL_PCI_MAX_TX_QUEUE_COUNT; i++) {
1344 if (rtlpci->tx_ring[i].desc) { 1525 if (rtlpci->tx_ring[i].desc ||
1526 rtlpci->tx_ring[i].buffer_desc) {
1345 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[i]; 1527 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[i];
1346 1528
1347 while (skb_queue_len(&ring->queue)) { 1529 while (skb_queue_len(&ring->queue)) {
1348 struct rtl_tx_desc *entry; 1530 u8 *entry;
1349 struct sk_buff *skb; 1531 struct sk_buff *skb =
1532 __skb_dequeue(&ring->queue);
1533 if (rtlpriv->use_new_trx_flow)
1534 entry = (u8 *)(&ring->buffer_desc
1535 [ring->idx]);
1536 else
1537 entry = (u8 *)(&ring->desc[ring->idx]);
1350 1538
1351 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock,
1352 flags);
1353 entry = &ring->desc[ring->idx];
1354 skb = __skb_dequeue(&ring->queue);
1355 pci_unmap_single(rtlpci->pdev, 1539 pci_unmap_single(rtlpci->pdev,
1356 rtlpriv->cfg->ops-> 1540 rtlpriv->cfg->ops->
1357 get_desc((u8 *) 1541 get_desc((u8 *)
@@ -1360,13 +1544,13 @@ int rtl_pci_reset_trx_ring(struct ieee80211_hw *hw)
1360 HW_DESC_TXBUFF_ADDR), 1544 HW_DESC_TXBUFF_ADDR),
1361 skb->len, PCI_DMA_TODEVICE); 1545 skb->len, PCI_DMA_TODEVICE);
1362 ring->idx = (ring->idx + 1) % ring->entries; 1546 ring->idx = (ring->idx + 1) % ring->entries;
1363 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock,
1364 flags);
1365 kfree_skb(skb); 1547 kfree_skb(skb);
1548 ring->idx = (ring->idx + 1) % ring->entries;
1366 } 1549 }
1367 ring->idx = 0; 1550 ring->idx = 0;
1368 } 1551 }
1369 } 1552 }
1553 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
1370 1554
1371 return 0; 1555 return 0;
1372} 1556}
@@ -1421,7 +1605,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
1421 struct rtl8192_tx_ring *ring; 1605 struct rtl8192_tx_ring *ring;
1422 struct rtl_tx_desc *pdesc; 1606 struct rtl_tx_desc *pdesc;
1423 struct rtl_tx_buffer_desc *ptx_bd_desc = NULL; 1607 struct rtl_tx_buffer_desc *ptx_bd_desc = NULL;
1424 u8 idx; 1608 u16 idx;
1425 u8 hw_queue = _rtl_mac_to_hwqueue(hw, skb); 1609 u8 hw_queue = _rtl_mac_to_hwqueue(hw, skb);
1426 unsigned long flags; 1610 unsigned long flags;
1427 struct ieee80211_hdr *hdr = rtl_get_hdr(skb); 1611 struct ieee80211_hdr *hdr = rtl_get_hdr(skb);
@@ -1454,11 +1638,15 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
1454 1638
1455 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 1639 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
1456 ring = &rtlpci->tx_ring[hw_queue]; 1640 ring = &rtlpci->tx_ring[hw_queue];
1457 if (hw_queue != BEACON_QUEUE) 1641 if (hw_queue != BEACON_QUEUE) {
1458 idx = (ring->idx + skb_queue_len(&ring->queue)) % 1642 if (rtlpriv->use_new_trx_flow)
1459 ring->entries; 1643 idx = ring->cur_tx_wp;
1460 else 1644 else
1645 idx = (ring->idx + skb_queue_len(&ring->queue)) %
1646 ring->entries;
1647 } else {
1461 idx = 0; 1648 idx = 0;
1649 }
1462 1650
1463 pdesc = &ring->desc[idx]; 1651 pdesc = &ring->desc[idx];
1464 if (rtlpriv->use_new_trx_flow) { 1652 if (rtlpriv->use_new_trx_flow) {
@@ -1525,7 +1713,7 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
1525 return 0; 1713 return 0;
1526} 1714}
1527 1715
1528static void rtl_pci_flush(struct ieee80211_hw *hw, bool drop) 1716static void rtl_pci_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
1529{ 1717{
1530 struct rtl_priv *rtlpriv = rtl_priv(hw); 1718 struct rtl_priv *rtlpriv = rtl_priv(hw);
1531 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 1719 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
@@ -1540,6 +1728,11 @@ static void rtl_pci_flush(struct ieee80211_hw *hw, bool drop)
1540 1728
1541 for (queue_id = RTL_PCI_MAX_TX_QUEUE_COUNT - 1; queue_id >= 0;) { 1729 for (queue_id = RTL_PCI_MAX_TX_QUEUE_COUNT - 1; queue_id >= 0;) {
1542 u32 queue_len; 1730 u32 queue_len;
1731
1732 if (((queues >> queue_id) & 0x1) == 0) {
1733 queue_id--;
1734 continue;
1735 }
1543 ring = &pcipriv->dev.tx_ring[queue_id]; 1736 ring = &pcipriv->dev.tx_ring[queue_id];
1544 queue_len = skb_queue_len(&ring->queue); 1737 queue_len = skb_queue_len(&ring->queue);
1545 if (queue_len == 0 || queue_id == BEACON_QUEUE || 1738 if (queue_len == 0 || queue_id == BEACON_QUEUE ||
@@ -1603,6 +1796,10 @@ static int rtl_pci_start(struct ieee80211_hw *hw)
1603 rtl_pci_reset_trx_ring(hw); 1796 rtl_pci_reset_trx_ring(hw);
1604 1797
1605 rtlpci->driver_is_goingto_unload = false; 1798 rtlpci->driver_is_goingto_unload = false;
1799 if (rtlpriv->cfg->ops->get_btc_status()) {
1800 rtlpriv->btcoexist.btc_ops->btc_init_variables(rtlpriv);
1801 rtlpriv->btcoexist.btc_ops->btc_init_hal_vars(rtlpriv);
1802 }
1606 err = rtlpriv->cfg->ops->hw_init(hw); 1803 err = rtlpriv->cfg->ops->hw_init(hw);
1607 if (err) { 1804 if (err) {
1608 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 1805 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
@@ -1622,7 +1819,7 @@ static int rtl_pci_start(struct ieee80211_hw *hw)
1622 1819
1623 rtlpci->up_first_time = false; 1820 rtlpci->up_first_time = false;
1624 1821
1625 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "OK\n"); 1822 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "rtl_pci_start OK\n");
1626 return 0; 1823 return 0;
1627} 1824}
1628 1825
@@ -1635,6 +1832,9 @@ static void rtl_pci_stop(struct ieee80211_hw *hw)
1635 unsigned long flags; 1832 unsigned long flags;
1636 u8 RFInProgressTimeOut = 0; 1833 u8 RFInProgressTimeOut = 0;
1637 1834
1835 if (rtlpriv->cfg->ops->get_btc_status())
1836 rtlpriv->btcoexist.btc_ops->btc_halt_notify();
1837
1638 /* 1838 /*
1639 *should be before disable interrupt&adapter 1839 *should be before disable interrupt&adapter
1640 *and will do it immediately. 1840 *and will do it immediately.
@@ -1753,6 +1953,22 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
1753 rtlhal->hw_type = HARDWARE_TYPE_RTL8188EE; 1953 rtlhal->hw_type = HARDWARE_TYPE_RTL8188EE;
1754 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1954 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1755 "Find adapter, Hardware type is 8188EE\n"); 1955 "Find adapter, Hardware type is 8188EE\n");
1956 } else if (deviceid == RTL_PCI_8723BE_DID) {
1957 rtlhal->hw_type = HARDWARE_TYPE_RTL8723BE;
1958 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1959 "Find adapter, Hardware type is 8723BE\n");
1960 } else if (deviceid == RTL_PCI_8192EE_DID) {
1961 rtlhal->hw_type = HARDWARE_TYPE_RTL8192EE;
1962 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1963 "Find adapter, Hardware type is 8192EE\n");
1964 } else if (deviceid == RTL_PCI_8821AE_DID) {
1965 rtlhal->hw_type = HARDWARE_TYPE_RTL8821AE;
1966 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1967 "Find adapter, Hardware type is 8821AE\n");
1968 } else if (deviceid == RTL_PCI_8812AE_DID) {
1969 rtlhal->hw_type = HARDWARE_TYPE_RTL8812AE;
1970 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD,
1971 "Find adapter, Hardware type is 8812AE\n");
1756 } else { 1972 } else {
1757 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1973 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1758 "Err: Unknown device - vid/did=%x/%x\n", 1974 "Err: Unknown device - vid/did=%x/%x\n",
@@ -1779,11 +1995,20 @@ static bool _rtl_pci_find_adapter(struct pci_dev *pdev,
1779 rtlhal->interfaceindex = 0; 1995 rtlhal->interfaceindex = 0;
1780 } 1996 }
1781 } 1997 }
1998
1999 /* 92ee use new trx flow */
2000 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192EE)
2001 rtlpriv->use_new_trx_flow = true;
2002 else
2003 rtlpriv->use_new_trx_flow = false;
2004
1782 /*find bus info */ 2005 /*find bus info */
1783 pcipriv->ndis_adapter.busnumber = pdev->bus->number; 2006 pcipriv->ndis_adapter.busnumber = pdev->bus->number;
1784 pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn); 2007 pcipriv->ndis_adapter.devnumber = PCI_SLOT(pdev->devfn);
1785 pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn); 2008 pcipriv->ndis_adapter.funcnumber = PCI_FUNC(pdev->devfn);
1786 2009
2010 /*find bridge info */
2011 pcipriv->ndis_adapter.pcibridge_vendor = PCI_BRIDGE_VENDOR_UNKNOWN;
1787 /* some ARM have no bridge_pdev and will crash here 2012 /* some ARM have no bridge_pdev and will crash here
1788 * so we should check if bridge_pdev is NULL 2013 * so we should check if bridge_pdev is NULL
1789 */ 2014 */
@@ -1951,6 +2176,11 @@ int rtl_pci_probe(struct pci_dev *pdev,
1951 pcipriv = (void *)rtlpriv->priv; 2176 pcipriv = (void *)rtlpriv->priv;
1952 pcipriv->dev.pdev = pdev; 2177 pcipriv->dev.pdev = pdev;
1953 init_completion(&rtlpriv->firmware_loading_complete); 2178 init_completion(&rtlpriv->firmware_loading_complete);
2179 /*proximity init here*/
2180 rtlpriv->proximity.proxim_on = false;
2181
2182 pcipriv = (void *)rtlpriv->priv;
2183 pcipriv->dev.pdev = pdev;
1954 2184
1955 /* init cfg & intf_ops */ 2185 /* init cfg & intf_ops */
1956 rtlpriv->rtlhal.interface = INTF_PCI; 2186 rtlpriv->rtlhal.interface = INTF_PCI;
@@ -2013,9 +2243,6 @@ int rtl_pci_probe(struct pci_dev *pdev,
2013 /*like read eeprom and so on */ 2243 /*like read eeprom and so on */
2014 rtlpriv->cfg->ops->read_eeprom_info(hw); 2244 rtlpriv->cfg->ops->read_eeprom_info(hw);
2015 2245
2016 /*aspm */
2017 rtl_pci_init_aspm(hw);
2018
2019 /* Init mac80211 sw */ 2246 /* Init mac80211 sw */
2020 err = rtl_init_core(hw); 2247 err = rtl_init_core(hw);
2021 if (err) { 2248 if (err) {
@@ -2036,9 +2263,20 @@ int rtl_pci_probe(struct pci_dev *pdev,
2036 err = -ENODEV; 2263 err = -ENODEV;
2037 goto fail3; 2264 goto fail3;
2038 } 2265 }
2039
2040 rtlpriv->cfg->ops->init_sw_leds(hw); 2266 rtlpriv->cfg->ops->init_sw_leds(hw);
2041 2267
2268 /*aspm */
2269 rtl_pci_init_aspm(hw);
2270
2271 err = ieee80211_register_hw(hw);
2272 if (err) {
2273 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2274 "Can't register mac80211 hw.\n");
2275 err = -ENODEV;
2276 goto fail3;
2277 }
2278 rtlpriv->mac80211.mac80211_registered = 1;
2279
2042 err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group); 2280 err = sysfs_create_group(&pdev->dev.kobj, &rtl_attribute_group);
2043 if (err) { 2281 if (err) {
2044 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2282 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
@@ -2046,6 +2284,9 @@ int rtl_pci_probe(struct pci_dev *pdev,
2046 goto fail3; 2284 goto fail3;
2047 } 2285 }
2048 2286
2287 /*init rfkill */
2288 rtl_init_rfkill(hw); /* Init PCI sw */
2289
2049 rtlpci = rtl_pcidev(pcipriv); 2290 rtlpci = rtl_pcidev(pcipriv);
2050 err = rtl_pci_intr_mode_decide(hw); 2291 err = rtl_pci_intr_mode_decide(hw);
2051 if (err) { 2292 if (err) {
@@ -2056,9 +2297,11 @@ int rtl_pci_probe(struct pci_dev *pdev,
2056 } 2297 }
2057 rtlpci->irq_alloc = 1; 2298 rtlpci->irq_alloc = 1;
2058 2299
2300 set_bit(RTL_STATUS_INTERFACE_START, &rtlpriv->status);
2059 return 0; 2301 return 0;
2060 2302
2061fail3: 2303fail3:
2304 pci_set_drvdata(pdev, NULL);
2062 rtl_deinit_core(hw); 2305 rtl_deinit_core(hw);
2063 2306
2064 if (rtlpriv->io.pci_mem_start != 0) 2307 if (rtlpriv->io.pci_mem_start != 0)
@@ -2128,6 +2371,8 @@ void rtl_pci_disconnect(struct pci_dev *pdev)
2128 2371
2129 rtl_pci_disable_aspm(hw); 2372 rtl_pci_disable_aspm(hw);
2130 2373
2374 pci_set_drvdata(pdev, NULL);
2375
2131 ieee80211_free_hw(hw); 2376 ieee80211_free_hw(hw);
2132} 2377}
2133EXPORT_SYMBOL(rtl_pci_disconnect); 2378EXPORT_SYMBOL(rtl_pci_disconnect);
diff --git a/drivers/net/wireless/rtlwifi/pci.h b/drivers/net/wireless/rtlwifi/pci.h
index 90174a814a6d..5e832306dba9 100644
--- a/drivers/net/wireless/rtlwifi/pci.h
+++ b/drivers/net/wireless/rtlwifi/pci.h
@@ -39,10 +39,11 @@
39#define RTL_PCI_RX_CMD_QUEUE 1 39#define RTL_PCI_RX_CMD_QUEUE 1
40#define RTL_PCI_MAX_RX_QUEUE 2 40#define RTL_PCI_MAX_RX_QUEUE 2
41 41
42#define RTL_PCI_MAX_RX_COUNT 64 42#define RTL_PCI_MAX_RX_COUNT 512/*64*/
43#define RTL_PCI_MAX_TX_QUEUE_COUNT 9 43#define RTL_PCI_MAX_TX_QUEUE_COUNT 9
44 44
45#define RT_TXDESC_NUM 128 45#define RT_TXDESC_NUM 128
46#define TX_DESC_NUM_92E 512
46#define RT_TXDESC_NUM_BE_QUEUE 256 47#define RT_TXDESC_NUM_BE_QUEUE 256
47 48
48#define BK_QUEUE 0 49#define BK_QUEUE 0
@@ -62,6 +63,12 @@
62 .subdevice = PCI_ANY_ID,\ 63 .subdevice = PCI_ANY_ID,\
63 .driver_data = (kernel_ulong_t)&(cfg) 64 .driver_data = (kernel_ulong_t)&(cfg)
64 65
66#define INTEL_VENDOR_ID 0x8086
67#define SIS_VENDOR_ID 0x1039
68#define ATI_VENDOR_ID 0x1002
69#define ATI_DEVICE_ID 0x7914
70#define AMD_VENDOR_ID 0x1022
71
65#define PCI_MAX_BRIDGE_NUMBER 255 72#define PCI_MAX_BRIDGE_NUMBER 255
66#define PCI_MAX_DEVICES 32 73#define PCI_MAX_DEVICES 32
67#define PCI_MAX_FUNCTION 8 74#define PCI_MAX_FUNCTION 8
@@ -69,6 +76,11 @@
69#define PCI_CONF_ADDRESS 0x0CF8 /*PCI Configuration Space Address */ 76#define PCI_CONF_ADDRESS 0x0CF8 /*PCI Configuration Space Address */
70#define PCI_CONF_DATA 0x0CFC /*PCI Configuration Space Data */ 77#define PCI_CONF_DATA 0x0CFC /*PCI Configuration Space Data */
71 78
79#define PCI_CLASS_BRIDGE_DEV 0x06
80#define PCI_SUBCLASS_BR_PCI_TO_PCI 0x04
81#define PCI_CAPABILITY_ID_PCI_EXPRESS 0x10
82#define PCI_CAP_ID_EXP 0x10
83
72#define U1DONTCARE 0xFF 84#define U1DONTCARE 0xFF
73#define U2DONTCARE 0xFFFF 85#define U2DONTCARE 0xFFFF
74#define U4DONTCARE 0xFFFFFFFF 86#define U4DONTCARE 0xFFFFFFFF
@@ -87,6 +99,7 @@
87#define RTL_PCI_700F_DID 0x700F 99#define RTL_PCI_700F_DID 0x700F
88#define RTL_PCI_701F_DID 0x701F 100#define RTL_PCI_701F_DID 0x701F
89#define RTL_PCI_DLINK_DID 0x3304 101#define RTL_PCI_DLINK_DID 0x3304
102#define RTL_PCI_8723AE_DID 0x8723 /*8723e */
90#define RTL_PCI_8192CET_DID 0x8191 /*8192ce */ 103#define RTL_PCI_8192CET_DID 0x8191 /*8192ce */
91#define RTL_PCI_8192CE_DID 0x8178 /*8192ce */ 104#define RTL_PCI_8192CE_DID 0x8178 /*8192ce */
92#define RTL_PCI_8191CE_DID 0x8177 /*8192ce */ 105#define RTL_PCI_8191CE_DID 0x8177 /*8192ce */
@@ -95,6 +108,10 @@
95#define RTL_PCI_8192DE_DID 0x8193 /*8192de */ 108#define RTL_PCI_8192DE_DID 0x8193 /*8192de */
96#define RTL_PCI_8192DE_DID2 0x002B /*92DE*/ 109#define RTL_PCI_8192DE_DID2 0x002B /*92DE*/
97#define RTL_PCI_8188EE_DID 0x8179 /*8188ee*/ 110#define RTL_PCI_8188EE_DID 0x8179 /*8188ee*/
111#define RTL_PCI_8723BE_DID 0xB723 /*8723be*/
112#define RTL_PCI_8192EE_DID 0x818B /*8192ee*/
113#define RTL_PCI_8821AE_DID 0x8821 /*8821ae*/
114#define RTL_PCI_8812AE_DID 0x8812 /*8812ae*/
98 115
99/*8192 support 16 pages of IO registers*/ 116/*8192 support 16 pages of IO registers*/
100#define RTL_MEM_MAPPED_IO_RANGE_8190PCI 0x1000 117#define RTL_MEM_MAPPED_IO_RANGE_8190PCI 0x1000
@@ -125,24 +142,34 @@ struct rtl_pci_capabilities_header {
125 u8 next; 142 u8 next;
126}; 143};
127 144
128struct rtl_rx_desc { 145/* In new TRX flow, Buffer_desc is new concept
129 u32 dword[8]; 146 * But TX wifi info == TX descriptor in old flow
147 * RX wifi info == RX descriptor in old flow
148 */
149struct rtl_tx_buffer_desc {
150#if (RTL8192EE_SEG_NUM == 2)
151 u32 dword[2*(DMA_IS_64BIT + 1)*8]; /*seg = 8*/
152#elif (RTL8192EE_SEG_NUM == 1)
153 u32 dword[2*(DMA_IS_64BIT + 1)*4]; /*seg = 4*/
154#elif (RTL8192EE_SEG_NUM == 0)
155 u32 dword[2*(DMA_IS_64BIT + 1)*2]; /*seg = 2*/
156#endif
130} __packed; 157} __packed;
131 158
132struct rtl_tx_desc { 159struct rtl_tx_desc {
133 u32 dword[16]; 160 u32 dword[16];
134} __packed; 161} __packed;
135 162
136struct rtl_tx_cmd_desc { 163struct rtl_rx_buffer_desc { /*rx buffer desc*/
137 u32 dword[16]; 164 u32 dword[2];
138} __packed; 165} __packed;
139 166
140/* In new TRX flow, Buffer_desc is new concept 167struct rtl_rx_desc { /*old: rx desc new: rx wifi info*/
141 * But TX wifi info == TX descriptor in old flow 168 u32 dword[8];
142 * RX wifi info == RX descriptor in old flow 169} __packed;
143 */ 170
144struct rtl_tx_buffer_desc { 171struct rtl_tx_cmd_desc {
145 u32 dword[8]; /*seg = 4*/ 172 u32 dword[16];
146} __packed; 173} __packed;
147 174
148struct rtl8192_tx_ring { 175struct rtl8192_tx_ring {
@@ -153,6 +180,10 @@ struct rtl8192_tx_ring {
153 struct sk_buff_head queue; 180 struct sk_buff_head queue;
154 /*add for new trx flow*/ 181 /*add for new trx flow*/
155 struct rtl_tx_buffer_desc *buffer_desc; /*tx buffer descriptor*/ 182 struct rtl_tx_buffer_desc *buffer_desc; /*tx buffer descriptor*/
183 dma_addr_t buffer_desc_dma; /*tx bufferd desc dma memory*/
184 u16 avl_desc; /* available_desc_to_write */
185 u16 cur_tx_wp; /* current_tx_write_point */
186 u16 cur_tx_rp; /* current_tx_read_point */
156}; 187};
157 188
158struct rtl8192_rx_ring { 189struct rtl8192_rx_ring {
@@ -160,6 +191,9 @@ struct rtl8192_rx_ring {
160 dma_addr_t dma; 191 dma_addr_t dma;
161 unsigned int idx; 192 unsigned int idx;
162 struct sk_buff *rx_buf[RTL_PCI_MAX_RX_COUNT]; 193 struct sk_buff *rx_buf[RTL_PCI_MAX_RX_COUNT];
194 /*add for new trx flow*/
195 struct rtl_rx_buffer_desc *buffer_desc; /*rx buffer descriptor*/
196 u16 next_rx_rp; /* next_rx_read_point */
163}; 197};
164 198
165struct rtl_pci { 199struct rtl_pci {
diff --git a/drivers/net/wireless/rtlwifi/ps.c b/drivers/net/wireless/rtlwifi/ps.c
index 50504942ded1..b69321d45f04 100644
--- a/drivers/net/wireless/rtlwifi/ps.c
+++ b/drivers/net/wireless/rtlwifi/ps.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -27,110 +23,11 @@
27 * 23 *
28 *****************************************************************************/ 24 *****************************************************************************/
29 25
30#include <linux/export.h>
31#include "wifi.h" 26#include "wifi.h"
32#include "base.h" 27#include "base.h"
33#include "ps.h" 28#include "ps.h"
34 29#include <linux/export.h>
35/* Description: 30#include "btcoexist/rtl_btc.h"
36 * This routine deals with the Power Configuration CMD
37 * parsing for RTL8723/RTL8188E Series IC.
38 * Assumption:
39 * We should follow specific format that was released from HW SD.
40 */
41bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
42 u8 faversion, u8 interface_type,
43 struct wlan_pwr_cfg pwrcfgcmd[])
44{
45 struct wlan_pwr_cfg cfg_cmd = {0};
46 bool polling_bit = false;
47 u32 ary_idx = 0;
48 u8 value = 0;
49 u32 offset = 0;
50 u32 polling_count = 0;
51 u32 max_polling_cnt = 5000;
52
53 do {
54 cfg_cmd = pwrcfgcmd[ary_idx];
55 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
56 "rtl_hal_pwrseqcmdparsing(): offset(%#x),cut_msk(%#x), famsk(%#x),"
57 "interface_msk(%#x), base(%#x), cmd(%#x), msk(%#x), value(%#x)\n",
58 GET_PWR_CFG_OFFSET(cfg_cmd),
59 GET_PWR_CFG_CUT_MASK(cfg_cmd),
60 GET_PWR_CFG_FAB_MASK(cfg_cmd),
61 GET_PWR_CFG_INTF_MASK(cfg_cmd),
62 GET_PWR_CFG_BASE(cfg_cmd), GET_PWR_CFG_CMD(cfg_cmd),
63 GET_PWR_CFG_MASK(cfg_cmd), GET_PWR_CFG_VALUE(cfg_cmd));
64
65 if ((GET_PWR_CFG_FAB_MASK(cfg_cmd)&faversion) &&
66 (GET_PWR_CFG_CUT_MASK(cfg_cmd)&cut_version) &&
67 (GET_PWR_CFG_INTF_MASK(cfg_cmd)&interface_type)) {
68 switch (GET_PWR_CFG_CMD(cfg_cmd)) {
69 case PWR_CMD_READ:
70 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
71 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_READ\n");
72 break;
73 case PWR_CMD_WRITE:
74 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
75 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_WRITE\n");
76 offset = GET_PWR_CFG_OFFSET(cfg_cmd);
77
78 /*Read the value from system register*/
79 value = rtl_read_byte(rtlpriv, offset);
80 value &= (~(GET_PWR_CFG_MASK(cfg_cmd)));
81 value |= (GET_PWR_CFG_VALUE(cfg_cmd) &
82 GET_PWR_CFG_MASK(cfg_cmd));
83
84 /*Write the value back to sytem register*/
85 rtl_write_byte(rtlpriv, offset, value);
86 break;
87 case PWR_CMD_POLLING:
88 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
89 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_POLLING\n");
90 polling_bit = false;
91 offset = GET_PWR_CFG_OFFSET(cfg_cmd);
92
93 do {
94 value = rtl_read_byte(rtlpriv, offset);
95
96 value &= GET_PWR_CFG_MASK(cfg_cmd);
97 if (value ==
98 (GET_PWR_CFG_VALUE(cfg_cmd)
99 & GET_PWR_CFG_MASK(cfg_cmd)))
100 polling_bit = true;
101 else
102 udelay(10);
103
104 if (polling_count++ > max_polling_cnt)
105 return false;
106 } while (!polling_bit);
107 break;
108 case PWR_CMD_DELAY:
109 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
110 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_DELAY\n");
111 if (GET_PWR_CFG_VALUE(cfg_cmd) ==
112 PWRSEQ_DELAY_US)
113 udelay(GET_PWR_CFG_OFFSET(cfg_cmd));
114 else
115 mdelay(GET_PWR_CFG_OFFSET(cfg_cmd));
116 break;
117 case PWR_CMD_END:
118 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
119 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_END\n");
120 return true;
121 default:
122 RT_ASSERT(false,
123 "rtl_hal_pwrseqcmdparsing(): Unknown CMD!!\n");
124 break;
125 }
126
127 }
128 ary_idx++;
129 } while (1);
130
131 return true;
132}
133EXPORT_SYMBOL(rtl_hal_pwrseqcmdparsing);
134 31
135bool rtl_ps_enable_nic(struct ieee80211_hw *hw) 32bool rtl_ps_enable_nic(struct ieee80211_hw *hw)
136{ 33{
@@ -181,11 +78,49 @@ EXPORT_SYMBOL(rtl_ps_disable_nic);
181 78
182bool rtl_ps_set_rf_state(struct ieee80211_hw *hw, 79bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
183 enum rf_pwrstate state_toset, 80 enum rf_pwrstate state_toset,
184 u32 changesource) 81 u32 changesource, bool protect_or_not)
185{ 82{
186 struct rtl_priv *rtlpriv = rtl_priv(hw); 83 struct rtl_priv *rtlpriv = rtl_priv(hw);
187 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 84 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
85 enum rf_pwrstate rtstate;
188 bool actionallowed = false; 86 bool actionallowed = false;
87 u16 rfwait_cnt = 0;
88
89 if (protect_or_not)
90 goto no_protect;
91
92 /*Only one thread can change
93 *the RF state at one time, and others
94 *should wait to be executed.
95 */
96 while (true) {
97 spin_lock(&rtlpriv->locks.rf_ps_lock);
98 if (ppsc->rfchange_inprogress) {
99 spin_unlock(&rtlpriv->locks.rf_ps_lock);
100
101 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
102 "RF Change in progress! Wait to set..state_toset(%d).\n",
103 state_toset);
104
105 /* Set RF after the previous action is done. */
106 while (ppsc->rfchange_inprogress) {
107 rfwait_cnt++;
108 mdelay(1);
109 /*Wait too long, return false to avoid
110 *to be stuck here.
111 */
112 if (rfwait_cnt > 100)
113 return false;
114 }
115 } else {
116 ppsc->rfchange_inprogress = true;
117 spin_unlock(&rtlpriv->locks.rf_ps_lock);
118 break;
119 }
120 }
121
122no_protect:
123 rtstate = ppsc->rfpwr_state;
189 124
190 switch (state_toset) { 125 switch (state_toset) {
191 case ERFON: 126 case ERFON:
@@ -227,6 +162,12 @@ bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
227 if (actionallowed) 162 if (actionallowed)
228 rtlpriv->cfg->ops->set_rf_power_state(hw, state_toset); 163 rtlpriv->cfg->ops->set_rf_power_state(hw, state_toset);
229 164
165 if (!protect_or_not) {
166 spin_lock(&rtlpriv->locks.rf_ps_lock);
167 ppsc->rfchange_inprogress = false;
168 spin_unlock(&rtlpriv->locks.rf_ps_lock);
169 }
170
230 return actionallowed; 171 return actionallowed;
231} 172}
232EXPORT_SYMBOL(rtl_ps_set_rf_state); 173EXPORT_SYMBOL(rtl_ps_set_rf_state);
@@ -249,12 +190,13 @@ static void _rtl_ps_inactive_ps(struct ieee80211_hw *hw)
249 } 190 }
250 } 191 }
251 192
252 rtl_ps_set_rf_state(hw, ppsc->inactive_pwrstate, RF_CHANGE_BY_IPS); 193 rtl_ps_set_rf_state(hw, ppsc->inactive_pwrstate,
194 RF_CHANGE_BY_IPS, false);
253 195
254 if (ppsc->inactive_pwrstate == ERFOFF && 196 if (ppsc->inactive_pwrstate == ERFOFF &&
255 rtlhal->interface == INTF_PCI) { 197 rtlhal->interface == INTF_PCI) {
256 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM && 198 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM &&
257 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) { 199 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
258 rtlpriv->intf_ops->enable_aspm(hw); 200 rtlpriv->intf_ops->enable_aspm(hw);
259 RT_SET_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM); 201 RT_SET_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
260 } 202 }
@@ -318,6 +260,11 @@ void rtl_ips_nic_off_wq_callback(void *data)
318 ppsc->inactive_pwrstate = ERFOFF; 260 ppsc->inactive_pwrstate = ERFOFF;
319 ppsc->in_powersavemode = true; 261 ppsc->in_powersavemode = true;
320 262
263 /* call before RF off */
264 if (rtlpriv->cfg->ops->get_btc_status())
265 rtlpriv->btcoexist.btc_ops->btc_ips_notify(rtlpriv,
266 ppsc->inactive_pwrstate);
267
321 /*rtl_pci_reset_trx_ring(hw); */ 268 /*rtl_pci_reset_trx_ring(hw); */
322 _rtl_ps_inactive_ps(hw); 269 _rtl_ps_inactive_ps(hw);
323 } 270 }
@@ -328,10 +275,9 @@ void rtl_ips_nic_off(struct ieee80211_hw *hw)
328{ 275{
329 struct rtl_priv *rtlpriv = rtl_priv(hw); 276 struct rtl_priv *rtlpriv = rtl_priv(hw);
330 277
331 /* 278 /* because when link with ap, mac80211 will ask us
332 *because when link with ap, mac80211 will ask us 279 * to disable nic quickly after scan before linking,
333 *to disable nic quickly after scan before linking, 280 * this will cause link failed, so we delay 100ms here
334 *this will cause link failed, so we delay 100ms here
335 */ 281 */
336 queue_delayed_work(rtlpriv->works.rtl_wq, 282 queue_delayed_work(rtlpriv->works.rtl_wq,
337 &rtlpriv->works.ips_nic_off_wq, MSECS(100)); 283 &rtlpriv->works.ips_nic_off_wq, MSECS(100));
@@ -343,16 +289,12 @@ void rtl_ips_nic_off(struct ieee80211_hw *hw)
343void rtl_ips_nic_on(struct ieee80211_hw *hw) 289void rtl_ips_nic_on(struct ieee80211_hw *hw)
344{ 290{
345 struct rtl_priv *rtlpriv = rtl_priv(hw); 291 struct rtl_priv *rtlpriv = rtl_priv(hw);
346 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
347 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 292 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
348 enum rf_pwrstate rtstate; 293 enum rf_pwrstate rtstate;
349 unsigned long flags;
350
351 if (mac->opmode != NL80211_IFTYPE_STATION)
352 return;
353 294
354 spin_lock_irqsave(&rtlpriv->locks.ips_lock, flags); 295 cancel_delayed_work(&rtlpriv->works.ips_nic_off_wq);
355 296
297 spin_lock(&rtlpriv->locks.ips_lock);
356 if (ppsc->inactiveps) { 298 if (ppsc->inactiveps) {
357 rtstate = ppsc->rfpwr_state; 299 rtstate = ppsc->rfpwr_state;
358 300
@@ -362,12 +304,14 @@ void rtl_ips_nic_on(struct ieee80211_hw *hw)
362 304
363 ppsc->inactive_pwrstate = ERFON; 305 ppsc->inactive_pwrstate = ERFON;
364 ppsc->in_powersavemode = false; 306 ppsc->in_powersavemode = false;
365
366 _rtl_ps_inactive_ps(hw); 307 _rtl_ps_inactive_ps(hw);
308 /* call after RF on */
309 if (rtlpriv->cfg->ops->get_btc_status())
310 rtlpriv->btcoexist.btc_ops->btc_ips_notify(rtlpriv,
311 ppsc->inactive_pwrstate);
367 } 312 }
368 } 313 }
369 314 spin_unlock(&rtlpriv->locks.ips_lock);
370 spin_unlock_irqrestore(&rtlpriv->locks.ips_lock, flags);
371} 315}
372EXPORT_SYMBOL_GPL(rtl_ips_nic_on); 316EXPORT_SYMBOL_GPL(rtl_ips_nic_on);
373 317
@@ -404,7 +348,7 @@ static bool rtl_get_fwlps_doze(struct ieee80211_hw *hw)
404} 348}
405 349
406/* Change current and default preamble mode.*/ 350/* Change current and default preamble mode.*/
407static void rtl_lps_set_psmode(struct ieee80211_hw *hw, u8 rt_psmode) 351void rtl_lps_set_psmode(struct ieee80211_hw *hw, u8 rt_psmode)
408{ 352{
409 struct rtl_priv *rtlpriv = rtl_priv(hw); 353 struct rtl_priv *rtlpriv = rtl_priv(hw);
410 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 354 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -437,21 +381,24 @@ static void rtl_lps_set_psmode(struct ieee80211_hw *hw, u8 rt_psmode)
437 if (ppsc->dot11_psmode == EACTIVE) { 381 if (ppsc->dot11_psmode == EACTIVE) {
438 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 382 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
439 "FW LPS leave ps_mode:%x\n", 383 "FW LPS leave ps_mode:%x\n",
440 FW_PS_ACTIVE_MODE); 384 FW_PS_ACTIVE_MODE);
441 enter_fwlps = false; 385 enter_fwlps = false;
442 ppsc->pwr_mode = FW_PS_ACTIVE_MODE; 386 ppsc->pwr_mode = FW_PS_ACTIVE_MODE;
443 ppsc->smart_ps = 0; 387 ppsc->smart_ps = 0;
444 rtlpriv->cfg->ops->set_hw_reg(hw, 388 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_LPS_ACTION,
445 HW_VAR_FW_LPS_ACTION, 389 (u8 *)(&enter_fwlps));
446 (u8 *)(&enter_fwlps));
447 if (ppsc->p2p_ps_info.opp_ps) 390 if (ppsc->p2p_ps_info.opp_ps)
448 rtl_p2p_ps_cmd(hw, P2P_PS_ENABLE); 391 rtl_p2p_ps_cmd(hw , P2P_PS_ENABLE);
449 392
393 if (rtlpriv->cfg->ops->get_btc_status())
394 rtlpriv->btcoexist.btc_ops->btc_lps_notify(rtlpriv, rt_psmode);
450 } else { 395 } else {
451 if (rtl_get_fwlps_doze(hw)) { 396 if (rtl_get_fwlps_doze(hw)) {
452 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 397 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
453 "FW LPS enter ps_mode:%x\n", 398 "FW LPS enter ps_mode:%x\n",
454 ppsc->fwctrl_psmode); 399 ppsc->fwctrl_psmode);
400 if (rtlpriv->cfg->ops->get_btc_status())
401 rtlpriv->btcoexist.btc_ops->btc_lps_notify(rtlpriv, rt_psmode);
455 enter_fwlps = true; 402 enter_fwlps = true;
456 ppsc->pwr_mode = ppsc->fwctrl_psmode; 403 ppsc->pwr_mode = ppsc->fwctrl_psmode;
457 ppsc->smart_ps = 2; 404 ppsc->smart_ps = 2;
@@ -473,6 +420,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
473 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 420 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
474 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 421 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
475 struct rtl_priv *rtlpriv = rtl_priv(hw); 422 struct rtl_priv *rtlpriv = rtl_priv(hw);
423 unsigned long flag;
476 424
477 if (!ppsc->fwctrl_lps) 425 if (!ppsc->fwctrl_lps)
478 return; 426 return;
@@ -493,7 +441,7 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
493 if (mac->link_state != MAC80211_LINKED) 441 if (mac->link_state != MAC80211_LINKED)
494 return; 442 return;
495 443
496 mutex_lock(&rtlpriv->locks.ps_mutex); 444 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag);
497 445
498 /* Idle for a while if we connect to AP a while ago. */ 446 /* Idle for a while if we connect to AP a while ago. */
499 if (mac->cnt_after_linked >= 2) { 447 if (mac->cnt_after_linked >= 2) {
@@ -505,8 +453,9 @@ void rtl_lps_enter(struct ieee80211_hw *hw)
505 } 453 }
506 } 454 }
507 455
508 mutex_unlock(&rtlpriv->locks.ps_mutex); 456 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
509} 457}
458EXPORT_SYMBOL(rtl_lps_enter);
510 459
511/*Leave the leisure power save mode.*/ 460/*Leave the leisure power save mode.*/
512void rtl_lps_leave(struct ieee80211_hw *hw) 461void rtl_lps_leave(struct ieee80211_hw *hw)
@@ -514,14 +463,15 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
514 struct rtl_priv *rtlpriv = rtl_priv(hw); 463 struct rtl_priv *rtlpriv = rtl_priv(hw);
515 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 464 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
516 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 465 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
466 unsigned long flag;
517 467
518 mutex_lock(&rtlpriv->locks.ps_mutex); 468 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag);
519 469
520 if (ppsc->fwctrl_lps) { 470 if (ppsc->fwctrl_lps) {
521 if (ppsc->dot11_psmode != EACTIVE) { 471 if (ppsc->dot11_psmode != EACTIVE) {
522 472
523 /*FIX ME */ 473 /*FIX ME */
524 rtlpriv->cfg->ops->enable_interrupt(hw); 474 /*rtlpriv->cfg->ops->enable_interrupt(hw); */
525 475
526 if (ppsc->reg_rfps_level & RT_RF_LPS_LEVEL_ASPM && 476 if (ppsc->reg_rfps_level & RT_RF_LPS_LEVEL_ASPM &&
527 RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM) && 477 RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM) &&
@@ -536,8 +486,9 @@ void rtl_lps_leave(struct ieee80211_hw *hw)
536 rtl_lps_set_psmode(hw, EACTIVE); 486 rtl_lps_set_psmode(hw, EACTIVE);
537 } 487 }
538 } 488 }
539 mutex_unlock(&rtlpriv->locks.ps_mutex); 489 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
540} 490}
491EXPORT_SYMBOL(rtl_lps_leave);
541 492
542/* For sw LPS*/ 493/* For sw LPS*/
543void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len) 494void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
@@ -613,7 +564,7 @@ void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len)
613 /* back to low-power land. and delay is 564 /* back to low-power land. and delay is
614 * prevent null power save frame tx fail */ 565 * prevent null power save frame tx fail */
615 queue_delayed_work(rtlpriv->works.rtl_wq, 566 queue_delayed_work(rtlpriv->works.rtl_wq,
616 &rtlpriv->works.ps_work, MSECS(5)); 567 &rtlpriv->works.ps_work, MSECS(5));
617 } else { 568 } else {
618 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 569 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
619 "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed); 570 "u_bufferd: %x, m_buffered: %x\n", u_buffed, m_buffed);
@@ -626,6 +577,7 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
626 struct rtl_priv *rtlpriv = rtl_priv(hw); 577 struct rtl_priv *rtlpriv = rtl_priv(hw);
627 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 578 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
628 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 579 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
580 unsigned long flag;
629 581
630 if (!rtlpriv->psc.swctrl_lps) 582 if (!rtlpriv->psc.swctrl_lps)
631 return; 583 return;
@@ -633,14 +585,14 @@ void rtl_swlps_rf_awake(struct ieee80211_hw *hw)
633 return; 585 return;
634 586
635 if (ppsc->reg_rfps_level & RT_RF_LPS_LEVEL_ASPM && 587 if (ppsc->reg_rfps_level & RT_RF_LPS_LEVEL_ASPM &&
636 RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) { 588 RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
637 rtlpriv->intf_ops->disable_aspm(hw); 589 rtlpriv->intf_ops->disable_aspm(hw);
638 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM); 590 RT_CLEAR_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
639 } 591 }
640 592
641 mutex_lock(&rtlpriv->locks.ps_mutex); 593 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag);
642 rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS); 594 rtl_ps_set_rf_state(hw, ERFON, RF_CHANGE_BY_PS, false);
643 mutex_unlock(&rtlpriv->locks.ps_mutex); 595 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
644} 596}
645 597
646void rtl_swlps_rfon_wq_callback(void *data) 598void rtl_swlps_rfon_wq_callback(void *data)
@@ -657,6 +609,7 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
657 struct rtl_priv *rtlpriv = rtl_priv(hw); 609 struct rtl_priv *rtlpriv = rtl_priv(hw);
658 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 610 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
659 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 611 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
612 unsigned long flag;
660 u8 sleep_intv; 613 u8 sleep_intv;
661 614
662 if (!rtlpriv->psc.sw_ps_enabled) 615 if (!rtlpriv->psc.sw_ps_enabled)
@@ -673,12 +626,19 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
673 if (rtlpriv->link_info.busytraffic) 626 if (rtlpriv->link_info.busytraffic)
674 return; 627 return;
675 628
676 mutex_lock(&rtlpriv->locks.ps_mutex); 629 spin_lock(&rtlpriv->locks.rf_ps_lock);
677 rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS); 630 if (rtlpriv->psc.rfchange_inprogress) {
678 mutex_unlock(&rtlpriv->locks.ps_mutex); 631 spin_unlock(&rtlpriv->locks.rf_ps_lock);
632 return;
633 }
634 spin_unlock(&rtlpriv->locks.rf_ps_lock);
635
636 spin_lock_irqsave(&rtlpriv->locks.lps_lock, flag);
637 rtl_ps_set_rf_state(hw, ERFSLEEP, RF_CHANGE_BY_PS , false);
638 spin_unlock_irqrestore(&rtlpriv->locks.lps_lock, flag);
679 639
680 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM && 640 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_ASPM &&
681 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) { 641 !RT_IN_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM)) {
682 rtlpriv->intf_ops->enable_aspm(hw); 642 rtlpriv->intf_ops->enable_aspm(hw);
683 RT_SET_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM); 643 RT_SET_PS_LEVEL(ppsc, RT_PS_LEVEL_ASPM);
684 } 644 }
@@ -706,7 +666,7 @@ void rtl_swlps_rf_sleep(struct ieee80211_hw *hw)
706 * awake before every dtim */ 666 * awake before every dtim */
707 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG, 667 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
708 "dtim_counter:%x will sleep :%d beacon_intv\n", 668 "dtim_counter:%x will sleep :%d beacon_intv\n",
709 rtlpriv->psc.dtim_counter, sleep_intv); 669 rtlpriv->psc.dtim_counter, sleep_intv);
710 670
711 /* we tested that 40ms is enough for sw & hw sw delay */ 671 /* we tested that 40ms is enough for sw & hw sw delay */
712 queue_delayed_work(rtlpriv->works.rtl_wq, &rtlpriv->works.ps_rfon_wq, 672 queue_delayed_work(rtlpriv->works.rtl_wq, &rtlpriv->works.ps_rfon_wq,
@@ -744,7 +704,7 @@ void rtl_swlps_wq_callback(void *data)
744 704
745 if (rtlpriv->psc.state && !ps) { 705 if (rtlpriv->psc.state && !ps) {
746 rtlpriv->psc.sleep_ms = jiffies_to_msecs(jiffies - 706 rtlpriv->psc.sleep_ms = jiffies_to_msecs(jiffies -
747 rtlpriv->psc.last_action); 707 rtlpriv->psc.last_action);
748 } 708 }
749 709
750 if (ps) 710 if (ps)
@@ -764,7 +724,7 @@ static void rtl_p2p_noa_ie(struct ieee80211_hw *hw, void *data,
764 u8 *pos, *end, *ie; 724 u8 *pos, *end, *ie;
765 u16 noa_len; 725 u16 noa_len;
766 static u8 p2p_oui_ie_type[4] = {0x50, 0x6f, 0x9a, 0x09}; 726 static u8 p2p_oui_ie_type[4] = {0x50, 0x6f, 0x9a, 0x09};
767 u8 noa_num, index, i, noa_index = 0; 727 u8 noa_num, index , i, noa_index = 0;
768 bool find_p2p_ie = false , find_p2p_ps_ie = false; 728 bool find_p2p_ie = false , find_p2p_ps_ie = false;
769 pos = (u8 *)mgmt->u.beacon.variable; 729 pos = (u8 *)mgmt->u.beacon.variable;
770 end = data + len; 730 end = data + len;
@@ -814,7 +774,7 @@ static void rtl_p2p_noa_ie(struct ieee80211_hw *hw, void *data,
814 index = 5; 774 index = 5;
815 for (i = 0; i < noa_num; i++) { 775 for (i = 0; i < noa_num; i++) {
816 p2pinfo->noa_count_type[i] = 776 p2pinfo->noa_count_type[i] =
817 READEF1BYTE(ie+index); 777 READEF1BYTE(ie+index);
818 index += 1; 778 index += 1;
819 p2pinfo->noa_duration[i] = 779 p2pinfo->noa_duration[i] =
820 READEF4BYTE((__le32 *)ie+index); 780 READEF4BYTE((__le32 *)ie+index);
@@ -842,7 +802,7 @@ static void rtl_p2p_noa_ie(struct ieee80211_hw *hw, void *data,
842 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE); 802 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
843 } 803 }
844 } 804 }
845 break; 805 break;
846 } 806 }
847 ie += 3 + noa_len; 807 ie += 3 + noa_len;
848 } 808 }
@@ -860,7 +820,7 @@ static void rtl_p2p_action_ie(struct ieee80211_hw *hw, void *data,
860 struct rtl_priv *rtlpriv = rtl_priv(hw); 820 struct rtl_priv *rtlpriv = rtl_priv(hw);
861 struct ieee80211_mgmt *mgmt = data; 821 struct ieee80211_mgmt *mgmt = data;
862 struct rtl_p2p_ps_info *p2pinfo = &(rtlpriv->psc.p2p_ps_info); 822 struct rtl_p2p_ps_info *p2pinfo = &(rtlpriv->psc.p2p_ps_info);
863 u8 noa_num, index, i, noa_index = 0; 823 u8 noa_num, index , i , noa_index = 0;
864 u8 *pos, *end, *ie; 824 u8 *pos, *end, *ie;
865 u16 noa_len; 825 u16 noa_len;
866 static u8 p2p_oui_ie_type[4] = {0x50, 0x6f, 0x9a, 0x09}; 826 static u8 p2p_oui_ie_type[4] = {0x50, 0x6f, 0x9a, 0x09};
@@ -906,7 +866,7 @@ static void rtl_p2p_action_ie(struct ieee80211_hw *hw, void *data,
906 index = 5; 866 index = 5;
907 for (i = 0; i < noa_num; i++) { 867 for (i = 0; i < noa_num; i++) {
908 p2pinfo->noa_count_type[i] = 868 p2pinfo->noa_count_type[i] =
909 READEF1BYTE(ie+index); 869 READEF1BYTE(ie+index);
910 index += 1; 870 index += 1;
911 p2pinfo->noa_duration[i] = 871 p2pinfo->noa_duration[i] =
912 READEF4BYTE((__le32 *)ie+index); 872 READEF4BYTE((__le32 *)ie+index);
@@ -934,37 +894,37 @@ static void rtl_p2p_action_ie(struct ieee80211_hw *hw, void *data,
934 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE); 894 rtl_p2p_ps_cmd(hw, P2P_PS_DISABLE);
935 } 895 }
936 } 896 }
937 break; 897 break;
938 } 898 }
939 ie += 3 + noa_len; 899 ie += 3 + noa_len;
940 } 900 }
941} 901}
942 902
943void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) 903void rtl_p2p_ps_cmd(struct ieee80211_hw *hw , u8 p2p_ps_state)
944{ 904{
945 struct rtl_priv *rtlpriv = rtl_priv(hw); 905 struct rtl_priv *rtlpriv = rtl_priv(hw);
946 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw)); 906 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
947 struct rtl_p2p_ps_info *p2pinfo = &(rtlpriv->psc.p2p_ps_info); 907 struct rtl_p2p_ps_info *p2pinfo = &(rtlpriv->psc.p2p_ps_info);
948 908
949 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, " p2p state %x\n", p2p_ps_state); 909 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, " p2p state %x\n" , p2p_ps_state);
950 switch (p2p_ps_state) { 910 switch (p2p_ps_state) {
951 case P2P_PS_DISABLE: 911 case P2P_PS_DISABLE:
952 p2pinfo->p2p_ps_state = p2p_ps_state; 912 p2pinfo->p2p_ps_state = p2p_ps_state;
953 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_P2P_PS_OFFLOAD, 913 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_P2P_PS_OFFLOAD,
954 &p2p_ps_state); 914 &p2p_ps_state);
955
956 p2pinfo->noa_index = 0; 915 p2pinfo->noa_index = 0;
957 p2pinfo->ctwindow = 0; 916 p2pinfo->ctwindow = 0;
958 p2pinfo->opp_ps = 0; 917 p2pinfo->opp_ps = 0;
959 p2pinfo->noa_num = 0; 918 p2pinfo->noa_num = 0;
960 p2pinfo->p2p_ps_mode = P2P_PS_NONE; 919 p2pinfo->p2p_ps_mode = P2P_PS_NONE;
961 if (rtlps->fw_current_inpsmode == true) { 920 if (rtlps->fw_current_inpsmode) {
962 if (rtlps->smart_ps == 0) { 921 if (rtlps->smart_ps == 0) {
963 rtlps->smart_ps = 2; 922 rtlps->smart_ps = 2;
964 rtlpriv->cfg->ops->set_hw_reg(hw, 923 rtlpriv->cfg->ops->set_hw_reg(hw,
965 HW_VAR_H2C_FW_PWRMODE, 924 HW_VAR_H2C_FW_PWRMODE,
966 &rtlps->pwr_mode); 925 &rtlps->pwr_mode);
967 } 926 }
927
968 } 928 }
969 break; 929 break;
970 case P2P_PS_ENABLE: 930 case P2P_PS_ENABLE:
@@ -982,6 +942,7 @@ void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
982 rtlpriv->cfg->ops->set_hw_reg(hw, 942 rtlpriv->cfg->ops->set_hw_reg(hw,
983 HW_VAR_H2C_FW_P2P_PS_OFFLOAD, 943 HW_VAR_H2C_FW_P2P_PS_OFFLOAD,
984 &p2p_ps_state); 944 &p2p_ps_state);
945
985 } 946 }
986 break; 947 break;
987 case P2P_PS_SCAN: 948 case P2P_PS_SCAN:
@@ -998,12 +959,16 @@ void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
998 break; 959 break;
999 } 960 }
1000 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, 961 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1001 "ctwindow %x oppps %x\n", p2pinfo->ctwindow, p2pinfo->opp_ps); 962 "ctwindow %x oppps %x\n",
963 p2pinfo->ctwindow , p2pinfo->opp_ps);
1002 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, 964 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1003 "count %x duration %x index %x interval %x start time %x noa num %x\n", 965 "count %x duration %x index %x interval %x start time %x noa num %x\n",
1004 p2pinfo->noa_count_type[0], p2pinfo->noa_duration[0], 966 p2pinfo->noa_count_type[0],
1005 p2pinfo->noa_index, p2pinfo->noa_interval[0], 967 p2pinfo->noa_duration[0],
1006 p2pinfo->noa_start_time[0], p2pinfo->noa_num); 968 p2pinfo->noa_index,
969 p2pinfo->noa_interval[0],
970 p2pinfo->noa_start_time[0],
971 p2pinfo->noa_num);
1007 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "end\n"); 972 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "end\n");
1008} 973}
1009 974
@@ -1032,8 +997,8 @@ void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len)
1032 return; 997 return;
1033 998
1034 if (ieee80211_is_action(hdr->frame_control)) 999 if (ieee80211_is_action(hdr->frame_control))
1035 rtl_p2p_action_ie(hw, data, len - FCS_LEN); 1000 rtl_p2p_action_ie(hw , data , len - FCS_LEN);
1036 else 1001 else
1037 rtl_p2p_noa_ie(hw, data, len - FCS_LEN); 1002 rtl_p2p_noa_ie(hw , data , len - FCS_LEN);
1038} 1003}
1039EXPORT_SYMBOL_GPL(rtl_p2p_info); 1004EXPORT_SYMBOL_GPL(rtl_p2p_info);
diff --git a/drivers/net/wireless/rtlwifi/ps.h b/drivers/net/wireless/rtlwifi/ps.h
index 3bd41f958974..29dfc514212d 100644
--- a/drivers/net/wireless/rtlwifi/ps.h
+++ b/drivers/net/wireless/rtlwifi/ps.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -32,68 +28,9 @@
32 28
33#define MAX_SW_LPS_SLEEP_INTV 5 29#define MAX_SW_LPS_SLEEP_INTV 5
34 30
35/*---------------------------------------------
36 * 3 The value of cmd: 4 bits
37 *---------------------------------------------
38 */
39#define PWR_CMD_READ 0x00
40#define PWR_CMD_WRITE 0x01
41#define PWR_CMD_POLLING 0x02
42#define PWR_CMD_DELAY 0x03
43#define PWR_CMD_END 0x04
44
45/* define the base address of each block */
46#define PWR_BASEADDR_MAC 0x00
47#define PWR_BASEADDR_USB 0x01
48#define PWR_BASEADDR_PCIE 0x02
49#define PWR_BASEADDR_SDIO 0x03
50
51#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3))
52#define PWR_CUT_TESTCHIP_MSK BIT(0)
53#define PWR_CUT_A_MSK BIT(1)
54#define PWR_CUT_B_MSK BIT(2)
55#define PWR_CUT_C_MSK BIT(3)
56#define PWR_CUT_D_MSK BIT(4)
57#define PWR_CUT_E_MSK BIT(5)
58#define PWR_CUT_F_MSK BIT(6)
59#define PWR_CUT_G_MSK BIT(7)
60#define PWR_CUT_ALL_MSK 0xFF
61#define PWR_INTF_SDIO_MSK BIT(0)
62#define PWR_INTF_USB_MSK BIT(1)
63#define PWR_INTF_PCI_MSK BIT(2)
64#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3))
65
66enum pwrseq_delay_unit {
67 PWRSEQ_DELAY_US,
68 PWRSEQ_DELAY_MS,
69};
70
71struct wlan_pwr_cfg {
72 u16 offset;
73 u8 cut_msk;
74 u8 fab_msk:4;
75 u8 interface_msk:4;
76 u8 base:4;
77 u8 cmd:4;
78 u8 msk;
79 u8 value;
80};
81
82#define GET_PWR_CFG_OFFSET(__PWR_CMD) (__PWR_CMD.offset)
83#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) (__PWR_CMD.cut_msk)
84#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) (__PWR_CMD.fab_msk)
85#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) (__PWR_CMD.interface_msk)
86#define GET_PWR_CFG_BASE(__PWR_CMD) (__PWR_CMD.base)
87#define GET_PWR_CFG_CMD(__PWR_CMD) (__PWR_CMD.cmd)
88#define GET_PWR_CFG_MASK(__PWR_CMD) (__PWR_CMD.msk)
89#define GET_PWR_CFG_VALUE(__PWR_CMD) (__PWR_CMD.value)
90
91bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
92 u8 fab_version, u8 interface_type,
93 struct wlan_pwr_cfg pwrcfgcmd[]);
94
95bool rtl_ps_set_rf_state(struct ieee80211_hw *hw, 31bool rtl_ps_set_rf_state(struct ieee80211_hw *hw,
96 enum rf_pwrstate state_toset, u32 changesource); 32 enum rf_pwrstate state_toset, u32 changesource,
33 bool protect_or_not);
97bool rtl_ps_enable_nic(struct ieee80211_hw *hw); 34bool rtl_ps_enable_nic(struct ieee80211_hw *hw);
98bool rtl_ps_disable_nic(struct ieee80211_hw *hw); 35bool rtl_ps_disable_nic(struct ieee80211_hw *hw);
99void rtl_ips_nic_off(struct ieee80211_hw *hw); 36void rtl_ips_nic_off(struct ieee80211_hw *hw);
@@ -102,12 +39,14 @@ void rtl_ips_nic_off_wq_callback(void *data);
102void rtl_lps_enter(struct ieee80211_hw *hw); 39void rtl_lps_enter(struct ieee80211_hw *hw);
103void rtl_lps_leave(struct ieee80211_hw *hw); 40void rtl_lps_leave(struct ieee80211_hw *hw);
104 41
42void rtl_lps_set_psmode(struct ieee80211_hw *hw, u8 rt_psmode);
43
105void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len); 44void rtl_swlps_beacon(struct ieee80211_hw *hw, void *data, unsigned int len);
106void rtl_swlps_wq_callback(void *data); 45void rtl_swlps_wq_callback(void *data);
107void rtl_swlps_rfon_wq_callback(void *data); 46void rtl_swlps_rfon_wq_callback(void *data);
108void rtl_swlps_rf_awake(struct ieee80211_hw *hw); 47void rtl_swlps_rf_awake(struct ieee80211_hw *hw);
109void rtl_swlps_rf_sleep(struct ieee80211_hw *hw); 48void rtl_swlps_rf_sleep(struct ieee80211_hw *hw);
110void rtl_p2p_ps_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); 49void rtl_p2p_ps_cmd(struct ieee80211_hw *hw , u8 p2p_ps_state);
111void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len); 50void rtl_p2p_info(struct ieee80211_hw *hw, void *data, unsigned int len);
112void rtl_lps_change_work_callback(struct work_struct *work); 51void rtl_lps_change_work_callback(struct work_struct *work);
113 52
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseqcmd.h b/drivers/net/wireless/rtlwifi/pwrseqcmd.h
index 6e0f3ea37ec0..17ce0cb2c35c 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseqcmd.h
+++ b/drivers/net/wireless/rtlwifi/pwrseqcmd.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,7 +26,7 @@
30#ifndef __RTL8723E_PWRSEQCMD_H__ 26#ifndef __RTL8723E_PWRSEQCMD_H__
31#define __RTL8723E_PWRSEQCMD_H__ 27#define __RTL8723E_PWRSEQCMD_H__
32 28
33#include "../wifi.h" 29#include "wifi.h"
34/*--------------------------------------------- 30/*---------------------------------------------
35 * 3 The value of cmd: 4 bits 31 * 3 The value of cmd: 4 bits
36 *--------------------------------------------- 32 *---------------------------------------------
diff --git a/drivers/net/wireless/rtlwifi/rc.c b/drivers/net/wireless/rtlwifi/rc.c
index ee28a1a3d010..7863bd278b22 100644
--- a/drivers/net/wireless/rtlwifi/rc.c
+++ b/drivers/net/wireless/rtlwifi/rc.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -35,13 +31,13 @@
35 *Finds the highest rate index we can use 31 *Finds the highest rate index we can use
36 *if skb is special data like DHCP/EAPOL, we set should 32 *if skb is special data like DHCP/EAPOL, we set should
37 *it to lowest rate CCK_1M, otherwise we set rate to 33 *it to lowest rate CCK_1M, otherwise we set rate to
38 *CCK11M or OFDM_54M based on wireless mode. 34 *highest rate based on wireless mode used for iwconfig
35 *show Tx rate.
39 */ 36 */
40static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv, 37static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv,
41 struct ieee80211_sta *sta, 38 struct ieee80211_sta *sta,
42 struct sk_buff *skb, bool not_data) 39 struct sk_buff *skb, bool not_data)
43{ 40{
44 struct rtl_mac *rtlmac = rtl_mac(rtlpriv);
45 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 41 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
46 struct rtl_phy *rtlphy = &(rtlpriv->phy); 42 struct rtl_phy *rtlphy = &(rtlpriv->phy);
47 struct rtl_sta_info *sta_entry = NULL; 43 struct rtl_sta_info *sta_entry = NULL;
@@ -54,21 +50,13 @@ static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv,
54 *2.in rtl_get_tcb_desc when we check rate is 50 *2.in rtl_get_tcb_desc when we check rate is
55 * 1M we will not use FW rate but user rate. 51 * 1M we will not use FW rate but user rate.
56 */ 52 */
57 if (rtlmac->opmode == NL80211_IFTYPE_AP || 53
58 rtlmac->opmode == NL80211_IFTYPE_ADHOC || 54 if (sta) {
59 rtlmac->opmode == NL80211_IFTYPE_MESH_POINT) { 55 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
60 if (sta) { 56 wireless_mode = sta_entry->wireless_mode;
61 sta_entry = (struct rtl_sta_info *) sta->drv_priv;
62 wireless_mode = sta_entry->wireless_mode;
63 } else {
64 return 0;
65 }
66 } else {
67 wireless_mode = rtlmac->mode;
68 } 57 }
69 58
70 if (rtl_is_special_data(rtlpriv->mac80211.hw, skb, true) || 59 if (rtl_is_special_data(rtlpriv->mac80211.hw, skb, true) || not_data) {
71 not_data) {
72 return 0; 60 return 0;
73 } else { 61 } else {
74 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 62 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
@@ -76,21 +64,27 @@ static u8 _rtl_rc_get_highest_rix(struct rtl_priv *rtlpriv,
76 return B_MODE_MAX_RIX; 64 return B_MODE_MAX_RIX;
77 } else if (wireless_mode == WIRELESS_MODE_G) { 65 } else if (wireless_mode == WIRELESS_MODE_G) {
78 return G_MODE_MAX_RIX; 66 return G_MODE_MAX_RIX;
79 } else { 67 } else if (wireless_mode == WIRELESS_MODE_N_24G) {
80 if (get_rf_type(rtlphy) != RF_2T2R) 68 if (get_rf_type(rtlphy) != RF_2T2R)
81 return N_MODE_MCS7_RIX; 69 return N_MODE_MCS7_RIX;
82 else 70 else
83 return N_MODE_MCS15_RIX; 71 return N_MODE_MCS15_RIX;
72 } else if (wireless_mode == WIRELESS_MODE_AC_24G) {
73 return AC_MODE_MCS9_RIX;
84 } 74 }
75 return 0;
85 } else { 76 } else {
86 if (wireless_mode == WIRELESS_MODE_A) { 77 if (wireless_mode == WIRELESS_MODE_A) {
87 return A_MODE_MAX_RIX; 78 return A_MODE_MAX_RIX;
88 } else { 79 } else if (wireless_mode == WIRELESS_MODE_N_5G) {
89 if (get_rf_type(rtlphy) != RF_2T2R) 80 if (get_rf_type(rtlphy) != RF_2T2R)
90 return N_MODE_MCS7_RIX; 81 return N_MODE_MCS7_RIX;
91 else 82 else
92 return N_MODE_MCS15_RIX; 83 return N_MODE_MCS15_RIX;
84 } else if (wireless_mode == WIRELESS_MODE_AC_5G) {
85 return AC_MODE_MCS9_RIX;
93 } 86 }
87 return 0;
94 } 88 }
95 } 89 }
96} 90}
@@ -103,35 +97,52 @@ static void _rtl_rc_rate_set_series(struct rtl_priv *rtlpriv,
103 bool not_data) 97 bool not_data)
104{ 98{
105 struct rtl_mac *mac = rtl_mac(rtlpriv); 99 struct rtl_mac *mac = rtl_mac(rtlpriv);
106 u8 sgi_20 = 0, sgi_40 = 0; 100 struct rtl_sta_info *sta_entry = NULL;
101 u8 wireless_mode = 0;
102 u8 sgi_20 = 0, sgi_40 = 0, sgi_80 = 0;
107 103
108 if (sta) { 104 if (sta) {
109 sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20; 105 sgi_20 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20;
110 sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40; 106 sgi_40 = sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40;
107 sgi_80 = sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80;
108 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
109 wireless_mode = sta_entry->wireless_mode;
111 } 110 }
112 rate->count = tries; 111 rate->count = tries;
113 rate->idx = rix >= 0x00 ? rix : 0x00; 112 rate->idx = rix >= 0x00 ? rix : 0x00;
113 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE &&
114 wireless_mode == WIRELESS_MODE_AC_5G)
115 rate->idx += 0x10;/*2NSS for 8812AE*/
114 116
115 if (!not_data) { 117 if (!not_data) {
116 if (txrc->short_preamble) 118 if (txrc->short_preamble)
117 rate->flags |= IEEE80211_TX_RC_USE_SHORT_PREAMBLE; 119 rate->flags |= IEEE80211_TX_RC_USE_SHORT_PREAMBLE;
118 if (mac->opmode == NL80211_IFTYPE_AP || 120 if (mac->opmode == NL80211_IFTYPE_AP ||
119 mac->opmode == NL80211_IFTYPE_ADHOC) { 121 mac->opmode == NL80211_IFTYPE_ADHOC) {
120 if (sta && (sta->bandwidth >= IEEE80211_STA_RX_BW_40)) 122 if (sta && (sta->ht_cap.cap &
123 IEEE80211_HT_CAP_SUP_WIDTH_20_40))
121 rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; 124 rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
125 if (sta && (sta->vht_cap.vht_supported))
126 rate->flags |= IEEE80211_TX_RC_80_MHZ_WIDTH;
122 } else { 127 } else {
123 if (mac->bw_40) 128 if (mac->bw_40)
124 rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH; 129 rate->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
130 if (mac->bw_80)
131 rate->flags |= IEEE80211_TX_RC_80_MHZ_WIDTH;
125 } 132 }
126 if (sgi_20 || sgi_40) 133
134 if (sgi_20 || sgi_40 || sgi_80)
127 rate->flags |= IEEE80211_TX_RC_SHORT_GI; 135 rate->flags |= IEEE80211_TX_RC_SHORT_GI;
128 if (sta && sta->ht_cap.ht_supported) 136 if (sta && sta->ht_cap.ht_supported &&
137 ((wireless_mode == WIRELESS_MODE_N_5G) ||
138 (wireless_mode == WIRELESS_MODE_N_24G)))
129 rate->flags |= IEEE80211_TX_RC_MCS; 139 rate->flags |= IEEE80211_TX_RC_MCS;
130 } 140 }
131} 141}
132 142
133static void rtl_get_rate(void *ppriv, struct ieee80211_sta *sta, 143static void rtl_get_rate(void *ppriv, struct ieee80211_sta *sta,
134 void *priv_sta, struct ieee80211_tx_rate_control *txrc) 144 void *priv_sta,
145 struct ieee80211_tx_rate_control *txrc)
135{ 146{
136 struct rtl_priv *rtlpriv = ppriv; 147 struct rtl_priv *rtlpriv = ppriv;
137 struct sk_buff *skb = txrc->skb; 148 struct sk_buff *skb = txrc->skb;
@@ -158,7 +169,7 @@ static void rtl_get_rate(void *ppriv, struct ieee80211_sta *sta,
158} 169}
159 170
160static bool _rtl_tx_aggr_check(struct rtl_priv *rtlpriv, 171static bool _rtl_tx_aggr_check(struct rtl_priv *rtlpriv,
161 struct rtl_sta_info *sta_entry, u16 tid) 172 struct rtl_sta_info *sta_entry, u16 tid)
162{ 173{
163 struct rtl_mac *mac = rtl_mac(rtlpriv); 174 struct rtl_mac *mac = rtl_mac(rtlpriv);
164 175
@@ -166,7 +177,7 @@ static bool _rtl_tx_aggr_check(struct rtl_priv *rtlpriv,
166 return false; 177 return false;
167 178
168 if (mac->opmode == NL80211_IFTYPE_STATION && 179 if (mac->opmode == NL80211_IFTYPE_STATION &&
169 mac->cnt_after_linked < 3) 180 mac->cnt_after_linked < 3)
170 return false; 181 return false;
171 182
172 if (sta_entry->tids[tid].agg.agg_state == RTL_AGG_STOP) 183 if (sta_entry->tids[tid].agg.agg_state == RTL_AGG_STOP)
@@ -193,23 +204,23 @@ static void rtl_tx_status(void *ppriv,
193 if (rtl_is_special_data(mac->hw, skb, true)) 204 if (rtl_is_special_data(mac->hw, skb, true))
194 return; 205 return;
195 206
196 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) 207 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
197 || is_broadcast_ether_addr(ieee80211_get_DA(hdr))) 208 is_broadcast_ether_addr(ieee80211_get_DA(hdr)))
198 return; 209 return;
199 210
200 if (sta) { 211 if (sta) {
201 /* Check if aggregation has to be enabled for this tid */ 212 /* Check if aggregation has to be enabled for this tid */
202 sta_entry = (struct rtl_sta_info *) sta->drv_priv; 213 sta_entry = (struct rtl_sta_info *) sta->drv_priv;
203 if ((sta->ht_cap.ht_supported) && 214 if ((sta->ht_cap.ht_supported) &&
204 !(skb->protocol == cpu_to_be16(ETH_P_PAE))) { 215 !(skb->protocol == cpu_to_be16(ETH_P_PAE))) {
205 if (ieee80211_is_data_qos(fc)) { 216 if (ieee80211_is_data_qos(fc)) {
206 u8 tid = rtl_get_tid(skb); 217 u8 tid = rtl_get_tid(skb);
207 if (_rtl_tx_aggr_check(rtlpriv, sta_entry, 218 if (_rtl_tx_aggr_check(rtlpriv, sta_entry,
208 tid)) { 219 tid)) {
209 sta_entry->tids[tid].agg.agg_state = 220 sta_entry->tids[tid].agg.agg_state =
210 RTL_AGG_PROGRESS; 221 RTL_AGG_PROGRESS;
211 ieee80211_start_tx_ba_session(sta, 222 ieee80211_start_tx_ba_session(sta, tid,
212 tid, 5000); 223 5000);
213 } 224 }
214 } 225 }
215 } 226 }
@@ -223,8 +234,15 @@ static void rtl_rate_init(void *ppriv,
223{ 234{
224} 235}
225 236
226static void *rtl_rate_alloc(struct ieee80211_hw *hw, 237static void rtl_rate_update(void *ppriv,
227 struct dentry *debugfsdir) 238 struct ieee80211_supported_band *sband,
239 struct cfg80211_chan_def *chandef,
240 struct ieee80211_sta *sta, void *priv_sta,
241 u32 changed)
242{
243}
244
245static void *rtl_rate_alloc(struct ieee80211_hw *hw, struct dentry *debugfsdir)
228{ 246{
229 struct rtl_priv *rtlpriv = rtl_priv(hw); 247 struct rtl_priv *rtlpriv = rtl_priv(hw);
230 return rtlpriv; 248 return rtlpriv;
@@ -260,13 +278,14 @@ static void rtl_rate_free_sta(void *rtlpriv,
260 kfree(rate_priv); 278 kfree(rate_priv);
261} 279}
262 280
263static const struct rate_control_ops rtl_rate_ops = { 281static struct rate_control_ops rtl_rate_ops = {
264 .name = "rtl_rc", 282 .name = "rtl_rc",
265 .alloc = rtl_rate_alloc, 283 .alloc = rtl_rate_alloc,
266 .free = rtl_rate_free, 284 .free = rtl_rate_free,
267 .alloc_sta = rtl_rate_alloc_sta, 285 .alloc_sta = rtl_rate_alloc_sta,
268 .free_sta = rtl_rate_free_sta, 286 .free_sta = rtl_rate_free_sta,
269 .rate_init = rtl_rate_init, 287 .rate_init = rtl_rate_init,
288 .rate_update = rtl_rate_update,
270 .tx_status = rtl_tx_status, 289 .tx_status = rtl_tx_status,
271 .get_rate = rtl_get_rate, 290 .get_rate = rtl_get_rate,
272}; 291};
diff --git a/drivers/net/wireless/rtlwifi/rc.h b/drivers/net/wireless/rtlwifi/rc.h
index 4d6176160610..f29643d60d6b 100644
--- a/drivers/net/wireless/rtlwifi/rc.h
+++ b/drivers/net/wireless/rtlwifi/rc.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -38,10 +34,15 @@
38#define N_MODE_MCS7_RIX 7 34#define N_MODE_MCS7_RIX 7
39#define N_MODE_MCS15_RIX 15 35#define N_MODE_MCS15_RIX 15
40 36
37#define AC_MODE_MCS7_RIX 7
38#define AC_MODE_MCS8_RIX 8
39#define AC_MODE_MCS9_RIX 9
40
41struct rtl_rate_priv { 41struct rtl_rate_priv {
42 u8 ht_cap; 42 u8 ht_cap;
43}; 43};
44 44
45int rtl_rate_control_register(void); 45int rtl_rate_control_register(void);
46void rtl_rate_control_unregister(void); 46void rtl_rate_control_unregister(void);
47
47#endif 48#endif
diff --git a/drivers/net/wireless/rtlwifi/regd.c b/drivers/net/wireless/rtlwifi/regd.c
index a4eb9b271438..1893d01b9e78 100644
--- a/drivers/net/wireless/rtlwifi/regd.c
+++ b/drivers/net/wireless/rtlwifi/regd.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -59,26 +55,23 @@ static struct country_code_to_enum_rd allCountries[] = {
59 */ 55 */
60#define RTL819x_2GHZ_CH12_13 \ 56#define RTL819x_2GHZ_CH12_13 \
61 REG_RULE(2467-10, 2472+10, 40, 0, 20,\ 57 REG_RULE(2467-10, 2472+10, 40, 0, 20,\
62 NL80211_RRF_NO_IR) 58 NL80211_RRF_PASSIVE_SCAN)
63 59
64#define RTL819x_2GHZ_CH14 \ 60#define RTL819x_2GHZ_CH14 \
65 REG_RULE(2484-10, 2484+10, 40, 0, 20, \ 61 REG_RULE(2484-10, 2484+10, 40, 0, 20, \
66 NL80211_RRF_NO_IR | NL80211_RRF_NO_OFDM) 62 NL80211_RRF_PASSIVE_SCAN | \
63 NL80211_RRF_NO_OFDM)
64
67 65
68/* 5G chan 36 - chan 64*/ 66/* 5G chan 36 - chan 64*/
69#define RTL819x_5GHZ_5150_5350 \ 67#define RTL819x_5GHZ_5150_5350 \
70 REG_RULE(5150-10, 5350+10, 40, 0, 30, \ 68 REG_RULE(5150-10, 5350+10, 80, 0, 30, 0)
71 NL80211_RRF_NO_IR)
72
73/* 5G chan 100 - chan 165*/ 69/* 5G chan 100 - chan 165*/
74#define RTL819x_5GHZ_5470_5850 \ 70#define RTL819x_5GHZ_5470_5850 \
75 REG_RULE(5470-10, 5850+10, 40, 0, 30, \ 71 REG_RULE(5470-10, 5850+10, 80, 0, 30, 0)
76 NL80211_RRF_NO_IR)
77
78/* 5G chan 149 - chan 165*/ 72/* 5G chan 149 - chan 165*/
79#define RTL819x_5GHZ_5725_5850 \ 73#define RTL819x_5GHZ_5725_5850 \
80 REG_RULE(5725-10, 5850+10, 40, 0, 30, \ 74 REG_RULE(5725-10, 5850+10, 80, 0, 30, 0)
81 NL80211_RRF_NO_IR)
82 75
83#define RTL819x_5GHZ_ALL \ 76#define RTL819x_5GHZ_ALL \
84 (RTL819x_5GHZ_5150_5350, RTL819x_5GHZ_5470_5850) 77 (RTL819x_5GHZ_5150_5350, RTL819x_5GHZ_5470_5850)
@@ -143,7 +136,7 @@ static const struct ieee80211_regdomain rtl_regdom_14 = {
143 136
144static bool _rtl_is_radar_freq(u16 center_freq) 137static bool _rtl_is_radar_freq(u16 center_freq)
145{ 138{
146 return (center_freq >= 5260 && center_freq <= 5700); 139 return center_freq >= 5260 && center_freq <= 5700;
147} 140}
148 141
149static void _rtl_reg_apply_beaconing_flags(struct wiphy *wiphy, 142static void _rtl_reg_apply_beaconing_flags(struct wiphy *wiphy,
@@ -169,10 +162,9 @@ static void _rtl_reg_apply_beaconing_flags(struct wiphy *wiphy,
169 continue; 162 continue;
170 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) { 163 if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
171 reg_rule = freq_reg_info(wiphy, 164 reg_rule = freq_reg_info(wiphy,
172 MHZ_TO_KHZ(ch->center_freq)); 165 ch->center_freq);
173 if (IS_ERR(reg_rule)) 166 if (IS_ERR(reg_rule))
174 continue; 167 continue;
175
176 /* 168 /*
177 *If 11d had a rule for this channel ensure 169 *If 11d had a rule for this channel ensure
178 *we enable adhoc/beaconing if it allows us to 170 *we enable adhoc/beaconing if it allows us to
@@ -182,11 +174,16 @@ static void _rtl_reg_apply_beaconing_flags(struct wiphy *wiphy,
182 *regulatory_hint(). 174 *regulatory_hint().
183 */ 175 */
184 176
185 if (!(reg_rule->flags & NL80211_RRF_NO_IR)) 177 if (!(reg_rule->flags & NL80211_RRF_NO_IBSS))
186 ch->flags &= ~IEEE80211_CHAN_NO_IR; 178 ch->flags &= ~IEEE80211_CHAN_NO_IBSS;
179 if (!(reg_rule->flags &
180 NL80211_RRF_PASSIVE_SCAN))
181 ch->flags &=
182 ~IEEE80211_CHAN_PASSIVE_SCAN;
187 } else { 183 } else {
188 if (ch->beacon_found) 184 if (ch->beacon_found)
189 ch->flags &= ~IEEE80211_CHAN_NO_IR; 185 ch->flags &= ~(IEEE80211_CHAN_NO_IBSS |
186 IEEE80211_CHAN_PASSIVE_SCAN);
190 } 187 }
191 } 188 }
192 } 189 }
@@ -211,35 +208,35 @@ static void _rtl_reg_apply_active_scan_flags(struct wiphy *wiphy,
211 */ 208 */
212 if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) { 209 if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
213 ch = &sband->channels[11]; /* CH 12 */ 210 ch = &sband->channels[11]; /* CH 12 */
214 if (ch->flags & IEEE80211_CHAN_NO_IR) 211 if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
215 ch->flags &= ~IEEE80211_CHAN_NO_IR; 212 ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
216 ch = &sband->channels[12]; /* CH 13 */ 213 ch = &sband->channels[12]; /* CH 13 */
217 if (ch->flags & IEEE80211_CHAN_NO_IR) 214 if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
218 ch->flags &= ~IEEE80211_CHAN_NO_IR; 215 ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
219 return; 216 return;
220 } 217 }
221 218
222 /* 219 /*
223 *If a country IE has been received check its rule for this 220 *If a country IE has been recieved check its rule for this
224 *channel first before enabling active scan. The passive scan 221 *channel first before enabling active scan. The passive scan
225 *would have been enforced by the initial processing of our 222 *would have been enforced by the initial processing of our
226 *custom regulatory domain. 223 *custom regulatory domain.
227 */ 224 */
228 225
229 ch = &sband->channels[11]; /* CH 12 */ 226 ch = &sband->channels[11]; /* CH 12 */
230 reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(ch->center_freq)); 227 reg_rule = freq_reg_info(wiphy, ch->center_freq);
231 if (!IS_ERR(reg_rule)) { 228 if (!IS_ERR(reg_rule)) {
232 if (!(reg_rule->flags & NL80211_RRF_NO_IR)) 229 if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
233 if (ch->flags & IEEE80211_CHAN_NO_IR) 230 if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
234 ch->flags &= ~IEEE80211_CHAN_NO_IR; 231 ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
235 } 232 }
236 233
237 ch = &sband->channels[12]; /* CH 13 */ 234 ch = &sband->channels[12]; /* CH 13 */
238 reg_rule = freq_reg_info(wiphy, MHZ_TO_KHZ(ch->center_freq)); 235 reg_rule = freq_reg_info(wiphy, ch->center_freq);
239 if (!IS_ERR(reg_rule)) { 236 if (!IS_ERR(reg_rule)) {
240 if (!(reg_rule->flags & NL80211_RRF_NO_IR)) 237 if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
241 if (ch->flags & IEEE80211_CHAN_NO_IR) 238 if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
242 ch->flags &= ~IEEE80211_CHAN_NO_IR; 239 ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
243 } 240 }
244} 241}
245 242
@@ -276,7 +273,8 @@ static void _rtl_reg_apply_radar_flags(struct wiphy *wiphy)
276 */ 273 */
277 if (!(ch->flags & IEEE80211_CHAN_DISABLED)) 274 if (!(ch->flags & IEEE80211_CHAN_DISABLED))
278 ch->flags |= IEEE80211_CHAN_RADAR | 275 ch->flags |= IEEE80211_CHAN_RADAR |
279 IEEE80211_CHAN_NO_IR; 276 IEEE80211_CHAN_NO_IBSS |
277 IEEE80211_CHAN_PASSIVE_SCAN;
280 } 278 }
281} 279}
282 280
@@ -289,9 +287,25 @@ static void _rtl_reg_apply_world_flags(struct wiphy *wiphy,
289 return; 287 return;
290} 288}
291 289
292static void _rtl_reg_notifier_apply(struct wiphy *wiphy, 290static void _rtl_dump_channel_map(struct wiphy *wiphy)
293 struct regulatory_request *request, 291{
294 struct rtl_regulatory *reg) 292 enum ieee80211_band band;
293 struct ieee80211_supported_band *sband;
294 struct ieee80211_channel *ch;
295 unsigned int i;
296
297 for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
298 if (!wiphy->bands[band])
299 continue;
300 sband = wiphy->bands[band];
301 for (i = 0; i < sband->n_channels; i++)
302 ch = &sband->channels[i];
303 }
304}
305
306static int _rtl_reg_notifier_apply(struct wiphy *wiphy,
307 struct regulatory_request *request,
308 struct rtl_regulatory *reg)
295{ 309{
296 /* We always apply this */ 310 /* We always apply this */
297 _rtl_reg_apply_radar_flags(wiphy); 311 _rtl_reg_apply_radar_flags(wiphy);
@@ -305,10 +319,14 @@ static void _rtl_reg_notifier_apply(struct wiphy *wiphy,
305 _rtl_reg_apply_world_flags(wiphy, request->initiator, reg); 319 _rtl_reg_apply_world_flags(wiphy, request->initiator, reg);
306 break; 320 break;
307 } 321 }
322
323 _rtl_dump_channel_map(wiphy);
324
325 return 0;
308} 326}
309 327
310static const struct ieee80211_regdomain *_rtl_regdomain_select( 328static const struct ieee80211_regdomain *_rtl_regdomain_select(
311 struct rtl_regulatory *reg) 329 struct rtl_regulatory *reg)
312{ 330{
313 switch (reg->country_code) { 331 switch (reg->country_code) {
314 case COUNTRY_CODE_FCC: 332 case COUNTRY_CODE_FCC:
@@ -337,9 +355,9 @@ static const struct ieee80211_regdomain *_rtl_regdomain_select(
337 355
338static int _rtl_regd_init_wiphy(struct rtl_regulatory *reg, 356static int _rtl_regd_init_wiphy(struct rtl_regulatory *reg,
339 struct wiphy *wiphy, 357 struct wiphy *wiphy,
340 void (*reg_notifier) (struct wiphy *wiphy, 358 void (*reg_notifier)(struct wiphy *wiphy,
341 struct regulatory_request * 359 struct regulatory_request *
342 request)) 360 request))
343{ 361{
344 const struct ieee80211_regdomain *regd; 362 const struct ieee80211_regdomain *regd;
345 363
@@ -348,7 +366,6 @@ static int _rtl_regd_init_wiphy(struct rtl_regulatory *reg,
348 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG; 366 wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG;
349 wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG; 367 wiphy->regulatory_flags &= ~REGULATORY_STRICT_REG;
350 wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS; 368 wiphy->regulatory_flags &= ~REGULATORY_DISABLE_BEACON_HINTS;
351
352 regd = _rtl_regdomain_select(reg); 369 regd = _rtl_regdomain_select(reg);
353 wiphy_apply_custom_regulatory(wiphy, regd); 370 wiphy_apply_custom_regulatory(wiphy, regd);
354 _rtl_reg_apply_radar_flags(wiphy); 371 _rtl_reg_apply_radar_flags(wiphy);
@@ -368,7 +385,7 @@ static struct country_code_to_enum_rd *_rtl_regd_find_country(u16 countrycode)
368} 385}
369 386
370int rtl_regd_init(struct ieee80211_hw *hw, 387int rtl_regd_init(struct ieee80211_hw *hw,
371 void (*reg_notifier) (struct wiphy *wiphy, 388 void (*reg_notifier)(struct wiphy *wiphy,
372 struct regulatory_request *request)) 389 struct regulatory_request *request))
373{ 390{
374 struct rtl_priv *rtlpriv = rtl_priv(hw); 391 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -382,7 +399,8 @@ int rtl_regd_init(struct ieee80211_hw *hw,
382 rtlpriv->regd.country_code = rtlpriv->efuse.channel_plan; 399 rtlpriv->regd.country_code = rtlpriv->efuse.channel_plan;
383 400
384 RT_TRACE(rtlpriv, COMP_REGD, DBG_TRACE, 401 RT_TRACE(rtlpriv, COMP_REGD, DBG_TRACE,
385 "rtl: EEPROM regdomain: 0x%0x\n", rtlpriv->regd.country_code); 402 "rtl: EEPROM regdomain: 0x%0x\n",
403 rtlpriv->regd.country_code);
386 404
387 if (rtlpriv->regd.country_code >= COUNTRY_CODE_MAX) { 405 if (rtlpriv->regd.country_code >= COUNTRY_CODE_MAX) {
388 RT_TRACE(rtlpriv, COMP_REGD, DBG_DMESG, 406 RT_TRACE(rtlpriv, COMP_REGD, DBG_DMESG,
@@ -403,7 +421,7 @@ int rtl_regd_init(struct ieee80211_hw *hw,
403 421
404 RT_TRACE(rtlpriv, COMP_REGD, DBG_TRACE, 422 RT_TRACE(rtlpriv, COMP_REGD, DBG_TRACE,
405 "rtl: Country alpha2 being used: %c%c\n", 423 "rtl: Country alpha2 being used: %c%c\n",
406 rtlpriv->regd.alpha2[0], rtlpriv->regd.alpha2[1]); 424 rtlpriv->regd.alpha2[0], rtlpriv->regd.alpha2[1]);
407 425
408 _rtl_regd_init_wiphy(&rtlpriv->regd, wiphy, reg_notifier); 426 _rtl_regd_init_wiphy(&rtlpriv->regd, wiphy, reg_notifier);
409 427
diff --git a/drivers/net/wireless/rtlwifi/regd.h b/drivers/net/wireless/rtlwifi/regd.h
index 4e1f4f00e6e9..3bbbaaa68530 100644
--- a/drivers/net/wireless/rtlwifi/regd.h
+++ b/drivers/net/wireless/rtlwifi/regd.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,6 +26,10 @@
30#ifndef __RTL_REGD_H__ 26#ifndef __RTL_REGD_H__
31#define __RTL_REGD_H__ 27#define __RTL_REGD_H__
32 28
29/* for kernel 3.14 , both value are changed to IEEE80211_CHAN_NO_IR*/
30#define IEEE80211_CHAN_NO_IBSS IEEE80211_CHAN_NO_IR
31#define IEEE80211_CHAN_PASSIVE_SCAN IEEE80211_CHAN_NO_IR
32
33struct country_code_to_enum_rd { 33struct country_code_to_enum_rd {
34 u16 countrycode; 34 u16 countrycode;
35 const char *iso_name; 35 const char *iso_name;
@@ -56,6 +56,7 @@ enum country_code_type_t {
56 56
57int rtl_regd_init(struct ieee80211_hw *hw, 57int rtl_regd_init(struct ieee80211_hw *hw,
58 void (*reg_notifier) (struct wiphy *wiphy, 58 void (*reg_notifier) (struct wiphy *wiphy,
59 struct regulatory_request *request)); 59 struct regulatory_request *request));
60void rtl_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request); 60void rtl_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request);
61
61#endif 62#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/def.h b/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
index c764fff9ebe6..d9ea9d0c79a5 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/def.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -111,7 +107,6 @@
111 107
112#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3) 108#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
113 109
114
115/* [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3 110/* [15:12] IC version(CUT): A-cut=0, B-cut=1, C-cut=2, D-cut=3
116 * [7] Manufacturer: TSMC=0, UMC=1 111 * [7] Manufacturer: TSMC=0, UMC=1
117 * [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2 112 * [6:4] RF type: 1T1R=0, 1T2R=1, 2T2R=2
@@ -130,7 +125,6 @@
130#define D_CUT_VERSION ((BIT(12)|BIT(13))) 125#define D_CUT_VERSION ((BIT(12)|BIT(13)))
131#define E_CUT_VERSION BIT(14) 126#define E_CUT_VERSION BIT(14)
132 127
133
134/* MASK */ 128/* MASK */
135#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2)) 129#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2))
136#define CHIP_TYPE_MASK BIT(3) 130#define CHIP_TYPE_MASK BIT(3)
@@ -147,7 +141,6 @@
147#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK) 141#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
148#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK) 142#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
149 143
150
151#define IS_81XXC(version) \ 144#define IS_81XXC(version) \
152 ((GET_CVID_IC_TYPE(version) == 0) ? true : false) 145 ((GET_CVID_IC_TYPE(version) == 0) ? true : false)
153#define IS_8723_SERIES(version) \ 146#define IS_8723_SERIES(version) \
@@ -174,7 +167,7 @@
174#define IS_81xxC_VENDOR_UMC_A_CUT(version) \ 167#define IS_81xxC_VENDOR_UMC_A_CUT(version) \
175 (IS_81XXC(version) ? ((IS_CHIP_VENDOR_UMC(version)) ? \ 168 (IS_81XXC(version) ? ((IS_CHIP_VENDOR_UMC(version)) ? \
176 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false) : false) 169 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false) : false)
177#define IS_81xxC_VENDOR_UMC_B_CUT(version) \ 170#define IS_81XXC_VENDOR_UMC_B_CUT(version) \
178 (IS_81XXC(version) ? (IS_CHIP_VENDOR_UMC(version) ? \ 171 (IS_81XXC(version) ? (IS_CHIP_VENDOR_UMC(version) ? \
179 ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? true \ 172 ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? true \
180 : false) : false) : false) 173 : false) : false) : false)
@@ -225,44 +218,37 @@ enum power_polocy_config {
225}; 218};
226 219
227enum interface_select_pci { 220enum interface_select_pci {
228 INTF_SEL1_MINICARD, 221 INTF_SEL1_MINICARD = 0,
229 INTF_SEL0_PCIE, 222 INTF_SEL0_PCIE = 1,
230 INTF_SEL2_RSV, 223 INTF_SEL2_RSV = 2,
231 INTF_SEL3_RSV, 224 INTF_SEL3_RSV = 3,
232}; 225};
233 226
234enum hal_fw_c2h_cmd_id { 227enum hal_fw_c2h_cmd_id {
235 HAL_FW_C2H_CMD_Read_MACREG, 228 HAL_FW_C2H_CMD_READ_MACREG = 0,
236 HAL_FW_C2H_CMD_Read_BBREG, 229 HAL_FW_C2H_CMD_READ_BBREG = 1,
237 HAL_FW_C2H_CMD_Read_RFREG, 230 HAL_FW_C2H_CMD_READ_RFREG = 2,
238 HAL_FW_C2H_CMD_Read_EEPROM, 231 HAL_FW_C2H_CMD_READ_EEPROM = 3,
239 HAL_FW_C2H_CMD_Read_EFUSE, 232 HAL_FW_C2H_CMD_READ_EFUSE = 4,
240 HAL_FW_C2H_CMD_Read_CAM, 233 HAL_FW_C2H_CMD_READ_CAM = 5,
241 HAL_FW_C2H_CMD_Get_BasicRate, 234 HAL_FW_C2H_CMD_GET_BASICRATE = 6,
242 HAL_FW_C2H_CMD_Get_DataRate, 235 HAL_FW_C2H_CMD_GET_DATARATE = 7,
243 HAL_FW_C2H_CMD_Survey, 236 HAL_FW_C2H_CMD_SURVEY = 8,
244 HAL_FW_C2H_CMD_SurveyDone, 237 HAL_FW_C2H_CMD_SURVEYDONE = 9,
245 HAL_FW_C2H_CMD_JoinBss, 238 HAL_FW_C2H_CMD_JOINBSS = 10,
246 HAL_FW_C2H_CMD_AddSTA, 239 HAL_FW_C2H_CMD_ADDSTA = 11,
247 HAL_FW_C2H_CMD_DelSTA, 240 HAL_FW_C2H_CMD_DELSTA = 12,
248 HAL_FW_C2H_CMD_AtimDone, 241 HAL_FW_C2H_CMD_ATIMDONE = 13,
249 HAL_FW_C2H_CMD_TX_Report, 242 HAL_FW_C2H_CMD_TX_REPORT = 14,
250 HAL_FW_C2H_CMD_CCX_Report, 243 HAL_FW_C2H_CMD_CCX_REPORT = 15,
251 HAL_FW_C2H_CMD_DTM_Report, 244 HAL_FW_C2H_CMD_DTM_REPORT = 16,
252 HAL_FW_C2H_CMD_TX_Rate_Statistics, 245 HAL_FW_C2H_CMD_TX_RATE_STATISTICS = 17,
253 HAL_FW_C2H_CMD_C2HLBK, 246 HAL_FW_C2H_CMD_C2HLBK = 18,
254 HAL_FW_C2H_CMD_C2HDBG, 247 HAL_FW_C2H_CMD_C2HDBG = 19,
255 HAL_FW_C2H_CMD_C2HFEEDBACK, 248 HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
256 HAL_FW_C2H_CMD_MAX 249 HAL_FW_C2H_CMD_MAX
257}; 250};
258 251
259enum wake_on_wlan_mode {
260 ewowlandisable,
261 ewakeonmagicpacketonly,
262 ewakeonpatternmatchonly,
263 ewakeonbothtypepacket
264};
265
266enum rtl_desc_qsel { 252enum rtl_desc_qsel {
267 QSLT_BK = 0x2, 253 QSLT_BK = 0x2,
268 QSLT_BE = 0x0, 254 QSLT_BE = 0x0,
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
index f8daa61cf1c3..2aa34d9055f0 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -188,21 +184,24 @@ static void rtl88e_set_iqk_matrix(struct ieee80211_hw *hw,
188 switch (rfpath) { 184 switch (rfpath) {
189 case RF90_PATH_A: 185 case RF90_PATH_A:
190 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a; 186 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
191 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, MASKDWORD, 187 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
192 value32); 188 MASKDWORD, value32);
193 value32 = (ele_c & 0x000003C0) >> 6; 189 value32 = (ele_c & 0x000003C0) >> 6;
194 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS, value32); 190 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS,
191 value32);
195 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01; 192 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
196 rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(24), value32); 193 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
194 value32);
197 break; 195 break;
198 case RF90_PATH_B: 196 case RF90_PATH_B:
199 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a; 197 value32 = (ele_d << 22)|((ele_c & 0x3F)<<16) | ele_a;
200 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBAL, 198 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
201 MASKDWORD, value32); 199 value32);
202 value32 = (ele_c & 0x000003C0) >> 6; 200 value32 = (ele_c & 0x000003C0) >> 6;
203 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, value32); 201 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, value32);
204 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01; 202 value32 = ((iqk_result_x * ele_d) >> 7) & 0x01;
205 rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(28), value32); 203 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
204 value32);
206 break; 205 break;
207 default: 206 default:
208 break; 207 break;
@@ -210,16 +209,20 @@ static void rtl88e_set_iqk_matrix(struct ieee80211_hw *hw,
210 } else { 209 } else {
211 switch (rfpath) { 210 switch (rfpath) {
212 case RF90_PATH_A: 211 case RF90_PATH_A:
213 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, MASKDWORD, 212 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
214 ofdmswing_table[ofdm_index]); 213 MASKDWORD, ofdmswing_table[ofdm_index]);
215 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, MASKH4BITS, 0x00); 214 rtl_set_bbreg(hw, ROFDM0_XCTXAFE,
216 rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(24), 0x00); 215 MASKH4BITS, 0x00);
216 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
217 BIT(24), 0x00);
217 break; 218 break;
218 case RF90_PATH_B: 219 case RF90_PATH_B:
219 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBAL, MASKDWORD, 220 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
220 ofdmswing_table[ofdm_index]); 221 MASKDWORD, ofdmswing_table[ofdm_index]);
221 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, MASKH4BITS, 0x00); 222 rtl_set_bbreg(hw, ROFDM0_XDTXAFE,
222 rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(28), 0x00); 223 MASKH4BITS, 0x00);
224 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD,
225 BIT(28), 0x00);
223 break; 226 break;
224 default: 227 default:
225 break; 228 break;
@@ -244,7 +247,7 @@ void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
244 pwr_val = ofdm_base - ofdm_val; 247 pwr_val = ofdm_base - ofdm_val;
245 } else { 248 } else {
246 *pdirection = 2; 249 *pdirection = 2;
247 pwr_val = ofdm_val - ofdm_base; 250 pwr_val = ofdm_base - ofdm_val;
248 } 251 }
249 } else if (type == 1) { 252 } else if (type == 1) {
250 if (cck_val <= cck_base) { 253 if (cck_val <= cck_base) {
@@ -263,46 +266,75 @@ void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
263 (pwr_val << 24); 266 (pwr_val << 24);
264} 267}
265 268
266 269static void dm_tx_pwr_track_set_pwr(struct ieee80211_hw *hw,
267static void rtl88e_chk_tx_track(struct ieee80211_hw *hw, 270 enum pwr_track_control_method method,
268 enum pwr_track_control_method method, 271 u8 rfpath, u8 channel_mapped_index)
269 u8 rfpath, u8 index)
270{ 272{
271 struct rtl_priv *rtlpriv = rtl_priv(hw); 273 struct rtl_priv *rtlpriv = rtl_priv(hw);
272 struct rtl_phy *rtlphy = &(rtlpriv->phy); 274 struct rtl_phy *rtlphy = &rtlpriv->phy;
273 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 275 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
274 int jj = rtldm->swing_idx_cck;
275 int i;
276 276
277 if (method == TXAGC) { 277 if (method == TXAGC) {
278 if (rtldm->swing_flag_ofdm == true || 278 if (rtldm->swing_flag_ofdm ||
279 rtldm->swing_flag_cck == true) { 279 rtldm->swing_flag_cck) {
280 u8 chan = rtlphy->current_channel; 280 rtl88e_phy_set_txpower_level(hw,
281 rtl88e_phy_set_txpower_level(hw, chan); 281 rtlphy->current_channel);
282 rtldm->swing_flag_ofdm = false; 282 rtldm->swing_flag_ofdm = false;
283 rtldm->swing_flag_cck = false; 283 rtldm->swing_flag_cck = false;
284 } 284 }
285 } else if (method == BBSWING) { 285 } else if (method == BBSWING) {
286 if (!rtldm->cck_inch14) { 286 if (!rtldm->cck_inch14) {
287 for (i = 0; i < 8; i++) 287 rtl_write_byte(rtlpriv, 0xa22,
288 rtl_write_byte(rtlpriv, 0xa22 + i, 288 cck_tbl_ch1_13[rtldm->swing_idx_cck][0]);
289 cck_tbl_ch1_13[jj][i]); 289 rtl_write_byte(rtlpriv, 0xa23,
290 cck_tbl_ch1_13[rtldm->swing_idx_cck][1]);
291 rtl_write_byte(rtlpriv, 0xa24,
292 cck_tbl_ch1_13[rtldm->swing_idx_cck][2]);
293 rtl_write_byte(rtlpriv, 0xa25,
294 cck_tbl_ch1_13[rtldm->swing_idx_cck][3]);
295 rtl_write_byte(rtlpriv, 0xa26,
296 cck_tbl_ch1_13[rtldm->swing_idx_cck][4]);
297 rtl_write_byte(rtlpriv, 0xa27,
298 cck_tbl_ch1_13[rtldm->swing_idx_cck][5]);
299 rtl_write_byte(rtlpriv, 0xa28,
300 cck_tbl_ch1_13[rtldm->swing_idx_cck][6]);
301 rtl_write_byte(rtlpriv, 0xa29,
302 cck_tbl_ch1_13[rtldm->swing_idx_cck][7]);
290 } else { 303 } else {
291 for (i = 0; i < 8; i++) 304 rtl_write_byte(rtlpriv, 0xa22,
292 rtl_write_byte(rtlpriv, 0xa22 + i, 305 cck_tbl_ch14[rtldm->swing_idx_cck][0]);
293 cck_tbl_ch14[jj][i]); 306 rtl_write_byte(rtlpriv, 0xa23,
307 cck_tbl_ch14[rtldm->swing_idx_cck][1]);
308 rtl_write_byte(rtlpriv, 0xa24,
309 cck_tbl_ch14[rtldm->swing_idx_cck][2]);
310 rtl_write_byte(rtlpriv, 0xa25,
311 cck_tbl_ch14[rtldm->swing_idx_cck][3]);
312 rtl_write_byte(rtlpriv, 0xa26,
313 cck_tbl_ch14[rtldm->swing_idx_cck][4]);
314 rtl_write_byte(rtlpriv, 0xa27,
315 cck_tbl_ch14[rtldm->swing_idx_cck][5]);
316 rtl_write_byte(rtlpriv, 0xa28,
317 cck_tbl_ch14[rtldm->swing_idx_cck][6]);
318 rtl_write_byte(rtlpriv, 0xa29,
319 cck_tbl_ch14[rtldm->swing_idx_cck][7]);
294 } 320 }
295 321
296 if (rfpath == RF90_PATH_A) { 322 if (rfpath == RF90_PATH_A) {
297 long x = rtlphy->iqk_matrix[index].value[0][0]; 323 rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
298 long y = rtlphy->iqk_matrix[index].value[0][1]; 324 rfpath, rtlphy->iqk_matrix
299 u8 indx = rtldm->swing_idx_ofdm[rfpath]; 325 [channel_mapped_index].
300 rtl88e_set_iqk_matrix(hw, indx, rfpath, x, y); 326 value[0][0],
327 rtlphy->iqk_matrix
328 [channel_mapped_index].
329 value[0][1]);
301 } else if (rfpath == RF90_PATH_B) { 330 } else if (rfpath == RF90_PATH_B) {
302 u8 indx = rtldm->swing_idx_ofdm[rfpath]; 331 rtl88e_set_iqk_matrix(hw, rtldm->swing_idx_ofdm[rfpath],
303 long x = rtlphy->iqk_matrix[indx].value[0][4]; 332 rfpath, rtlphy->iqk_matrix
304 long y = rtlphy->iqk_matrix[indx].value[0][5]; 333 [channel_mapped_index].
305 rtl88e_set_iqk_matrix(hw, indx, rfpath, x, y); 334 value[0][4],
335 rtlphy->iqk_matrix
336 [channel_mapped_index].
337 value[0][5]);
306 } 338 }
307 } else { 339 } else {
308 return; 340 return;
@@ -317,7 +349,7 @@ static void rtl88e_dm_diginit(struct ieee80211_hw *hw)
317 dm_dig->dig_enable_flag = true; 349 dm_dig->dig_enable_flag = true;
318 dm_dig->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f); 350 dm_dig->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
319 dm_dig->pre_igvalue = 0; 351 dm_dig->pre_igvalue = 0;
320 dm_dig->cursta_cstate = DIG_STA_DISCONNECT; 352 dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
321 dm_dig->presta_cstate = DIG_STA_DISCONNECT; 353 dm_dig->presta_cstate = DIG_STA_DISCONNECT;
322 dm_dig->curmultista_cstate = DIG_MULTISTA_DISCONNECT; 354 dm_dig->curmultista_cstate = DIG_MULTISTA_DISCONNECT;
323 dm_dig->rssi_lowthresh = DM_DIG_THRESH_LOW; 355 dm_dig->rssi_lowthresh = DM_DIG_THRESH_LOW;
@@ -348,22 +380,23 @@ static u8 rtl88e_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
348 long rssi_val_min = 0; 380 long rssi_val_min = 0;
349 381
350 if ((dm_dig->curmultista_cstate == DIG_MULTISTA_CONNECT) && 382 if ((dm_dig->curmultista_cstate == DIG_MULTISTA_CONNECT) &&
351 (dm_dig->cursta_cstate == DIG_STA_CONNECT)) { 383 (dm_dig->cur_sta_cstate == DIG_STA_CONNECT)) {
352 if (rtlpriv->dm.entry_min_undec_sm_pwdb != 0) 384 if (rtlpriv->dm.entry_min_undec_sm_pwdb != 0)
353 rssi_val_min = 385 rssi_val_min =
354 (rtlpriv->dm.entry_min_undec_sm_pwdb > 386 (rtlpriv->dm.entry_min_undec_sm_pwdb >
355 rtlpriv->dm.undec_sm_pwdb) ? 387 rtlpriv->dm.undec_sm_pwdb) ?
356 rtlpriv->dm.undec_sm_pwdb : 388 rtlpriv->dm.undec_sm_pwdb :
357 rtlpriv->dm.entry_min_undec_sm_pwdb; 389 rtlpriv->dm.entry_min_undec_sm_pwdb;
358 else 390 else
359 rssi_val_min = rtlpriv->dm.undec_sm_pwdb; 391 rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
360 } else if (dm_dig->cursta_cstate == DIG_STA_CONNECT || 392 } else if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT ||
361 dm_dig->cursta_cstate == DIG_STA_BEFORE_CONNECT) { 393 dm_dig->cur_sta_cstate == DIG_STA_BEFORE_CONNECT) {
362 rssi_val_min = rtlpriv->dm.undec_sm_pwdb; 394 rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
363 } else if (dm_dig->curmultista_cstate == 395 } else if (dm_dig->curmultista_cstate ==
364 DIG_MULTISTA_CONNECT) { 396 DIG_MULTISTA_CONNECT) {
365 rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb; 397 rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
366 } 398 }
399
367 return (u8)rssi_val_min; 400 return (u8)rssi_val_min;
368} 401}
369 402
@@ -371,57 +404,58 @@ static void rtl88e_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
371{ 404{
372 u32 ret_value; 405 u32 ret_value;
373 struct rtl_priv *rtlpriv = rtl_priv(hw); 406 struct rtl_priv *rtlpriv = rtl_priv(hw);
374 struct false_alarm_statistics *alm_cnt = &(rtlpriv->falsealm_cnt); 407 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
375 408
376 rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 1); 409 rtl_set_bbreg(hw, ROFDM0_LSTF, BIT(31), 1);
377 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 1); 410 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(31), 1);
378 411
379 ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD); 412 ret_value = rtl_get_bbreg(hw, ROFDM0_FRAMESYNC, MASKDWORD);
380 alm_cnt->cnt_fast_fsync_fail = (ret_value&0xffff); 413 falsealm_cnt->cnt_fast_fsync_fail = (ret_value&0xffff);
381 alm_cnt->cnt_sb_search_fail = ((ret_value&0xffff0000)>>16); 414 falsealm_cnt->cnt_sb_search_fail = ((ret_value&0xffff0000)>>16);
382 415
383 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER1, MASKDWORD); 416 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER1, MASKDWORD);
384 alm_cnt->cnt_ofdm_cca = (ret_value&0xffff); 417 falsealm_cnt->cnt_ofdm_cca = (ret_value&0xffff);
385 alm_cnt->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16); 418 falsealm_cnt->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16);
386 419
387 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER2, MASKDWORD); 420 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER2, MASKDWORD);
388 alm_cnt->cnt_rate_illegal = (ret_value & 0xffff); 421 falsealm_cnt->cnt_rate_illegal = (ret_value & 0xffff);
389 alm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16); 422 falsealm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);
390 423
391 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD); 424 ret_value = rtl_get_bbreg(hw, ROFDM_PHYCOUNTER3, MASKDWORD);
392 alm_cnt->cnt_mcs_fail = (ret_value & 0xffff); 425 falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
393 alm_cnt->cnt_ofdm_fail = alm_cnt->cnt_parity_fail + 426 falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
394 alm_cnt->cnt_rate_illegal + 427 falsealm_cnt->cnt_rate_illegal +
395 alm_cnt->cnt_crc8_fail + 428 falsealm_cnt->cnt_crc8_fail +
396 alm_cnt->cnt_mcs_fail + 429 falsealm_cnt->cnt_mcs_fail +
397 alm_cnt->cnt_fast_fsync_fail + 430 falsealm_cnt->cnt_fast_fsync_fail +
398 alm_cnt->cnt_sb_search_fail; 431 falsealm_cnt->cnt_sb_search_fail;
399 432
400 ret_value = rtl_get_bbreg(hw, REG_SC_CNT, MASKDWORD); 433 ret_value = rtl_get_bbreg(hw, REG_SC_CNT, MASKDWORD);
401 alm_cnt->cnt_bw_lsc = (ret_value & 0xffff); 434 falsealm_cnt->cnt_bw_lsc = (ret_value & 0xffff);
402 alm_cnt->cnt_bw_usc = ((ret_value & 0xffff0000) >> 16); 435 falsealm_cnt->cnt_bw_usc = ((ret_value & 0xffff0000) >> 16);
403 436
404 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(12), 1); 437 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(12), 1);
405 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1); 438 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(14), 1);
406 439
407 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0); 440 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERLOWER, MASKBYTE0);
408 alm_cnt->cnt_cck_fail = ret_value; 441 falsealm_cnt->cnt_cck_fail = ret_value;
409 442
410 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERUPPER, MASKBYTE3); 443 ret_value = rtl_get_bbreg(hw, RCCK0_FACOUNTERUPPER, MASKBYTE3);
411 alm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8; 444 falsealm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8;
412 445
413 ret_value = rtl_get_bbreg(hw, RCCK0_CCA_CNT, MASKDWORD); 446 ret_value = rtl_get_bbreg(hw, RCCK0_CCA_CNT, MASKDWORD);
414 alm_cnt->cnt_cck_cca = ((ret_value & 0xff) << 8) | 447 falsealm_cnt->cnt_cck_cca = ((ret_value & 0xff) << 8) |
415 ((ret_value&0xFF00)>>8); 448 ((ret_value&0xFF00)>>8);
416 449
417 alm_cnt->cnt_all = alm_cnt->cnt_fast_fsync_fail + 450 falsealm_cnt->cnt_all = (falsealm_cnt->cnt_fast_fsync_fail +
418 alm_cnt->cnt_sb_search_fail + 451 falsealm_cnt->cnt_sb_search_fail +
419 alm_cnt->cnt_parity_fail + 452 falsealm_cnt->cnt_parity_fail +
420 alm_cnt->cnt_rate_illegal + 453 falsealm_cnt->cnt_rate_illegal +
421 alm_cnt->cnt_crc8_fail + 454 falsealm_cnt->cnt_crc8_fail +
422 alm_cnt->cnt_mcs_fail + 455 falsealm_cnt->cnt_mcs_fail +
423 alm_cnt->cnt_cck_fail; 456 falsealm_cnt->cnt_cck_fail);
424 alm_cnt->cnt_cca_all = alm_cnt->cnt_ofdm_cca + alm_cnt->cnt_cck_cca; 457 falsealm_cnt->cnt_cca_all = falsealm_cnt->cnt_ofdm_cca +
458 falsealm_cnt->cnt_cck_cca;
425 459
426 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 1); 460 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 1);
427 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 0); 461 rtl_set_bbreg(hw, ROFDM0_TRSWISOLATION, BIT(31), 0);
@@ -435,16 +469,15 @@ static void rtl88e_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
435 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 2); 469 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, BIT(15)|BIT(14), 2);
436 470
437 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 471 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
438 "cnt_parity_fail = %d, cnt_rate_illegal = %d, " 472 "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
439 "cnt_crc8_fail = %d, cnt_mcs_fail = %d\n", 473 falsealm_cnt->cnt_parity_fail,
440 alm_cnt->cnt_parity_fail, 474 falsealm_cnt->cnt_rate_illegal,
441 alm_cnt->cnt_rate_illegal, 475 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
442 alm_cnt->cnt_crc8_fail, alm_cnt->cnt_mcs_fail);
443 476
444 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 477 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
445 "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n", 478 "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
446 alm_cnt->cnt_ofdm_fail, 479 falsealm_cnt->cnt_ofdm_fail,
447 alm_cnt->cnt_cck_fail, alm_cnt->cnt_all); 480 falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all);
448} 481}
449 482
450static void rtl88e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) 483static void rtl88e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
@@ -453,7 +486,7 @@ static void rtl88e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
453 struct dig_t *dm_dig = &rtlpriv->dm_digtable; 486 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
454 u8 cur_cck_cca_thresh; 487 u8 cur_cck_cca_thresh;
455 488
456 if (dm_dig->cursta_cstate == DIG_STA_CONNECT) { 489 if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
457 dm_dig->rssi_val_min = rtl88e_dm_initial_gain_min_pwdb(hw); 490 dm_dig->rssi_val_min = rtl88e_dm_initial_gain_min_pwdb(hw);
458 if (dm_dig->rssi_val_min > 25) { 491 if (dm_dig->rssi_val_min > 25) {
459 cur_cck_cca_thresh = 0xcd; 492 cur_cck_cca_thresh = 0xcd;
@@ -486,10 +519,10 @@ static void rtl88e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
486static void rtl88e_dm_dig(struct ieee80211_hw *hw) 519static void rtl88e_dm_dig(struct ieee80211_hw *hw)
487{ 520{
488 struct rtl_priv *rtlpriv = rtl_priv(hw); 521 struct rtl_priv *rtlpriv = rtl_priv(hw);
489 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
490 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 522 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
491 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 523 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
492 u8 dig_min, dig_maxofmin; 524 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
525 u8 dig_dynamic_min, dig_maxofmin;
493 bool bfirstconnect; 526 bool bfirstconnect;
494 u8 dm_dig_max, dm_dig_min; 527 u8 dm_dig_max, dm_dig_min;
495 u8 current_igi = dm_dig->cur_igvalue; 528 u8 current_igi = dm_dig->cur_igvalue;
@@ -502,19 +535,19 @@ static void rtl88e_dm_dig(struct ieee80211_hw *hw)
502 return; 535 return;
503 536
504 if (mac->link_state >= MAC80211_LINKED) 537 if (mac->link_state >= MAC80211_LINKED)
505 dm_dig->cursta_cstate = DIG_STA_CONNECT; 538 dm_dig->cur_sta_cstate = DIG_STA_CONNECT;
506 else 539 else
507 dm_dig->cursta_cstate = DIG_STA_DISCONNECT; 540 dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
508 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP || 541 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
509 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC) 542 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
510 dm_dig->cursta_cstate = DIG_STA_DISCONNECT; 543 dm_dig->cur_sta_cstate = DIG_STA_DISCONNECT;
511 544
512 dm_dig_max = DM_DIG_MAX; 545 dm_dig_max = DM_DIG_MAX;
513 dm_dig_min = DM_DIG_MIN; 546 dm_dig_min = DM_DIG_MIN;
514 dig_maxofmin = DM_DIG_MAX_AP; 547 dig_maxofmin = DM_DIG_MAX_AP;
515 dig_min = dm_dig->dig_min_0; 548 dig_dynamic_min = dm_dig->dig_min_0;
516 bfirstconnect = ((mac->link_state >= MAC80211_LINKED) ? true : false) && 549 bfirstconnect = ((mac->link_state >= MAC80211_LINKED) ? true : false) &&
517 (dm_dig->media_connect_0 == false); 550 !dm_dig->media_connect_0;
518 551
519 dm_dig->rssi_val_min = 552 dm_dig->rssi_val_min =
520 rtl88e_dm_initial_gain_min_pwdb(hw); 553 rtl88e_dm_initial_gain_min_pwdb(hw);
@@ -528,18 +561,18 @@ static void rtl88e_dm_dig(struct ieee80211_hw *hw)
528 dm_dig->rx_gain_max = dm_dig->rssi_val_min + 20; 561 dm_dig->rx_gain_max = dm_dig->rssi_val_min + 20;
529 562
530 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) { 563 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
531 dig_min = dm_dig->antdiv_rssi_max; 564 dig_dynamic_min = dm_dig->antdiv_rssi_max;
532 } else { 565 } else {
533 if (dm_dig->rssi_val_min < dm_dig_min) 566 if (dm_dig->rssi_val_min < dm_dig_min)
534 dig_min = dm_dig_min; 567 dig_dynamic_min = dm_dig_min;
535 else if (dm_dig->rssi_val_min < dig_maxofmin) 568 else if (dm_dig->rssi_val_min < dig_maxofmin)
536 dig_min = dig_maxofmin; 569 dig_dynamic_min = dig_maxofmin;
537 else 570 else
538 dig_min = dm_dig->rssi_val_min; 571 dig_dynamic_min = dm_dig->rssi_val_min;
539 } 572 }
540 } else { 573 } else {
541 dm_dig->rx_gain_max = dm_dig_max; 574 dm_dig->rx_gain_max = dm_dig_max;
542 dig_min = dm_dig_min; 575 dig_dynamic_min = dm_dig_min;
543 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n"); 576 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n");
544 } 577 }
545 578
@@ -551,10 +584,13 @@ static void rtl88e_dm_dig(struct ieee80211_hw *hw)
551 } 584 }
552 585
553 if (dm_dig->large_fa_hit >= 3) { 586 if (dm_dig->large_fa_hit >= 3) {
554 if ((dm_dig->forbidden_igi + 1) > dm_dig->rx_gain_max) 587 if ((dm_dig->forbidden_igi + 1) >
555 dm_dig->rx_gain_min = dm_dig->rx_gain_max; 588 dm_dig->rx_gain_max)
589 dm_dig->rx_gain_min =
590 dm_dig->rx_gain_max;
556 else 591 else
557 dm_dig->rx_gain_min = dm_dig->forbidden_igi + 1; 592 dm_dig->rx_gain_min =
593 dm_dig->forbidden_igi + 1;
558 dm_dig->recover_cnt = 3600; 594 dm_dig->recover_cnt = 3600;
559 } 595 }
560 } else { 596 } else {
@@ -562,13 +598,14 @@ static void rtl88e_dm_dig(struct ieee80211_hw *hw)
562 dm_dig->recover_cnt--; 598 dm_dig->recover_cnt--;
563 } else { 599 } else {
564 if (dm_dig->large_fa_hit == 0) { 600 if (dm_dig->large_fa_hit == 0) {
565 if ((dm_dig->forbidden_igi - 1) < dig_min) { 601 if ((dm_dig->forbidden_igi - 1) <
566 dm_dig->forbidden_igi = dig_min; 602 dig_dynamic_min) {
567 dm_dig->rx_gain_min = dig_min; 603 dm_dig->forbidden_igi = dig_dynamic_min;
604 dm_dig->rx_gain_min = dig_dynamic_min;
568 } else { 605 } else {
569 dm_dig->forbidden_igi--; 606 dm_dig->forbidden_igi--;
570 dm_dig->rx_gain_min = 607 dm_dig->rx_gain_min =
571 dm_dig->forbidden_igi + 1; 608 dm_dig->forbidden_igi + 1;
572 } 609 }
573 } else if (dm_dig->large_fa_hit == 3) { 610 } else if (dm_dig->large_fa_hit == 3) {
574 dm_dig->large_fa_hit = 0; 611 dm_dig->large_fa_hit = 0;
@@ -576,7 +613,7 @@ static void rtl88e_dm_dig(struct ieee80211_hw *hw)
576 } 613 }
577 } 614 }
578 615
579 if (dm_dig->cursta_cstate == DIG_STA_CONNECT) { 616 if (dm_dig->cur_sta_cstate == DIG_STA_CONNECT) {
580 if (bfirstconnect) { 617 if (bfirstconnect) {
581 current_igi = dm_dig->rssi_val_min; 618 current_igi = dm_dig->rssi_val_min;
582 } else { 619 } else {
@@ -606,9 +643,9 @@ static void rtl88e_dm_dig(struct ieee80211_hw *hw)
606 643
607 dm_dig->cur_igvalue = current_igi; 644 dm_dig->cur_igvalue = current_igi;
608 rtl88e_dm_write_dig(hw); 645 rtl88e_dm_write_dig(hw);
609 dm_dig->media_connect_0 = ((mac->link_state >= MAC80211_LINKED) ? 646 dm_dig->media_connect_0 =
610 true : false); 647 ((mac->link_state >= MAC80211_LINKED) ? true : false);
611 dm_dig->dig_min_0 = dig_min; 648 dm_dig->dig_min_0 = dig_dynamic_min;
612 649
613 rtl88e_dm_cck_packet_detection_thresh(hw); 650 rtl88e_dm_cck_packet_detection_thresh(hw);
614} 651}
@@ -626,7 +663,7 @@ static void rtl88e_dm_init_dynamic_txpower(struct ieee80211_hw *hw)
626static void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw) 663static void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
627{ 664{
628 struct rtl_priv *rtlpriv = rtl_priv(hw); 665 struct rtl_priv *rtlpriv = rtl_priv(hw);
629 struct rtl_phy *rtlphy = &(rtlpriv->phy); 666 struct rtl_phy *rtlphy = &rtlpriv->phy;
630 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 667 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
631 long undec_sm_pwdb; 668 long undec_sm_pwdb;
632 669
@@ -641,7 +678,7 @@ static void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
641 if ((mac->link_state < MAC80211_LINKED) && 678 if ((mac->link_state < MAC80211_LINKED) &&
642 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) { 679 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
643 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 680 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
644 "Not connected\n"); 681 "Not connected to any\n");
645 682
646 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 683 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
647 684
@@ -664,10 +701,12 @@ static void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
664 undec_sm_pwdb); 701 undec_sm_pwdb);
665 } 702 }
666 } else { 703 } else {
667 undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb; 704 undec_sm_pwdb =
705 rtlpriv->dm.entry_min_undec_sm_pwdb;
668 706
669 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 707 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
670 "AP Ext Port PWDB = 0x%lx\n", undec_sm_pwdb); 708 "AP Ext Port PWDB = 0x%lx\n",
709 undec_sm_pwdb);
671 } 710 }
672 711
673 if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) { 712 if (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL2) {
@@ -676,17 +715,20 @@ static void rtl92c_dm_dynamic_txpower(struct ieee80211_hw *hw)
676 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x0)\n"); 715 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x0)\n");
677 } else if ((undec_sm_pwdb < 716 } else if ((undec_sm_pwdb <
678 (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) && 717 (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
679 (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL1)) { 718 (undec_sm_pwdb >=
719 TX_POWER_NEAR_FIELD_THRESH_LVL1)) {
680 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; 720 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
681 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 721 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
682 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x10)\n"); 722 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr = 0x10)\n");
683 } else if (undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) { 723 } else if (undec_sm_pwdb <
724 (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
684 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 725 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
685 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 726 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
686 "TXHIGHPWRLEVEL_NORMAL\n"); 727 "TXHIGHPWRLEVEL_NORMAL\n");
687 } 728 }
688 729
689 if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) { 730 if ((rtlpriv->dm.dynamic_txhighpower_lvl !=
731 rtlpriv->dm.last_dtp_lvl)) {
690 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 732 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
691 "PHY_SetTxPowerLevel8192S() Channel = %d\n", 733 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
692 rtlphy->current_channel); 734 rtlphy->current_channel);
@@ -702,10 +744,9 @@ void rtl88e_dm_write_dig(struct ieee80211_hw *hw)
702 struct dig_t *dm_dig = &rtlpriv->dm_digtable; 744 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
703 745
704 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 746 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
705 "cur_igvalue = 0x%x, " 747 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, backoff_val = %d\n",
706 "pre_igvalue = 0x%x, back_val = %d\n", 748 dm_dig->cur_igvalue, dm_dig->pre_igvalue,
707 dm_dig->cur_igvalue, dm_dig->pre_igvalue, 749 dm_dig->back_val);
708 dm_dig->back_val);
709 750
710 if (dm_dig->cur_igvalue > 0x3f) 751 if (dm_dig->cur_igvalue > 0x3f)
711 dm_dig->cur_igvalue = 0x3f; 752 dm_dig->cur_igvalue = 0x3f;
@@ -722,17 +763,19 @@ static void rtl88e_dm_pwdb_monitor(struct ieee80211_hw *hw)
722 struct rtl_priv *rtlpriv = rtl_priv(hw); 763 struct rtl_priv *rtlpriv = rtl_priv(hw);
723 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 764 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
724 struct rtl_sta_info *drv_priv; 765 struct rtl_sta_info *drv_priv;
725 static u64 last_txok; 766 static u64 last_record_txok_cnt;
726 static u64 last_rx; 767 static u64 last_record_rxok_cnt;
727 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff; 768 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff;
728 769
729 if (rtlhal->oem_id == RT_CID_819X_HP) { 770 if (rtlhal->oem_id == RT_CID_819X_HP) {
730 u64 cur_txok_cnt = 0; 771 u64 cur_txok_cnt = 0;
731 u64 cur_rxok_cnt = 0; 772 u64 cur_rxok_cnt = 0;
732 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok; 773 cur_txok_cnt = rtlpriv->stats.txbytesunicast -
733 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rx; 774 last_record_txok_cnt;
734 last_txok = cur_txok_cnt; 775 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast -
735 last_rx = cur_rxok_cnt; 776 last_record_rxok_cnt;
777 last_record_txok_cnt = cur_txok_cnt;
778 last_record_rxok_cnt = cur_rxok_cnt;
736 779
737 if (cur_rxok_cnt > (cur_txok_cnt * 6)) 780 if (cur_rxok_cnt > (cur_txok_cnt * 6))
738 rtl_write_dword(rtlpriv, REG_ARFR0, 0x8f015); 781 rtl_write_dword(rtlpriv, REG_ARFR0, 0x8f015);
@@ -743,9 +786,11 @@ static void rtl88e_dm_pwdb_monitor(struct ieee80211_hw *hw)
743 /* AP & ADHOC & MESH */ 786 /* AP & ADHOC & MESH */
744 spin_lock_bh(&rtlpriv->locks.entry_list_lock); 787 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
745 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) { 788 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
746 if (drv_priv->rssi_stat.undec_sm_pwdb < tmp_entry_min_pwdb) 789 if (drv_priv->rssi_stat.undec_sm_pwdb <
790 tmp_entry_min_pwdb)
747 tmp_entry_min_pwdb = drv_priv->rssi_stat.undec_sm_pwdb; 791 tmp_entry_min_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
748 if (drv_priv->rssi_stat.undec_sm_pwdb > tmp_entry_max_pwdb) 792 if (drv_priv->rssi_stat.undec_sm_pwdb >
793 tmp_entry_max_pwdb)
749 tmp_entry_max_pwdb = drv_priv->rssi_stat.undec_sm_pwdb; 794 tmp_entry_max_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
750 } 795 }
751 spin_unlock_bh(&rtlpriv->locks.entry_list_lock); 796 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
@@ -762,13 +807,19 @@ static void rtl88e_dm_pwdb_monitor(struct ieee80211_hw *hw)
762 if (tmp_entry_min_pwdb != 0xff) { 807 if (tmp_entry_min_pwdb != 0xff) {
763 rtlpriv->dm.entry_min_undec_sm_pwdb = tmp_entry_min_pwdb; 808 rtlpriv->dm.entry_min_undec_sm_pwdb = tmp_entry_min_pwdb;
764 RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMinPWDB = 0x%lx(%ld)\n", 809 RTPRINT(rtlpriv, FDM, DM_PWDB, "EntryMinPWDB = 0x%lx(%ld)\n",
765 tmp_entry_min_pwdb, tmp_entry_min_pwdb); 810 tmp_entry_min_pwdb, tmp_entry_min_pwdb);
766 } else { 811 } else {
767 rtlpriv->dm.entry_min_undec_sm_pwdb = 0; 812 rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
768 } 813 }
769 /* Indicate Rx signal strength to FW. */ 814 /* Indicate Rx signal strength to FW. */
770 if (!rtlpriv->dm.useramask) 815 if (rtlpriv->dm.useramask) {
816 u8 h2c_parameter[3] = { 0 };
817
818 h2c_parameter[2] = (u8)(rtlpriv->dm.undec_sm_pwdb & 0xFF);
819 h2c_parameter[0] = 0x20;
820 } else {
771 rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb); 821 rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb);
822 }
772} 823}
773 824
774void rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw) 825void rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw)
@@ -783,7 +834,6 @@ void rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw)
783static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw) 834static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw)
784{ 835{
785 struct rtl_priv *rtlpriv = rtl_priv(hw); 836 struct rtl_priv *rtlpriv = rtl_priv(hw);
786 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
787 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 837 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
788 static u64 last_txok_cnt; 838 static u64 last_txok_cnt;
789 static u64 last_rxok_cnt; 839 static u64 last_rxok_cnt;
@@ -793,40 +843,33 @@ static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw)
793 u64 cur_rxok_cnt = 0; 843 u64 cur_rxok_cnt = 0;
794 u32 edca_be_ul = 0x5ea42b; 844 u32 edca_be_ul = 0x5ea42b;
795 u32 edca_be_dl = 0x5ea42b; 845 u32 edca_be_dl = 0x5ea42b;
796 bool change_edca = false; 846 bool bt_change_edca = false;
797 847
798 if ((last_bt_edca_ul != rtlpcipriv->bt_coexist.bt_edca_ul) || 848 if ((last_bt_edca_ul != rtlpriv->btcoexist.bt_edca_ul) ||
799 (last_bt_edca_dl != rtlpcipriv->bt_coexist.bt_edca_dl)) { 849 (last_bt_edca_dl != rtlpriv->btcoexist.bt_edca_dl)) {
800 rtlpriv->dm.current_turbo_edca = false; 850 rtlpriv->dm.current_turbo_edca = false;
801 last_bt_edca_ul = rtlpcipriv->bt_coexist.bt_edca_ul; 851 last_bt_edca_ul = rtlpriv->btcoexist.bt_edca_ul;
802 last_bt_edca_dl = rtlpcipriv->bt_coexist.bt_edca_dl; 852 last_bt_edca_dl = rtlpriv->btcoexist.bt_edca_dl;
803 } 853 }
804 854
805 if (rtlpcipriv->bt_coexist.bt_edca_ul != 0) { 855 if (rtlpriv->btcoexist.bt_edca_ul != 0) {
806 edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_ul; 856 edca_be_ul = rtlpriv->btcoexist.bt_edca_ul;
807 change_edca = true; 857 bt_change_edca = true;
808 } 858 }
809 859
810 if (rtlpcipriv->bt_coexist.bt_edca_dl != 0) { 860 if (rtlpriv->btcoexist.bt_edca_dl != 0) {
811 edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_dl; 861 edca_be_ul = rtlpriv->btcoexist.bt_edca_dl;
812 change_edca = true; 862 bt_change_edca = true;
813 } 863 }
814 864
815 if (mac->link_state != MAC80211_LINKED) { 865 if (mac->link_state != MAC80211_LINKED) {
816 rtlpriv->dm.current_turbo_edca = false; 866 rtlpriv->dm.current_turbo_edca = false;
817 return; 867 return;
818 } 868 }
869 if ((bt_change_edca) ||
870 ((!rtlpriv->dm.is_any_nonbepkts) &&
871 (!rtlpriv->dm.disable_framebursting))) {
819 872
820 if ((!mac->ht_enable) && (!rtlpcipriv->bt_coexist.bt_coexistence)) {
821 if (!(edca_be_ul & 0xffff0000))
822 edca_be_ul |= 0x005e0000;
823
824 if (!(edca_be_dl & 0xffff0000))
825 edca_be_dl |= 0x005e0000;
826 }
827
828 if ((change_edca) || ((!rtlpriv->dm.is_any_nonbepkts) &&
829 (!rtlpriv->dm.disable_framebursting))) {
830 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt; 873 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
831 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt; 874 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
832 875
@@ -851,7 +894,9 @@ static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw)
851 } else { 894 } else {
852 if (rtlpriv->dm.current_turbo_edca) { 895 if (rtlpriv->dm.current_turbo_edca) {
853 u8 tmp = AC0_BE; 896 u8 tmp = AC0_BE;
854 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, 897
898 rtlpriv->cfg->ops->set_hw_reg(hw,
899 HW_VAR_AC_PARAM,
855 &tmp); 900 &tmp);
856 rtlpriv->dm.current_turbo_edca = false; 901 rtlpriv->dm.current_turbo_edca = false;
857 } 902 }
@@ -862,29 +907,29 @@ static void rtl88e_dm_check_edca_turbo(struct ieee80211_hw *hw)
862 last_rxok_cnt = rtlpriv->stats.rxbytesunicast; 907 last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
863} 908}
864 909
865static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw 910static void dm_txpower_track_cb_therm(struct ieee80211_hw *hw)
866 *hw)
867{ 911{
868 struct rtl_priv *rtlpriv = rtl_priv(hw); 912 struct rtl_priv *rtlpriv = rtl_priv(hw);
869 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 913 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
870 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 914 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
871 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 915 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
872 u8 thermalvalue = 0, delta, delta_lck, delta_iqk, off; 916 u8 thermalvalue = 0, delta, delta_lck, delta_iqk, offset;
873 u8 th_avg_cnt = 0; 917 u8 thermalvalue_avg_count = 0;
874 u32 thermalvalue_avg = 0; 918 u32 thermalvalue_avg = 0;
875 long ele_d, temp_cck; 919 long ele_d, temp_cck;
876 char ofdm_index[2], cck_index = 0, ofdm_old[2] = {0, 0}, cck_old = 0; 920 char ofdm_index[2], cck_index = 0,
921 ofdm_index_old[2] = {0, 0}, cck_index_old = 0;
877 int i = 0; 922 int i = 0;
878 bool is2t = false; 923 /*bool is2t = false;*/
879 924
880 u8 ofdm_min_index = 6, rf = (is2t) ? 2 : 1; 925 u8 ofdm_min_index = 6, rf = 1;
881 u8 index_for_channel; 926 /*u8 index_for_channel;*/
882 enum _dec_inc {dec, power_inc}; 927 enum _power_dec_inc {power_dec, power_inc};
883 928
884 /* 0.1 the following TWO tables decide the final index of 929 /*0.1 the following TWO tables decide the
885 * OFDM/CCK swing table 930 *final index of OFDM/CCK swing table
886 */ 931 */
887 char del_tbl_idx[2][15] = { 932 char delta_swing_table_idx[2][15] = {
888 {0, 0, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11}, 933 {0, 0, 2, 3, 4, 4, 5, 6, 7, 7, 8, 9, 10, 10, 11},
889 {0, 0, -1, -2, -3, -4, -4, -4, -4, -5, -7, -8, -9, -9, -10} 934 {0, 0, -1, -2, -3, -4, -4, -4, -4, -5, -7, -8, -9, -9, -10}
890 }; 935 };
@@ -896,9 +941,10 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
896 /*Initilization (7 steps in total) */ 941 /*Initilization (7 steps in total) */
897 rtlpriv->dm.txpower_trackinginit = true; 942 rtlpriv->dm.txpower_trackinginit = true;
898 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 943 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
899 "rtl88e_dm_txpower_tracking_callback_thermalmeter\n"); 944 "dm_txpower_track_cb_therm\n");
900 945
901 thermalvalue = (u8) rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0xfc00); 946 thermalvalue = (u8)rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER,
947 0xfc00);
902 if (!thermalvalue) 948 if (!thermalvalue)
903 return; 949 return;
904 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 950 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
@@ -907,55 +953,44 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
907 rtlefuse->eeprom_thermalmeter); 953 rtlefuse->eeprom_thermalmeter);
908 954
909 /*1. Query OFDM Default Setting: Path A*/ 955 /*1. Query OFDM Default Setting: Path A*/
910 ele_d = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBAL, MASKDWORD) & MASKOFDM_D; 956 ele_d = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD) &
957 MASKOFDM_D;
911 for (i = 0; i < OFDM_TABLE_LENGTH; i++) { 958 for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
912 if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) { 959 if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
913 ofdm_old[0] = (u8) i; 960 ofdm_index_old[0] = (u8)i;
914 rtldm->swing_idx_ofdm_base[0] = (u8)i; 961 rtldm->swing_idx_ofdm_base[RF90_PATH_A] = (u8)i;
915 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 962 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
916 "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index = 0x%x\n", 963 "Initial pathA ele_d reg0x%x = 0x%lx, ofdm_index = 0x%x\n",
917 ROFDM0_XATXIQIMBAL, 964 ROFDM0_XATXIQIMBALANCE,
918 ele_d, ofdm_old[0]); 965 ele_d, ofdm_index_old[0]);
919 break; 966 break;
920 } 967 }
921 } 968 }
922 969
923 if (is2t) {
924 ele_d = rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBAL,
925 MASKDWORD) & MASKOFDM_D;
926 for (i = 0; i < OFDM_TABLE_LENGTH; i++) {
927 if (ele_d == (ofdmswing_table[i] & MASKOFDM_D)) {
928 ofdm_old[1] = (u8)i;
929
930 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
931 DBG_LOUD,
932 "Initial pathB ele_d reg0x%x = 0x%lx, ofdm_index = 0x%x\n",
933 ROFDM0_XBTXIQIMBAL, ele_d,
934 ofdm_old[1]);
935 break;
936 }
937 }
938 }
939 /*2.Query CCK default setting From 0xa24*/ 970 /*2.Query CCK default setting From 0xa24*/
940 temp_cck = rtl_get_bbreg(hw, RCCK0_TXFILTER2, MASKDWORD) & MASKCCK; 971 temp_cck = rtl_get_bbreg(hw, RCCK0_TXFILTER2, MASKDWORD) & MASKCCK;
941 for (i = 0; i < CCK_TABLE_LENGTH; i++) { 972 for (i = 0; i < CCK_TABLE_LENGTH; i++) {
942 if (rtlpriv->dm.cck_inch14) { 973 if (rtlpriv->dm.cck_inch14) {
943 if (memcmp(&temp_cck, &cck_tbl_ch14[i][2], 4) == 0) { 974 if (memcmp(&temp_cck, &cck_tbl_ch14[i][2], 4) == 0) {
944 cck_old = (u8)i; 975 cck_index_old = (u8)i;
945 rtldm->swing_idx_cck_base = (u8)i; 976 rtldm->swing_idx_cck_base = (u8)i;
946 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 977 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
978 DBG_LOUD,
947 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch 14 %d\n", 979 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch 14 %d\n",
948 RCCK0_TXFILTER2, temp_cck, cck_old, 980 RCCK0_TXFILTER2, temp_cck,
981 cck_index_old,
949 rtlpriv->dm.cck_inch14); 982 rtlpriv->dm.cck_inch14);
950 break; 983 break;
951 } 984 }
952 } else { 985 } else {
953 if (memcmp(&temp_cck, &cck_tbl_ch1_13[i][2], 4) == 0) { 986 if (memcmp(&temp_cck, &cck_tbl_ch1_13[i][2], 4) == 0) {
954 cck_old = (u8)i; 987 cck_index_old = (u8)i;
955 rtldm->swing_idx_cck_base = (u8)i; 988 rtldm->swing_idx_cck_base = (u8)i;
956 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 989 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
990 DBG_LOUD,
957 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n", 991 "Initial reg0x%x = 0x%lx, cck_index = 0x%x, ch14 %d\n",
958 RCCK0_TXFILTER2, temp_cck, cck_old, 992 RCCK0_TXFILTER2, temp_cck,
993 cck_index_old,
959 rtlpriv->dm.cck_inch14); 994 rtlpriv->dm.cck_inch14);
960 break; 995 break;
961 } 996 }
@@ -968,8 +1003,8 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
968 rtlpriv->dm.thermalvalue_lck = thermalvalue; 1003 rtlpriv->dm.thermalvalue_lck = thermalvalue;
969 rtlpriv->dm.thermalvalue_iqk = thermalvalue; 1004 rtlpriv->dm.thermalvalue_iqk = thermalvalue;
970 for (i = 0; i < rf; i++) 1005 for (i = 0; i < rf; i++)
971 rtlpriv->dm.ofdm_index[i] = ofdm_old[i]; 1006 rtlpriv->dm.ofdm_index[i] = ofdm_index_old[i];
972 rtlpriv->dm.cck_index = cck_old; 1007 rtlpriv->dm.cck_index = cck_index_old;
973 } 1008 }
974 1009
975 /*4 Calculate average thermal meter*/ 1010 /*4 Calculate average thermal meter*/
@@ -981,12 +1016,12 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
981 for (i = 0; i < AVG_THERMAL_NUM_88E; i++) { 1016 for (i = 0; i < AVG_THERMAL_NUM_88E; i++) {
982 if (rtldm->thermalvalue_avg[i]) { 1017 if (rtldm->thermalvalue_avg[i]) {
983 thermalvalue_avg += rtldm->thermalvalue_avg[i]; 1018 thermalvalue_avg += rtldm->thermalvalue_avg[i];
984 th_avg_cnt++; 1019 thermalvalue_avg_count++;
985 } 1020 }
986 } 1021 }
987 1022
988 if (th_avg_cnt) 1023 if (thermalvalue_avg_count)
989 thermalvalue = (u8)(thermalvalue_avg / th_avg_cnt); 1024 thermalvalue = (u8)(thermalvalue_avg / thermalvalue_avg_count);
990 1025
991 /* 5 Calculate delta, delta_LCK, delta_IQK.*/ 1026 /* 5 Calculate delta, delta_LCK, delta_IQK.*/
992 if (rtlhal->reloadtxpowerindex) { 1027 if (rtlhal->reloadtxpowerindex) {
@@ -997,24 +1032,22 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
997 rtlpriv->dm.done_txpower = false; 1032 rtlpriv->dm.done_txpower = false;
998 } else if (rtlpriv->dm.done_txpower) { 1033 } else if (rtlpriv->dm.done_txpower) {
999 delta = (thermalvalue > rtlpriv->dm.thermalvalue) ? 1034 delta = (thermalvalue > rtlpriv->dm.thermalvalue) ?
1000 (thermalvalue - rtlpriv->dm.thermalvalue) : 1035 (thermalvalue - rtlpriv->dm.thermalvalue) :
1001 (rtlpriv->dm.thermalvalue - thermalvalue); 1036 (rtlpriv->dm.thermalvalue - thermalvalue);
1002 } else { 1037 } else {
1003 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ? 1038 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
1004 (thermalvalue - rtlefuse->eeprom_thermalmeter) : 1039 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
1005 (rtlefuse->eeprom_thermalmeter - thermalvalue); 1040 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1006 } 1041 }
1007 delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ? 1042 delta_lck = (thermalvalue > rtlpriv->dm.thermalvalue_lck) ?
1008 (thermalvalue - rtlpriv->dm.thermalvalue_lck) : 1043 (thermalvalue - rtlpriv->dm.thermalvalue_lck) :
1009 (rtlpriv->dm.thermalvalue_lck - thermalvalue); 1044 (rtlpriv->dm.thermalvalue_lck - thermalvalue);
1010 delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ? 1045 delta_iqk = (thermalvalue > rtlpriv->dm.thermalvalue_iqk) ?
1011 (thermalvalue - rtlpriv->dm.thermalvalue_iqk) : 1046 (thermalvalue - rtlpriv->dm.thermalvalue_iqk) :
1012 (rtlpriv->dm.thermalvalue_iqk - thermalvalue); 1047 (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
1013 1048
1014 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 1049 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1015 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x " 1050 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
1016 "eeprom_thermalmeter 0x%x delta 0x%x "
1017 "delta_lck 0x%x delta_iqk 0x%x\n",
1018 thermalvalue, rtlpriv->dm.thermalvalue, 1051 thermalvalue, rtlpriv->dm.thermalvalue,
1019 rtlefuse->eeprom_thermalmeter, delta, delta_lck, 1052 rtlefuse->eeprom_thermalmeter, delta, delta_lck,
1020 delta_iqk); 1053 delta_iqk);
@@ -1024,28 +1057,35 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
1024 rtl88e_phy_lc_calibrate(hw); 1057 rtl88e_phy_lc_calibrate(hw);
1025 } 1058 }
1026 1059
1027 /* 7 If necessary, move the index of swing table to adjust Tx power. */ 1060 /* 7 If necessary, move the index of
1061 * swing table to adjust Tx power.
1062 */
1028 if (delta > 0 && rtlpriv->dm.txpower_track_control) { 1063 if (delta > 0 && rtlpriv->dm.txpower_track_control) {
1029 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ? 1064 delta = (thermalvalue > rtlefuse->eeprom_thermalmeter) ?
1030 (thermalvalue - rtlefuse->eeprom_thermalmeter) : 1065 (thermalvalue - rtlefuse->eeprom_thermalmeter) :
1031 (rtlefuse->eeprom_thermalmeter - thermalvalue); 1066 (rtlefuse->eeprom_thermalmeter - thermalvalue);
1032 1067
1033 /* 7.1 Get the final CCK_index and OFDM_index for each 1068 /* 7.1 Get the final CCK_index and OFDM_index for each
1034 * swing table. 1069 * swing table.
1035 */ 1070 */
1036 if (thermalvalue > rtlefuse->eeprom_thermalmeter) { 1071 if (thermalvalue > rtlefuse->eeprom_thermalmeter) {
1037 CAL_SWING_OFF(off, power_inc, IDX_MAP, delta); 1072 CAL_SWING_OFF(offset, power_inc, INDEX_MAPPING_NUM,
1073 delta);
1038 for (i = 0; i < rf; i++) 1074 for (i = 0; i < rf; i++)
1039 ofdm_index[i] = rtldm->ofdm_index[i] + 1075 ofdm_index[i] =
1040 del_tbl_idx[power_inc][off]; 1076 rtldm->ofdm_index[i] +
1077 delta_swing_table_idx[power_inc][offset];
1041 cck_index = rtldm->cck_index + 1078 cck_index = rtldm->cck_index +
1042 del_tbl_idx[power_inc][off]; 1079 delta_swing_table_idx[power_inc][offset];
1043 } else { 1080 } else {
1044 CAL_SWING_OFF(off, dec, IDX_MAP, delta); 1081 CAL_SWING_OFF(offset, power_dec, INDEX_MAPPING_NUM,
1082 delta);
1045 for (i = 0; i < rf; i++) 1083 for (i = 0; i < rf; i++)
1046 ofdm_index[i] = rtldm->ofdm_index[i] + 1084 ofdm_index[i] =
1047 del_tbl_idx[dec][off]; 1085 rtldm->ofdm_index[i] +
1048 cck_index = rtldm->cck_index + del_tbl_idx[dec][off]; 1086 delta_swing_table_idx[power_dec][offset];
1087 cck_index = rtldm->cck_index +
1088 delta_swing_table_idx[power_dec][offset];
1049 } 1089 }
1050 1090
1051 /* 7.2 Handle boundary conditions of index.*/ 1091 /* 7.2 Handle boundary conditions of index.*/
@@ -1056,8 +1096,8 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
1056 ofdm_index[i] = ofdm_min_index; 1096 ofdm_index[i] = ofdm_min_index;
1057 } 1097 }
1058 1098
1059 if (cck_index > CCK_TABLE_SIZE - 1) 1099 if (cck_index > CCK_TABLE_SIZE-1)
1060 cck_index = CCK_TABLE_SIZE - 1; 1100 cck_index = CCK_TABLE_SIZE-1;
1061 else if (cck_index < 0) 1101 else if (cck_index < 0)
1062 cck_index = 0; 1102 cck_index = 0;
1063 1103
@@ -1065,10 +1105,7 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
1065 if (rtlpriv->dm.txpower_track_control) { 1105 if (rtlpriv->dm.txpower_track_control) {
1066 rtldm->done_txpower = true; 1106 rtldm->done_txpower = true;
1067 rtldm->swing_idx_ofdm[RF90_PATH_A] = 1107 rtldm->swing_idx_ofdm[RF90_PATH_A] =
1068 (u8)ofdm_index[RF90_PATH_A]; 1108 (u8)ofdm_index[RF90_PATH_A];
1069 if (is2t)
1070 rtldm->swing_idx_ofdm[RF90_PATH_B] =
1071 (u8)ofdm_index[RF90_PATH_B];
1072 rtldm->swing_idx_cck = cck_index; 1109 rtldm->swing_idx_cck = cck_index;
1073 if (rtldm->swing_idx_ofdm_cur != 1110 if (rtldm->swing_idx_ofdm_cur !=
1074 rtldm->swing_idx_ofdm[0]) { 1111 rtldm->swing_idx_ofdm[0]) {
@@ -1082,12 +1119,7 @@ static void rtl88e_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw
1082 rtldm->swing_flag_cck = true; 1119 rtldm->swing_flag_cck = true;
1083 } 1120 }
1084 1121
1085 rtl88e_chk_tx_track(hw, TXAGC, 0, 0); 1122 dm_tx_pwr_track_set_pwr(hw, TXAGC, 0, 0);
1086
1087 if (is2t)
1088 rtl88e_chk_tx_track(hw, BBSWING,
1089 RF90_PATH_B,
1090 index_for_channel);
1091 } 1123 }
1092 } 1124 }
1093 1125
@@ -1115,7 +1147,7 @@ static void rtl88e_dm_init_txpower_tracking(struct ieee80211_hw *hw)
1115 rtlpriv->dm.swing_idx_ofdm_cur = 12; 1147 rtlpriv->dm.swing_idx_ofdm_cur = 12;
1116 rtlpriv->dm.swing_flag_ofdm = false; 1148 rtlpriv->dm.swing_flag_ofdm = false;
1117 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 1149 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1118 " rtlpriv->dm.txpower_tracking = %d\n", 1150 "rtlpriv->dm.txpower_tracking = %d\n",
1119 rtlpriv->dm.txpower_tracking); 1151 rtlpriv->dm.txpower_tracking);
1120} 1152}
1121 1153
@@ -1137,7 +1169,7 @@ void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw)
1137 } else { 1169 } else {
1138 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 1170 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1139 "Schedule TxPowerTracking !!\n"); 1171 "Schedule TxPowerTracking !!\n");
1140 rtl88e_dm_txpower_tracking_callback_thermalmeter(hw); 1172 dm_txpower_track_cb_therm(hw);
1141 tm_trigger = 0; 1173 tm_trigger = 0;
1142 } 1174 }
1143} 1175}
@@ -1145,7 +1177,7 @@ void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw)
1145void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw) 1177void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
1146{ 1178{
1147 struct rtl_priv *rtlpriv = rtl_priv(hw); 1179 struct rtl_priv *rtlpriv = rtl_priv(hw);
1148 struct rate_adaptive *p_ra = &(rtlpriv->ra); 1180 struct rate_adaptive *p_ra = &rtlpriv->ra;
1149 1181
1150 p_ra->ratr_state = DM_RATR_STA_INIT; 1182 p_ra->ratr_state = DM_RATR_STA_INIT;
1151 p_ra->pre_ratr_state = DM_RATR_STA_INIT; 1183 p_ra->pre_ratr_state = DM_RATR_STA_INIT;
@@ -1161,9 +1193,9 @@ static void rtl88e_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1161 struct rtl_priv *rtlpriv = rtl_priv(hw); 1193 struct rtl_priv *rtlpriv = rtl_priv(hw);
1162 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1194 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1163 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1195 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1164 struct rate_adaptive *p_ra = &(rtlpriv->ra); 1196 struct rate_adaptive *p_ra = &rtlpriv->ra;
1197 u32 low_rssithresh_for_ra, high_rssithresh_for_ra;
1165 struct ieee80211_sta *sta = NULL; 1198 struct ieee80211_sta *sta = NULL;
1166 u32 low_rssi, hi_rssi;
1167 1199
1168 if (is_hal_stop(rtlhal)) { 1200 if (is_hal_stop(rtlhal)) {
1169 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1201 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
@@ -1181,26 +1213,28 @@ static void rtl88e_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1181 mac->opmode == NL80211_IFTYPE_STATION) { 1213 mac->opmode == NL80211_IFTYPE_STATION) {
1182 switch (p_ra->pre_ratr_state) { 1214 switch (p_ra->pre_ratr_state) {
1183 case DM_RATR_STA_HIGH: 1215 case DM_RATR_STA_HIGH:
1184 hi_rssi = 50; 1216 high_rssithresh_for_ra = 50;
1185 low_rssi = 20; 1217 low_rssithresh_for_ra = 20;
1186 break; 1218 break;
1187 case DM_RATR_STA_MIDDLE: 1219 case DM_RATR_STA_MIDDLE:
1188 hi_rssi = 55; 1220 high_rssithresh_for_ra = 55;
1189 low_rssi = 20; 1221 low_rssithresh_for_ra = 20;
1190 break; 1222 break;
1191 case DM_RATR_STA_LOW: 1223 case DM_RATR_STA_LOW:
1192 hi_rssi = 50; 1224 high_rssithresh_for_ra = 50;
1193 low_rssi = 25; 1225 low_rssithresh_for_ra = 25;
1194 break; 1226 break;
1195 default: 1227 default:
1196 hi_rssi = 50; 1228 high_rssithresh_for_ra = 50;
1197 low_rssi = 20; 1229 low_rssithresh_for_ra = 20;
1198 break; 1230 break;
1199 } 1231 }
1200 1232
1201 if (rtlpriv->dm.undec_sm_pwdb > (long)hi_rssi) 1233 if (rtlpriv->dm.undec_sm_pwdb >
1234 (long)high_rssithresh_for_ra)
1202 p_ra->ratr_state = DM_RATR_STA_HIGH; 1235 p_ra->ratr_state = DM_RATR_STA_HIGH;
1203 else if (rtlpriv->dm.undec_sm_pwdb > (long)low_rssi) 1236 else if (rtlpriv->dm.undec_sm_pwdb >
1237 (long)low_rssithresh_for_ra)
1204 p_ra->ratr_state = DM_RATR_STA_MIDDLE; 1238 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
1205 else 1239 else
1206 p_ra->ratr_state = DM_RATR_STA_LOW; 1240 p_ra->ratr_state = DM_RATR_STA_LOW;
@@ -1208,7 +1242,7 @@ static void rtl88e_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1208 if (p_ra->pre_ratr_state != p_ra->ratr_state) { 1242 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
1209 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1243 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1210 "RSSI = %ld\n", 1244 "RSSI = %ld\n",
1211 rtlpriv->dm.undec_sm_pwdb); 1245 rtlpriv->dm.undec_sm_pwdb);
1212 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1246 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1213 "RSSI_LEVEL = %d\n", p_ra->ratr_state); 1247 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
1214 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1248 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
@@ -1219,7 +1253,7 @@ static void rtl88e_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1219 sta = rtl_find_sta(hw, mac->bssid); 1253 sta = rtl_find_sta(hw, mac->bssid);
1220 if (sta) 1254 if (sta)
1221 rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 1255 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
1222 p_ra->ratr_state); 1256 p_ra->ratr_state);
1223 rcu_read_unlock(); 1257 rcu_read_unlock();
1224 1258
1225 p_ra->pre_ratr_state = p_ra->ratr_state; 1259 p_ra->pre_ratr_state = p_ra->ratr_state;
@@ -1239,56 +1273,62 @@ static void rtl92c_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
1239 dm_pstable->rssi_val_min = 0; 1273 dm_pstable->rssi_val_min = 0;
1240} 1274}
1241 1275
1242static void rtl88e_dm_update_rx_idle_ant(struct ieee80211_hw *hw, u8 ant) 1276static void rtl88e_dm_update_rx_idle_ant(struct ieee80211_hw *hw,
1277 u8 ant)
1243{ 1278{
1244 struct rtl_priv *rtlpriv = rtl_priv(hw); 1279 struct rtl_priv *rtlpriv = rtl_priv(hw);
1245 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1280 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1246 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1281 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1247 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1282 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1248 u32 def_ant, opt_ant; 1283 u32 default_ant, optional_ant;
1249 1284
1250 if (fat_tbl->rx_idle_ant != ant) { 1285 if (pfat_table->rx_idle_ant != ant) {
1251 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1286 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1252 "need to update rx idle ant\n"); 1287 "need to update rx idle ant\n");
1253 if (ant == MAIN_ANT) { 1288 if (ant == MAIN_ANT) {
1254 def_ant = (fat_tbl->rx_idle_ant == CG_TRX_HW_ANTDIV) ? 1289 default_ant =
1255 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX; 1290 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1256 opt_ant = (fat_tbl->rx_idle_ant == CG_TRX_HW_ANTDIV) ? 1291 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
1257 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX; 1292 optional_ant =
1293 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1294 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
1258 } else { 1295 } else {
1259 def_ant = (fat_tbl->rx_idle_ant == CG_TRX_HW_ANTDIV) ? 1296 default_ant =
1260 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX; 1297 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1261 opt_ant = (fat_tbl->rx_idle_ant == CG_TRX_HW_ANTDIV) ? 1298 AUX_ANT_CG_TRX : AUX_ANT_CGCS_RX;
1262 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX; 1299 optional_ant =
1300 (pfat_table->rx_idle_ant == CG_TRX_HW_ANTDIV) ?
1301 MAIN_ANT_CG_TRX : MAIN_ANT_CGCS_RX;
1263 } 1302 }
1264 1303
1265 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) { 1304 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
1266 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(5) | 1305 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1267 BIT(4) | BIT(3), def_ant); 1306 BIT(5) | BIT(4) | BIT(3), default_ant);
1268 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) | 1307 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1269 BIT(7) | BIT(6), opt_ant); 1308 BIT(8) | BIT(7) | BIT(6), optional_ant);
1270 rtl_set_bbreg(hw, DM_REG_ANTSEL_CTRL_11N, BIT(14) | 1309 rtl_set_bbreg(hw, DM_REG_ANTSEL_CTRL_11N,
1271 BIT(13) | BIT(12), def_ant); 1310 BIT(14) | BIT(13) | BIT(12),
1272 rtl_set_bbreg(hw, DM_REG_RESP_TX_11N, BIT(6) | BIT(7), 1311 default_ant);
1273 def_ant); 1312 rtl_set_bbreg(hw, DM_REG_RESP_TX_11N,
1313 BIT(6) | BIT(7), default_ant);
1274 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) { 1314 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
1275 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(5) | 1315 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1276 BIT(4) | BIT(3), def_ant); 1316 BIT(5) | BIT(4) | BIT(3), default_ant);
1277 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) | 1317 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1278 BIT(7) | BIT(6), opt_ant); 1318 BIT(8) | BIT(7) | BIT(6), optional_ant);
1279 } 1319 }
1280 } 1320 }
1281 fat_tbl->rx_idle_ant = ant; 1321 pfat_table->rx_idle_ant = ant;
1282 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RxIdleAnt %s\n", 1322 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RxIdleAnt %s\n",
1283 ((ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"))); 1323 (ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
1284} 1324}
1285 1325
1286static void rtl88e_dm_update_tx_ant(struct ieee80211_hw *hw, 1326static void rtl88e_dm_update_tx_ant(struct ieee80211_hw *hw,
1287 u8 ant, u32 mac_id) 1327 u8 ant, u32 mac_id)
1288{ 1328{
1289 struct rtl_priv *rtlpriv = rtl_priv(hw); 1329 struct rtl_priv *rtlpriv = rtl_priv(hw);
1290 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1330 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1291 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1331 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1292 u8 target_ant; 1332 u8 target_ant;
1293 1333
1294 if (ant == MAIN_ANT) 1334 if (ant == MAIN_ANT)
@@ -1296,23 +1336,25 @@ static void rtl88e_dm_update_tx_ant(struct ieee80211_hw *hw,
1296 else 1336 else
1297 target_ant = AUX_ANT_CG_TRX; 1337 target_ant = AUX_ANT_CG_TRX;
1298 1338
1299 fat_tbl->antsel_a[mac_id] = target_ant & BIT(0); 1339 pfat_table->antsel_a[mac_id] = target_ant & BIT(0);
1300 fat_tbl->antsel_b[mac_id] = (target_ant & BIT(1)) >> 1; 1340 pfat_table->antsel_b[mac_id] = (target_ant & BIT(1)) >> 1;
1301 fat_tbl->antsel_c[mac_id] = (target_ant & BIT(2)) >> 2; 1341 pfat_table->antsel_c[mac_id] = (target_ant & BIT(2)) >> 2;
1302 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "txfrominfo target ant %s\n", 1342 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "txfrominfo target ant %s\n",
1303 ((ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"))); 1343 (ant == MAIN_ANT) ? ("MAIN_ANT") : ("AUX_ANT"));
1304 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "antsel_tr_mux = 3'b%d%d%d\n", 1344 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "antsel_tr_mux = 3'b%d%d%d\n",
1305 fat_tbl->antsel_c[mac_id], 1345 pfat_table->antsel_c[mac_id],
1306 fat_tbl->antsel_b[mac_id], fat_tbl->antsel_a[mac_id]); 1346 pfat_table->antsel_b[mac_id],
1347 pfat_table->antsel_a[mac_id]);
1307} 1348}
1308 1349
1309static void rtl88e_dm_rx_hw_antena_div_init(struct ieee80211_hw *hw) 1350static void rtl88e_dm_rx_hw_antena_div_init(struct ieee80211_hw *hw)
1310{ 1351{
1311 u32 value32; 1352 u32 value32;
1353
1312 /*MAC Setting*/ 1354 /*MAC Setting*/
1313 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD); 1355 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1314 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD, value32 | 1356 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
1315 (BIT(23) | BIT(25))); 1357 MASKDWORD, value32 | (BIT(23) | BIT(25)));
1316 /*Pin Setting*/ 1358 /*Pin Setting*/
1317 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0); 1359 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1318 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0); 1360 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
@@ -1333,8 +1375,8 @@ static void rtl88e_dm_trx_hw_antenna_div_init(struct ieee80211_hw *hw)
1333 1375
1334 /*MAC Setting*/ 1376 /*MAC Setting*/
1335 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD); 1377 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1336 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD, value32 | 1378 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD,
1337 (BIT(23) | BIT(25))); 1379 value32 | (BIT(23) | BIT(25)));
1338 /*Pin Setting*/ 1380 /*Pin Setting*/
1339 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0); 1381 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
1340 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0); 1382 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(10), 0);
@@ -1354,28 +1396,30 @@ static void rtl88e_dm_trx_hw_antenna_div_init(struct ieee80211_hw *hw)
1354static void rtl88e_dm_fast_training_init(struct ieee80211_hw *hw) 1396static void rtl88e_dm_fast_training_init(struct ieee80211_hw *hw)
1355{ 1397{
1356 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1398 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1357 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1399 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1358 u32 ant_combo = 2; 1400 u32 ant_combination = 2;
1359 u32 value32, i; 1401 u32 value32, i;
1360 1402
1361 for (i = 0; i < 6; i++) { 1403 for (i = 0; i < 6; i++) {
1362 fat_tbl->bssid[i] = 0; 1404 pfat_table->bssid[i] = 0;
1363 fat_tbl->ant_sum[i] = 0; 1405 pfat_table->ant_sum[i] = 0;
1364 fat_tbl->ant_cnt[i] = 0; 1406 pfat_table->ant_cnt[i] = 0;
1365 fat_tbl->ant_ave[i] = 0; 1407 pfat_table->ant_ave[i] = 0;
1366 } 1408 }
1367 fat_tbl->train_idx = 0; 1409 pfat_table->train_idx = 0;
1368 fat_tbl->fat_state = FAT_NORMAL_STATE; 1410 pfat_table->fat_state = FAT_NORMAL_STATE;
1369 1411
1370 /*MAC Setting*/ 1412 /*MAC Setting*/
1371 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD); 1413 value32 = rtl_get_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD);
1372 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N, MASKDWORD, value32 | (BIT(23) | 1414 rtl_set_bbreg(hw, DM_REG_ANTSEL_PIN_11N,
1373 BIT(25))); 1415 MASKDWORD, value32 | (BIT(23) | BIT(25)));
1374 value32 = rtl_get_bbreg(hw, DM_REG_ANT_TRAIN_2, MASKDWORD); 1416 value32 = rtl_get_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N, MASKDWORD);
1375 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_2, MASKDWORD, value32 | (BIT(16) | 1417 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1376 BIT(17))); 1418 MASKDWORD, value32 | (BIT(16) | BIT(17)));
1377 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_2, MASKLWORD, 0); 1419 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1378 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_1, MASKDWORD, 0); 1420 MASKLWORD, 0);
1421 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
1422 MASKDWORD, 0);
1379 1423
1380 /*Pin Setting*/ 1424 /*Pin Setting*/
1381 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0); 1425 rtl_set_bbreg(hw, DM_REG_PIN_CTRL_11N, BIT(9) | BIT(8), 0);
@@ -1386,26 +1430,17 @@ static void rtl88e_dm_fast_training_init(struct ieee80211_hw *hw)
1386 /*OFDM Setting*/ 1430 /*OFDM Setting*/
1387 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0); 1431 rtl_set_bbreg(hw, DM_REG_ANTDIV_PARA1_11N, MASKDWORD, 0x000000a0);
1388 /*antenna mapping table*/ 1432 /*antenna mapping table*/
1389 if (ant_combo == 2) { 1433 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE0, 1);
1390 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE0, 1); 1434 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE1, 2);
1391 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE1, 2);
1392 } else if (ant_combo == 7) {
1393 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE0, 1);
1394 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE1, 2);
1395 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE2, 2);
1396 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING1_11N, MASKBYTE3, 3);
1397 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING2_11N, MASKBYTE0, 4);
1398 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING2_11N, MASKBYTE1, 5);
1399 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING2_11N, MASKBYTE2, 6);
1400 rtl_set_bbreg(hw, DM_REG_ANT_MAPPING2_11N, MASKBYTE3, 7);
1401 }
1402 1435
1403 /*TX Setting*/ 1436 /*TX Setting*/
1404 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 1); 1437 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 1);
1405 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(5) | BIT(4) | BIT(3), 0); 1438 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1406 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) | BIT(7) | BIT(6), 1); 1439 BIT(5) | BIT(4) | BIT(3), 0);
1407 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(2) | BIT(1) | BIT(0), 1440 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1408 (ant_combo - 1)); 1441 BIT(8) | BIT(7) | BIT(6), 1);
1442 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N,
1443 BIT(2) | BIT(1) | BIT(0), (ant_combination - 1));
1409 1444
1410 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1); 1445 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1411} 1446}
@@ -1420,6 +1455,7 @@ static void rtl88e_dm_antenna_div_init(struct ieee80211_hw *hw)
1420 rtl88e_dm_trx_hw_antenna_div_init(hw); 1455 rtl88e_dm_trx_hw_antenna_div_init(hw);
1421 else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV) 1456 else if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)
1422 rtl88e_dm_fast_training_init(hw); 1457 rtl88e_dm_fast_training_init(hw);
1458
1423} 1459}
1424 1460
1425void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw, 1461void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
@@ -1427,38 +1463,39 @@ void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
1427{ 1463{
1428 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1464 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1429 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1465 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1430 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1466 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1431 1467
1432 if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) || 1468 if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
1433 (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)) { 1469 (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV)) {
1434 SET_TX_DESC_ANTSEL_A(pdesc, fat_tbl->antsel_a[mac_id]); 1470 SET_TX_DESC_ANTSEL_A(pdesc, pfat_table->antsel_a[mac_id]);
1435 SET_TX_DESC_ANTSEL_B(pdesc, fat_tbl->antsel_b[mac_id]); 1471 SET_TX_DESC_ANTSEL_B(pdesc, pfat_table->antsel_b[mac_id]);
1436 SET_TX_DESC_ANTSEL_C(pdesc, fat_tbl->antsel_c[mac_id]); 1472 SET_TX_DESC_ANTSEL_C(pdesc, pfat_table->antsel_c[mac_id]);
1437 } 1473 }
1438} 1474}
1439 1475
1440void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw, 1476void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
1441 u8 antsel_tr_mux, u32 mac_id, u32 rx_pwdb_all) 1477 u8 antsel_tr_mux, u32 mac_id,
1478 u32 rx_pwdb_all)
1442{ 1479{
1443 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1480 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1444 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1481 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1445 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1482 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1446 1483
1447 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) { 1484 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) {
1448 if (antsel_tr_mux == MAIN_ANT_CG_TRX) { 1485 if (antsel_tr_mux == MAIN_ANT_CG_TRX) {
1449 fat_tbl->main_ant_sum[mac_id] += rx_pwdb_all; 1486 pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
1450 fat_tbl->main_ant_cnt[mac_id]++; 1487 pfat_table->main_ant_cnt[mac_id]++;
1451 } else { 1488 } else {
1452 fat_tbl->aux_ant_sum[mac_id] += rx_pwdb_all; 1489 pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
1453 fat_tbl->aux_ant_cnt[mac_id]++; 1490 pfat_table->aux_ant_cnt[mac_id]++;
1454 } 1491 }
1455 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) { 1492 } else if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) {
1456 if (antsel_tr_mux == MAIN_ANT_CGCS_RX) { 1493 if (antsel_tr_mux == MAIN_ANT_CGCS_RX) {
1457 fat_tbl->main_ant_sum[mac_id] += rx_pwdb_all; 1494 pfat_table->main_ant_sum[mac_id] += rx_pwdb_all;
1458 fat_tbl->main_ant_cnt[mac_id]++; 1495 pfat_table->main_ant_cnt[mac_id]++;
1459 } else { 1496 } else {
1460 fat_tbl->aux_ant_sum[mac_id] += rx_pwdb_all; 1497 pfat_table->aux_ant_sum[mac_id] += rx_pwdb_all;
1461 fat_tbl->aux_ant_cnt[mac_id]++; 1498 pfat_table->aux_ant_cnt[mac_id]++;
1462 } 1499 }
1463 } 1500 }
1464} 1501}
@@ -1466,43 +1503,43 @@ void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
1466static void rtl88e_dm_hw_ant_div(struct ieee80211_hw *hw) 1503static void rtl88e_dm_hw_ant_div(struct ieee80211_hw *hw)
1467{ 1504{
1468 struct rtl_priv *rtlpriv = rtl_priv(hw); 1505 struct rtl_priv *rtlpriv = rtl_priv(hw);
1469 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
1470 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1506 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1471 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1507 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1472 struct rtl_sta_info *drv_priv; 1508 struct rtl_sta_info *drv_priv;
1473 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1509 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1474 u32 i, min_rssi = 0xff, ant_div_max_rssi = 0, max_rssi = 0; 1510 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
1475 u32 local_min_rssi, local_max_rssi; 1511 u32 i, min_rssi = 0xff, ant_div_max_rssi = 0;
1512 u32 max_rssi = 0, local_min_rssi, local_max_rssi;
1476 u32 main_rssi, aux_rssi; 1513 u32 main_rssi, aux_rssi;
1477 u8 rx_idle_ant = 0, target_ant = 7; 1514 u8 rx_idle_ant = 0, target_ant = 7;
1478 1515
1516 /*for sta its self*/
1479 i = 0; 1517 i = 0;
1480 main_rssi = (fat_tbl->main_ant_cnt[i] != 0) ? 1518 main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
1481 (fat_tbl->main_ant_sum[i] / 1519 (pfat_table->main_ant_sum[i] / pfat_table->main_ant_cnt[i]) : 0;
1482 fat_tbl->main_ant_cnt[i]) : 0; 1520 aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
1483 aux_rssi = (fat_tbl->aux_ant_cnt[i] != 0) ? 1521 (pfat_table->aux_ant_sum[i] / pfat_table->aux_ant_cnt[i]) : 0;
1484 (fat_tbl->aux_ant_sum[i] / fat_tbl->aux_ant_cnt[i]) : 0;
1485 target_ant = (main_rssi == aux_rssi) ? 1522 target_ant = (main_rssi == aux_rssi) ?
1486 fat_tbl->rx_idle_ant : ((main_rssi >= aux_rssi) ? 1523 pfat_table->rx_idle_ant : ((main_rssi >= aux_rssi) ?
1487 MAIN_ANT : AUX_ANT); 1524 MAIN_ANT : AUX_ANT);
1488 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1525 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1489 "main_ant_sum %d main_ant_cnt %d\n", 1526 "main_ant_sum %d main_ant_cnt %d\n",
1490 fat_tbl->main_ant_sum[i], fat_tbl->main_ant_cnt[i]); 1527 pfat_table->main_ant_sum[i],
1528 pfat_table->main_ant_cnt[i]);
1491 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1529 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1492 "aux_ant_sum %d aux_ant_cnt %d\n", 1530 "aux_ant_sum %d aux_ant_cnt %d\n",
1493 fat_tbl->aux_ant_sum[i], 1531 pfat_table->aux_ant_sum[i], pfat_table->aux_ant_cnt[i]);
1494 fat_tbl->aux_ant_cnt[i]); 1532 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "main_rssi %d aux_rssi%d\n",
1495 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1533 main_rssi, aux_rssi);
1496 "main_rssi %d aux_rssi%d\n", main_rssi, aux_rssi);
1497 local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi; 1534 local_max_rssi = (main_rssi > aux_rssi) ? main_rssi : aux_rssi;
1498 if ((local_max_rssi > ant_div_max_rssi) && (local_max_rssi < 40)) 1535 if ((local_max_rssi > ant_div_max_rssi) && (local_max_rssi < 40))
1499 ant_div_max_rssi = local_max_rssi; 1536 ant_div_max_rssi = local_max_rssi;
1500 if (local_max_rssi > max_rssi) 1537 if (local_max_rssi > max_rssi)
1501 max_rssi = local_max_rssi; 1538 max_rssi = local_max_rssi;
1502 1539
1503 if ((fat_tbl->rx_idle_ant == MAIN_ANT) && (main_rssi == 0)) 1540 if ((pfat_table->rx_idle_ant == MAIN_ANT) && (main_rssi == 0))
1504 main_rssi = aux_rssi; 1541 main_rssi = aux_rssi;
1505 else if ((fat_tbl->rx_idle_ant == AUX_ANT) && (aux_rssi == 0)) 1542 else if ((pfat_table->rx_idle_ant == AUX_ANT) && (aux_rssi == 0))
1506 aux_rssi = main_rssi; 1543 aux_rssi = main_rssi;
1507 1544
1508 local_min_rssi = (main_rssi > aux_rssi) ? aux_rssi : main_rssi; 1545 local_min_rssi = (main_rssi > aux_rssi) ? aux_rssi : main_rssi;
@@ -1518,32 +1555,33 @@ static void rtl88e_dm_hw_ant_div(struct ieee80211_hw *hw)
1518 spin_lock_bh(&rtlpriv->locks.entry_list_lock); 1555 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1519 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) { 1556 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
1520 i++; 1557 i++;
1521 main_rssi = (fat_tbl->main_ant_cnt[i] != 0) ? 1558 main_rssi = (pfat_table->main_ant_cnt[i] != 0) ?
1522 (fat_tbl->main_ant_sum[i] / 1559 (pfat_table->main_ant_sum[i] /
1523 fat_tbl->main_ant_cnt[i]) : 0; 1560 pfat_table->main_ant_cnt[i]) : 0;
1524 aux_rssi = (fat_tbl->aux_ant_cnt[i] != 0) ? 1561 aux_rssi = (pfat_table->aux_ant_cnt[i] != 0) ?
1525 (fat_tbl->aux_ant_sum[i] / 1562 (pfat_table->aux_ant_sum[i] /
1526 fat_tbl->aux_ant_cnt[i]) : 0; 1563 pfat_table->aux_ant_cnt[i]) : 0;
1527 target_ant = (main_rssi == aux_rssi) ? 1564 target_ant = (main_rssi == aux_rssi) ?
1528 fat_tbl->rx_idle_ant : ((main_rssi >= 1565 pfat_table->rx_idle_ant : ((main_rssi >=
1529 aux_rssi) ? MAIN_ANT : AUX_ANT); 1566 aux_rssi) ? MAIN_ANT : AUX_ANT);
1530
1531 1567
1532 local_max_rssi = max_t(u32, main_rssi, aux_rssi); 1568 local_max_rssi = (main_rssi > aux_rssi) ?
1569 main_rssi : aux_rssi;
1533 if ((local_max_rssi > ant_div_max_rssi) && 1570 if ((local_max_rssi > ant_div_max_rssi) &&
1534 (local_max_rssi < 40)) 1571 (local_max_rssi < 40))
1535 ant_div_max_rssi = local_max_rssi; 1572 ant_div_max_rssi = local_max_rssi;
1536 if (local_max_rssi > max_rssi) 1573 if (local_max_rssi > max_rssi)
1537 max_rssi = local_max_rssi; 1574 max_rssi = local_max_rssi;
1538 1575
1539 if ((fat_tbl->rx_idle_ant == MAIN_ANT) && !main_rssi) 1576 if ((pfat_table->rx_idle_ant == MAIN_ANT) &&
1577 (main_rssi == 0))
1540 main_rssi = aux_rssi; 1578 main_rssi = aux_rssi;
1541 else if ((fat_tbl->rx_idle_ant == AUX_ANT) && 1579 else if ((pfat_table->rx_idle_ant == AUX_ANT) &&
1542 (aux_rssi == 0)) 1580 (aux_rssi == 0))
1543 aux_rssi = main_rssi; 1581 aux_rssi = main_rssi;
1544 1582
1545 local_min_rssi = (main_rssi > aux_rssi) ? 1583 local_min_rssi = (main_rssi > aux_rssi) ?
1546 aux_rssi : main_rssi; 1584 aux_rssi : main_rssi;
1547 if (local_min_rssi < min_rssi) { 1585 if (local_min_rssi < min_rssi) {
1548 min_rssi = local_min_rssi; 1586 min_rssi = local_min_rssi;
1549 rx_idle_ant = target_ant; 1587 rx_idle_ant = target_ant;
@@ -1555,10 +1593,10 @@ static void rtl88e_dm_hw_ant_div(struct ieee80211_hw *hw)
1555 } 1593 }
1556 1594
1557 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) { 1595 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
1558 fat_tbl->main_ant_sum[i] = 0; 1596 pfat_table->main_ant_sum[i] = 0;
1559 fat_tbl->aux_ant_sum[i] = 0; 1597 pfat_table->aux_ant_sum[i] = 0;
1560 fat_tbl->main_ant_cnt[i] = 0; 1598 pfat_table->main_ant_cnt[i] = 0;
1561 fat_tbl->aux_ant_cnt[i] = 0; 1599 pfat_table->aux_ant_cnt[i] = 0;
1562 } 1600 }
1563 1601
1564 rtl88e_dm_update_rx_idle_ant(hw, rx_idle_ant); 1602 rtl88e_dm_update_rx_idle_ant(hw, rx_idle_ant);
@@ -1573,27 +1611,27 @@ static void rtl88e_set_next_mac_address_target(struct ieee80211_hw *hw)
1573 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1611 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1574 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1612 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1575 struct rtl_sta_info *drv_priv; 1613 struct rtl_sta_info *drv_priv;
1576 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1614 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1577 u32 value32, i, j = 0; 1615 u32 value32, i, j = 0;
1578 1616
1579 if (mac->link_state >= MAC80211_LINKED) { 1617 if (mac->link_state >= MAC80211_LINKED) {
1580 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) { 1618 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {
1581 if ((fat_tbl->train_idx + 1) == ASSOCIATE_ENTRY_NUM) 1619 if ((pfat_table->train_idx + 1) == ASSOCIATE_ENTRY_NUM)
1582 fat_tbl->train_idx = 0; 1620 pfat_table->train_idx = 0;
1583 else 1621 else
1584 fat_tbl->train_idx++; 1622 pfat_table->train_idx++;
1585 1623
1586 if (fat_tbl->train_idx == 0) { 1624 if (pfat_table->train_idx == 0) {
1587 value32 = (mac->mac_addr[5] << 8) | 1625 value32 = (mac->mac_addr[5] << 8) |
1588 mac->mac_addr[4]; 1626 mac->mac_addr[4];
1589 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_2, 1627 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA2_11N,
1590 MASKLWORD, value32); 1628 MASKLWORD, value32);
1591 1629
1592 value32 = (mac->mac_addr[3] << 24) | 1630 value32 = (mac->mac_addr[3] << 24) |
1593 (mac->mac_addr[2] << 16) | 1631 (mac->mac_addr[2] << 16) |
1594 (mac->mac_addr[1] << 8) | 1632 (mac->mac_addr[1] << 8) |
1595 mac->mac_addr[0]; 1633 mac->mac_addr[0];
1596 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_1, 1634 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_PARA1_11N,
1597 MASKDWORD, value32); 1635 MASKDWORD, value32);
1598 break; 1636 break;
1599 } 1637 }
@@ -1602,28 +1640,29 @@ static void rtl88e_set_next_mac_address_target(struct ieee80211_hw *hw)
1602 NL80211_IFTYPE_STATION) { 1640 NL80211_IFTYPE_STATION) {
1603 spin_lock_bh(&rtlpriv->locks.entry_list_lock); 1641 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1604 list_for_each_entry(drv_priv, 1642 list_for_each_entry(drv_priv,
1605 &rtlpriv->entry_list, 1643 &rtlpriv->entry_list, list) {
1606 list) {
1607 j++; 1644 j++;
1608 if (j != fat_tbl->train_idx) 1645 if (j != pfat_table->train_idx)
1609 continue; 1646 continue;
1610 1647
1611 value32 = (drv_priv->mac_addr[5] << 8) | 1648 value32 = (drv_priv->mac_addr[5] << 8) |
1612 drv_priv->mac_addr[4]; 1649 drv_priv->mac_addr[4];
1613 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_2, 1650 rtl_set_bbreg(hw,
1651 DM_REG_ANT_TRAIN_PARA2_11N,
1614 MASKLWORD, value32); 1652 MASKLWORD, value32);
1615 1653
1616 value32 = (drv_priv->mac_addr[3]<<24) | 1654 value32 = (drv_priv->mac_addr[3] << 24) |
1617 (drv_priv->mac_addr[2]<<16) | 1655 (drv_priv->mac_addr[2] << 16) |
1618 (drv_priv->mac_addr[1]<<8) | 1656 (drv_priv->mac_addr[1] << 8) |
1619 drv_priv->mac_addr[0]; 1657 drv_priv->mac_addr[0];
1620 rtl_set_bbreg(hw, DM_REG_ANT_TRAIN_1, 1658 rtl_set_bbreg(hw,
1659 DM_REG_ANT_TRAIN_PARA1_11N,
1621 MASKDWORD, value32); 1660 MASKDWORD, value32);
1622 break; 1661 break;
1623 } 1662 }
1624 spin_unlock_bh(&rtlpriv->locks.entry_list_lock); 1663 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1625 /*find entry, break*/ 1664 /*find entry, break*/
1626 if (j == fat_tbl->train_idx) 1665 if (j == pfat_table->train_idx)
1627 break; 1666 break;
1628 } 1667 }
1629 } 1668 }
@@ -1634,23 +1673,24 @@ static void rtl88e_dm_fast_ant_training(struct ieee80211_hw *hw)
1634{ 1673{
1635 struct rtl_priv *rtlpriv = rtl_priv(hw); 1674 struct rtl_priv *rtlpriv = rtl_priv(hw);
1636 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1675 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1637 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1676 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1638 u32 i, max_rssi = 0; 1677 u32 i, max_rssi = 0;
1639 u8 target_ant = 2; 1678 u8 target_ant = 2;
1640 bool bpkt_filter_match = false; 1679 bool bpkt_filter_match = false;
1641 1680
1642 if (fat_tbl->fat_state == FAT_TRAINING_STATE) { 1681 if (pfat_table->fat_state == FAT_TRAINING_STATE) {
1643 for (i = 0; i < 7; i++) { 1682 for (i = 0; i < 7; i++) {
1644 if (fat_tbl->ant_cnt[i] == 0) { 1683 if (pfat_table->ant_cnt[i] == 0) {
1645 fat_tbl->ant_ave[i] = 0; 1684 pfat_table->ant_ave[i] = 0;
1646 } else { 1685 } else {
1647 fat_tbl->ant_ave[i] = fat_tbl->ant_sum[i] / 1686 pfat_table->ant_ave[i] =
1648 fat_tbl->ant_cnt[i]; 1687 pfat_table->ant_sum[i] /
1688 pfat_table->ant_cnt[i];
1649 bpkt_filter_match = true; 1689 bpkt_filter_match = true;
1650 } 1690 }
1651 1691
1652 if (fat_tbl->ant_ave[i] > max_rssi) { 1692 if (pfat_table->ant_ave[i] > max_rssi) {
1653 max_rssi = fat_tbl->ant_ave[i]; 1693 max_rssi = pfat_table->ant_ave[i];
1654 target_ant = (u8) i; 1694 target_ant = (u8) i;
1655 } 1695 }
1656 } 1696 }
@@ -1664,32 +1704,33 @@ static void rtl88e_dm_fast_ant_training(struct ieee80211_hw *hw)
1664 BIT(16), 0); 1704 BIT(16), 0);
1665 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) | 1705 rtl_set_bbreg(hw, DM_REG_RX_ANT_CTRL_11N, BIT(8) |
1666 BIT(7) | BIT(6), target_ant); 1706 BIT(7) | BIT(6), target_ant);
1667 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, BIT(21), 1); 1707 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1708 BIT(21), 1);
1668 1709
1669 fat_tbl->antsel_a[fat_tbl->train_idx] = 1710 pfat_table->antsel_a[pfat_table->train_idx] =
1670 target_ant & BIT(0); 1711 target_ant & BIT(0);
1671 fat_tbl->antsel_b[fat_tbl->train_idx] = 1712 pfat_table->antsel_b[pfat_table->train_idx] =
1672 (target_ant & BIT(1)) >> 1; 1713 (target_ant & BIT(1)) >> 1;
1673 fat_tbl->antsel_c[fat_tbl->train_idx] = 1714 pfat_table->antsel_c[pfat_table->train_idx] =
1674 (target_ant & BIT(2)) >> 2; 1715 (target_ant & BIT(2)) >> 2;
1675 1716
1676 if (target_ant == 0) 1717 if (target_ant == 0)
1677 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0); 1718 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
1678 } 1719 }
1679 1720
1680 for (i = 0; i < 7; i++) { 1721 for (i = 0; i < 7; i++) {
1681 fat_tbl->ant_sum[i] = 0; 1722 pfat_table->ant_sum[i] = 0;
1682 fat_tbl->ant_cnt[i] = 0; 1723 pfat_table->ant_cnt[i] = 0;
1683 } 1724 }
1684 1725
1685 fat_tbl->fat_state = FAT_NORMAL_STATE; 1726 pfat_table->fat_state = FAT_NORMAL_STATE;
1686 return; 1727 return;
1687 } 1728 }
1688 1729
1689 if (fat_tbl->fat_state == FAT_NORMAL_STATE) { 1730 if (pfat_table->fat_state == FAT_NORMAL_STATE) {
1690 rtl88e_set_next_mac_address_target(hw); 1731 rtl88e_set_next_mac_address_target(hw);
1691 1732
1692 fat_tbl->fat_state = FAT_TRAINING_STATE; 1733 pfat_table->fat_state = FAT_TRAINING_STATE;
1693 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N, BIT(16), 1); 1734 rtl_set_bbreg(hw, DM_REG_TXAGC_A_1_MCS32_11N, BIT(16), 1);
1694 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1); 1735 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
1695 1736
@@ -1711,11 +1752,11 @@ static void rtl88e_dm_antenna_diversity(struct ieee80211_hw *hw)
1711 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1752 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1712 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1753 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1713 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 1754 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1714 struct fast_ant_training *fat_tbl = &(rtldm->fat_table); 1755 struct fast_ant_training *pfat_table = &rtldm->fat_table;
1715 1756
1716 if (mac->link_state < MAC80211_LINKED) { 1757 if (mac->link_state < MAC80211_LINKED) {
1717 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "No Link\n"); 1758 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "No Link\n");
1718 if (fat_tbl->becomelinked == true) { 1759 if (pfat_table->becomelinked) {
1719 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 1760 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1720 "need to turn off HW AntDiv\n"); 1761 "need to turn off HW AntDiv\n");
1721 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0); 1762 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 0);
@@ -1724,12 +1765,13 @@ static void rtl88e_dm_antenna_diversity(struct ieee80211_hw *hw)
1724 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) 1765 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1725 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, 1766 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1726 BIT(21), 0); 1767 BIT(21), 0);
1727 fat_tbl->becomelinked = 1768 pfat_table->becomelinked =
1728 (mac->link_state == MAC80211_LINKED) ? true : false; 1769 (mac->link_state == MAC80211_LINKED) ?
1770 true : false;
1729 } 1771 }
1730 return; 1772 return;
1731 } else { 1773 } else {
1732 if (fat_tbl->becomelinked == false) { 1774 if (!pfat_table->becomelinked) {
1733 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 1775 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1734 "Need to turn on HW AntDiv\n"); 1776 "Need to turn on HW AntDiv\n");
1735 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1); 1777 rtl_set_bbreg(hw, DM_REG_IGI_A_11N, BIT(7), 1);
@@ -1738,8 +1780,9 @@ static void rtl88e_dm_antenna_diversity(struct ieee80211_hw *hw)
1738 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) 1780 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
1739 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N, 1781 rtl_set_bbreg(hw, DM_REG_TX_ANT_CTRL_11N,
1740 BIT(21), 1); 1782 BIT(21), 1);
1741 fat_tbl->becomelinked = 1783 pfat_table->becomelinked =
1742 (mac->link_state >= MAC80211_LINKED) ? true : false; 1784 (mac->link_state >= MAC80211_LINKED) ?
1785 true : false;
1743 } 1786 }
1744 } 1787 }
1745 1788
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
index 0e07f72ea158..64f1f3ea9807 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/dm.h
@@ -156,7 +156,6 @@
156#define DM_REG_SLEEP_11N 0xEE0 156#define DM_REG_SLEEP_11N 0xEE0
157#define DM_REG_PMPD_ANAEN_11N 0xEEC 157#define DM_REG_PMPD_ANAEN_11N 0xEEC
158 158
159
160/*MAC REG LIST*/ 159/*MAC REG LIST*/
161#define DM_REG_BB_RST_11N 0x02 160#define DM_REG_BB_RST_11N 0x02
162#define DM_REG_ANTSEL_PIN_11N 0x4C 161#define DM_REG_ANTSEL_PIN_11N 0x4C
@@ -168,8 +167,9 @@
168#define DM_REG_EDCA_BK_11N 0x50C 167#define DM_REG_EDCA_BK_11N 0x50C
169#define DM_REG_TXPAUSE_11N 0x522 168#define DM_REG_TXPAUSE_11N 0x522
170#define DM_REG_RESP_TX_11N 0x6D8 169#define DM_REG_RESP_TX_11N 0x6D8
171#define DM_REG_ANT_TRAIN_1 0x7b0 170#define DM_REG_ANT_TRAIN_PARA1_11N 0x7b0
172#define DM_REG_ANT_TRAIN_2 0x7b4 171#define DM_REG_ANT_TRAIN_PARA2_11N 0x7b4
172
173 173
174/*DIG Related*/ 174/*DIG Related*/
175#define DM_BIT_IGI_11N 0x0000007F 175#define DM_BIT_IGI_11N 0x0000007F
@@ -208,7 +208,7 @@
208#define DM_DIG_BACKOFF_MIN -4 208#define DM_DIG_BACKOFF_MIN -4
209#define DM_DIG_BACKOFF_DEFAULT 10 209#define DM_DIG_BACKOFF_DEFAULT 10
210 210
211#define RXPATHSELECTION_SS_TH_LOW 30 211#define RXPATHSELECTION_SS_TH_W 30
212#define RXPATHSELECTION_DIFF_TH 18 212#define RXPATHSELECTION_DIFF_TH 18
213 213
214#define DM_RATR_STA_INIT 0 214#define DM_RATR_STA_INIT 0
@@ -232,20 +232,22 @@
232 232
233#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 233#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
234#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 234#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
235#define TXPWRTRACK_MAX_IDX 6 235#define TXPWRTRACK_MAX_IDX 6
236 236
237struct swat_t { 237struct swat_t {
238 u8 failure_cnt; 238 u8 failure_cnt;
239 u8 try_flag; 239 u8 try_flag;
240 u8 stop_trying; 240 u8 stop_trying;
241
241 long pre_rssi; 242 long pre_rssi;
242 long trying_threshold; 243 long trying_threshold;
243 u8 cur_antenna; 244 u8 cur_antenna;
244 u8 pre_antenna; 245 u8 pre_antenna;
246
245}; 247};
246 248
247enum FAT_STATE { 249enum FAT_STATE {
248 FAT_NORMAL_STATE = 0, 250 FAT_NORMAL_STATE = 0,
249 FAT_TRAINING_STATE = 1, 251 FAT_TRAINING_STATE = 1,
250}; 252};
251 253
@@ -310,8 +312,9 @@ enum pwr_track_control_method {
310 312
311void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw, 313void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
312 u8 *pdesc, u32 mac_id); 314 u8 *pdesc, u32 mac_id);
313void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw, u8 antsel_tr_mux, 315void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
314 u32 mac_id, u32 rx_pwdb_all); 316 u8 antsel_tr_mux, u32 mac_id,
317 u32 rx_pwdb_all);
315void rtl88e_dm_fast_antenna_training_callback(unsigned long data); 318void rtl88e_dm_fast_antenna_training_callback(unsigned long data);
316void rtl88e_dm_init(struct ieee80211_hw *hw); 319void rtl88e_dm_init(struct ieee80211_hw *hw);
317void rtl88e_dm_watchdog(struct ieee80211_hw *hw); 320void rtl88e_dm_watchdog(struct ieee80211_hw *hw);
@@ -320,7 +323,5 @@ void rtl88e_dm_init_edca_turbo(struct ieee80211_hw *hw);
320void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw); 323void rtl88e_dm_check_txpower_tracking(struct ieee80211_hw *hw);
321void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw); 324void rtl88e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
322void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw, 325void rtl88e_dm_txpower_track_adjust(struct ieee80211_hw *hw,
323 u8 type, u8 *pdirection, 326 u8 type, u8 *pdirection, u32 *poutwrite_val);
324 u32 *poutwrite_val);
325
326#endif 327#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/fw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/fw.c
index 4f9376ad4739..c8058aa73ecf 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/fw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/fw.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,12 +26,11 @@
30#include "../wifi.h" 26#include "../wifi.h"
31#include "../pci.h" 27#include "../pci.h"
32#include "../base.h" 28#include "../base.h"
29#include "../core.h"
33#include "reg.h" 30#include "reg.h"
34#include "def.h" 31#include "def.h"
35#include "fw.h" 32#include "fw.h"
36 33
37#include <linux/kmemleak.h>
38
39static void _rtl88e_enable_fw_download(struct ieee80211_hw *hw, bool enable) 34static void _rtl88e_enable_fw_download(struct ieee80211_hw *hw, bool enable)
40{ 35{
41 struct rtl_priv *rtlpriv = rtl_priv(hw); 36 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -62,26 +57,26 @@ static void _rtl88e_fw_block_write(struct ieee80211_hw *hw,
62 const u8 *buffer, u32 size) 57 const u8 *buffer, u32 size)
63{ 58{
64 struct rtl_priv *rtlpriv = rtl_priv(hw); 59 struct rtl_priv *rtlpriv = rtl_priv(hw);
65 u32 blk_sz = sizeof(u32); 60 u32 blocksize = sizeof(u32);
66 u8 *buf_ptr = (u8 *)buffer; 61 u8 *bufferptr = (u8 *)buffer;
67 u32 *pu4BytePtr = (u32 *)buffer; 62 u32 *pu4BytePtr = (u32 *)buffer;
68 u32 i, offset, blk_cnt, remain; 63 u32 i, offset, blockcount, remainsize;
69 64
70 blk_cnt = size / blk_sz; 65 blockcount = size / blocksize;
71 remain = size % blk_sz; 66 remainsize = size % blocksize;
72 67
73 for (i = 0; i < blk_cnt; i++) { 68 for (i = 0; i < blockcount; i++) {
74 offset = i * blk_sz; 69 offset = i * blocksize;
75 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset), 70 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset),
76 *(pu4BytePtr + i)); 71 *(pu4BytePtr + i));
77 } 72 }
78 73
79 if (remain) { 74 if (remainsize) {
80 offset = blk_cnt * blk_sz; 75 offset = blockcount * blocksize;
81 buf_ptr += offset; 76 bufferptr += offset;
82 for (i = 0; i < remain; i++) { 77 for (i = 0; i < remainsize; i++) {
83 rtl_write_byte(rtlpriv, (FW_8192C_START_ADDRESS + 78 rtl_write_byte(rtlpriv, (FW_8192C_START_ADDRESS +
84 offset + i), *(buf_ptr + i)); 79 offset + i), *(bufferptr + i));
85 } 80 }
86 } 81 }
87} 82}
@@ -119,32 +114,33 @@ static void _rtl88e_write_fw(struct ieee80211_hw *hw,
119 enum version_8188e version, u8 *buffer, u32 size) 114 enum version_8188e version, u8 *buffer, u32 size)
120{ 115{
121 struct rtl_priv *rtlpriv = rtl_priv(hw); 116 struct rtl_priv *rtlpriv = rtl_priv(hw);
122 u8 *buf_ptr = buffer; 117 u8 *bufferptr = (u8 *)buffer;
123 u32 page_no, remain; 118 u32 pagenums, remainsize;
124 u32 page, offset; 119 u32 page, offset;
125 120
126 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size); 121 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
127 122
128 _rtl88e_fill_dummy(buf_ptr, &size); 123 _rtl88e_fill_dummy(bufferptr, &size);
129 124
130 page_no = size / FW_8192C_PAGE_SIZE; 125 pagenums = size / FW_8192C_PAGE_SIZE;
131 remain = size % FW_8192C_PAGE_SIZE; 126 remainsize = size % FW_8192C_PAGE_SIZE;
132 127
133 if (page_no > 8) { 128 if (pagenums > 8) {
134 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 129 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
135 "Page numbers should not greater then 8\n"); 130 "Page numbers should not greater then 8\n");
136 } 131 }
137 132
138 for (page = 0; page < page_no; page++) { 133 for (page = 0; page < pagenums; page++) {
139 offset = page * FW_8192C_PAGE_SIZE; 134 offset = page * FW_8192C_PAGE_SIZE;
140 _rtl88e_fw_page_write(hw, page, (buf_ptr + offset), 135 _rtl88e_fw_page_write(hw, page, (bufferptr + offset),
141 FW_8192C_PAGE_SIZE); 136 FW_8192C_PAGE_SIZE);
142 } 137 }
143 138
144 if (remain) { 139 if (remainsize) {
145 offset = page_no * FW_8192C_PAGE_SIZE; 140 offset = pagenums * FW_8192C_PAGE_SIZE;
146 page = page_no; 141 page = pagenums;
147 _rtl88e_fw_page_write(hw, page, (buf_ptr + offset), remain); 142 _rtl88e_fw_page_write(hw, page, (bufferptr + offset),
143 remainsize);
148 } 144 }
149} 145}
150 146
@@ -199,7 +195,8 @@ exit:
199 return err; 195 return err;
200} 196}
201 197
202int rtl88e_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw) 198int rtl88e_download_fw(struct ieee80211_hw *hw,
199 bool buse_wake_on_wlan_fw)
203{ 200{
204 struct rtl_priv *rtlpriv = rtl_priv(hw); 201 struct rtl_priv *rtlpriv = rtl_priv(hw);
205 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 202 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
@@ -221,8 +218,8 @@ int rtl88e_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
221 if (IS_FW_HEADER_EXIST(pfwheader)) { 218 if (IS_FW_HEADER_EXIST(pfwheader)) {
222 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 219 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
223 "Firmware Version(%d), Signature(%#x), Size(%d)\n", 220 "Firmware Version(%d), Signature(%#x), Size(%d)\n",
224 pfwheader->version, pfwheader->signature, 221 pfwheader->version, pfwheader->signature,
225 (int)sizeof(struct rtl92c_firmware_header)); 222 (int)sizeof(struct rtl92c_firmware_header));
226 223
227 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header); 224 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header);
228 fwsize = fwsize - sizeof(struct rtl92c_firmware_header); 225 fwsize = fwsize - sizeof(struct rtl92c_firmware_header);
@@ -237,9 +234,14 @@ int rtl88e_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
237 _rtl88e_enable_fw_download(hw, false); 234 _rtl88e_enable_fw_download(hw, false);
238 235
239 err = _rtl88e_fw_free_to_go(hw); 236 err = _rtl88e_fw_free_to_go(hw);
237 if (err) {
238 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
239 "Firmware is not ready to run!\n");
240 } else {
241 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
242 "Firmware is ready to run!\n");
243 }
240 244
241 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
242 "Firmware is%s ready to run!\n", err ? " not" : "");
243 return 0; 245 return 0;
244} 246}
245 247
@@ -266,9 +268,9 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
266 bool isfw_read = false; 268 bool isfw_read = false;
267 u8 buf_index = 0; 269 u8 buf_index = 0;
268 bool write_sucess = false; 270 bool write_sucess = false;
269 u8 wait_h2c_limit = 100; 271 u8 wait_h2c_limmit = 100;
270 u8 wait_writeh2c_limit = 100; 272 u8 wait_writeh2c_limit = 100;
271 u8 boxc[4], boxext[2]; 273 u8 boxcontent[4], boxextcontent[4];
272 u32 h2c_waitcounter = 0; 274 u32 h2c_waitcounter = 0;
273 unsigned long flag; 275 unsigned long flag;
274 u8 idx; 276 u8 idx;
@@ -331,18 +333,17 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
331 box_extreg = REG_HMEBOX_EXT_3; 333 box_extreg = REG_HMEBOX_EXT_3;
332 break; 334 break;
333 default: 335 default:
334 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 336 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
335 "switch case not processed\n"); 337 "switch case not process\n");
336 break; 338 break;
337 } 339 }
338
339 isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum); 340 isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
340 while (!isfw_read) { 341 while (!isfw_read) {
341 wait_h2c_limit--; 342 wait_h2c_limmit--;
342 if (wait_h2c_limit == 0) { 343 if (wait_h2c_limmit == 0) {
343 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 344 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
344 "Waiting too long for FW read " 345 "Waiting too long for FW read clear HMEBox(%d)!\n",
345 "clear HMEBox(%d)!\n", boxnum); 346 boxnum);
346 break; 347 break;
347 } 348 }
348 349
@@ -351,20 +352,20 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
351 isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum); 352 isfw_read = _rtl88e_check_fw_read_last_h2c(hw, boxnum);
352 u1b_tmp = rtl_read_byte(rtlpriv, 0x130); 353 u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
353 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 354 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
354 "Waiting for FW read clear HMEBox(%d)!!! " 355 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
355 "0x130 = %2x\n", boxnum, u1b_tmp); 356 boxnum, u1b_tmp);
356 } 357 }
357 358
358 if (!isfw_read) { 359 if (!isfw_read) {
359 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 360 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
360 "Write H2C register BOX[%d] fail!!!!! " 361 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
361 "Fw do not read.\n", boxnum); 362 boxnum);
362 break; 363 break;
363 } 364 }
364 365
365 memset(boxc, 0, sizeof(boxc)); 366 memset(boxcontent, 0, sizeof(boxcontent));
366 memset(boxext, 0, sizeof(boxext)); 367 memset(boxextcontent, 0, sizeof(boxextcontent));
367 boxc[0] = element_id; 368 boxcontent[0] = element_id;
368 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 369 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
369 "Write element_id box_reg(%4x) = %2x\n", 370 "Write element_id box_reg(%4x) = %2x\n",
370 box_reg, element_id); 371 box_reg, element_id);
@@ -373,33 +374,38 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
373 case 1: 374 case 1:
374 case 2: 375 case 2:
375 case 3: 376 case 3:
376 /*boxc[0] &= ~(BIT(7));*/ 377 /*boxcontent[0] &= ~(BIT(7));*/
377 memcpy((u8 *)(boxc) + 1, cmd_b + buf_index, cmd_len); 378 memcpy((u8 *)(boxcontent) + 1,
379 cmd_b + buf_index, cmd_len);
378 380
379 for (idx = 0; idx < 4; idx++) 381 for (idx = 0; idx < 4; idx++) {
380 rtl_write_byte(rtlpriv, box_reg+idx, boxc[idx]); 382 rtl_write_byte(rtlpriv, box_reg + idx,
383 boxcontent[idx]);
384 }
381 break; 385 break;
382 case 4: 386 case 4:
383 case 5: 387 case 5:
384 case 6: 388 case 6:
385 case 7: 389 case 7:
386 /*boxc[0] |= (BIT(7));*/ 390 /*boxcontent[0] |= (BIT(7));*/
387 memcpy((u8 *)(boxext), cmd_b + buf_index+3, cmd_len-3); 391 memcpy((u8 *)(boxextcontent),
388 memcpy((u8 *)(boxc) + 1, cmd_b + buf_index, 3); 392 cmd_b + buf_index+3, cmd_len-3);
393 memcpy((u8 *)(boxcontent) + 1,
394 cmd_b + buf_index, 3);
389 395
390 for (idx = 0; idx < 2; idx++) { 396 for (idx = 0; idx < 2; idx++) {
391 rtl_write_byte(rtlpriv, box_extreg + idx, 397 rtl_write_byte(rtlpriv, box_extreg + idx,
392 boxext[idx]); 398 boxextcontent[idx]);
393 } 399 }
394 400
395 for (idx = 0; idx < 4; idx++) { 401 for (idx = 0; idx < 4; idx++) {
396 rtl_write_byte(rtlpriv, box_reg + idx, 402 rtl_write_byte(rtlpriv, box_reg + idx,
397 boxc[idx]); 403 boxcontent[idx]);
398 } 404 }
399 break; 405 break;
400 default: 406 default:
401 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 407 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
402 "switch case not processed\n"); 408 "switch case not process\n");
403 break; 409 break;
404 } 410 }
405 411
@@ -411,7 +417,7 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
411 417
412 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 418 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
413 "pHalData->last_hmeboxnum = %d\n", 419 "pHalData->last_hmeboxnum = %d\n",
414 rtlhal->last_hmeboxnum); 420 rtlhal->last_hmeboxnum);
415 } 421 }
416 422
417 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 423 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
@@ -422,18 +428,19 @@ static void _rtl88e_fill_h2c_command(struct ieee80211_hw *hw,
422} 428}
423 429
424void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw, 430void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw,
425 u8 element_id, u32 cmd_len, u8 *cmd_b) 431 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
426{ 432{
427 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 433 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
428 u32 tmp_cmdbuf[2]; 434 u32 tmp_cmdbuf[2];
429 435
430 if (rtlhal->fw_ready == false) { 436 if (!rtlhal->fw_ready) {
431 RT_ASSERT(false, "fail H2C cmd - Fw download fail!!!\n"); 437 RT_ASSERT(false,
438 "return H2C cmd because of Fw download fail!!!\n");
432 return; 439 return;
433 } 440 }
434 441
435 memset(tmp_cmdbuf, 0, 8); 442 memset(tmp_cmdbuf, 0, 8);
436 memcpy(tmp_cmdbuf, cmd_b, cmd_len); 443 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
437 _rtl88e_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf); 444 _rtl88e_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
438 445
439 return; 446 return;
@@ -448,7 +455,8 @@ void rtl88e_firmware_selfreset(struct ieee80211_hw *hw)
448 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2)))); 455 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
449 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2))); 456 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
450 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 457 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
451 "8051Reset88E(): 8051 reset success.\n"); 458 "8051Reset88E(): 8051 reset success\n");
459
452} 460}
453 461
454void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode) 462void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
@@ -456,28 +464,29 @@ void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
456 struct rtl_priv *rtlpriv = rtl_priv(hw); 464 struct rtl_priv *rtlpriv = rtl_priv(hw);
457 u8 u1_h2c_set_pwrmode[H2C_88E_PWEMODE_LENGTH] = { 0 }; 465 u8 u1_h2c_set_pwrmode[H2C_88E_PWEMODE_LENGTH] = { 0 };
458 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 466 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
459 u8 power_state = 0; 467 u8 rlbm, power_state = 0;
460
461 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); 468 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
469
462 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0)); 470 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
463 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, 0); 471 rlbm = 0;/*YJ, temp, 120316. FW now not support RLBM=2.*/
472 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
464 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 473 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
465 (rtlpriv->mac80211.p2p) ? 474 (rtlpriv->mac80211.p2p) ? ppsc->smart_ps : 1);
466 ppsc->smart_ps : 1);
467 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode, 475 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
468 ppsc->reg_max_lps_awakeintvl); 476 ppsc->reg_max_lps_awakeintvl);
469 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0); 477 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
470 if (mode == FW_PS_ACTIVE_MODE) 478 if (mode == FW_PS_ACTIVE_MODE)
471 power_state |= FW_PWR_STATE_ACTIVE; 479 power_state |= FW_PWR_STATE_ACTIVE;
472 else 480 else
473 power_state |= FW_PWR_STATE_RF_OFF; 481 power_state |= FW_PWR_STATE_RF_OFF;
482
474 SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state); 483 SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
475 484
476 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 485 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
477 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n", 486 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
478 u1_h2c_set_pwrmode, H2C_88E_PWEMODE_LENGTH); 487 u1_h2c_set_pwrmode, H2C_88E_PWEMODE_LENGTH);
479 rtl88e_fill_h2c_cmd(hw, H2C_88E_SETPWRMODE, H2C_88E_PWEMODE_LENGTH, 488 rtl88e_fill_h2c_cmd(hw, H2C_88E_SETPWRMODE,
480 u1_h2c_set_pwrmode); 489 H2C_88E_PWEMODE_LENGTH, u1_h2c_set_pwrmode);
481} 490}
482 491
483void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus) 492void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
@@ -499,39 +508,9 @@ void rtl88e_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
499 SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid); 508 SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
500 SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0); 509 SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
501 510
502 rtl88e_fill_h2c_cmd(hw, H2C_88E_AP_OFFLOAD, H2C_88E_AP_OFFLOAD_LENGTH, 511 rtl88e_fill_h2c_cmd(hw, H2C_88E_AP_OFFLOAD,
503 u1_apoffload_parm); 512 H2C_88E_AP_OFFLOAD_LENGTH, u1_apoffload_parm);
504}
505 513
506static bool _rtl88e_cmd_send_packet(struct ieee80211_hw *hw,
507 struct sk_buff *skb)
508{
509 struct rtl_priv *rtlpriv = rtl_priv(hw);
510 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
511 struct rtl8192_tx_ring *ring;
512 struct rtl_tx_desc *pdesc;
513 struct sk_buff *pskb = NULL;
514 unsigned long flags;
515
516 ring = &rtlpci->tx_ring[BEACON_QUEUE];
517
518 pskb = __skb_dequeue(&ring->queue);
519 if (pskb)
520 kfree_skb(pskb);
521
522 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
523
524 pdesc = &ring->desc[0];
525
526 rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
527
528 __skb_queue_tail(&ring->queue, skb);
529
530 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
531
532 rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
533
534 return true;
535} 514}
536 515
537#define BEACON_PG 0 /* ->1 */ 516#define BEACON_PG 0 /* ->1 */
@@ -656,14 +635,15 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
656 struct rtl_priv *rtlpriv = rtl_priv(hw); 635 struct rtl_priv *rtlpriv = rtl_priv(hw);
657 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 636 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
658 struct sk_buff *skb = NULL; 637 struct sk_buff *skb = NULL;
659
660 u32 totalpacketlen; 638 u32 totalpacketlen;
661 u8 u1RsvdPageLoc[5] = { 0 }; 639 bool rtstatus;
662 640 u8 u1rsvdpageloc[5] = { 0 };
641 bool b_dlok = false;
663 u8 *beacon; 642 u8 *beacon;
664 u8 *pspoll; 643 u8 *p_pspoll;
665 u8 *nullfunc; 644 u8 *nullfunc;
666 u8 *probersp; 645 u8 *p_probersp;
646
667 /*--------------------------------------------------------- 647 /*---------------------------------------------------------
668 * (1) beacon 648 * (1) beacon
669 *--------------------------------------------------------- 649 *---------------------------------------------------------
@@ -676,12 +656,12 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
676 * (2) ps-poll 656 * (2) ps-poll
677 *-------------------------------------------------------- 657 *--------------------------------------------------------
678 */ 658 */
679 pspoll = &reserved_page_packet[PSPOLL_PG * 128]; 659 p_pspoll = &reserved_page_packet[PSPOLL_PG * 128];
680 SET_80211_PS_POLL_AID(pspoll, (mac->assoc_id | 0xc000)); 660 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
681 SET_80211_PS_POLL_BSSID(pspoll, mac->bssid); 661 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
682 SET_80211_PS_POLL_TA(pspoll, mac->mac_addr); 662 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
683 663
684 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); 664 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
685 665
686 /*-------------------------------------------------------- 666 /*--------------------------------------------------------
687 * (3) null data 667 * (3) null data
@@ -692,18 +672,18 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
692 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr); 672 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
693 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid); 673 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
694 674
695 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG); 675 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
696 676
697 /*--------------------------------------------------------- 677 /*---------------------------------------------------------
698 * (4) probe response 678 * (4) probe response
699 *---------------------------------------------------------- 679 *----------------------------------------------------------
700 */ 680 */
701 probersp = &reserved_page_packet[PROBERSP_PG * 128]; 681 p_probersp = &reserved_page_packet[PROBERSP_PG * 128];
702 SET_80211_HDR_ADDRESS1(probersp, mac->bssid); 682 SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid);
703 SET_80211_HDR_ADDRESS2(probersp, mac->mac_addr); 683 SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr);
704 SET_80211_HDR_ADDRESS3(probersp, mac->bssid); 684 SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid);
705 685
706 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG); 686 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1rsvdpageloc, PROBERSP_PG);
707 687
708 totalpacketlen = TOTAL_RESERVED_PKT_LEN; 688 totalpacketlen = TOTAL_RESERVED_PKT_LEN;
709 689
@@ -712,33 +692,36 @@ void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
712 &reserved_page_packet[0], totalpacketlen); 692 &reserved_page_packet[0], totalpacketlen);
713 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 693 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
714 "rtl88e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n", 694 "rtl88e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
715 u1RsvdPageLoc, 3); 695 u1rsvdpageloc, 3);
716 696
717 skb = dev_alloc_skb(totalpacketlen); 697 skb = dev_alloc_skb(totalpacketlen);
718 if (!skb)
719 return;
720 kmemleak_not_leak(skb);
721 memcpy(skb_put(skb, totalpacketlen), 698 memcpy(skb_put(skb, totalpacketlen),
722 &reserved_page_packet, totalpacketlen); 699 &reserved_page_packet, totalpacketlen);
723 700
724 if (_rtl88e_cmd_send_packet(hw, skb)) { 701 rtstatus = rtl_cmd_send_packet(hw, skb);
702
703 if (rtstatus)
704 b_dlok = true;
705
706 if (b_dlok) {
725 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 707 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
726 "Set RSVD page location to Fw.\n"); 708 "Set RSVD page location to Fw.\n");
727 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 709 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
728 "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 3); 710 "H2C_RSVDPAGE:\n", u1rsvdpageloc, 3);
729 rtl88e_fill_h2c_cmd(hw, H2C_88E_RSVDPAGE, 711 rtl88e_fill_h2c_cmd(hw, H2C_88E_RSVDPAGE,
730 sizeof(u1RsvdPageLoc), u1RsvdPageLoc); 712 sizeof(u1rsvdpageloc), u1rsvdpageloc);
731 } else 713 } else
732 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 714 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
733 "Set RSVD page location to Fw FAIL!!!!!!.\n"); 715 "Set RSVD page location to Fw FAIL!!!!!!.\n");
734} 716}
735 717
736/*Shoud check FW support p2p or not.*/ 718/*Should check FW support p2p or not.*/
737static void rtl88e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow) 719static void rtl88e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
738{ 720{
739 u8 u1_ctwindow_period[1] = {ctwindow}; 721 u8 u1_ctwindow_period[1] = { ctwindow};
740 722
741 rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_CTW_CMD, 1, u1_ctwindow_period); 723 rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);
724
742} 725}
743 726
744void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) 727void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
@@ -755,7 +738,7 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
755 switch (p2p_ps_state) { 738 switch (p2p_ps_state) {
756 case P2P_PS_DISABLE: 739 case P2P_PS_DISABLE:
757 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); 740 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
758 memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t)); 741 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
759 break; 742 break;
760 case P2P_PS_ENABLE: 743 case P2P_PS_ENABLE:
761 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); 744 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
@@ -765,8 +748,9 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
765 ctwindow = p2pinfo->ctwindow; 748 ctwindow = p2pinfo->ctwindow;
766 rtl88e_set_p2p_ctw_period_cmd(hw, ctwindow); 749 rtl88e_set_p2p_ctw_period_cmd(hw, ctwindow);
767 } 750 }
751
768 /* hw only support 2 set of NoA */ 752 /* hw only support 2 set of NoA */
769 for (i = 0; i < p2pinfo->noa_num; i++) { 753 for (i = 0 ; i < p2pinfo->noa_num; i++) {
770 /* To control the register setting for which NOA*/ 754 /* To control the register setting for which NOA*/
771 rtl_write_byte(rtlpriv, 0x5cf, (i << 4)); 755 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
772 if (i == 0) 756 if (i == 0)
@@ -785,7 +769,7 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
785 769
786 start_time = p2pinfo->noa_start_time[i]; 770 start_time = p2pinfo->noa_start_time[i];
787 if (p2pinfo->noa_count_type[i] != 1) { 771 if (p2pinfo->noa_count_type[i] != 1) {
788 while (start_time <= (tsf_low + (50 * 1024))) { 772 while (start_time <= (tsf_low+(50*1024))) {
789 start_time += p2pinfo->noa_interval[i]; 773 start_time += p2pinfo->noa_interval[i];
790 if (p2pinfo->noa_count_type[i] != 255) 774 if (p2pinfo->noa_count_type[i] != 255)
791 p2pinfo->noa_count_type[i]--; 775 p2pinfo->noa_count_type[i]--;
@@ -804,7 +788,7 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
804 788
805 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) { 789 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
806 p2p_ps_offload->role = 1; 790 p2p_ps_offload->role = 1;
807 p2p_ps_offload->allstasleep = 0; 791 p2p_ps_offload->allstasleep = -1;
808 } else { 792 } else {
809 p2p_ps_offload->role = 0; 793 p2p_ps_offload->role = 0;
810 } 794 }
@@ -827,4 +811,5 @@ void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
827 811
828 rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_OFFLOAD, 1, 812 rtl88e_fill_h2c_cmd(hw, H2C_88E_P2P_PS_OFFLOAD, 1,
829 (u8 *)p2p_ps_offload); 813 (u8 *)p2p_ps_offload);
814
830} 815}
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/fw.h b/drivers/net/wireless/rtlwifi/rtl8188ee/fw.h
index 854a9875cd5f..05e944e451f4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/fw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/fw.h
@@ -55,10 +55,11 @@
55#define H2C_88E_AOAC_RSVDPAGE_LOC_LEN 7 55#define H2C_88E_AOAC_RSVDPAGE_LOC_LEN 7
56 56
57/* Fw PS state for RPWM. 57/* Fw PS state for RPWM.
58 * BIT[2:0] = HW state 58*BIT[2:0] = HW state
59 * BIT[3] = Protocol PS state, 1: register active state, 0: register sleep state 59*BIT[3] = Protocol PS state,
60 * BIT[4] = sub-state 60*1: register active state , 0: register sleep state
61 */ 61*BIT[4] = sub-state
62*/
62#define FW_PS_GO_ON BIT(0) 63#define FW_PS_GO_ON BIT(0)
63#define FW_PS_TX_NULL BIT(1) 64#define FW_PS_TX_NULL BIT(1)
64#define FW_PS_RF_ON BIT(2) 65#define FW_PS_RF_ON BIT(2)
@@ -98,10 +99,13 @@
98#define FW_PS_STATE_S2 (FW_PS_RF_OFF) 99#define FW_PS_STATE_S2 (FW_PS_RF_OFF)
99#define FW_PS_STATE_S3 (FW_PS_ALL_ON) 100#define FW_PS_STATE_S3 (FW_PS_ALL_ON)
100#define FW_PS_STATE_S4 ((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON)) 101#define FW_PS_STATE_S4 ((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))
101 102/* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/
102#define FW_PS_STATE_ALL_ON_88E (FW_PS_CLOCK_ON) 103#define FW_PS_STATE_ALL_ON_88E (FW_PS_CLOCK_ON)
104/* (FW_PS_RF_ON)*/
103#define FW_PS_STATE_RF_ON_88E (FW_PS_CLOCK_ON) 105#define FW_PS_STATE_RF_ON_88E (FW_PS_CLOCK_ON)
104#define FW_PS_STATE_RF_OFF_88E (FW_PS_CLOCK_ON) 106/* 0x0*/
107#define FW_PS_STATE_RF_OFF_88E (FW_PS_CLOCK_ON)
108/* (FW_PS_STATE_RF_OFF)*/
105#define FW_PS_STATE_RF_OFF_LOW_PWR_88E (FW_PS_CLOCK_OFF) 109#define FW_PS_STATE_RF_OFF_LOW_PWR_88E (FW_PS_CLOCK_OFF)
106 110
107#define FW_PS_STATE_ALL_ON_92C (FW_PS_STATE_S4) 111#define FW_PS_STATE_ALL_ON_92C (FW_PS_STATE_S4)
@@ -146,7 +150,7 @@ struct rtl92c_firmware_header {
146 u32 rsvd5; 150 u32 rsvd5;
147}; 151};
148 152
149enum rtl8192c_h2c_cmd { 153enum rtl8188e_h2c_cmd {
150 H2C_88E_RSVDPAGE = 0, 154 H2C_88E_RSVDPAGE = 0,
151 H2C_88E_JOINBSSRPT = 1, 155 H2C_88E_JOINBSSRPT = 1,
152 H2C_88E_SCAN = 2, 156 H2C_88E_SCAN = 2,
@@ -175,7 +179,7 @@ enum rtl8192c_h2c_cmd {
175 H2C_88E_AOAC_GLOBAL_INFO = 0x82, 179 H2C_88E_AOAC_GLOBAL_INFO = 0x82,
176 H2C_88E_AOAC_RSVDPAGE = 0x83, 180 H2C_88E_AOAC_RSVDPAGE = 0x83,
177#endif 181#endif
178 /* Not defined in new 88E H2C CMD Format */ 182 /*Not defined in new 88E H2C CMD Format*/
179 H2C_88E_RA_MASK, 183 H2C_88E_RA_MASK,
180 H2C_88E_SELECTIVE_SUSPEND_ROF_CMD, 184 H2C_88E_SELECTIVE_SUSPEND_ROF_CMD,
181 H2C_88E_P2P_PS_MODE, 185 H2C_88E_P2P_PS_MODE,
@@ -289,13 +293,12 @@ enum rtl8192c_h2c_cmd {
289int rtl88e_download_fw(struct ieee80211_hw *hw, 293int rtl88e_download_fw(struct ieee80211_hw *hw,
290 bool buse_wake_on_wlan_fw); 294 bool buse_wake_on_wlan_fw);
291void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, 295void rtl88e_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
292 u32 cmd_len, u8 *p_cmdbuffer); 296 u32 cmd_len, u8 *cmdbuffer);
293void rtl88e_firmware_selfreset(struct ieee80211_hw *hw); 297void rtl88e_firmware_selfreset(struct ieee80211_hw *hw);
294void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); 298void rtl88e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
295void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, 299void rtl88e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
296 u8 mstatus); 300void rtl88e_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
297void rtl88e_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw, u8 enable); 301 u8 ap_offload_enable);
298void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); 302void rtl88e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
299void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); 303void rtl88e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
300
301#endif 304#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
index d840ad7bdf65..f2b9713c456e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/hw.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -93,7 +89,9 @@ static void _rtl88ee_return_beacon_queue_skb(struct ieee80211_hw *hw)
93 struct rtl_priv *rtlpriv = rtl_priv(hw); 89 struct rtl_priv *rtlpriv = rtl_priv(hw);
94 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 90 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
95 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; 91 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
92 unsigned long flags;
96 93
94 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
97 while (skb_queue_len(&ring->queue)) { 95 while (skb_queue_len(&ring->queue)) {
98 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; 96 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
99 struct sk_buff *skb = __skb_dequeue(&ring->queue); 97 struct sk_buff *skb = __skb_dequeue(&ring->queue);
@@ -105,6 +103,7 @@ static void _rtl88ee_return_beacon_queue_skb(struct ieee80211_hw *hw)
105 kfree_skb(skb); 103 kfree_skb(skb);
106 ring->idx = (ring->idx + 1) % ring->entries; 104 ring->idx = (ring->idx + 1) % ring->entries;
107 } 105 }
106 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
108} 107}
109 108
110static void _rtl88ee_disable_bcn_sub_func(struct ieee80211_hw *hw) 109static void _rtl88ee_disable_bcn_sub_func(struct ieee80211_hw *hw)
@@ -113,16 +112,16 @@ static void _rtl88ee_disable_bcn_sub_func(struct ieee80211_hw *hw)
113} 112}
114 113
115static void _rtl88ee_set_fw_clock_on(struct ieee80211_hw *hw, 114static void _rtl88ee_set_fw_clock_on(struct ieee80211_hw *hw,
116 u8 rpwm_val, bool need_turn_off_ckk) 115 u8 rpwm_val, bool b_need_turn_off_ckk)
117{ 116{
118 struct rtl_priv *rtlpriv = rtl_priv(hw); 117 struct rtl_priv *rtlpriv = rtl_priv(hw);
119 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 118 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
120 bool support_remote_wake_up; 119 bool b_support_remote_wake_up;
121 u32 count = 0, isr_regaddr, content; 120 u32 count = 0, isr_regaddr, content;
122 bool schedule_timer = need_turn_off_ckk; 121 bool schedule_timer = b_need_turn_off_ckk;
123
124 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 122 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
125 (u8 *)(&support_remote_wake_up)); 123 (u8 *)(&b_support_remote_wake_up));
124
126 if (!rtlhal->fw_ready) 125 if (!rtlhal->fw_ready)
127 return; 126 return;
128 if (!rtlpriv->psc.fw_current_inpsmode) 127 if (!rtlpriv->psc.fw_current_inpsmode)
@@ -133,8 +132,9 @@ static void _rtl88ee_set_fw_clock_on(struct ieee80211_hw *hw,
133 if (rtlhal->fw_clk_change_in_progress) { 132 if (rtlhal->fw_clk_change_in_progress) {
134 while (rtlhal->fw_clk_change_in_progress) { 133 while (rtlhal->fw_clk_change_in_progress) {
135 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 134 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
135 count++;
136 udelay(100); 136 udelay(100);
137 if (++count > 1000) 137 if (count > 1000)
138 return; 138 return;
139 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 139 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
140 } 140 }
@@ -173,6 +173,7 @@ static void _rtl88ee_set_fw_clock_on(struct ieee80211_hw *hw,
173 mod_timer(&rtlpriv->works.fw_clockoff_timer, 173 mod_timer(&rtlpriv->works.fw_clockoff_timer,
174 jiffies + MSECS(10)); 174 jiffies + MSECS(10));
175 } 175 }
176
176 } else { 177 } else {
177 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 178 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
178 rtlhal->fw_clk_change_in_progress = false; 179 rtlhal->fw_clk_change_in_progress = false;
@@ -247,11 +248,9 @@ static void _rtl88ee_set_fw_ps_rf_on(struct ieee80211_hw *hw)
247static void _rtl88ee_set_fw_ps_rf_off_low_power(struct ieee80211_hw *hw) 248static void _rtl88ee_set_fw_ps_rf_off_low_power(struct ieee80211_hw *hw)
248{ 249{
249 u8 rpwm_val = 0; 250 u8 rpwm_val = 0;
250
251 rpwm_val |= FW_PS_STATE_RF_OFF_LOW_PWR_88E; 251 rpwm_val |= FW_PS_STATE_RF_OFF_LOW_PWR_88E;
252 _rtl88ee_set_fw_clock_off(hw, rpwm_val); 252 _rtl88ee_set_fw_clock_off(hw, rpwm_val);
253} 253}
254
255void rtl88ee_fw_clk_off_timer_callback(unsigned long data) 254void rtl88ee_fw_clk_off_timer_callback(unsigned long data)
256{ 255{
257 struct ieee80211_hw *hw = (struct ieee80211_hw *)data; 256 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
@@ -325,23 +324,23 @@ void rtl88ee_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
325 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state; 324 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
326 break; 325 break;
327 case HW_VAR_FWLPS_RF_ON:{ 326 case HW_VAR_FWLPS_RF_ON:{
328 enum rf_pwrstate rfstate; 327 enum rf_pwrstate rfstate;
329 u32 val_rcr; 328 u32 val_rcr;
330 329
331 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, 330 rtlpriv->cfg->ops->get_hw_reg(hw,
332 (u8 *)(&rfstate)); 331 HW_VAR_RF_STATE,
333 if (rfstate == ERFOFF) { 332 (u8 *)(&rfstate));
333 if (rfstate == ERFOFF) {
334 *((bool *)(val)) = true;
335 } else {
336 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
337 val_rcr &= 0x00070000;
338 if (val_rcr)
339 *((bool *)(val)) = false;
340 else
334 *((bool *)(val)) = true; 341 *((bool *)(val)) = true;
335 } else {
336 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
337 val_rcr &= 0x00070000;
338 if (val_rcr)
339 *((bool *)(val)) = false;
340 else
341 *((bool *)(val)) = true;
342 }
343 break;
344 } 342 }
343 break; }
345 case HW_VAR_FW_PSMODE_STATUS: 344 case HW_VAR_FW_PSMODE_STATUS:
346 *((bool *)(val)) = ppsc->fw_current_inpsmode; 345 *((bool *)(val)) = ppsc->fw_current_inpsmode;
347 break; 346 break;
@@ -373,25 +372,32 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
373 372
374 switch (variable) { 373 switch (variable) {
375 case HW_VAR_ETHER_ADDR: 374 case HW_VAR_ETHER_ADDR:
376 for (idx = 0; idx < ETH_ALEN; idx++) 375 for (idx = 0; idx < ETH_ALEN; idx++) {
377 rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]); 376 rtl_write_byte(rtlpriv, (REG_MACID + idx),
377 val[idx]);
378 }
378 break; 379 break;
379 case HW_VAR_BASIC_RATE:{ 380 case HW_VAR_BASIC_RATE:{
380 u16 rate_cfg = ((u16 *)val)[0]; 381 u16 b_rate_cfg = ((u16 *)val)[0];
381 u8 rate_index = 0; 382 u8 rate_index = 0;
382 rate_cfg = rate_cfg & 0x15f; 383 b_rate_cfg = b_rate_cfg & 0x15f;
383 rate_cfg |= 0x01; 384 b_rate_cfg |= 0x01;
384 rtl_write_byte(rtlpriv, REG_RRSR, rate_cfg & 0xff); 385 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
385 rtl_write_byte(rtlpriv, REG_RRSR + 1, (rate_cfg >> 8) & 0xff); 386 rtl_write_byte(rtlpriv, REG_RRSR + 1,
386 while (rate_cfg > 0x1) { 387 (b_rate_cfg >> 8) & 0xff);
387 rate_cfg = (rate_cfg >> 1); 388 while (b_rate_cfg > 0x1) {
389 b_rate_cfg = (b_rate_cfg >> 1);
388 rate_index++; 390 rate_index++;
389 } 391 }
390 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, rate_index); 392 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL,
391 break; } 393 rate_index);
394 break;
395 }
392 case HW_VAR_BSSID: 396 case HW_VAR_BSSID:
393 for (idx = 0; idx < ETH_ALEN; idx++) 397 for (idx = 0; idx < ETH_ALEN; idx++) {
394 rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]); 398 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
399 val[idx]);
400 }
395 break; 401 break;
396 case HW_VAR_SIFS: 402 case HW_VAR_SIFS:
397 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]); 403 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
@@ -401,7 +407,8 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
401 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]); 407 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
402 408
403 if (!mac->ht_enable) 409 if (!mac->ht_enable)
404 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 0x0e0e); 410 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
411 0x0e0e);
405 else 412 else
406 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 413 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
407 *((u16 *)val)); 414 *((u16 *)val));
@@ -418,17 +425,20 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
418 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, 425 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
419 &e_aci); 426 &e_aci);
420 } 427 }
421 break; } 428 break;
429 }
422 case HW_VAR_ACK_PREAMBLE:{ 430 case HW_VAR_ACK_PREAMBLE:{
423 u8 reg_tmp; 431 u8 reg_tmp;
424 u8 short_preamble = (bool)*val; 432 u8 short_preamble = (bool)*val;
425 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2); 433 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
426 if (short_preamble) { 434 if (short_preamble) {
427 reg_tmp |= 0x02; 435 reg_tmp |= 0x02;
428 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp); 436 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL +
437 2, reg_tmp);
429 } else { 438 } else {
430 reg_tmp |= 0xFD; 439 reg_tmp |= 0xFD;
431 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp); 440 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL +
441 2, reg_tmp);
432 } 442 }
433 break; } 443 break; }
434 case HW_VAR_WPA_CONFIG: 444 case HW_VAR_WPA_CONFIG:
@@ -446,7 +456,8 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
446 min_spacing_to_set = sec_min_space; 456 min_spacing_to_set = sec_min_space;
447 457
448 mac->min_space_cfg = ((mac->min_space_cfg & 458 mac->min_space_cfg = ((mac->min_space_cfg &
449 0xf8) | min_spacing_to_set); 459 0xf8) |
460 min_spacing_to_set);
450 461
451 *val = min_spacing_to_set; 462 *val = min_spacing_to_set;
452 463
@@ -470,35 +481,44 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
470 481
471 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 482 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
472 mac->min_space_cfg); 483 mac->min_space_cfg);
473 break; } 484 break;
485 }
474 case HW_VAR_AMPDU_FACTOR:{ 486 case HW_VAR_AMPDU_FACTOR:{
475 u8 regtoset_normal[4] = { 0x41, 0xa8, 0x72, 0xb9 }; 487 u8 regtoset_normal[4] = { 0x41, 0xa8, 0x72, 0xb9 };
476 u8 factor; 488 u8 factor_toset;
477 u8 *reg = NULL; 489 u8 *p_regtoset = NULL;
478 u8 id = 0; 490 u8 index = 0;
479 491
480 reg = regtoset_normal; 492 p_regtoset = regtoset_normal;
481 493
482 factor = *val; 494 factor_toset = *val;
483 if (factor <= 3) { 495 if (factor_toset <= 3) {
484 factor = (1 << (factor + 2)); 496 factor_toset = (1 << (factor_toset + 2));
485 if (factor > 0xf) 497 if (factor_toset > 0xf)
486 factor = 0xf; 498 factor_toset = 0xf;
487 499
488 for (id = 0; id < 4; id++) { 500 for (index = 0; index < 4; index++) {
489 if ((reg[id] & 0xf0) > (factor << 4)) 501 if ((p_regtoset[index] & 0xf0) >
490 reg[id] = (reg[id] & 0x0f) | 502 (factor_toset << 4))
491 (factor << 4); 503 p_regtoset[index] =
504 (p_regtoset[index] & 0x0f) |
505 (factor_toset << 4);
506
507 if ((p_regtoset[index] & 0x0f) >
508 factor_toset)
509 p_regtoset[index] =
510 (p_regtoset[index] & 0xf0) |
511 (factor_toset);
512
513 rtl_write_byte(rtlpriv,
514 (REG_AGGLEN_LMT + index),
515 p_regtoset[index]);
492 516
493 if ((reg[id] & 0x0f) > factor)
494 reg[id] = (reg[id] & 0xf0) | (factor);
495
496 rtl_write_byte(rtlpriv, (REG_AGGLEN_LMT + id),
497 reg[id]);
498 } 517 }
499 518
500 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 519 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
501 "Set HW_VAR_AMPDU_FACTOR: %#x\n", factor); 520 "Set HW_VAR_AMPDU_FACTOR: %#x\n",
521 factor_toset);
502 } 522 }
503 break; } 523 break; }
504 case HW_VAR_AC_PARAM:{ 524 case HW_VAR_AC_PARAM:{
@@ -506,7 +526,8 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
506 rtl88e_dm_init_edca_turbo(hw); 526 rtl88e_dm_init_edca_turbo(hw);
507 527
508 if (rtlpci->acm_method != EACMWAY2_SW) 528 if (rtlpci->acm_method != EACMWAY2_SW)
509 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL, 529 rtlpriv->cfg->ops->set_hw_reg(hw,
530 HW_VAR_ACM_CTRL,
510 &e_aci); 531 &e_aci);
511 break; } 532 break; }
512 case HW_VAR_ACM_CTRL:{ 533 case HW_VAR_ACM_CTRL:{
@@ -516,7 +537,8 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
516 u8 acm = p_aci_aifsn->f.acm; 537 u8 acm = p_aci_aifsn->f.acm;
517 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL); 538 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
518 539
519 acm_ctrl = acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1); 540 acm_ctrl = acm_ctrl |
541 ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
520 542
521 if (acm) { 543 if (acm) {
522 switch (e_aci) { 544 switch (e_aci) {
@@ -609,66 +631,76 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
609 _rtl88ee_fwlps_enter(hw); 631 _rtl88ee_fwlps_enter(hw);
610 else 632 else
611 _rtl88ee_fwlps_leave(hw); 633 _rtl88ee_fwlps_leave(hw);
634
612 break; } 635 break; }
613 case HW_VAR_H2C_FW_JOINBSSRPT:{ 636 case HW_VAR_H2C_FW_JOINBSSRPT:{
614 u8 mstatus = *val; 637 u8 mstatus = *val;
615 u8 tmp, tmp_reg422, uval; 638 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
616 u8 count = 0, dlbcn_count = 0; 639 u8 count = 0, dlbcn_count = 0;
617 bool recover = false; 640 bool b_recover = false;
618 641
619 if (mstatus == RT_MEDIA_CONNECT) { 642 if (mstatus == RT_MEDIA_CONNECT) {
620 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL); 643 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
644 NULL);
621 645
622 tmp = rtl_read_byte(rtlpriv, REG_CR + 1); 646 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
623 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp | BIT(0))); 647 rtl_write_byte(rtlpriv, REG_CR + 1,
648 (tmp_regcr | BIT(0)));
624 649
625 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3)); 650 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
626 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(4), 0); 651 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
627 652
628 tmp_reg422 = rtl_read_byte(rtlpriv, 653 tmp_reg422 =
629 REG_FWHW_TXQ_CTRL + 2); 654 rtl_read_byte(rtlpriv,
655 REG_FWHW_TXQ_CTRL + 2);
630 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, 656 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
631 tmp_reg422 & (~BIT(6))); 657 tmp_reg422 & (~BIT(6)));
632 if (tmp_reg422 & BIT(6)) 658 if (tmp_reg422 & BIT(6))
633 recover = true; 659 b_recover = true;
634 660
635 do { 661 do {
636 uval = rtl_read_byte(rtlpriv, REG_TDECTRL+2); 662 bcnvalid_reg = rtl_read_byte(rtlpriv,
663 REG_TDECTRL+2);
637 rtl_write_byte(rtlpriv, REG_TDECTRL+2, 664 rtl_write_byte(rtlpriv, REG_TDECTRL+2,
638 (uval | BIT(0))); 665 (bcnvalid_reg | BIT(0)));
639 _rtl88ee_return_beacon_queue_skb(hw); 666 _rtl88ee_return_beacon_queue_skb(hw);
640 667
641 rtl88e_set_fw_rsvdpagepkt(hw, 0); 668 rtl88e_set_fw_rsvdpagepkt(hw, 0);
642 uval = rtl_read_byte(rtlpriv, REG_TDECTRL+2); 669 bcnvalid_reg = rtl_read_byte(rtlpriv,
670 REG_TDECTRL+2);
643 count = 0; 671 count = 0;
644 while (!(uval & BIT(0)) && count < 20) { 672 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
645 count++; 673 count++;
646 udelay(10); 674 udelay(10);
647 uval = rtl_read_byte(rtlpriv, 675 bcnvalid_reg =
648 REG_TDECTRL+2); 676 rtl_read_byte(rtlpriv, REG_TDECTRL+2);
649 } 677 }
650 dlbcn_count++; 678 dlbcn_count++;
651 } while (!(uval & BIT(0)) && dlbcn_count < 5); 679 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
652 680
653 if (uval & BIT(0)) 681 if (bcnvalid_reg & BIT(0))
654 rtl_write_byte(rtlpriv, REG_TDECTRL+2, BIT(0)); 682 rtl_write_byte(rtlpriv, REG_TDECTRL+2, BIT(0));
655 683
656 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0); 684 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
657 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(4)); 685 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
658 686
659 if (recover) { 687 if (b_recover) {
660 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, 688 rtl_write_byte(rtlpriv,
689 REG_FWHW_TXQ_CTRL + 2,
661 tmp_reg422); 690 tmp_reg422);
662 } 691 }
663 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp & ~(BIT(0)))); 692
693 rtl_write_byte(rtlpriv, REG_CR + 1,
694 (tmp_regcr & ~(BIT(0))));
664 } 695 }
665 rtl88e_set_fw_joinbss_report_cmd(hw, *val); 696 rtl88e_set_fw_joinbss_report_cmd(hw, (*(u8 *)val));
666 break; } 697 break; }
667 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: 698 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
668 rtl88e_set_p2p_ps_offload_cmd(hw, *val); 699 rtl88e_set_p2p_ps_offload_cmd(hw, *val);
669 break; 700 break;
670 case HW_VAR_AID:{ 701 case HW_VAR_AID:{
671 u16 u2btmp; 702 u16 u2btmp;
703
672 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT); 704 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
673 u2btmp &= 0xC000; 705 u2btmp &= 0xC000;
674 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp | 706 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
@@ -677,21 +709,29 @@ void rtl88ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
677 case HW_VAR_CORRECT_TSF:{ 709 case HW_VAR_CORRECT_TSF:{
678 u8 btype_ibss = *val; 710 u8 btype_ibss = *val;
679 711
680 if (btype_ibss == true) 712 if (btype_ibss)
681 _rtl88ee_stop_tx_beacon(hw); 713 _rtl88ee_stop_tx_beacon(hw);
682 714
683 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3)); 715 _rtl88ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
684 716
685 rtl_write_dword(rtlpriv, REG_TSFTR, 717 rtl_write_dword(rtlpriv, REG_TSFTR,
686 (u32) (mac->tsf & 0xffffffff)); 718 (u32)(mac->tsf & 0xffffffff));
687 rtl_write_dword(rtlpriv, REG_TSFTR + 4, 719 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
688 (u32) ((mac->tsf >> 32) & 0xffffffff)); 720 (u32)((mac->tsf >> 32) & 0xffffffff));
689 721
690 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0); 722 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
691 723
692 if (btype_ibss == true) 724 if (btype_ibss)
693 _rtl88ee_resume_tx_beacon(hw); 725 _rtl88ee_resume_tx_beacon(hw);
694 break; } 726 break; }
727 case HW_VAR_KEEP_ALIVE: {
728 u8 array[2];
729
730 array[0] = 0xff;
731 array[1] = *((u8 *)val);
732 rtl88e_fill_h2c_cmd(hw, H2C_88E_KEEP_ALIVE_CTRL,
733 2, array);
734 break; }
695 default: 735 default:
696 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 736 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
697 "switch case not process %x\n", variable); 737 "switch case not process %x\n", variable);
@@ -740,7 +780,7 @@ static bool _rtl88ee_llt_table_init(struct ieee80211_hw *hw)
740 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x01); 780 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x01);
741 rtl_write_dword(rtlpriv, REG_RQPN, 0x80730d29); 781 rtl_write_dword(rtlpriv, REG_RQPN, 0x80730d29);
742 782
743 783 /*0x2600 MaxRxBuff=10k-max(TxReportSize(64*8), WOLPattern(16*24)) */
744 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, (0x25FF0000 | txpktbuf_bndy)); 784 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, (0x25FF0000 | txpktbuf_bndy));
745 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy); 785 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
746 786
@@ -797,10 +837,11 @@ static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
797 struct rtl_priv *rtlpriv = rtl_priv(hw); 837 struct rtl_priv *rtlpriv = rtl_priv(hw);
798 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 838 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
799 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 839 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
840
800 u8 bytetmp; 841 u8 bytetmp;
801 u16 wordtmp; 842 u16 wordtmp;
802 843
803 /*Disable XTAL OUTPUT for power saving. YJ, add, 111206. */ 844 /*Disable XTAL OUTPUT for power saving. YJ,add,111206. */
804 bytetmp = rtl_read_byte(rtlpriv, REG_XCK_OUT_CTRL) & (~BIT(0)); 845 bytetmp = rtl_read_byte(rtlpriv, REG_XCK_OUT_CTRL) & (~BIT(0));
805 rtl_write_byte(rtlpriv, REG_XCK_OUT_CTRL, bytetmp); 846 rtl_write_byte(rtlpriv, REG_XCK_OUT_CTRL, bytetmp);
806 /*Auto Power Down to CHIP-off State*/ 847 /*Auto Power Down to CHIP-off State*/
@@ -811,7 +852,7 @@ static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
811 /* HW Power on sequence */ 852 /* HW Power on sequence */
812 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, 853 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
813 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, 854 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
814 Rtl8188E_NIC_ENABLE_FLOW)) { 855 RTL8188EE_NIC_ENABLE_FLOW)) {
815 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 856 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
816 "init MAC Fail as rtl_hal_pwrseqcmdparsing\n"); 857 "init MAC Fail as rtl_hal_pwrseqcmdparsing\n");
817 return false; 858 return false;
@@ -853,8 +894,6 @@ static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
853 return false; 894 return false;
854 } 895 }
855 } 896 }
856
857
858 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff); 897 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
859 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff); 898 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
860 899
@@ -889,9 +928,8 @@ static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
889 DMA_BIT_MASK(32)); 928 DMA_BIT_MASK(32));
890 929
891 /* if we want to support 64 bit DMA, we should set it here, 930 /* if we want to support 64 bit DMA, we should set it here,
892 * but at the moment we do not support 64 bit DMA 931 * but now we do not support 64 bit DMA
893 */ 932 */
894
895 rtl_write_dword(rtlpriv, REG_INT_MIG, 0); 933 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
896 934
897 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0); 935 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
@@ -910,8 +948,12 @@ static bool _rtl88ee_init_mac(struct ieee80211_hw *hw)
910static void _rtl88ee_hw_configure(struct ieee80211_hw *hw) 948static void _rtl88ee_hw_configure(struct ieee80211_hw *hw)
911{ 949{
912 struct rtl_priv *rtlpriv = rtl_priv(hw); 950 struct rtl_priv *rtlpriv = rtl_priv(hw);
913 u32 reg_prsr; 951 u8 reg_bw_opmode;
952 u32 reg_ratr, reg_prsr;
914 953
954 reg_bw_opmode = BW_OPMODE_20MHZ;
955 reg_ratr = RATE_ALL_CCK | RATE_ALL_OFDM_AG |
956 RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
915 reg_prsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG; 957 reg_prsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
916 958
917 rtl_write_dword(rtlpriv, REG_RRSR, reg_prsr); 959 rtl_write_dword(rtlpriv, REG_RRSR, reg_prsr);
@@ -923,7 +965,7 @@ static void _rtl88ee_enable_aspm_back_door(struct ieee80211_hw *hw)
923 struct rtl_priv *rtlpriv = rtl_priv(hw); 965 struct rtl_priv *rtlpriv = rtl_priv(hw);
924 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 966 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
925 u8 tmp1byte = 0; 967 u8 tmp1byte = 0;
926 u32 tmp4Byte = 0, count; 968 u32 tmp4byte = 0, count = 0;
927 969
928 rtl_write_word(rtlpriv, 0x354, 0x8104); 970 rtl_write_word(rtlpriv, 0x354, 0x8104);
929 rtl_write_word(rtlpriv, 0x358, 0x24); 971 rtl_write_word(rtlpriv, 0x358, 0x24);
@@ -938,8 +980,8 @@ static void _rtl88ee_enable_aspm_back_door(struct ieee80211_hw *hw)
938 count++; 980 count++;
939 } 981 }
940 if (0 == tmp1byte) { 982 if (0 == tmp1byte) {
941 tmp4Byte = rtl_read_dword(rtlpriv, 0x34c); 983 tmp4byte = rtl_read_dword(rtlpriv, 0x34c);
942 rtl_write_dword(rtlpriv, 0x348, tmp4Byte|BIT(31)); 984 rtl_write_dword(rtlpriv, 0x348, tmp4byte|BIT(31));
943 rtl_write_word(rtlpriv, 0x350, 0xf70c); 985 rtl_write_word(rtlpriv, 0x350, 0xf70c);
944 rtl_write_byte(rtlpriv, 0x352, 0x1); 986 rtl_write_byte(rtlpriv, 0x352, 0x1);
945 } 987 }
@@ -961,12 +1003,14 @@ static void _rtl88ee_enable_aspm_back_door(struct ieee80211_hw *hw)
961 tmp1byte = rtl_read_byte(rtlpriv, 0x352); 1003 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
962 count++; 1004 count++;
963 } 1005 }
1006
964 if (ppsc->support_backdoor || (0 == tmp1byte)) { 1007 if (ppsc->support_backdoor || (0 == tmp1byte)) {
965 tmp4Byte = rtl_read_dword(rtlpriv, 0x34c); 1008 tmp4byte = rtl_read_dword(rtlpriv, 0x34c);
966 rtl_write_dword(rtlpriv, 0x348, tmp4Byte|BIT(11)|BIT(12)); 1009 rtl_write_dword(rtlpriv, 0x348, tmp4byte|BIT(11)|BIT(12));
967 rtl_write_word(rtlpriv, 0x350, 0xf718); 1010 rtl_write_word(rtlpriv, 0x350, 0xf718);
968 rtl_write_byte(rtlpriv, 0x352, 0x1); 1011 rtl_write_byte(rtlpriv, 0x352, 0x1);
969 } 1012 }
1013
970 tmp1byte = rtl_read_byte(rtlpriv, 0x352); 1014 tmp1byte = rtl_read_byte(rtlpriv, 0x352);
971 count = 0; 1015 count = 0;
972 while (tmp1byte && count < 20) { 1016 while (tmp1byte && count < 20) {
@@ -983,14 +1027,15 @@ void rtl88ee_enable_hw_security_config(struct ieee80211_hw *hw)
983 1027
984 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 1028 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
985 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n", 1029 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
986 rtlpriv->sec.pairwise_enc_algorithm, 1030 rtlpriv->sec.pairwise_enc_algorithm,
987 rtlpriv->sec.group_enc_algorithm); 1031 rtlpriv->sec.group_enc_algorithm);
988 1032
989 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) { 1033 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
990 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 1034 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
991 "not open hw encryption\n"); 1035 "not open hw encryption\n");
992 return; 1036 return;
993 } 1037 }
1038
994 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE; 1039 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
995 1040
996 if (rtlpriv->sec.use_defaultkey) { 1041 if (rtlpriv->sec.use_defaultkey) {
@@ -1004,6 +1049,7 @@ void rtl88ee_enable_hw_security_config(struct ieee80211_hw *hw)
1004 1049
1005 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 1050 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1006 "The SECR-value %x\n", sec_reg_value); 1051 "The SECR-value %x\n", sec_reg_value);
1052
1007 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value); 1053 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1008} 1054}
1009 1055
@@ -1021,7 +1067,6 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
1021 u8 tmp_u1b, u1byte; 1067 u8 tmp_u1b, u1byte;
1022 unsigned long flags; 1068 unsigned long flags;
1023 1069
1024 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Rtl8188EE hw init\n");
1025 rtlpriv->rtlhal.being_init_adapter = true; 1070 rtlpriv->rtlhal.being_init_adapter = true;
1026 /* As this function can take a very long time (up to 350 ms) 1071 /* As this function can take a very long time (up to 350 ms)
1027 * and can be called with irqs disabled, reenable the irqs 1072 * and can be called with irqs disabled, reenable the irqs
@@ -1032,6 +1077,7 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
1032 */ 1077 */
1033 local_save_flags(flags); 1078 local_save_flags(flags);
1034 local_irq_enable(); 1079 local_irq_enable();
1080 rtlhal->fw_ready = false;
1035 1081
1036 rtlpriv->intf_ops->disable_aspm(hw); 1082 rtlpriv->intf_ops->disable_aspm(hw);
1037 1083
@@ -1057,9 +1103,8 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
1057 "Failed to download FW. Init HW without FW now..\n"); 1103 "Failed to download FW. Init HW without FW now..\n");
1058 err = 1; 1104 err = 1;
1059 goto exit; 1105 goto exit;
1060 } else {
1061 rtlhal->fw_ready = true;
1062 } 1106 }
1107 rtlhal->fw_ready = true;
1063 /*fw related variable initialize */ 1108 /*fw related variable initialize */
1064 rtlhal->last_hmeboxnum = 0; 1109 rtlhal->last_hmeboxnum = 0;
1065 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_88E; 1110 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_88E;
@@ -1068,10 +1113,10 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
1068 ppsc->fw_current_inpsmode = false; 1113 ppsc->fw_current_inpsmode = false;
1069 1114
1070 rtl88e_phy_mac_config(hw); 1115 rtl88e_phy_mac_config(hw);
1071 /* because last function modifies RCR, we update 1116 /* because last function modify RCR, so we update
1072 * rcr var here, or TP will be unstable for receive_config 1117 * rcr var here, or TP will unstable for receive_config
1073 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx 1118 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
1074 * RCR_APP_ICV will cause mac80211 disassoc for cisco 1252 1119 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1075 */ 1120 */
1076 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV); 1121 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1077 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config); 1122 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
@@ -1101,15 +1146,14 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
1101 if (ppsc->rfpwr_state == ERFON) { 1146 if (ppsc->rfpwr_state == ERFON) {
1102 if ((rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) || 1147 if ((rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) ||
1103 ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) && 1148 ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) &&
1104 (rtlhal->oem_id == RT_CID_819X_HP))) { 1149 (rtlhal->oem_id == RT_CID_819X_HP))) {
1105 rtl88e_phy_set_rfpath_switch(hw, true); 1150 rtl88e_phy_set_rfpath_switch(hw, true);
1106 rtlpriv->dm.fat_table.rx_idle_ant = MAIN_ANT; 1151 rtlpriv->dm.fat_table.rx_idle_ant = MAIN_ANT;
1107 } else { 1152 } else {
1108 rtl88e_phy_set_rfpath_switch(hw, false); 1153 rtl88e_phy_set_rfpath_switch(hw, false);
1109 rtlpriv->dm.fat_table.rx_idle_ant = AUX_ANT; 1154 rtlpriv->dm.fat_table.rx_idle_ant = AUX_ANT;
1110 } 1155 }
1111 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1156 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rx idle ant %s\n",
1112 "rx idle ant %s\n",
1113 (rtlpriv->dm.fat_table.rx_idle_ant == MAIN_ANT) ? 1157 (rtlpriv->dm.fat_table.rx_idle_ant == MAIN_ANT) ?
1114 ("MAIN_ANT") : ("AUX_ANT")); 1158 ("MAIN_ANT") : ("AUX_ANT"));
1115 1159
@@ -1119,6 +1163,7 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
1119 rtl88e_phy_iq_calibrate(hw, false); 1163 rtl88e_phy_iq_calibrate(hw, false);
1120 rtlphy->iqk_initialized = true; 1164 rtlphy->iqk_initialized = true;
1121 } 1165 }
1166
1122 rtl88e_dm_check_txpower_tracking(hw); 1167 rtl88e_dm_check_txpower_tracking(hw);
1123 rtl88e_phy_lc_calibrate(hw); 1168 rtl88e_phy_lc_calibrate(hw);
1124 } 1169 }
@@ -1142,8 +1187,6 @@ int rtl88ee_hw_init(struct ieee80211_hw *hw)
1142exit: 1187exit:
1143 local_irq_restore(flags); 1188 local_irq_restore(flags);
1144 rtlpriv->rtlhal.being_init_adapter = false; 1189 rtlpriv->rtlhal.being_init_adapter = false;
1145 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "end of Rtl8188EE hw init %x\n",
1146 err);
1147 return err; 1190 return err;
1148} 1191}
1149 1192
@@ -1176,62 +1219,67 @@ static int _rtl88ee_set_media_status(struct ieee80211_hw *hw,
1176 enum nl80211_iftype type) 1219 enum nl80211_iftype type)
1177{ 1220{
1178 struct rtl_priv *rtlpriv = rtl_priv(hw); 1221 struct rtl_priv *rtlpriv = rtl_priv(hw);
1179 u8 bt_msr = rtl_read_byte(rtlpriv, MSR); 1222 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1180 enum led_ctl_mode ledaction = LED_CTL_NO_LINK; 1223 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1181 bt_msr &= 0xfc; 1224 u8 mode = MSR_NOLINK;
1182
1183 if (type == NL80211_IFTYPE_UNSPECIFIED ||
1184 type == NL80211_IFTYPE_STATION) {
1185 _rtl88ee_stop_tx_beacon(hw);
1186 _rtl88ee_enable_bcn_sub_func(hw);
1187 } else if (type == NL80211_IFTYPE_ADHOC ||
1188 type == NL80211_IFTYPE_AP ||
1189 type == NL80211_IFTYPE_MESH_POINT) {
1190 _rtl88ee_resume_tx_beacon(hw);
1191 _rtl88ee_disable_bcn_sub_func(hw);
1192 } else {
1193 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1194 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1195 type);
1196 }
1197 1225
1198 switch (type) { 1226 switch (type) {
1199 case NL80211_IFTYPE_UNSPECIFIED: 1227 case NL80211_IFTYPE_UNSPECIFIED:
1200 bt_msr |= MSR_NOLINK; 1228 mode = MSR_NOLINK;
1201 ledaction = LED_CTL_LINK;
1202 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1229 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1203 "Set Network type to NO LINK!\n"); 1230 "Set Network type to NO LINK!\n");
1204 break; 1231 break;
1205 case NL80211_IFTYPE_ADHOC: 1232 case NL80211_IFTYPE_ADHOC:
1206 bt_msr |= MSR_ADHOC; 1233 case NL80211_IFTYPE_MESH_POINT:
1234 mode = MSR_ADHOC;
1207 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1235 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1208 "Set Network type to Ad Hoc!\n"); 1236 "Set Network type to Ad Hoc!\n");
1209 break; 1237 break;
1210 case NL80211_IFTYPE_STATION: 1238 case NL80211_IFTYPE_STATION:
1211 bt_msr |= MSR_INFRA; 1239 mode = MSR_INFRA;
1212 ledaction = LED_CTL_LINK; 1240 ledaction = LED_CTL_LINK;
1213 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1241 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1214 "Set Network type to STA!\n"); 1242 "Set Network type to STA!\n");
1215 break; 1243 break;
1216 case NL80211_IFTYPE_AP: 1244 case NL80211_IFTYPE_AP:
1217 bt_msr |= MSR_AP; 1245 mode = MSR_AP;
1246 ledaction = LED_CTL_LINK;
1218 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1247 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1219 "Set Network type to AP!\n"); 1248 "Set Network type to AP!\n");
1220 break; 1249 break;
1221 case NL80211_IFTYPE_MESH_POINT:
1222 bt_msr |= MSR_ADHOC;
1223 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1224 "Set Network type to Mesh Point!\n");
1225 break;
1226 default: 1250 default:
1227 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1251 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1228 "Network type %d not support!\n", type); 1252 "Network type %d not support!\n", type);
1229 return 1; 1253 return 1;
1254 break;
1255 }
1256
1257 /* MSR_INFRA == Link in infrastructure network;
1258 * MSR_ADHOC == Link in ad hoc network;
1259 * Therefore, check link state is necessary.
1260 *
1261 * MSR_AP == AP mode; link state is not cared here.
1262 */
1263 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1264 mode = MSR_NOLINK;
1265 ledaction = LED_CTL_NO_LINK;
1266 }
1267
1268 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1269 _rtl88ee_stop_tx_beacon(hw);
1270 _rtl88ee_enable_bcn_sub_func(hw);
1271 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1272 _rtl88ee_resume_tx_beacon(hw);
1273 _rtl88ee_disable_bcn_sub_func(hw);
1274 } else {
1275 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1276 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1277 mode);
1230 } 1278 }
1231 1279
1232 rtl_write_byte(rtlpriv, (MSR), bt_msr); 1280 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
1233 rtlpriv->cfg->ops->led_control(hw, ledaction); 1281 rtlpriv->cfg->ops->led_control(hw, ledaction);
1234 if ((bt_msr & MSR_MASK) == MSR_AP) 1282 if (mode == MSR_AP)
1235 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1283 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1236 else 1284 else
1237 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66); 1285 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
@@ -1241,13 +1289,12 @@ static int _rtl88ee_set_media_status(struct ieee80211_hw *hw,
1241void rtl88ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid) 1289void rtl88ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1242{ 1290{
1243 struct rtl_priv *rtlpriv = rtl_priv(hw); 1291 struct rtl_priv *rtlpriv = rtl_priv(hw);
1244 u32 reg_rcr; 1292 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1293 u32 reg_rcr = rtlpci->receive_config;
1245 1294
1246 if (rtlpriv->psc.rfpwr_state != ERFON) 1295 if (rtlpriv->psc.rfpwr_state != ERFON)
1247 return; 1296 return;
1248 1297
1249 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr));
1250
1251 if (check_bssid == true) { 1298 if (check_bssid == true) {
1252 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN); 1299 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1253 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, 1300 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
@@ -1259,9 +1306,11 @@ void rtl88ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1259 rtlpriv->cfg->ops->set_hw_reg(hw, 1306 rtlpriv->cfg->ops->set_hw_reg(hw,
1260 HW_VAR_RCR, (u8 *)(&reg_rcr)); 1307 HW_VAR_RCR, (u8 *)(&reg_rcr));
1261 } 1308 }
1309
1262} 1310}
1263 1311
1264int rtl88ee_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type) 1312int rtl88ee_set_network_type(struct ieee80211_hw *hw,
1313 enum nl80211_iftype type)
1265{ 1314{
1266 struct rtl_priv *rtlpriv = rtl_priv(hw); 1315 struct rtl_priv *rtlpriv = rtl_priv(hw);
1267 1316
@@ -1279,7 +1328,9 @@ int rtl88ee_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
1279 return 0; 1328 return 0;
1280} 1329}
1281 1330
1282/* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */ 1331/* don't set REG_EDCA_BE_PARAM here
1332 * because mac80211 will send pkt when scan
1333 */
1283void rtl88ee_set_qos(struct ieee80211_hw *hw, int aci) 1334void rtl88ee_set_qos(struct ieee80211_hw *hw, int aci)
1284{ 1335{
1285 struct rtl_priv *rtlpriv = rtl_priv(hw); 1336 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1302,22 +1353,41 @@ void rtl88ee_set_qos(struct ieee80211_hw *hw, int aci)
1302 } 1353 }
1303} 1354}
1304 1355
1356static void rtl88ee_clear_interrupt(struct ieee80211_hw *hw)
1357{
1358 struct rtl_priv *rtlpriv = rtl_priv(hw);
1359 u32 tmp;
1360
1361 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1362 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1363
1364 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1365 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1366
1367 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
1368 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
1369}
1370
1305void rtl88ee_enable_interrupt(struct ieee80211_hw *hw) 1371void rtl88ee_enable_interrupt(struct ieee80211_hw *hw)
1306{ 1372{
1307 struct rtl_priv *rtlpriv = rtl_priv(hw); 1373 struct rtl_priv *rtlpriv = rtl_priv(hw);
1308 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1374 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1309 1375
1310 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); 1376 rtl88ee_clear_interrupt(hw);/*clear it here first*/
1311 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); 1377 rtl_write_dword(rtlpriv, REG_HIMR,
1378 rtlpci->irq_mask[0] & 0xFFFFFFFF);
1379 rtl_write_dword(rtlpriv, REG_HIMRE,
1380 rtlpci->irq_mask[1] & 0xFFFFFFFF);
1312 rtlpci->irq_enabled = true; 1381 rtlpci->irq_enabled = true;
1313 /* there are some C2H CMDs have been sent before system interrupt 1382 /* there are some C2H CMDs have been sent
1314 * is enabled, e.g., C2H, CPWM. 1383 * before system interrupt is enabled, e.g., C2H, CPWM.
1315 * So we need to clear all C2H events that FW has notified, otherwise 1384 * So we need to clear all C2H events that FW has notified,
1316 * FW won't schedule any commands anymore. 1385 * otherwise FW won't schedule any commands anymore.
1317 */ 1386 */
1318 rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0); 1387 rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0);
1319 /*enable system interrupt*/ 1388 /*enable system interrupt*/
1320 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF); 1389 rtl_write_dword(rtlpriv, REG_HSIMR,
1390 rtlpci->sys_irq_mask & 0xFFFFFFFF);
1321} 1391}
1322 1392
1323void rtl88ee_disable_interrupt(struct ieee80211_hw *hw) 1393void rtl88ee_disable_interrupt(struct ieee80211_hw *hw)
@@ -1328,7 +1398,7 @@ void rtl88ee_disable_interrupt(struct ieee80211_hw *hw)
1328 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED); 1398 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1329 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED); 1399 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1330 rtlpci->irq_enabled = false; 1400 rtlpci->irq_enabled = false;
1331 synchronize_irq(rtlpci->pdev->irq); 1401 /*synchronize_irq(rtlpci->pdev->irq);*/
1332} 1402}
1333 1403
1334static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw) 1404static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw)
@@ -1354,7 +1424,7 @@ static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw)
1354 1424
1355 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1425 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1356 PWR_INTF_PCI_MSK, 1426 PWR_INTF_PCI_MSK,
1357 Rtl8188E_NIC_LPS_ENTER_FLOW); 1427 RTL8188EE_NIC_LPS_ENTER_FLOW);
1358 1428
1359 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); 1429 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1360 1430
@@ -1369,7 +1439,7 @@ static void _rtl88ee_poweroff_adapter(struct ieee80211_hw *hw)
1369 rtl_write_byte(rtlpriv, REG_32K_CTRL, (u1b_tmp & (~BIT(0)))); 1439 rtl_write_byte(rtlpriv, REG_32K_CTRL, (u1b_tmp & (~BIT(0))));
1370 1440
1371 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1441 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1372 PWR_INTF_PCI_MSK, Rtl8188E_NIC_DISABLE_FLOW); 1442 PWR_INTF_PCI_MSK, RTL8188EE_NIC_DISABLE_FLOW);
1373 1443
1374 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1); 1444 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
1375 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3)))); 1445 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
@@ -1426,6 +1496,7 @@ void rtl88ee_interrupt_recognized(struct ieee80211_hw *hw,
1426 1496
1427 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1]; 1497 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
1428 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb); 1498 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
1499
1429} 1500}
1430 1501
1431void rtl88ee_set_beacon_related_registers(struct ieee80211_hw *hw) 1502void rtl88ee_set_beacon_related_registers(struct ieee80211_hw *hw)
@@ -1471,233 +1542,241 @@ void rtl88ee_update_interrupt_mask(struct ieee80211_hw *hw,
1471 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD, 1542 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
1472 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr); 1543 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
1473 1544
1474 rtl88ee_disable_interrupt(hw);
1475 if (add_msr) 1545 if (add_msr)
1476 rtlpci->irq_mask[0] |= add_msr; 1546 rtlpci->irq_mask[0] |= add_msr;
1477 if (rm_msr) 1547 if (rm_msr)
1478 rtlpci->irq_mask[0] &= (~rm_msr); 1548 rtlpci->irq_mask[0] &= (~rm_msr);
1549 rtl88ee_disable_interrupt(hw);
1479 rtl88ee_enable_interrupt(hw); 1550 rtl88ee_enable_interrupt(hw);
1480} 1551}
1481 1552
1482static inline u8 get_chnl_group(u8 chnl) 1553static u8 _rtl88e_get_chnl_group(u8 chnl)
1483{ 1554{
1484 u8 group; 1555 u8 group = 0;
1485 1556
1486 group = chnl / 3; 1557 if (chnl < 3)
1487 if (chnl == 14) 1558 group = 0;
1559 else if (chnl < 6)
1560 group = 1;
1561 else if (chnl < 9)
1562 group = 2;
1563 else if (chnl < 12)
1564 group = 3;
1565 else if (chnl < 14)
1566 group = 4;
1567 else if (chnl == 14)
1488 group = 5; 1568 group = 5;
1489 1569
1490 return group; 1570 return group;
1491} 1571}
1492 1572
1493static void set_diff0_2g(struct txpower_info_2g *pwr2g, u8 *hwinfo, u32 path, 1573static void set_24g_base(struct txpower_info_2g *pwrinfo24g, u32 rfpath)
1494 u32 i, u32 eadr)
1495{
1496 pwr2g->bw40_diff[path][i] = 0;
1497 if (hwinfo[eadr] == 0xFF) {
1498 pwr2g->bw20_diff[path][i] = 0x02;
1499 } else {
1500 pwr2g->bw20_diff[path][i] = (hwinfo[eadr]&0xf0)>>4;
1501 /*bit sign number to 8 bit sign number*/
1502 if (pwr2g->bw20_diff[path][i] & BIT(3))
1503 pwr2g->bw20_diff[path][i] |= 0xF0;
1504 }
1505
1506 if (hwinfo[eadr] == 0xFF) {
1507 pwr2g->ofdm_diff[path][i] = 0x04;
1508 } else {
1509 pwr2g->ofdm_diff[path][i] = (hwinfo[eadr] & 0x0f);
1510 /*bit sign number to 8 bit sign number*/
1511 if (pwr2g->ofdm_diff[path][i] & BIT(3))
1512 pwr2g->ofdm_diff[path][i] |= 0xF0;
1513 }
1514 pwr2g->cck_diff[path][i] = 0;
1515}
1516
1517static void set_diff0_5g(struct txpower_info_5g *pwr5g, u8 *hwinfo, u32 path,
1518 u32 i, u32 eadr)
1519{
1520 pwr5g->bw40_diff[path][i] = 0;
1521 if (hwinfo[eadr] == 0xFF) {
1522 pwr5g->bw20_diff[path][i] = 0;
1523 } else {
1524 pwr5g->bw20_diff[path][i] = (hwinfo[eadr]&0xf0)>>4;
1525 /*bit sign number to 8 bit sign number*/
1526 if (pwr5g->bw20_diff[path][i] & BIT(3))
1527 pwr5g->bw20_diff[path][i] |= 0xF0;
1528 }
1529
1530 if (hwinfo[eadr] == 0xFF) {
1531 pwr5g->ofdm_diff[path][i] = 0x04;
1532 } else {
1533 pwr5g->ofdm_diff[path][i] = (hwinfo[eadr] & 0x0f);
1534 /*bit sign number to 8 bit sign number*/
1535 if (pwr5g->ofdm_diff[path][i] & BIT(3))
1536 pwr5g->ofdm_diff[path][i] |= 0xF0;
1537 }
1538}
1539
1540static void set_diff1_2g(struct txpower_info_2g *pwr2g, u8 *hwinfo, u32 path,
1541 u32 i, u32 eadr)
1542{
1543 if (hwinfo[eadr] == 0xFF) {
1544 pwr2g->bw40_diff[path][i] = 0xFE;
1545 } else {
1546 pwr2g->bw40_diff[path][i] = (hwinfo[eadr]&0xf0)>>4;
1547 if (pwr2g->bw40_diff[path][i] & BIT(3))
1548 pwr2g->bw40_diff[path][i] |= 0xF0;
1549 }
1550
1551 if (hwinfo[eadr] == 0xFF) {
1552 pwr2g->bw20_diff[path][i] = 0xFE;
1553 } else {
1554 pwr2g->bw20_diff[path][i] = (hwinfo[eadr]&0x0f);
1555 if (pwr2g->bw20_diff[path][i] & BIT(3))
1556 pwr2g->bw20_diff[path][i] |= 0xF0;
1557 }
1558}
1559
1560static void set_diff1_5g(struct txpower_info_5g *pwr5g, u8 *hwinfo, u32 path,
1561 u32 i, u32 eadr)
1562{ 1574{
1563 if (hwinfo[eadr] == 0xFF) { 1575 int group, txcnt;
1564 pwr5g->bw40_diff[path][i] = 0xFE;
1565 } else {
1566 pwr5g->bw40_diff[path][i] = (hwinfo[eadr]&0xf0)>>4;
1567 if (pwr5g->bw40_diff[path][i] & BIT(3))
1568 pwr5g->bw40_diff[path][i] |= 0xF0;
1569 }
1570 1576
1571 if (hwinfo[eadr] == 0xFF) { 1577 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1572 pwr5g->bw20_diff[path][i] = 0xFE; 1578 pwrinfo24g->index_cck_base[rfpath][group] = 0x2D;
1573 } else { 1579 pwrinfo24g->index_bw40_base[rfpath][group] = 0x2D;
1574 pwr5g->bw20_diff[path][i] = (hwinfo[eadr] & 0x0f);
1575 if (pwr5g->bw20_diff[path][i] & BIT(3))
1576 pwr5g->bw20_diff[path][i] |= 0xF0;
1577 } 1580 }
1578} 1581 for (txcnt = 0; txcnt < MAX_TX_COUNT; txcnt++) {
1579 1582 if (txcnt == 0) {
1580static void set_diff2_2g(struct txpower_info_2g *pwr2g, u8 *hwinfo, u32 path, 1583 pwrinfo24g->bw20_diff[rfpath][0] = 0x02;
1581 u32 i, u32 eadr) 1584 pwrinfo24g->ofdm_diff[rfpath][0] = 0x04;
1582{ 1585 } else {
1583 if (hwinfo[eadr] == 0xFF) { 1586 pwrinfo24g->bw20_diff[rfpath][txcnt] = 0xFE;
1584 pwr2g->ofdm_diff[path][i] = 0xFE; 1587 pwrinfo24g->bw40_diff[rfpath][txcnt] = 0xFE;
1585 } else { 1588 pwrinfo24g->cck_diff[rfpath][txcnt] = 0xFE;
1586 pwr2g->ofdm_diff[path][i] = (hwinfo[eadr]&0xf0)>>4; 1589 pwrinfo24g->ofdm_diff[rfpath][txcnt] = 0xFE;
1587 if (pwr2g->ofdm_diff[path][i] & BIT(3)) 1590 }
1588 pwr2g->ofdm_diff[path][i] |= 0xF0;
1589 }
1590
1591 if (hwinfo[eadr] == 0xFF) {
1592 pwr2g->cck_diff[path][i] = 0xFE;
1593 } else {
1594 pwr2g->cck_diff[path][i] = (hwinfo[eadr]&0x0f);
1595 if (pwr2g->cck_diff[path][i] & BIT(3))
1596 pwr2g->cck_diff[path][i] |= 0xF0;
1597 } 1591 }
1598} 1592}
1599 1593
1600static void _rtl8188e_read_power_value_fromprom(struct ieee80211_hw *hw, 1594static void read_power_value_fromprom(struct ieee80211_hw *hw,
1601 struct txpower_info_2g *pwr2g, 1595 struct txpower_info_2g *pwrinfo24g,
1602 struct txpower_info_5g *pwr5g, 1596 struct txpower_info_5g *pwrinfo5g,
1603 bool autoload_fail, 1597 bool autoload_fail, u8 *hwinfo)
1604 u8 *hwinfo)
1605{ 1598{
1606 struct rtl_priv *rtlpriv = rtl_priv(hw); 1599 struct rtl_priv *rtlpriv = rtl_priv(hw);
1607 u32 path, eadr = EEPROM_TX_PWR_INX, i; 1600 u32 rfpath, eeaddr = EEPROM_TX_PWR_INX, group, txcnt = 0;
1608 1601
1609 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1602 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1610 "hal_ReadPowerValueFromPROM88E(): PROMContent[0x%x]= 0x%x\n", 1603 "hal_ReadPowerValueFromPROM88E():PROMContent[0x%x]=0x%x\n",
1611 (eadr+1), hwinfo[eadr+1]); 1604 (eeaddr+1), hwinfo[eeaddr+1]);
1612 if (0xFF == hwinfo[eadr+1]) 1605 if (0xFF == hwinfo[eeaddr+1]) /*YJ,add,120316*/
1613 autoload_fail = true; 1606 autoload_fail = true;
1614 1607
1615 if (autoload_fail) { 1608 if (autoload_fail) {
1616 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1609 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1617 "auto load fail : Use Default value!\n"); 1610 "auto load fail : Use Default value!\n");
1618 for (path = 0; path < MAX_RF_PATH; path++) { 1611 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
1619 /* 2.4G default value */ 1612 /* 2.4G default value */
1620 for (i = 0; i < MAX_CHNL_GROUP_24G; i++) { 1613 set_24g_base(pwrinfo24g, rfpath);
1621 pwr2g->index_cck_base[path][i] = 0x2D;
1622 pwr2g->index_bw40_base[path][i] = 0x2D;
1623 }
1624 for (i = 0; i < MAX_TX_COUNT; i++) {
1625 if (i == 0) {
1626 pwr2g->bw20_diff[path][0] = 0x02;
1627 pwr2g->ofdm_diff[path][0] = 0x04;
1628 } else {
1629 pwr2g->bw20_diff[path][i] = 0xFE;
1630 pwr2g->bw40_diff[path][i] = 0xFE;
1631 pwr2g->cck_diff[path][i] = 0xFE;
1632 pwr2g->ofdm_diff[path][i] = 0xFE;
1633 }
1634 }
1635 } 1614 }
1636 return; 1615 return;
1637 } 1616 }
1638 1617
1639 for (path = 0; path < MAX_RF_PATH; path++) { 1618 for (rfpath = 0 ; rfpath < MAX_RF_PATH ; rfpath++) {
1640 /*2.4G default value*/ 1619 /*2.4G default value*/
1641 for (i = 0; i < MAX_CHNL_GROUP_24G; i++) { 1620 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1642 pwr2g->index_cck_base[path][i] = hwinfo[eadr++]; 1621 pwrinfo24g->index_cck_base[rfpath][group] =
1643 if (pwr2g->index_cck_base[path][i] == 0xFF) 1622 hwinfo[eeaddr++];
1644 pwr2g->index_cck_base[path][i] = 0x2D; 1623 if (pwrinfo24g->index_cck_base[rfpath][group] == 0xFF)
1624 pwrinfo24g->index_cck_base[rfpath][group] =
1625 0x2D;
1645 } 1626 }
1646 for (i = 0; i < MAX_CHNL_GROUP_24G; i++) { 1627 for (group = 0 ; group < MAX_CHNL_GROUP_24G-1; group++) {
1647 pwr2g->index_bw40_base[path][i] = hwinfo[eadr++]; 1628 pwrinfo24g->index_bw40_base[rfpath][group] =
1648 if (pwr2g->index_bw40_base[path][i] == 0xFF) 1629 hwinfo[eeaddr++];
1649 pwr2g->index_bw40_base[path][i] = 0x2D; 1630 if (pwrinfo24g->index_bw40_base[rfpath][group] == 0xFF)
1631 pwrinfo24g->index_bw40_base[rfpath][group] =
1632 0x2D;
1650 } 1633 }
1651 for (i = 0; i < MAX_TX_COUNT; i++) { 1634 pwrinfo24g->bw40_diff[rfpath][0] = 0;
1652 if (i == 0) { 1635 if (hwinfo[eeaddr] == 0xFF) {
1653 set_diff0_2g(pwr2g, hwinfo, path, i, eadr); 1636 pwrinfo24g->bw20_diff[rfpath][0] = 0x02;
1654 eadr++; 1637 } else {
1638 pwrinfo24g->bw20_diff[rfpath][0] =
1639 (hwinfo[eeaddr]&0xf0)>>4;
1640 /*bit sign number to 8 bit sign number*/
1641 if (pwrinfo24g->bw20_diff[rfpath][0] & BIT(3))
1642 pwrinfo24g->bw20_diff[rfpath][0] |= 0xF0;
1643 }
1644
1645 if (hwinfo[eeaddr] == 0xFF) {
1646 pwrinfo24g->ofdm_diff[rfpath][0] = 0x04;
1647 } else {
1648 pwrinfo24g->ofdm_diff[rfpath][0] =
1649 (hwinfo[eeaddr]&0x0f);
1650 /*bit sign number to 8 bit sign number*/
1651 if (pwrinfo24g->ofdm_diff[rfpath][0] & BIT(3))
1652 pwrinfo24g->ofdm_diff[rfpath][0] |= 0xF0;
1653 }
1654 pwrinfo24g->cck_diff[rfpath][0] = 0;
1655 eeaddr++;
1656 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1657 if (hwinfo[eeaddr] == 0xFF) {
1658 pwrinfo24g->bw40_diff[rfpath][txcnt] = 0xFE;
1659 } else {
1660 pwrinfo24g->bw40_diff[rfpath][txcnt] =
1661 (hwinfo[eeaddr]&0xf0)>>4;
1662 if (pwrinfo24g->bw40_diff[rfpath][txcnt] &
1663 BIT(3))
1664 pwrinfo24g->bw40_diff[rfpath][txcnt] |=
1665 0xF0;
1666 }
1667
1668 if (hwinfo[eeaddr] == 0xFF) {
1669 pwrinfo24g->bw20_diff[rfpath][txcnt] =
1670 0xFE;
1655 } else { 1671 } else {
1656 set_diff1_2g(pwr2g, hwinfo, path, i, eadr); 1672 pwrinfo24g->bw20_diff[rfpath][txcnt] =
1657 eadr++; 1673 (hwinfo[eeaddr]&0x0f);
1674 if (pwrinfo24g->bw20_diff[rfpath][txcnt] &
1675 BIT(3))
1676 pwrinfo24g->bw20_diff[rfpath][txcnt] |=
1677 0xF0;
1678 }
1679 eeaddr++;
1658 1680
1659 set_diff2_2g(pwr2g, hwinfo, path, i, eadr); 1681 if (hwinfo[eeaddr] == 0xFF) {
1660 eadr++; 1682 pwrinfo24g->ofdm_diff[rfpath][txcnt] = 0xFE;
1683 } else {
1684 pwrinfo24g->ofdm_diff[rfpath][txcnt] =
1685 (hwinfo[eeaddr]&0xf0)>>4;
1686 if (pwrinfo24g->ofdm_diff[rfpath][txcnt] &
1687 BIT(3))
1688 pwrinfo24g->ofdm_diff[rfpath][txcnt] |=
1689 0xF0;
1661 } 1690 }
1691
1692 if (hwinfo[eeaddr] == 0xFF) {
1693 pwrinfo24g->cck_diff[rfpath][txcnt] = 0xFE;
1694 } else {
1695 pwrinfo24g->cck_diff[rfpath][txcnt] =
1696 (hwinfo[eeaddr]&0x0f);
1697 if (pwrinfo24g->cck_diff[rfpath][txcnt] &
1698 BIT(3))
1699 pwrinfo24g->cck_diff[rfpath][txcnt] |=
1700 0xF0;
1701 }
1702 eeaddr++;
1662 } 1703 }
1663 1704
1664 /*5G default value*/ 1705 /*5G default value*/
1665 for (i = 0; i < MAX_CHNL_GROUP_5G; i++) { 1706 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
1666 pwr5g->index_bw40_base[path][i] = hwinfo[eadr++]; 1707 pwrinfo5g->index_bw40_base[rfpath][group] =
1667 if (pwr5g->index_bw40_base[path][i] == 0xFF) 1708 hwinfo[eeaddr++];
1668 pwr5g->index_bw40_base[path][i] = 0xFE; 1709 if (pwrinfo5g->index_bw40_base[rfpath][group] == 0xFF)
1710 pwrinfo5g->index_bw40_base[rfpath][group] =
1711 0xFE;
1669 } 1712 }
1670 1713
1671 for (i = 0; i < MAX_TX_COUNT; i++) { 1714 pwrinfo5g->bw40_diff[rfpath][0] = 0;
1672 if (i == 0) { 1715
1673 set_diff0_5g(pwr5g, hwinfo, path, i, eadr); 1716 if (hwinfo[eeaddr] == 0xFF) {
1674 eadr++; 1717 pwrinfo5g->bw20_diff[rfpath][0] = 0;
1718 } else {
1719 pwrinfo5g->bw20_diff[rfpath][0] =
1720 (hwinfo[eeaddr]&0xf0)>>4;
1721 if (pwrinfo5g->bw20_diff[rfpath][0] & BIT(3))
1722 pwrinfo5g->bw20_diff[rfpath][0] |= 0xF0;
1723 }
1724
1725 if (hwinfo[eeaddr] == 0xFF) {
1726 pwrinfo5g->ofdm_diff[rfpath][0] = 0x04;
1727 } else {
1728 pwrinfo5g->ofdm_diff[rfpath][0] = (hwinfo[eeaddr]&0x0f);
1729 if (pwrinfo5g->ofdm_diff[rfpath][0] & BIT(3))
1730 pwrinfo5g->ofdm_diff[rfpath][0] |= 0xF0;
1731 }
1732 eeaddr++;
1733 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1734 if (hwinfo[eeaddr] == 0xFF) {
1735 pwrinfo5g->bw40_diff[rfpath][txcnt] = 0xFE;
1675 } else { 1736 } else {
1676 set_diff1_5g(pwr5g, hwinfo, path, i, eadr); 1737 pwrinfo5g->bw40_diff[rfpath][txcnt] =
1677 eadr++; 1738 (hwinfo[eeaddr]&0xf0)>>4;
1739 if (pwrinfo5g->bw40_diff[rfpath][txcnt] &
1740 BIT(3))
1741 pwrinfo5g->bw40_diff[rfpath][txcnt] |=
1742 0xF0;
1678 } 1743 }
1744
1745 if (hwinfo[eeaddr] == 0xFF) {
1746 pwrinfo5g->bw20_diff[rfpath][txcnt] = 0xFE;
1747 } else {
1748 pwrinfo5g->bw20_diff[rfpath][txcnt] =
1749 (hwinfo[eeaddr]&0x0f);
1750 if (pwrinfo5g->bw20_diff[rfpath][txcnt] &
1751 BIT(3))
1752 pwrinfo5g->bw20_diff[rfpath][txcnt] |=
1753 0xF0;
1754 }
1755 eeaddr++;
1679 } 1756 }
1680 1757
1681 if (hwinfo[eadr] == 0xFF) { 1758 if (hwinfo[eeaddr] == 0xFF) {
1682 pwr5g->ofdm_diff[path][1] = 0xFE; 1759 pwrinfo5g->ofdm_diff[rfpath][1] = 0xFE;
1683 pwr5g->ofdm_diff[path][2] = 0xFE; 1760 pwrinfo5g->ofdm_diff[rfpath][2] = 0xFE;
1684 } else { 1761 } else {
1685 pwr5g->ofdm_diff[path][1] = (hwinfo[eadr] & 0xf0) >> 4; 1762 pwrinfo5g->ofdm_diff[rfpath][1] =
1686 pwr5g->ofdm_diff[path][2] = (hwinfo[eadr] & 0x0f); 1763 (hwinfo[eeaddr]&0xf0)>>4;
1764 pwrinfo5g->ofdm_diff[rfpath][2] =
1765 (hwinfo[eeaddr]&0x0f);
1687 } 1766 }
1688 eadr++; 1767 eeaddr++;
1689 1768
1690 if (hwinfo[eadr] == 0xFF) 1769 if (hwinfo[eeaddr] == 0xFF)
1691 pwr5g->ofdm_diff[path][3] = 0xFE; 1770 pwrinfo5g->ofdm_diff[rfpath][3] = 0xFE;
1692 else 1771 else
1693 pwr5g->ofdm_diff[path][3] = (hwinfo[eadr]&0x0f); 1772 pwrinfo5g->ofdm_diff[rfpath][3] = (hwinfo[eeaddr]&0x0f);
1694 eadr++; 1773 eeaddr++;
1695 1774
1696 for (i = 1; i < MAX_TX_COUNT; i++) { 1775 for (txcnt = 1; txcnt < MAX_TX_COUNT; txcnt++) {
1697 if (pwr5g->ofdm_diff[path][i] == 0xFF) 1776 if (pwrinfo5g->ofdm_diff[rfpath][txcnt] == 0xFF)
1698 pwr5g->ofdm_diff[path][i] = 0xFE; 1777 pwrinfo5g->ofdm_diff[rfpath][txcnt] = 0xFE;
1699 else if (pwr5g->ofdm_diff[path][i] & BIT(3)) 1778 else if (pwrinfo5g->ofdm_diff[rfpath][txcnt] & BIT(3))
1700 pwr5g->ofdm_diff[path][i] |= 0xF0; 1779 pwrinfo5g->ofdm_diff[rfpath][txcnt] |= 0xF0;
1701 } 1780 }
1702 } 1781 }
1703} 1782}
@@ -1712,41 +1791,36 @@ static void _rtl88ee_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1712 struct txpower_info_5g pwrinfo5g; 1791 struct txpower_info_5g pwrinfo5g;
1713 u8 rf_path, index; 1792 u8 rf_path, index;
1714 u8 i; 1793 u8 i;
1715 int jj = EEPROM_RF_BOARD_OPTION_88E;
1716 int kk = EEPROM_THERMAL_METER_88E;
1717 1794
1718 _rtl8188e_read_power_value_fromprom(hw, &pwrinfo24g, &pwrinfo5g, 1795 read_power_value_fromprom(hw, &pwrinfo24g,
1719 autoload_fail, hwinfo); 1796 &pwrinfo5g, autoload_fail, hwinfo);
1720 1797
1721 for (rf_path = 0; rf_path < 2; rf_path++) { 1798 for (rf_path = 0; rf_path < 2; rf_path++) {
1722 for (i = 0; i < 14; i++) { 1799 for (i = 0; i < 14; i++) {
1723 index = get_chnl_group(i+1); 1800 index = _rtl88e_get_chnl_group(i+1);
1724 1801
1725 rtlefuse->txpwrlevel_cck[rf_path][i] = 1802 rtlefuse->txpwrlevel_cck[rf_path][i] =
1726 pwrinfo24g.index_cck_base[rf_path][index]; 1803 pwrinfo24g.index_cck_base[rf_path][index];
1727 if (i == 13) 1804 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
1728 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 1805 pwrinfo24g.index_bw40_base[rf_path][index];
1729 pwrinfo24g.index_bw40_base[rf_path][4];
1730 else
1731 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
1732 pwrinfo24g.index_bw40_base[rf_path][index];
1733 rtlefuse->txpwr_ht20diff[rf_path][i] = 1806 rtlefuse->txpwr_ht20diff[rf_path][i] =
1734 pwrinfo24g.bw20_diff[rf_path][0]; 1807 pwrinfo24g.bw20_diff[rf_path][0];
1735 rtlefuse->txpwr_legacyhtdiff[rf_path][i] = 1808 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
1736 pwrinfo24g.ofdm_diff[rf_path][0]; 1809 pwrinfo24g.ofdm_diff[rf_path][0];
1737 } 1810 }
1738 1811
1739 for (i = 0; i < 14; i++) { 1812 for (i = 0; i < 14; i++) {
1740 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1813 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1741 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = " 1814 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n",
1742 "[0x%x / 0x%x ]\n", rf_path, i, 1815 rf_path, i,
1743 rtlefuse->txpwrlevel_cck[rf_path][i], 1816 rtlefuse->txpwrlevel_cck[rf_path][i],
1744 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]); 1817 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]);
1745 } 1818 }
1746 } 1819 }
1747 1820
1748 if (!autoload_fail) 1821 if (!autoload_fail)
1749 rtlefuse->eeprom_thermalmeter = hwinfo[kk]; 1822 rtlefuse->eeprom_thermalmeter =
1823 hwinfo[EEPROM_THERMAL_METER_88E];
1750 else 1824 else
1751 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER; 1825 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1752 1826
@@ -1760,8 +1834,9 @@ static void _rtl88ee_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1760 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter); 1834 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
1761 1835
1762 if (!autoload_fail) { 1836 if (!autoload_fail) {
1763 rtlefuse->eeprom_regulatory = hwinfo[jj] & 0x07;/*bit0~2*/ 1837 rtlefuse->eeprom_regulatory =
1764 if (hwinfo[jj] == 0xFF) 1838 hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x07;/*bit0~2*/
1839 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
1765 rtlefuse->eeprom_regulatory = 0; 1840 rtlefuse->eeprom_regulatory = 0;
1766 } else { 1841 } else {
1767 rtlefuse->eeprom_regulatory = 0; 1842 rtlefuse->eeprom_regulatory = 0;
@@ -1775,12 +1850,9 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1775 struct rtl_priv *rtlpriv = rtl_priv(hw); 1850 struct rtl_priv *rtlpriv = rtl_priv(hw);
1776 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1851 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1777 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1852 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1778 struct rtl_pci_priv *rppriv = rtl_pcipriv(hw);
1779 u16 i, usvalue; 1853 u16 i, usvalue;
1780 u8 hwinfo[HWSET_MAX_SIZE]; 1854 u8 hwinfo[HWSET_MAX_SIZE];
1781 u16 eeprom_id; 1855 u16 eeprom_id;
1782 int jj = EEPROM_RF_BOARD_OPTION_88E;
1783 int kk = EEPROM_RF_FEATURE_OPTION_88E;
1784 1856
1785 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) { 1857 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
1786 rtl_efuse_shadow_map_update(hw); 1858 rtl_efuse_shadow_map_update(hw);
@@ -1790,9 +1862,14 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1790 } else if (rtlefuse->epromtype == EEPROM_93C46) { 1862 } else if (rtlefuse->epromtype == EEPROM_93C46) {
1791 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1863 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1792 "RTL819X Not boot from eeprom, check it !!"); 1864 "RTL819X Not boot from eeprom, check it !!");
1865 return;
1866 } else {
1867 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1868 "boot from neither eeprom nor efuse, check it !!");
1869 return;
1793 } 1870 }
1794 1871
1795 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP\n"), 1872 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
1796 hwinfo, HWSET_MAX_SIZE); 1873 hwinfo, HWSET_MAX_SIZE);
1797 1874
1798 eeprom_id = *((u16 *)&hwinfo[0]); 1875 eeprom_id = *((u16 *)&hwinfo[0]);
@@ -1825,7 +1902,7 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1825 /*customer ID*/ 1902 /*customer ID*/
1826 rtlefuse->eeprom_oemid = hwinfo[EEPROM_CUSTOMER_ID]; 1903 rtlefuse->eeprom_oemid = hwinfo[EEPROM_CUSTOMER_ID];
1827 if (rtlefuse->eeprom_oemid == 0xFF) 1904 if (rtlefuse->eeprom_oemid == 0xFF)
1828 rtlefuse->eeprom_oemid = 0; 1905 rtlefuse->eeprom_oemid = 0;
1829 1906
1830 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1907 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1831 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid); 1908 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
@@ -1844,34 +1921,40 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1844 /* set channel paln to world wide 13 */ 1921 /* set channel paln to world wide 13 */
1845 rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13; 1922 rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;
1846 /*tx power*/ 1923 /*tx power*/
1847 _rtl88ee_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag, 1924 _rtl88ee_read_txpower_info_from_hwpg(hw,
1925 rtlefuse->autoload_failflag,
1848 hwinfo); 1926 hwinfo);
1849 rtlefuse->txpwr_fromeprom = true; 1927 rtlefuse->txpwr_fromeprom = true;
1850 1928
1851 rtl8188ee_read_bt_coexist_info_from_hwpg(hw, 1929 rtl8188ee_read_bt_coexist_info_from_hwpg(hw,
1852 rtlefuse->autoload_failflag, 1930 rtlefuse->autoload_failflag,
1853 hwinfo); 1931 hwinfo);
1932
1854 /*board type*/ 1933 /*board type*/
1855 rtlefuse->board_type = (hwinfo[jj] & 0xE0) >> 5; 1934 rtlefuse->board_type =
1935 ((hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0xE0) >> 5);
1936 rtlhal->board_type = rtlefuse->board_type;
1856 /*Wake on wlan*/ 1937 /*Wake on wlan*/
1857 rtlefuse->wowlan_enable = ((hwinfo[kk] & 0x40) >> 6); 1938 rtlefuse->wowlan_enable =
1939 ((hwinfo[EEPROM_RF_FEATURE_OPTION_88E] & 0x40) >> 6);
1858 /*parse xtal*/ 1940 /*parse xtal*/
1859 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_88E]; 1941 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_88E];
1860 if (hwinfo[EEPROM_XTAL_88E]) 1942 if (hwinfo[EEPROM_XTAL_88E])
1861 rtlefuse->crystalcap = 0x20; 1943 rtlefuse->crystalcap = 0x20;
1862 /*antenna diversity*/ 1944 /*antenna diversity*/
1863 rtlefuse->antenna_div_cfg = (hwinfo[jj] & 0x18) >> 3; 1945 rtlefuse->antenna_div_cfg =
1864 if (hwinfo[jj] == 0xFF) 1946 (hwinfo[EEPROM_RF_BOARD_OPTION_88E] & 0x18) >> 3;
1947 if (hwinfo[EEPROM_RF_BOARD_OPTION_88E] == 0xFF)
1865 rtlefuse->antenna_div_cfg = 0; 1948 rtlefuse->antenna_div_cfg = 0;
1866 if (rppriv->bt_coexist.eeprom_bt_coexist != 0 && 1949 if (rtlpriv->btcoexist.eeprom_bt_coexist != 0 &&
1867 rppriv->bt_coexist.eeprom_bt_ant_num == ANT_X1) 1950 rtlpriv->btcoexist.eeprom_bt_ant_num == ANT_X1)
1868 rtlefuse->antenna_div_cfg = 0; 1951 rtlefuse->antenna_div_cfg = 0;
1869 1952
1870 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E]; 1953 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
1871 if (rtlefuse->antenna_div_type == 0xFF) 1954 if (rtlefuse->antenna_div_type == 0xFF)
1872 rtlefuse->antenna_div_type = 0x01; 1955 rtlefuse->antenna_div_type = 0x01;
1873 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV || 1956 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV ||
1874 rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) 1957 rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1875 rtlefuse->antenna_div_cfg = 1; 1958 rtlefuse->antenna_div_cfg = 1;
1876 1959
1877 if (rtlhal->oem_id == RT_CID_DEFAULT) { 1960 if (rtlhal->oem_id == RT_CID_DEFAULT) {
@@ -1881,12 +1964,12 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1881 if (rtlefuse->eeprom_svid == 0x1025) { 1964 if (rtlefuse->eeprom_svid == 0x1025) {
1882 rtlhal->oem_id = RT_CID_819X_ACER; 1965 rtlhal->oem_id = RT_CID_819X_ACER;
1883 } else if ((rtlefuse->eeprom_svid == 0x10EC && 1966 } else if ((rtlefuse->eeprom_svid == 0x10EC &&
1884 rtlefuse->eeprom_smid == 0x0179) || 1967 rtlefuse->eeprom_smid == 0x0179) ||
1885 (rtlefuse->eeprom_svid == 0x17AA && 1968 (rtlefuse->eeprom_svid == 0x17AA &&
1886 rtlefuse->eeprom_smid == 0x0179)) { 1969 rtlefuse->eeprom_smid == 0x0179)) {
1887 rtlhal->oem_id = RT_CID_819X_LENOVO; 1970 rtlhal->oem_id = RT_CID_819X_LENOVO;
1888 } else if (rtlefuse->eeprom_svid == 0x103c && 1971 } else if (rtlefuse->eeprom_svid == 0x103c &&
1889 rtlefuse->eeprom_smid == 0x197d) { 1972 rtlefuse->eeprom_smid == 0x197d) {
1890 rtlhal->oem_id = RT_CID_819X_HP; 1973 rtlhal->oem_id = RT_CID_819X_HP;
1891 } else { 1974 } else {
1892 rtlhal->oem_id = RT_CID_DEFAULT; 1975 rtlhal->oem_id = RT_CID_DEFAULT;
@@ -1905,6 +1988,7 @@ static void _rtl88ee_read_adapter_info(struct ieee80211_hw *hw)
1905 default: 1988 default:
1906 rtlhal->oem_id = RT_CID_DEFAULT; 1989 rtlhal->oem_id = RT_CID_DEFAULT;
1907 break; 1990 break;
1991
1908 } 1992 }
1909 } 1993 }
1910} 1994}
@@ -1943,14 +2027,13 @@ void rtl88ee_read_eeprom_info(struct ieee80211_hw *hw)
1943 u8 tmp_u1b; 2027 u8 tmp_u1b;
1944 2028
1945 rtlhal->version = _rtl88ee_read_chip_version(hw); 2029 rtlhal->version = _rtl88ee_read_chip_version(hw);
1946 if (get_rf_type(rtlphy) == RF_1T1R) { 2030 if (get_rf_type(rtlphy) == RF_1T1R)
1947 rtlpriv->dm.rfpath_rxenable[0] = true;
1948 } else {
1949 rtlpriv->dm.rfpath_rxenable[0] = true; 2031 rtlpriv->dm.rfpath_rxenable[0] = true;
1950 rtlpriv->dm.rfpath_rxenable[1] = true; 2032 else
1951 } 2033 rtlpriv->dm.rfpath_rxenable[0] =
2034 rtlpriv->dm.rfpath_rxenable[1] = true;
1952 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n", 2035 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
1953 rtlhal->version); 2036 rtlhal->version);
1954 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR); 2037 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
1955 if (tmp_u1b & BIT(4)) { 2038 if (tmp_u1b & BIT(4)) {
1956 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n"); 2039 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
@@ -1970,24 +2053,25 @@ void rtl88ee_read_eeprom_info(struct ieee80211_hw *hw)
1970} 2053}
1971 2054
1972static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw, 2055static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
1973 struct ieee80211_sta *sta) 2056 struct ieee80211_sta *sta)
1974{ 2057{
1975 struct rtl_priv *rtlpriv = rtl_priv(hw); 2058 struct rtl_priv *rtlpriv = rtl_priv(hw);
1976 struct rtl_pci_priv *rppriv = rtl_pcipriv(hw);
1977 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2059 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1978 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2060 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1979 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 2061 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1980 u32 ratr_value; 2062 u32 ratr_value;
1981 u8 ratr_index = 0; 2063 u8 ratr_index = 0;
1982 u8 nmode = mac->ht_enable; 2064 u8 b_nmode = mac->ht_enable;
1983 u8 mimo_ps = IEEE80211_SMPS_OFF; 2065 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
1984 u16 shortgi_rate; 2066 u16 shortgi_rate;
1985 u32 tmp_ratr_value; 2067 u32 tmp_ratr_value;
1986 u8 ctx40 = mac->bw_40; 2068 u8 curtxbw_40mhz = mac->bw_40;
1987 u16 cap = sta->ht_cap.cap; 2069 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
1988 u8 short40 = (cap & IEEE80211_HT_CAP_SGI_40) ? 1 : 0; 2070 1 : 0;
1989 u8 short20 = (cap & IEEE80211_HT_CAP_SGI_20) ? 1 : 0; 2071 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2072 1 : 0;
1990 enum wireless_mode wirelessmode = mac->mode; 2073 enum wireless_mode wirelessmode = mac->mode;
2074 u32 ratr_mask;
1991 2075
1992 if (rtlhal->current_bandtype == BAND_ON_5G) 2076 if (rtlhal->current_bandtype == BAND_ON_5G)
1993 ratr_value = sta->supp_rates[1] << 4; 2077 ratr_value = sta->supp_rates[1] << 4;
@@ -1996,7 +2080,7 @@ static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
1996 if (mac->opmode == NL80211_IFTYPE_ADHOC) 2080 if (mac->opmode == NL80211_IFTYPE_ADHOC)
1997 ratr_value = 0xfff; 2081 ratr_value = 0xfff;
1998 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 | 2082 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
1999 sta->ht_cap.mcs.rx_mask[0] << 12); 2083 sta->ht_cap.mcs.rx_mask[0] << 12);
2000 switch (wirelessmode) { 2084 switch (wirelessmode) {
2001 case WIRELESS_MODE_B: 2085 case WIRELESS_MODE_B:
2002 if (ratr_value & 0x0000000c) 2086 if (ratr_value & 0x0000000c)
@@ -2009,20 +2093,14 @@ static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
2009 break; 2093 break;
2010 case WIRELESS_MODE_N_24G: 2094 case WIRELESS_MODE_N_24G:
2011 case WIRELESS_MODE_N_5G: 2095 case WIRELESS_MODE_N_5G:
2012 nmode = 1; 2096 b_nmode = 1;
2013 if (mimo_ps == IEEE80211_SMPS_STATIC) { 2097 if (get_rf_type(rtlphy) == RF_1T2R ||
2014 ratr_value &= 0x0007F005; 2098 get_rf_type(rtlphy) == RF_1T1R)
2015 } else { 2099 ratr_mask = 0x000ff005;
2016 u32 ratr_mask; 2100 else
2017 2101 ratr_mask = 0x0f0ff005;
2018 if (get_rf_type(rtlphy) == RF_1T2R ||
2019 get_rf_type(rtlphy) == RF_1T1R)
2020 ratr_mask = 0x000ff005;
2021 else
2022 ratr_mask = 0x0f0ff005;
2023 2102
2024 ratr_value &= ratr_mask; 2103 ratr_value &= ratr_mask;
2025 }
2026 break; 2104 break;
2027 default: 2105 default:
2028 if (rtlphy->rf_type == RF_1T2R) 2106 if (rtlphy->rf_type == RF_1T2R)
@@ -2033,18 +2111,19 @@ static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
2033 break; 2111 break;
2034 } 2112 }
2035 2113
2036 if ((rppriv->bt_coexist.bt_coexistence) && 2114 if ((rtlpriv->btcoexist.bt_coexistence) &&
2037 (rppriv->bt_coexist.bt_coexist_type == BT_CSR_BC4) && 2115 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
2038 (rppriv->bt_coexist.bt_cur_state) && 2116 (rtlpriv->btcoexist.bt_cur_state) &&
2039 (rppriv->bt_coexist.bt_ant_isolation) && 2117 (rtlpriv->btcoexist.bt_ant_isolation) &&
2040 ((rppriv->bt_coexist.bt_service == BT_SCO) || 2118 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
2041 (rppriv->bt_coexist.bt_service == BT_BUSY))) 2119 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
2042 ratr_value &= 0x0fffcfc0; 2120 ratr_value &= 0x0fffcfc0;
2043 else 2121 else
2044 ratr_value &= 0x0FFFFFFF; 2122 ratr_value &= 0x0FFFFFFF;
2045 2123
2046 if (nmode && ((ctx40 && short40) || 2124 if (b_nmode &&
2047 (!ctx40 && short20))) { 2125 ((curtxbw_40mhz && curshortgi_40mhz) ||
2126 (!curtxbw_40mhz && curshortgi_20mhz))) {
2048 ratr_value |= 0x10000000; 2127 ratr_value |= 0x10000000;
2049 tmp_ratr_value = (ratr_value >> 12); 2128 tmp_ratr_value = (ratr_value >> 12);
2050 2129
@@ -2064,7 +2143,7 @@ static void rtl88ee_update_hal_rate_table(struct ieee80211_hw *hw,
2064} 2143}
2065 2144
2066static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw, 2145static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2067 struct ieee80211_sta *sta, u8 rssi) 2146 struct ieee80211_sta *sta, u8 rssi_level)
2068{ 2147{
2069 struct rtl_priv *rtlpriv = rtl_priv(hw); 2148 struct rtl_priv *rtlpriv = rtl_priv(hw);
2070 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2149 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -2073,23 +2152,25 @@ static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2073 struct rtl_sta_info *sta_entry = NULL; 2152 struct rtl_sta_info *sta_entry = NULL;
2074 u32 ratr_bitmap; 2153 u32 ratr_bitmap;
2075 u8 ratr_index; 2154 u8 ratr_index;
2076 u16 cap = sta->ht_cap.cap; 2155 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
2077 u8 ctx40 = (cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0; 2156 ? 1 : 0;
2078 u8 short40 = (cap & IEEE80211_HT_CAP_SGI_40) ? 1 : 0; 2157 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2079 u8 short20 = (cap & IEEE80211_HT_CAP_SGI_20) ? 1 : 0; 2158 1 : 0;
2159 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2160 1 : 0;
2080 enum wireless_mode wirelessmode = 0; 2161 enum wireless_mode wirelessmode = 0;
2081 bool shortgi = false; 2162 bool b_shortgi = false;
2082 u8 rate_mask[5]; 2163 u8 rate_mask[5];
2083 u8 macid = 0; 2164 u8 macid = 0;
2084 u8 mimo_ps = IEEE80211_SMPS_OFF; 2165 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
2085 2166
2086 sta_entry = (struct rtl_sta_info *)sta->drv_priv; 2167 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2087 wirelessmode = sta_entry->wireless_mode; 2168 wirelessmode = sta_entry->wireless_mode;
2088 if (mac->opmode == NL80211_IFTYPE_STATION || 2169 if (mac->opmode == NL80211_IFTYPE_STATION ||
2089 mac->opmode == NL80211_IFTYPE_MESH_POINT) 2170 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2090 ctx40 = mac->bw_40; 2171 curtxbw_40mhz = mac->bw_40;
2091 else if (mac->opmode == NL80211_IFTYPE_AP || 2172 else if (mac->opmode == NL80211_IFTYPE_AP ||
2092 mac->opmode == NL80211_IFTYPE_ADHOC) 2173 mac->opmode == NL80211_IFTYPE_ADHOC)
2093 macid = sta->aid + 1; 2174 macid = sta->aid + 1;
2094 2175
2095 if (rtlhal->current_bandtype == BAND_ON_5G) 2176 if (rtlhal->current_bandtype == BAND_ON_5G)
@@ -2111,70 +2192,59 @@ static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2111 case WIRELESS_MODE_G: 2192 case WIRELESS_MODE_G:
2112 ratr_index = RATR_INX_WIRELESS_GB; 2193 ratr_index = RATR_INX_WIRELESS_GB;
2113 2194
2114 if (rssi == 1) 2195 if (rssi_level == 1)
2115 ratr_bitmap &= 0x00000f00; 2196 ratr_bitmap &= 0x00000f00;
2116 else if (rssi == 2) 2197 else if (rssi_level == 2)
2117 ratr_bitmap &= 0x00000ff0; 2198 ratr_bitmap &= 0x00000ff0;
2118 else 2199 else
2119 ratr_bitmap &= 0x00000ff5; 2200 ratr_bitmap &= 0x00000ff5;
2120 break; 2201 break;
2121 case WIRELESS_MODE_A:
2122 ratr_index = RATR_INX_WIRELESS_A;
2123 ratr_bitmap &= 0x00000ff0;
2124 break;
2125 case WIRELESS_MODE_N_24G: 2202 case WIRELESS_MODE_N_24G:
2126 case WIRELESS_MODE_N_5G: 2203 case WIRELESS_MODE_N_5G:
2127 ratr_index = RATR_INX_WIRELESS_NGB; 2204 ratr_index = RATR_INX_WIRELESS_NGB;
2128 2205 if (rtlphy->rf_type == RF_1T2R ||
2129 if (mimo_ps == IEEE80211_SMPS_STATIC) { 2206 rtlphy->rf_type == RF_1T1R) {
2130 if (rssi == 1) 2207 if (curtxbw_40mhz) {
2131 ratr_bitmap &= 0x00070000; 2208 if (rssi_level == 1)
2132 else if (rssi == 2) 2209 ratr_bitmap &= 0x000f0000;
2133 ratr_bitmap &= 0x0007f000; 2210 else if (rssi_level == 2)
2134 else 2211 ratr_bitmap &= 0x000ff000;
2135 ratr_bitmap &= 0x0007f005; 2212 else
2213 ratr_bitmap &= 0x000ff015;
2214 } else {
2215 if (rssi_level == 1)
2216 ratr_bitmap &= 0x000f0000;
2217 else if (rssi_level == 2)
2218 ratr_bitmap &= 0x000ff000;
2219 else
2220 ratr_bitmap &= 0x000ff005;
2221 }
2136 } else { 2222 } else {
2137 if (rtlphy->rf_type == RF_1T2R || 2223 if (curtxbw_40mhz) {
2138 rtlphy->rf_type == RF_1T1R) { 2224 if (rssi_level == 1)
2139 if (ctx40) { 2225 ratr_bitmap &= 0x0f8f0000;
2140 if (rssi == 1) 2226 else if (rssi_level == 2)
2141 ratr_bitmap &= 0x000f0000; 2227 ratr_bitmap &= 0x0f8ff000;
2142 else if (rssi == 2) 2228 else
2143 ratr_bitmap &= 0x000ff000; 2229 ratr_bitmap &= 0x0f8ff015;
2144 else
2145 ratr_bitmap &= 0x000ff015;
2146 } else {
2147 if (rssi == 1)
2148 ratr_bitmap &= 0x000f0000;
2149 else if (rssi == 2)
2150 ratr_bitmap &= 0x000ff000;
2151 else
2152 ratr_bitmap &= 0x000ff005;
2153 }
2154 } else { 2230 } else {
2155 if (ctx40) { 2231 if (rssi_level == 1)
2156 if (rssi == 1) 2232 ratr_bitmap &= 0x0f8f0000;
2157 ratr_bitmap &= 0x0f8f0000; 2233 else if (rssi_level == 2)
2158 else if (rssi == 2) 2234 ratr_bitmap &= 0x0f8ff000;
2159 ratr_bitmap &= 0x0f8ff000; 2235 else
2160 else 2236 ratr_bitmap &= 0x0f8ff005;
2161 ratr_bitmap &= 0x0f8ff015;
2162 } else {
2163 if (rssi == 1)
2164 ratr_bitmap &= 0x0f8f0000;
2165 else if (rssi == 2)
2166 ratr_bitmap &= 0x0f8ff000;
2167 else
2168 ratr_bitmap &= 0x0f8ff005;
2169 }
2170 } 2237 }
2171 } 2238 }
2239 /*}*/
2240
2241 if ((curtxbw_40mhz && curshortgi_40mhz) ||
2242 (!curtxbw_40mhz && curshortgi_20mhz)) {
2172 2243
2173 if ((ctx40 && short40) || (!ctx40 && short20)) {
2174 if (macid == 0) 2244 if (macid == 0)
2175 shortgi = true; 2245 b_shortgi = true;
2176 else if (macid == 1) 2246 else if (macid == 1)
2177 shortgi = false; 2247 b_shortgi = false;
2178 } 2248 }
2179 break; 2249 break;
2180 default: 2250 default:
@@ -2192,22 +2262,24 @@ static void rtl88ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2192 "ratr_bitmap :%x\n", ratr_bitmap); 2262 "ratr_bitmap :%x\n", ratr_bitmap);
2193 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) | 2263 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2194 (ratr_index << 28); 2264 (ratr_index << 28);
2195 rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80; 2265 rate_mask[4] = macid | (b_shortgi ? 0x20 : 0x00) | 0x80;
2196 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, 2266 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2197 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x\n", 2267 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x\n",
2198 ratr_index, ratr_bitmap, rate_mask[0], rate_mask[1], 2268 ratr_index, ratr_bitmap,
2199 rate_mask[2], rate_mask[3], rate_mask[4]); 2269 rate_mask[0], rate_mask[1],
2270 rate_mask[2], rate_mask[3],
2271 rate_mask[4]);
2200 rtl88e_fill_h2c_cmd(hw, H2C_88E_RA_MASK, 5, rate_mask); 2272 rtl88e_fill_h2c_cmd(hw, H2C_88E_RA_MASK, 5, rate_mask);
2201 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0); 2273 _rtl88ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
2202} 2274}
2203 2275
2204void rtl88ee_update_hal_rate_tbl(struct ieee80211_hw *hw, 2276void rtl88ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
2205 struct ieee80211_sta *sta, u8 rssi) 2277 struct ieee80211_sta *sta, u8 rssi_level)
2206{ 2278{
2207 struct rtl_priv *rtlpriv = rtl_priv(hw); 2279 struct rtl_priv *rtlpriv = rtl_priv(hw);
2208 2280
2209 if (rtlpriv->dm.useramask) 2281 if (rtlpriv->dm.useramask)
2210 rtl88ee_update_hal_rate_mask(hw, sta, rssi); 2282 rtl88ee_update_hal_rate_mask(hw, sta, rssi_level);
2211 else 2283 else
2212 rtl88ee_update_hal_rate_table(hw, sta); 2284 rtl88ee_update_hal_rate_table(hw, sta);
2213} 2285}
@@ -2230,9 +2302,9 @@ bool rtl88ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2230{ 2302{
2231 struct rtl_priv *rtlpriv = rtl_priv(hw); 2303 struct rtl_priv *rtlpriv = rtl_priv(hw);
2232 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 2304 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2233 enum rf_pwrstate state_toset; 2305 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
2234 u32 u4tmp; 2306 u32 u4tmp;
2235 bool actuallyset = false; 2307 bool b_actuallyset = false;
2236 2308
2237 if (rtlpriv->rtlhal.being_init_adapter) 2309 if (rtlpriv->rtlhal.being_init_adapter)
2238 return false; 2310 return false;
@@ -2249,27 +2321,29 @@ bool rtl88ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2249 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2321 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2250 } 2322 }
2251 2323
2252 u4tmp = rtl_read_dword(rtlpriv, REG_GPIO_OUTPUT); 2324 cur_rfstate = ppsc->rfpwr_state;
2253 state_toset = (u4tmp & BIT(31)) ? ERFON : ERFOFF;
2254 2325
2326 u4tmp = rtl_read_dword(rtlpriv, REG_GPIO_OUTPUT);
2327 e_rfpowerstate_toset = (u4tmp & BIT(31)) ? ERFON : ERFOFF;
2255 2328
2256 if ((ppsc->hwradiooff == true) && (state_toset == ERFON)) { 2329 if (ppsc->hwradiooff && (e_rfpowerstate_toset == ERFON)) {
2257 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2330 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2258 "GPIOChangeRF - HW Radio ON, RF ON\n"); 2331 "GPIOChangeRF - HW Radio ON, RF ON\n");
2259 2332
2260 state_toset = ERFON; 2333 e_rfpowerstate_toset = ERFON;
2261 ppsc->hwradiooff = false; 2334 ppsc->hwradiooff = false;
2262 actuallyset = true; 2335 b_actuallyset = true;
2263 } else if ((ppsc->hwradiooff == false) && (state_toset == ERFOFF)) { 2336 } else if ((!ppsc->hwradiooff) &&
2337 (e_rfpowerstate_toset == ERFOFF)) {
2264 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2338 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2265 "GPIOChangeRF - HW Radio OFF, RF OFF\n"); 2339 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
2266 2340
2267 state_toset = ERFOFF; 2341 e_rfpowerstate_toset = ERFOFF;
2268 ppsc->hwradiooff = true; 2342 ppsc->hwradiooff = true;
2269 actuallyset = true; 2343 b_actuallyset = true;
2270 } 2344 }
2271 2345
2272 if (actuallyset) { 2346 if (b_actuallyset) {
2273 spin_lock(&rtlpriv->locks.rf_ps_lock); 2347 spin_lock(&rtlpriv->locks.rf_ps_lock);
2274 ppsc->rfchange_inprogress = false; 2348 ppsc->rfchange_inprogress = false;
2275 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2349 spin_unlock(&rtlpriv->locks.rf_ps_lock);
@@ -2284,50 +2358,19 @@ bool rtl88ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2284 2358
2285 *valid = 1; 2359 *valid = 1;
2286 return !ppsc->hwradiooff; 2360 return !ppsc->hwradiooff;
2287}
2288
2289static void add_one_key(struct ieee80211_hw *hw, u8 *macaddr,
2290 struct rtl_mac *mac, u32 key, u32 id,
2291 u8 enc_algo, bool is_pairwise)
2292{
2293 struct rtl_priv *rtlpriv = rtl_priv(hw);
2294 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2295
2296 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "add one entry\n");
2297 if (is_pairwise) {
2298 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "set Pairwise key\n");
2299 2361
2300 rtl_cam_add_one_entry(hw, macaddr, key, id, enc_algo,
2301 CAM_CONFIG_NO_USEDK,
2302 rtlpriv->sec.key_buf[key]);
2303 } else {
2304 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "set group key\n");
2305
2306 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2307 rtl_cam_add_one_entry(hw, rtlefuse->dev_addr,
2308 PAIRWISE_KEYIDX,
2309 CAM_PAIRWISE_KEY_POSITION,
2310 enc_algo,
2311 CAM_CONFIG_NO_USEDK,
2312 rtlpriv->sec.key_buf[id]);
2313 }
2314
2315 rtl_cam_add_one_entry(hw, macaddr, key, id, enc_algo,
2316 CAM_CONFIG_NO_USEDK,
2317 rtlpriv->sec.key_buf[id]);
2318 }
2319} 2362}
2320 2363
2321void rtl88ee_set_key(struct ieee80211_hw *hw, u32 key, 2364void rtl88ee_set_key(struct ieee80211_hw *hw, u32 key_index,
2322 u8 *mac_ad, bool is_group, u8 enc_algo, 2365 u8 *p_macaddr, bool is_group, u8 enc_algo,
2323 bool is_wepkey, bool clear_all) 2366 bool is_wepkey, bool clear_all)
2324{ 2367{
2325 struct rtl_priv *rtlpriv = rtl_priv(hw); 2368 struct rtl_priv *rtlpriv = rtl_priv(hw);
2326 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2369 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2327 u8 *macaddr = mac_ad; 2370 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2328 u32 id = 0; 2371 u8 *macaddr = p_macaddr;
2372 u32 entry_id = 0;
2329 bool is_pairwise = false; 2373 bool is_pairwise = false;
2330
2331 static u8 cam_const_addr[4][6] = { 2374 static u8 cam_const_addr[4][6] = {
2332 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 2375 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2333 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 2376 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
@@ -2372,122 +2415,176 @@ void rtl88ee_set_key(struct ieee80211_hw *hw, u32 key,
2372 break; 2415 break;
2373 default: 2416 default:
2374 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2417 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2375 "switch case not processed\n"); 2418 "switch case not process\n");
2376 enc_algo = CAM_TKIP; 2419 enc_algo = CAM_TKIP;
2377 break; 2420 break;
2378 } 2421 }
2379 2422
2380 if (is_wepkey || rtlpriv->sec.use_defaultkey) { 2423 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2381 macaddr = cam_const_addr[key]; 2424 macaddr = cam_const_addr[key_index];
2382 id = key; 2425 entry_id = key_index;
2383 } else { 2426 } else {
2384 if (is_group) { 2427 if (is_group) {
2385 macaddr = cam_const_broad; 2428 macaddr = cam_const_broad;
2386 id = key; 2429 entry_id = key_index;
2387 } else { 2430 } else {
2388 if (mac->opmode == NL80211_IFTYPE_AP || 2431 if (mac->opmode == NL80211_IFTYPE_AP ||
2389 mac->opmode == NL80211_IFTYPE_MESH_POINT) { 2432 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
2390 id = rtl_cam_get_free_entry(hw, mac_ad); 2433 entry_id =
2391 if (id >= TOTAL_CAM_ENTRY) { 2434 rtl_cam_get_free_entry(hw, p_macaddr);
2435 if (entry_id >= TOTAL_CAM_ENTRY) {
2392 RT_TRACE(rtlpriv, COMP_SEC, 2436 RT_TRACE(rtlpriv, COMP_SEC,
2393 DBG_EMERG, 2437 DBG_EMERG,
2394 "Can not find free hw security cam entry\n"); 2438 "Can not find free hw security cam entry\n");
2395 return; 2439 return;
2396 } 2440 }
2397 } else { 2441 } else {
2398 id = CAM_PAIRWISE_KEY_POSITION; 2442 entry_id = CAM_PAIRWISE_KEY_POSITION;
2399 } 2443 }
2400 2444 key_index = PAIRWISE_KEYIDX;
2401 key = PAIRWISE_KEYIDX;
2402 is_pairwise = true; 2445 is_pairwise = true;
2403 } 2446 }
2404 } 2447 }
2405 2448
2406 if (rtlpriv->sec.key_len[key] == 0) { 2449 if (rtlpriv->sec.key_len[key_index] == 0) {
2407 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 2450 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2408 "delete one entry, id is %d\n", id); 2451 "delete one entry, entry_id is %d\n",
2452 entry_id);
2409 if (mac->opmode == NL80211_IFTYPE_AP || 2453 if (mac->opmode == NL80211_IFTYPE_AP ||
2410 mac->opmode == NL80211_IFTYPE_MESH_POINT) 2454 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2411 rtl_cam_del_entry(hw, mac_ad); 2455 rtl_cam_del_entry(hw, p_macaddr);
2412 rtl_cam_delete_one_entry(hw, mac_ad, id); 2456 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2413 } else { 2457 } else {
2414 add_one_key(hw, macaddr, mac, key, id, enc_algo, 2458 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2415 is_pairwise); 2459 "add one entry\n");
2460 if (is_pairwise) {
2461 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2462 "set Pairwise key\n");
2463
2464 rtl_cam_add_one_entry(hw, macaddr, key_index,
2465 entry_id, enc_algo,
2466 CAM_CONFIG_NO_USEDK,
2467 rtlpriv->sec.key_buf[key_index]);
2468 } else {
2469 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2470 "set group key\n");
2471
2472 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2473 rtl_cam_add_one_entry(hw,
2474 rtlefuse->dev_addr,
2475 PAIRWISE_KEYIDX,
2476 CAM_PAIRWISE_KEY_POSITION,
2477 enc_algo,
2478 CAM_CONFIG_NO_USEDK,
2479 rtlpriv->sec.key_buf
2480 [entry_id]);
2481 }
2482
2483 rtl_cam_add_one_entry(hw, macaddr, key_index,
2484 entry_id, enc_algo,
2485 CAM_CONFIG_NO_USEDK,
2486 rtlpriv->sec.key_buf[entry_id]);
2487 }
2488
2416 } 2489 }
2417 } 2490 }
2418} 2491}
2419 2492
2420static void rtl8188ee_bt_var_init(struct ieee80211_hw *hw) 2493static void rtl8188ee_bt_var_init(struct ieee80211_hw *hw)
2421{ 2494{
2422 struct rtl_pci_priv *rppriv = rtl_pcipriv(hw); 2495 struct rtl_priv *rtlpriv = rtl_priv(hw);
2423 struct bt_coexist_info coexist = rppriv->bt_coexist;
2424 2496
2425 coexist.bt_coexistence = rppriv->bt_coexist.eeprom_bt_coexist; 2497 rtlpriv->btcoexist.bt_coexistence =
2426 coexist.bt_ant_num = coexist.eeprom_bt_ant_num; 2498 rtlpriv->btcoexist.eeprom_bt_coexist;
2427 coexist.bt_coexist_type = coexist.eeprom_bt_type; 2499 rtlpriv->btcoexist.bt_ant_num = rtlpriv->btcoexist.eeprom_bt_ant_num;
2500 rtlpriv->btcoexist.bt_coexist_type = rtlpriv->btcoexist.eeprom_bt_type;
2428 2501
2429 if (coexist.reg_bt_iso == 2) 2502 if (rtlpriv->btcoexist.reg_bt_iso == 2)
2430 coexist.bt_ant_isolation = coexist.eeprom_bt_ant_isol; 2503 rtlpriv->btcoexist.bt_ant_isolation =
2504 rtlpriv->btcoexist.eeprom_bt_ant_isol;
2431 else 2505 else
2432 coexist.bt_ant_isolation = coexist.reg_bt_iso; 2506 rtlpriv->btcoexist.bt_ant_isolation =
2433 2507 rtlpriv->btcoexist.reg_bt_iso;
2434 coexist.bt_radio_shared_type = coexist.eeprom_bt_radio_shared; 2508
2435 2509 rtlpriv->btcoexist.bt_radio_shared_type =
2436 if (coexist.bt_coexistence) { 2510 rtlpriv->btcoexist.eeprom_bt_radio_shared;
2437 if (coexist.reg_bt_sco == 1) 2511
2438 coexist.bt_service = BT_OTHER_ACTION; 2512 if (rtlpriv->btcoexist.bt_coexistence) {
2439 else if (coexist.reg_bt_sco == 2) 2513 if (rtlpriv->btcoexist.reg_bt_sco == 1)
2440 coexist.bt_service = BT_SCO; 2514 rtlpriv->btcoexist.bt_service = BT_OTHER_ACTION;
2441 else if (coexist.reg_bt_sco == 4) 2515 else if (rtlpriv->btcoexist.reg_bt_sco == 2)
2442 coexist.bt_service = BT_BUSY; 2516 rtlpriv->btcoexist.bt_service = BT_SCO;
2443 else if (coexist.reg_bt_sco == 5) 2517 else if (rtlpriv->btcoexist.reg_bt_sco == 4)
2444 coexist.bt_service = BT_OTHERBUSY; 2518 rtlpriv->btcoexist.bt_service = BT_BUSY;
2519 else if (rtlpriv->btcoexist.reg_bt_sco == 5)
2520 rtlpriv->btcoexist.bt_service = BT_OTHERBUSY;
2445 else 2521 else
2446 coexist.bt_service = BT_IDLE; 2522 rtlpriv->btcoexist.bt_service = BT_IDLE;
2447 2523
2448 coexist.bt_edca_ul = 0; 2524 rtlpriv->btcoexist.bt_edca_ul = 0;
2449 coexist.bt_edca_dl = 0; 2525 rtlpriv->btcoexist.bt_edca_dl = 0;
2450 coexist.bt_rssi_state = 0xff; 2526 rtlpriv->btcoexist.bt_rssi_state = 0xff;
2451 } 2527 }
2452} 2528}
2453 2529
2454void rtl8188ee_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw, 2530void rtl8188ee_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2455 bool auto_load_fail, u8 *hwinfo) 2531 bool auto_load_fail, u8 *hwinfo)
2456{ 2532{
2533 struct rtl_priv *rtlpriv = rtl_priv(hw);
2534 u8 value;
2535
2536 if (!auto_load_fail) {
2537 rtlpriv->btcoexist.eeprom_bt_coexist =
2538 ((hwinfo[EEPROM_RF_FEATURE_OPTION_88E] & 0xe0) >> 5);
2539 if (hwinfo[EEPROM_RF_FEATURE_OPTION_88E] == 0xFF)
2540 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2541 value = hwinfo[EEPROM_RF_BT_SETTING_88E];
2542 rtlpriv->btcoexist.eeprom_bt_type = ((value & 0xe) >> 1);
2543 rtlpriv->btcoexist.eeprom_bt_ant_num = (value & 0x1);
2544 rtlpriv->btcoexist.eeprom_bt_ant_isol = ((value & 0x10) >> 4);
2545 rtlpriv->btcoexist.eeprom_bt_radio_shared =
2546 ((value & 0x20) >> 5);
2547 } else {
2548 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2549 rtlpriv->btcoexist.eeprom_bt_type = BT_2WIRE;
2550 rtlpriv->btcoexist.eeprom_bt_ant_num = ANT_X2;
2551 rtlpriv->btcoexist.eeprom_bt_ant_isol = 0;
2552 rtlpriv->btcoexist.eeprom_bt_radio_shared = BT_RADIO_SHARED;
2553 }
2554
2457 rtl8188ee_bt_var_init(hw); 2555 rtl8188ee_bt_var_init(hw);
2458} 2556}
2459 2557
2460void rtl8188ee_bt_reg_init(struct ieee80211_hw *hw) 2558void rtl8188ee_bt_reg_init(struct ieee80211_hw *hw)
2461{ 2559{
2462 struct rtl_pci_priv *rppriv = rtl_pcipriv(hw); 2560 struct rtl_priv *rtlpriv = rtl_priv(hw);
2463 2561
2464 /* 0:Low, 1:High, 2:From Efuse. */ 2562 /* 0:Low, 1:High, 2:From Efuse. */
2465 rppriv->bt_coexist.reg_bt_iso = 2; 2563 rtlpriv->btcoexist.reg_bt_iso = 2;
2466 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */ 2564 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2467 rppriv->bt_coexist.reg_bt_sco = 3; 2565 rtlpriv->btcoexist.reg_bt_sco = 3;
2468 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */ 2566 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2469 rppriv->bt_coexist.reg_bt_sco = 0; 2567 rtlpriv->btcoexist.reg_bt_sco = 0;
2470} 2568}
2471 2569
2472void rtl8188ee_bt_hw_init(struct ieee80211_hw *hw) 2570void rtl8188ee_bt_hw_init(struct ieee80211_hw *hw)
2473{ 2571{
2474 struct rtl_priv *rtlpriv = rtl_priv(hw); 2572 struct rtl_priv *rtlpriv = rtl_priv(hw);
2475 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2573 struct rtl_phy *rtlphy = &rtlpriv->phy;
2476 struct rtl_pci_priv *rppriv = rtl_pcipriv(hw);
2477 struct bt_coexist_info coexist = rppriv->bt_coexist;
2478 u8 u1_tmp; 2574 u8 u1_tmp;
2479 2575
2480 if (coexist.bt_coexistence && 2576 if (rtlpriv->btcoexist.bt_coexistence &&
2481 ((coexist.bt_coexist_type == BT_CSR_BC4) || 2577 ((rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) ||
2482 coexist.bt_coexist_type == BT_CSR_BC8)) { 2578 rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC8)) {
2483 if (coexist.bt_ant_isolation) 2579 if (rtlpriv->btcoexist.bt_ant_isolation)
2484 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0); 2580 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG, 0xa0);
2485 2581
2486 u1_tmp = rtl_read_byte(rtlpriv, 0x4fd) & 2582 u1_tmp = rtl_read_byte(rtlpriv, 0x4fd) &
2487 BIT_OFFSET_LEN_MASK_32(0, 1); 2583 BIT_OFFSET_LEN_MASK_32(0, 1);
2488 u1_tmp = u1_tmp | ((coexist.bt_ant_isolation == 1) ? 2584 u1_tmp = u1_tmp |
2585 ((rtlpriv->btcoexist.bt_ant_isolation == 1) ?
2489 0 : BIT_OFFSET_LEN_MASK_32(1, 1)) | 2586 0 : BIT_OFFSET_LEN_MASK_32(1, 1)) |
2490 ((coexist.bt_service == BT_SCO) ? 2587 ((rtlpriv->btcoexist.bt_service == BT_SCO) ?
2491 0 : BIT_OFFSET_LEN_MASK_32(2, 1)); 2588 0 : BIT_OFFSET_LEN_MASK_32(2, 1));
2492 rtl_write_byte(rtlpriv, 0x4fd, u1_tmp); 2589 rtl_write_byte(rtlpriv, 0x4fd, u1_tmp);
2493 2590
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/led.c b/drivers/net/wireless/rtlwifi/rtl8188ee/led.c
index c81a9cb6894c..b504bd092fc4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/led.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/led.c
@@ -32,8 +32,8 @@
32#include "reg.h" 32#include "reg.h"
33#include "led.h" 33#include "led.h"
34 34
35static void rtl88ee_init_led(struct ieee80211_hw *hw, 35static void _rtl88ee_init_led(struct ieee80211_hw *hw,
36 struct rtl_led *pled, enum rtl_led_pin ledpin) 36 struct rtl_led *pled, enum rtl_led_pin ledpin)
37{ 37{
38 pled->hw = hw; 38 pled->hw = hw;
39 pled->ledpin = ledpin; 39 pled->ledpin = ledpin;
@@ -46,23 +46,23 @@ void rtl88ee_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
46 struct rtl_priv *rtlpriv = rtl_priv(hw); 46 struct rtl_priv *rtlpriv = rtl_priv(hw);
47 47
48 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, 48 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
49 "LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); 49 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
50 50
51 switch (pled->ledpin) { 51 switch (pled->ledpin) {
52 case LED_PIN_GPIO0: 52 case LED_PIN_GPIO0:
53 break; 53 break;
54 case LED_PIN_LED0: 54 case LED_PIN_LED0:
55 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); 55 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
56 rtl_write_byte(rtlpriv, REG_LEDCFG2, 56 rtl_write_byte(rtlpriv,
57 (ledcfg & 0xf0) | BIT(5) | BIT(6)); 57 REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5) | BIT(6));
58 break; 58 break;
59 case LED_PIN_LED1: 59 case LED_PIN_LED1:
60 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1); 60 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
61 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10); 61 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10);
62 break; 62 break;
63 default: 63 default:
64 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 64 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
65 "switch case not processed\n"); 65 "switch case not process\n");
66 break; 66 break;
67 } 67 }
68 pled->ledon = true; 68 pled->ledon = true;
@@ -73,10 +73,9 @@ void rtl88ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
73 struct rtl_priv *rtlpriv = rtl_priv(hw); 73 struct rtl_priv *rtlpriv = rtl_priv(hw);
74 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 74 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
75 u8 ledcfg; 75 u8 ledcfg;
76 u8 val;
77 76
78 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, 77 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
79 "LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); 78 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
80 79
81 switch (pled->ledpin) { 80 switch (pled->ledpin) {
82 case LED_PIN_GPIO0: 81 case LED_PIN_GPIO0:
@@ -84,15 +83,15 @@ void rtl88ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
84 case LED_PIN_LED0: 83 case LED_PIN_LED0:
85 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); 84 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
86 ledcfg &= 0xf0; 85 ledcfg &= 0xf0;
87 val = ledcfg | BIT(3) | BIT(5) | BIT(6); 86 if (pcipriv->ledctl.led_opendrain) {
88 if (pcipriv->ledctl.led_opendrain == true) { 87 rtl_write_byte(rtlpriv, REG_LEDCFG2,
89 rtl_write_byte(rtlpriv, REG_LEDCFG2, val); 88 (ledcfg | BIT(3) | BIT(5) | BIT(6)));
90 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG); 89 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG);
91 val = ledcfg & 0xFE; 90 rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG,
92 rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, val); 91 (ledcfg & 0xFE));
93 } else { 92 } else
94 rtl_write_byte(rtlpriv, REG_LEDCFG2, val); 93 rtl_write_byte(rtlpriv, REG_LEDCFG2,
95 } 94 (ledcfg | BIT(3) | BIT(5) | BIT(6)));
96 break; 95 break;
97 case LED_PIN_LED1: 96 case LED_PIN_LED1:
98 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1); 97 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
@@ -100,8 +99,8 @@ void rtl88ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
100 rtl_write_byte(rtlpriv, REG_LEDCFG1, (ledcfg | BIT(3))); 99 rtl_write_byte(rtlpriv, REG_LEDCFG1, (ledcfg | BIT(3)));
101 break; 100 break;
102 default: 101 default:
103 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 102 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
104 "switch case not processed\n"); 103 "switch case not process\n");
105 break; 104 break;
106 } 105 }
107 pled->ledon = false; 106 pled->ledon = false;
@@ -110,17 +109,15 @@ void rtl88ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
110void rtl88ee_init_sw_leds(struct ieee80211_hw *hw) 109void rtl88ee_init_sw_leds(struct ieee80211_hw *hw)
111{ 110{
112 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 111 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
113 112 _rtl88ee_init_led(hw, &pcipriv->ledctl.sw_led0, LED_PIN_LED0);
114 rtl88ee_init_led(hw, &(pcipriv->ledctl.sw_led0), LED_PIN_LED0); 113 _rtl88ee_init_led(hw, &pcipriv->ledctl.sw_led1, LED_PIN_LED1);
115 rtl88ee_init_led(hw, &(pcipriv->ledctl.sw_led1), LED_PIN_LED1);
116} 114}
117 115
118static void rtl88ee_sw_led_control(struct ieee80211_hw *hw, 116static void _rtl88ee_sw_led_control(struct ieee80211_hw *hw,
119 enum led_ctl_mode ledaction) 117 enum led_ctl_mode ledaction)
120{ 118{
121 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 119 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
122 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0); 120 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0);
123
124 switch (ledaction) { 121 switch (ledaction) {
125 case LED_CTL_POWER_ON: 122 case LED_CTL_POWER_ON:
126 case LED_CTL_LINK: 123 case LED_CTL_LINK:
@@ -152,6 +149,6 @@ void rtl88ee_led_control(struct ieee80211_hw *hw,
152 return; 149 return;
153 } 150 }
154 RT_TRACE(rtlpriv, COMP_LED, DBG_TRACE, "ledaction %d,\n", 151 RT_TRACE(rtlpriv, COMP_LED, DBG_TRACE, "ledaction %d,\n",
155 ledaction); 152 ledaction);
156 rtl88ee_sw_led_control(hw, ledaction); 153 _rtl88ee_sw_led_control(hw, ledaction);
157} 154}
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/led.h b/drivers/net/wireless/rtlwifi/rtl8188ee/led.h
index 4073f6f847b2..4b325b75faaf 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/led.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/led.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
index 1cd6c16d597e..3f6c59cdeaba 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -29,7 +25,6 @@
29 25
30#include "../wifi.h" 26#include "../wifi.h"
31#include "../pci.h" 27#include "../pci.h"
32#include "../core.h"
33#include "../ps.h" 28#include "../ps.h"
34#include "reg.h" 29#include "reg.h"
35#include "def.h" 30#include "def.h"
@@ -38,443 +33,32 @@
38#include "dm.h" 33#include "dm.h"
39#include "table.h" 34#include "table.h"
40 35
41static void set_baseband_phy_config(struct ieee80211_hw *hw); 36static u32 _rtl88e_phy_rf_serial_read(struct ieee80211_hw *hw,
42static void set_baseband_agc_config(struct ieee80211_hw *hw); 37 enum radio_path rfpath, u32 offset);
43static void store_pwrindex_offset(struct ieee80211_hw *hw, 38static void _rtl88e_phy_rf_serial_write(struct ieee80211_hw *hw,
44 u32 regaddr, u32 bitmask, 39 enum radio_path rfpath, u32 offset,
45 u32 data); 40 u32 data);
46static bool check_cond(struct ieee80211_hw *hw, const u32 condition); 41static u32 _rtl88e_phy_calculate_bit_shift(u32 bitmask);
47 42static bool _rtl88e_phy_bb8188e_config_parafile(struct ieee80211_hw *hw);
48static u32 rf_serial_read(struct ieee80211_hw *hw, 43static bool _rtl88e_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
49 enum radio_path rfpath, u32 offset) 44static bool phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
50{ 45 u8 configtype);
51 struct rtl_priv *rtlpriv = rtl_priv(hw); 46static bool phy_config_bb_with_pghdr(struct ieee80211_hw *hw,
52 struct rtl_phy *rtlphy = &(rtlpriv->phy); 47 u8 configtype);
53 struct bb_reg_def *phreg = &rtlphy->phyreg_def[rfpath]; 48static void _rtl88e_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
54 u32 newoffset; 49static bool _rtl88e_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
55 u32 tmplong, tmplong2; 50 u32 cmdtableidx, u32 cmdtablesz,
56 u8 rfpi_enable = 0; 51 enum swchnlcmd_id cmdid, u32 para1,
57 u32 ret; 52 u32 para2, u32 msdelay);
58 int jj = RF90_PATH_A; 53static bool _rtl88e_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
59 int kk = RF90_PATH_B; 54 u8 channel, u8 *stage, u8 *step,
60 55 u32 *delay);
61 offset &= 0xff; 56
62 newoffset = offset; 57static long _rtl88e_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
63 if (RT_CANNOT_IO(hw)) { 58 enum wireless_mode wirelessmode,
64 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n"); 59 u8 txpwridx);
65 return 0xFFFFFFFF; 60static void rtl88ee_phy_set_rf_on(struct ieee80211_hw *hw);
66 } 61static void rtl88e_phy_set_io(struct ieee80211_hw *hw);
67 tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
68 if (rfpath == jj)
69 tmplong2 = tmplong;
70 else
71 tmplong2 = rtl_get_bbreg(hw, phreg->rfhssi_para2, MASKDWORD);
72 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
73 (newoffset << 23) | BLSSIREADEDGE;
74 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
75 tmplong & (~BLSSIREADEDGE));
76 mdelay(1);
77 rtl_set_bbreg(hw, phreg->rfhssi_para2, MASKDWORD, tmplong2);
78 mdelay(2);
79 if (rfpath == jj)
80 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
81 BIT(8));
82 else if (rfpath == kk)
83 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
84 BIT(8));
85 if (rfpi_enable)
86 ret = rtl_get_bbreg(hw, phreg->rf_rbpi, BLSSIREADBACKDATA);
87 else
88 ret = rtl_get_bbreg(hw, phreg->rf_rb, BLSSIREADBACKDATA);
89 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x]= 0x%x\n",
90 rfpath, phreg->rf_rb, ret);
91 return ret;
92}
93
94static void rf_serial_write(struct ieee80211_hw *hw,
95 enum radio_path rfpath, u32 offset,
96 u32 data)
97{
98 u32 data_and_addr;
99 u32 newoffset;
100 struct rtl_priv *rtlpriv = rtl_priv(hw);
101 struct rtl_phy *rtlphy = &(rtlpriv->phy);
102 struct bb_reg_def *phreg = &rtlphy->phyreg_def[rfpath];
103
104 if (RT_CANNOT_IO(hw)) {
105 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
106 return;
107 }
108 offset &= 0xff;
109 newoffset = offset;
110 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
111 rtl_set_bbreg(hw, phreg->rf3wire_offset, MASKDWORD, data_and_addr);
112 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]= 0x%x\n",
113 rfpath, phreg->rf3wire_offset, data_and_addr);
114}
115
116static u32 cal_bit_shift(u32 bitmask)
117{
118 u32 i;
119
120 for (i = 0; i <= 31; i++) {
121 if (((bitmask >> i) & 0x1) == 1)
122 break;
123 }
124 return i;
125}
126
127static bool config_bb_with_header(struct ieee80211_hw *hw,
128 u8 configtype)
129{
130 if (configtype == BASEBAND_CONFIG_PHY_REG)
131 set_baseband_phy_config(hw);
132 else if (configtype == BASEBAND_CONFIG_AGC_TAB)
133 set_baseband_agc_config(hw);
134 return true;
135}
136
137static bool config_bb_with_pgheader(struct ieee80211_hw *hw,
138 u8 configtype)
139{
140 struct rtl_priv *rtlpriv = rtl_priv(hw);
141 int i;
142 u32 *table_pg;
143 u16 tbl_page_len;
144 u32 v1 = 0, v2 = 0;
145
146 tbl_page_len = RTL8188EEPHY_REG_ARRAY_PGLEN;
147 table_pg = RTL8188EEPHY_REG_ARRAY_PG;
148
149 if (configtype == BASEBAND_CONFIG_PHY_REG) {
150 for (i = 0; i < tbl_page_len; i = i + 3) {
151 v1 = table_pg[i];
152 v2 = table_pg[i + 1];
153
154 if (v1 < 0xcdcdcdcd) {
155 rtl_addr_delay(table_pg[i]);
156
157 store_pwrindex_offset(hw, table_pg[i],
158 table_pg[i + 1],
159 table_pg[i + 2]);
160 continue;
161 } else {
162 if (!check_cond(hw, table_pg[i])) {
163 /*don't need the hw_body*/
164 i += 2; /* skip the pair of expression*/
165 v1 = table_pg[i];
166 v2 = table_pg[i + 1];
167 while (v2 != 0xDEAD) {
168 i += 3;
169 v1 = table_pg[i];
170 v2 = table_pg[i + 1];
171 }
172 }
173 }
174 }
175 } else {
176 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
177 "configtype != BaseBand_Config_PHY_REG\n");
178 }
179 return true;
180}
181
182static bool config_parafile(struct ieee80211_hw *hw)
183{
184 struct rtl_priv *rtlpriv = rtl_priv(hw);
185 struct rtl_phy *rtlphy = &(rtlpriv->phy);
186 struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw));
187 bool rtstatus;
188
189 rtstatus = config_bb_with_header(hw, BASEBAND_CONFIG_PHY_REG);
190 if (rtstatus != true) {
191 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
192 return false;
193 }
194
195 if (fuse->autoload_failflag == false) {
196 rtlphy->pwrgroup_cnt = 0;
197 rtstatus = config_bb_with_pgheader(hw, BASEBAND_CONFIG_PHY_REG);
198 }
199 if (rtstatus != true) {
200 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
201 return false;
202 }
203 rtstatus = config_bb_with_header(hw, BASEBAND_CONFIG_AGC_TAB);
204 if (rtstatus != true) {
205 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
206 return false;
207 }
208 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
209 RFPGA0_XA_HSSIPARAMETER2, 0x200));
210
211 return true;
212}
213
214static void rtl88e_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
215{
216 struct rtl_priv *rtlpriv = rtl_priv(hw);
217 struct rtl_phy *rtlphy = &(rtlpriv->phy);
218 int jj = RF90_PATH_A;
219 int kk = RF90_PATH_B;
220
221 rtlphy->phyreg_def[jj].rfintfs = RFPGA0_XAB_RFINTERFACESW;
222 rtlphy->phyreg_def[kk].rfintfs = RFPGA0_XAB_RFINTERFACESW;
223 rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
224 rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
225
226 rtlphy->phyreg_def[jj].rfintfi = RFPGA0_XAB_RFINTERFACERB;
227 rtlphy->phyreg_def[kk].rfintfi = RFPGA0_XAB_RFINTERFACERB;
228 rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
229 rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
230
231 rtlphy->phyreg_def[jj].rfintfo = RFPGA0_XA_RFINTERFACEOE;
232 rtlphy->phyreg_def[kk].rfintfo = RFPGA0_XB_RFINTERFACEOE;
233
234 rtlphy->phyreg_def[jj].rfintfe = RFPGA0_XA_RFINTERFACEOE;
235 rtlphy->phyreg_def[kk].rfintfe = RFPGA0_XB_RFINTERFACEOE;
236
237 rtlphy->phyreg_def[jj].rf3wire_offset = RFPGA0_XA_LSSIPARAMETER;
238 rtlphy->phyreg_def[kk].rf3wire_offset = RFPGA0_XB_LSSIPARAMETER;
239
240 rtlphy->phyreg_def[jj].rflssi_select = rFPGA0_XAB_RFPARAMETER;
241 rtlphy->phyreg_def[kk].rflssi_select = rFPGA0_XAB_RFPARAMETER;
242 rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = rFPGA0_XCD_RFPARAMETER;
243 rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = rFPGA0_XCD_RFPARAMETER;
244
245 rtlphy->phyreg_def[jj].rftxgain_stage = RFPGA0_TXGAINSTAGE;
246 rtlphy->phyreg_def[kk].rftxgain_stage = RFPGA0_TXGAINSTAGE;
247 rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
248 rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
249
250 rtlphy->phyreg_def[jj].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
251 rtlphy->phyreg_def[kk].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
252
253 rtlphy->phyreg_def[jj].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
254 rtlphy->phyreg_def[kk].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
255
256 rtlphy->phyreg_def[jj].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
257 rtlphy->phyreg_def[kk].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
258 rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
259 rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
260
261 rtlphy->phyreg_def[jj].rfagc_control1 = ROFDM0_XAAGCCORE1;
262 rtlphy->phyreg_def[kk].rfagc_control1 = ROFDM0_XBAGCCORE1;
263 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
264 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
265
266 rtlphy->phyreg_def[jj].rfagc_control2 = ROFDM0_XAAGCCORE2;
267 rtlphy->phyreg_def[kk].rfagc_control2 = ROFDM0_XBAGCCORE2;
268 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
269 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
270
271 rtlphy->phyreg_def[jj].rfrxiq_imbal = ROFDM0_XARXIQIMBAL;
272 rtlphy->phyreg_def[kk].rfrxiq_imbal = ROFDM0_XBRXIQIMBAL;
273 rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBAL;
274 rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBAL;
275
276 rtlphy->phyreg_def[jj].rfrx_afe = ROFDM0_XARXAFE;
277 rtlphy->phyreg_def[kk].rfrx_afe = ROFDM0_XBRXAFE;
278 rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
279 rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
280
281 rtlphy->phyreg_def[jj].rftxiq_imbal = ROFDM0_XATXIQIMBAL;
282 rtlphy->phyreg_def[kk].rftxiq_imbal = ROFDM0_XBTXIQIMBAL;
283 rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTXIQIMBAL;
284 rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTXIQIMBAL;
285
286 rtlphy->phyreg_def[jj].rftx_afe = ROFDM0_XATXAFE;
287 rtlphy->phyreg_def[kk].rftx_afe = ROFDM0_XBTXAFE;
288
289 rtlphy->phyreg_def[jj].rf_rb = RFPGA0_XA_LSSIREADBACK;
290 rtlphy->phyreg_def[kk].rf_rb = RFPGA0_XB_LSSIREADBACK;
291
292 rtlphy->phyreg_def[jj].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
293 rtlphy->phyreg_def[kk].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
294}
295
296static bool rtl88e_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
297 u32 cmdtableidx, u32 cmdtablesz,
298 enum swchnlcmd_id cmdid,
299 u32 para1, u32 para2, u32 msdelay)
300{
301 struct swchnlcmd *pcmd;
302
303 if (cmdtable == NULL) {
304 RT_ASSERT(false, "cmdtable cannot be NULL.\n");
305 return false;
306 }
307
308 if (cmdtableidx >= cmdtablesz)
309 return false;
310
311 pcmd = cmdtable + cmdtableidx;
312 pcmd->cmdid = cmdid;
313 pcmd->para1 = para1;
314 pcmd->para2 = para2;
315 pcmd->msdelay = msdelay;
316 return true;
317}
318
319static bool chnl_step_by_step(struct ieee80211_hw *hw,
320 u8 channel, u8 *stage, u8 *step,
321 u32 *delay)
322{
323 struct rtl_priv *rtlpriv = rtl_priv(hw);
324 struct rtl_phy *rtlphy = &(rtlpriv->phy);
325 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
326 u32 precommoncmdcnt;
327 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
328 u32 postcommoncmdcnt;
329 struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
330 u32 rfdependcmdcnt;
331 struct swchnlcmd *currentcmd = NULL;
332 u8 rfpath;
333 u8 num_total_rfpath = rtlphy->num_total_rfpath;
334
335 precommoncmdcnt = 0;
336 rtl88e_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
337 MAX_PRECMD_CNT,
338 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
339 rtl88e_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
340 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
341
342 postcommoncmdcnt = 0;
343
344 rtl88e_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
345 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
346
347 rfdependcmdcnt = 0;
348
349 RT_ASSERT((channel >= 1 && channel <= 14),
350 "illegal channel for Zebra: %d\n", channel);
351
352 rtl88e_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
353 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
354 RF_CHNLBW, channel, 10);
355
356 rtl88e_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
357 MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
358 0);
359
360 do {
361 switch (*stage) {
362 case 0:
363 currentcmd = &precommoncmd[*step];
364 break;
365 case 1:
366 currentcmd = &rfdependcmd[*step];
367 break;
368 case 2:
369 currentcmd = &postcommoncmd[*step];
370 break;
371 }
372
373 if (currentcmd->cmdid == CMDID_END) {
374 if ((*stage) == 2) {
375 return true;
376 } else {
377 (*stage)++;
378 (*step) = 0;
379 continue;
380 }
381 }
382
383 switch (currentcmd->cmdid) {
384 case CMDID_SET_TXPOWEROWER_LEVEL:
385 rtl88e_phy_set_txpower_level(hw, channel);
386 break;
387 case CMDID_WRITEPORT_ULONG:
388 rtl_write_dword(rtlpriv, currentcmd->para1,
389 currentcmd->para2);
390 break;
391 case CMDID_WRITEPORT_USHORT:
392 rtl_write_word(rtlpriv, currentcmd->para1,
393 (u16) currentcmd->para2);
394 break;
395 case CMDID_WRITEPORT_UCHAR:
396 rtl_write_byte(rtlpriv, currentcmd->para1,
397 (u8) currentcmd->para2);
398 break;
399 case CMDID_RF_WRITEREG:
400 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
401 rtlphy->rfreg_chnlval[rfpath] =
402 ((rtlphy->rfreg_chnlval[rfpath] &
403 0xfffffc00) | currentcmd->para2);
404
405 rtl_set_rfreg(hw, (enum radio_path)rfpath,
406 currentcmd->para1,
407 RFREG_OFFSET_MASK,
408 rtlphy->rfreg_chnlval[rfpath]);
409 }
410 break;
411 default:
412 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
413 "switch case not processed\n");
414 break;
415 }
416
417 break;
418 } while (true);
419
420 (*delay) = currentcmd->msdelay;
421 (*step)++;
422 return false;
423}
424
425static long rtl88e_pwr_idx_dbm(struct ieee80211_hw *hw,
426 enum wireless_mode wirelessmode,
427 u8 txpwridx)
428{
429 long offset;
430 long pwrout_dbm;
431
432 switch (wirelessmode) {
433 case WIRELESS_MODE_B:
434 offset = -7;
435 break;
436 case WIRELESS_MODE_G:
437 case WIRELESS_MODE_N_24G:
438 offset = -8;
439 break;
440 default:
441 offset = -8;
442 break;
443 }
444 pwrout_dbm = txpwridx / 2 + offset;
445 return pwrout_dbm;
446}
447
448static void rtl88e_phy_set_io(struct ieee80211_hw *hw)
449{
450 struct rtl_priv *rtlpriv = rtl_priv(hw);
451 struct rtl_phy *rtlphy = &(rtlpriv->phy);
452 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
453
454 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
455 "--->Cmd(%#x), set_io_inprogress(%d)\n",
456 rtlphy->current_io_type, rtlphy->set_io_inprogress);
457 switch (rtlphy->current_io_type) {
458 case IO_CMD_RESUME_DM_BY_SCAN:
459 dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
460 /*rtl92c_dm_write_dig(hw);*/
461 rtl88e_phy_set_txpower_level(hw, rtlphy->current_channel);
462 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x83);
463 break;
464 case IO_CMD_PAUSE_DM_BY_SCAN:
465 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
466 dm_digtable->cur_igvalue = 0x17;
467 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x40);
468 break;
469 default:
470 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
471 "switch case not processed\n");
472 break;
473 }
474 rtlphy->set_io_inprogress = false;
475 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
476 "(%#x)\n", rtlphy->current_io_type);
477}
478 62
479u32 rtl88e_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) 63u32 rtl88e_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
480{ 64{
@@ -484,14 +68,15 @@ u32 rtl88e_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
484 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 68 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
485 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); 69 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask);
486 originalvalue = rtl_read_dword(rtlpriv, regaddr); 70 originalvalue = rtl_read_dword(rtlpriv, regaddr);
487 bitshift = cal_bit_shift(bitmask); 71 bitshift = _rtl88e_phy_calculate_bit_shift(bitmask);
488 returnvalue = (originalvalue & bitmask) >> bitshift; 72 returnvalue = (originalvalue & bitmask) >> bitshift;
489 73
490 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 74 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
491 "BBR MASK = 0x%x Addr[0x%x]= 0x%x\n", bitmask, 75 "BBR MASK=0x%x Addr[0x%x]=0x%x\n", bitmask,
492 regaddr, originalvalue); 76 regaddr, originalvalue);
493 77
494 return returnvalue; 78 return returnvalue;
79
495} 80}
496 81
497void rtl88e_phy_set_bb_reg(struct ieee80211_hw *hw, 82void rtl88e_phy_set_bb_reg(struct ieee80211_hw *hw,
@@ -501,12 +86,12 @@ void rtl88e_phy_set_bb_reg(struct ieee80211_hw *hw,
501 u32 originalvalue, bitshift; 86 u32 originalvalue, bitshift;
502 87
503 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 88 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
504 "regaddr(%#x), bitmask(%#x),data(%#x)\n", 89 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
505 regaddr, bitmask, data); 90 regaddr, bitmask, data);
506 91
507 if (bitmask != MASKDWORD) { 92 if (bitmask != MASKDWORD) {
508 originalvalue = rtl_read_dword(rtlpriv, regaddr); 93 originalvalue = rtl_read_dword(rtlpriv, regaddr);
509 bitshift = cal_bit_shift(bitmask); 94 bitshift = _rtl88e_phy_calculate_bit_shift(bitmask);
510 data = ((originalvalue & (~bitmask)) | (data << bitshift)); 95 data = ((originalvalue & (~bitmask)) | (data << bitshift));
511 } 96 }
512 97
@@ -531,8 +116,8 @@ u32 rtl88e_phy_query_rf_reg(struct ieee80211_hw *hw,
531 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 116 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
532 117
533 118
534 original_value = rf_serial_read(hw, rfpath, regaddr); 119 original_value = _rtl88e_phy_rf_serial_read(hw, rfpath, regaddr);
535 bitshift = cal_bit_shift(bitmask); 120 bitshift = _rtl88e_phy_calculate_bit_shift(bitmask);
536 readback_value = (original_value & bitmask) >> bitshift; 121 readback_value = (original_value & bitmask) >> bitshift;
537 122
538 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 123 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
@@ -540,7 +125,6 @@ u32 rtl88e_phy_query_rf_reg(struct ieee80211_hw *hw,
540 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 125 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
541 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n", 126 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
542 regaddr, rfpath, bitmask, original_value); 127 regaddr, rfpath, bitmask, original_value);
543
544 return readback_value; 128 return readback_value;
545} 129}
546 130
@@ -559,13 +143,16 @@ void rtl88e_phy_set_rf_reg(struct ieee80211_hw *hw,
559 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 143 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
560 144
561 if (bitmask != RFREG_OFFSET_MASK) { 145 if (bitmask != RFREG_OFFSET_MASK) {
562 original_value = rf_serial_read(hw, rfpath, regaddr); 146 original_value = _rtl88e_phy_rf_serial_read(hw,
563 bitshift = cal_bit_shift(bitmask); 147 rfpath,
564 data = ((original_value & (~bitmask)) | 148 regaddr);
565 (data << bitshift)); 149 bitshift = _rtl88e_phy_calculate_bit_shift(bitmask);
150 data =
151 ((original_value & (~bitmask)) |
152 (data << bitshift));
566 } 153 }
567 154
568 rf_serial_write(hw, rfpath, regaddr, data); 155 _rtl88e_phy_rf_serial_write(hw, rfpath, regaddr, data);
569 156
570 157
571 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 158 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
@@ -575,27 +162,91 @@ void rtl88e_phy_set_rf_reg(struct ieee80211_hw *hw,
575 regaddr, bitmask, data, rfpath); 162 regaddr, bitmask, data, rfpath);
576} 163}
577 164
578static bool config_mac_with_header(struct ieee80211_hw *hw) 165static u32 _rtl88e_phy_rf_serial_read(struct ieee80211_hw *hw,
166 enum radio_path rfpath, u32 offset)
579{ 167{
580 struct rtl_priv *rtlpriv = rtl_priv(hw); 168 struct rtl_priv *rtlpriv = rtl_priv(hw);
169 struct rtl_phy *rtlphy = &rtlpriv->phy;
170 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
171 u32 newoffset;
172 u32 tmplong, tmplong2;
173 u8 rfpi_enable = 0;
174 u32 retvalue;
175
176 offset &= 0xff;
177 newoffset = offset;
178 if (RT_CANNOT_IO(hw)) {
179 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n");
180 return 0xFFFFFFFF;
181 }
182 tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
183 if (rfpath == RF90_PATH_A)
184 tmplong2 = tmplong;
185 else
186 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
187 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
188 (newoffset << 23) | BLSSIREADEDGE;
189 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
190 tmplong & (~BLSSIREADEDGE));
191 mdelay(1);
192 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
193 mdelay(2);
194 if (rfpath == RF90_PATH_A)
195 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
196 BIT(8));
197 else if (rfpath == RF90_PATH_B)
198 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
199 BIT(8));
200 if (rfpi_enable)
201 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
202 BLSSIREADBACKDATA);
203 else
204 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
205 BLSSIREADBACKDATA);
206 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
207 "RFR-%d Addr[0x%x]=0x%x\n",
208 rfpath, pphyreg->rf_rb, retvalue);
209 return retvalue;
210}
211
212static void _rtl88e_phy_rf_serial_write(struct ieee80211_hw *hw,
213 enum radio_path rfpath, u32 offset,
214 u32 data)
215{
216 u32 data_and_addr;
217 u32 newoffset;
218 struct rtl_priv *rtlpriv = rtl_priv(hw);
219 struct rtl_phy *rtlphy = &rtlpriv->phy;
220 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
221
222 if (RT_CANNOT_IO(hw)) {
223 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
224 return;
225 }
226 offset &= 0xff;
227 newoffset = offset;
228 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
229 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
230 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
231 "RFW-%d Addr[0x%x]=0x%x\n",
232 rfpath, pphyreg->rf3wire_offset, data_and_addr);
233}
234
235static u32 _rtl88e_phy_calculate_bit_shift(u32 bitmask)
236{
581 u32 i; 237 u32 i;
582 u32 arraylength;
583 u32 *ptrarray;
584 238
585 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8188EMACPHY_Array\n"); 239 for (i = 0; i <= 31; i++) {
586 arraylength = RTL8188EEMAC_1T_ARRAYLEN; 240 if (((bitmask >> i) & 0x1) == 1)
587 ptrarray = RTL8188EEMAC_1T_ARRAY; 241 break;
588 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 242 }
589 "Img:RTL8188EEMAC_1T_ARRAY LEN %d\n", arraylength); 243 return i;
590 for (i = 0; i < arraylength; i = i + 2)
591 rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
592 return true;
593} 244}
594 245
595bool rtl88e_phy_mac_config(struct ieee80211_hw *hw) 246bool rtl88e_phy_mac_config(struct ieee80211_hw *hw)
596{ 247{
597 struct rtl_priv *rtlpriv = rtl_priv(hw); 248 struct rtl_priv *rtlpriv = rtl_priv(hw);
598 bool rtstatus = config_mac_with_header(hw); 249 bool rtstatus = _rtl88e_phy_config_mac_with_headerfile(hw);
599 250
600 rtl_write_byte(rtlpriv, 0x04CA, 0x0B); 251 rtl_write_byte(rtlpriv, 0x04CA, 0x0B);
601 return rtstatus; 252 return rtstatus;
@@ -606,9 +257,9 @@ bool rtl88e_phy_bb_config(struct ieee80211_hw *hw)
606 bool rtstatus = true; 257 bool rtstatus = true;
607 struct rtl_priv *rtlpriv = rtl_priv(hw); 258 struct rtl_priv *rtlpriv = rtl_priv(hw);
608 u16 regval; 259 u16 regval;
609 u8 reg_hwparafile = 1; 260 u8 b_reg_hwparafile = 1;
610 u32 tmp; 261 u32 tmp;
611 rtl88e_phy_init_bb_rf_register_definition(hw); 262 _rtl88e_phy_init_bb_rf_register_definition(hw);
612 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN); 263 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
613 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, 264 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
614 regval | BIT(13) | BIT(0) | BIT(1)); 265 regval | BIT(13) | BIT(0) | BIT(1));
@@ -619,8 +270,8 @@ bool rtl88e_phy_bb_config(struct ieee80211_hw *hw)
619 FEN_BB_GLB_RSTN | FEN_BBRSTB); 270 FEN_BB_GLB_RSTN | FEN_BBRSTB);
620 tmp = rtl_read_dword(rtlpriv, 0x4c); 271 tmp = rtl_read_dword(rtlpriv, 0x4c);
621 rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23)); 272 rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
622 if (reg_hwparafile == 1) 273 if (b_reg_hwparafile == 1)
623 rtstatus = config_parafile(hw); 274 rtstatus = _rtl88e_phy_bb8188e_config_parafile(hw);
624 return rtstatus; 275 return rtstatus;
625} 276}
626 277
@@ -629,12 +280,12 @@ bool rtl88e_phy_rf_config(struct ieee80211_hw *hw)
629 return rtl88e_phy_rf6052_config(hw); 280 return rtl88e_phy_rf6052_config(hw);
630} 281}
631 282
632static bool check_cond(struct ieee80211_hw *hw, 283static bool _rtl88e_check_condition(struct ieee80211_hw *hw,
633 const u32 condition) 284 const u32 condition)
634{ 285{
635 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 286 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
636 struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw)); 287 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
637 u32 _board = fuse->board_type; /*need efuse define*/ 288 u32 _board = rtlefuse->board_type; /*need efuse define*/
638 u32 _interface = rtlhal->interface; 289 u32 _interface = rtlhal->interface;
639 u32 _platform = 0x08;/*SupportPlatform */ 290 u32 _platform = 0x08;/*SupportPlatform */
640 u32 cond = condition; 291 u32 cond = condition;
@@ -658,314 +309,504 @@ static bool check_cond(struct ieee80211_hw *hw,
658 return true; 309 return true;
659} 310}
660 311
661static void _rtl8188e_config_rf_reg(struct ieee80211_hw *hw, 312static void _rtl8188e_config_rf_reg(struct ieee80211_hw *hw, u32 addr,
662 u32 addr, u32 data, enum radio_path rfpath, 313 u32 data, enum radio_path rfpath,
663 u32 regaddr) 314 u32 regaddr)
664{ 315{
665 rtl_rfreg_delay(hw, rfpath, regaddr, 316 if (addr == 0xffe) {
666 RFREG_OFFSET_MASK, 317 mdelay(50);
667 data); 318 } else if (addr == 0xfd) {
319 mdelay(5);
320 } else if (addr == 0xfc) {
321 mdelay(1);
322 } else if (addr == 0xfb) {
323 udelay(50);
324 } else if (addr == 0xfa) {
325 udelay(5);
326 } else if (addr == 0xf9) {
327 udelay(1);
328 } else {
329 rtl_set_rfreg(hw, rfpath, regaddr,
330 RFREG_OFFSET_MASK,
331 data);
332 udelay(1);
333 }
668} 334}
669 335
670static void rtl88_config_s(struct ieee80211_hw *hw, 336static void _rtl8188e_config_rf_radio_a(struct ieee80211_hw *hw,
671 u32 addr, u32 data) 337 u32 addr, u32 data)
672{ 338{
673 u32 content = 0x1000; /*RF Content: radio_a_txt*/ 339 u32 content = 0x1000; /*RF Content: radio_a_txt*/
674 u32 maskforphyset = (u32)(content & 0xE000); 340 u32 maskforphyset = (u32)(content & 0xE000);
675 341
676 _rtl8188e_config_rf_reg(hw, addr, data, RF90_PATH_A, 342 _rtl8188e_config_rf_reg(hw, addr, data, RF90_PATH_A,
677 addr | maskforphyset); 343 addr | maskforphyset);
344}
345
346static void _rtl8188e_config_bb_reg(struct ieee80211_hw *hw,
347 u32 addr, u32 data)
348{
349 if (addr == 0xfe) {
350 mdelay(50);
351 } else if (addr == 0xfd) {
352 mdelay(5);
353 } else if (addr == 0xfc) {
354 mdelay(1);
355 } else if (addr == 0xfb) {
356 udelay(50);
357 } else if (addr == 0xfa) {
358 udelay(5);
359 } else if (addr == 0xf9) {
360 udelay(1);
361 } else {
362 rtl_set_bbreg(hw, addr, MASKDWORD, data);
363 udelay(1);
364 }
678} 365}
679 366
680#define NEXT_PAIR(v1, v2, i) \ 367static bool _rtl88e_phy_bb8188e_config_parafile(struct ieee80211_hw *hw)
368{
369 struct rtl_priv *rtlpriv = rtl_priv(hw);
370 struct rtl_phy *rtlphy = &rtlpriv->phy;
371 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
372 bool rtstatus;
373
374 rtstatus = phy_config_bb_with_headerfile(hw, BASEBAND_CONFIG_PHY_REG);
375 if (!rtstatus) {
376 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
377 return false;
378 }
379
380 if (!rtlefuse->autoload_failflag) {
381 rtlphy->pwrgroup_cnt = 0;
382 rtstatus =
383 phy_config_bb_with_pghdr(hw, BASEBAND_CONFIG_PHY_REG);
384 }
385 if (!rtstatus) {
386 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
387 return false;
388 }
389 rtstatus =
390 phy_config_bb_with_headerfile(hw, BASEBAND_CONFIG_AGC_TAB);
391 if (!rtstatus) {
392 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
393 return false;
394 }
395 rtlphy->cck_high_power =
396 (bool)(rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, 0x200));
397
398 return true;
399}
400
401static bool _rtl88e_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
402{
403 struct rtl_priv *rtlpriv = rtl_priv(hw);
404 u32 i;
405 u32 arraylength;
406 u32 *ptrarray;
407
408 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8188EMACPHY_Array\n");
409 arraylength = RTL8188EEMAC_1T_ARRAYLEN;
410 ptrarray = RTL8188EEMAC_1T_ARRAY;
411 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
412 "Img:RTL8188EEMAC_1T_ARRAY LEN %d\n", arraylength);
413 for (i = 0; i < arraylength; i = i + 2)
414 rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]);
415 return true;
416}
417
418#define READ_NEXT_PAIR(v1, v2, i) \
681 do { \ 419 do { \
682 i += 2; v1 = array_table[i]; \ 420 i += 2; v1 = array_table[i]; \
683 v2 = array_table[i + 1]; \ 421 v2 = array_table[i+1]; \
684 } while (0) 422 } while (0)
685 423
686static void set_baseband_agc_config(struct ieee80211_hw *hw) 424static void handle_branch1(struct ieee80211_hw *hw, u16 arraylen,
425 u32 *array_table)
687{ 426{
427 u32 v1;
428 u32 v2;
688 int i; 429 int i;
689 u32 *array_table;
690 u16 arraylen;
691 struct rtl_priv *rtlpriv = rtl_priv(hw);
692 u32 v1 = 0, v2 = 0;
693 430
694 arraylen = RTL8188EEAGCTAB_1TARRAYLEN; 431 for (i = 0; i < arraylen; i = i + 2) {
695 array_table = RTL8188EEAGCTAB_1TARRAY; 432 v1 = array_table[i];
433 v2 = array_table[i+1];
434 if (v1 < 0xcdcdcdcd) {
435 _rtl8188e_config_bb_reg(hw, v1, v2);
436 } else { /*This line is the start line of branch.*/
437 /* to protect READ_NEXT_PAIR not overrun */
438 if (i >= arraylen - 2)
439 break;
440
441 if (!_rtl88e_check_condition(hw, array_table[i])) {
442 /*Discard the following (offset, data) pairs*/
443 READ_NEXT_PAIR(v1, v2, i);
444 while (v2 != 0xDEAD &&
445 v2 != 0xCDEF &&
446 v2 != 0xCDCD && i < arraylen - 2)
447 READ_NEXT_PAIR(v1, v2, i);
448 i -= 2; /* prevent from for-loop += 2*/
449 } else { /* Configure matched pairs and skip
450 * to end of if-else.
451 */
452 READ_NEXT_PAIR(v1, v2, i);
453 while (v2 != 0xDEAD &&
454 v2 != 0xCDEF &&
455 v2 != 0xCDCD && i < arraylen - 2)
456 _rtl8188e_config_bb_reg(hw, v1, v2);
457 READ_NEXT_PAIR(v1, v2, i);
458
459 while (v2 != 0xDEAD && i < arraylen - 2)
460 READ_NEXT_PAIR(v1, v2, i);
461 }
462 }
463 }
464}
465
466static void handle_branch2(struct ieee80211_hw *hw, u16 arraylen,
467 u32 *array_table)
468{
469 struct rtl_priv *rtlpriv = rtl_priv(hw);
470 u32 v1;
471 u32 v2;
472 int i;
696 473
697 for (i = 0; i < arraylen; i += 2) { 474 for (i = 0; i < arraylen; i = i + 2) {
698 v1 = array_table[i]; 475 v1 = array_table[i];
699 v2 = array_table[i + 1]; 476 v2 = array_table[i+1];
700 if (v1 < 0xCDCDCDCD) { 477 if (v1 < 0xCDCDCDCD) {
701 rtl_set_bbreg(hw, array_table[i], MASKDWORD, 478 rtl_set_bbreg(hw, array_table[i], MASKDWORD,
702 array_table[i + 1]); 479 array_table[i + 1]);
703 udelay(1); 480 udelay(1);
704 continue; 481 continue;
705 } else {/*This line is the start line of branch.*/ 482 } else { /*This line is the start line of branch.*/
706 if (!check_cond(hw, array_table[i])) { 483 /* to protect READ_NEXT_PAIR not overrun */
484 if (i >= arraylen - 2)
485 break;
486
487 if (!_rtl88e_check_condition(hw, array_table[i])) {
707 /*Discard the following (offset, data) pairs*/ 488 /*Discard the following (offset, data) pairs*/
708 NEXT_PAIR(v1, v2, i); 489 READ_NEXT_PAIR(v1, v2, i);
709 while (v2 != 0xDEAD && v2 != 0xCDEF && 490 while (v2 != 0xDEAD &&
710 v2 != 0xCDCD && i < arraylen - 2) { 491 v2 != 0xCDEF &&
711 NEXT_PAIR(v1, v2, i); 492 v2 != 0xCDCD && i < arraylen - 2)
712 } 493 READ_NEXT_PAIR(v1, v2, i);
713 i -= 2; /* compensate for loop's += 2*/ 494 i -= 2; /* prevent from for-loop += 2*/
714 } else { 495 } else { /* Configure matched pairs and skip
715 /* Configure matched pairs and skip to end */ 496 * to end of if-else.
716 NEXT_PAIR(v1, v2, i); 497 */
717 while (v2 != 0xDEAD && v2 != 0xCDEF && 498 READ_NEXT_PAIR(v1, v2, i);
499 while (v2 != 0xDEAD &&
500 v2 != 0xCDEF &&
718 v2 != 0xCDCD && i < arraylen - 2) { 501 v2 != 0xCDCD && i < arraylen - 2) {
719 rtl_set_bbreg(hw, array_table[i], 502 rtl_set_bbreg(hw, array_table[i],
720 MASKDWORD, 503 MASKDWORD,
721 array_table[i + 1]); 504 array_table[i + 1]);
722 udelay(1); 505 udelay(1);
723 NEXT_PAIR(v1, v2, i); 506 READ_NEXT_PAIR(v1, v2, i);
724 } 507 }
725 508
726 while (v2 != 0xDEAD && i < arraylen - 2) 509 while (v2 != 0xDEAD && i < arraylen - 2)
727 NEXT_PAIR(v1, v2, i); 510 READ_NEXT_PAIR(v1, v2, i);
728 } 511 }
729 } 512 }
730 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 513 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
731 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n", 514 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
732 array_table[i], 515 array_table[i], array_table[i + 1]);
733 array_table[i + 1]);
734 } 516 }
735} 517}
736 518
737static void set_baseband_phy_config(struct ieee80211_hw *hw) 519static bool phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
520 u8 configtype)
738{ 521{
739 int i;
740 u32 *array_table; 522 u32 *array_table;
741 u16 arraylen; 523 u16 arraylen;
742 u32 v1 = 0, v2 = 0;
743
744 arraylen = RTL8188EEPHY_REG_1TARRAYLEN;
745 array_table = RTL8188EEPHY_REG_1TARRAY;
746
747 for (i = 0; i < arraylen; i += 2) {
748 v1 = array_table[i];
749 v2 = array_table[i + 1];
750 if (v1 < 0xcdcdcdcd) {
751 rtl_bb_delay(hw, v1, v2);
752 } else {/*This line is the start line of branch.*/
753 if (!check_cond(hw, array_table[i])) {
754 /*Discard the following (offset, data) pairs*/
755 NEXT_PAIR(v1, v2, i);
756 while (v2 != 0xDEAD &&
757 v2 != 0xCDEF &&
758 v2 != 0xCDCD && i < arraylen - 2)
759 NEXT_PAIR(v1, v2, i);
760 i -= 2; /* prevent from for-loop += 2*/
761 } else {
762 /* Configure matched pairs and skip to end */
763 NEXT_PAIR(v1, v2, i);
764 while (v2 != 0xDEAD &&
765 v2 != 0xCDEF &&
766 v2 != 0xCDCD && i < arraylen - 2) {
767 rtl_bb_delay(hw, v1, v2);
768 NEXT_PAIR(v1, v2, i);
769 }
770 524
771 while (v2 != 0xDEAD && i < arraylen - 2) 525 if (configtype == BASEBAND_CONFIG_PHY_REG) {
772 NEXT_PAIR(v1, v2, i); 526 arraylen = RTL8188EEPHY_REG_1TARRAYLEN;
773 } 527 array_table = RTL8188EEPHY_REG_1TARRAY;
774 } 528 handle_branch1(hw, arraylen, array_table);
529 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
530 arraylen = RTL8188EEAGCTAB_1TARRAYLEN;
531 array_table = RTL8188EEAGCTAB_1TARRAY;
532 handle_branch2(hw, arraylen, array_table);
775 } 533 }
534 return true;
776} 535}
777 536
778static void store_pwrindex_offset(struct ieee80211_hw *hw, 537static void store_pwrindex_rate_offset(struct ieee80211_hw *hw,
779 u32 regaddr, u32 bitmask, 538 u32 regaddr, u32 bitmask,
780 u32 data) 539 u32 data)
781{ 540{
782 struct rtl_priv *rtlpriv = rtl_priv(hw); 541 struct rtl_priv *rtlpriv = rtl_priv(hw);
783 struct rtl_phy *rtlphy = &(rtlpriv->phy); 542 struct rtl_phy *rtlphy = &rtlpriv->phy;
543 int count = rtlphy->pwrgroup_cnt;
784 544
785 if (regaddr == RTXAGC_A_RATE18_06) { 545 if (regaddr == RTXAGC_A_RATE18_06) {
786 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][0] = data; 546 rtlphy->mcs_txpwrlevel_origoffset[count][0] = data;
787 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 547 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
788 "MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n", 548 "MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
789 rtlphy->pwrgroup_cnt, 549 count,
790 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][0]); 550 rtlphy->mcs_txpwrlevel_origoffset[count][0]);
791 } 551 }
792 if (regaddr == RTXAGC_A_RATE54_24) { 552 if (regaddr == RTXAGC_A_RATE54_24) {
793 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][1] = data; 553 rtlphy->mcs_txpwrlevel_origoffset[count][1] = data;
794 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 554 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
795 "MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n", 555 "MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
796 rtlphy->pwrgroup_cnt, 556 count,
797 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][1]); 557 rtlphy->mcs_txpwrlevel_origoffset[count][1]);
798 } 558 }
799 if (regaddr == RTXAGC_A_CCK1_MCS32) { 559 if (regaddr == RTXAGC_A_CCK1_MCS32) {
800 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][6] = data; 560 rtlphy->mcs_txpwrlevel_origoffset[count][6] = data;
801 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 561 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
802 "MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n", 562 "MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
803 rtlphy->pwrgroup_cnt, 563 count,
804 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][6]); 564 rtlphy->mcs_txpwrlevel_origoffset[count][6]);
805 } 565 }
806 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) { 566 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
807 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][7] = data; 567 rtlphy->mcs_txpwrlevel_origoffset[count][7] = data;
808 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 568 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
809 "MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n", 569 "MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
810 rtlphy->pwrgroup_cnt, 570 count,
811 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][7]); 571 rtlphy->mcs_txpwrlevel_origoffset[count][7]);
812 } 572 }
813 if (regaddr == RTXAGC_A_MCS03_MCS00) { 573 if (regaddr == RTXAGC_A_MCS03_MCS00) {
814 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][2] = data; 574 rtlphy->mcs_txpwrlevel_origoffset[count][2] = data;
815 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 575 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
816 "MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n", 576 "MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
817 rtlphy->pwrgroup_cnt, 577 count,
818 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][2]); 578 rtlphy->mcs_txpwrlevel_origoffset[count][2]);
819 } 579 }
820 if (regaddr == RTXAGC_A_MCS07_MCS04) { 580 if (regaddr == RTXAGC_A_MCS07_MCS04) {
821 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][3] = data; 581 rtlphy->mcs_txpwrlevel_origoffset[count][3] = data;
822 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 582 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
823 "MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n", 583 "MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
824 rtlphy->pwrgroup_cnt, 584 count,
825 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][3]); 585 rtlphy->mcs_txpwrlevel_origoffset[count][3]);
826 } 586 }
827 if (regaddr == RTXAGC_A_MCS11_MCS08) { 587 if (regaddr == RTXAGC_A_MCS11_MCS08) {
828 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][4] = data; 588 rtlphy->mcs_txpwrlevel_origoffset[count][4] = data;
829 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 589 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
830 "MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n", 590 "MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
831 rtlphy->pwrgroup_cnt, 591 count,
832 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][4]); 592 rtlphy->mcs_txpwrlevel_origoffset[count][4]);
833 } 593 }
834 if (regaddr == RTXAGC_A_MCS15_MCS12) { 594 if (regaddr == RTXAGC_A_MCS15_MCS12) {
835 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][5] = data; 595 rtlphy->mcs_txpwrlevel_origoffset[count][5] = data;
836 if (get_rf_type(rtlphy) == RF_1T1R) 596 if (get_rf_type(rtlphy) == RF_1T1R) {
837 rtlphy->pwrgroup_cnt++; 597 count++;
598 rtlphy->pwrgroup_cnt = count;
599 }
838 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 600 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
839 "MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n", 601 "MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
840 rtlphy->pwrgroup_cnt, 602 count,
841 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][5]); 603 rtlphy->mcs_txpwrlevel_origoffset[count][5]);
842 } 604 }
843 if (regaddr == RTXAGC_B_RATE18_06) { 605 if (regaddr == RTXAGC_B_RATE18_06) {
844 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][8] = data; 606 rtlphy->mcs_txpwrlevel_origoffset[count][8] = data;
845 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 607 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
846 "MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n", 608 "MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
847 rtlphy->pwrgroup_cnt, 609 count,
848 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][8]); 610 rtlphy->mcs_txpwrlevel_origoffset[count][8]);
849 } 611 }
850 if (regaddr == RTXAGC_B_RATE54_24) { 612 if (regaddr == RTXAGC_B_RATE54_24) {
851 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][9] = data; 613 rtlphy->mcs_txpwrlevel_origoffset[count][9] = data;
852 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 614 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
853 "MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n", 615 "MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
854 rtlphy->pwrgroup_cnt, 616 count,
855 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][9]); 617 rtlphy->mcs_txpwrlevel_origoffset[count][9]);
856 } 618 }
857 if (regaddr == RTXAGC_B_CCK1_55_MCS32) { 619 if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
858 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][14] = data; 620 rtlphy->mcs_txpwrlevel_origoffset[count][14] = data;
859 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 621 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
860 "MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n", 622 "MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
861 rtlphy->pwrgroup_cnt, 623 count,
862 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][14]); 624 rtlphy->mcs_txpwrlevel_origoffset[count][14]);
863 } 625 }
864 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) { 626 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
865 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][15] = data; 627 rtlphy->mcs_txpwrlevel_origoffset[count][15] = data;
866 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 628 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
867 "MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n", 629 "MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
868 rtlphy->pwrgroup_cnt, 630 count,
869 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][15]); 631 rtlphy->mcs_txpwrlevel_origoffset[count][15]);
870 } 632 }
871 if (regaddr == RTXAGC_B_MCS03_MCS00) { 633 if (regaddr == RTXAGC_B_MCS03_MCS00) {
872 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][10] = data; 634 rtlphy->mcs_txpwrlevel_origoffset[count][10] = data;
873 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 635 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
874 "MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n", 636 "MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
875 rtlphy->pwrgroup_cnt, 637 count,
876 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][10]); 638 rtlphy->mcs_txpwrlevel_origoffset[count][10]);
877 } 639 }
878 if (regaddr == RTXAGC_B_MCS07_MCS04) { 640 if (regaddr == RTXAGC_B_MCS07_MCS04) {
879 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][11] = data; 641 rtlphy->mcs_txpwrlevel_origoffset[count][11] = data;
880 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 642 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
881 "MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n", 643 "MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
882 rtlphy->pwrgroup_cnt, 644 count,
883 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][11]); 645 rtlphy->mcs_txpwrlevel_origoffset[count][11]);
884 } 646 }
885 if (regaddr == RTXAGC_B_MCS11_MCS08) { 647 if (regaddr == RTXAGC_B_MCS11_MCS08) {
886 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][12] = data; 648 rtlphy->mcs_txpwrlevel_origoffset[count][12] = data;
887 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 649 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
888 "MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n", 650 "MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
889 rtlphy->pwrgroup_cnt, 651 count,
890 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][12]); 652 rtlphy->mcs_txpwrlevel_origoffset[count][12]);
891 } 653 }
892 if (regaddr == RTXAGC_B_MCS15_MCS12) { 654 if (regaddr == RTXAGC_B_MCS15_MCS12) {
893 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][13] = data; 655 rtlphy->mcs_txpwrlevel_origoffset[count][13] = data;
894 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 656 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
895 "MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n", 657 "MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
896 rtlphy->pwrgroup_cnt, 658 count,
897 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][13]); 659 rtlphy->mcs_txpwrlevel_origoffset[count][13]);
898 if (get_rf_type(rtlphy) != RF_1T1R) 660 if (get_rf_type(rtlphy) != RF_1T1R) {
899 rtlphy->pwrgroup_cnt++; 661 count++;
662 rtlphy->pwrgroup_cnt = count;
663 }
900 } 664 }
901} 665}
902 666
903#define READ_NEXT_RF_PAIR(v1, v2, i) \ 667static bool phy_config_bb_with_pghdr(struct ieee80211_hw *hw, u8 configtype)
904 do { \
905 i += 2; v1 = a_table[i]; \
906 v2 = a_table[i + 1]; \
907 } while (0)
908
909bool rtl88e_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
910 enum radio_path rfpath)
911{ 668{
912 int i;
913 u32 *a_table;
914 u16 a_len;
915 struct rtl_priv *rtlpriv = rtl_priv(hw); 669 struct rtl_priv *rtlpriv = rtl_priv(hw);
916 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 670 int i;
917 u32 v1 = 0, v2 = 0; 671 u32 *phy_reg_page;
672 u16 phy_reg_page_len;
673 u32 v1 = 0, v2 = 0, v3 = 0;
674
675 phy_reg_page_len = RTL8188EEPHY_REG_ARRAY_PGLEN;
676 phy_reg_page = RTL8188EEPHY_REG_ARRAY_PG;
677
678 if (configtype == BASEBAND_CONFIG_PHY_REG) {
679 for (i = 0; i < phy_reg_page_len; i = i + 3) {
680 v1 = phy_reg_page[i];
681 v2 = phy_reg_page[i+1];
682 v3 = phy_reg_page[i+2];
918 683
919 a_len = RTL8188EE_RADIOA_1TARRAYLEN;
920 a_table = RTL8188EE_RADIOA_1TARRAY;
921 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
922 "Radio_A:RTL8188EE_RADIOA_1TARRAY %d\n", a_len);
923 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
924 switch (rfpath) {
925 case RF90_PATH_A:
926 for (i = 0; i < a_len; i = i + 2) {
927 v1 = a_table[i];
928 v2 = a_table[i + 1];
929 if (v1 < 0xcdcdcdcd) { 684 if (v1 < 0xcdcdcdcd) {
930 rtl88_config_s(hw, v1, v2); 685 if (phy_reg_page[i] == 0xfe)
931 } else {/*This line is the start line of branch.*/ 686 mdelay(50);
932 if (!check_cond(hw, a_table[i])) { 687 else if (phy_reg_page[i] == 0xfd)
933 /* Discard the following (offset, data) 688 mdelay(5);
934 * pairs 689 else if (phy_reg_page[i] == 0xfc)
935 */ 690 mdelay(1);
691 else if (phy_reg_page[i] == 0xfb)
692 udelay(50);
693 else if (phy_reg_page[i] == 0xfa)
694 udelay(5);
695 else if (phy_reg_page[i] == 0xf9)
696 udelay(1);
697
698 store_pwrindex_rate_offset(hw, phy_reg_page[i],
699 phy_reg_page[i + 1],
700 phy_reg_page[i + 2]);
701 continue;
702 } else {
703 if (!_rtl88e_check_condition(hw,
704 phy_reg_page[i])) {
705 /*don't need the hw_body*/
706 i += 2; /* skip the pair of expression*/
707 /* to protect 'i+1' 'i+2' not overrun */
708 if (i >= phy_reg_page_len - 2)
709 break;
710
711 v1 = phy_reg_page[i];
712 v2 = phy_reg_page[i+1];
713 v3 = phy_reg_page[i+2];
714 while (v2 != 0xDEAD &&
715 i < phy_reg_page_len - 5) {
716 i += 3;
717 v1 = phy_reg_page[i];
718 v2 = phy_reg_page[i+1];
719 v3 = phy_reg_page[i+2];
720 }
721 }
722 }
723 }
724 } else {
725 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
726 "configtype != BaseBand_Config_PHY_REG\n");
727 }
728 return true;
729}
730
731#define READ_NEXT_RF_PAIR(v1, v2, i) \
732do { \
733 i += 2; \
734 v1 = radioa_array_table[i]; \
735 v2 = radioa_array_table[i+1]; \
736} while (0)
737
738static void process_path_a(struct ieee80211_hw *hw,
739 u16 radioa_arraylen,
740 u32 *radioa_array_table)
741{
742 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
743 u32 v1, v2;
744 int i;
745
746 for (i = 0; i < radioa_arraylen; i = i + 2) {
747 v1 = radioa_array_table[i];
748 v2 = radioa_array_table[i+1];
749 if (v1 < 0xcdcdcdcd) {
750 _rtl8188e_config_rf_radio_a(hw, v1, v2);
751 } else { /*This line is the start line of branch.*/
752 /* to protect READ_NEXT_PAIR not overrun */
753 if (i >= radioa_arraylen - 2)
754 break;
755
756 if (!_rtl88e_check_condition(hw, radioa_array_table[i])) {
757 /*Discard the following (offset, data) pairs*/
758 READ_NEXT_RF_PAIR(v1, v2, i);
759 while (v2 != 0xDEAD &&
760 v2 != 0xCDEF &&
761 v2 != 0xCDCD &&
762 i < radioa_arraylen - 2) {
936 READ_NEXT_RF_PAIR(v1, v2, i); 763 READ_NEXT_RF_PAIR(v1, v2, i);
937 while (v2 != 0xDEAD && v2 != 0xCDEF && 764 }
938 v2 != 0xCDCD && i < a_len - 2) 765 i -= 2; /* prevent from for-loop += 2*/
939 READ_NEXT_RF_PAIR(v1, v2, i); 766 } else { /* Configure matched pairs and
940 i -= 2; /* prevent from for-loop += 2*/ 767 * skip to end of if-else.
941 } else { 768 */
942 /* Configure matched pairs and skip to 769 READ_NEXT_RF_PAIR(v1, v2, i);
943 * end of if-else. 770 while (v2 != 0xDEAD &&
944 */ 771 v2 != 0xCDEF &&
772 v2 != 0xCDCD &&
773 i < radioa_arraylen - 2) {
774 _rtl8188e_config_rf_radio_a(hw, v1, v2);
945 READ_NEXT_RF_PAIR(v1, v2, i); 775 READ_NEXT_RF_PAIR(v1, v2, i);
946 while (v2 != 0xDEAD && v2 != 0xCDEF &&
947 v2 != 0xCDCD && i < a_len - 2) {
948 rtl88_config_s(hw, v1, v2);
949 READ_NEXT_RF_PAIR(v1, v2, i);
950 }
951
952 while (v2 != 0xDEAD && i < a_len - 2)
953 READ_NEXT_RF_PAIR(v1, v2, i);
954 } 776 }
777
778 while (v2 != 0xDEAD &&
779 i < radioa_arraylen - 2)
780 READ_NEXT_RF_PAIR(v1, v2, i);
955 } 781 }
956 } 782 }
783 }
957 784
958 if (rtlhal->oem_id == RT_CID_819X_HP) 785 if (rtlhal->oem_id == RT_CID_819X_HP)
959 rtl88_config_s(hw, 0x52, 0x7E4BD); 786 _rtl8188e_config_rf_radio_a(hw, 0x52, 0x7E4BD);
787}
960 788
961 break; 789bool rtl88e_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
790 enum radio_path rfpath)
791{
792 struct rtl_priv *rtlpriv = rtl_priv(hw);
793 bool rtstatus = true;
794 u32 *radioa_array_table;
795 u16 radioa_arraylen;
962 796
797 radioa_arraylen = RTL8188EE_RADIOA_1TARRAYLEN;
798 radioa_array_table = RTL8188EE_RADIOA_1TARRAY;
799 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
800 "Radio_A:RTL8188EE_RADIOA_1TARRAY %d\n", radioa_arraylen);
801 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
802 rtstatus = true;
803 switch (rfpath) {
804 case RF90_PATH_A:
805 process_path_a(hw, radioa_arraylen, radioa_array_table);
806 break;
963 case RF90_PATH_B: 807 case RF90_PATH_B:
964 case RF90_PATH_C: 808 case RF90_PATH_C:
965 case RF90_PATH_D: 809 case RF90_PATH_D:
966 default:
967 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
968 "switch case not processed\n");
969 break; 810 break;
970 } 811 }
971 return true; 812 return true;
@@ -974,26 +815,26 @@ bool rtl88e_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
974void rtl88e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw) 815void rtl88e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
975{ 816{
976 struct rtl_priv *rtlpriv = rtl_priv(hw); 817 struct rtl_priv *rtlpriv = rtl_priv(hw);
977 struct rtl_phy *rtlphy = &(rtlpriv->phy); 818 struct rtl_phy *rtlphy = &rtlpriv->phy;
978 819
979 rtlphy->default_initialgain[0] = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 820 rtlphy->default_initialgain[0] =
980 MASKBYTE0); 821 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
981 rtlphy->default_initialgain[1] = rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, 822 rtlphy->default_initialgain[1] =
982 MASKBYTE0); 823 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
983 rtlphy->default_initialgain[2] = rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, 824 rtlphy->default_initialgain[2] =
984 MASKBYTE0); 825 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
985 rtlphy->default_initialgain[3] = rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, 826 rtlphy->default_initialgain[3] =
986 MASKBYTE0); 827 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
987 828
988 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 829 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
989 "Default initial gain (c50 = 0x%x, c58 = 0x%x, c60 = 0x%x, c68 = 0x%x\n", 830 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
990 rtlphy->default_initialgain[0], 831 rtlphy->default_initialgain[0],
991 rtlphy->default_initialgain[1], 832 rtlphy->default_initialgain[1],
992 rtlphy->default_initialgain[2], 833 rtlphy->default_initialgain[2],
993 rtlphy->default_initialgain[3]); 834 rtlphy->default_initialgain[3]);
994 835
995 rtlphy->framesync = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3, 836 rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
996 MASKBYTE0); 837 MASKBYTE0);
997 rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2, 838 rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
998 MASKDWORD); 839 MASKDWORD);
999 840
@@ -1002,106 +843,277 @@ void rtl88e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
1002 ROFDM0_RXDETECTOR3, rtlphy->framesync); 843 ROFDM0_RXDETECTOR3, rtlphy->framesync);
1003} 844}
1004 845
846static void _rtl88e_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
847{
848 struct rtl_priv *rtlpriv = rtl_priv(hw);
849 struct rtl_phy *rtlphy = &rtlpriv->phy;
850
851 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
852 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
853 rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
854 rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
855
856 rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
857 rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
858 rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
859 rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
860
861 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
862 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
863
864 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
865 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
866
867 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
868 RFPGA0_XA_LSSIPARAMETER;
869 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
870 RFPGA0_XB_LSSIPARAMETER;
871
872 rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
873 rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
874 rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
875 rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
876
877 rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
878 rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
879 rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
880 rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
881
882 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
883 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
884
885 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
886 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
887
888 rtlphy->phyreg_def[RF90_PATH_A].rfsw_ctrl =
889 RFPGA0_XAB_SWITCHCONTROL;
890 rtlphy->phyreg_def[RF90_PATH_B].rfsw_ctrl =
891 RFPGA0_XAB_SWITCHCONTROL;
892 rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl =
893 RFPGA0_XCD_SWITCHCONTROL;
894 rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl =
895 RFPGA0_XCD_SWITCHCONTROL;
896
897 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
898 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
899 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
900 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
901
902 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
903 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
904 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
905 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
906
907 rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbal = ROFDM0_XARXIQIMBALANCE;
908 rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbal = ROFDM0_XBRXIQIMBALANCE;
909 rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBANLANCE;
910 rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBALANCE;
911
912 rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
913 rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
914 rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
915 rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
916
917 rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbal = ROFDM0_XATXIQIMBALANCE;
918 rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbal = ROFDM0_XBTXIQIMBALANCE;
919 rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTXIQIMBALANCE;
920 rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTXIQIMBALANCE;
921
922 rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATXAFE;
923 rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTXAFE;
924
925 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
926 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
927
928 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
929 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
930}
931
1005void rtl88e_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel) 932void rtl88e_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
1006{ 933{
1007 struct rtl_priv *rtlpriv = rtl_priv(hw); 934 struct rtl_priv *rtlpriv = rtl_priv(hw);
1008 struct rtl_phy *rtlphy = &(rtlpriv->phy); 935 struct rtl_phy *rtlphy = &rtlpriv->phy;
1009 u8 level; 936 u8 txpwr_level;
1010 long dbm; 937 long txpwr_dbm;
1011 938
1012 level = rtlphy->cur_cck_txpwridx; 939 txpwr_level = rtlphy->cur_cck_txpwridx;
1013 dbm = rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_B, level); 940 txpwr_dbm = _rtl88e_phy_txpwr_idx_to_dbm(hw,
1014 level = rtlphy->cur_ofdm24g_txpwridx; 941 WIRELESS_MODE_B, txpwr_level);
1015 if (rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_G, level) > dbm) 942 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1016 dbm = rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_G, level); 943 if (_rtl88e_phy_txpwr_idx_to_dbm(hw,
1017 level = rtlphy->cur_ofdm24g_txpwridx; 944 WIRELESS_MODE_G,
1018 if (rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_N_24G, level) > dbm) 945 txpwr_level) > txpwr_dbm)
1019 dbm = rtl88e_pwr_idx_dbm(hw, WIRELESS_MODE_N_24G, level); 946 txpwr_dbm =
1020 *powerlevel = dbm; 947 _rtl88e_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
948 txpwr_level);
949 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
950 if (_rtl88e_phy_txpwr_idx_to_dbm(hw,
951 WIRELESS_MODE_N_24G,
952 txpwr_level) > txpwr_dbm)
953 txpwr_dbm =
954 _rtl88e_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
955 txpwr_level);
956 *powerlevel = txpwr_dbm;
957}
958
959static void handle_path_a(struct rtl_efuse *rtlefuse, u8 index,
960 u8 *cckpowerlevel, u8 *ofdmpowerlevel,
961 u8 *bw20powerlevel, u8 *bw40powerlevel)
962{
963 cckpowerlevel[RF90_PATH_A] =
964 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
965 /*-8~7 */
966 if (rtlefuse->txpwr_ht20diff[RF90_PATH_A][index] > 0x0f)
967 bw20powerlevel[RF90_PATH_A] =
968 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index] -
969 (~(rtlefuse->txpwr_ht20diff[RF90_PATH_A][index]) + 1);
970 else
971 bw20powerlevel[RF90_PATH_A] =
972 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index] +
973 rtlefuse->txpwr_ht20diff[RF90_PATH_A][index];
974 if (rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][index] > 0xf)
975 ofdmpowerlevel[RF90_PATH_A] =
976 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index] -
977 (~(rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][index])+1);
978 else
979 ofdmpowerlevel[RF90_PATH_A] =
980 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index] +
981 rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][index];
982 bw40powerlevel[RF90_PATH_A] =
983 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
1021} 984}
1022 985
1023static void _rtl88e_get_txpower_index(struct ieee80211_hw *hw, u8 channel, 986static void _rtl88e_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
1024 u8 *cckpower, u8 *ofdm, u8 *bw20_pwr, 987 u8 *cckpowerlevel, u8 *ofdmpowerlevel,
1025 u8 *bw40_pwr) 988 u8 *bw20powerlevel, u8 *bw40powerlevel)
1026{ 989{
1027 struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw)); 990 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1028 u8 i = (channel - 1); 991 u8 index = (channel - 1);
1029 u8 rf_path = 0; 992 u8 rf_path = 0;
1030 int jj = RF90_PATH_A;
1031 int kk = RF90_PATH_B;
1032 993
1033 for (rf_path = 0; rf_path < 2; rf_path++) { 994 for (rf_path = 0; rf_path < 2; rf_path++) {
1034 if (rf_path == jj) { 995 if (rf_path == RF90_PATH_A) {
1035 cckpower[jj] = fuse->txpwrlevel_cck[jj][i]; 996 handle_path_a(rtlefuse, index, cckpowerlevel,
1036 if (fuse->txpwr_ht20diff[jj][i] > 0x0f) /*-8~7 */ 997 ofdmpowerlevel, bw20powerlevel,
1037 bw20_pwr[jj] = fuse->txpwrlevel_ht40_1s[jj][i] - 998 bw40powerlevel);
1038 (~(fuse->txpwr_ht20diff[jj][i]) + 1); 999 } else if (rf_path == RF90_PATH_B) {
1039 else 1000 cckpowerlevel[RF90_PATH_B] =
1040 bw20_pwr[jj] = fuse->txpwrlevel_ht40_1s[jj][i] + 1001 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
1041 fuse->txpwr_ht20diff[jj][i]; 1002 bw20powerlevel[RF90_PATH_B] =
1042 if (fuse->txpwr_legacyhtdiff[jj][i] > 0xf) 1003 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index] +
1043 ofdm[jj] = fuse->txpwrlevel_ht40_1s[jj][i] - 1004 rtlefuse->txpwr_ht20diff[RF90_PATH_B][index];
1044 (~(fuse->txpwr_legacyhtdiff[jj][i])+1); 1005 ofdmpowerlevel[RF90_PATH_B] =
1045 else 1006 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index] +
1046 ofdm[jj] = fuse->txpwrlevel_ht40_1s[jj][i] + 1007 rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][index];
1047 fuse->txpwr_legacyhtdiff[jj][i]; 1008 bw40powerlevel[RF90_PATH_B] =
1048 bw40_pwr[jj] = fuse->txpwrlevel_ht40_1s[jj][i]; 1009 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
1049
1050 } else if (rf_path == kk) {
1051 cckpower[kk] = fuse->txpwrlevel_cck[kk][i];
1052 bw20_pwr[kk] = fuse->txpwrlevel_ht40_1s[kk][i] +
1053 fuse->txpwr_ht20diff[kk][i];
1054 ofdm[kk] = fuse->txpwrlevel_ht40_1s[kk][i] +
1055 fuse->txpwr_legacyhtdiff[kk][i];
1056 bw40_pwr[kk] = fuse->txpwrlevel_ht40_1s[kk][i];
1057 } 1010 }
1058 } 1011 }
1012
1059} 1013}
1060 1014
1061static void _rtl88e_ccxpower_index_check(struct ieee80211_hw *hw, 1015static void _rtl88e_ccxpower_index_check(struct ieee80211_hw *hw,
1062 u8 channel, u8 *cckpower, 1016 u8 channel, u8 *cckpowerlevel,
1063 u8 *ofdm, u8 *bw20_pwr, 1017 u8 *ofdmpowerlevel, u8 *bw20powerlevel,
1064 u8 *bw40_pwr) 1018 u8 *bw40powerlevel)
1065{ 1019{
1066 struct rtl_priv *rtlpriv = rtl_priv(hw); 1020 struct rtl_priv *rtlpriv = rtl_priv(hw);
1067 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1021 struct rtl_phy *rtlphy = &rtlpriv->phy;
1022
1023 rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
1024 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
1025 rtlphy->cur_bw20_txpwridx = bw20powerlevel[0];
1026 rtlphy->cur_bw40_txpwridx = bw40powerlevel[0];
1068 1027
1069 rtlphy->cur_cck_txpwridx = cckpower[0];
1070 rtlphy->cur_ofdm24g_txpwridx = ofdm[0];
1071 rtlphy->cur_bw20_txpwridx = bw20_pwr[0];
1072 rtlphy->cur_bw40_txpwridx = bw40_pwr[0];
1073} 1028}
1074 1029
1075void rtl88e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel) 1030void rtl88e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1076{ 1031{
1077 struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw)); 1032 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1078 u8 cckpower[MAX_TX_COUNT] = {0}, ofdm[MAX_TX_COUNT] = {0}; 1033 u8 cckpowerlevel[MAX_TX_COUNT] = {0};
1079 u8 bw20_pwr[MAX_TX_COUNT] = {0}, bw40_pwr[MAX_TX_COUNT] = {0}; 1034 u8 ofdmpowerlevel[MAX_TX_COUNT] = {0};
1035 u8 bw20powerlevel[MAX_TX_COUNT] = {0};
1036 u8 bw40powerlevel[MAX_TX_COUNT] = {0};
1080 1037
1081 if (fuse->txpwr_fromeprom == false) 1038 if (!rtlefuse->txpwr_fromeprom)
1082 return; 1039 return;
1083 _rtl88e_get_txpower_index(hw, channel, &cckpower[0], &ofdm[0], 1040 _rtl88e_get_txpower_index(hw, channel,
1084 &bw20_pwr[0], &bw40_pwr[0]); 1041 &cckpowerlevel[0], &ofdmpowerlevel[0],
1085 _rtl88e_ccxpower_index_check(hw, channel, &cckpower[0], &ofdm[0], 1042 &bw20powerlevel[0], &bw40powerlevel[0]);
1086 &bw20_pwr[0], &bw40_pwr[0]); 1043 _rtl88e_ccxpower_index_check(hw, channel,
1087 rtl88e_phy_rf6052_set_cck_txpower(hw, &cckpower[0]); 1044 &cckpowerlevel[0], &ofdmpowerlevel[0],
1088 rtl88e_phy_rf6052_set_ofdm_txpower(hw, &ofdm[0], &bw20_pwr[0], 1045 &bw20powerlevel[0], &bw40powerlevel[0]);
1089 &bw40_pwr[0], channel); 1046 rtl88e_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
1047 rtl88e_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0],
1048 &bw20powerlevel[0],
1049 &bw40powerlevel[0], channel);
1050}
1051
1052static long _rtl88e_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
1053 enum wireless_mode wirelessmode,
1054 u8 txpwridx)
1055{
1056 long offset;
1057 long pwrout_dbm;
1058
1059 switch (wirelessmode) {
1060 case WIRELESS_MODE_B:
1061 offset = -7;
1062 break;
1063 case WIRELESS_MODE_G:
1064 case WIRELESS_MODE_N_24G:
1065 offset = -8;
1066 break;
1067 default:
1068 offset = -8;
1069 break;
1070 }
1071 pwrout_dbm = txpwridx / 2 + offset;
1072 return pwrout_dbm;
1073}
1074
1075void rtl88e_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1076{
1077 struct rtl_priv *rtlpriv = rtl_priv(hw);
1078 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1079 enum io_type iotype;
1080
1081 if (!is_hal_stop(rtlhal)) {
1082 switch (operation) {
1083 case SCAN_OPT_BACKUP_BAND0:
1084 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1085 rtlpriv->cfg->ops->set_hw_reg(hw,
1086 HW_VAR_IO_CMD,
1087 (u8 *)&iotype);
1088
1089 break;
1090 case SCAN_OPT_RESTORE:
1091 iotype = IO_CMD_RESUME_DM_BY_SCAN;
1092 rtlpriv->cfg->ops->set_hw_reg(hw,
1093 HW_VAR_IO_CMD,
1094 (u8 *)&iotype);
1095 break;
1096 default:
1097 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1098 "Unknown Scan Backup operation.\n");
1099 break;
1100 }
1101 }
1090} 1102}
1091 1103
1092void rtl88e_phy_set_bw_mode_callback(struct ieee80211_hw *hw) 1104void rtl88e_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1093{ 1105{
1094 struct rtl_priv *rtlpriv = rtl_priv(hw); 1106 struct rtl_priv *rtlpriv = rtl_priv(hw);
1095 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1107 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1096 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1108 struct rtl_phy *rtlphy = &rtlpriv->phy;
1097 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1109 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1098 u8 reg_bw_opmode; 1110 u8 reg_bw_opmode;
1099 u8 reg_prsr_rsc; 1111 u8 reg_prsr_rsc;
1100 1112
1101 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 1113 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1102 "Switch to %s bandwidth\n", 1114 "Switch to %s bandwidth\n",
1103 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? 1115 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1104 "20MHz" : "40MHz"); 1116 "20MHz" : "40MHz");
1105 1117
1106 if (is_hal_stop(rtlhal)) { 1118 if (is_hal_stop(rtlhal)) {
1107 rtlphy->set_bwmode_inprogress = false; 1119 rtlphy->set_bwmode_inprogress = false;
@@ -1162,7 +1174,7 @@ void rtl88e_phy_set_bw_mode(struct ieee80211_hw *hw,
1162 enum nl80211_channel_type ch_type) 1174 enum nl80211_channel_type ch_type)
1163{ 1175{
1164 struct rtl_priv *rtlpriv = rtl_priv(hw); 1176 struct rtl_priv *rtlpriv = rtl_priv(hw);
1165 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1177 struct rtl_phy *rtlphy = &rtlpriv->phy;
1166 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1178 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1167 u8 tmp_bw = rtlphy->current_chan_bw; 1179 u8 tmp_bw = rtlphy->current_chan_bw;
1168 1180
@@ -1173,7 +1185,7 @@ void rtl88e_phy_set_bw_mode(struct ieee80211_hw *hw,
1173 rtl88e_phy_set_bw_mode_callback(hw); 1185 rtl88e_phy_set_bw_mode_callback(hw);
1174 } else { 1186 } else {
1175 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1187 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1176 "FALSE driver sleep or unload\n"); 1188 "false driver sleep or unload\n");
1177 rtlphy->set_bwmode_inprogress = false; 1189 rtlphy->set_bwmode_inprogress = false;
1178 rtlphy->current_chan_bw = tmp_bw; 1190 rtlphy->current_chan_bw = tmp_bw;
1179 } 1191 }
@@ -1183,7 +1195,7 @@ void rtl88e_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1183{ 1195{
1184 struct rtl_priv *rtlpriv = rtl_priv(hw); 1196 struct rtl_priv *rtlpriv = rtl_priv(hw);
1185 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1197 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1186 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1198 struct rtl_phy *rtlphy = &rtlpriv->phy;
1187 u32 delay; 1199 u32 delay;
1188 1200
1189 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 1201 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
@@ -1193,9 +1205,9 @@ void rtl88e_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1193 do { 1205 do {
1194 if (!rtlphy->sw_chnl_inprogress) 1206 if (!rtlphy->sw_chnl_inprogress)
1195 break; 1207 break;
1196 if (!chnl_step_by_step(hw, rtlphy->current_channel, 1208 if (!_rtl88e_phy_sw_chnl_step_by_step
1197 &rtlphy->sw_chnl_stage, 1209 (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
1198 &rtlphy->sw_chnl_step, &delay)) { 1210 &rtlphy->sw_chnl_step, &delay)) {
1199 if (delay > 0) 1211 if (delay > 0)
1200 mdelay(delay); 1212 mdelay(delay);
1201 else 1213 else
@@ -1211,7 +1223,7 @@ void rtl88e_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1211u8 rtl88e_phy_sw_chnl(struct ieee80211_hw *hw) 1223u8 rtl88e_phy_sw_chnl(struct ieee80211_hw *hw)
1212{ 1224{
1213 struct rtl_priv *rtlpriv = rtl_priv(hw); 1225 struct rtl_priv *rtlpriv = rtl_priv(hw);
1214 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1226 struct rtl_phy *rtlphy = &rtlpriv->phy;
1215 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1227 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1216 1228
1217 if (rtlphy->sw_chnl_inprogress) 1229 if (rtlphy->sw_chnl_inprogress)
@@ -1237,9 +1249,140 @@ u8 rtl88e_phy_sw_chnl(struct ieee80211_hw *hw)
1237 return 1; 1249 return 1;
1238} 1250}
1239 1251
1252static bool _rtl88e_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1253 u8 channel, u8 *stage, u8 *step,
1254 u32 *delay)
1255{
1256 struct rtl_priv *rtlpriv = rtl_priv(hw);
1257 struct rtl_phy *rtlphy = &rtlpriv->phy;
1258 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1259 u32 precommoncmdcnt;
1260 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
1261 u32 postcommoncmdcnt;
1262 struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
1263 u32 rfdependcmdcnt;
1264 struct swchnlcmd *currentcmd = NULL;
1265 u8 rfpath;
1266 u8 num_total_rfpath = rtlphy->num_total_rfpath;
1267
1268 precommoncmdcnt = 0;
1269 _rtl88e_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1270 MAX_PRECMD_CNT,
1271 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
1272 _rtl88e_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1273 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1274
1275 postcommoncmdcnt = 0;
1276
1277 _rtl88e_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1278 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
1279
1280 rfdependcmdcnt = 0;
1281
1282 RT_ASSERT((channel >= 1 && channel <= 14),
1283 "illegal channel for Zebra: %d\n", channel);
1284
1285 _rtl88e_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1286 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
1287 RF_CHNLBW, channel, 10);
1288
1289 _rtl88e_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1290 MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
1291 0);
1292
1293 do {
1294 switch (*stage) {
1295 case 0:
1296 currentcmd = &precommoncmd[*step];
1297 break;
1298 case 1:
1299 currentcmd = &rfdependcmd[*step];
1300 break;
1301 case 2:
1302 currentcmd = &postcommoncmd[*step];
1303 break;
1304 default:
1305 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1306 "Invalid 'stage' = %d, Check it!\n", *stage);
1307 return true;
1308 }
1309
1310 if (currentcmd->cmdid == CMDID_END) {
1311 if ((*stage) == 2)
1312 return true;
1313 (*stage)++;
1314 (*step) = 0;
1315 continue;
1316 }
1317
1318 switch (currentcmd->cmdid) {
1319 case CMDID_SET_TXPOWEROWER_LEVEL:
1320 rtl88e_phy_set_txpower_level(hw, channel);
1321 break;
1322 case CMDID_WRITEPORT_ULONG:
1323 rtl_write_dword(rtlpriv, currentcmd->para1,
1324 currentcmd->para2);
1325 break;
1326 case CMDID_WRITEPORT_USHORT:
1327 rtl_write_word(rtlpriv, currentcmd->para1,
1328 (u16)currentcmd->para2);
1329 break;
1330 case CMDID_WRITEPORT_UCHAR:
1331 rtl_write_byte(rtlpriv, currentcmd->para1,
1332 (u8)currentcmd->para2);
1333 break;
1334 case CMDID_RF_WRITEREG:
1335 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
1336 rtlphy->rfreg_chnlval[rfpath] =
1337 ((rtlphy->rfreg_chnlval[rfpath] &
1338 0xfffffc00) | currentcmd->para2);
1339
1340 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1341 currentcmd->para1,
1342 RFREG_OFFSET_MASK,
1343 rtlphy->rfreg_chnlval[rfpath]);
1344 }
1345 break;
1346 default:
1347 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1348 "switch case not process\n");
1349 break;
1350 }
1351
1352 break;
1353 } while (true);
1354
1355 (*delay) = currentcmd->msdelay;
1356 (*step)++;
1357 return false;
1358}
1359
1360static bool _rtl88e_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
1361 u32 cmdtableidx, u32 cmdtablesz,
1362 enum swchnlcmd_id cmdid,
1363 u32 para1, u32 para2, u32 msdelay)
1364{
1365 struct swchnlcmd *pcmd;
1366
1367 if (cmdtable == NULL) {
1368 RT_ASSERT(false, "cmdtable cannot be NULL.\n");
1369 return false;
1370 }
1371
1372 if (cmdtableidx >= cmdtablesz)
1373 return false;
1374
1375 pcmd = cmdtable + cmdtableidx;
1376 pcmd->cmdid = cmdid;
1377 pcmd->para1 = para1;
1378 pcmd->para2 = para2;
1379 pcmd->msdelay = msdelay;
1380 return true;
1381}
1382
1240static u8 _rtl88e_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb) 1383static u8 _rtl88e_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
1241{ 1384{
1242 u32 reg_eac, reg_e94, reg_e9c; 1385 u32 reg_eac, reg_e94, reg_e9c, reg_ea4;
1243 u8 result = 0x00; 1386 u8 result = 0x00;
1244 1387
1245 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1c); 1388 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1c);
@@ -1256,6 +1399,7 @@ static u8 _rtl88e_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
1256 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD); 1399 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1257 reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD); 1400 reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1258 reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD); 1401 reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1402 reg_ea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1259 1403
1260 if (!(reg_eac & BIT(28)) && 1404 if (!(reg_eac & BIT(28)) &&
1261 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) && 1405 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
@@ -1295,15 +1439,14 @@ static u8 _rtl88e_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
1295{ 1439{
1296 u32 reg_eac, reg_e94, reg_e9c, reg_ea4, u32temp; 1440 u32 reg_eac, reg_e94, reg_e9c, reg_ea4, u32temp;
1297 u8 result = 0x00; 1441 u8 result = 0x00;
1298 int jj = RF90_PATH_A;
1299 1442
1300 /*Get TXIMR Setting*/ 1443 /*Get TXIMR Setting*/
1301 /*Modify RX IQK mode table*/ 1444 /*Modify RX IQK mode table*/
1302 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 1445 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1303 rtl_set_rfreg(hw, jj, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0); 1446 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
1304 rtl_set_rfreg(hw, jj, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000); 1447 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1305 rtl_set_rfreg(hw, jj, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f); 1448 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
1306 rtl_set_rfreg(hw, jj, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b); 1449 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
1307 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 1450 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1308 1451
1309 /*IQK Setting*/ 1452 /*IQK Setting*/
@@ -1318,7 +1461,7 @@ static u8 _rtl88e_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
1318 1461
1319 /*LO calibration Setting*/ 1462 /*LO calibration Setting*/
1320 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911); 1463 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
1321 /*one shot, path A LOK & iqk*/ 1464 /*one shot,path A LOK & iqk*/
1322 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000); 1465 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1323 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 1466 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1324 1467
@@ -1336,16 +1479,16 @@ static u8 _rtl88e_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
1336 else 1479 else
1337 return result; 1480 return result;
1338 1481
1339 u32temp = 0x80007C00 | (reg_e94&0x3FF0000) | 1482 u32temp = 0x80007C00 | (reg_e94&0x3FF0000) |
1340 ((reg_e9c&0x3FF0000) >> 16); 1483 ((reg_e9c&0x3FF0000) >> 16);
1341 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp); 1484 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
1342 /*RX IQK*/ 1485 /*RX IQK*/
1343 /*Modify RX IQK mode table*/ 1486 /*Modify RX IQK mode table*/
1344 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 1487 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1345 rtl_set_rfreg(hw, jj, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0); 1488 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
1346 rtl_set_rfreg(hw, jj, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000); 1489 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1347 rtl_set_rfreg(hw, jj, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f); 1490 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
1348 rtl_set_rfreg(hw, jj, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa); 1491 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
1349 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 1492 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1350 1493
1351 /*IQK Setting*/ 1494 /*IQK Setting*/
@@ -1359,7 +1502,7 @@ static u8 _rtl88e_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
1359 1502
1360 /*LO calibration Setting*/ 1503 /*LO calibration Setting*/
1361 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911); 1504 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
1362 /*one shot, path A LOK & iqk*/ 1505 /*one shot,path A LOK & iqk*/
1363 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000); 1506 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1364 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 1507 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1365 1508
@@ -1377,57 +1520,58 @@ static u8 _rtl88e_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
1377 return result; 1520 return result;
1378} 1521}
1379 1522
1380static void fill_iqk(struct ieee80211_hw *hw, bool iqk_ok, long result[][8], 1523static void _rtl88e_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
1381 u8 final, bool btxonly) 1524 bool iqk_ok, long result[][8],
1525 u8 final_candidate, bool btxonly)
1382{ 1526{
1383 u32 oldval_0, x, tx0_a, reg; 1527 u32 oldval_0, x, tx0_a, reg;
1384 long y, tx0_c; 1528 long y, tx0_c;
1385 1529
1386 if (final == 0xFF) { 1530 if (final_candidate == 0xFF) {
1387 return; 1531 return;
1388 } else if (iqk_ok) { 1532 } else if (iqk_ok) {
1389 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBAL, 1533 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
1390 MASKDWORD) >> 22) & 0x3FF; 1534 MASKDWORD) >> 22) & 0x3FF;
1391 x = result[final][0]; 1535 x = result[final_candidate][0];
1392 if ((x & 0x00000200) != 0) 1536 if ((x & 0x00000200) != 0)
1393 x = x | 0xFFFFFC00; 1537 x = x | 0xFFFFFC00;
1394 tx0_a = (x * oldval_0) >> 8; 1538 tx0_a = (x * oldval_0) >> 8;
1395 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, 0x3FF, tx0_a); 1539 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
1396 rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(31), 1540 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
1397 ((x * oldval_0 >> 7) & 0x1)); 1541 ((x * oldval_0 >> 7) & 0x1));
1398 y = result[final][1]; 1542 y = result[final_candidate][1];
1399 if ((y & 0x00000200) != 0) 1543 if ((y & 0x00000200) != 0)
1400 y |= 0xFFFFFC00; 1544 y = y | 0xFFFFFC00;
1401 tx0_c = (y * oldval_0) >> 8; 1545 tx0_c = (y * oldval_0) >> 8;
1402 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000, 1546 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
1403 ((tx0_c & 0x3C0) >> 6)); 1547 ((tx0_c & 0x3C0) >> 6));
1404 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBAL, 0x003F0000, 1548 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
1405 (tx0_c & 0x3F)); 1549 (tx0_c & 0x3F));
1406 rtl_set_bbreg(hw, ROFDM0_ECCATHRES, BIT(29), 1550 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
1407 ((y * oldval_0 >> 7) & 0x1)); 1551 ((y * oldval_0 >> 7) & 0x1));
1408 if (btxonly) 1552 if (btxonly)
1409 return; 1553 return;
1410 reg = result[final][2]; 1554 reg = result[final_candidate][2];
1411 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBAL, 0x3FF, reg); 1555 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
1412 reg = result[final][3] & 0x3F; 1556 reg = result[final_candidate][3] & 0x3F;
1413 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBAL, 0xFC00, reg); 1557 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
1414 reg = (result[final][3] >> 6) & 0xF; 1558 reg = (result[final_candidate][3] >> 6) & 0xF;
1415 rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg); 1559 rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
1416 } 1560 }
1417} 1561}
1418 1562
1419static void save_adda_reg(struct ieee80211_hw *hw, 1563static void _rtl88e_phy_save_adda_registers(struct ieee80211_hw *hw,
1420 const u32 *addareg, u32 *backup, 1564 u32 *addareg, u32 *addabackup,
1421 u32 registernum) 1565 u32 registernum)
1422{ 1566{
1423 u32 i; 1567 u32 i;
1424 1568
1425 for (i = 0; i < registernum; i++) 1569 for (i = 0; i < registernum; i++)
1426 backup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD); 1570 addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
1427} 1571}
1428 1572
1429static void save_mac_reg(struct ieee80211_hw *hw, const u32 *macreg, 1573static void _rtl88e_phy_save_mac_registers(struct ieee80211_hw *hw,
1430 u32 *macbackup) 1574 u32 *macreg, u32 *macbackup)
1431{ 1575{
1432 struct rtl_priv *rtlpriv = rtl_priv(hw); 1576 struct rtl_priv *rtlpriv = rtl_priv(hw);
1433 u32 i; 1577 u32 i;
@@ -1437,17 +1581,18 @@ static void save_mac_reg(struct ieee80211_hw *hw, const u32 *macreg,
1437 macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]); 1581 macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1438} 1582}
1439 1583
1440static void reload_adda(struct ieee80211_hw *hw, const u32 *addareg, 1584static void _rtl88e_phy_reload_adda_registers(struct ieee80211_hw *hw,
1441 u32 *backup, u32 reg_num) 1585 u32 *addareg, u32 *addabackup,
1586 u32 regiesternum)
1442{ 1587{
1443 u32 i; 1588 u32 i;
1444 1589
1445 for (i = 0; i < reg_num; i++) 1590 for (i = 0; i < regiesternum; i++)
1446 rtl_set_bbreg(hw, addareg[i], MASKDWORD, backup[i]); 1591 rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
1447} 1592}
1448 1593
1449static void reload_mac(struct ieee80211_hw *hw, const u32 *macreg, 1594static void _rtl88e_phy_reload_mac_registers(struct ieee80211_hw *hw,
1450 u32 *macbackup) 1595 u32 *macreg, u32 *macbackup)
1451{ 1596{
1452 struct rtl_priv *rtlpriv = rtl_priv(hw); 1597 struct rtl_priv *rtlpriv = rtl_priv(hw);
1453 u32 i; 1598 u32 i;
@@ -1458,8 +1603,7 @@ static void reload_mac(struct ieee80211_hw *hw, const u32 *macreg,
1458} 1603}
1459 1604
1460static void _rtl88e_phy_path_adda_on(struct ieee80211_hw *hw, 1605static void _rtl88e_phy_path_adda_on(struct ieee80211_hw *hw,
1461 const u32 *addareg, bool is_patha_on, 1606 u32 *addareg, bool is_patha_on, bool is2t)
1462 bool is2t)
1463{ 1607{
1464 u32 pathon; 1608 u32 pathon;
1465 u32 i; 1609 u32 i;
@@ -1477,8 +1621,7 @@ static void _rtl88e_phy_path_adda_on(struct ieee80211_hw *hw,
1477} 1621}
1478 1622
1479static void _rtl88e_phy_mac_setting_calibration(struct ieee80211_hw *hw, 1623static void _rtl88e_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1480 const u32 *macreg, 1624 u32 *macreg, u32 *macbackup)
1481 u32 *macbackup)
1482{ 1625{
1483 struct rtl_priv *rtlpriv = rtl_priv(hw); 1626 struct rtl_priv *rtlpriv = rtl_priv(hw);
1484 u32 i = 0; 1627 u32 i = 0;
@@ -1507,12 +1650,13 @@ static void _rtl88e_phy_pi_mode_switch(struct ieee80211_hw *hw, bool pi_mode)
1507 rtl_set_bbreg(hw, 0x828, MASKDWORD, mode); 1650 rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
1508} 1651}
1509 1652
1510static bool sim_comp(struct ieee80211_hw *hw, long result[][8], u8 c1, u8 c2) 1653static bool _rtl88e_phy_simularity_compare(struct ieee80211_hw *hw,
1654 long result[][8], u8 c1, u8 c2)
1511{ 1655{
1512 u32 i, j, diff, bitmap, bound; 1656 u32 i, j, diff, simularity_bitmap, bound;
1513 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1657 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1514 1658
1515 u8 final[2] = {0xFF, 0xFF}; 1659 u8 final_candidate[2] = { 0xFF, 0xFF };
1516 bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version); 1660 bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version);
1517 1661
1518 if (is2t) 1662 if (is2t)
@@ -1520,81 +1664,88 @@ static bool sim_comp(struct ieee80211_hw *hw, long result[][8], u8 c1, u8 c2)
1520 else 1664 else
1521 bound = 4; 1665 bound = 4;
1522 1666
1523 bitmap = 0; 1667 simularity_bitmap = 0;
1524 1668
1525 for (i = 0; i < bound; i++) { 1669 for (i = 0; i < bound; i++) {
1526 diff = (result[c1][i] > result[c2][i]) ? 1670 diff = (result[c1][i] > result[c2][i]) ?
1527 (result[c1][i] - result[c2][i]) : 1671 (result[c1][i] - result[c2][i]) :
1528 (result[c2][i] - result[c1][i]); 1672 (result[c2][i] - result[c1][i]);
1529 1673
1530 if (diff > MAX_TOLERANCE) { 1674 if (diff > MAX_TOLERANCE) {
1531 if ((i == 2 || i == 6) && !bitmap) { 1675 if ((i == 2 || i == 6) && !simularity_bitmap) {
1532 if (result[c1][i] + result[c1][i + 1] == 0) 1676 if (result[c1][i] + result[c1][i + 1] == 0)
1533 final[(i / 4)] = c2; 1677 final_candidate[(i / 4)] = c2;
1534 else if (result[c2][i] + result[c2][i + 1] == 0) 1678 else if (result[c2][i] + result[c2][i + 1] == 0)
1535 final[(i / 4)] = c1; 1679 final_candidate[(i / 4)] = c1;
1536 else 1680 else
1537 bitmap = bitmap | (1 << i); 1681 simularity_bitmap = simularity_bitmap |
1538 } else { 1682 (1 << i);
1539 bitmap = bitmap | (1 << i); 1683 } else
1540 } 1684 simularity_bitmap =
1685 simularity_bitmap | (1 << i);
1541 } 1686 }
1542 } 1687 }
1543 1688
1544 if (bitmap == 0) { 1689 if (simularity_bitmap == 0) {
1545 for (i = 0; i < (bound / 4); i++) { 1690 for (i = 0; i < (bound / 4); i++) {
1546 if (final[i] != 0xFF) { 1691 if (final_candidate[i] != 0xFF) {
1547 for (j = i * 4; j < (i + 1) * 4 - 2; j++) 1692 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
1548 result[3][j] = result[final[i]][j]; 1693 result[3][j] =
1694 result[final_candidate[i]][j];
1549 bresult = false; 1695 bresult = false;
1550 } 1696 }
1551 } 1697 }
1552 return bresult; 1698 return bresult;
1553 } else if (!(bitmap & 0x0F)) { 1699 } else if (!(simularity_bitmap & 0x0F)) {
1554 for (i = 0; i < 4; i++) 1700 for (i = 0; i < 4; i++)
1555 result[3][i] = result[c1][i]; 1701 result[3][i] = result[c1][i];
1556 return false; 1702 return false;
1557 } else if (!(bitmap & 0xF0) && is2t) { 1703 } else if (!(simularity_bitmap & 0xF0) && is2t) {
1558 for (i = 4; i < 8; i++) 1704 for (i = 4; i < 8; i++)
1559 result[3][i] = result[c1][i]; 1705 result[3][i] = result[c1][i];
1560 return false; 1706 return false;
1561 } else { 1707 } else {
1562 return false; 1708 return false;
1563 } 1709 }
1710
1564} 1711}
1565 1712
1566static void _rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw, 1713static void _rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw,
1567 long result[][8], u8 t, bool is2t) 1714 long result[][8], u8 t, bool is2t)
1568{ 1715{
1569 struct rtl_priv *rtlpriv = rtl_priv(hw); 1716 struct rtl_priv *rtlpriv = rtl_priv(hw);
1570 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1717 struct rtl_phy *rtlphy = &rtlpriv->phy;
1571 u32 i; 1718 u32 i;
1572 u8 patha_ok, pathb_ok; 1719 u8 patha_ok, pathb_ok;
1573 const u32 adda_reg[IQK_ADDA_REG_NUM] = { 1720 u32 adda_reg[IQK_ADDA_REG_NUM] = {
1574 0x85c, 0xe6c, 0xe70, 0xe74, 1721 0x85c, 0xe6c, 0xe70, 0xe74,
1575 0xe78, 0xe7c, 0xe80, 0xe84, 1722 0xe78, 0xe7c, 0xe80, 0xe84,
1576 0xe88, 0xe8c, 0xed0, 0xed4, 1723 0xe88, 0xe8c, 0xed0, 0xed4,
1577 0xed8, 0xedc, 0xee0, 0xeec 1724 0xed8, 0xedc, 0xee0, 0xeec
1578 }; 1725 };
1579 const u32 iqk_mac_reg[IQK_MAC_REG_NUM] = { 1726 u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1580 0x522, 0x550, 0x551, 0x040 1727 0x522, 0x550, 0x551, 0x040
1581 }; 1728 };
1582 const u32 iqk_bb_reg[IQK_BB_REG_NUM] = { 1729 u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1583 ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR, RFPGA0_XCD_RFINTERFACESW, 1730 ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
1584 0xb68, 0xb6c, 0x870, 0x860, 0x864, 0x800 1731 RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
1732 0x870, 0x860, 0x864, 0x800
1585 }; 1733 };
1586 const u32 retrycount = 2; 1734 const u32 retrycount = 2;
1587 1735
1588 if (t == 0) { 1736 if (t == 0) {
1589 save_adda_reg(hw, adda_reg, rtlphy->adda_backup, 16); 1737 _rtl88e_phy_save_adda_registers(hw, adda_reg,
1590 save_mac_reg(hw, iqk_mac_reg, rtlphy->iqk_mac_backup); 1738 rtlphy->adda_backup, 16);
1591 save_adda_reg(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 1739 _rtl88e_phy_save_mac_registers(hw, iqk_mac_reg,
1592 IQK_BB_REG_NUM); 1740 rtlphy->iqk_mac_backup);
1741 _rtl88e_phy_save_adda_registers(hw, iqk_bb_reg,
1742 rtlphy->iqk_bb_backup,
1743 IQK_BB_REG_NUM);
1593 } 1744 }
1594 _rtl88e_phy_path_adda_on(hw, adda_reg, true, is2t); 1745 _rtl88e_phy_path_adda_on(hw, adda_reg, true, is2t);
1595 if (t == 0) { 1746 if (t == 0) {
1596 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw, 1747 rtlphy->rfpi_enable =
1597 RFPGA0_XA_HSSIPARAMETER1, BIT(8)); 1748 (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1598 } 1749 }
1599 1750
1600 if (!rtlphy->rfpi_enable) 1751 if (!rtlphy->rfpi_enable)
@@ -1652,10 +1803,9 @@ static void _rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw,
1652 } 1803 }
1653 } 1804 }
1654 1805
1655 if (0 == patha_ok) { 1806 if (0 == patha_ok)
1656 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1807 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1657 "Path A IQK Success!!\n"); 1808 "Path A IQK Success!!\n");
1658 }
1659 if (is2t) { 1809 if (is2t) {
1660 _rtl88e_phy_path_a_standby(hw); 1810 _rtl88e_phy_path_a_standby(hw);
1661 _rtl88e_phy_path_adda_on(hw, adda_reg, false, is2t); 1811 _rtl88e_phy_path_adda_on(hw, adda_reg, false, is2t);
@@ -1663,21 +1813,23 @@ static void _rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw,
1663 pathb_ok = _rtl88e_phy_path_b_iqk(hw); 1813 pathb_ok = _rtl88e_phy_path_b_iqk(hw);
1664 if (pathb_ok == 0x03) { 1814 if (pathb_ok == 0x03) {
1665 result[t][4] = (rtl_get_bbreg(hw, 1815 result[t][4] = (rtl_get_bbreg(hw,
1666 0xeb4, MASKDWORD) & 1816 0xeb4,
1817 MASKDWORD) &
1667 0x3FF0000) >> 16; 1818 0x3FF0000) >> 16;
1668 result[t][5] = 1819 result[t][5] =
1669 (rtl_get_bbreg(hw, 0xebc, MASKDWORD) & 1820 (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
1670 0x3FF0000) >> 16; 1821 0x3FF0000) >> 16;
1671 result[t][6] = 1822 result[t][6] =
1672 (rtl_get_bbreg(hw, 0xec4, MASKDWORD) & 1823 (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
1673 0x3FF0000) >> 16; 1824 0x3FF0000) >> 16;
1674 result[t][7] = 1825 result[t][7] =
1675 (rtl_get_bbreg(hw, 0xecc, MASKDWORD) & 1826 (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
1676 0x3FF0000) >> 16; 1827 0x3FF0000) >> 16;
1677 break; 1828 break;
1678 } else if (i == (retrycount - 1) && pathb_ok == 0x01) { 1829 } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1679 result[t][4] = (rtl_get_bbreg(hw, 1830 result[t][4] = (rtl_get_bbreg(hw,
1680 0xeb4, MASKDWORD) & 1831 0xeb4,
1832 MASKDWORD) &
1681 0x3FF0000) >> 16; 1833 0x3FF0000) >> 16;
1682 } 1834 }
1683 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) & 1835 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
@@ -1690,10 +1842,13 @@ static void _rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw,
1690 if (t != 0) { 1842 if (t != 0) {
1691 if (!rtlphy->rfpi_enable) 1843 if (!rtlphy->rfpi_enable)
1692 _rtl88e_phy_pi_mode_switch(hw, false); 1844 _rtl88e_phy_pi_mode_switch(hw, false);
1693 reload_adda(hw, adda_reg, rtlphy->adda_backup, 16); 1845 _rtl88e_phy_reload_adda_registers(hw, adda_reg,
1694 reload_mac(hw, iqk_mac_reg, rtlphy->iqk_mac_backup); 1846 rtlphy->adda_backup, 16);
1695 reload_adda(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 1847 _rtl88e_phy_reload_mac_registers(hw, iqk_mac_reg,
1696 IQK_BB_REG_NUM); 1848 rtlphy->iqk_mac_backup);
1849 _rtl88e_phy_reload_adda_registers(hw, iqk_bb_reg,
1850 rtlphy->iqk_bb_backup,
1851 IQK_BB_REG_NUM);
1697 1852
1698 rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3); 1853 rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
1699 if (is2t) 1854 if (is2t)
@@ -1709,8 +1864,6 @@ static void _rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
1709 u8 tmpreg; 1864 u8 tmpreg;
1710 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal; 1865 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
1711 struct rtl_priv *rtlpriv = rtl_priv(hw); 1866 struct rtl_priv *rtlpriv = rtl_priv(hw);
1712 int jj = RF90_PATH_A;
1713 int kk = RF90_PATH_B;
1714 1867
1715 tmpreg = rtl_read_byte(rtlpriv, 0xd03); 1868 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
1716 1869
@@ -1720,51 +1873,52 @@ static void _rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
1720 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 1873 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
1721 1874
1722 if ((tmpreg & 0x70) != 0) { 1875 if ((tmpreg & 0x70) != 0) {
1723 rf_a_mode = rtl_get_rfreg(hw, jj, 0x00, MASK12BITS); 1876 rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
1724 1877
1725 if (is2t) 1878 if (is2t)
1726 rf_b_mode = rtl_get_rfreg(hw, kk, 0x00, 1879 rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
1727 MASK12BITS); 1880 MASK12BITS);
1728 1881
1729 rtl_set_rfreg(hw, jj, 0x00, MASK12BITS, 1882 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
1730 (rf_a_mode & 0x8FFFF) | 0x10000); 1883 (rf_a_mode & 0x8FFFF) | 0x10000);
1731 1884
1732 if (is2t) 1885 if (is2t)
1733 rtl_set_rfreg(hw, kk, 0x00, MASK12BITS, 1886 rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
1734 (rf_b_mode & 0x8FFFF) | 0x10000); 1887 (rf_b_mode & 0x8FFFF) | 0x10000);
1735 } 1888 }
1736 lc_cal = rtl_get_rfreg(hw, jj, 0x18, MASK12BITS); 1889 lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
1737 1890
1738 rtl_set_rfreg(hw, jj, 0x18, MASK12BITS, lc_cal | 0x08000); 1891 rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
1739 1892
1740 mdelay(100); 1893 mdelay(100);
1741 1894
1742 if ((tmpreg & 0x70) != 0) { 1895 if ((tmpreg & 0x70) != 0) {
1743 rtl_write_byte(rtlpriv, 0xd03, tmpreg); 1896 rtl_write_byte(rtlpriv, 0xd03, tmpreg);
1744 rtl_set_rfreg(hw, jj, 0x00, MASK12BITS, rf_a_mode); 1897 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
1745 1898
1746 if (is2t) 1899 if (is2t)
1747 rtl_set_rfreg(hw, kk, 0x00, MASK12BITS, 1900 rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
1748 rf_b_mode); 1901 rf_b_mode);
1749 } else { 1902 } else {
1750 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 1903 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1751 } 1904 }
1752 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n"); 1905RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
1906
1753} 1907}
1754 1908
1755static void rfpath_switch(struct ieee80211_hw *hw, 1909static void _rtl88e_phy_set_rfpath_switch(struct ieee80211_hw *hw,
1756 bool bmain, bool is2t) 1910 bool bmain, bool is2t)
1757{ 1911{
1758 struct rtl_priv *rtlpriv = rtl_priv(hw); 1912 struct rtl_priv *rtlpriv = rtl_priv(hw);
1759 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1913 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1760 struct rtl_efuse *fuse = rtl_efuse(rtl_priv(hw)); 1914 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1761 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n"); 1915 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
1762 1916
1763 if (is_hal_stop(rtlhal)) { 1917 if (is_hal_stop(rtlhal)) {
1764 u8 u1btmp; 1918 u8 u1btmp;
1765 u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0); 1919 u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
1766 rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7)); 1920 rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
1767 rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01); 1921 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
1768 } 1922 }
1769 if (is2t) { 1923 if (is2t) {
1770 if (bmain) 1924 if (bmain)
@@ -1777,24 +1931,24 @@ static void rfpath_switch(struct ieee80211_hw *hw,
1777 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0); 1931 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
1778 rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201); 1932 rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
1779 1933
1780 /* We use the RF definition of MAIN and AUX, left antenna and 1934 /* We use the RF definition of MAIN and AUX,
1781 * right antenna repectively. 1935 * left antenna and right antenna repectively.
1782 * Default output at AUX. 1936 * Default output at AUX.
1783 */ 1937 */
1784 if (bmain) { 1938 if (bmain) {
1785 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(14) | 1939 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
1786 BIT(13) | BIT(12), 0); 1940 BIT(14) | BIT(13) | BIT(12), 0);
1787 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(5) | 1941 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
1788 BIT(4) | BIT(3), 0); 1942 BIT(5) | BIT(4) | BIT(3), 0);
1789 if (fuse->antenna_div_type == CGCS_RX_HW_ANTDIV) 1943 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1790 rtl_set_bbreg(hw, RCONFIG_RAM64X16, BIT(31), 0); 1944 rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 0);
1791 } else { 1945 } else {
1792 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(14) | 1946 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
1793 BIT(13) | BIT(12), 1); 1947 BIT(14) | BIT(13) | BIT(12), 1);
1794 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(5) | 1948 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
1795 BIT(4) | BIT(3), 1); 1949 BIT(5) | BIT(4) | BIT(3), 1);
1796 if (fuse->antenna_div_type == CGCS_RX_HW_ANTDIV) 1950 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1797 rtl_set_bbreg(hw, RCONFIG_RAM64X16, BIT(31), 1); 1951 rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 1);
1798 } 1952 }
1799 } 1953 }
1800} 1954}
@@ -1802,35 +1956,44 @@ static void rfpath_switch(struct ieee80211_hw *hw,
1802#undef IQK_ADDA_REG_NUM 1956#undef IQK_ADDA_REG_NUM
1803#undef IQK_DELAY_TIME 1957#undef IQK_DELAY_TIME
1804 1958
1805void rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery) 1959void rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
1806{ 1960{
1807 struct rtl_priv *rtlpriv = rtl_priv(hw); 1961 struct rtl_priv *rtlpriv = rtl_priv(hw);
1808 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1962 struct rtl_phy *rtlphy = &rtlpriv->phy;
1809 long result[4][8]; 1963 long result[4][8];
1810 u8 i, final; 1964 u8 i, final_candidate;
1811 bool patha_ok; 1965 bool b_patha_ok, b_pathb_ok;
1812 long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_tmp = 0; 1966 long reg_e94, reg_e9c, reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4,
1967 reg_ecc, reg_tmp = 0;
1813 bool is12simular, is13simular, is23simular; 1968 bool is12simular, is13simular, is23simular;
1814 u32 iqk_bb_reg[9] = { 1969 u32 iqk_bb_reg[9] = {
1815 ROFDM0_XARXIQIMBAL, 1970 ROFDM0_XARXIQIMBALANCE,
1816 ROFDM0_XBRXIQIMBAL, 1971 ROFDM0_XBRXIQIMBALANCE,
1817 ROFDM0_ECCATHRES, 1972 ROFDM0_ECCATHRESHOLD,
1818 ROFDM0_AGCRSSITABLE, 1973 ROFDM0_AGCRSSITABLE,
1819 ROFDM0_XATXIQIMBAL, 1974 ROFDM0_XATXIQIMBALANCE,
1820 ROFDM0_XBTXIQIMBAL, 1975 ROFDM0_XBTXIQIMBALANCE,
1821 ROFDM0_XCTXAFE, 1976 ROFDM0_XCTXAFE,
1822 ROFDM0_XDTXAFE, 1977 ROFDM0_XDTXAFE,
1823 ROFDM0_RXIQEXTANTA 1978 ROFDM0_RXIQEXTANTA
1824 }; 1979 };
1825 1980
1826 if (recovery) { 1981 if (b_recovery) {
1827 reload_adda(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 9); 1982 _rtl88e_phy_reload_adda_registers(hw,
1983 iqk_bb_reg,
1984 rtlphy->iqk_bb_backup, 9);
1828 return; 1985 return;
1829 } 1986 }
1830 1987
1831 memset(result, 0, 32 * sizeof(long)); 1988 for (i = 0; i < 8; i++) {
1832 final = 0xff; 1989 result[0][i] = 0;
1833 patha_ok = false; 1990 result[1][i] = 0;
1991 result[2][i] = 0;
1992 result[3][i] = 0;
1993 }
1994 final_candidate = 0xff;
1995 b_patha_ok = false;
1996 b_pathb_ok = false;
1834 is12simular = false; 1997 is12simular = false;
1835 is23simular = false; 1998 is23simular = false;
1836 is13simular = false; 1999 is13simular = false;
@@ -1840,29 +2003,32 @@ void rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1840 else 2003 else
1841 _rtl88e_phy_iq_calibrate(hw, result, i, false); 2004 _rtl88e_phy_iq_calibrate(hw, result, i, false);
1842 if (i == 1) { 2005 if (i == 1) {
1843 is12simular = sim_comp(hw, result, 0, 1); 2006 is12simular =
2007 _rtl88e_phy_simularity_compare(hw, result, 0, 1);
1844 if (is12simular) { 2008 if (is12simular) {
1845 final = 0; 2009 final_candidate = 0;
1846 break; 2010 break;
1847 } 2011 }
1848 } 2012 }
1849 if (i == 2) { 2013 if (i == 2) {
1850 is13simular = sim_comp(hw, result, 0, 2); 2014 is13simular =
2015 _rtl88e_phy_simularity_compare(hw, result, 0, 2);
1851 if (is13simular) { 2016 if (is13simular) {
1852 final = 0; 2017 final_candidate = 0;
1853 break; 2018 break;
1854 } 2019 }
1855 is23simular = sim_comp(hw, result, 1, 2); 2020 is23simular =
2021 _rtl88e_phy_simularity_compare(hw, result, 1, 2);
1856 if (is23simular) { 2022 if (is23simular) {
1857 final = 1; 2023 final_candidate = 1;
1858 } else { 2024 } else {
1859 for (i = 0; i < 8; i++) 2025 for (i = 0; i < 8; i++)
1860 reg_tmp += result[3][i]; 2026 reg_tmp += result[3][i];
1861 2027
1862 if (reg_tmp != 0) 2028 if (reg_tmp != 0)
1863 final = 3; 2029 final_candidate = 3;
1864 else 2030 else
1865 final = 0xFF; 2031 final_candidate = 0xFF;
1866 } 2032 }
1867 } 2033 }
1868 } 2034 }
@@ -1870,47 +2036,55 @@ void rtl88e_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1870 reg_e94 = result[i][0]; 2036 reg_e94 = result[i][0];
1871 reg_e9c = result[i][1]; 2037 reg_e9c = result[i][1];
1872 reg_ea4 = result[i][2]; 2038 reg_ea4 = result[i][2];
2039 reg_eac = result[i][3];
1873 reg_eb4 = result[i][4]; 2040 reg_eb4 = result[i][4];
1874 reg_ebc = result[i][5]; 2041 reg_ebc = result[i][5];
2042 reg_ec4 = result[i][6];
2043 reg_ecc = result[i][7];
1875 } 2044 }
1876 if (final != 0xff) { 2045 if (final_candidate != 0xff) {
1877 reg_e94 = result[final][0]; 2046 reg_e94 = result[final_candidate][0];
1878 rtlphy->reg_e94 = reg_e94; 2047 reg_e9c = result[final_candidate][1];
1879 reg_e9c = result[final][1]; 2048 reg_ea4 = result[final_candidate][2];
1880 rtlphy->reg_e9c = reg_e9c; 2049 reg_eac = result[final_candidate][3];
1881 reg_ea4 = result[final][2]; 2050 reg_eb4 = result[final_candidate][4];
1882 reg_eb4 = result[final][4]; 2051 reg_ebc = result[final_candidate][5];
2052 reg_ec4 = result[final_candidate][6];
2053 reg_ecc = result[final_candidate][7];
1883 rtlphy->reg_eb4 = reg_eb4; 2054 rtlphy->reg_eb4 = reg_eb4;
1884 reg_ebc = result[final][5];
1885 rtlphy->reg_ebc = reg_ebc; 2055 rtlphy->reg_ebc = reg_ebc;
1886 patha_ok = true; 2056 rtlphy->reg_e94 = reg_e94;
2057 rtlphy->reg_e9c = reg_e9c;
2058 b_patha_ok = true;
2059 b_pathb_ok = true;
1887 } else { 2060 } else {
1888 rtlphy->reg_e94 = 0x100; 2061 rtlphy->reg_e94 = 0x100;
1889 rtlphy->reg_eb4 = 0x100; 2062 rtlphy->reg_eb4 = 0x100;
1890 rtlphy->reg_ebc = 0x0;
1891 rtlphy->reg_e9c = 0x0; 2063 rtlphy->reg_e9c = 0x0;
2064 rtlphy->reg_ebc = 0x0;
1892 } 2065 }
1893 if (reg_e94 != 0) /*&&(reg_ea4 != 0) */ 2066 if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
1894 fill_iqk(hw, patha_ok, result, final, (reg_ea4 == 0)); 2067 _rtl88e_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
1895 if (final != 0xFF) { 2068 final_candidate,
2069 (reg_ea4 == 0));
2070 if (final_candidate != 0xFF) {
1896 for (i = 0; i < IQK_MATRIX_REG_NUM; i++) 2071 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
1897 rtlphy->iqk_matrix[0].value[0][i] = result[final][i]; 2072 rtlphy->iqk_matrix[0].value[0][i] =
2073 result[final_candidate][i];
1898 rtlphy->iqk_matrix[0].iqk_done = true; 2074 rtlphy->iqk_matrix[0].iqk_done = true;
2075
1899 } 2076 }
1900 save_adda_reg(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 9); 2077 _rtl88e_phy_save_adda_registers(hw, iqk_bb_reg,
2078 rtlphy->iqk_bb_backup, 9);
1901} 2079}
1902 2080
1903void rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw) 2081void rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw)
1904{ 2082{
1905 struct rtl_priv *rtlpriv = rtl_priv(hw); 2083 struct rtl_priv *rtlpriv = rtl_priv(hw);
1906 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2084 struct rtl_phy *rtlphy = &rtlpriv->phy;
1907 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal); 2085 struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
1908 bool start_conttx = false, singletone = false;
1909 u32 timeout = 2000, timecount = 0; 2086 u32 timeout = 2000, timecount = 0;
1910 2087
1911 if (start_conttx || singletone)
1912 return;
1913
1914 while (rtlpriv->mac80211.act_scanning && timecount < timeout) { 2088 while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
1915 udelay(50); 2089 udelay(50);
1916 timecount += 50; 2090 timecount += 50;
@@ -1928,18 +2102,18 @@ void rtl88e_phy_lc_calibrate(struct ieee80211_hw *hw)
1928 2102
1929void rtl88e_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain) 2103void rtl88e_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
1930{ 2104{
1931 rfpath_switch(hw, bmain, false); 2105 _rtl88e_phy_set_rfpath_switch(hw, bmain, false);
1932} 2106}
1933 2107
1934bool rtl88e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype) 2108bool rtl88e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1935{ 2109{
1936 struct rtl_priv *rtlpriv = rtl_priv(hw); 2110 struct rtl_priv *rtlpriv = rtl_priv(hw);
1937 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2111 struct rtl_phy *rtlphy = &rtlpriv->phy;
1938 bool postprocessing = false; 2112 bool postprocessing = false;
1939 2113
1940 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 2114 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1941 "-->IO Cmd(%#x), set_io_inprogress(%d)\n", 2115 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
1942 iotype, rtlphy->set_io_inprogress); 2116 iotype, rtlphy->set_io_inprogress);
1943 do { 2117 do {
1944 switch (iotype) { 2118 switch (iotype) {
1945 case IO_CMD_RESUME_DM_BY_SCAN: 2119 case IO_CMD_RESUME_DM_BY_SCAN:
@@ -1947,14 +2121,14 @@ bool rtl88e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1947 "[IO CMD] Resume DM after scan.\n"); 2121 "[IO CMD] Resume DM after scan.\n");
1948 postprocessing = true; 2122 postprocessing = true;
1949 break; 2123 break;
1950 case IO_CMD_PAUSE_DM_BY_SCAN: 2124 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
1951 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 2125 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1952 "[IO CMD] Pause DM before scan.\n"); 2126 "[IO CMD] Pause DM before scan.\n");
1953 postprocessing = true; 2127 postprocessing = true;
1954 break; 2128 break;
1955 default: 2129 default:
1956 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2130 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1957 "switch case not processed\n"); 2131 "switch case not process\n");
1958 break; 2132 break;
1959 } 2133 }
1960 } while (false); 2134 } while (false);
@@ -1969,6 +2143,37 @@ bool rtl88e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1969 return true; 2143 return true;
1970} 2144}
1971 2145
2146static void rtl88e_phy_set_io(struct ieee80211_hw *hw)
2147{
2148 struct rtl_priv *rtlpriv = rtl_priv(hw);
2149 struct rtl_phy *rtlphy = &rtlpriv->phy;
2150 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2151
2152 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2153 "--->Cmd(%#x), set_io_inprogress(%d)\n",
2154 rtlphy->current_io_type, rtlphy->set_io_inprogress);
2155 switch (rtlphy->current_io_type) {
2156 case IO_CMD_RESUME_DM_BY_SCAN:
2157 dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2158 /*rtl92c_dm_write_dig(hw);*/
2159 rtl88e_phy_set_txpower_level(hw, rtlphy->current_channel);
2160 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x83);
2161 break;
2162 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
2163 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
2164 dm_digtable->cur_igvalue = 0x17;
2165 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x40);
2166 break;
2167 default:
2168 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2169 "switch case not process\n");
2170 break;
2171 }
2172 rtlphy->set_io_inprogress = false;
2173 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2174 "(%#x)\n", rtlphy->current_io_type);
2175}
2176
1972static void rtl88ee_phy_set_rf_on(struct ieee80211_hw *hw) 2177static void rtl88ee_phy_set_rf_on(struct ieee80211_hw *hw)
1973{ 2178{
1974 struct rtl_priv *rtlpriv = rtl_priv(hw); 2179 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1984,10 +2189,9 @@ static void rtl88ee_phy_set_rf_on(struct ieee80211_hw *hw)
1984static void _rtl88ee_phy_set_rf_sleep(struct ieee80211_hw *hw) 2189static void _rtl88ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
1985{ 2190{
1986 struct rtl_priv *rtlpriv = rtl_priv(hw); 2191 struct rtl_priv *rtlpriv = rtl_priv(hw);
1987 int jj = RF90_PATH_A;
1988 2192
1989 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 2193 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
1990 rtl_set_rfreg(hw, jj, 0x00, RFREG_OFFSET_MASK, 0x00); 2194 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
1991 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 2195 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
1992 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22); 2196 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
1993} 2197}
@@ -1999,42 +2203,49 @@ static bool _rtl88ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
1999 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 2203 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2000 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2204 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2001 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 2205 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2002 struct rtl8192_tx_ring *ring = NULL;
2003 bool bresult = true; 2206 bool bresult = true;
2004 u8 i, queue_id; 2207 u8 i, queue_id;
2208 struct rtl8192_tx_ring *ring = NULL;
2005 2209
2006 switch (rfpwr_state) { 2210 switch (rfpwr_state) {
2007 case ERFON:{ 2211 case ERFON:
2008 if ((ppsc->rfpwr_state == ERFOFF) && 2212 if ((ppsc->rfpwr_state == ERFOFF) &&
2009 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) { 2213 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
2010 bool rtstatus; 2214 bool rtstatus;
2011 u32 init = 0; 2215 u32 initializecount = 0;
2216
2012 do { 2217 do {
2013 init++; 2218 initializecount++;
2014 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2219 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2015 "IPS Set eRf nic enable\n"); 2220 "IPS Set eRf nic enable\n");
2016 rtstatus = rtl_ps_enable_nic(hw); 2221 rtstatus = rtl_ps_enable_nic(hw);
2017 } while ((rtstatus != true) && (init < 10)); 2222 } while (!rtstatus &&
2223 (initializecount < 10));
2018 RT_CLEAR_PS_LEVEL(ppsc, 2224 RT_CLEAR_PS_LEVEL(ppsc,
2019 RT_RF_OFF_LEVL_HALT_NIC); 2225 RT_RF_OFF_LEVL_HALT_NIC);
2020 } else { 2226 } else {
2021 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2227 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2022 "Set ERFON sleeped:%d ms\n", 2228 "Set ERFON sleeped:%d ms\n",
2023 jiffies_to_msecs(jiffies - ppsc-> 2229 jiffies_to_msecs(jiffies -
2024 last_sleep_jiffies)); 2230 ppsc->
2231 last_sleep_jiffies));
2025 ppsc->last_awake_jiffies = jiffies; 2232 ppsc->last_awake_jiffies = jiffies;
2026 rtl88ee_phy_set_rf_on(hw); 2233 rtl88ee_phy_set_rf_on(hw);
2027 } 2234 }
2028 if (mac->link_state == MAC80211_LINKED) 2235 if (mac->link_state == MAC80211_LINKED) {
2029 rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK); 2236 rtlpriv->cfg->ops->led_control(hw,
2030 else 2237 LED_CTL_LINK);
2031 rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK); 2238 } else {
2032 break; } 2239 rtlpriv->cfg->ops->led_control(hw,
2033 case ERFOFF:{ 2240 LED_CTL_NO_LINK);
2241 }
2242 break;
2243 case ERFOFF:
2034 for (queue_id = 0, i = 0; 2244 for (queue_id = 0, i = 0;
2035 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 2245 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
2036 ring = &pcipriv->dev.tx_ring[queue_id]; 2246 ring = &pcipriv->dev.tx_ring[queue_id];
2037 if (skb_queue_len(&ring->queue) == 0) { 2247 if (queue_id == BEACON_QUEUE ||
2248 skb_queue_len(&ring->queue) == 0) {
2038 queue_id++; 2249 queue_id++;
2039 continue; 2250 continue;
2040 } else { 2251 } else {
@@ -2055,6 +2266,7 @@ static bool _rtl88ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
2055 break; 2266 break;
2056 } 2267 }
2057 } 2268 }
2269
2058 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) { 2270 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
2059 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2271 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2060 "IPS Set eRf nic disable\n"); 2272 "IPS Set eRf nic disable\n");
@@ -2063,49 +2275,51 @@ static bool _rtl88ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
2063 } else { 2275 } else {
2064 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) { 2276 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
2065 rtlpriv->cfg->ops->led_control(hw, 2277 rtlpriv->cfg->ops->led_control(hw,
2066 LED_CTL_NO_LINK); 2278 LED_CTL_NO_LINK);
2067 } else { 2279 } else {
2068 rtlpriv->cfg->ops->led_control(hw, 2280 rtlpriv->cfg->ops->led_control(hw,
2069 LED_CTL_POWER_OFF); 2281 LED_CTL_POWER_OFF);
2070 } 2282 }
2071 } 2283 }
2072 break; } 2284 break;
2073 case ERFSLEEP:{ 2285 case ERFSLEEP:{
2074 if (ppsc->rfpwr_state == ERFOFF) 2286 if (ppsc->rfpwr_state == ERFOFF)
2075 break;
2076 for (queue_id = 0, i = 0;
2077 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
2078 ring = &pcipriv->dev.tx_ring[queue_id];
2079 if (skb_queue_len(&ring->queue) == 0) {
2080 queue_id++;
2081 continue;
2082 } else {
2083 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2084 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
2085 (i + 1), queue_id,
2086 skb_queue_len(&ring->queue));
2087
2088 udelay(10);
2089 i++;
2090 }
2091 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
2092 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2093 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
2094 MAX_DOZE_WAITING_TIMES_9x,
2095 queue_id,
2096 skb_queue_len(&ring->queue));
2097 break; 2287 break;
2288 for (queue_id = 0, i = 0;
2289 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
2290 ring = &pcipriv->dev.tx_ring[queue_id];
2291 if (skb_queue_len(&ring->queue) == 0) {
2292 queue_id++;
2293 continue;
2294 } else {
2295 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2296 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
2297 (i + 1), queue_id,
2298 skb_queue_len(&ring->queue));
2299
2300 udelay(10);
2301 i++;
2302 }
2303 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
2304 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2305 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
2306 MAX_DOZE_WAITING_TIMES_9x,
2307 queue_id,
2308 skb_queue_len(&ring->queue));
2309 break;
2310 }
2098 } 2311 }
2312 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2313 "Set ERFSLEEP awaked:%d ms\n",
2314 jiffies_to_msecs(jiffies -
2315 ppsc->last_awake_jiffies));
2316 ppsc->last_sleep_jiffies = jiffies;
2317 _rtl88ee_phy_set_rf_sleep(hw);
2318 break;
2099 } 2319 }
2100 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2101 "Set ERFSLEEP awaked:%d ms\n",
2102 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
2103 ppsc->last_sleep_jiffies = jiffies;
2104 _rtl88ee_phy_set_rf_sleep(hw);
2105 break; }
2106 default: 2320 default:
2107 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2321 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2108 "switch case not processed\n"); 2322 "switch case not process\n");
2109 bresult = false; 2323 bresult = false;
2110 break; 2324 break;
2111 } 2325 }
@@ -2118,10 +2332,11 @@ bool rtl88e_phy_set_rf_power_state(struct ieee80211_hw *hw,
2118 enum rf_pwrstate rfpwr_state) 2332 enum rf_pwrstate rfpwr_state)
2119{ 2333{
2120 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 2334 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2121 bool bresult; 2335
2336 bool bresult = false;
2122 2337
2123 if (rfpwr_state == ppsc->rfpwr_state) 2338 if (rfpwr_state == ppsc->rfpwr_state)
2124 return false; 2339 return bresult;
2125 bresult = _rtl88ee_phy_set_rf_power_state(hw, rfpwr_state); 2340 bresult = _rtl88ee_phy_set_rf_power_state(hw, rfpwr_state);
2126 return bresult; 2341 return bresult;
2127} 2342}
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h
index 89f0f1ef1465..b29bd77210f4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/phy.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,33 +26,35 @@
30#ifndef __RTL92C_PHY_H__ 26#ifndef __RTL92C_PHY_H__
31#define __RTL92C_PHY_H__ 27#define __RTL92C_PHY_H__
32 28
33/*It must always set to 4, otherwise read efuse table secquence will be wrong.*/ 29/* MAX_TX_COUNT must always set to 4, otherwise read efuse
34#define MAX_TX_COUNT 4 30 * table secquence will be wrong.
31 */
32#define MAX_TX_COUNT 4
35 33
36#define MAX_PRECMD_CNT 16 34#define MAX_PRECMD_CNT 16
37#define MAX_RFDEPENDCMD_CNT 16 35#define MAX_RFDEPENDCMD_CNT 16
38#define MAX_POSTCMD_CNT 16 36#define MAX_POSTCMD_CNT 16
39 37
40#define MAX_DOZE_WAITING_TIMES_9x 64 38#define MAX_DOZE_WAITING_TIMES_9x 64
41 39
42#define RT_CANNOT_IO(hw) false 40#define RT_CANNOT_IO(hw) false
43#define HIGHPOWER_RADIOA_ARRAYLEN 22 41#define HIGHPOWER_RADIOA_ARRAYLEN 22
44 42
45#define IQK_ADDA_REG_NUM 16 43#define IQK_ADDA_REG_NUM 16
46#define IQK_BB_REG_NUM 9 44#define IQK_BB_REG_NUM 9
47#define MAX_TOLERANCE 5 45#define MAX_TOLERANCE 5
48#define IQK_DELAY_TIME 10 46#define IQK_DELAY_TIME 10
49#define IDX_MAP 15 47#define INDEX_MAPPING_NUM 15
50 48
51#define APK_BB_REG_NUM 5 49#define APK_BB_REG_NUM 5
52#define APK_AFE_REG_NUM 16 50#define APK_AFE_REG_NUM 16
53#define APK_CURVE_REG_NUM 4 51#define APK_CURVE_REG_NUM 4
54#define PATH_NUM 2 52#define PATH_NUM 2
55 53
56#define LOOP_LIMIT 5 54#define LOOP_LIMIT 5
57#define MAX_STALL_TIME 50 55#define MAX_STALL_TIME 50
58#define ANTENNADIVERSITYVALUE 0x80 56#define ANTENNADIVERSITYVALUE 0x80
59#define MAX_TXPWR_IDX_NMODE_92S 63 57#define MAX_TXPWR_IDX_NMODE_92S 63
60#define RESET_CNT_LIMIT 3 58#define RESET_CNT_LIMIT 3
61 59
62#define IQK_ADDA_REG_NUM 16 60#define IQK_ADDA_REG_NUM 16
@@ -66,8 +64,8 @@
66 64
67#define CT_OFFSET_MAC_ADDR 0X16 65#define CT_OFFSET_MAC_ADDR 0X16
68 66
69#define CT_OFFSET_CCK_TX_PWR_IDX 0x5A 67#define CT_OFFSET_CCK_TX_PWR_IDX 0x5A
70#define CT_OFFSET_HT401S_TX_PWR_IDX 0x60 68#define CT_OFFSET_HT401S_TX_PWR_IDX 0x60
71#define CT_OFFSET_HT402S_TX_PWR_IDX_DIFF 0x66 69#define CT_OFFSET_HT402S_TX_PWR_IDX_DIFF 0x66
72#define CT_OFFSET_HT20_TX_PWR_IDX_DIFF 0x69 70#define CT_OFFSET_HT20_TX_PWR_IDX_DIFF 0x69
73#define CT_OFFSET_OFDM_TX_PWR_IDX_DIFF 0x6C 71#define CT_OFFSET_OFDM_TX_PWR_IDX_DIFF 0x6C
@@ -75,13 +73,13 @@
75#define CT_OFFSET_HT40_MAX_PWR_OFFSET 0x6F 73#define CT_OFFSET_HT40_MAX_PWR_OFFSET 0x6F
76#define CT_OFFSET_HT20_MAX_PWR_OFFSET 0x72 74#define CT_OFFSET_HT20_MAX_PWR_OFFSET 0x72
77 75
78#define CT_OFFSET_CHANNEL_PLAH 0x75 76#define CT_OFFSET_CHANNEL_PLAH 0x75
79#define CT_OFFSET_THERMAL_METER 0x78 77#define CT_OFFSET_THERMAL_METER 0x78
80#define CT_OFFSET_RF_OPTION 0x79 78#define CT_OFFSET_RF_OPTION 0x79
81#define CT_OFFSET_VERSION 0x7E 79#define CT_OFFSET_VERSION 0x7E
82#define CT_OFFSET_CUSTOMER_ID 0x7F 80#define CT_OFFSET_CUSTOMER_ID 0x7F
83 81
84#define RTL92C_MAX_PATH_NUM 2 82#define RTL92C_MAX_PATH_NUM 2
85 83
86enum swchnlcmd_id { 84enum swchnlcmd_id {
87 CMDID_END, 85 CMDID_END,
@@ -160,7 +158,6 @@ struct r_antenna_select_cck {
160 u8 r_ccktx_enable:4; 158 u8 r_ccktx_enable:4;
161}; 159};
162 160
163
164struct efuse_contents { 161struct efuse_contents {
165 u8 mac_addr[ETH_ALEN]; 162 u8 mac_addr[ETH_ALEN];
166 u8 cck_tx_power_idx[6]; 163 u8 cck_tx_power_idx[6];
@@ -192,10 +189,10 @@ struct tx_power_struct {
192}; 189};
193 190
194enum _ANT_DIV_TYPE { 191enum _ANT_DIV_TYPE {
195 NO_ANTDIV = 0xFF, 192 NO_ANTDIV = 0xFF,
196 CG_TRX_HW_ANTDIV = 0x01, 193 CG_TRX_HW_ANTDIV = 0x01,
197 CGCS_RX_HW_ANTDIV = 0x02, 194 CGCS_RX_HW_ANTDIV = 0x02,
198 FIXED_HW_ANTDIV = 0x03, 195 FIXED_HW_ANTDIV = 0x03,
199 CG_TRX_SMART_ANTDIV = 0x04, 196 CG_TRX_SMART_ANTDIV = 0x04,
200 CGCS_RX_SW_ANTDIV = 0x05, 197 CGCS_RX_SW_ANTDIV = 0x05,
201}; 198};
@@ -217,6 +214,8 @@ void rtl88e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
217void rtl88e_phy_get_txpower_level(struct ieee80211_hw *hw, 214void rtl88e_phy_get_txpower_level(struct ieee80211_hw *hw,
218 long *powerlevel); 215 long *powerlevel);
219void rtl88e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel); 216void rtl88e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel);
217void rtl88e_phy_scan_operation_backup(struct ieee80211_hw *hw,
218 u8 operation);
220void rtl88e_phy_set_bw_mode_callback(struct ieee80211_hw *hw); 219void rtl88e_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
221void rtl88e_phy_set_bw_mode(struct ieee80211_hw *hw, 220void rtl88e_phy_set_bw_mode(struct ieee80211_hw *hw,
222 enum nl80211_channel_type ch_type); 221 enum nl80211_channel_type ch_type);
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.c b/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.c
index 6dc4e3a954f6..ef28c8ea1e84 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -32,78 +28,78 @@
32 28
33/* drivers should parse below arrays and do the corresponding actions */ 29/* drivers should parse below arrays and do the corresponding actions */
34/*3 Power on Array*/ 30/*3 Power on Array*/
35struct wlan_pwr_cfg rtl8188e_power_on_flow[RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS + 31struct wlan_pwr_cfg rtl8188ee_power_on_flow[RTL8188EE_TRANS_CARDEMU_TO_ACT_STEPS
36 RTL8188E_TRANS_END_STEPS] = { 32 + RTL8188EE_TRANS_END_STEPS] = {
37 RTL8188E_TRANS_CARDEMU_TO_ACT 33 RTL8188EE_TRANS_CARDEMU_TO_ACT
38 RTL8188E_TRANS_END 34 RTL8188EE_TRANS_END
39}; 35};
40 36
41/*3Radio off GPIO Array */ 37/*3Radio off GPIO Array */
42struct wlan_pwr_cfg rtl8188e_radio_off_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 38struct wlan_pwr_cfg rtl8188ee_radio_off_flow[RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS
43 + RTL8188E_TRANS_END_STEPS] = { 39 + RTL8188EE_TRANS_END_STEPS] = {
44 RTL8188E_TRANS_ACT_TO_CARDEMU 40 RTL8188EE_TRANS_ACT_TO_CARDEMU
45 RTL8188E_TRANS_END 41 RTL8188EE_TRANS_END
46}; 42};
47 43
48/*3Card Disable Array*/ 44/*3Card Disable Array*/
49struct wlan_pwr_cfg rtl8188e_card_disable_flow 45struct wlan_pwr_cfg rtl8188ee_card_disable_flow
50 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 46 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
51 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + 47 RTL8188EE_TRANS_CARDEMU_TO_PDN_STEPS +
52 RTL8188E_TRANS_END_STEPS] = { 48 RTL8188EE_TRANS_END_STEPS] = {
53 RTL8188E_TRANS_ACT_TO_CARDEMU 49 RTL8188EE_TRANS_ACT_TO_CARDEMU
54 RTL8188E_TRANS_CARDEMU_TO_CARDDIS 50 RTL8188EE_TRANS_CARDEMU_TO_CARDDIS
55 RTL8188E_TRANS_END 51 RTL8188EE_TRANS_END
56}; 52};
57 53
58/*3 Card Enable Array*/ 54/*3 Card Enable Array*/
59struct wlan_pwr_cfg rtl8188e_card_enable_flow 55struct wlan_pwr_cfg rtl8188ee_card_enable_flow
60 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 56 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
61 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + 57 RTL8188EE_TRANS_CARDEMU_TO_PDN_STEPS +
62 RTL8188E_TRANS_END_STEPS] = { 58 RTL8188EE_TRANS_END_STEPS] = {
63 RTL8188E_TRANS_CARDDIS_TO_CARDEMU 59 RTL8188EE_TRANS_CARDDIS_TO_CARDEMU
64 RTL8188E_TRANS_CARDEMU_TO_ACT 60 RTL8188EE_TRANS_CARDEMU_TO_ACT
65 RTL8188E_TRANS_END 61 RTL8188EE_TRANS_END
66}; 62};
67 63
68/*3Suspend Array*/ 64/*3Suspend Array*/
69struct wlan_pwr_cfg rtl8188e_suspend_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 65struct wlan_pwr_cfg rtl8188ee_suspend_flow[RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS
70 + RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 66 + RTL8188EE_TRANS_CARDEMU_TO_SUS_STEPS
71 + RTL8188E_TRANS_END_STEPS] = { 67 + RTL8188EE_TRANS_END_STEPS] = {
72 RTL8188E_TRANS_ACT_TO_CARDEMU 68 RTL8188EE_TRANS_ACT_TO_CARDEMU
73 RTL8188E_TRANS_CARDEMU_TO_SUS 69 RTL8188EE_TRANS_CARDEMU_TO_SUS
74 RTL8188E_TRANS_END 70 RTL8188EE_TRANS_END
75}; 71};
76 72
77/*3 Resume Array*/ 73/*3 Resume Array*/
78struct wlan_pwr_cfg rtl8188e_resume_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 74struct wlan_pwr_cfg rtl8188ee_resume_flow[RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS
79 + RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 75 + RTL8188EE_TRANS_CARDEMU_TO_SUS_STEPS
80 + RTL8188E_TRANS_END_STEPS] = { 76 + RTL8188EE_TRANS_END_STEPS] = {
81 RTL8188E_TRANS_SUS_TO_CARDEMU 77 RTL8188EE_TRANS_SUS_TO_CARDEMU
82 RTL8188E_TRANS_CARDEMU_TO_ACT 78 RTL8188EE_TRANS_CARDEMU_TO_ACT
83 RTL8188E_TRANS_END 79 RTL8188EE_TRANS_END
84}; 80};
85 81
86/*3HWPDN Array*/ 82/*3HWPDN Array*/
87struct wlan_pwr_cfg rtl8188e_hwpdn_flow[RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 83struct wlan_pwr_cfg rtl8188ee_hwpdn_flow[RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS
88 + RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 84 + RTL8188EE_TRANS_CARDEMU_TO_PDN_STEPS
89 + RTL8188E_TRANS_END_STEPS] = { 85 + RTL8188EE_TRANS_END_STEPS] = {
90 RTL8188E_TRANS_ACT_TO_CARDEMU 86 RTL8188EE_TRANS_ACT_TO_CARDEMU
91 RTL8188E_TRANS_CARDEMU_TO_PDN 87 RTL8188EE_TRANS_CARDEMU_TO_PDN
92 RTL8188E_TRANS_END 88 RTL8188EE_TRANS_END
93}; 89};
94 90
95/*3 Enter LPS */ 91/*3 Enter LPS */
96struct wlan_pwr_cfg rtl8188e_enter_lps_flow[RTL8188E_TRANS_ACT_TO_LPS_STEPS 92struct wlan_pwr_cfg rtl8188ee_enter_lps_flow[RTL8188EE_TRANS_ACT_TO_LPS_STEPS
97 + RTL8188E_TRANS_END_STEPS] = { 93 + RTL8188EE_TRANS_END_STEPS] = {
98 /*FW behavior*/ 94 /*FW behavior*/
99 RTL8188E_TRANS_ACT_TO_LPS 95 RTL8188EE_TRANS_ACT_TO_LPS
100 RTL8188E_TRANS_END 96 RTL8188EE_TRANS_END
101}; 97};
102 98
103/*3 Leave LPS */ 99/*3 Leave LPS */
104struct wlan_pwr_cfg rtl8188e_leave_lps_flow[RTL8188E_TRANS_LPS_TO_ACT_STEPS 100struct wlan_pwr_cfg rtl8188ee_leave_lps_flow[RTL8188EE_TRANS_LPS_TO_ACT_STEPS
105 + RTL8188E_TRANS_END_STEPS] = { 101 + RTL8188EE_TRANS_END_STEPS] = {
106 /*FW behavior*/ 102 /*FW behavior*/
107 RTL8188E_TRANS_LPS_TO_ACT 103 RTL8188EE_TRANS_LPS_TO_ACT
108 RTL8188E_TRANS_END 104 RTL8188EE_TRANS_END
109}; 105};
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.h b/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.h
index 32e135ab9a63..79103347d967 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseq.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,297 +26,286 @@
30#ifndef __RTL8723E_PWRSEQ_H__ 26#ifndef __RTL8723E_PWRSEQ_H__
31#define __RTL8723E_PWRSEQ_H__ 27#define __RTL8723E_PWRSEQ_H__
32 28
33/* 29#include "pwrseqcmd.h"
34 Check document WM-20110607-Paul-RTL8188E_Power_Architecture-R02.vsd 30/* Check document WM-20110607-Paul-RTL8188EE_Power_Architecture-R02.vsd
35 There are 6 HW Power States: 31 * There are 6 HW Power States:
36 0: POFF--Power Off 32 * 0: POFF--Power Off
37 1: PDN--Power Down 33 * 1: PDN--Power Down
38 2: CARDEMU--Card Emulation 34 * 2: CARDEMU--Card Emulation
39 3: ACT--Active Mode 35 * 3: ACT--Active Mode
40 4: LPS--Low Power State 36 * 4: LPS--Low Power State
41 5: SUS--Suspend 37 * 5: SUS--Suspend
42 38 *
43 The transision from different states are defined below 39 * The transision from different states are defined below
44 TRANS_CARDEMU_TO_ACT 40 * TRANS_CARDEMU_TO_ACT
45 TRANS_ACT_TO_CARDEMU 41 * TRANS_ACT_TO_CARDEMU
46 TRANS_CARDEMU_TO_SUS 42 * TRANS_CARDEMU_TO_SUS
47 TRANS_SUS_TO_CARDEMU 43 * TRANS_SUS_TO_CARDEMU
48 TRANS_CARDEMU_TO_PDN 44 * TRANS_CARDEMU_TO_PDN
49 TRANS_ACT_TO_LPS 45 * TRANS_ACT_TO_LPS
50 TRANS_LPS_TO_ACT 46 * TRANS_LPS_TO_ACT
51 47 *
52 TRANS_END 48 * TRANS_END
53 PWR SEQ Version: rtl8188e_PwrSeq_V09.h 49 * PWR SEQ Version: rtl8188ee_PwrSeq_V09.h
54*/ 50 */
55
56#define RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS 10
57#define RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS 10
58#define RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS 10
59#define RTL8188E_TRANS_SUS_TO_CARDEMU_STEPS 10
60#define RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS 10
61#define RTL8188E_TRANS_PDN_TO_CARDEMU_STEPS 10
62#define RTL8188E_TRANS_ACT_TO_LPS_STEPS 15
63#define RTL8188E_TRANS_LPS_TO_ACT_STEPS 15
64#define RTL8188E_TRANS_END_STEPS 1
65 51
52#define RTL8188EE_TRANS_CARDEMU_TO_ACT_STEPS 10
53#define RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS 10
54#define RTL8188EE_TRANS_CARDEMU_TO_SUS_STEPS 10
55#define RTL8188EE_TRANS_SUS_TO_CARDEMU_STEPS 10
56#define RTL8188EE_TRANS_CARDEMU_TO_PDN_STEPS 10
57#define RTL8188EE_TRANS_PDN_TO_CARDEMU_STEPS 10
58#define RTL8188EE_TRANS_ACT_TO_LPS_STEPS 15
59#define RTL8188EE_TRANS_LPS_TO_ACT_STEPS 15
60#define RTL8188EE_TRANS_END_STEPS 1
66 61
67#define RTL8188E_TRANS_CARDEMU_TO_ACT \ 62/* The following macros have the following format:
68 /* format */ \ 63 * { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value
69 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\ 64 * comments },
65 */
66#define RTL8188EE_TRANS_CARDEMU_TO_ACT \
70 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 67 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
71 /* wait till 0x04[17] = 1 power ready*/ \ 68 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1) \
72 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1)}, \ 69 /* wait till 0x04[17] = 1 power ready*/}, \
73 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 70 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
74 /* 0x02[1:0] = 0 reset BB*/ \ 71 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0)|BIT(1), 0 \
75 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0)|BIT(1), 0}, \ 72 /* 0x02[1:0] = 0 reset BB*/}, \
76 {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 73 {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
77 /*0x24[23] = 2b'01 schmit trigger */ \ 74 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7) \
78 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, \ 75 /*0x24[23] = 2b'01 schmit trigger */}, \
79 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 76 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
80 /* 0x04[15] = 0 disable HWPDN (control by DRV)*/ \ 77 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0 \
81 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, \ 78 /* 0x04[15] = 0 disable HWPDN (control by DRV)*/}, \
82 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 79 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
83 /*0x04[12:11] = 2b'00 disable WL suspend*/ \ 80 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4)|BIT(3), 0 \
84 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4)|BIT(3), 0}, \ 81 /*0x04[12:11] = 2b'00 disable WL suspend*/}, \
85 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 82 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
86 /*0x04[8] = 1 polling until return 0*/ \ 83 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0) \
87 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 84 /*0x04[8] = 1 polling until return 0*/}, \
88 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 85 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
89 /*wait till 0x04[8] = 0*/ \ 86 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0 \
90 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0}, \ 87 /*wait till 0x04[8] = 0*/}, \
91 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 88 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
92 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, /*LDO normal mode*/\ 89 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0 \
90 /*LDO normal mode*/}, \
93 {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 91 {0x0074, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
94 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, /*SDIO Driving*/\ 92 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4) \
93 /*SDIO Driving*/},
95 94
96#define RTL8188E_TRANS_ACT_TO_CARDEMU \ 95#define RTL8188EE_TRANS_ACT_TO_CARDEMU \
97 /* format */ \
98 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
99 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 96 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
100 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0},/*0x1F[7:0] = 0 turn off RF*/\ 97 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
98 /*0x1F[7:0] = 0 turn off RF*/}, \
101 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 99 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
102 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, /*LDO Sleep mode*/\ 100 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4) \
101 /*LDO Sleep mode*/}, \
103 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 102 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
104 /*0x04[9] = 1 turn off MAC by HW state machine*/ \ 103 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1) \
105 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \ 104 /*0x04[9] = 1 turn off MAC by HW state machine*/}, \
106 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 105 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
107 /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \ 106 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0 \
108 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0}, \ 107 /*wait till 0x04[9] = 0 polling until return 0 to disable*/},
109 108
110 109#define RTL8188EE_TRANS_CARDEMU_TO_SUS \
111#define RTL8188E_TRANS_CARDEMU_TO_SUS \
112 /* format */ \
113 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
114 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 110 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
115 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 111 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
116 /*0x04[12:11] = 2b'01enable WL suspend*/ \ 112 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3) \
117 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, \ 113 /*0x04[12:11] = 2b'01enable WL suspend*/}, \
118 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 114 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
119 /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/ \ 115 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)|BIT(4) \
120 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)|BIT(4)},\ 116 /*0x04[12:11] = 2b'11enable WL suspend for PCIe*/}, \
121 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 117 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
122 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 118 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
123 /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */\ 119 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, BIT(7) \
124 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, BIT(7)}, \ 120 /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */},\
125 {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 121 {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
126 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 122 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
127 /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ 123 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0 \
128 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \ 124 /*Clear SIC_EN register 0x40[12] = 1'b0 */}, \
129 {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 125 {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
130 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 126 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
131 /*Set USB suspend enable local register 0xfe10[4]= 1 */ \ 127 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4) \
132 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \ 128 /*Set USB suspend enable local register 0xfe10[4]=1 */}, \
133 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 129 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
134 /*Set SDIO suspend local register*/ \ 130 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0) \
135 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 131 /*Set SDIO suspend local register*/}, \
136 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 132 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
137 /*wait power state to suspend*/ \ 133 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0 \
138 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0}, 134 /*wait power state to suspend*/},
139 135
140#define RTL8188E_TRANS_SUS_TO_CARDEMU \ 136#define RTL8188EE_TRANS_SUS_TO_CARDEMU \
141 /* format */ \
142 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
143 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 137 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
144 /*Set SDIO suspend local register*/ \ 138 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0 \
145 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, \ 139 /*Set SDIO suspend local register*/}, \
146 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 140 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
147 /*wait power state to suspend*/ \ 141 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1) \
148 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, \ 142 /*wait power state to suspend*/}, \
149 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 143 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
150 /*0x04[12:11] = 2b'01enable WL suspend*/ \ 144 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(4), 0 \
151 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, 145 /*0x04[12:11] = 2b'01enable WL suspend*/},
152 146
153#define RTL8188E_TRANS_CARDEMU_TO_CARDDIS \ 147#define RTL8188EE_TRANS_CARDEMU_TO_CARDDIS \
154 /* format */ \
155 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
156 {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 148 {0x0026, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
157 /*0x24[23] = 2b'01 schmit trigger */ \ 149 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7) \
158 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, \ 150 /*0x24[23] = 2b'01 schmit trigger */}, \
159 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 151 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
160 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 152 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
161 /*0x04[12:11] = 2b'01 enable WL suspend*/ \ 153 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) \
162 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, \ 154 /*0x04[12:11] = 2b'01 enable WL suspend*/}, \
163 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 155 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
164 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 156 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
165 /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */\ 157 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
166 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, \ 158 /* 0x04[31:30] = 2b'10 enable enable bandgap mbias in suspend */},\
167 {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 159 {0x0041, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
168 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 160 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
169 /*Clear SIC_EN register 0x40[12] = 1'b0 */ \ 161 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0 \
170 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \ 162 /*Clear SIC_EN register 0x40[12] = 1'b0 */}, \
171 {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \ 163 {0xfe10, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \
172 /*Set USB suspend enable local register 0xfe10[4]= 1 */ \ 164 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4) \
173 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \ 165 /*Set USB suspend enable local register 0xfe10[4]=1 */}, \
174 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 166 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
175 /*Set SDIO suspend local register*/ \ 167 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0) \
176 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 168 /*Set SDIO suspend local register*/}, \
177 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 169 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
178 PWR_CMD_POLLING, BIT(1), 0}, /*wait power state to suspend*/ 170 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0 \
171 /*wait power state to suspend*/},
179 172
180#define RTL8188E_TRANS_CARDDIS_TO_CARDEMU \ 173#define RTL8188EE_TRANS_CARDDIS_TO_CARDEMU \
181 /* format */ \
182 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
183 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 174 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
184 PWR_BASEADDR_SDIO,\ 175 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0 \
185 PWR_CMD_WRITE, BIT(0), 0}, /*Set SDIO suspend local register*/ \ 176 /*Set SDIO suspend local register*/}, \
186 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 177 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
187 PWR_BASEADDR_SDIO,\ 178 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1) \
188 PWR_CMD_POLLING, BIT(1), BIT(1)}, /*wait power state to suspend*/\ 179 /*wait power state to suspend*/}, \
189 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 180 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
190 PWR_BASEADDR_MAC, \ 181 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0 \
191 PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, \ 182 /*0x04[12:11] = 2b'01enable WL suspend*/},
192 /*0x04[12:11] = 2b'01enable WL suspend*/
193
194 183
195#define RTL8188E_TRANS_CARDEMU_TO_PDN \ 184#define RTL8188EE_TRANS_CARDEMU_TO_PDN \
196 /* format */ \
197 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
198 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 185 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
199 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0},/* 0x04[16] = 0*/ \ 186 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0/* 0x04[16] = 0*/}, \
200 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 187 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
201 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)},/* 0x04[15] = 1*/ 188 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7) \
202 189 /* 0x04[15] = 1*/},
203 190
204#define RTL8188E_TRANS_PDN_TO_CARDEMU \ 191#define RTL8188EE_TRANS_PDN_TO_CARDEMU \
205 /* format */ \
206 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
207 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 192 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
208 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0},/* 0x04[15] = 0*/ 193 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0/* 0x04[15] = 0*/},
209 194
210 195#define RTL8188EE_TRANS_ACT_TO_LPS \
211#define RTL8188E_TRANS_ACT_TO_LPS \
212 /* format */ \
213 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
214 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 196 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
215 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \ 197 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x7F \
198 /*Tx Pause*/}, \
216 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 199 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
217 /*zero if no pkt is tx*/\ 200 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
218 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 201 /*Should be zero if no packet is transmitting*/}, \
219 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 202 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
220 /*Should be zero if no packet is transmitting*/ \ 203 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
221 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 204 /*Should be zero if no packet is transmitting*/}, \
222 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 205 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
223 /*Should be zero if no packet is transmitting*/ \ 206 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
224 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 207 /*Should be zero if no packet is transmitting*/}, \
225 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 208 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
226 /*Should be zero if no packet is transmitting*/ \ 209 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
227 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 210 /*Should be zero if no packet is transmitting*/}, \
228 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 211 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
229 /*CCK and OFDM are disabled, and clock are gated*/ \ 212 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0 \
230 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \ 213 /*CCK and OFDM are disabled,and clock are gated*/}, \
231 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 214 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
232 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\ 215 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US \
216 /*Delay 1us*/}, \
233 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 217 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
234 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \ 218 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3F \
219 /*Reset MAC TRX*/}, \
235 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 220 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
236 /*check if removed later*/ \ 221 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0 \
237 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \ 222 /*check if removed later*/}, \
238 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 223 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
239 /*Respond TxOK to scheduler*/ \ 224 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), BIT(5) \
240 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), BIT(5)}, \ 225 /*Respond TxOK to scheduler*/},
241 226
242 227
243#define RTL8188E_TRANS_LPS_TO_ACT \ 228#define RTL8188EE_TRANS_LPS_TO_ACT \
244 /* format */ \
245 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
246 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 229 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
247 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/ \ 230 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84 \
231 /*SDIO RPWM*/}, \
248 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \ 232 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \
249 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/ \ 233 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
234 /*USB RPWM*/}, \
250 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 235 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
251 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/ \ 236 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
237 /*PCIe RPWM*/}, \
252 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 238 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
253 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/ \ 239 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS \
240 /*Delay*/}, \
254 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 241 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
255 /*. 0x08[4] = 0 switch TSF to 40M*/ \ 242 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0 \
256 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \ 243 /*. 0x08[4] = 0 switch TSF to 40M*/}, \
257 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 244 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
258 /*Polling 0x109[7]= 0 TSF in 40M*/ \ 245 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(7), 0 \
259 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(7), 0}, \ 246 /*Polling 0x109[7]=0 TSF in 40M*/}, \
260 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 247 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
261 /*. 0x29[7:6] = 2b'00 enable BB clock*/ \ 248 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6)|BIT(7), 0 \
262 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6)|BIT(7), 0}, \ 249 /*. 0x29[7:6] = 2b'00 enable BB clock*/}, \
263 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 250 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
264 /*. 0x101[1] = 1*/\ 251 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1) \
265 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \ 252 /*. 0x101[1] = 1*/}, \
266 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 253 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
267 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\ 254 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
268 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \ 255 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/}, \
269 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 256 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
270 /*. 0x02[1:0] = 2b'11 enable BB macro*/\ 257 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1)|BIT(0), BIT(1)|BIT(0) \
271 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1)|BIT(0), BIT(1)|BIT(0)}, \ 258 /*. 0x02[1:0] = 2b'11 enable BB macro*/}, \
272 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\ 259 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
273 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/ 260 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
274 261 /*. 0x522 = 0*/},
275 262
276#define RTL8188E_TRANS_END \ 263#define RTL8188EE_TRANS_END \
277 /* format */ \
278 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
279 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\ 264 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
280 0, PWR_CMD_END, 0, 0} 265 0, PWR_CMD_END, 0, 0}
281 266
282extern struct wlan_pwr_cfg rtl8188e_power_on_flow 267extern struct wlan_pwr_cfg rtl8188ee_power_on_flow
283 [RTL8188E_TRANS_CARDEMU_TO_ACT_STEPS + 268 [RTL8188EE_TRANS_CARDEMU_TO_ACT_STEPS +
284 RTL8188E_TRANS_END_STEPS]; 269 RTL8188EE_TRANS_END_STEPS];
285extern struct wlan_pwr_cfg rtl8188e_radio_off_flow 270extern struct wlan_pwr_cfg rtl8188ee_radio_off_flow
286 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 271 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
287 RTL8188E_TRANS_END_STEPS]; 272 RTL8188EE_TRANS_END_STEPS];
288extern struct wlan_pwr_cfg rtl8188e_card_disable_flow 273extern struct wlan_pwr_cfg rtl8188ee_card_disable_flow
289 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 274 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
290 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + 275 RTL8188EE_TRANS_CARDEMU_TO_PDN_STEPS +
291 RTL8188E_TRANS_END_STEPS]; 276 RTL8188EE_TRANS_END_STEPS];
292extern struct wlan_pwr_cfg rtl8188e_card_enable_flow 277extern struct wlan_pwr_cfg rtl8188ee_card_enable_flow
293 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 278 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
294 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + 279 RTL8188EE_TRANS_CARDEMU_TO_PDN_STEPS +
295 RTL8188E_TRANS_END_STEPS]; 280 RTL8188EE_TRANS_END_STEPS];
296extern struct wlan_pwr_cfg rtl8188e_suspend_flow 281extern struct wlan_pwr_cfg rtl8188ee_suspend_flow
297 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 282 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
298 RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS + 283 RTL8188EE_TRANS_CARDEMU_TO_SUS_STEPS +
299 RTL8188E_TRANS_END_STEPS]; 284 RTL8188EE_TRANS_END_STEPS];
300extern struct wlan_pwr_cfg rtl8188e_resume_flow 285extern struct wlan_pwr_cfg rtl8188ee_resume_flow
301 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 286 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
302 RTL8188E_TRANS_CARDEMU_TO_SUS_STEPS + 287 RTL8188EE_TRANS_CARDEMU_TO_SUS_STEPS +
303 RTL8188E_TRANS_END_STEPS]; 288 RTL8188EE_TRANS_END_STEPS];
304extern struct wlan_pwr_cfg rtl8188e_hwpdn_flow 289extern struct wlan_pwr_cfg rtl8188ee_hwpdn_flow
305 [RTL8188E_TRANS_ACT_TO_CARDEMU_STEPS + 290 [RTL8188EE_TRANS_ACT_TO_CARDEMU_STEPS +
306 RTL8188E_TRANS_CARDEMU_TO_PDN_STEPS + 291 RTL8188EE_TRANS_CARDEMU_TO_PDN_STEPS +
307 RTL8188E_TRANS_END_STEPS]; 292 RTL8188EE_TRANS_END_STEPS];
308extern struct wlan_pwr_cfg rtl8188e_enter_lps_flow 293extern struct wlan_pwr_cfg rtl8188ee_enter_lps_flow
309 [RTL8188E_TRANS_ACT_TO_LPS_STEPS + 294 [RTL8188EE_TRANS_ACT_TO_LPS_STEPS +
310 RTL8188E_TRANS_END_STEPS]; 295 RTL8188EE_TRANS_END_STEPS];
311extern struct wlan_pwr_cfg rtl8188e_leave_lps_flow 296extern struct wlan_pwr_cfg rtl8188ee_leave_lps_flow
312 [RTL8188E_TRANS_LPS_TO_ACT_STEPS + 297 [RTL8188EE_TRANS_LPS_TO_ACT_STEPS +
313 RTL8188E_TRANS_END_STEPS]; 298 RTL8188EE_TRANS_END_STEPS];
314 299
315/* RTL8723 Power Configuration CMDs for PCIe interface */ 300/* RTL8723 Power Configuration CMDs for PCIe interface */
316#define Rtl8188E_NIC_PWR_ON_FLOW rtl8188e_power_on_flow 301#define RTL8188EE_NIC_PWR_ON_FLOW rtl8188ee_power_on_flow
317#define Rtl8188E_NIC_RF_OFF_FLOW rtl8188e_radio_off_flow 302#define RTL8188EE_NIC_RF_OFF_FLOW rtl8188ee_radio_off_flow
318#define Rtl8188E_NIC_DISABLE_FLOW rtl8188e_card_disable_flow 303#define RTL8188EE_NIC_DISABLE_FLOW rtl8188ee_card_disable_flow
319#define Rtl8188E_NIC_ENABLE_FLOW rtl8188e_card_enable_flow 304#define RTL8188EE_NIC_ENABLE_FLOW rtl8188ee_card_enable_flow
320#define Rtl8188E_NIC_SUSPEND_FLOW rtl8188e_suspend_flow 305#define RTL8188EE_NIC_SUSPEND_FLOW rtl8188ee_suspend_flow
321#define Rtl8188E_NIC_RESUME_FLOW rtl8188e_resume_flow 306#define RTL8188EE_NIC_RESUME_FLOW rtl8188ee_resume_flow
322#define Rtl8188E_NIC_PDN_FLOW rtl8188e_hwpdn_flow 307#define RTL8188EE_NIC_PDN_FLOW rtl8188ee_hwpdn_flow
323#define Rtl8188E_NIC_LPS_ENTER_FLOW rtl8188e_enter_lps_flow 308#define RTL8188EE_NIC_LPS_ENTER_FLOW rtl8188ee_enter_lps_flow
324#define Rtl8188E_NIC_LPS_LEAVE_FLOW rtl8188e_leave_lps_flow 309#define RTL8188EE_NIC_LPS_LEAVE_FLOW rtl8188ee_leave_lps_flow
325 310
326#endif 311#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.c b/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.c
deleted file mode 100644
index 0f9314205526..000000000000
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.c
+++ /dev/null
@@ -1,139 +0,0 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
20 *
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
25 *
26 * Larry Finger <Larry.Finger@lwfinger.net>
27 *
28 *****************************************************************************/
29
30#include "pwrseq.h"
31
32
33/* Description:
34 * This routine deal with the Power Configuration CMDs
35 * parsing for RTL8723/RTL8188E Series IC.
36 * Assumption:
37 * We should follow specific format which was released from HW SD.
38 *
39 * 2011.07.07, added by Roger.
40 */
41
42bool rtl88_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
43 u8 fab_version, u8 interface_type,
44 struct wlan_pwr_cfg pwrcfgcmd[])
45{
46 struct wlan_pwr_cfg cmd = {0};
47 bool polling_bit = false;
48 u32 ary_idx = 0;
49 u8 val = 0;
50 u32 offset = 0;
51 u32 polling_count = 0;
52 u32 max_polling_cnt = 5000;
53
54 do {
55 cmd = pwrcfgcmd[ary_idx];
56 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
57 "rtl88_hal_pwrseqcmdparsing(): offset(%#x), cut_msk(%#x), fab_msk(%#x),"
58 "interface_msk(%#x), base(%#x), cmd(%#x), msk(%#x), val(%#x)\n",
59 GET_PWR_CFG_OFFSET(cmd),
60 GET_PWR_CFG_CUT_MASK(cmd),
61 GET_PWR_CFG_FAB_MASK(cmd),
62 GET_PWR_CFG_INTF_MASK(cmd),
63 GET_PWR_CFG_BASE(cmd),
64 GET_PWR_CFG_CMD(cmd),
65 GET_PWR_CFG_MASK(cmd),
66 GET_PWR_CFG_VALUE(cmd));
67
68 if ((GET_PWR_CFG_FAB_MASK(cmd) & fab_version) &&
69 (GET_PWR_CFG_CUT_MASK(cmd) & cut_version) &&
70 (GET_PWR_CFG_INTF_MASK(cmd) & interface_type)) {
71 switch (GET_PWR_CFG_CMD(cmd)) {
72 case PWR_CMD_READ:
73 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
74 "rtl88_hal_pwrseqcmdparsing(): PWR_CMD_READ\n");
75 break;
76 case PWR_CMD_WRITE: {
77 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
78 "rtl88_hal_pwrseqcmdparsing(): PWR_CMD_WRITE\n");
79 offset = GET_PWR_CFG_OFFSET(cmd);
80
81 /*Read the val from system register*/
82 val = rtl_read_byte(rtlpriv, offset);
83 val &= (~(GET_PWR_CFG_MASK(cmd)));
84 val |= (GET_PWR_CFG_VALUE(cmd) &
85 GET_PWR_CFG_MASK(cmd));
86
87 /*Write the val back to sytem register*/
88 rtl_write_byte(rtlpriv, offset, val);
89 }
90 break;
91 case PWR_CMD_POLLING:
92 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
93 "rtl88_hal_pwrseqcmdparsing(): PWR_CMD_POLLING\n");
94 polling_bit = false;
95 offset = GET_PWR_CFG_OFFSET(cmd);
96
97 do {
98 val = rtl_read_byte(rtlpriv, offset);
99
100 val = val & GET_PWR_CFG_MASK(cmd);
101 if (val == (GET_PWR_CFG_VALUE(cmd) &
102 GET_PWR_CFG_MASK(cmd)))
103 polling_bit = true;
104 else
105 udelay(10);
106
107 if (polling_count++ > max_polling_cnt) {
108 RT_TRACE(rtlpriv, COMP_INIT,
109 DBG_LOUD,
110 "polling fail in pwrseqcmd\n");
111 return false;
112 }
113 } while (!polling_bit);
114
115 break;
116 case PWR_CMD_DELAY:
117 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
118 "rtl88_hal_pwrseqcmdparsing(): PWR_CMD_DELAY\n");
119 if (GET_PWR_CFG_VALUE(cmd) == PWRSEQ_DELAY_US)
120 udelay(GET_PWR_CFG_OFFSET(cmd));
121 else
122 mdelay(GET_PWR_CFG_OFFSET(cmd));
123 break;
124 case PWR_CMD_END:
125 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
126 "rtl88_hal_pwrseqcmdparsing(): PWR_CMD_END\n");
127 return true;
128 default:
129 RT_ASSERT(false,
130 "rtl88_hal_pwrseqcmdparsing(): Unknown CMD!!\n");
131 break;
132 }
133 }
134
135 ary_idx++;
136 } while (1);
137
138 return true;
139}
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.h b/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.h
deleted file mode 100644
index d9ae280bb1a2..000000000000
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/pwrseqcmd.h
+++ /dev/null
@@ -1,97 +0,0 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2013 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
20 *
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
25 *
26 * Larry Finger <Larry.Finger@lwfinger.net>
27 *
28 *****************************************************************************/
29
30#ifndef __RTL8723E_PWRSEQCMD_H__
31#define __RTL8723E_PWRSEQCMD_H__
32
33#include "../wifi.h"
34/*---------------------------------------------*/
35/* The value of cmd: 4 bits */
36/*---------------------------------------------*/
37#define PWR_CMD_READ 0x00
38#define PWR_CMD_WRITE 0x01
39#define PWR_CMD_POLLING 0x02
40#define PWR_CMD_DELAY 0x03
41#define PWR_CMD_END 0x04
42
43/* define the base address of each block */
44#define PWR_BASEADDR_MAC 0x00
45#define PWR_BASEADDR_USB 0x01
46#define PWR_BASEADDR_PCIE 0x02
47#define PWR_BASEADDR_SDIO 0x03
48
49#define PWR_INTF_SDIO_MSK BIT(0)
50#define PWR_INTF_USB_MSK BIT(1)
51#define PWR_INTF_PCI_MSK BIT(2)
52#define PWR_INTF_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3))
53
54#define PWR_FAB_TSMC_MSK BIT(0)
55#define PWR_FAB_UMC_MSK BIT(1)
56#define PWR_FAB_ALL_MSK (BIT(0)|BIT(1)|BIT(2)|BIT(3))
57
58#define PWR_CUT_TESTCHIP_MSK BIT(0)
59#define PWR_CUT_A_MSK BIT(1)
60#define PWR_CUT_B_MSK BIT(2)
61#define PWR_CUT_C_MSK BIT(3)
62#define PWR_CUT_D_MSK BIT(4)
63#define PWR_CUT_E_MSK BIT(5)
64#define PWR_CUT_F_MSK BIT(6)
65#define PWR_CUT_G_MSK BIT(7)
66#define PWR_CUT_ALL_MSK 0xFF
67
68enum pwrseq_delay_unit {
69 PWRSEQ_DELAY_US,
70 PWRSEQ_DELAY_MS,
71};
72
73struct wlan_pwr_cfg {
74 u16 offset;
75 u8 cut_msk;
76 u8 fab_msk:4;
77 u8 interface_msk:4;
78 u8 base:4;
79 u8 cmd:4;
80 u8 msk;
81 u8 value;
82};
83
84#define GET_PWR_CFG_OFFSET(__PWR) (__PWR.offset)
85#define GET_PWR_CFG_CUT_MASK(__PWR) (__PWR.cut_msk)
86#define GET_PWR_CFG_FAB_MASK(__PWR) (__PWR.fab_msk)
87#define GET_PWR_CFG_INTF_MASK(__PWR) (__PWR.interface_msk)
88#define GET_PWR_CFG_BASE(__PWR) (__PWR.base)
89#define GET_PWR_CFG_CMD(__PWR) (__PWR.cmd)
90#define GET_PWR_CFG_MASK(__PWR) (__PWR.msk)
91#define GET_PWR_CFG_VALUE(__PWR) (__PWR.value)
92
93bool rtl88_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
94 u8 fab_version, u8 interface_type,
95 struct wlan_pwr_cfg pwrcfgcmd[]);
96
97#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/reg.h b/drivers/net/wireless/rtlwifi/rtl8188ee/reg.h
index cd7e7a527133..15400ee6c04b 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/reg.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/reg.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,62 +26,60 @@
30#ifndef __RTL92C_REG_H__ 26#ifndef __RTL92C_REG_H__
31#define __RTL92C_REG_H__ 27#define __RTL92C_REG_H__
32 28
33#define TXPKT_BUF_SELECT 0x69 29#define TXPKT_BUF_SELECT 0x69
34#define RXPKT_BUF_SELECT 0xA5 30#define RXPKT_BUF_SELECT 0xA5
35#define DISABLE_TRXPKT_BUF_ACCESS 0x0 31#define DISABLE_TRXPKT_BUF_ACCESS 0x0
36 32
37#define REG_SYS_ISO_CTRL 0x0000 33#define REG_SYS_ISO_CTRL 0x0000
38#define REG_SYS_FUNC_EN 0x0002 34#define REG_SYS_FUNC_EN 0x0002
39#define REG_APS_FSMCO 0x0004 35#define REG_APS_FSMCO 0x0004
40#define REG_SYS_CLKR 0x0008 36#define REG_SYS_CLKR 0x0008
41#define REG_9346CR 0x000A 37#define REG_9346CR 0x000A
42#define REG_EE_VPD 0x000C 38#define REG_EE_VPD 0x000C
43#define REG_AFE_MISC 0x0010 39#define REG_AFE_MISC 0x0010
44#define REG_SPS0_CTRL 0x0011 40#define REG_SPS0_CTRL 0x0011
45#define REG_SPS_OCP_CFG 0x0018 41#define REG_SPS_OCP_CFG 0x0018
46#define REG_RSV_CTRL 0x001C 42#define REG_RSV_CTRL 0x001C
47#define REG_RF_CTRL 0x001F 43#define REG_RF_CTRL 0x001F
48#define REG_LDOA15_CTRL 0x0020 44#define REG_LDOA15_CTRL 0x0020
49#define REG_LDOV12D_CTRL 0x0021 45#define REG_LDOV12D_CTRL 0x0021
50#define REG_LDOHCI12_CTRL 0x0022 46#define REG_LDOHCI12_CTRL 0x0022
51#define REG_LPLDO_CTRL 0x0023 47#define REG_LPLDO_CTRL 0x0023
52#define REG_AFE_XTAL_CTRL 0x0024 48#define REG_AFE_XTAL_CTRL 0x0024
53#define REG_AFE_LDO_CTRL 0x0027 /* 1.5v for 8188EE test 49/* 1.5v for 8188EE test chip, 1.4v for MP chip */
54 * chip, 1.4v for MP chip 50#define REG_AFE_LDO_CTRL 0x0027
55 */
56#define REG_AFE_PLL_CTRL 0x0028 51#define REG_AFE_PLL_CTRL 0x0028
57#define REG_EFUSE_CTRL 0x0030 52#define REG_EFUSE_CTRL 0x0030
58#define REG_EFUSE_TEST 0x0034 53#define REG_EFUSE_TEST 0x0034
59#define REG_PWR_DATA 0x0038 54#define REG_PWR_DATA 0x0038
60#define REG_CAL_TIMER 0x003C 55#define REG_CAL_TIMER 0x003C
61#define REG_ACLK_MON 0x003E 56#define REG_ACLK_MON 0x003E
62#define REG_GPIO_MUXCFG 0x0040 57#define REG_GPIO_MUXCFG 0x0040
63#define REG_GPIO_IO_SEL 0x0042 58#define REG_GPIO_IO_SEL 0x0042
64#define REG_MAC_PINMUX_CFG 0x0043 59#define REG_MAC_PINMUX_CFG 0x0043
65#define REG_GPIO_PIN_CTRL 0x0044 60#define REG_GPIO_PIN_CTRL 0x0044
66#define REG_GPIO_INTM 0x0048 61#define REG_GPIO_INTM 0x0048
67#define REG_LEDCFG0 0x004C 62#define REG_LEDCFG0 0x004C
68#define REG_LEDCFG1 0x004D 63#define REG_LEDCFG1 0x004D
69#define REG_LEDCFG2 0x004E 64#define REG_LEDCFG2 0x004E
70#define REG_LEDCFG3 0x004F 65#define REG_LEDCFG3 0x004F
71#define REG_FSIMR 0x0050 66#define REG_FSIMR 0x0050
72#define REG_FSISR 0x0054 67#define REG_FSISR 0x0054
73#define REG_HSIMR 0x0058 68#define REG_HSIMR 0x0058
74#define REG_HSISR 0x005c 69#define REG_HSISR 0x005c
75#define REG_GPIO_PIN_CTRL_2 0x0060 70#define REG_GPIO_PIN_CTRL_2 0x0060
76#define REG_GPIO_IO_SEL_2 0x0062 71#define REG_GPIO_IO_SEL_2 0x0062
77#define REG_GPIO_OUTPUT 0x006c 72#define REG_GPIO_OUTPUT 0x006c
78#define REG_AFE_XTAL_CTRL_EXT 0x0078 73#define REG_AFE_XTAL_CTRL_EXT 0x0078
79#define REG_XCK_OUT_CTRL 0x007c 74#define REG_XCK_OUT_CTRL 0x007c
80#define REG_MCUFWDL 0x0080 75#define REG_MCUFWDL 0x0080
81#define REG_WOL_EVENT 0x0081 76#define REG_WOL_EVENT 0x0081
82#define REG_MCUTSTCFG 0x0084 77#define REG_MCUTSTCFG 0x0084
83 78
84 79#define REG_HIMR 0x00B0
85#define REG_HIMR 0x00B0 80#define REG_HISR 0x00B4
86#define REG_HISR 0x00B4 81#define REG_HIMRE 0x00B8
87#define REG_HIMRE 0x00B8 82#define REG_HISRE 0x00BC
88#define REG_HISRE 0x00BC
89 83
90#define REG_EFUSE_ACCESS 0x00CF 84#define REG_EFUSE_ACCESS 0x00CF
91 85
@@ -96,23 +90,23 @@
96#define REG_PCIE_MIO_INTF 0x00E4 90#define REG_PCIE_MIO_INTF 0x00E4
97#define REG_PCIE_MIO_INTD 0x00E8 91#define REG_PCIE_MIO_INTD 0x00E8
98#define REG_HPON_FSM 0x00EC 92#define REG_HPON_FSM 0x00EC
99#define REG_SYS_CFG 0x00F0 93#define REG_SYS_CFG 0x00F0
100 94
101#define REG_CR 0x0100 95#define REG_CR 0x0100
102#define REG_PBP 0x0104 96#define REG_PBP 0x0104
103#define REG_PKT_BUFF_ACCESS_CTRL 0x0106 97#define REG_PKT_BUFF_ACCESS_CTRL 0x0106
104#define REG_TRXDMA_CTRL 0x010C 98#define REG_TRXDMA_CTRL 0x010C
105#define REG_TRXFF_BNDY 0x0114 99#define REG_TRXFF_BNDY 0x0114
106#define REG_TRXFF_STATUS 0x0118 100#define REG_TRXFF_STATUS 0x0118
107#define REG_RXFF_PTR 0x011C 101#define REG_RXFF_PTR 0x011C
108 102
109#define REG_CPWM 0x012F 103#define REG_CPWM 0x012F
110#define REG_FWIMR 0x0130 104#define REG_FWIMR 0x0130
111#define REG_FWISR 0x0134 105#define REG_FWISR 0x0134
112#define REG_PKTBUF_DBG_CTRL 0x0140 106#define REG_PKTBUF_DBG_CTRL 0x0140
113#define REG_PKTBUF_DBG_DATA_L 0x0144 107#define REG_PKTBUF_DBG_DATA_L 0x0144
114#define REG_PKTBUF_DBG_DATA_H 0x0148 108#define REG_PKTBUF_DBG_DATA_H 0x0148
115#define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2) 109#define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2)
116 110
117#define REG_TC0_CTRL 0x0150 111#define REG_TC0_CTRL 0x0150
118#define REG_TC1_CTRL 0x0154 112#define REG_TC1_CTRL 0x0154
@@ -123,13 +117,13 @@
123#define REG_MBIST_START 0x0174 117#define REG_MBIST_START 0x0174
124#define REG_MBIST_DONE 0x0178 118#define REG_MBIST_DONE 0x0178
125#define REG_MBIST_FAIL 0x017C 119#define REG_MBIST_FAIL 0x017C
126#define REG_32K_CTRL 0x0194 120#define REG_32K_CTRL 0x0194
127#define REG_C2HEVT_MSG_NORMAL 0x01A0 121#define REG_C2HEVT_MSG_NORMAL 0x01A0
128#define REG_C2HEVT_CLEAR 0x01AF 122#define REG_C2HEVT_CLEAR 0x01AF
129#define REG_C2HEVT_MSG_TEST 0x01B8 123#define REG_C2HEVT_MSG_TEST 0x01B8
130#define REG_MCUTST_1 0x01c0 124#define REG_MCUTST_1 0x01c0
131#define REG_FMETHR 0x01C8 125#define REG_FMETHR 0x01C8
132#define REG_HMETFR 0x01CC 126#define REG_HMETFR 0x01CC
133#define REG_HMEBOX_0 0x01D0 127#define REG_HMEBOX_0 0x01D0
134#define REG_HMEBOX_1 0x01D4 128#define REG_HMEBOX_1 0x01D4
135#define REG_HMEBOX_2 0x01D8 129#define REG_HMEBOX_2 0x01D8
@@ -144,36 +138,37 @@
144#define REG_HMEBOX_EXT_2 0x01F8 138#define REG_HMEBOX_EXT_2 0x01F8
145#define REG_HMEBOX_EXT_3 0x01FC 139#define REG_HMEBOX_EXT_3 0x01FC
146 140
147#define REG_RQPN 0x0200 141#define REG_RQPN 0x0200
148#define REG_FIFOPAGE 0x0204 142#define REG_FIFOPAGE 0x0204
149#define REG_TDECTRL 0x0208 143#define REG_TDECTRL 0x0208
150#define REG_TXDMA_OFFSET_CHK 0x020C 144#define REG_TXDMA_OFFSET_CHK 0x020C
151#define REG_TXDMA_STATUS 0x0210 145#define REG_TXDMA_STATUS 0x0210
152#define REG_RQPN_NPQ 0x0214 146#define REG_RQPN_NPQ 0x0214
153 147
154#define REG_RXDMA_AGG_PG_TH 0x0280 148#define REG_RXDMA_AGG_PG_TH 0x0280
155#define REG_FW_UPD_RDPTR 0x0284 /* FW shall update this 149/* FW shall update this register before
156 * register before FW * write 150 * FW write RXPKT_RELEASE_POLL to 1
157 * RXPKT_RELEASE_POLL to 1 151 */
158 */ 152#define REG_FW_UPD_RDPTR 0x0284
159#define REG_RXDMA_CONTROL 0x0286 /* Control the RX DMA.*/ 153/* Control the RX DMA.*/
160#define REG_RXPKT_NUM 0x0287 /* The number of packets 154#define REG_RXDMA_CONTROL 0x0286
161 * in RXPKTBUF. 155/* The number of packets in RXPKTBUF. */
162 */ 156#define REG_RXPKT_NUM 0x0287
157
163#define REG_PCIE_CTRL_REG 0x0300 158#define REG_PCIE_CTRL_REG 0x0300
164#define REG_INT_MIG 0x0304 159#define REG_INT_MIG 0x0304
165#define REG_BCNQ_DESA 0x0308 160#define REG_BCNQ_DESA 0x0308
166#define REG_HQ_DESA 0x0310 161#define REG_HQ_DESA 0x0310
167#define REG_MGQ_DESA 0x0318 162#define REG_MGQ_DESA 0x0318
168#define REG_VOQ_DESA 0x0320 163#define REG_VOQ_DESA 0x0320
169#define REG_VIQ_DESA 0x0328 164#define REG_VIQ_DESA 0x0328
170#define REG_BEQ_DESA 0x0330 165#define REG_BEQ_DESA 0x0330
171#define REG_BKQ_DESA 0x0338 166#define REG_BKQ_DESA 0x0338
172#define REG_RX_DESA 0x0340 167#define REG_RX_DESA 0x0340
173 168
174#define REG_DBI 0x0348 169#define REG_DBI 0x0348
175#define REG_MDIO 0x0354 170#define REG_MDIO 0x0354
176#define REG_DBG_SEL 0x0360 171#define REG_DBG_SEL 0x0360
177#define REG_PCIE_HRPWM 0x0361 172#define REG_PCIE_HRPWM 0x0361
178#define REG_PCIE_HCPWM 0x0363 173#define REG_PCIE_HCPWM 0x0363
179#define REG_UART_CTRL 0x0364 174#define REG_UART_CTRL 0x0364
@@ -181,7 +176,6 @@
181#define REG_UART_TX_DESA 0x0370 176#define REG_UART_TX_DESA 0x0370
182#define REG_UART_RX_DESA 0x0378 177#define REG_UART_RX_DESA 0x0378
183 178
184
185#define REG_HDAQ_DESA_NODEF 0x0000 179#define REG_HDAQ_DESA_NODEF 0x0000
186#define REG_CMDQ_DESA_NODEF 0x0000 180#define REG_CMDQ_DESA_NODEF 0x0000
187 181
@@ -191,33 +185,32 @@
191#define REG_BKQ_INFORMATION 0x040C 185#define REG_BKQ_INFORMATION 0x040C
192#define REG_MGQ_INFORMATION 0x0410 186#define REG_MGQ_INFORMATION 0x0410
193#define REG_HGQ_INFORMATION 0x0414 187#define REG_HGQ_INFORMATION 0x0414
194#define REG_BCNQ_INFORMATION 0x0418 188#define REG_BCNQ_INFORMATION 0x0418
195#define REG_TXPKT_EMPTY 0x041A 189#define REG_TXPKT_EMPTY 0x041A
196 190
197 191#define REG_CPU_MGQ_INFORMATION 0x041C
198#define REG_CPU_MGQ_INFORMATION 0x041C
199#define REG_FWHW_TXQ_CTRL 0x0420 192#define REG_FWHW_TXQ_CTRL 0x0420
200#define REG_HWSEQ_CTRL 0x0423 193#define REG_HWSEQ_CTRL 0x0423
201#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 194#define REG_TXPKTBUF_BCNQ_BDNY 0x0424
202#define REG_TXPKTBUF_MGQ_BDNY 0x0425 195#define REG_TXPKTBUF_MGQ_BDNY 0x0425
203#define REG_MULTI_BCNQ_EN 0x0426 196#define REG_MULTI_BCNQ_EN 0x0426
204#define REG_MULTI_BCNQ_OFFSET 0x0427 197#define REG_MULTI_BCNQ_OFFSET 0x0427
205#define REG_SPEC_SIFS 0x0428 198#define REG_SPEC_SIFS 0x0428
206#define REG_RL 0x042A 199#define REG_RL 0x042A
207#define REG_DARFRC 0x0430 200#define REG_DARFRC 0x0430
208#define REG_RARFRC 0x0438 201#define REG_RARFRC 0x0438
209#define REG_RRSR 0x0440 202#define REG_RRSR 0x0440
210#define REG_ARFR0 0x0444 203#define REG_ARFR0 0x0444
211#define REG_ARFR1 0x0448 204#define REG_ARFR1 0x0448
212#define REG_ARFR2 0x044C 205#define REG_ARFR2 0x044C
213#define REG_ARFR3 0x0450 206#define REG_ARFR3 0x0450
214#define REG_AGGLEN_LMT 0x0458 207#define REG_AGGLEN_LMT 0x0458
215#define REG_AMPDU_MIN_SPACE 0x045C 208#define REG_AMPDU_MIN_SPACE 0x045C
216#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D 209#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D
217#define REG_FAST_EDCA_CTRL 0x0460 210#define REG_FAST_EDCA_CTRL 0x0460
218#define REG_RD_RESP_PKT_TH 0x0463 211#define REG_RD_RESP_PKT_TH 0x0463
219#define REG_INIRTS_RATE_SEL 0x0480 212#define REG_INIRTS_RATE_SEL 0x0480
220#define REG_INIDATA_RATE_SEL 0x0484 213#define REG_INIDATA_RATE_SEL 0x0484
221#define REG_POWER_STATUS 0x04A4 214#define REG_POWER_STATUS 0x04A4
222#define REG_POWER_STAGE1 0x04B4 215#define REG_POWER_STAGE1 0x04B4
223#define REG_POWER_STAGE2 0x04B8 216#define REG_POWER_STAGE2 0x04B8
@@ -225,32 +218,32 @@
225#define REG_STBC_SETTING 0x04C4 218#define REG_STBC_SETTING 0x04C4
226#define REG_PROT_MODE_CTRL 0x04C8 219#define REG_PROT_MODE_CTRL 0x04C8
227#define REG_BAR_MODE_CTRL 0x04CC 220#define REG_BAR_MODE_CTRL 0x04CC
228#define REG_RA_TRY_RATE_AGG_LMT 0x04CF 221#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
229#define REG_EARLY_MODE_CONTROL 0x04D0 222#define REG_EARLY_MODE_CONTROL 0x04D0
230#define REG_NQOS_SEQ 0x04DC 223#define REG_NQOS_SEQ 0x04DC
231#define REG_QOS_SEQ 0x04DE 224#define REG_QOS_SEQ 0x04DE
232#define REG_NEED_CPU_HANDLE 0x04E0 225#define REG_NEED_CPU_HANDLE 0x04E0
233#define REG_PKT_LOSE_RPT 0x04E1 226#define REG_PKT_LOSE_RPT 0x04E1
234#define REG_PTCL_ERR_STATUS 0x04E2 227#define REG_PTCL_ERR_STATUS 0x04E2
235#define REG_TX_RPT_CTRL 0x04EC 228#define REG_TX_RPT_CTRL 0x04EC
236#define REG_TX_RPT_TIME 0x04F0 229#define REG_TX_RPT_TIME 0x04F0
237#define REG_DUMMY 0x04FC 230#define REG_DUMMY 0x04FC
238 231
239#define REG_EDCA_VO_PARAM 0x0500 232#define REG_EDCA_VO_PARAM 0x0500
240#define REG_EDCA_VI_PARAM 0x0504 233#define REG_EDCA_VI_PARAM 0x0504
241#define REG_EDCA_BE_PARAM 0x0508 234#define REG_EDCA_BE_PARAM 0x0508
242#define REG_EDCA_BK_PARAM 0x050C 235#define REG_EDCA_BK_PARAM 0x050C
243#define REG_BCNTCFG 0x0510 236#define REG_BCNTCFG 0x0510
244#define REG_PIFS 0x0512 237#define REG_PIFS 0x0512
245#define REG_RDG_PIFS 0x0513 238#define REG_RDG_PIFS 0x0513
246#define REG_SIFS_CTX 0x0514 239#define REG_SIFS_CTX 0x0514
247#define REG_SIFS_TRX 0x0516 240#define REG_SIFS_TRX 0x0516
248#define REG_AGGR_BREAK_TIME 0x051A 241#define REG_AGGR_BREAK_TIME 0x051A
249#define REG_SLOT 0x051B 242#define REG_SLOT 0x051B
250#define REG_TX_PTCL_CTRL 0x0520 243#define REG_TX_PTCL_CTRL 0x0520
251#define REG_TXPAUSE 0x0522 244#define REG_TXPAUSE 0x0522
252#define REG_DIS_TXREQ_CLR 0x0523 245#define REG_DIS_TXREQ_CLR 0x0523
253#define REG_RD_CTRL 0x0524 246#define REG_RD_CTRL 0x0524
254#define REG_TBTT_PROHIBIT 0x0540 247#define REG_TBTT_PROHIBIT 0x0540
255#define REG_RD_NAV_NXT 0x0544 248#define REG_RD_NAV_NXT 0x0544
256#define REG_NAV_PROT_LEN 0x0546 249#define REG_NAV_PROT_LEN 0x0546
@@ -259,21 +252,21 @@
259#define REG_MBID_NUM 0x0552 252#define REG_MBID_NUM 0x0552
260#define REG_DUAL_TSF_RST 0x0553 253#define REG_DUAL_TSF_RST 0x0553
261#define REG_BCN_INTERVAL 0x0554 254#define REG_BCN_INTERVAL 0x0554
262#define REG_MBSSID_BCN_SPACE 0x0554 255#define REG_MBSSID_BCN_SPACE 0x0554
263#define REG_DRVERLYINT 0x0558 256#define REG_DRVERLYINT 0x0558
264#define REG_BCNDMATIM 0x0559 257#define REG_BCNDMATIM 0x0559
265#define REG_ATIMWND 0x055A 258#define REG_ATIMWND 0x055A
266#define REG_BCN_MAX_ERR 0x055D 259#define REG_BCN_MAX_ERR 0x055D
267#define REG_RXTSF_OFFSET_CCK 0x055E 260#define REG_RXTSF_OFFSET_CCK 0x055E
268#define REG_RXTSF_OFFSET_OFDM 0x055F 261#define REG_RXTSF_OFFSET_OFDM 0x055F
269#define REG_TSFTR 0x0560 262#define REG_TSFTR 0x0560
270#define REG_INIT_TSFTR 0x0564 263#define REG_INIT_TSFTR 0x0564
271#define REG_PSTIMER 0x0580 264#define REG_PSTIMER 0x0580
272#define REG_TIMER0 0x0584 265#define REG_TIMER0 0x0584
273#define REG_TIMER1 0x0588 266#define REG_TIMER1 0x0588
274#define REG_ACMHWCTRL 0x05C0 267#define REG_ACMHWCTRL 0x05C0
275#define REG_ACMRSTCTRL 0x05C1 268#define REG_ACMRSTCTRL 0x05C1
276#define REG_ACMAVG 0x05C2 269#define REG_ACMAVG 0x05C2
277#define REG_VO_ADMTIME 0x05C4 270#define REG_VO_ADMTIME 0x05C4
278#define REG_VI_ADMTIME 0x05C6 271#define REG_VI_ADMTIME 0x05C6
279#define REG_BE_ADMTIME 0x05C8 272#define REG_BE_ADMTIME 0x05C8
@@ -282,38 +275,38 @@
282 275
283#define REG_APSD_CTRL 0x0600 276#define REG_APSD_CTRL 0x0600
284#define REG_BWOPMODE 0x0603 277#define REG_BWOPMODE 0x0603
285#define REG_TCR 0x0604 278#define REG_TCR 0x0604
286#define REG_RCR 0x0608 279#define REG_RCR 0x0608
287#define REG_RX_PKT_LIMIT 0x060C 280#define REG_RX_PKT_LIMIT 0x060C
288#define REG_RX_DLK_TIME 0x060D 281#define REG_RX_DLK_TIME 0x060D
289#define REG_RX_DRVINFO_SZ 0x060F 282#define REG_RX_DRVINFO_SZ 0x060F
290 283
291#define REG_MACID 0x0610 284#define REG_MACID 0x0610
292#define REG_BSSID 0x0618 285#define REG_BSSID 0x0618
293#define REG_MAR 0x0620 286#define REG_MAR 0x0620
294#define REG_MBIDCAMCFG 0x0628 287#define REG_MBIDCAMCFG 0x0628
295 288
296#define REG_USTIME_EDCA 0x0638 289#define REG_USTIME_EDCA 0x0638
297#define REG_MAC_SPEC_SIFS 0x063A 290#define REG_MAC_SPEC_SIFS 0x063A
298#define REG_RESP_SIFS_CCK 0x063C 291#define REG_RESP_SIFS_CCK 0x063C
299#define REG_RESP_SIFS_OFDM 0x063E 292#define REG_RESP_SIFS_OFDM 0x063E
300#define REG_ACKTO 0x0640 293#define REG_ACKTO 0x0640
301#define REG_CTS2TO 0x0641 294#define REG_CTS2TO 0x0641
302#define REG_EIFS 0x0642 295#define REG_EIFS 0x0642
303 296
304#define REG_NAV_CTRL 0x0650 297#define REG_NAV_CTRL 0x0650
305#define REG_BACAMCMD 0x0654 298#define REG_BACAMCMD 0x0654
306#define REG_BACAMCONTENT 0x0658 299#define REG_BACAMCONTENT 0x0658
307#define REG_LBDLY 0x0660 300#define REG_LBDLY 0x0660
308#define REG_FWDLY 0x0661 301#define REG_FWDLY 0x0661
309#define REG_RXERR_RPT 0x0664 302#define REG_RXERR_RPT 0x0664
310#define REG_TRXPTCL_CTL 0x0668 303#define REG_TRXPTCL_CTL 0x0668
311 304
312#define REG_CAMCMD 0x0670 305#define REG_CAMCMD 0x0670
313#define REG_CAMWRITE 0x0674 306#define REG_CAMWRITE 0x0674
314#define REG_CAMREAD 0x0678 307#define REG_CAMREAD 0x0678
315#define REG_CAMDBG 0x067C 308#define REG_CAMDBG 0x067C
316#define REG_SECCFG 0x0680 309#define REG_SECCFG 0x0680
317 310
318#define REG_WOW_CTRL 0x0690 311#define REG_WOW_CTRL 0x0690
319#define REG_PSSTATUS 0x0691 312#define REG_PSSTATUS 0x0691
@@ -329,10 +322,10 @@
329#define REG_CALB32K_CTRL 0x06AC 322#define REG_CALB32K_CTRL 0x06AC
330#define REG_PKT_MON_CTRL 0x06B4 323#define REG_PKT_MON_CTRL 0x06B4
331#define REG_BT_COEX_TABLE 0x06C0 324#define REG_BT_COEX_TABLE 0x06C0
332#define REG_WMAC_RESP_TXINFO 0x06D8 325#define REG_WMAC_RESP_TXINFO 0x06D8
333 326
334#define REG_USB_INFO 0xFE17 327#define REG_USB_INFO 0xFE17
335#define REG_USB_SPECIAL_OPTION 0xFE55 328#define REG_USB_SPECIAL_OPTION 0xFE55
336#define REG_USB_DMA_AGG_TO 0xFE5B 329#define REG_USB_DMA_AGG_TO 0xFE5B
337#define REG_USB_AGG_TO 0xFE5C 330#define REG_USB_AGG_TO 0xFE5C
338#define REG_USB_AGG_TH 0xFE5D 331#define REG_USB_AGG_TH 0xFE5D
@@ -340,523 +333,545 @@
340#define REG_TEST_USB_TXQS 0xFE48 333#define REG_TEST_USB_TXQS 0xFE48
341#define REG_TEST_SIE_VID 0xFE60 334#define REG_TEST_SIE_VID 0xFE60
342#define REG_TEST_SIE_PID 0xFE62 335#define REG_TEST_SIE_PID 0xFE62
343#define REG_TEST_SIE_OPTIONAL 0xFE64 336#define REG_TEST_SIE_OPTIONAL 0xFE64
344#define REG_TEST_SIE_CHIRP_K 0xFE65 337#define REG_TEST_SIE_CHIRP_K 0xFE65
345#define REG_TEST_SIE_PHY 0xFE66 338#define REG_TEST_SIE_PHY 0xFE66
346#define REG_TEST_SIE_MAC_ADDR 0xFE70 339#define REG_TEST_SIE_MAC_ADDR 0xFE70
347#define REG_TEST_SIE_STRING 0xFE80 340#define REG_TEST_SIE_STRING 0xFE80
348 341
349#define REG_NORMAL_SIE_VID 0xFE60 342#define REG_NORMAL_SIE_VID 0xFE60
350#define REG_NORMAL_SIE_PID 0xFE62 343#define REG_NORMAL_SIE_PID 0xFE62
351#define REG_NORMAL_SIE_OPTIONAL 0xFE64 344#define REG_NORMAL_SIE_OPTIONAL 0xFE64
352#define REG_NORMAL_SIE_EP 0xFE65 345#define REG_NORMAL_SIE_EP 0xFE65
353#define REG_NORMAL_SIE_PHY 0xFE68 346#define REG_NORMAL_SIE_PHY 0xFE68
354#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 347#define REG_NORMAL_SIE_MAC_ADDR 0xFE70
355#define REG_NORMAL_SIE_STRING 0xFE80 348#define REG_NORMAL_SIE_STRING 0xFE80
356 349
357#define CR9346 REG_9346CR 350#define CR9346 REG_9346CR
358#define MSR (REG_CR + 2) 351#define MSR (REG_CR + 2)
359#define ISR REG_HISR 352#define ISR REG_HISR
360#define TSFR REG_TSFTR 353#define TSFR REG_TSFTR
361 354
362#define MACIDR0 REG_MACID 355#define MACIDR0 REG_MACID
363#define MACIDR4 (REG_MACID + 4) 356#define MACIDR4 (REG_MACID + 4)
364 357
365#define PBP REG_PBP 358#define PBP REG_PBP
366 359
367#define IDR0 MACIDR0 360#define IDR0 MACIDR0
368#define IDR4 MACIDR4 361#define IDR4 MACIDR4
369 362
370#define UNUSED_REGISTER 0x1BF 363#define UNUSED_REGISTER 0x1BF
371#define DCAM UNUSED_REGISTER 364#define DCAM UNUSED_REGISTER
372#define PSR UNUSED_REGISTER 365#define PSR UNUSED_REGISTER
373#define BBADDR UNUSED_REGISTER 366#define BBADDR UNUSED_REGISTER
374#define PHYDATAR UNUSED_REGISTER 367#define PHYDATAR UNUSED_REGISTER
375 368
376#define INVALID_BBRF_VALUE 0x12345678 369#define INVALID_BBRF_VALUE 0x12345678
377 370
378#define MAX_MSS_DENSITY_2T 0x13 371#define MAX_MSS_DENSITY_2T 0x13
379#define MAX_MSS_DENSITY_1T 0x0A 372#define MAX_MSS_DENSITY_1T 0x0A
380 373
381#define CMDEEPROM_EN BIT(5) 374#define CMDEEPROM_EN BIT(5)
382#define CMDEEPROM_SEL BIT(4) 375#define CMDEEPROM_SEL BIT(4)
383#define CMD9346CR_9356SEL BIT(4) 376#define CMD9346CR_9356SEL BIT(4)
384#define AUTOLOAD_EEPROM (CMDEEPROM_EN|CMDEEPROM_SEL) 377#define AUTOLOAD_EEPROM (CMDEEPROM_EN|CMDEEPROM_SEL)
385#define AUTOLOAD_EFUSE CMDEEPROM_EN 378#define AUTOLOAD_EFUSE CMDEEPROM_EN
386 379
387#define GPIOSEL_GPIO 0 380#define GPIOSEL_GPIO 0
388#define GPIOSEL_ENBT BIT(5) 381#define GPIOSEL_ENBT BIT(5)
389 382
390#define GPIO_IN REG_GPIO_PIN_CTRL 383#define GPIO_IN REG_GPIO_PIN_CTRL
391#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) 384#define GPIO_OUT (REG_GPIO_PIN_CTRL+1)
392#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) 385#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2)
393#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) 386#define GPIO_MOD (REG_GPIO_PIN_CTRL+3)
394 387
395/* 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) */ 388/*8723/8188E Host System Interrupt
389 *Mask Register (offset 0x58, 32 byte)
390 */
396#define HSIMR_GPIO12_0_INT_EN BIT(0) 391#define HSIMR_GPIO12_0_INT_EN BIT(0)
397#define HSIMR_SPS_OCP_INT_EN BIT(5) 392#define HSIMR_SPS_OCP_INT_EN BIT(5)
398#define HSIMR_RON_INT_EN BIT(6) 393#define HSIMR_RON_INT_EN BIT(6)
399#define HSIMR_PDN_INT_EN BIT(7) 394#define HSIMR_PDN_INT_EN BIT(7)
400#define HSIMR_GPIO9_INT_EN BIT(25) 395#define HSIMR_GPIO9_INT_EN BIT(25)
401 396
402 397/* 8723/8188E Host System Interrupt
403/* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */ 398 * Status Register (offset 0x5C, 32 byte)
399 */
404#define HSISR_GPIO12_0_INT BIT(0) 400#define HSISR_GPIO12_0_INT BIT(0)
405#define HSISR_SPS_OCP_INT BIT(5) 401#define HSISR_SPS_OCP_INT BIT(5)
406#define HSISR_RON_INT_EN BIT(6) 402#define HSISR_RON_INT_EN BIT(6)
407#define HSISR_PDNINT BIT(7) 403#define HSISR_PDNINT BIT(7)
408#define HSISR_GPIO9_INT BIT(25) 404#define HSISR_GPIO9_INT BIT(25)
409 405
410#define MSR_NOLINK 0x00 406#define MSR_NOLINK 0x00
411#define MSR_ADHOC 0x01 407#define MSR_ADHOC 0x01
412#define MSR_INFRA 0x02 408#define MSR_INFRA 0x02
413#define MSR_AP 0x03 409#define MSR_AP 0x03
414#define MSR_MASK 0x03
415 410
416#define RRSR_RSC_OFFSET 21 411#define RRSR_RSC_OFFSET 21
417#define RRSR_SHORT_OFFSET 23 412#define RRSR_SHORT_OFFSET 23
418#define RRSR_RSC_BW_40M 0x600000 413#define RRSR_RSC_BW_40M 0x600000
419#define RRSR_RSC_UPSUBCHNL 0x400000 414#define RRSR_RSC_UPSUBCHNL 0x400000
420#define RRSR_RSC_LOWSUBCHNL 0x200000 415#define RRSR_RSC_LOWSUBCHNL 0x200000
421#define RRSR_SHORT 0x800000 416#define RRSR_SHORT 0x800000
422#define RRSR_1M BIT(0) 417#define RRSR_1M BIT(0)
423#define RRSR_2M BIT(1) 418#define RRSR_2M BIT(1)
424#define RRSR_5_5M BIT(2) 419#define RRSR_5_5M BIT(2)
425#define RRSR_11M BIT(3) 420#define RRSR_11M BIT(3)
426#define RRSR_6M BIT(4) 421#define RRSR_6M BIT(4)
427#define RRSR_9M BIT(5) 422#define RRSR_9M BIT(5)
428#define RRSR_12M BIT(6) 423#define RRSR_12M BIT(6)
429#define RRSR_18M BIT(7) 424#define RRSR_18M BIT(7)
430#define RRSR_24M BIT(8) 425#define RRSR_24M BIT(8)
431#define RRSR_36M BIT(9) 426#define RRSR_36M BIT(9)
432#define RRSR_48M BIT(10) 427#define RRSR_48M BIT(10)
433#define RRSR_54M BIT(11) 428#define RRSR_54M BIT(11)
434#define RRSR_MCS0 BIT(12) 429#define RRSR_MCS0 BIT(12)
435#define RRSR_MCS1 BIT(13) 430#define RRSR_MCS1 BIT(13)
436#define RRSR_MCS2 BIT(14) 431#define RRSR_MCS2 BIT(14)
437#define RRSR_MCS3 BIT(15) 432#define RRSR_MCS3 BIT(15)
438#define RRSR_MCS4 BIT(16) 433#define RRSR_MCS4 BIT(16)
439#define RRSR_MCS5 BIT(17) 434#define RRSR_MCS5 BIT(17)
440#define RRSR_MCS6 BIT(18) 435#define RRSR_MCS6 BIT(18)
441#define RRSR_MCS7 BIT(19) 436#define RRSR_MCS7 BIT(19)
442#define BRSR_ACKSHORTPMB BIT(23) 437#define BRSR_ACKSHORTPMB BIT(23)
443 438
444#define RATR_1M 0x00000001 439#define RATR_1M 0x00000001
445#define RATR_2M 0x00000002 440#define RATR_2M 0x00000002
446#define RATR_55M 0x00000004 441#define RATR_55M 0x00000004
447#define RATR_11M 0x00000008 442#define RATR_11M 0x00000008
448#define RATR_6M 0x00000010 443#define RATR_6M 0x00000010
449#define RATR_9M 0x00000020 444#define RATR_9M 0x00000020
450#define RATR_12M 0x00000040 445#define RATR_12M 0x00000040
451#define RATR_18M 0x00000080 446#define RATR_18M 0x00000080
452#define RATR_24M 0x00000100 447#define RATR_24M 0x00000100
453#define RATR_36M 0x00000200 448#define RATR_36M 0x00000200
454#define RATR_48M 0x00000400 449#define RATR_48M 0x00000400
455#define RATR_54M 0x00000800 450#define RATR_54M 0x00000800
456#define RATR_MCS0 0x00001000 451#define RATR_MCS0 0x00001000
457#define RATR_MCS1 0x00002000 452#define RATR_MCS1 0x00002000
458#define RATR_MCS2 0x00004000 453#define RATR_MCS2 0x00004000
459#define RATR_MCS3 0x00008000 454#define RATR_MCS3 0x00008000
460#define RATR_MCS4 0x00010000 455#define RATR_MCS4 0x00010000
461#define RATR_MCS5 0x00020000 456#define RATR_MCS5 0x00020000
462#define RATR_MCS6 0x00040000 457#define RATR_MCS6 0x00040000
463#define RATR_MCS7 0x00080000 458#define RATR_MCS7 0x00080000
464#define RATR_MCS8 0x00100000 459#define RATR_MCS8 0x00100000
465#define RATR_MCS9 0x00200000 460#define RATR_MCS9 0x00200000
466#define RATR_MCS10 0x00400000 461#define RATR_MCS10 0x00400000
467#define RATR_MCS11 0x00800000 462#define RATR_MCS11 0x00800000
468#define RATR_MCS12 0x01000000 463#define RATR_MCS12 0x01000000
469#define RATR_MCS13 0x02000000 464#define RATR_MCS13 0x02000000
470#define RATR_MCS14 0x04000000 465#define RATR_MCS14 0x04000000
471#define RATR_MCS15 0x08000000 466#define RATR_MCS15 0x08000000
472 467
473#define RATE_1M BIT(0) 468#define RATE_1M BIT(0)
474#define RATE_2M BIT(1) 469#define RATE_2M BIT(1)
475#define RATE_5_5M BIT(2) 470#define RATE_5_5M BIT(2)
476#define RATE_11M BIT(3) 471#define RATE_11M BIT(3)
477#define RATE_6M BIT(4) 472#define RATE_6M BIT(4)
478#define RATE_9M BIT(5) 473#define RATE_9M BIT(5)
479#define RATE_12M BIT(6) 474#define RATE_12M BIT(6)
480#define RATE_18M BIT(7) 475#define RATE_18M BIT(7)
481#define RATE_24M BIT(8) 476#define RATE_24M BIT(8)
482#define RATE_36M BIT(9) 477#define RATE_36M BIT(9)
483#define RATE_48M BIT(10) 478#define RATE_48M BIT(10)
484#define RATE_54M BIT(11) 479#define RATE_54M BIT(11)
485#define RATE_MCS0 BIT(12) 480#define RATE_MCS0 BIT(12)
486#define RATE_MCS1 BIT(13) 481#define RATE_MCS1 BIT(13)
487#define RATE_MCS2 BIT(14) 482#define RATE_MCS2 BIT(14)
488#define RATE_MCS3 BIT(15) 483#define RATE_MCS3 BIT(15)
489#define RATE_MCS4 BIT(16) 484#define RATE_MCS4 BIT(16)
490#define RATE_MCS5 BIT(17) 485#define RATE_MCS5 BIT(17)
491#define RATE_MCS6 BIT(18) 486#define RATE_MCS6 BIT(18)
492#define RATE_MCS7 BIT(19) 487#define RATE_MCS7 BIT(19)
493#define RATE_MCS8 BIT(20) 488#define RATE_MCS8 BIT(20)
494#define RATE_MCS9 BIT(21) 489#define RATE_MCS9 BIT(21)
495#define RATE_MCS10 BIT(22) 490#define RATE_MCS10 BIT(22)
496#define RATE_MCS11 BIT(23) 491#define RATE_MCS11 BIT(23)
497#define RATE_MCS12 BIT(24) 492#define RATE_MCS12 BIT(24)
498#define RATE_MCS13 BIT(25) 493#define RATE_MCS13 BIT(25)
499#define RATE_MCS14 BIT(26) 494#define RATE_MCS14 BIT(26)
500#define RATE_MCS15 BIT(27) 495#define RATE_MCS15 BIT(27)
501 496
502#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M) 497#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M)
503#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M | \ 498#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M |\
504 RATR_24M | RATR_36M | RATR_48M | RATR_54M) 499 RATR_24M | RATR_36M | RATR_48M | RATR_54M)
505#define RATE_ALL_OFDM_1SS (RATR_MCS0 | RATR_MCS1 | RATR_MCS2 | \ 500#define RATE_ALL_OFDM_1SS (RATR_MCS0 | RATR_MCS1 | RATR_MCS2 |\
506 RATR_MCS3 | RATR_MCS4 | RATR_MCS5 | \ 501 RATR_MCS3 | RATR_MCS4 | RATR_MCS5 |\
507 RATR_MCS6 | RATR_MCS7) 502 RATR_MCS6 | RATR_MCS7)
508#define RATE_ALL_OFDM_2SS (RATR_MCS8 | RATR_MCS9 | RATR_MCS10 | \ 503#define RATE_ALL_OFDM_2SS (RATR_MCS8 | RATR_MCS9 | RATR_MCS10 |\
509 RATR_MCS11 | RATR_MCS12 | RATR_MCS13 | \ 504 RATR_MCS11 | RATR_MCS12 | RATR_MCS13 |\
510 RATR_MCS14 | RATR_MCS15) 505 RATR_MCS14 | RATR_MCS15)
511 506
512#define BW_OPMODE_20MHZ BIT(2) 507#define BW_OPMODE_20MHZ BIT(2)
513#define BW_OPMODE_5G BIT(1) 508#define BW_OPMODE_5G BIT(1)
514#define BW_OPMODE_11J BIT(0) 509#define BW_OPMODE_11J BIT(0)
515 510
516#define CAM_VALID BIT(15) 511#define CAM_VALID BIT(15)
517#define CAM_NOTVALID 0x0000 512#define CAM_NOTVALID 0x0000
518#define CAM_USEDK BIT(5) 513#define CAM_USEDK BIT(5)
519 514
520#define CAM_NONE 0x0 515#define CAM_NONE 0x0
521#define CAM_WEP40 0x01 516#define CAM_WEP40 0x01
522#define CAM_TKIP 0x02 517#define CAM_TKIP 0x02
523#define CAM_AES 0x04 518#define CAM_AES 0x04
524#define CAM_WEP104 0x05 519#define CAM_WEP104 0x05
525 520
526#define TOTAL_CAM_ENTRY 32 521#define TOTAL_CAM_ENTRY 32
527#define HALF_CAM_ENTRY 16 522#define HALF_CAM_ENTRY 16
528 523
529#define CAM_WRITE BIT(16) 524#define CAM_WRITE BIT(16)
530#define CAM_READ 0x00000000 525#define CAM_READ 0x00000000
531#define CAM_POLLINIG BIT(31) 526#define CAM_POLLINIG BIT(31)
532 527
533#define SCR_USEDK 0x01 528#define SCR_USEDK 0x01
534#define SCR_TXSEC_ENABLE 0x02 529#define SCR_TXSEC_ENABLE 0x02
535#define SCR_RXSEC_ENABLE 0x04 530#define SCR_RXSEC_ENABLE 0x04
536 531
537#define WOW_PMEN BIT(0) 532#define WOW_PMEN BIT(0)
538#define WOW_WOMEN BIT(1) 533#define WOW_WOMEN BIT(1)
539#define WOW_MAGIC BIT(2) 534#define WOW_MAGIC BIT(2)
540#define WOW_UWF BIT(3) 535#define WOW_UWF BIT(3)
541 536
542/********************************************* 537/*********************************************
543* 8188 IMR/ISR bits 538* 8188 IMR/ISR bits
544**********************************************/ 539**********************************************/
545#define IMR_DISABLED 0x0 540#define IMR_DISABLED 0x0
546/* IMR DW0(0x0060-0063) Bit 0-31 */ 541/* IMR DW0(0x0060-0063) Bit 0-31 */
547#define IMR_TXCCK BIT(30) /* TXRPT interrupt when CCX bit of 542/* TXRPT interrupt when CCX bit of the packet is set */
548 * the packet is set 543#define IMR_TXCCK BIT(30)
549 */ 544/* Power Save Time Out Interrupt */
550#define IMR_PSTIMEOUT BIT(29) /* Power Save Time Out Interrupt */ 545#define IMR_PSTIMEOUT BIT(29)
551#define IMR_GTINT4 BIT(28) /* When GTIMER4 expires, 546/* When GTIMER4 expires, this bit is set to 1 */
552 * this bit is set to 1 547#define IMR_GTINT4 BIT(28)
553 */ 548/* When GTIMER3 expires, this bit is set to 1 */
554#define IMR_GTINT3 BIT(27) /* When GTIMER3 expires, 549#define IMR_GTINT3 BIT(27)
555 * this bit is set to 1 550/* Transmit Beacon0 Error */
556 */ 551#define IMR_TBDER BIT(26)
557#define IMR_TBDER BIT(26) /* Transmit Beacon0 Error */ 552/* Transmit Beacon0 OK */
558#define IMR_TBDOK BIT(25) /* Transmit Beacon0 OK */ 553#define IMR_TBDOK BIT(25)
559#define IMR_TSF_BIT32_TOGGLE BIT(24) /* TSF Timer BIT32 toggle ind int */ 554/* TSF Timer BIT32 toggle indication interrupt */
560#define IMR_BCNDMAINT0 BIT(20) /* Beacon DMA Interrupt 0 */ 555#define IMR_TSF_BIT32_TOGGLE BIT(24)
561#define IMR_BCNDOK0 BIT(16) /* Beacon Queue DMA OK0 */ 556/* Beacon DMA Interrupt 0 */
562#define IMR_HSISR_IND_ON_INT BIT(15) /* HSISR Indicator (HSIMR & HSISR is 557#define IMR_BCNDMAINT0 BIT(20)
563 * true, this bit is set to 1) 558/* Beacon Queue DMA OK0 */
564 */ 559#define IMR_BCNDOK0 BIT(16)
565#define IMR_BCNDMAINT_E BIT(14) /* Beacon DMA Int Extension for Win7 */ 560/* HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) */
566#define IMR_ATIMEND BIT(12) /* CTWidnow End or ATIM Window End */ 561#define IMR_HSISR_IND_ON_INT BIT(15)
567#define IMR_HISR1_IND_INT BIT(11) /* HISR1 Indicator (HISR1 & HIMR1 is 562/* Beacon DMA Interrupt Extension for Win7 */
568 * true, this bit is set to 1) 563#define IMR_BCNDMAINT_E BIT(14)
569 */ 564/* CTWidnow End or ATIM Window End */
570#define IMR_C2HCMD BIT(10) /* CPU to Host Command INT Status, 565#define IMR_ATIMEND BIT(12)
571 * Write 1 clear 566/* HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1)*/
572 */ 567#define IMR_HISR1_IND_INT BIT(11)
573#define IMR_CPWM2 BIT(9) /* CPU power Mode exchange INT Status, 568/* CPU to Host Command INT Status, Write 1 clear */
574 * Write 1 clear 569#define IMR_C2HCMD BIT(10)
575 */ 570/* CPU power Mode exchange INT Status, Write 1 clear */
576#define IMR_CPWM BIT(8) /* CPU power Mode exchange INT Status, 571#define IMR_CPWM2 BIT(9)
577 * Write 1 clear 572/* CPU power Mode exchange INT Status, Write 1 clear */
578 */ 573#define IMR_CPWM BIT(8)
579#define IMR_HIGHDOK BIT(7) /* High Queue DMA OK */ 574/* High Queue DMA OK */
580#define IMR_MGNTDOK BIT(6) /* Management Queue DMA OK */ 575#define IMR_HIGHDOK BIT(7)
581#define IMR_BKDOK BIT(5) /* AC_BK DMA OK */ 576/* Management Queue DMA OK */
582#define IMR_BEDOK BIT(4) /* AC_BE DMA OK */ 577#define IMR_MGNTDOK BIT(6)
583#define IMR_VIDOK BIT(3) /* AC_VI DMA OK */ 578/* AC_BK DMA OK */
584#define IMR_VODOK BIT(2) /* AC_VO DMA OK */ 579#define IMR_BKDOK BIT(5)
585#define IMR_RDU BIT(1) /* Rx Descriptor Unavailable */ 580/* AC_BE DMA OK */
586#define IMR_ROK BIT(0) /* Receive DMA OK */ 581#define IMR_BEDOK BIT(4)
582/* AC_VI DMA OK */
583#define IMR_VIDOK BIT(3)
584/* AC_VO DMA OK */
585#define IMR_VODOK BIT(2)
586/* Rx Descriptor Unavailable */
587#define IMR_RDU BIT(1)
588/* Receive DMA OK */
589#define IMR_ROK BIT(0)
587 590
588/* IMR DW1(0x00B4-00B7) Bit 0-31 */ 591/* IMR DW1(0x00B4-00B7) Bit 0-31 */
589#define IMR_BCNDMAINT7 BIT(27) /* Beacon DMA Interrupt 7 */ 592/* Beacon DMA Interrupt 7 */
590#define IMR_BCNDMAINT6 BIT(26) /* Beacon DMA Interrupt 6 */ 593#define IMR_BCNDMAINT7 BIT(27)
591#define IMR_BCNDMAINT5 BIT(25) /* Beacon DMA Interrupt 5 */ 594/* Beacon DMA Interrupt 6 */
592#define IMR_BCNDMAINT4 BIT(24) /* Beacon DMA Interrupt 4 */ 595#define IMR_BCNDMAINT6 BIT(26)
593#define IMR_BCNDMAINT3 BIT(23) /* Beacon DMA Interrupt 3 */ 596/* Beacon DMA Interrupt 5 */
594#define IMR_BCNDMAINT2 BIT(22) /* Beacon DMA Interrupt 2 */ 597#define IMR_BCNDMAINT5 BIT(25)
595#define IMR_BCNDMAINT1 BIT(21) /* Beacon DMA Interrupt 1 */ 598/* Beacon DMA Interrupt 4 */
596#define IMR_BCNDOK7 BIT(20) /* Beacon Queue DMA OK Interrup 7 */ 599#define IMR_BCNDMAINT4 BIT(24)
597#define IMR_BCNDOK6 BIT(19) /* Beacon Queue DMA OK Interrup 6 */ 600/* Beacon DMA Interrupt 3 */
598#define IMR_BCNDOK5 BIT(18) /* Beacon Queue DMA OK Interrup 5 */ 601#define IMR_BCNDMAINT3 BIT(23)
599#define IMR_BCNDOK4 BIT(17) /* Beacon Queue DMA OK Interrup 4 */ 602/* Beacon DMA Interrupt 2 */
600#define IMR_BCNDOK3 BIT(16) /* Beacon Queue DMA OK Interrup 3 */ 603#define IMR_BCNDMAINT2 BIT(22)
601#define IMR_BCNDOK2 BIT(15) /* Beacon Queue DMA OK Interrup 2 */ 604/* Beacon DMA Interrupt 1 */
602#define IMR_BCNDOK1 BIT(14) /* Beacon Queue DMA OK Interrup 1 */ 605#define IMR_BCNDMAINT1 BIT(21)
603#define IMR_ATIMEND_E BIT(13) /* ATIM Window End Extension for Win7 */ 606/* Beacon Queue DMA OK Interrup 7 */
604#define IMR_TXERR BIT(11) /* Tx Err Flag Int Status, 607#define IMR_BCNDOK7 BIT(20)
605 * write 1 clear. 608/* Beacon Queue DMA OK Interrup 6 */
606 */ 609#define IMR_BCNDOK6 BIT(19)
607#define IMR_RXERR BIT(10) /* Rx Err Flag INT Status, 610/* Beacon Queue DMA OK Interrup 5 */
608 * Write 1 clear 611#define IMR_BCNDOK5 BIT(18)
609 */ 612/* Beacon Queue DMA OK Interrup 4 */
610#define IMR_TXFOVW BIT(9) /* Transmit FIFO Overflow */ 613#define IMR_BCNDOK4 BIT(17)
611#define IMR_RXFOVW BIT(8) /* Receive FIFO Overflow */ 614/* Beacon Queue DMA OK Interrup 3 */
612 615#define IMR_BCNDOK3 BIT(16)
616/* Beacon Queue DMA OK Interrup 2 */
617#define IMR_BCNDOK2 BIT(15)
618/* Beacon Queue DMA OK Interrup 1 */
619#define IMR_BCNDOK1 BIT(14)
620/* ATIM Window End Extension for Win7 */
621#define IMR_ATIMEND_E BIT(13)
622/* Tx Error Flag Interrupt Status, write 1 clear. */
623#define IMR_TXERR BIT(11)
624/* Rx Error Flag INT Status, Write 1 clear */
625#define IMR_RXERR BIT(10)
626/* Transmit FIFO Overflow */
627#define IMR_TXFOVW BIT(9)
628/* Receive FIFO Overflow */
629#define IMR_RXFOVW BIT(8)
613 630
614#define HWSET_MAX_SIZE 512 631#define HWSET_MAX_SIZE 512
615#define EFUSE_MAX_SECTION 64 632#define EFUSE_MAX_SECTION 64
616#define EFUSE_REAL_CONTENT_LEN 256 633#define EFUSE_REAL_CONTENT_LEN 256
617#define EFUSE_OOB_PROTECT_BYTES 18 /* PG data exclude header, 634/* PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte.*/
618 * dummy 7 bytes frome CP 635#define EFUSE_OOB_PROTECT_BYTES 18
619 * test and reserved 1byte. 636
620 */ 637#define EEPROM_DEFAULT_TSSI 0x0
621 638#define EEPROM_DEFAULT_TXPOWERDIFF 0x0
622#define EEPROM_DEFAULT_TSSI 0x0 639#define EEPROM_DEFAULT_CRYSTALCAP 0x5
623#define EEPROM_DEFAULT_TXPOWERDIFF 0x0 640#define EEPROM_DEFAULT_BOARDTYPE 0x02
624#define EEPROM_DEFAULT_CRYSTALCAP 0x5 641#define EEPROM_DEFAULT_TXPOWER 0x1010
625#define EEPROM_DEFAULT_BOARDTYPE 0x02 642#define EEPROM_DEFAULT_HT2T_TXPWR 0x10
626#define EEPROM_DEFAULT_TXPOWER 0x1010
627#define EEPROM_DEFAULT_HT2T_TXPWR 0x10
628 643
629#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3 644#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
630#define EEPROM_DEFAULT_THERMALMETER 0x18 645#define EEPROM_DEFAULT_THERMALMETER 0x18
631#define EEPROM_DEFAULT_ANTTXPOWERDIFF 0x0 646#define EEPROM_DEFAULT_ANTTXPOWERDIFF 0x0
632#define EEPROM_DEFAULT_TXPWDIFF_CRYSTALCAP 0x5 647#define EEPROM_DEFAULT_TXPWDIFF_CRYSTALCAP 0x5
633#define EEPROM_DEFAULT_TXPOWERLEVEL 0x22 648#define EEPROM_DEFAULT_TXPOWERLEVEL 0x22
634#define EEPROM_DEFAULT_HT40_2SDIFF 0x0 649#define EEPROM_DEFAULT_HT40_2SDIFF 0x0
635#define EEPROM_DEFAULT_HT20_DIFF 2 650#define EEPROM_DEFAULT_HT20_DIFF 2
636#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3 651#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
637#define EEPROM_DEFAULT_HT40_PWRMAXOFFSET 0 652#define EEPROM_DEFAULT_HT40_PWRMAXOFFSET 0
638#define EEPROM_DEFAULT_HT20_PWRMAXOFFSET 0 653#define EEPROM_DEFAULT_HT20_PWRMAXOFFSET 0
639 654
640#define RF_OPTION1 0x79 655#define RF_OPTION1 0x79
641#define RF_OPTION2 0x7A 656#define RF_OPTION2 0x7A
642#define RF_OPTION3 0x7B 657#define RF_OPTION3 0x7B
643#define RF_OPTION4 0x7C 658#define RF_OPTION4 0x7C
644 659
645#define EEPROM_DEFAULT_PID 0x1234 660#define EEPROM_DEFAULT_PID 0x1234
646#define EEPROM_DEFAULT_VID 0x5678 661#define EEPROM_DEFAULT_VID 0x5678
647#define EEPROM_DEFAULT_CUSTOMERID 0xAB 662#define EEPROM_DEFAULT_CUSTOMERID 0xAB
648#define EEPROM_DEFAULT_SUBCUSTOMERID 0xCD 663#define EEPROM_DEFAULT_SUBCUSTOMERID 0xCD
649#define EEPROM_DEFAULT_VERSION 0 664#define EEPROM_DEFAULT_VERSION 0
650 665
651#define EEPROM_CHANNEL_PLAN_FCC 0x0 666#define EEPROM_CHANNEL_PLAN_FCC 0x0
652#define EEPROM_CHANNEL_PLAN_IC 0x1 667#define EEPROM_CHANNEL_PLAN_IC 0x1
653#define EEPROM_CHANNEL_PLAN_ETSI 0x2 668#define EEPROM_CHANNEL_PLAN_ETSI 0x2
654#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 669#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
655#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 670#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
656#define EEPROM_CHANNEL_PLAN_MKK 0x5 671#define EEPROM_CHANNEL_PLAN_MKK 0x5
657#define EEPROM_CHANNEL_PLAN_MKK1 0x6 672#define EEPROM_CHANNEL_PLAN_MKK1 0x6
658#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 673#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
659#define EEPROM_CHANNEL_PLAN_TELEC 0x8 674#define EEPROM_CHANNEL_PLAN_TELEC 0x8
660#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 675#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
661#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA 676#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
662#define EEPROM_CHANNEL_PLAN_NCC 0xB 677#define EEPROM_CHANNEL_PLAN_NCC 0xB
663#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 678#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
664 679
665#define EEPROM_CID_DEFAULT 0x0 680#define EEPROM_CID_DEFAULT 0x0
666#define EEPROM_CID_TOSHIBA 0x4 681#define EEPROM_CID_TOSHIBA 0x4
667#define EEPROM_CID_CCX 0x10 682#define EEPROM_CID_CCX 0x10
668#define EEPROM_CID_QMI 0x0D 683#define EEPROM_CID_QMI 0x0D
669#define EEPROM_CID_WHQL 0xFE 684#define EEPROM_CID_WHQL 0xFE
670 685
671#define RTL8188E_EEPROM_ID 0x8129 686#define RTL8188E_EEPROM_ID 0x8129
672 687
673#define EEPROM_HPON 0x02 688#define EEPROM_HPON 0x02
674#define EEPROM_CLK 0x06 689#define EEPROM_CLK 0x06
675#define EEPROM_TESTR 0x08 690#define EEPROM_TESTR 0x08
676 691
677#define EEPROM_TXPOWERCCK 0x10 692#define EEPROM_TXPOWERCCK 0x10
678#define EEPROM_TXPOWERHT40_1S 0x16 693#define EEPROM_TXPOWERHT40_1S 0x16
679#define EEPROM_TXPOWERHT20DIFF 0x1B 694#define EEPROM_TXPOWERHT20DIFF 0x1B
680#define EEPROM_TXPOWER_OFDMDIFF 0x1B 695#define EEPROM_TXPOWER_OFDMDIFF 0x1B
681 696
682#define EEPROM_TX_PWR_INX 0x10 697#define EEPROM_TX_PWR_INX 0x10
683 698
684#define EEPROM_CHANNELPLAN 0xB8 699#define EEPROM_CHANNELPLAN 0xB8
685#define EEPROM_XTAL_88E 0xB9 700#define EEPROM_XTAL_88E 0xB9
686#define EEPROM_THERMAL_METER_88E 0xBA 701#define EEPROM_THERMAL_METER_88E 0xBA
687#define EEPROM_IQK_LCK_88E 0xBB 702#define EEPROM_IQK_LCK_88E 0xBB
688 703
689#define EEPROM_RF_BOARD_OPTION_88E 0xC1 704#define EEPROM_RF_BOARD_OPTION_88E 0xC1
690#define EEPROM_RF_FEATURE_OPTION_88E 0xC2 705#define EEPROM_RF_FEATURE_OPTION_88E 0xC2
691#define EEPROM_RF_BT_SETTING_88E 0xC3 706#define EEPROM_RF_BT_SETTING_88E 0xC3
692#define EEPROM_VERSION 0xC4 707#define EEPROM_VERSION 0xC4
693#define EEPROM_CUSTOMER_ID 0xC5 708#define EEPROM_CUSTOMER_ID 0xC5
694#define EEPROM_RF_ANTENNA_OPT_88E 0xC9 709#define EEPROM_RF_ANTENNA_OPT_88E 0xC9
695 710
696#define EEPROM_MAC_ADDR 0xD0 711#define EEPROM_MAC_ADDR 0xD0
697#define EEPROM_VID 0xD6 712#define EEPROM_VID 0xD6
698#define EEPROM_DID 0xD8 713#define EEPROM_DID 0xD8
699#define EEPROM_SVID 0xDA 714#define EEPROM_SVID 0xDA
700#define EEPROM_SMID 0xDC 715#define EEPROM_SMID 0xDC
701 716
702#define STOPBECON BIT(6) 717#define STOPBECON BIT(6)
703#define STOPHIGHT BIT(5) 718#define STOPHIGHT BIT(5)
704#define STOPMGT BIT(4) 719#define STOPMGT BIT(4)
705#define STOPVO BIT(3) 720#define STOPVO BIT(3)
706#define STOPVI BIT(2) 721#define STOPVI BIT(2)
707#define STOPBE BIT(1) 722#define STOPBE BIT(1)
708#define STOPBK BIT(0) 723#define STOPBK BIT(0)
709 724
710#define RCR_APPFCS BIT(31) 725#define RCR_APPFCS BIT(31)
711#define RCR_APP_MIC BIT(30) 726#define RCR_APP_MIC BIT(30)
712#define RCR_APP_ICV BIT(29) 727#define RCR_APP_ICV BIT(29)
713#define RCR_APP_PHYST_RXFF BIT(28) 728#define RCR_APP_PHYST_RXFF BIT(28)
714#define RCR_APP_BA_SSN BIT(27) 729#define RCR_APP_BA_SSN BIT(27)
715#define RCR_ENMBID BIT(24) 730#define RCR_ENMBID BIT(24)
716#define RCR_LSIGEN BIT(23) 731#define RCR_LSIGEN BIT(23)
717#define RCR_MFBEN BIT(22) 732#define RCR_MFBEN BIT(22)
718#define RCR_HTC_LOC_CTRL BIT(14) 733#define RCR_HTC_LOC_CTRL BIT(14)
719#define RCR_AMF BIT(13) 734#define RCR_AMF BIT(13)
720#define RCR_ACF BIT(12) 735#define RCR_ACF BIT(12)
721#define RCR_ADF BIT(11) 736#define RCR_ADF BIT(11)
722#define RCR_AICV BIT(9) 737#define RCR_AICV BIT(9)
723#define RCR_ACRC32 BIT(8) 738#define RCR_ACRC32 BIT(8)
724#define RCR_CBSSID_BCN BIT(7) 739#define RCR_CBSSID_BCN BIT(7)
725#define RCR_CBSSID_DATA BIT(6) 740#define RCR_CBSSID_DATA BIT(6)
726#define RCR_CBSSID RCR_CBSSID_DATA 741#define RCR_CBSSID RCR_CBSSID_DATA
727#define RCR_APWRMGT BIT(5) 742#define RCR_APWRMGT BIT(5)
728#define RCR_ADD3 BIT(4) 743#define RCR_ADD3 BIT(4)
729#define RCR_AB BIT(3) 744#define RCR_AB BIT(3)
730#define RCR_AM BIT(2) 745#define RCR_AM BIT(2)
731#define RCR_APM BIT(1) 746#define RCR_APM BIT(1)
732#define RCR_AAP BIT(0) 747#define RCR_AAP BIT(0)
733#define RCR_MXDMA_OFFSET 8 748#define RCR_MXDMA_OFFSET 8
734#define RCR_FIFO_OFFSET 13 749#define RCR_FIFO_OFFSET 13
735 750
736#define RSV_CTRL 0x001C 751#define RSV_CTRL 0x001C
737#define RD_CTRL 0x0524 752#define RD_CTRL 0x0524
738 753
739#define REG_USB_INFO 0xFE17 754#define REG_USB_INFO 0xFE17
740#define REG_USB_SPECIAL_OPTION 0xFE55 755#define REG_USB_SPECIAL_OPTION 0xFE55
741#define REG_USB_DMA_AGG_TO 0xFE5B 756#define REG_USB_DMA_AGG_TO 0xFE5B
742#define REG_USB_AGG_TO 0xFE5C 757#define REG_USB_AGG_TO 0xFE5C
743#define REG_USB_AGG_TH 0xFE5D 758#define REG_USB_AGG_TH 0xFE5D
744 759
745#define REG_USB_VID 0xFE60 760#define REG_USB_VID 0xFE60
746#define REG_USB_PID 0xFE62 761#define REG_USB_PID 0xFE62
747#define REG_USB_OPTIONAL 0xFE64 762#define REG_USB_OPTIONAL 0xFE64
748#define REG_USB_CHIRP_K 0xFE65 763#define REG_USB_CHIRP_K 0xFE65
749#define REG_USB_PHY 0xFE66 764#define REG_USB_PHY 0xFE66
750#define REG_USB_MAC_ADDR 0xFE70 765#define REG_USB_MAC_ADDR 0xFE70
751#define REG_USB_HRPWM 0xFE58 766#define REG_USB_HRPWM 0xFE58
752#define REG_USB_HCPWM 0xFE57 767#define REG_USB_HCPWM 0xFE57
753 768
754#define SW18_FPWM BIT(3) 769#define SW18_FPWM BIT(3)
755 770
756#define ISO_MD2PP BIT(0) 771#define ISO_MD2PP BIT(0)
757#define ISO_UA2USB BIT(1) 772#define ISO_UA2USB BIT(1)
758#define ISO_UD2CORE BIT(2) 773#define ISO_UD2CORE BIT(2)
759#define ISO_PA2PCIE BIT(3) 774#define ISO_PA2PCIE BIT(3)
760#define ISO_PD2CORE BIT(4) 775#define ISO_PD2CORE BIT(4)
761#define ISO_IP2MAC BIT(5) 776#define ISO_IP2MAC BIT(5)
762#define ISO_DIOP BIT(6) 777#define ISO_DIOP BIT(6)
763#define ISO_DIOE BIT(7) 778#define ISO_DIOE BIT(7)
764#define ISO_EB2CORE BIT(8) 779#define ISO_EB2CORE BIT(8)
765#define ISO_DIOR BIT(9) 780#define ISO_DIOR BIT(9)
766 781
767#define PWC_EV25V BIT(14) 782#define PWC_EV25V BIT(14)
768#define PWC_EV12V BIT(15) 783#define PWC_EV12V BIT(15)
769 784
770#define FEN_BBRSTB BIT(0) 785#define FEN_BBRSTB BIT(0)
771#define FEN_BB_GLB_RSTN BIT(1) 786#define FEN_BB_GLB_RSTN BIT(1)
772#define FEN_USBA BIT(2) 787#define FEN_USBA BIT(2)
773#define FEN_UPLL BIT(3) 788#define FEN_UPLL BIT(3)
774#define FEN_USBD BIT(4) 789#define FEN_USBD BIT(4)
775#define FEN_DIO_PCIE BIT(5) 790#define FEN_DIO_PCIE BIT(5)
776#define FEN_PCIEA BIT(6) 791#define FEN_PCIEA BIT(6)
777#define FEN_PPLL BIT(7) 792#define FEN_PPLL BIT(7)
778#define FEN_PCIED BIT(8) 793#define FEN_PCIED BIT(8)
779#define FEN_DIOE BIT(9) 794#define FEN_DIOE BIT(9)
780#define FEN_CPUEN BIT(10) 795#define FEN_CPUEN BIT(10)
781#define FEN_DCORE BIT(11) 796#define FEN_DCORE BIT(11)
782#define FEN_ELDR BIT(12) 797#define FEN_ELDR BIT(12)
783#define FEN_DIO_RF BIT(13) 798#define FEN_DIO_RF BIT(13)
784#define FEN_HWPDN BIT(14) 799#define FEN_HWPDN BIT(14)
785#define FEN_MREGEN BIT(15) 800#define FEN_MREGEN BIT(15)
786 801
787#define PFM_LDALL BIT(0) 802#define PFM_LDALL BIT(0)
788#define PFM_ALDN BIT(1) 803#define PFM_ALDN BIT(1)
789#define PFM_LDKP BIT(2) 804#define PFM_LDKP BIT(2)
790#define PFM_WOWL BIT(3) 805#define PFM_WOWL BIT(3)
791#define ENPDN BIT(4) 806#define ENPDN BIT(4)
792#define PDN_PL BIT(5) 807#define PDN_PL BIT(5)
793#define APFM_ONMAC BIT(8) 808#define APFM_ONMAC BIT(8)
794#define APFM_OFF BIT(9) 809#define APFM_OFF BIT(9)
795#define APFM_RSM BIT(10) 810#define APFM_RSM BIT(10)
796#define AFSM_HSUS BIT(11) 811#define AFSM_HSUS BIT(11)
797#define AFSM_PCIE BIT(12) 812#define AFSM_PCIE BIT(12)
798#define APDM_MAC BIT(13) 813#define APDM_MAC BIT(13)
799#define APDM_HOST BIT(14) 814#define APDM_HOST BIT(14)
800#define APDM_HPDN BIT(15) 815#define APDM_HPDN BIT(15)
801#define RDY_MACON BIT(16) 816#define RDY_MACON BIT(16)
802#define SUS_HOST BIT(17) 817#define SUS_HOST BIT(17)
803#define ROP_ALD BIT(20) 818#define ROP_ALD BIT(20)
804#define ROP_PWR BIT(21) 819#define ROP_PWR BIT(21)
805#define ROP_SPS BIT(22) 820#define ROP_SPS BIT(22)
806#define SOP_MRST BIT(25) 821#define SOP_MRST BIT(25)
807#define SOP_FUSE BIT(26) 822#define SOP_FUSE BIT(26)
808#define SOP_ABG BIT(27) 823#define SOP_ABG BIT(27)
809#define SOP_AMB BIT(28) 824#define SOP_AMB BIT(28)
810#define SOP_RCK BIT(29) 825#define SOP_RCK BIT(29)
811#define SOP_A8M BIT(30) 826#define SOP_A8M BIT(30)
812#define XOP_BTCK BIT(31) 827#define XOP_BTCK BIT(31)
813 828
814#define ANAD16V_EN BIT(0) 829#define ANAD16V_EN BIT(0)
815#define ANA8M BIT(1) 830#define ANA8M BIT(1)
816#define MACSLP BIT(4) 831#define MACSLP BIT(4)
817#define LOADER_CLK_EN BIT(5) 832#define LOADER_CLK_EN BIT(5)
818#define _80M_SSC_DIS BIT(7) 833#define _80M_SSC_DIS BIT(7)
819#define _80M_SSC_EN_HO BIT(8) 834#define _80M_SSC_EN_HO BIT(8)
820#define PHY_SSC_RSTB BIT(9) 835#define PHY_SSC_RSTB BIT(9)
821#define SEC_CLK_EN BIT(10) 836#define SEC_CLK_EN BIT(10)
822#define MAC_CLK_EN BIT(11) 837#define MAC_CLK_EN BIT(11)
823#define SYS_CLK_EN BIT(12) 838#define SYS_CLK_EN BIT(12)
824#define RING_CLK_EN BIT(13) 839#define RING_CLK_EN BIT(13)
825 840
826#define BOOT_FROM_EEPROM BIT(4) 841#define BOOT_FROM_EEPROM BIT(4)
827#define EEPROM_EN BIT(5) 842#define EEPROM_EN BIT(5)
828 843
829#define AFE_BGEN BIT(0) 844#define AFE_BGEN BIT(0)
830#define AFE_MBEN BIT(1) 845#define AFE_MBEN BIT(1)
831#define MAC_ID_EN BIT(7) 846#define MAC_ID_EN BIT(7)
832 847
833#define WLOCK_ALL BIT(0) 848#define WLOCK_ALL BIT(0)
834#define WLOCK_00 BIT(1) 849#define WLOCK_00 BIT(1)
835#define WLOCK_04 BIT(2) 850#define WLOCK_04 BIT(2)
836#define WLOCK_08 BIT(3) 851#define WLOCK_08 BIT(3)
837#define WLOCK_40 BIT(4) 852#define WLOCK_40 BIT(4)
838#define R_DIS_PRST_0 BIT(5) 853#define R_DIS_PRST_0 BIT(5)
839#define R_DIS_PRST_1 BIT(6) 854#define R_DIS_PRST_1 BIT(6)
840#define LOCK_ALL_EN BIT(7) 855#define LOCK_ALL_EN BIT(7)
841 856
842#define RF_EN BIT(0) 857#define RF_EN BIT(0)
843#define RF_RSTB BIT(1) 858#define RF_RSTB BIT(1)
844#define RF_SDMRSTB BIT(2) 859#define RF_SDMRSTB BIT(2)
845 860
846#define LDA15_EN BIT(0) 861#define LDA15_EN BIT(0)
847#define LDA15_STBY BIT(1) 862#define LDA15_STBY BIT(1)
848#define LDA15_OBUF BIT(2) 863#define LDA15_OBUF BIT(2)
849#define LDA15_REG_VOS BIT(3) 864#define LDA15_REG_VOS BIT(3)
850#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) 865#define _LDA15_VOADJ(x) (((x) & 0x7) << 4)
851 866
852#define LDV12_EN BIT(0) 867#define LDV12_EN BIT(0)
853#define LDV12_SDBY BIT(1) 868#define LDV12_SDBY BIT(1)
854#define LPLDO_HSM BIT(2) 869#define LPLDO_HSM BIT(2)
855#define LPLDO_LSM_DIS BIT(3) 870#define LPLDO_LSM_DIS BIT(3)
856#define _LDV12_VADJ(x) (((x) & 0xF) << 4) 871#define _LDV12_VADJ(x) (((x) & 0xF) << 4)
857 872
858#define XTAL_EN BIT(0) 873#define XTAL_EN BIT(0)
859#define XTAL_BSEL BIT(1) 874#define XTAL_BSEL BIT(1)
860#define _XTAL_BOSC(x) (((x) & 0x3) << 2) 875#define _XTAL_BOSC(x) (((x) & 0x3) << 2)
861#define _XTAL_CADJ(x) (((x) & 0xF) << 4) 876#define _XTAL_CADJ(x) (((x) & 0xF) << 4)
862#define XTAL_GATE_USB BIT(8) 877#define XTAL_GATE_USB BIT(8)
@@ -871,145 +886,145 @@
871#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) 886#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21)
872#define _XTAL_GPIO(x) (((x) & 0x7) << 23) 887#define _XTAL_GPIO(x) (((x) & 0x7) << 23)
873 888
874#define CKDLY_AFE BIT(26) 889#define CKDLY_AFE BIT(26)
875#define CKDLY_USB BIT(27) 890#define CKDLY_USB BIT(27)
876#define CKDLY_DIG BIT(28) 891#define CKDLY_DIG BIT(28)
877#define CKDLY_BT BIT(29) 892#define CKDLY_BT BIT(29)
878 893
879#define APLL_EN BIT(0) 894#define APLL_EN BIT(0)
880#define APLL_320_EN BIT(1) 895#define APLL_320_EN BIT(1)
881#define APLL_FREF_SEL BIT(2) 896#define APLL_FREF_SEL BIT(2)
882#define APLL_EDGE_SEL BIT(3) 897#define APLL_EDGE_SEL BIT(3)
883#define APLL_WDOGB BIT(4) 898#define APLL_WDOGB BIT(4)
884#define APLL_LPFEN BIT(5) 899#define APLL_LPFEN BIT(5)
885 900
886#define APLL_REF_CLK_13MHZ 0x1 901#define APLL_REF_CLK_13MHZ 0x1
887#define APLL_REF_CLK_19_2MHZ 0x2 902#define APLL_REF_CLK_19_2MHZ 0x2
888#define APLL_REF_CLK_20MHZ 0x3 903#define APLL_REF_CLK_20MHZ 0x3
889#define APLL_REF_CLK_25MHZ 0x4 904#define APLL_REF_CLK_25MHZ 0x4
890#define APLL_REF_CLK_26MHZ 0x5 905#define APLL_REF_CLK_26MHZ 0x5
891#define APLL_REF_CLK_38_4MHZ 0x6 906#define APLL_REF_CLK_38_4MHZ 0x6
892#define APLL_REF_CLK_40MHZ 0x7 907#define APLL_REF_CLK_40MHZ 0x7
893 908
894#define APLL_320EN BIT(14) 909#define APLL_320EN BIT(14)
895#define APLL_80EN BIT(15) 910#define APLL_80EN BIT(15)
896#define APLL_1MEN BIT(24) 911#define APLL_1MEN BIT(24)
897 912
898#define ALD_EN BIT(18) 913#define ALD_EN BIT(18)
899#define EF_PD BIT(19) 914#define EF_PD BIT(19)
900#define EF_FLAG BIT(31) 915#define EF_FLAG BIT(31)
901 916
902#define EF_TRPT BIT(7) 917#define EF_TRPT BIT(7)
903#define LDOE25_EN BIT(31) 918#define LDOE25_EN BIT(31)
904 919
905#define RSM_EN BIT(0) 920#define RSM_EN BIT(0)
906#define TIMER_EN BIT(4) 921#define TIMER_EN BIT(4)
907 922
908#define TRSW0EN BIT(2) 923#define TRSW0EN BIT(2)
909#define TRSW1EN BIT(3) 924#define TRSW1EN BIT(3)
910#define EROM_EN BIT(4) 925#define EROM_EN BIT(4)
911#define ENBT BIT(5) 926#define ENBT BIT(5)
912#define ENUART BIT(8) 927#define ENUART BIT(8)
913#define UART_910 BIT(9) 928#define UART_910 BIT(9)
914#define ENPMAC BIT(10) 929#define ENPMAC BIT(10)
915#define SIC_SWRST BIT(11) 930#define SIC_SWRST BIT(11)
916#define ENSIC BIT(12) 931#define ENSIC BIT(12)
917#define SIC_23 BIT(13) 932#define SIC_23 BIT(13)
918#define ENHDP BIT(14) 933#define ENHDP BIT(14)
919#define SIC_LBK BIT(15) 934#define SIC_LBK BIT(15)
920 935
921#define LED0PL BIT(4) 936#define LED0PL BIT(4)
922#define LED1PL BIT(12) 937#define LED1PL BIT(12)
923#define LED0DIS BIT(7) 938#define LED0DIS BIT(7)
924 939
925#define MCUFWDL_EN BIT(0) 940#define MCUFWDL_EN BIT(0)
926#define MCUFWDL_RDY BIT(1) 941#define MCUFWDL_RDY BIT(1)
927#define FWDL_CHKSUM_RPT BIT(2) 942#define FWDL_CHKSUM_RPT BIT(2)
928#define MACINI_RDY BIT(3) 943#define MACINI_RDY BIT(3)
929#define BBINI_RDY BIT(4) 944#define BBINI_RDY BIT(4)
930#define RFINI_RDY BIT(5) 945#define RFINI_RDY BIT(5)
931#define WINTINI_RDY BIT(6) 946#define WINTINI_RDY BIT(6)
932#define CPRST BIT(23) 947#define CPRST BIT(23)
933 948
934#define XCLK_VLD BIT(0) 949#define XCLK_VLD BIT(0)
935#define ACLK_VLD BIT(1) 950#define ACLK_VLD BIT(1)
936#define UCLK_VLD BIT(2) 951#define UCLK_VLD BIT(2)
937#define PCLK_VLD BIT(3) 952#define PCLK_VLD BIT(3)
938#define PCIRSTB BIT(4) 953#define PCIRSTB BIT(4)
939#define V15_VLD BIT(5) 954#define V15_VLD BIT(5)
940#define TRP_B15V_EN BIT(7) 955#define TRP_B15V_EN BIT(7)
941#define SIC_IDLE BIT(8) 956#define SIC_IDLE BIT(8)
942#define BD_MAC2 BIT(9) 957#define BD_MAC2 BIT(9)
943#define BD_MAC1 BIT(10) 958#define BD_MAC1 BIT(10)
944#define IC_MACPHY_MODE BIT(11) 959#define IC_MACPHY_MODE BIT(11)
945#define VENDOR_ID BIT(19) 960#define VENDOR_ID BIT(19)
946#define PAD_HWPD_IDN BIT(22) 961#define PAD_HWPD_IDN BIT(22)
947#define TRP_VAUX_EN BIT(23) 962#define TRP_VAUX_EN BIT(23)
948#define TRP_BT_EN BIT(24) 963#define TRP_BT_EN BIT(24)
949#define BD_PKG_SEL BIT(25) 964#define BD_PKG_SEL BIT(25)
950#define BD_HCI_SEL BIT(26) 965#define BD_HCI_SEL BIT(26)
951#define TYPE_ID BIT(27) 966#define TYPE_ID BIT(27)
952 967
953#define CHIP_VER_RTL_MASK 0xF000 968#define CHIP_VER_RTL_MASK 0xF000
954#define CHIP_VER_RTL_SHIFT 12 969#define CHIP_VER_RTL_SHIFT 12
955 970
956#define REG_LBMODE (REG_CR + 3) 971#define REG_LBMODE (REG_CR + 3)
957 972
958#define HCI_TXDMA_EN BIT(0) 973#define HCI_TXDMA_EN BIT(0)
959#define HCI_RXDMA_EN BIT(1) 974#define HCI_RXDMA_EN BIT(1)
960#define TXDMA_EN BIT(2) 975#define TXDMA_EN BIT(2)
961#define RXDMA_EN BIT(3) 976#define RXDMA_EN BIT(3)
962#define PROTOCOL_EN BIT(4) 977#define PROTOCOL_EN BIT(4)
963#define SCHEDULE_EN BIT(5) 978#define SCHEDULE_EN BIT(5)
964#define MACTXEN BIT(6) 979#define MACTXEN BIT(6)
965#define MACRXEN BIT(7) 980#define MACRXEN BIT(7)
966#define ENSWBCN BIT(8) 981#define ENSWBCN BIT(8)
967#define ENSEC BIT(9) 982#define ENSEC BIT(9)
968 983
969#define _NETTYPE(x) (((x) & 0x3) << 16) 984#define _NETTYPE(x) (((x) & 0x3) << 16)
970#define MASK_NETTYPE 0x30000 985#define MASK_NETTYPE 0x30000
971#define NT_NO_LINK 0x0 986#define NT_NO_LINK 0x0
972#define NT_LINK_AD_HOC 0x1 987#define NT_LINK_AD_HOC 0x1
973#define NT_LINK_AP 0x2 988#define NT_LINK_AP 0x2
974#define NT_AS_AP 0x3 989#define NT_AS_AP 0x3
975 990
976#define _LBMODE(x) (((x) & 0xF) << 24) 991#define _LBMODE(x) (((x) & 0xF) << 24)
977#define MASK_LBMODE 0xF000000 992#define MASK_LBMODE 0xF000000
978#define LOOPBACK_NORMAL 0x0 993#define LOOPBACK_NORMAL 0x0
979#define LOOPBACK_IMMEDIATELY 0xB 994#define LOOPBACK_IMMEDIATELY 0xB
980#define LOOPBACK_MAC_DELAY 0x3 995#define LOOPBACK_MAC_DELAY 0x3
981#define LOOPBACK_PHY 0x1 996#define LOOPBACK_PHY 0x1
982#define LOOPBACK_DMA 0x7 997#define LOOPBACK_DMA 0x7
983 998
984#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) 999#define GET_RX_PAGE_SIZE(value) ((value) & 0xF)
985#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) 1000#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4)
986#define _PSRX_MASK 0xF 1001#define _PSRX_MASK 0xF
987#define _PSTX_MASK 0xF0 1002#define _PSTX_MASK 0xF0
988#define _PSRX(x) (x) 1003#define _PSRX(x) (x)
989#define _PSTX(x) ((x) << 4) 1004#define _PSTX(x) ((x) << 4)
990 1005
991#define PBP_64 0x0 1006#define PBP_64 0x0
992#define PBP_128 0x1 1007#define PBP_128 0x1
993#define PBP_256 0x2 1008#define PBP_256 0x2
994#define PBP_512 0x3 1009#define PBP_512 0x3
995#define PBP_1024 0x4 1010#define PBP_1024 0x4
996 1011
997#define RXDMA_ARBBW_EN BIT(0) 1012#define RXDMA_ARBBW_EN BIT(0)
998#define RXSHFT_EN BIT(1) 1013#define RXSHFT_EN BIT(1)
999#define RXDMA_AGG_EN BIT(2) 1014#define RXDMA_AGG_EN BIT(2)
1000#define QS_VO_QUEUE BIT(8) 1015#define QS_VO_QUEUE BIT(8)
1001#define QS_VI_QUEUE BIT(9) 1016#define QS_VI_QUEUE BIT(9)
1002#define QS_BE_QUEUE BIT(10) 1017#define QS_BE_QUEUE BIT(10)
1003#define QS_BK_QUEUE BIT(11) 1018#define QS_BK_QUEUE BIT(11)
1004#define QS_MANAGER_QUEUE BIT(12) 1019#define QS_MANAGER_QUEUE BIT(12)
1005#define QS_HIGH_QUEUE BIT(13) 1020#define QS_HIGH_QUEUE BIT(13)
1006 1021
1007#define HQSEL_VOQ BIT(0) 1022#define HQSEL_VOQ BIT(0)
1008#define HQSEL_VIQ BIT(1) 1023#define HQSEL_VIQ BIT(1)
1009#define HQSEL_BEQ BIT(2) 1024#define HQSEL_BEQ BIT(2)
1010#define HQSEL_BKQ BIT(3) 1025#define HQSEL_BKQ BIT(3)
1011#define HQSEL_MGTQ BIT(4) 1026#define HQSEL_MGTQ BIT(4)
1012#define HQSEL_HIQ BIT(5) 1027#define HQSEL_HIQ BIT(5)
1013 1028
1014#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) 1029#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14)
1015#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) 1030#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12)
@@ -1018,9 +1033,9 @@
1018#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6) 1033#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6)
1019#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4) 1034#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4)
1020 1035
1021#define QUEUE_LOW 1 1036#define QUEUE_LOW 1
1022#define QUEUE_NORMAL 2 1037#define QUEUE_NORMAL 2
1023#define QUEUE_HIGH 3 1038#define QUEUE_HIGH 3
1024 1039
1025#define _LLT_NO_ACTIVE 0x0 1040#define _LLT_NO_ACTIVE 0x0
1026#define _LLT_WRITE_ACCESS 0x1 1041#define _LLT_WRITE_ACCESS 0x1
@@ -1028,25 +1043,25 @@
1028 1043
1029#define _LLT_INIT_DATA(x) ((x) & 0xFF) 1044#define _LLT_INIT_DATA(x) ((x) & 0xFF)
1030#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) 1045#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8)
1031#define _LLT_OP(x) (((x) & 0x3) << 30) 1046#define _LLT_OP(x) (((x) & 0x3) << 30)
1032#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) 1047#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3)
1033 1048
1034#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) 1049#define BB_WRITE_READ_MASK (BIT(31) | BIT(30))
1035#define BB_WRITE_EN BIT(30) 1050#define BB_WRITE_EN BIT(30)
1036#define BB_READ_EN BIT(31) 1051#define BB_READ_EN BIT(31)
1037 1052
1038#define _HPQ(x) ((x) & 0xFF) 1053#define _HPQ(x) ((x) & 0xFF)
1039#define _LPQ(x) (((x) & 0xFF) << 8) 1054#define _LPQ(x) (((x) & 0xFF) << 8)
1040#define _PUBQ(x) (((x) & 0xFF) << 16) 1055#define _PUBQ(x) (((x) & 0xFF) << 16)
1041#define _NPQ(x) ((x) & 0xFF) 1056#define _NPQ(x) ((x) & 0xFF)
1042 1057
1043#define HPQ_PUBLIC_DIS BIT(24) 1058#define HPQ_PUBLIC_DIS BIT(24)
1044#define LPQ_PUBLIC_DIS BIT(25) 1059#define LPQ_PUBLIC_DIS BIT(25)
1045#define LD_RQPN BIT(31) 1060#define LD_RQPN BIT(31)
1046 1061
1047#define BCN_VALID BIT(16) 1062#define BCN_VALID BIT(16)
1048#define BCN_HEAD(x) (((x) & 0xFF) << 8) 1063#define BCN_HEAD(x) (((x) & 0xFF) << 8)
1049#define BCN_HEAD_MASK 0xFF00 1064#define BCN_HEAD_MASK 0xFF00
1050 1065
1051#define BLK_DESC_NUM_SHIFT 4 1066#define BLK_DESC_NUM_SHIFT 4
1052#define BLK_DESC_NUM_MASK 0xF 1067#define BLK_DESC_NUM_MASK 0xF
@@ -1066,9 +1081,9 @@
1066 1081
1067#define _RRSR_RSC(x) (((x) & 0x3) << 21) 1082#define _RRSR_RSC(x) (((x) & 0x3) << 21)
1068#define RRSR_RSC_RESERVED 0x0 1083#define RRSR_RSC_RESERVED 0x0
1069#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 1084#define RRSR_RSC_UPPER_SUBCHANNEL 0x1
1070#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 1085#define RRSR_RSC_LOWER_SUBCHANNEL 0x2
1071#define RRSR_RSC_DUPLICATE_MODE 0x3 1086#define RRSR_RSC_DUPLICATE_MODE 0x3
1072 1087
1073#define USE_SHORT_G1 BIT(20) 1088#define USE_SHORT_G1 BIT(20)
1074 1089
@@ -1081,8 +1096,8 @@
1081#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) 1096#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24)
1082#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) 1097#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28)
1083 1098
1084#define RETRY_LIMIT_SHORT_SHIFT 8 1099#define RETRY_LIMIT_SHORT_SHIFT 8
1085#define RETRY_LIMIT_LONG_SHIFT 0 1100#define RETRY_LIMIT_LONG_SHIFT 0
1086 1101
1087#define _DARF_RC1(x) ((x) & 0x1F) 1102#define _DARF_RC1(x) ((x) & 0x1F)
1088#define _DARF_RC2(x) (((x) & 0x1F) << 8) 1103#define _DARF_RC2(x) (((x) & 0x1F) << 8)
@@ -1102,20 +1117,20 @@
1102#define _RARF_RC7(x) (((x) & 0x1F) << 16) 1117#define _RARF_RC7(x) (((x) & 0x1F) << 16)
1103#define _RARF_RC8(x) (((x) & 0x1F) << 24) 1118#define _RARF_RC8(x) (((x) & 0x1F) << 24)
1104 1119
1105#define AC_PARAM_TXOP_LIMIT_OFFSET 16 1120#define AC_PARAM_TXOP_LIMIT_OFFSET 16
1106#define AC_PARAM_ECW_MAX_OFFSET 12 1121#define AC_PARAM_ECW_MAX_OFFSET 12
1107#define AC_PARAM_ECW_MIN_OFFSET 8 1122#define AC_PARAM_ECW_MIN_OFFSET 8
1108#define AC_PARAM_AIFS_OFFSET 0 1123#define AC_PARAM_AIFS_OFFSET 0
1109 1124
1110#define _AIFS(x) (x) 1125#define _AIFS(x) (x)
1111#define _ECW_MAX_MIN(x) ((x) << 8) 1126#define _ECW_MAX_MIN(x) ((x) << 8)
1112#define _TXOP_LIMIT(x) ((x) << 16) 1127#define _TXOP_LIMIT(x) ((x) << 16)
1113 1128
1114#define _BCNIFS(x) ((x) & 0xFF) 1129#define _BCNIFS(x) ((x) & 0xFF)
1115#define _BCNECW(x) ((((x) & 0xF)) << 8) 1130#define _BCNECW(x) ((((x) & 0xF)) << 8)
1116 1131
1117#define _LRL(x) ((x) & 0x3F) 1132#define _LRL(x) ((x) & 0x3F)
1118#define _SRL(x) (((x) & 0x3F) << 8) 1133#define _SRL(x) (((x) & 0x3F) << 8)
1119 1134
1120#define _SIFS_CCK_CTX(x) ((x) & 0xFF) 1135#define _SIFS_CCK_CTX(x) ((x) & 0xFF)
1121#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); 1136#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8);
@@ -1123,102 +1138,102 @@
1123#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) 1138#define _SIFS_OFDM_CTX(x) ((x) & 0xFF)
1124#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); 1139#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8);
1125 1140
1126#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) 1141#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8)
1127 1142
1128#define DIS_EDCA_CNT_DWN BIT(11) 1143#define DIS_EDCA_CNT_DWN BIT(11)
1129 1144
1130#define EN_MBSSID BIT(1) 1145#define EN_MBSSID BIT(1)
1131#define EN_TXBCN_RPT BIT(2) 1146#define EN_TXBCN_RPT BIT(2)
1132#define EN_BCN_FUNCTION BIT(3) 1147#define EN_BCN_FUNCTION BIT(3)
1133 1148
1134#define TSFTR_RST BIT(0) 1149#define TSFTR_RST BIT(0)
1135#define TSFTR1_RST BIT(1) 1150#define TSFTR1_RST BIT(1)
1136 1151
1137#define STOP_BCNQ BIT(6) 1152#define STOP_BCNQ BIT(6)
1138 1153
1139#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) 1154#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4)
1140#define DIS_TSF_UDT0_TEST_CHIP BIT(5) 1155#define DIS_TSF_UDT0_TEST_CHIP BIT(5)
1141 1156
1142#define ACMHW_HWEN BIT(0) 1157#define ACMHW_HWEN BIT(0)
1143#define ACMHW_BEQEN BIT(1) 1158#define ACMHW_BEQEN BIT(1)
1144#define ACMHW_VIQEN BIT(2) 1159#define ACMHW_VIQEN BIT(2)
1145#define ACMHW_VOQEN BIT(3) 1160#define ACMHW_VOQEN BIT(3)
1146#define ACMHW_BEQSTATUS BIT(4) 1161#define ACMHW_BEQSTATUS BIT(4)
1147#define ACMHW_VIQSTATUS BIT(5) 1162#define ACMHW_VIQSTATUS BIT(5)
1148#define ACMHW_VOQSTATUS BIT(6) 1163#define ACMHW_VOQSTATUS BIT(6)
1149 1164
1150#define APSDOFF BIT(6) 1165#define APSDOFF BIT(6)
1151#define APSDOFF_STATUS BIT(7) 1166#define APSDOFF_STATUS BIT(7)
1152 1167
1153#define BW_20MHZ BIT(2) 1168#define BW_20MHZ BIT(2)
1154 1169
1155#define RATE_BITMAP_ALL 0xFFFFF 1170#define RATE_BITMAP_ALL 0xFFFFF
1156 1171
1157#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 1172#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1
1158 1173
1159#define TSFRST BIT(0) 1174#define TSFRST BIT(0)
1160#define DIS_GCLK BIT(1) 1175#define DIS_GCLK BIT(1)
1161#define PAD_SEL BIT(2) 1176#define PAD_SEL BIT(2)
1162#define PWR_ST BIT(6) 1177#define PWR_ST BIT(6)
1163#define PWRBIT_OW_EN BIT(7) 1178#define PWRBIT_OW_EN BIT(7)
1164#define ACRC BIT(8) 1179#define ACRC BIT(8)
1165#define CFENDFORM BIT(9) 1180#define CFENDFORM BIT(9)
1166#define ICV BIT(10) 1181#define ICV BIT(10)
1167 1182
1168#define AAP BIT(0) 1183#define AAP BIT(0)
1169#define APM BIT(1) 1184#define APM BIT(1)
1170#define AM BIT(2) 1185#define AM BIT(2)
1171#define AB BIT(3) 1186#define AB BIT(3)
1172#define ADD3 BIT(4) 1187#define ADD3 BIT(4)
1173#define APWRMGT BIT(5) 1188#define APWRMGT BIT(5)
1174#define CBSSID BIT(6) 1189#define CBSSID BIT(6)
1175#define CBSSID_DATA BIT(6) 1190#define CBSSID_DATA BIT(6)
1176#define CBSSID_BCN BIT(7) 1191#define CBSSID_BCN BIT(7)
1177#define ACRC32 BIT(8) 1192#define ACRC32 BIT(8)
1178#define AICV BIT(9) 1193#define AICV BIT(9)
1179#define ADF BIT(11) 1194#define ADF BIT(11)
1180#define ACF BIT(12) 1195#define ACF BIT(12)
1181#define AMF BIT(13) 1196#define AMF BIT(13)
1182#define HTC_LOC_CTRL BIT(14) 1197#define HTC_LOC_CTRL BIT(14)
1183#define UC_DATA_EN BIT(16) 1198#define UC_DATA_EN BIT(16)
1184#define BM_DATA_EN BIT(17) 1199#define BM_DATA_EN BIT(17)
1185#define MFBEN BIT(22) 1200#define MFBEN BIT(22)
1186#define LSIGEN BIT(23) 1201#define LSIGEN BIT(23)
1187#define ENMBID BIT(24) 1202#define ENMBID BIT(24)
1188#define APP_BASSN BIT(27) 1203#define APP_BASSN BIT(27)
1189#define APP_PHYSTS BIT(28) 1204#define APP_PHYSTS BIT(28)
1190#define APP_ICV BIT(29) 1205#define APP_ICV BIT(29)
1191#define APP_MIC BIT(30) 1206#define APP_MIC BIT(30)
1192#define APP_FCS BIT(31) 1207#define APP_FCS BIT(31)
1193 1208
1194#define _MIN_SPACE(x) ((x) & 0x7) 1209#define _MIN_SPACE(x) ((x) & 0x7)
1195#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) 1210#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
1196 1211
1197#define RXERR_TYPE_OFDM_PPDU 0 1212#define RXERR_TYPE_OFDM_PPDU 0
1198#define RXERR_TYPE_OFDM_FALSE_ALARM 1 1213#define RXERR_TYPE_OFDM_FALSE_ALARM 1
1199#define RXERR_TYPE_OFDM_MPDU_OK 2 1214#define RXERR_TYPE_OFDM_MPDU_OK 2
1200#define RXERR_TYPE_OFDM_MPDU_FAIL 3 1215#define RXERR_TYPE_OFDM_MPDU_FAIL 3
1201#define RXERR_TYPE_CCK_PPDU 4 1216#define RXERR_TYPE_CCK_PPDU 4
1202#define RXERR_TYPE_CCK_FALSE_ALARM 5 1217#define RXERR_TYPE_CCK_FALSE_ALARM 5
1203#define RXERR_TYPE_CCK_MPDU_OK 6 1218#define RXERR_TYPE_CCK_MPDU_OK 6
1204#define RXERR_TYPE_CCK_MPDU_FAIL 7 1219#define RXERR_TYPE_CCK_MPDU_FAIL 7
1205#define RXERR_TYPE_HT_PPDU 8 1220#define RXERR_TYPE_HT_PPDU 8
1206#define RXERR_TYPE_HT_FALSE_ALARM 9 1221#define RXERR_TYPE_HT_FALSE_ALARM 9
1207#define RXERR_TYPE_HT_MPDU_TOTAL 10 1222#define RXERR_TYPE_HT_MPDU_TOTAL 10
1208#define RXERR_TYPE_HT_MPDU_OK 11 1223#define RXERR_TYPE_HT_MPDU_OK 11
1209#define RXERR_TYPE_HT_MPDU_FAIL 12 1224#define RXERR_TYPE_HT_MPDU_FAIL 12
1210#define RXERR_TYPE_RX_FULL_DROP 15 1225#define RXERR_TYPE_RX_FULL_DROP 15
1211 1226
1212#define RXERR_COUNTER_MASK 0xFFFFF 1227#define RXERR_COUNTER_MASK 0xFFFFF
1213#define RXERR_RPT_RST BIT(27) 1228#define RXERR_RPT_RST BIT(27)
1214#define _RXERR_RPT_SEL(type) ((type) << 28) 1229#define _RXERR_RPT_SEL(type) ((type) << 28)
1215 1230
1216#define SCR_TXUSEDK BIT(0) 1231#define SCR_TXUSEDK BIT(0)
1217#define SCR_RXUSEDK BIT(1) 1232#define SCR_RXUSEDK BIT(1)
1218#define SCR_TXENCENABLE BIT(2) 1233#define SCR_TXENCENABLE BIT(2)
1219#define SCR_RXDECENABLE BIT(3) 1234#define SCR_RXDECENABLE BIT(3)
1220#define SCR_SKBYA2 BIT(4) 1235#define SCR_SKBYA2 BIT(4)
1221#define SCR_NOSKMC BIT(5) 1236#define SCR_NOSKMC BIT(5)
1222#define SCR_TXBCUSEDK BIT(6) 1237#define SCR_TXBCUSEDK BIT(6)
1223#define SCR_RXBCUSEDK BIT(7) 1238#define SCR_RXBCUSEDK BIT(7)
1224 1239
@@ -1226,32 +1241,32 @@
1226#define USB_IS_FULL_SPEED 1 1241#define USB_IS_FULL_SPEED 1
1227#define USB_SPEED_MASK BIT(5) 1242#define USB_SPEED_MASK BIT(5)
1228 1243
1229#define USB_NORMAL_SIE_EP_MASK 0xF 1244#define USB_NORMAL_SIE_EP_MASK 0xF
1230#define USB_NORMAL_SIE_EP_SHIFT 4 1245#define USB_NORMAL_SIE_EP_SHIFT 4
1231 1246
1232#define USB_TEST_EP_MASK 0x30 1247#define USB_TEST_EP_MASK 0x30
1233#define USB_TEST_EP_SHIFT 4 1248#define USB_TEST_EP_SHIFT 4
1234 1249
1235#define USB_AGG_EN BIT(3) 1250#define USB_AGG_EN BIT(3)
1236 1251
1237#define MAC_ADDR_LEN 6 1252#define MAC_ADDR_LEN 6
1238#define LAST_ENTRY_OF_TX_PKT_BUFFER 175/*255 88e*/ 1253#define LAST_ENTRY_OF_TX_PKT_BUFFER 175/*255 88e*/
1239 1254
1240#define POLLING_LLT_THRESHOLD 20 1255#define POLLING_LLT_THRESHOLD 20
1241#define POLLING_READY_TIMEOUT_COUNT 3000 1256#define POLLING_READY_TIMEOUT_COUNT 3000
1242 1257
1243#define MAX_MSS_DENSITY_2T 0x13 1258#define MAX_MSS_DENSITY_2T 0x13
1244#define MAX_MSS_DENSITY_1T 0x0A 1259#define MAX_MSS_DENSITY_1T 0x0A
1245 1260
1246#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6)) 1261#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6))
1247#define EPROM_CMD_CONFIG 0x3 1262#define EPROM_CMD_CONFIG 0x3
1248#define EPROM_CMD_LOAD 1 1263#define EPROM_CMD_LOAD 1
1249 1264
1250#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE 1265#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE
1251 1266
1252#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2) 1267#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2)
1253 1268
1254#define RPMAC_RESET 0x100 1269#define RPMAC_RESET 0x100
1255#define RPMAC_TXSTART 0x104 1270#define RPMAC_TXSTART 0x104
1256#define RPMAC_TXLEGACYSIG 0x108 1271#define RPMAC_TXLEGACYSIG 0x108
1257#define RPMAC_TXHTSIG1 0x10c 1272#define RPMAC_TXHTSIG1 0x10c
@@ -1267,12 +1282,12 @@
1267#define RPMAC_TXMACHEADER5 0x134 1282#define RPMAC_TXMACHEADER5 0x134
1268#define RPMAC_TXDADATYPE 0x138 1283#define RPMAC_TXDADATYPE 0x138
1269#define RPMAC_TXRANDOMSEED 0x13c 1284#define RPMAC_TXRANDOMSEED 0x13c
1270#define RPMAC_CCKPLCPPREAMBLE 0x140 1285#define RPMAC_CCKPLCPPREAMBLE 0x140
1271#define RPMAC_CCKPLCPHEADER 0x144 1286#define RPMAC_CCKPLCPHEADER 0x144
1272#define RPMAC_CCKCRC16 0x148 1287#define RPMAC_CCKCRC16 0x148
1273#define RPMAC_OFDMRXCRC32OK 0x170 1288#define RPMAC_OFDMRXCRC32OK 0x170
1274#define RPMAC_OFDMRXCRC32Er 0x174 1289#define RPMAC_OFDMRXCRC32ER 0x174
1275#define RPMAC_OFDMRXPARITYER 0x178 1290#define RPMAC_OFDMRXPARITYER 0x178
1276#define RPMAC_OFDMRXCRC8ER 0x17c 1291#define RPMAC_OFDMRXCRC8ER 0x17c
1277#define RPMAC_CCKCRXRC16ER 0x180 1292#define RPMAC_CCKCRXRC16ER 0x180
1278#define RPMAC_CCKCRXRC32ER 0x184 1293#define RPMAC_CCKCRXRC32ER 0x184
@@ -1289,45 +1304,45 @@
1289#define RFPGA0_RFTIMING1 0x810 1304#define RFPGA0_RFTIMING1 0x810
1290#define RFPGA0_RFTIMING2 0x814 1305#define RFPGA0_RFTIMING2 0x814
1291 1306
1292#define RFPGA0_XA_HSSIPARAMETER1 0x820 1307#define RFPGA0_XA_HSSIPARAMETER1 0x820
1293#define RFPGA0_XA_HSSIPARAMETER2 0x824 1308#define RFPGA0_XA_HSSIPARAMETER2 0x824
1294#define RFPGA0_XB_HSSIPARAMETER1 0x828 1309#define RFPGA0_XB_HSSIPARAMETER1 0x828
1295#define RFPGA0_XB_HSSIPARAMETER2 0x82c 1310#define RFPGA0_XB_HSSIPARAMETER2 0x82c
1296 1311
1297#define RFPGA0_XA_LSSIPARAMETER 0x840 1312#define RFPGA0_XA_LSSIPARAMETER 0x840
1298#define RFPGA0_XB_LSSIPARAMETER 0x844 1313#define RFPGA0_XB_LSSIPARAMETER 0x844
1299 1314
1300#define RFPGA0_RFWAKEUPPARAMETER 0x850 1315#define RFPGA0_RFWAKEUPPARAMETER 0x850
1301#define RFPGA0_RFSLEEPUPPARAMETER 0x854 1316#define RFPGA0_RFSLEEPUPPARAMETER 0x854
1302 1317
1303#define RFPGA0_XAB_SWITCHCONTROL 0x858 1318#define RFPGA0_XAB_SWITCHCONTROL 0x858
1304#define RFPGA0_XCD_SWITCHCONTROL 0x85c 1319#define RFPGA0_XCD_SWITCHCONTROL 0x85c
1305 1320
1306#define RFPGA0_XA_RFINTERFACEOE 0x860 1321#define RFPGA0_XA_RFINTERFACEOE 0x860
1307#define RFPGA0_XB_RFINTERFACEOE 0x864 1322#define RFPGA0_XB_RFINTERFACEOE 0x864
1308 1323
1309#define RFPGA0_XAB_RFINTERFACESW 0x870 1324#define RFPGA0_XAB_RFINTERFACESW 0x870
1310#define RFPGA0_XCD_RFINTERFACESW 0x874 1325#define RFPGA0_XCD_RFINTERFACESW 0x874
1311 1326
1312#define rFPGA0_XAB_RFPARAMETER 0x878 1327#define RFPGA0_XAB_RFPARAMETER 0x878
1313#define rFPGA0_XCD_RFPARAMETER 0x87c 1328#define RFPGA0_XCD_RFPARAMETER 0x87c
1314 1329
1315#define RFPGA0_ANALOGPARAMETER1 0x880 1330#define RFPGA0_ANALOGPARAMETER1 0x880
1316#define RFPGA0_ANALOGPARAMETER2 0x884 1331#define RFPGA0_ANALOGPARAMETER2 0x884
1317#define RFPGA0_ANALOGPARAMETER3 0x888 1332#define RFPGA0_ANALOGPARAMETER3 0x888
1318#define RFPGA0_ANALOGPARAMETER4 0x88c 1333#define RFPGA0_ANALOGPARAMETER4 0x88c
1319 1334
1320#define RFPGA0_XA_LSSIREADBACK 0x8a0 1335#define RFPGA0_XA_LSSIREADBACK 0x8a0
1321#define RFPGA0_XB_LSSIREADBACK 0x8a4 1336#define RFPGA0_XB_LSSIREADBACK 0x8a4
1322#define RFPGA0_XC_LSSIREADBACK 0x8a8 1337#define RFPGA0_XC_LSSIREADBACK 0x8a8
1323#define RFPGA0_XD_LSSIREADBACK 0x8ac 1338#define RFPGA0_XD_LSSIREADBACK 0x8ac
1324 1339
1325#define RFPGA0_PSDREPORT 0x8b4 1340#define RFPGA0_PSDREPORT 0x8b4
1326#define TRANSCEIVEA_HSPI_READBACK 0x8b8 1341#define TRANSCEIVEA_HSPI_READBACK 0x8b8
1327#define TRANSCEIVEB_HSPI_READBACK 0x8bc 1342#define TRANSCEIVEB_HSPI_READBACK 0x8bc
1328#define REG_SC_CNT 0x8c4 1343#define REG_SC_CNT 0x8c4
1329#define RFPGA0_XAB_RFINTERFACERB 0x8e0 1344#define RFPGA0_XAB_RFINTERFACERB 0x8e0
1330#define RFPGA0_XCD_RFINTERFACERB 0x8e4 1345#define RFPGA0_XCD_RFINTERFACERB 0x8e4
1331 1346
1332#define RFPGA1_RFMOD 0x900 1347#define RFPGA1_RFMOD 0x900
1333 1348
@@ -1338,12 +1353,12 @@
1338#define RCCK0_SYSTEM 0xa00 1353#define RCCK0_SYSTEM 0xa00
1339 1354
1340#define RCCK0_AFESETTING 0xa04 1355#define RCCK0_AFESETTING 0xa04
1341#define RCCK0_CCA 0xa08 1356#define RCCK0_CCA 0xa08
1342 1357
1343#define RCCK0_RXAGC1 0xa0c 1358#define RCCK0_RXAGC1 0xa0c
1344#define RCCK0_RXAGC2 0xa10 1359#define RCCK0_RXAGC2 0xa10
1345 1360
1346#define RCCK0_RXHP 0xa14 1361#define RCCK0_RXHP 0xa14
1347 1362
1348#define RCCK0_DSPPARAMETER1 0xa18 1363#define RCCK0_DSPPARAMETER1 0xa18
1349#define RCCK0_DSPPARAMETER2 0xa1c 1364#define RCCK0_DSPPARAMETER2 0xa1c
@@ -1351,75 +1366,74 @@
1351#define RCCK0_TXFILTER1 0xa20 1366#define RCCK0_TXFILTER1 0xa20
1352#define RCCK0_TXFILTER2 0xa24 1367#define RCCK0_TXFILTER2 0xa24
1353#define RCCK0_DEBUGPORT 0xa28 1368#define RCCK0_DEBUGPORT 0xa28
1354#define RCCK0_FALSEALARMREPORT 0xa2c 1369#define RCCK0_FALSEALARMREPORT 0xa2c
1355#define RCCK0_TRSSIREPORT 0xa50 1370#define RCCK0_TRSSIREPORT 0xa50
1356#define RCCK0_RXREPORT 0xa54 1371#define RCCK0_RXREPORT 0xa54
1357#define RCCK0_FACOUNTERLOWER 0xa5c 1372#define RCCK0_FACOUNTERLOWER 0xa5c
1358#define RCCK0_FACOUNTERUPPER 0xa58 1373#define RCCK0_FACOUNTERUPPER 0xa58
1359#define RCCK0_CCA_CNT 0xa60 1374#define RCCK0_CCA_CNT 0xa60
1360
1361 1375
1362/* PageB(0xB00) */ 1376/* PageB(0xB00) */
1363#define RPDP_ANTA 0xb00 1377#define RPDP_ANTA 0xb00
1364#define RPDP_ANTA_4 0xb04 1378#define RPDP_ANTA_4 0xb04
1365#define RPDP_ANTA_8 0xb08 1379#define RPDP_ANTA_8 0xb08
1366#define RPDP_ANTA_C 0xb0c 1380#define RPDP_ANTA_C 0xb0c
1367#define RPDP_ANTA_10 0xb10 1381#define RPDP_ANTA_10 0xb10
1368#define RPDP_ANTA_14 0xb14 1382#define RPDP_ANTA_14 0xb14
1369#define RPDP_ANTA_18 0xb18 1383#define RPDP_ANTA_18 0xb18
1370#define RPDP_ANTA_1C 0xb1c 1384#define RPDP_ANTA_1C 0xb1c
1371#define RPDP_ANTA_20 0xb20 1385#define RPDP_ANTA_20 0xb20
1372#define RPDP_ANTA_24 0xb24 1386#define RPDP_ANTA_24 0xb24
1373 1387
1374#define RCONFIG_PMPD_ANTA 0xb28 1388#define RCONFIG_PMPD_ANTA 0xb28
1375#define RCONFIG_RAM64X16 0xb2c 1389#define RCONFIG_RAM64x16 0xb2c
1376 1390
1377#define RBNDA 0xb30 1391#define RBNDA 0xb30
1378#define RHSSIPAR 0xb34 1392#define RHSSIPAR 0xb34
1379 1393
1380#define RCONFIG_ANTA 0xb68 1394#define RCONFIG_ANTA 0xb68
1381#define RCONFIG_ANTB 0xb6c 1395#define RCONFIG_ANTB 0xb6c
1382 1396
1383#define RPDP_ANTB 0xb70 1397#define RPDP_ANTB 0xb70
1384#define RPDP_ANTB_4 0xb74 1398#define RPDP_ANTB_4 0xb74
1385#define RPDP_ANTB_8 0xb78 1399#define RPDP_ANTB_8 0xb78
1386#define RPDP_ANTB_C 0xb7c 1400#define RPDP_ANTB_C 0xb7c
1387#define RPDP_ANTB_10 0xb80 1401#define RPDP_ANTB_10 0xb80
1388#define RPDP_ANTB_14 0xb84 1402#define RPDP_ANTB_14 0xb84
1389#define RPDP_ANTB_18 0xb88 1403#define RPDP_ANTB_18 0xb88
1390#define RPDP_ANTB_1C 0xb8c 1404#define RPDP_ANTB_1C 0xb8c
1391#define RPDP_ANTB_20 0xb90 1405#define RPDP_ANTB_20 0xb90
1392#define RPDP_ANTB_24 0xb94 1406#define RPDP_ANTB_24 0xb94
1393 1407
1394#define RCONFIG_PMPD_ANTB 0xb98 1408#define RCONFIG_PMPD_ANTB 0xb98
1395 1409
1396#define RBNDB 0xba0 1410#define RBNDB 0xba0
1397 1411
1398#define RAPK 0xbd8 1412#define RAPK 0xbd8
1399#define rPm_Rx0_AntA 0xbdc 1413#define RPM_RX0_ANTA 0xbdc
1400#define rPm_Rx1_AntA 0xbe0 1414#define RPM_RX1_ANTA 0xbe0
1401#define rPm_Rx2_AntA 0xbe4 1415#define RPM_RX2_ANTA 0xbe4
1402#define rPm_Rx3_AntA 0xbe8 1416#define RPM_RX3_ANTA 0xbe8
1403#define rPm_Rx0_AntB 0xbec 1417#define RPM_RX0_ANTB 0xbec
1404#define rPm_Rx1_AntB 0xbf0 1418#define RPM_RX1_ANTB 0xbf0
1405#define rPm_Rx2_AntB 0xbf4 1419#define RPM_RX2_ANTB 0xbf4
1406#define rPm_Rx3_AntB 0xbf8 1420#define RPM_RX3_ANTB 0xbf8
1407 1421
1408/*Page C*/ 1422/*Page C*/
1409#define ROFDM0_LSTF 0xc00 1423#define ROFDM0_LSTF 0xc00
1410 1424
1411#define ROFDM0_TRXPATHENABLE 0xc04 1425#define ROFDM0_TRXPATHENABLE 0xc04
1412#define ROFDM0_TRMUXPAR 0xc08 1426#define ROFDM0_TRMUXPAR 0xc08
1413#define ROFDM0_TRSWISOLATION 0xc0c 1427#define ROFDM0_TRSWISOLATION 0xc0c
1414 1428
1415#define ROFDM0_XARXAFE 0xc10 1429#define ROFDM0_XARXAFE 0xc10
1416#define ROFDM0_XARXIQIMBAL 0xc14 1430#define ROFDM0_XARXIQIMBALANCE 0xc14
1417#define ROFDM0_XBRXAFE 0xc18 1431#define ROFDM0_XBRXAFE 0xc18
1418#define ROFDM0_XBRXIQIMBAL 0xc1c 1432#define ROFDM0_XBRXIQIMBALANCE 0xc1c
1419#define ROFDM0_XCRXAFE 0xc20 1433#define ROFDM0_XCRXAFE 0xc20
1420#define ROFDM0_XCRXIQIMBAL 0xc24 1434#define ROFDM0_XCRXIQIMBANLANCE 0xc24
1421#define ROFDM0_XDRXAFE 0xc28 1435#define ROFDM0_XDRXAFE 0xc28
1422#define ROFDM0_XDRXIQIMBAL 0xc2c 1436#define ROFDM0_XDRXIQIMBALANCE 0xc2c
1423 1437
1424#define ROFDM0_RXDETECTOR1 0xc30 1438#define ROFDM0_RXDETECTOR1 0xc30
1425#define ROFDM0_RXDETECTOR2 0xc34 1439#define ROFDM0_RXDETECTOR2 0xc34
@@ -1428,8 +1442,8 @@
1428 1442
1429#define ROFDM0_RXDSP 0xc40 1443#define ROFDM0_RXDSP 0xc40
1430#define ROFDM0_CFOANDDAGC 0xc44 1444#define ROFDM0_CFOANDDAGC 0xc44
1431#define ROFDM0_CCADROPTHRES 0xc48 1445#define ROFDM0_CCADROPTHRESHOLD 0xc48
1432#define ROFDM0_ECCATHRES 0xc4c 1446#define ROFDM0_ECCATHRESHOLD 0xc4c
1433 1447
1434#define ROFDM0_XAAGCCORE1 0xc50 1448#define ROFDM0_XAAGCCORE1 0xc50
1435#define ROFDM0_XAAGCCORE2 0xc54 1449#define ROFDM0_XAAGCCORE2 0xc54
@@ -1440,18 +1454,18 @@
1440#define ROFDM0_XDAGCCORE1 0xc68 1454#define ROFDM0_XDAGCCORE1 0xc68
1441#define ROFDM0_XDAGCCORE2 0xc6c 1455#define ROFDM0_XDAGCCORE2 0xc6c
1442 1456
1443#define ROFDM0_AGCPARAMETER1 0xc70 1457#define ROFDM0_AGCPARAMETER1 0xc70
1444#define ROFDM0_AGCPARAMETER2 0xc74 1458#define ROFDM0_AGCPARAMETER2 0xc74
1445#define ROFDM0_AGCRSSITABLE 0xc78 1459#define ROFDM0_AGCRSSITABLE 0xc78
1446#define ROFDM0_HTSTFAGC 0xc7c 1460#define ROFDM0_HTSTFAGC 0xc7c
1447 1461
1448#define ROFDM0_XATXIQIMBAL 0xc80 1462#define ROFDM0_XATXIQIMBALANCE 0xc80
1449#define ROFDM0_XATXAFE 0xc84 1463#define ROFDM0_XATXAFE 0xc84
1450#define ROFDM0_XBTXIQIMBAL 0xc88 1464#define ROFDM0_XBTXIQIMBALANCE 0xc88
1451#define ROFDM0_XBTXAFE 0xc8c 1465#define ROFDM0_XBTXAFE 0xc8c
1452#define ROFDM0_XCTXIQIMBAL 0xc90 1466#define ROFDM0_XCTXIQIMBALANCE 0xc90
1453#define ROFDM0_XCTXAFE 0xc94 1467#define ROFDM0_XCTXAFE 0xc94
1454#define ROFDM0_XDTXIQIMBAL 0xc98 1468#define ROFDM0_XDTXIQIMBALANCE 0xc98
1455#define ROFDM0_XDTXAFE 0xc9c 1469#define ROFDM0_XDTXAFE 0xc9c
1456 1470
1457#define ROFDM0_RXIQEXTANTA 0xca0 1471#define ROFDM0_RXIQEXTANTA 0xca0
@@ -1462,25 +1476,24 @@
1462#define ROFDM0_TXCOEFF5 0xcb4 1476#define ROFDM0_TXCOEFF5 0xcb4
1463#define ROFDM0_TXCOEFF6 0xcb8 1477#define ROFDM0_TXCOEFF6 0xcb8
1464 1478
1465#define ROFDM0_RXHPPARAMETER 0xce0 1479#define ROFDM0_RXHPPARAMETER 0xce0
1466#define ROFDM0_TXPSEUDONOISEWGT 0xce4 1480#define ROFDM0_TXPSEUDONOISEWGT 0xce4
1467#define ROFDM0_FRAMESYNC 0xcf0 1481#define ROFDM0_FRAMESYNC 0xcf0
1468#define ROFDM0_DFSREPORT 0xcf4 1482#define ROFDM0_DFSREPORT 0xcf4
1469 1483
1484#define ROFDM1_LSTF 0xd00
1485#define ROFDM1_TRXPATHENABLE 0xd04
1470 1486
1471#define ROFDM1_LSTF 0xd00 1487#define ROFDM1_CF0 0xd08
1472#define ROFDM1_TRXPATHENABLE 0xd04 1488#define ROFDM1_CSI1 0xd10
1473 1489#define ROFDM1_SBD 0xd14
1474#define ROFDM1_CF0 0xd08 1490#define ROFDM1_CSI2 0xd18
1475#define ROFDM1_CSI1 0xd10
1476#define ROFDM1_SBD 0xd14
1477#define ROFDM1_CSI2 0xd18
1478#define ROFDM1_CFOTRACKING 0xd2c 1491#define ROFDM1_CFOTRACKING 0xd2c
1479#define ROFDM1_TRXMESAURE1 0xd34 1492#define ROFDM1_TRXMESAURE1 0xd34
1480#define ROFDM1_INTFDET 0xd3c 1493#define ROFDM1_INTFDET 0xd3c
1481#define ROFDM1_PSEUDONOISESTATEAB 0xd50 1494#define ROFDM1_PSEUDONOISESTATEAB 0xd50
1482#define ROFDM1_PSEUDONOISESTATECD 0xd54 1495#define ROFDM1_PSEUDONOISESTATECD 0xd54
1483#define ROFDM1_RXPSEUDONOISEWGT 0xd58 1496#define ROFDM1_RXPSEUDONOISEWGT 0xd58
1484 1497
1485#define ROFDM_PHYCOUNTER1 0xda0 1498#define ROFDM_PHYCOUNTER1 0xda0
1486#define ROFDM_PHYCOUNTER2 0xda4 1499#define ROFDM_PHYCOUNTER2 0xda4
@@ -1492,84 +1505,84 @@
1492#define ROFDM_LONGCFOCD 0xdb8 1505#define ROFDM_LONGCFOCD 0xdb8
1493#define ROFDM_TAILCF0AB 0xdbc 1506#define ROFDM_TAILCF0AB 0xdbc
1494#define ROFDM_TAILCF0CD 0xdc0 1507#define ROFDM_TAILCF0CD 0xdc0
1495#define ROFDM_PWMEASURE1 0xdc4 1508#define ROFDM_PWMEASURE1 0xdc4
1496#define ROFDM_PWMEASURE2 0xdc8 1509#define ROFDM_PWMEASURE2 0xdc8
1497#define ROFDM_BWREPORT 0xdcc 1510#define ROFDM_BWREPORT 0xdcc
1498#define ROFDM_AGCREPORT 0xdd0 1511#define ROFDM_AGCREPORT 0xdd0
1499#define ROFDM_RXSNR 0xdd4 1512#define ROFDM_RXSNR 0xdd4
1500#define ROFDM_RXEVMCSI 0xdd8 1513#define ROFDM_RXEVMCSI 0xdd8
1501#define ROFDM_SIGREPORT 0xddc 1514#define ROFDM_SIGREPORT 0xddc
1502 1515
1503#define RTXAGC_A_RATE18_06 0xe00 1516#define RTXAGC_A_RATE18_06 0xe00
1504#define RTXAGC_A_RATE54_24 0xe04 1517#define RTXAGC_A_RATE54_24 0xe04
1505#define RTXAGC_A_CCK1_MCS32 0xe08 1518#define RTXAGC_A_CCK1_MCS32 0xe08
1506#define RTXAGC_A_MCS03_MCS00 0xe10 1519#define RTXAGC_A_MCS03_MCS00 0xe10
1507#define RTXAGC_A_MCS07_MCS04 0xe14 1520#define RTXAGC_A_MCS07_MCS04 0xe14
1508#define RTXAGC_A_MCS11_MCS08 0xe18 1521#define RTXAGC_A_MCS11_MCS08 0xe18
1509#define RTXAGC_A_MCS15_MCS12 0xe1c 1522#define RTXAGC_A_MCS15_MCS12 0xe1c
1510 1523
1511#define RTXAGC_B_RATE18_06 0x830 1524#define RTXAGC_B_RATE18_06 0x830
1512#define RTXAGC_B_RATE54_24 0x834 1525#define RTXAGC_B_RATE54_24 0x834
1513#define RTXAGC_B_CCK1_55_MCS32 0x838 1526#define RTXAGC_B_CCK1_55_MCS32 0x838
1514#define RTXAGC_B_MCS03_MCS00 0x83c 1527#define RTXAGC_B_MCS03_MCS00 0x83c
1515#define RTXAGC_B_MCS07_MCS04 0x848 1528#define RTXAGC_B_MCS07_MCS04 0x848
1516#define RTXAGC_B_MCS11_MCS08 0x84c 1529#define RTXAGC_B_MCS11_MCS08 0x84c
1517#define RTXAGC_B_MCS15_MCS12 0x868 1530#define RTXAGC_B_MCS15_MCS12 0x868
1518#define RTXAGC_B_CCK11_A_CCK2_11 0x86c 1531#define RTXAGC_B_CCK11_A_CCK2_11 0x86c
1519 1532
1520#define RFPGA0_IQK 0xe28 1533#define RFPGA0_IQK 0xe28
1521#define RTX_IQK_TONE_A 0xe30 1534#define RTX_IQK_TONE_A 0xe30
1522#define RRX_IQK_TONE_A 0xe34 1535#define RRX_IQK_TONE_A 0xe34
1523#define RTX_IQK_PI_A 0xe38 1536#define RTX_IQK_PI_A 0xe38
1524#define RRX_IQK_PI_A 0xe3c 1537#define RRX_IQK_PI_A 0xe3c
1525 1538
1526#define RTX_IQK 0xe40 1539#define RTX_IQK 0xe40
1527#define RRX_IQK 0xe44 1540#define RRX_IQK 0xe44
1528#define RIQK_AGC_PTS 0xe48 1541#define RIQK_AGC_PTS 0xe48
1529#define RIQK_AGC_RSP 0xe4c 1542#define RIQK_AGC_RSP 0xe4c
1530#define RTX_IQK_TONE_B 0xe50 1543#define RTX_IQK_TONE_B 0xe50
1531#define RRX_IQK_TONE_B 0xe54 1544#define RRX_IQK_TONE_B 0xe54
1532#define RTX_IQK_PI_B 0xe58 1545#define RTX_IQK_PI_B 0xe58
1533#define RRX_IQK_PI_B 0xe5c 1546#define RRX_IQK_PI_B 0xe5c
1534#define RIQK_AGC_CONT 0xe60 1547#define RIQK_AGC_CONT 0xe60
1535 1548
1536#define RBLUE_TOOTH 0xe6c 1549#define RBLUE_TOOTH 0xe6c
1537#define RRX_WAIT_CCA 0xe70 1550#define RRX_WAIT_CCA 0xe70
1538#define RTX_CCK_RFON 0xe74 1551#define RTX_CCK_RFON 0xe74
1539#define RTX_CCK_BBON 0xe78 1552#define RTX_CCK_BBON 0xe78
1540#define RTX_OFDM_RFON 0xe7c 1553#define RTX_OFDM_RFON 0xe7c
1541#define RTX_OFDM_BBON 0xe80 1554#define RTX_OFDM_BBON 0xe80
1542#define RTX_TO_RX 0xe84 1555#define RTX_TO_RX 0xe84
1543#define RTX_TO_TX 0xe88 1556#define RTX_TO_TX 0xe88
1544#define RRX_CCK 0xe8c 1557#define RRX_CCK 0xe8c
1545 1558
1546#define RTX_POWER_BEFORE_IQK_A 0xe94 1559#define RTX_POWER_BEFORE_IQK_A 0xe94
1547#define RTX_POWER_AFTER_IQK_A 0xe9c 1560#define RTX_POWER_AFTER_IQK_A 0xe9c
1548 1561
1549#define RRX_POWER_BEFORE_IQK_A 0xea0 1562#define RRX_POWER_BEFORE_IQK_A 0xea0
1550#define RRX_POWER_BEFORE_IQK_A_2 0xea4 1563#define RRX_POWER_BEFORE_IQK_A_2 0xea4
1551#define RRX_POWER_AFTER_IQK_A 0xea8 1564#define RRX_POWER_AFTER_IQK_A 0xea8
1552#define RRX_POWER_AFTER_IQK_A_2 0xeac 1565#define RRX_POWER_AFTER_IQK_A_2 0xeac
1553 1566
1554#define RTX_POWER_BEFORE_IQK_B 0xeb4 1567#define RTX_POWER_BEFORE_IQK_B 0xeb4
1555#define RTX_POWER_AFTER_IQK_B 0xebc 1568#define RTX_POWER_AFTER_IQK_B 0xebc
1556 1569
1557#define RRX_POWER_BEFORE_IQK_B 0xec0 1570#define RRX_POWER_BEFORE_IQK_B 0xec0
1558#define RRX_POWER_BEFORE_IQK_B_2 0xec4 1571#define RRX_POWER_BEFORE_IQK_B_2 0xec4
1559#define RRX_POWER_AFTER_IQK_B 0xec8 1572#define RRX_POWER_AFTER_IQK_B 0xec8
1560#define RRX_POWER_AFTER_IQK_B_2 0xecc 1573#define RRX_POWER_AFTER_IQK_B_2 0xecc
1561 1574
1562#define RRX_OFDM 0xed0 1575#define RRX_OFDM 0xed0
1563#define RRX_WAIT_RIFS 0xed4 1576#define RRX_WAIT_RIFS 0xed4
1564#define RRX_TO_RX 0xed8 1577#define RRX_TO_RX 0xed8
1565#define RSTANDBY 0xedc 1578#define RSTANDBY 0xedc
1566#define RSLEEP 0xee0 1579#define RSLEEP 0xee0
1567#define RPMPD_ANAEN 0xeec 1580#define RPMPD_ANAEN 0xeec
1568 1581
1569#define RZEBRA1_HSSIENABLE 0x0 1582#define RZEBRA1_HSSIENABLE 0x0
1570#define RZEBRA1_TRXENABLE1 0x1 1583#define RZEBRA1_TRXENABLE1 0x1
1571#define RZEBRA1_TRXENABLE2 0x2 1584#define RZEBRA1_TRXENABLE2 0x2
1572#define RZEBRA1_AGC 0x4 1585#define RZEBRA1_AGC 0x4
1573#define RZEBRA1_CHARGEPUMP 0x5 1586#define RZEBRA1_CHARGEPUMP 0x5
1574#define RZEBRA1_CHANNEL 0x7 1587#define RZEBRA1_CHANNEL 0x7
1575 1588
@@ -1578,666 +1591,681 @@
1578#define RZEBRA1_RXLPF 0xb 1591#define RZEBRA1_RXLPF 0xb
1579#define RZEBRA1_RXHPFCORNER 0xc 1592#define RZEBRA1_RXHPFCORNER 0xc
1580 1593
1581#define RGLOBALCTRL 0 1594#define RGLOBALCTRL 0
1582#define RRTL8256_TXLPF 19 1595#define RRTL8256_TXLPF 19
1583#define RRTL8256_RXLPF 11 1596#define RRTL8256_RXLPF 11
1584#define RRTL8258_TXLPF 0x11 1597#define RRTL8258_TXLPF 0x11
1585#define RRTL8258_RXLPF 0x13 1598#define RRTL8258_RXLPF 0x13
1586#define RRTL8258_RSSILPF 0xa 1599#define RRTL8258_RSSILPF 0xa
1587 1600
1588#define RF_AC 0x00 1601#define RF_AC 0x00
1589 1602
1590#define RF_IQADJ_G1 0x01 1603#define RF_IQADJ_G1 0x01
1591#define RF_IQADJ_G2 0x02 1604#define RF_IQADJ_G2 0x02
1592#define RF_POW_TRSW 0x05 1605#define RF_POW_TRSW 0x05
1593 1606
1594#define RF_GAIN_RX 0x06 1607#define RF_GAIN_RX 0x06
1595#define RF_GAIN_TX 0x07 1608#define RF_GAIN_TX 0x07
1596 1609
1597#define RF_TXM_IDAC 0x08 1610#define RF_TXM_IDAC 0x08
1598#define RF_BS_IQGEN 0x0F 1611#define RF_BS_IQGEN 0x0F
1599 1612
1600#define RF_MODE1 0x10 1613#define RF_MODE1 0x10
1601#define RF_MODE2 0x11 1614#define RF_MODE2 0x11
1602 1615
1603#define RF_RX_AGC_HP 0x12 1616#define RF_RX_AGC_HP 0x12
1604#define RF_TX_AGC 0x13 1617#define RF_TX_AGC 0x13
1605#define RF_BIAS 0x14 1618#define RF_BIAS 0x14
1606#define RF_IPA 0x15 1619#define RF_IPA 0x15
1607#define RF_POW_ABILITY 0x17 1620#define RF_POW_ABILITY 0x17
1608#define RF_MODE_AG 0x18 1621#define RF_MODE_AG 0x18
1609#define RRFCHANNEL 0x18 1622#define RRFCHANNEL 0x18
1610#define RF_CHNLBW 0x18 1623#define RF_CHNLBW 0x18
1611#define RF_TOP 0x19 1624#define RF_TOP 0x19
1612 1625
1613#define RF_RX_G1 0x1A 1626#define RF_RX_G1 0x1A
1614#define RF_RX_G2 0x1B 1627#define RF_RX_G2 0x1B
1615 1628
1616#define RF_RX_BB2 0x1C 1629#define RF_RX_BB2 0x1C
1617#define RF_RX_BB1 0x1D 1630#define RF_RX_BB1 0x1D
1618 1631
1619#define RF_RCK1 0x1E 1632#define RF_RCK1 0x1E
1620#define RF_RCK2 0x1F 1633#define RF_RCK2 0x1F
1621 1634
1622#define RF_TX_G1 0x20 1635#define RF_TX_G1 0x20
1623#define RF_TX_G2 0x21 1636#define RF_TX_G2 0x21
1624#define RF_TX_G3 0x22 1637#define RF_TX_G3 0x22
1625 1638
1626#define RF_TX_BB1 0x23 1639#define RF_TX_BB1 0x23
1627#define RF_T_METER 0x42 1640#define RF_T_METER 0x42
1628 1641
1629#define RF_SYN_G1 0x25 1642#define RF_SYN_G1 0x25
1630#define RF_SYN_G2 0x26 1643#define RF_SYN_G2 0x26
1631#define RF_SYN_G3 0x27 1644#define RF_SYN_G3 0x27
1632#define RF_SYN_G4 0x28 1645#define RF_SYN_G4 0x28
1633#define RF_SYN_G5 0x29 1646#define RF_SYN_G5 0x29
1634#define RF_SYN_G6 0x2A 1647#define RF_SYN_G6 0x2A
1635#define RF_SYN_G7 0x2B 1648#define RF_SYN_G7 0x2B
1636#define RF_SYN_G8 0x2C 1649#define RF_SYN_G8 0x2C
1637 1650
1638#define RF_RCK_OS 0x30 1651#define RF_RCK_OS 0x30
1639#define RF_TXPA_G1 0x31 1652#define RF_TXPA_G1 0x31
1640#define RF_TXPA_G2 0x32 1653#define RF_TXPA_G2 0x32
1641#define RF_TXPA_G3 0x33 1654#define RF_TXPA_G3 0x33
1642 1655
1643#define RF_TX_BIAS_A 0x35 1656#define RF_TX_BIAS_A 0x35
1644#define RF_TX_BIAS_D 0x36 1657#define RF_TX_BIAS_D 0x36
1645#define RF_LOBF_9 0x38 1658#define RF_LOBF_9 0x38
1646#define RF_RXRF_A3 0x3C 1659#define RF_RXRF_A3 0x3C
1647#define RF_TRSW 0x3F 1660#define RF_TRSW 0x3F
1648 1661
1649#define RF_TXRF_A2 0x41 1662#define RF_TXRF_A2 0x41
1650#define RF_TXPA_G4 0x46 1663#define RF_TXPA_G4 0x46
1651#define RF_TXPA_A4 0x4B 1664#define RF_TXPA_A4 0x4B
1652 1665
1653#define RF_WE_LUT 0xEF 1666#define RF_WE_LUT 0xEF
1654 1667
1655#define BBBRESETB 0x100 1668#define BBBRESETB 0x100
1656#define BGLOBALRESETB 0x200 1669#define BGLOBALRESETB 0x200
1657#define BOFDMTXSTART 0x4 1670#define BOFDMTXSTART 0x4
1658#define BCCKTXSTART 0x8 1671#define BCCKTXSTART 0x8
1659#define BCRC32DEBUG 0x100 1672#define BCRC32DEBUG 0x100
1660#define BPMACLOOPBACK 0x10 1673#define BPMACLOOPBACK 0x10
1661#define BTXLSIG 0xffffff 1674#define BTXLSIG 0xffffff
1662#define BOFDMTXRATE 0xf 1675#define BOFDMTXRATE 0xf
1663#define BOFDMTXRESERVED 0x10 1676#define BOFDMTXRESERVED 0x10
1664#define BOFDMTXLENGTH 0x1ffe0 1677#define BOFDMTXLENGTH 0x1ffe0
1665#define BOFDMTXPARITY 0x20000 1678#define BOFDMTXPARITY 0x20000
1666#define BTXHTSIG1 0xffffff 1679#define BTXHTSIG1 0xffffff
1667#define BTXHTMCSRATE 0x7f 1680#define BTXHTMCSRATE 0x7f
1668#define BTXHTBW 0x80 1681#define BTXHTBW 0x80
1669#define BTXHTLENGTH 0xffff00 1682#define BTXHTLENGTH 0xffff00
1670#define BTXHTSIG2 0xffffff 1683#define BTXHTSIG2 0xffffff
1671#define BTXHTSMOOTHING 0x1 1684#define BTXHTSMOOTHING 0x1
1672#define BTXHTSOUNDING 0x2 1685#define BTXHTSOUNDING 0x2
1673#define BTXHTRESERVED 0x4 1686#define BTXHTRESERVED 0x4
1674#define BTXHTAGGREATION 0x8 1687#define BTXHTAGGREATION 0x8
1675#define BTXHTSTBC 0x30 1688#define BTXHTSTBC 0x30
1676#define BTXHTADVANCECODING 0x40 1689#define BTXHTADVANCECODING 0x40
1677#define BTXHTSHORTGI 0x80 1690#define BTXHTSHORTGI 0x80
1678#define BTXHTNUMBERHT_LTF 0x300 1691#define BTXHTNUMBERHT_LTF 0x300
1679#define BTXHTCRC8 0x3fc00 1692#define BTXHTCRC8 0x3fc00
1680#define BCOUNTERRESET 0x10000 1693#define BCOUNTERRESET 0x10000
1681#define BNUMOFOFDMTX 0xffff 1694#define BNUMOFOFDMTX 0xffff
1682#define BNUMOFCCKTX 0xffff0000 1695#define BNUMOFCCKTX 0xffff0000
1683#define BTXIDLEINTERVAL 0xffff 1696#define BTXIDLEINTERVAL 0xffff
1684#define BOFDMSERVICE 0xffff0000 1697#define BOFDMSERVICE 0xffff0000
1685#define BTXMACHEADER 0xffffffff 1698#define BTXMACHEADER 0xffffffff
1686#define BTXDATAINIT 0xff 1699#define BTXDATAINIT 0xff
1687#define BTXHTMODE 0x100 1700#define BTXHTMODE 0x100
1688#define BTXDATATYPE 0x30000 1701#define BTXDATATYPE 0x30000
1689#define BTXRANDOMSEED 0xffffffff 1702#define BTXRANDOMSEED 0xffffffff
1690#define BCCKTXPREAMBLE 0x1 1703#define BCCKTXPREAMBLE 0x1
1691#define BCCKTXSFD 0xffff0000 1704#define BCCKTXSFD 0xffff0000
1692#define BCCKTXSIG 0xff 1705#define BCCKTXSIG 0xff
1693#define BCCKTXSERVICE 0xff00 1706#define BCCKTXSERVICE 0xff00
1694#define BCCKLENGTHEXT 0x8000 1707#define BCCKLENGTHEXT 0x8000
1695#define BCCKTXLENGHT 0xffff0000 1708#define BCCKTXLENGHT 0xffff0000
1696#define BCCKTXCRC16 0xffff 1709#define BCCKTXCRC16 0xffff
1697#define BCCKTXSTATUS 0x1 1710#define BCCKTXSTATUS 0x1
1698#define BOFDMTXSTATUS 0x2 1711#define BOFDMTXSTATUS 0x2
1699#define IS_BB_REG_OFFSET_92S(_offset) \ 1712#define IS_BB_REG_OFFSET_92S(_offset) \
1700 ((_offset >= 0x800) && (_offset <= 0xfff)) 1713 ((_offset >= 0x800) && (_offset <= 0xfff))
1701 1714
1702#define BRFMOD 0x1 1715#define BRFMOD 0x1
1703#define BJAPANMODE 0x2 1716#define BJAPANMODE 0x2
1704#define BCCKTXSC 0x30 1717#define BCCKTXSC 0x30
1705#define BCCKEN 0x1000000 1718#define BCCKEN 0x1000000
1706#define BOFDMEN 0x2000000 1719#define BOFDMEN 0x2000000
1707 1720
1708#define BOFDMRXADCPHASE 0x10000 1721#define BOFDMRXADCPHASE 0x10000
1709#define BOFDMTXDACPHASE 0x40000 1722#define BOFDMTXDACPHASE 0x40000
1710#define BXATXAGC 0x3f 1723#define BXATXAGC 0x3f
1711 1724
1712#define BXBTXAGC 0xf00 1725#define BXBTXAGC 0xf00
1713#define BXCTXAGC 0xf000 1726#define BXCTXAGC 0xf000
1714#define BXDTXAGC 0xf0000 1727#define BXDTXAGC 0xf0000
1715 1728
1716#define BPASTART 0xf0000000 1729#define BPASTART 0xf0000000
1717#define BTRSTART 0x00f00000 1730#define BTRSTART 0x00f00000
1718#define BRFSTART 0x0000f000 1731#define BRFSTART 0x0000f000
1719#define BBBSTART 0x000000f0 1732#define BBBSTART 0x000000f0
1720#define BBBCCKSTART 0x0000000f 1733#define BBBCCKSTART 0x0000000f
1721#define BPAEND 0xf 1734#define BPAEND 0xf
1722#define BTREND 0x0f000000 1735#define BTREND 0x0f000000
1723#define BRFEND 0x000f0000 1736#define BRFEND 0x000f0000
1724#define BCCAMASK 0x000000f0 1737#define BCCAMASK 0x000000f0
1725#define BR2RCCAMASK 0x00000f00 1738#define BR2RCCAMASK 0x00000f00
1726#define BHSSI_R2TDELAY 0xf8000000 1739#define BHSSI_R2TDELAY 0xf8000000
1727#define BHSSI_T2RDELAY 0xf80000 1740#define BHSSI_T2RDELAY 0xf80000
1728#define BCONTXHSSI 0x400 1741#define BCONTXHSSI 0x400
1729#define BIGFROMCCK 0x200 1742#define BIGFROMCCK 0x200
1730#define BAGCADDRESS 0x3f 1743#define BAGCADDRESS 0x3f
1731#define BRXHPTX 0x7000 1744#define BRXHPTX 0x7000
1732#define BRXHP2RX 0x38000 1745#define BRXHP2RX 0x38000
1733#define BRXHPCCKINI 0xc0000 1746#define BRXHPCCKINI 0xc0000
1734#define BAGCTXCODE 0xc00000 1747#define BAGCTXCODE 0xc00000
1735#define BAGCRXCODE 0x300000 1748#define BAGCRXCODE 0x300000
1736 1749
1737#define B3WIREDATALENGTH 0x800 1750#define B3WIREDATALENGTH 0x800
1738#define B3WIREADDREAALENGTH 0x400 1751#define B3WIREADDREAALENGTH 0x400
1739 1752
1740#define B3WIRERFPOWERDOWN 0x1 1753#define B3WIRERFPOWERDOWN 0x1
1741#define B5GPAPEPOLARITY 0x40000000 1754#define B5GPAPEPOLARITY 0x40000000
1742#define B2GPAPEPOLARITY 0x80000000 1755#define B2GPAPEPOLARITY 0x80000000
1743#define BRFSW_TXDEFAULTANT 0x3 1756#define BRFSW_TXDEFAULTANT 0x3
1744#define BRFSW_TXOPTIONANT 0x30 1757#define BRFSW_TXOPTIONANT 0x30
1745#define BRFSW_RXDEFAULTANT 0x300 1758#define BRFSW_RXDEFAULTANT 0x300
1746#define BRFSW_RXOPTIONANT 0x3000 1759#define BRFSW_RXOPTIONANT 0x3000
1747#define BRFSI_3WIREDATA 0x1 1760#define BRFSI_3WIREDATA 0x1
1748#define BRFSI_3WIRECLOCK 0x2 1761#define BRFSI_3WIRECLOCK 0x2
1749#define BRFSI_3WIRELOAD 0x4 1762#define BRFSI_3WIRELOAD 0x4
1750#define BRFSI_3WIRERW 0x8 1763#define BRFSI_3WIRERW 0x8
1751#define BRFSI_3WIRE 0xf 1764#define BRFSI_3WIRE 0xf
1752 1765
1753#define BRFSI_RFENV 0x10 1766#define BRFSI_RFENV 0x10
1754 1767
1755#define BRFSI_TRSW 0x20 1768#define BRFSI_TRSW 0x20
1756#define BRFSI_TRSWB 0x40 1769#define BRFSI_TRSWB 0x40
1757#define BRFSI_ANTSW 0x100 1770#define BRFSI_ANTSW 0x100
1758#define BRFSI_ANTSWB 0x200 1771#define BRFSI_ANTSWB 0x200
1759#define BRFSI_PAPE 0x400 1772#define BRFSI_PAPE 0x400
1760#define BRFSI_PAPE5G 0x800 1773#define BRFSI_PAPE5G 0x800
1761#define BBANDSELECT 0x1 1774#define BBANDSELECT 0x1
1762#define BHTSIG2_GI 0x80 1775#define BHTSIG2_GI 0x80
1763#define BHTSIG2_SMOOTHING 0x01 1776#define BHTSIG2_SMOOTHING 0x01
1764#define BHTSIG2_SOUNDING 0x02 1777#define BHTSIG2_SOUNDING 0x02
1765#define BHTSIG2_AGGREATON 0x08 1778#define BHTSIG2_AGGREATON 0x08
1766#define BHTSIG2_STBC 0x30 1779#define BHTSIG2_STBC 0x30
1767#define BHTSIG2_ADVCODING 0x40 1780#define BHTSIG2_ADVCODING 0x40
1768#define BHTSIG2_NUMOFHTLTF 0x300 1781#define BHTSIG2_NUMOFHTLTF 0x300
1769#define BHTSIG2_CRC8 0x3fc 1782#define BHTSIG2_CRC8 0x3fc
1770#define BHTSIG1_MCS 0x7f 1783#define BHTSIG1_MCS 0x7f
1771#define BHTSIG1_BANDWIDTH 0x80 1784#define BHTSIG1_BANDWIDTH 0x80
1772#define BHTSIG1_HTLENGTH 0xffff 1785#define BHTSIG1_HTLENGTH 0xffff
1773#define BLSIG_RATE 0xf 1786#define BLSIG_RATE 0xf
1774#define BLSIG_RESERVED 0x10 1787#define BLSIG_RESERVED 0x10
1775#define BLSIG_LENGTH 0x1fffe 1788#define BLSIG_LENGTH 0x1fffe
1776#define BLSIG_PARITY 0x20 1789#define BLSIG_PARITY 0x20
1777#define BCCKRXPHASE 0x4 1790#define BCCKRXPHASE 0x4
1778 1791
1779#define BLSSIREADADDRESS 0x7f800000 1792#define BLSSIREADADDRESS 0x7f800000
1780#define BLSSIREADEDGE 0x80000000 1793#define BLSSIREADEDGE 0x80000000
1781 1794
1782#define BLSSIREADBACKDATA 0xfffff 1795#define BLSSIREADBACKDATA 0xfffff
1783 1796
1784#define BLSSIREADOKFLAG 0x1000 1797#define BLSSIREADOKFLAG 0x1000
1785#define BCCKSAMPLERATE 0x8 1798#define BCCKSAMPLERATE 0x8
1786#define BREGULATOR0STANDBY 0x1 1799#define BREGULATOR0STANDBY 0x1
1787#define BREGULATORPLLSTANDBY 0x2 1800#define BREGULATORPLLSTANDBY 0x2
1788#define BREGULATOR1STANDBY 0x4 1801#define BREGULATOR1STANDBY 0x4
1789#define BPLLPOWERUP 0x8 1802#define BPLLPOWERUP 0x8
1790#define BDPLLPOWERUP 0x10 1803#define BDPLLPOWERUP 0x10
1791#define BDA10POWERUP 0x20 1804#define BDA10POWERUP 0x20
1792#define BAD7POWERUP 0x200 1805#define BAD7POWERUP 0x200
1793#define BDA6POWERUP 0x2000 1806#define BDA6POWERUP 0x2000
1794#define BXTALPOWERUP 0x4000 1807#define BXTALPOWERUP 0x4000
1795#define B40MDCLKPOWERUP 0x8000 1808#define B40MDCLKPOWERUP 0x8000
1796#define BDA6DEBUGMODE 0x20000 1809#define BDA6DEBUGMODE 0x20000
1797#define BDA6SWING 0x380000 1810#define BDA6SWING 0x380000
1798 1811
1799#define BADCLKPHASE 0x4000000 1812#define BADCLKPHASE 0x4000000
1800#define B80MCLKDELAY 0x18000000 1813#define B80MCLKDELAY 0x18000000
1801#define BAFEWATCHDOGENABLE 0x20000000 1814#define BAFEWATCHDOGENABLE 0x20000000
1802 1815
1803#define BXTALCAP01 0xc0000000 1816#define BXTALCAP01 0xc0000000
1804#define BXTALCAP23 0x3 1817#define BXTALCAP23 0x3
1805#define BXTALCAP92X 0x0f000000 1818#define BXTALCAP92X 0x0f000000
1806#define BXTALCAP 0x0f000000 1819#define BXTALCAP 0x0f000000
1807 1820
1808#define BINTDIFCLKENABLE 0x400 1821#define BINTDIFCLKENABLE 0x400
1809#define BEXTSIGCLKENABLE 0x800 1822#define BEXTSIGCLKENABLE 0x800
1810#define BBANDGAP_MBIAS_POWERUP 0x10000 1823#define BBANDGAP_MBIAS_POWERUP 0x10000
1811#define BAD11SH_GAIN 0xc0000 1824#define BAD11SH_GAIN 0xc0000
1812#define BAD11NPUT_RANGE 0x700000 1825#define BAD11NPUT_RANGE 0x700000
1813#define BAD110P_CURRENT 0x3800000 1826#define BAD110P_CURRENT 0x3800000
1814#define BLPATH_LOOPBACK 0x4000000 1827#define BLPATH_LOOPBACK 0x4000000
1815#define BQPATH_LOOPBACK 0x8000000 1828#define BQPATH_LOOPBACK 0x8000000
1816#define BAFE_LOOPBACK 0x10000000 1829#define BAFE_LOOPBACK 0x10000000
1817#define BDA10_SWING 0x7e0 1830#define BDA10_SWING 0x7e0
1818#define BDA10_REVERSE 0x800 1831#define BDA10_REVERSE 0x800
1819#define BDA_CLK_SOURCE 0x1000 1832#define BDA_CLK_SOURCE 0x1000
1820#define BDA7INPUT_RANGE 0x6000 1833#define BDA7INPUT_RANGE 0x6000
1821#define BDA7_GAIN 0x38000 1834#define BDA7_GAIN 0x38000
1822#define BDA7OUTPUT_CM_MODE 0x40000 1835#define BDA7OUTPUT_CM_MODE 0x40000
1823#define BDA7INPUT_CM_MODE 0x380000 1836#define BDA7INPUT_CM_MODE 0x380000
1824#define BDA7CURRENT 0xc00000 1837#define BDA7CURRENT 0xc00000
1825#define BREGULATOR_ADJUST 0x7000000 1838#define BREGULATOR_ADJUST 0x7000000
1826#define BAD11POWERUP_ATTX 0x1 1839#define BAD11POWERUP_ATTX 0x1
1827#define BDA10PS_ATTX 0x10 1840#define BDA10PS_ATTX 0x10
1828#define BAD11POWERUP_ATRX 0x100 1841#define BAD11POWERUP_ATRX 0x100
1829#define BDA10PS_ATRX 0x1000 1842#define BDA10PS_ATRX 0x1000
1830#define BCCKRX_AGC_FORMAT 0x200 1843#define BCCKRX_AGC_FORMAT 0x200
1831#define BPSDFFT_SAMPLE_POINT 0xc000 1844#define BPSDFFT_SAMPLE_POINT 0xc000
1832#define BPSD_AVERAGE_NUM 0x3000 1845#define BPSD_AVERAGE_NUM 0x3000
1833#define BIQPATH_CONTROL 0xc00 1846#define BIQPATH_CONTROL 0xc00
1834#define BPSD_FREQ 0x3ff 1847#define BPSD_FREQ 0x3ff
1835#define BPSD_ANTENNA_PATH 0x30 1848#define BPSD_ANTENNA_PATH 0x30
1836#define BPSD_IQ_SWITCH 0x40 1849#define BPSD_IQ_SWITCH 0x40
1837#define BPSD_RX_TRIGGER 0x400000 1850#define BPSD_RX_TRIGGER 0x400000
1838#define BPSD_TX_TRIGGERCW 0x80000000 1851#define BPSD_TX_TRIGGER 0x80000000
1839#define BPSD_SINE_TONE_SCALE 0x7f000000 1852#define BPSD_SINE_TONE_SCALE 0x7f000000
1840#define BPSD_REPORT 0xffff 1853#define BPSD_REPORT 0xffff
1841 1854
1842#define BOFDM_TXSC 0x30000000 1855#define BOFDM_TXSC 0x30000000
1843#define BCCK_TXON 0x1 1856#define BCCK_TXON 0x1
1844#define BOFDM_TXON 0x2 1857#define BOFDM_TXON 0x2
1845#define BDEBUG_PAGE 0xfff 1858#define BDEBUG_PAGE 0xfff
1846#define BDEBUG_ITEM 0xff 1859#define BDEBUG_ITEM 0xff
1847#define BANTL 0x10 1860#define BANTL 0x10
1848#define BANT_NONHT 0x100 1861#define BANT_NONHT 0x100
1849#define BANT_HT1 0x1000 1862#define BANT_HT1 0x1000
1850#define BANT_HT2 0x10000 1863#define BANT_HT2 0x10000
1851#define BANT_HT1S1 0x100000 1864#define BANT_HT1S1 0x100000
1852#define BANT_NONHTS1 0x1000000 1865#define BANT_NONHTS1 0x1000000
1853 1866
1854#define BCCK_BBMODE 0x3 1867#define BCCK_BBMODE 0x3
1855#define BCCK_TXPOWERSAVING 0x80 1868#define BCCK_TXPOWERSAVING 0x80
1856#define BCCK_RXPOWERSAVING 0x40 1869#define BCCK_RXPOWERSAVING 0x40
1857 1870
1858#define BCCK_SIDEBAND 0x10 1871#define BCCK_SIDEBAND 0x10
1859 1872
1860#define BCCK_SCRAMBLE 0x8 1873#define BCCK_SCRAMBLE 0x8
1861#define BCCK_ANTDIVERSITY 0x8000 1874#define BCCK_ANTDIVERSITY 0x8000
1862#define BCCK_CARRIER_RECOVERY 0x4000 1875#define BCCK_CARRIER_RECOVERY 0x4000
1863#define BCCK_TXRATE 0x3000 1876#define BCCK_TXRATE 0x3000
1864#define BCCK_DCCANCEL 0x0800 1877#define BCCK_DCCANCEL 0x0800
1865#define BCCK_ISICANCEL 0x0400 1878#define BCCK_ISICANCEL 0x0400
1866#define BCCK_MATCH_FILTER 0x0200 1879#define BCCK_MATCH_FILTER 0x0200
1867#define BCCK_EQUALIZER 0x0100 1880#define BCCK_EQUALIZER 0x0100
1868#define BCCK_PREAMBLE_DETECT 0x800000 1881#define BCCK_PREAMBLE_DETECT 0x800000
1869#define BCCK_FAST_FALSECCA 0x400000 1882#define BCCK_FAST_FALSECCA 0x400000
1870#define BCCK_CH_ESTSTART 0x300000 1883#define BCCK_CH_ESTSTART 0x300000
1871#define BCCK_CCA_COUNT 0x080000 1884#define BCCK_CCA_COUNT 0x080000
1872#define BCCK_CS_LIM 0x070000 1885#define BCCK_CS_LIM 0x070000
1873#define BCCK_BIST_MODE 0x80000000 1886#define BCCK_BIST_MODE 0x80000000
1874#define BCCK_CCAMASK 0x40000000 1887#define BCCK_CCAMASK 0x40000000
1875#define BCCK_TX_DAC_PHASE 0x4 1888#define BCCK_TX_DAC_PHASE 0x4
1876#define BCCK_RX_ADC_PHASE 0x20000000 1889#define BCCK_RX_ADC_PHASE 0x20000000
1877#define BCCKR_CP_MODE 0x0100 1890#define BCCKR_CP_MODE 0x0100
1878#define BCCK_TXDC_OFFSET 0xf0 1891#define BCCK_TXDC_OFFSET 0xf0
1879#define BCCK_RXDC_OFFSET 0xf 1892#define BCCK_RXDC_OFFSET 0xf
1880#define BCCK_CCA_MODE 0xc000 1893#define BCCK_CCA_MODE 0xc000
1881#define BCCK_FALSECS_LIM 0x3f00 1894#define BCCK_FALSECS_LIM 0x3f00
1882#define BCCK_CS_RATIO 0xc00000 1895#define BCCK_CS_RATIO 0xc00000
1883#define BCCK_CORGBIT_SEL 0x300000 1896#define BCCK_CORGBIT_SEL 0x300000
1884#define BCCK_PD_LIM 0x0f0000 1897#define BCCK_PD_LIM 0x0f0000
1885#define BCCK_NEWCCA 0x80000000 1898#define BCCK_NEWCCA 0x80000000
1886#define BCCK_RXHP_OF_IG 0x8000 1899#define BCCK_RXHP_OF_IG 0x8000
1887#define BCCK_RXIG 0x7f00 1900#define BCCK_RXIG 0x7f00
1888#define BCCK_LNA_POLARITY 0x800000 1901#define BCCK_LNA_POLARITY 0x800000
1889#define BCCK_RX1ST_BAIN 0x7f0000 1902#define BCCK_RX1ST_BAIN 0x7f0000
1890#define BCCK_RF_EXTEND 0x20000000 1903#define BCCK_RF_EXTEND 0x20000000
1891#define BCCK_RXAGC_SATLEVEL 0x1f000000 1904#define BCCK_RXAGC_SATLEVEL 0x1f000000
1892#define BCCK_RXAGC_SATCOUNT 0xe0 1905#define BCCK_RXAGC_SATCOUNT 0xe0
1893#define BCCKRXRFSETTLE 0x1f 1906#define BCCKRXRFSETTLE 0x1f
1894#define BCCK_FIXED_RXAGC 0x8000 1907#define BCCK_FIXED_RXAGC 0x8000
1895#define BCCK_ANTENNA_POLARITY 0x2000 1908#define BCCK_ANTENNA_POLARITY 0x2000
1896#define BCCK_TXFILTER_TYPE 0x0c00 1909#define BCCK_TXFILTER_TYPE 0x0c00
1897#define BCCK_RXAGC_REPORTTYPE 0x0300 1910#define BCCK_RXAGC_REPORTTYPE 0x0300
1898#define BCCK_RXDAGC_EN 0x80000000 1911#define BCCK_RXDAGC_EN 0x80000000
1899#define BCCK_RXDAGC_PERIOD 0x20000000 1912#define BCCK_RXDAGC_PERIOD 0x20000000
1900#define BCCK_RXDAGC_SATLEVEL 0x1f000000 1913#define BCCK_RXDAGC_SATLEVEL 0x1f000000
1901#define BCCK_TIMING_RECOVERY 0x800000 1914#define BCCK_TIMING_RECOVERY 0x800000
1902#define BCCK_TXC0 0x3f0000 1915#define BCCK_TXC0 0x3f0000
1903#define BCCK_TXC1 0x3f000000 1916#define BCCK_TXC1 0x3f000000
1904#define BCCK_TXC2 0x3f 1917#define BCCK_TXC2 0x3f
1905#define BCCK_TXC3 0x3f00 1918#define BCCK_TXC3 0x3f00
1906#define BCCK_TXC4 0x3f0000 1919#define BCCK_TXC4 0x3f0000
1907#define BCCK_TXC5 0x3f000000 1920#define BCCK_TXC5 0x3f000000
1908#define BCCK_TXC6 0x3f 1921#define BCCK_TXC6 0x3f
1909#define BCCK_TXC7 0x3f00 1922#define BCCK_TXC7 0x3f00
1910#define BCCK_DEBUGPORT 0xff0000 1923#define BCCK_DEBUGPORT 0xff0000
1911#define BCCK_DAC_DEBUG 0x0f000000 1924#define BCCK_DAC_DEBUG 0x0f000000
1912#define BCCK_FALSEALARM_ENABLE 0x8000 1925#define BCCK_FALSEALARM_ENABLE 0x8000
1913#define BCCK_FALSEALARM_READ 0x4000 1926#define BCCK_FALSEALARM_READ 0x4000
1914#define BCCK_TRSSI 0x7f 1927#define BCCK_TRSSI 0x7f
1915#define BCCK_RXAGC_REPORT 0xfe 1928#define BCCK_RXAGC_REPORT 0xfe
1916#define BCCK_RXREPORT_ANTSEL 0x80000000 1929#define BCCK_RXREPORT_ANTSEL 0x80000000
1917#define BCCK_RXREPORT_MFOFF 0x40000000 1930#define BCCK_RXREPORT_MFOFF 0x40000000
1918#define BCCK_RXREPORT_SQLOSS 0x20000000 1931#define BCCK_RXREPORT_SQLOSS 0x20000000
1919#define BCCK_RXREPORT_PKTLOSS 0x10000000 1932#define BCCK_RXREPORT_PKTLOSS 0x10000000
1920#define BCCK_RXREPORT_LOCKEDBIT 0x08000000 1933#define BCCK_RXREPORT_LOCKEDBIT 0x08000000
1921#define BCCK_RXREPORT_RATEERROR 0x04000000 1934#define BCCK_RXREPORT_RATEERROR 0x04000000
1922#define BCCK_RXREPORT_RXRATE 0x03000000 1935#define BCCK_RXREPORT_RXRATE 0x03000000
1923#define BCCK_RXFA_COUNTER_LOWER 0xff 1936#define BCCK_RXFA_COUNTER_LOWER 0xff
1924#define BCCK_RXFA_COUNTER_UPPER 0xff000000 1937#define BCCK_RXFA_COUNTER_UPPER 0xff000000
1925#define BCCK_RXHPAGC_START 0xe000 1938#define BCCK_RXHPAGC_START 0xe000
1926#define BCCK_RXHPAGC_FINAL 0x1c00 1939#define BCCK_RXHPAGC_FINAL 0x1c00
1927#define BCCK_RXFALSEALARM_ENABLE 0x8000 1940#define BCCK_RXFALSEALARM_ENABLE 0x8000
1928#define BCCK_FACOUNTER_FREEZE 0x4000 1941#define BCCK_FACOUNTER_FREEZE 0x4000
1929#define BCCK_TXPATH_SEL 0x10000000 1942#define BCCK_TXPATH_SEL 0x10000000
1930#define BCCK_DEFAULT_RXPATH 0xc000000 1943#define BCCK_DEFAULT_RXPATH 0xc000000
1931#define BCCK_OPTION_RXPATH 0x3000000 1944#define BCCK_OPTION_RXPATH 0x3000000
1932 1945
1933#define BNUM_OFSTF 0x3 1946#define BNUM_OFSTF 0x3
1934#define BSHIFT_L 0xc0 1947#define BSHIFT_L 0xc0
1935#define BGI_TH 0xc 1948#define BGI_TH 0xc
1936#define BRXPATH_A 0x1 1949#define BRXPATH_A 0x1
1937#define BRXPATH_B 0x2 1950#define BRXPATH_B 0x2
1938#define BRXPATH_C 0x4 1951#define BRXPATH_C 0x4
1939#define BRXPATH_D 0x8 1952#define BRXPATH_D 0x8
1940#define BTXPATH_A 0x1 1953#define BTXPATH_A 0x1
1941#define BTXPATH_B 0x2 1954#define BTXPATH_B 0x2
1942#define BTXPATH_C 0x4 1955#define BTXPATH_C 0x4
1943#define BTXPATH_D 0x8 1956#define BTXPATH_D 0x8
1944#define BTRSSI_FREQ 0x200 1957#define BTRSSI_FREQ 0x200
1945#define BADC_BACKOFF 0x3000 1958#define BADC_BACKOFF 0x3000
1946#define BDFIR_BACKOFF 0xc000 1959#define BDFIR_BACKOFF 0xc000
1947#define BTRSSI_LATCH_PHASE 0x10000 1960#define BTRSSI_LATCH_PHASE 0x10000
1948#define BRX_LDC_OFFSET 0xff 1961#define BRX_LDC_OFFSET 0xff
1949#define BRX_QDC_OFFSET 0xff00 1962#define BRX_QDC_OFFSET 0xff00
1950#define BRX_DFIR_MODE 0x1800000 1963#define BRX_DFIR_MODE 0x1800000
1951#define BRX_DCNF_TYPE 0xe000000 1964#define BRX_DCNF_TYPE 0xe000000
1952#define BRXIQIMB_A 0x3ff 1965#define BRXIQIMB_A 0x3ff
1953#define BRXIQIMB_B 0xfc00 1966#define BRXIQIMB_B 0xfc00
1954#define BRXIQIMB_C 0x3f0000 1967#define BRXIQIMB_C 0x3f0000
1955#define BRXIQIMB_D 0xffc00000 1968#define BRXIQIMB_D 0xffc00000
1956#define BDC_DC_NOTCH 0x60000 1969#define BDC_DC_NOTCH 0x60000
1957#define BRXNB_NOTCH 0x1f000000 1970#define BRXNB_NOTCH 0x1f000000
1958#define BPD_TH 0xf 1971#define BPD_TH 0xf
1959#define BPD_TH_OPT2 0xc000 1972#define BPD_TH_OPT2 0xc000
1960#define BPWED_TH 0x700 1973#define BPWED_TH 0x700
1961#define BIFMF_WIN_L 0x800 1974#define BIFMF_WIN_L 0x800
1962#define BPD_OPTION 0x1000 1975#define BPD_OPTION 0x1000
1963#define BMF_WIN_L 0xe000 1976#define BMF_WIN_L 0xe000
1964#define BBW_SEARCH_L 0x30000 1977#define BBW_SEARCH_L 0x30000
1965#define BWIN_ENH_L 0xc0000 1978#define BWIN_ENH_L 0xc0000
1966#define BBW_TH 0x700000 1979#define BBW_TH 0x700000
1967#define BED_TH2 0x3800000 1980#define BED_TH2 0x3800000
1968#define BBW_OPTION 0x4000000 1981#define BBW_OPTION 0x4000000
1969#define BRADIO_TH 0x18000000 1982#define BRADIO_TH 0x18000000
1970#define BWINDOW_L 0xe0000000 1983#define BWINDOW_L 0xe0000000
1971#define BSBD_OPTION 0x1 1984#define BSBD_OPTION 0x1
1972#define BFRAME_TH 0x1c 1985#define BFRAME_TH 0x1c
1973#define BFS_OPTION 0x60 1986#define BFS_OPTION 0x60
1974#define BDC_SLOPE_CHECK 0x80 1987#define BDC_SLOPE_CHECK 0x80
1975#define BFGUARD_COUNTER_DC_L 0xe00 1988#define BFGUARD_COUNTER_DC_L 0xe00
1976#define BFRAME_WEIGHT_SHORT 0x7000 1989#define BFRAME_WEIGHT_SHORT 0x7000
1977#define BSUB_TUNE 0xe00000 1990#define BSUB_TUNE 0xe00000
1978#define BFRAME_DC_LENGTH 0xe000000 1991#define BFRAME_DC_LENGTH 0xe000000
1979#define BSBD_START_OFFSET 0x30000000 1992#define BSBD_START_OFFSET 0x30000000
1980#define BFRAME_TH_2 0x7 1993#define BFRAME_TH_2 0x7
1981#define BFRAME_GI2_TH 0x38 1994#define BFRAME_GI2_TH 0x38
1982#define BGI2_SYNC_EN 0x40 1995#define BGI2_SYNC_EN 0x40
1983#define BSARCH_SHORT_EARLY 0x300 1996#define BSARCH_SHORT_EARLY 0x300
1984#define BSARCH_SHORT_LATE 0xc00 1997#define BSARCH_SHORT_LATE 0xc00
1985#define BSARCH_GI2_LATE 0x70000 1998#define BSARCH_GI2_LATE 0x70000
1986#define BCFOANTSUM 0x1 1999#define BCFOANTSUM 0x1
1987#define BCFOACC 0x2 2000#define BCFOACC 0x2
1988#define BCFOSTARTOFFSET 0xc 2001#define BCFOSTARTOFFSET 0xc
1989#define BCFOLOOPBACK 0x70 2002#define BCFOLOOPBACK 0x70
1990#define BCFOSUMWEIGHT 0x80 2003#define BCFOSUMWEIGHT 0x80
1991#define BDAGCENABLE 0x10000 2004#define BDAGCENABLE 0x10000
1992#define BTXIQIMB_A 0x3ff 2005#define BTXIQIMB_A 0x3ff
1993#define BTXIQIMB_B 0xfc00 2006#define BTXIQIMB_b 0xfc00
1994#define BTXIQIMB_C 0x3f0000 2007#define BTXIQIMB_C 0x3f0000
1995#define BTXIQIMB_D 0xffc00000 2008#define BTXIQIMB_D 0xffc00000
1996#define BTXIDCOFFSET 0xff 2009#define BTXIDCOFFSET 0xff
1997#define BTXIQDCOFFSET 0xff00 2010#define BTXIQDCOFFSET 0xff00
1998#define BTXDFIRMODE 0x10000 2011#define BTXDFIRMODE 0x10000
1999#define BTXPESUDO_NOISEON 0x4000000 2012#define BTXPESUDO_NOISEON 0x4000000
2000#define BTXPESUDO_NOISE_A 0xff 2013#define BTXPESUDO_NOISE_A 0xff
2001#define BTXPESUDO_NOISE_B 0xff00 2014#define BTXPESUDO_NOISE_B 0xff00
2002#define BTXPESUDO_NOISE_C 0xff0000 2015#define BTXPESUDO_NOISE_C 0xff0000
2003#define BTXPESUDO_NOISE_D 0xff000000 2016#define BTXPESUDO_NOISE_D 0xff000000
2004#define BCCA_DROPOPTION 0x20000 2017#define BCCA_DROPOPTION 0x20000
2005#define BCCA_DROPTHRES 0xfff00000 2018#define BCCA_DROPTHRES 0xfff00000
2006#define BEDCCA_H 0xf 2019#define BEDCCA_H 0xf
2007#define BEDCCA_L 0xf0 2020#define BEDCCA_L 0xf0
2008#define BLAMBDA_ED 0x300 2021#define BLAMBDA_ED 0x300
2009#define BRX_INITIALGAIN 0x7f 2022#define BRX_INITIALGAIN 0x7f
2010#define BRX_ANTDIV_EN 0x80 2023#define BRX_ANTDIV_EN 0x80
2011#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00 2024#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00
2012#define BRX_HIGHPOWER_FLOW 0x8000 2025#define BRX_HIGHPOWER_FLOW 0x8000
2013#define BRX_AGC_FREEZE_THRES 0xc0000 2026#define BRX_AGC_FREEZE_THRES 0xc0000
2014#define BRX_FREEZESTEP_AGC1 0x300000 2027#define BRX_FREEZESTEP_AGC1 0x300000
2015#define BRX_FREEZESTEP_AGC2 0xc00000 2028#define BRX_FREEZESTEP_AGC2 0xc00000
2016#define BRX_FREEZESTEP_AGC3 0x3000000 2029#define BRX_FREEZESTEP_AGC3 0x3000000
2017#define BRX_FREEZESTEP_AGC0 0xc000000 2030#define BRX_FREEZESTEP_AGC0 0xc000000
2018#define BRXRSSI_CMP_EN 0x10000000 2031#define BRXRSSI_CMP_EN 0x10000000
2019#define BRXQUICK_AGCEN 0x20000000 2032#define BRXQUICK_AGCEN 0x20000000
2020#define BRXAGC_FREEZE_THRES_MODE 0x40000000 2033#define BRXAGC_FREEZE_THRES_MODE 0x40000000
2021#define BRX_OVERFLOW_CHECKTYPE 0x80000000 2034#define BRX_OVERFLOW_CHECKTYPE 0x80000000
2022#define BRX_AGCSHIFT 0x7f 2035#define BRX_AGCSHIFT 0x7f
2023#define BTRSW_TRI_ONLY 0x80 2036#define BTRSW_TRI_ONLY 0x80
2024#define BPOWER_THRES 0x300 2037#define BPOWER_THRES 0x300
2025#define BRXAGC_EN 0x1 2038#define BRXAGC_EN 0x1
2026#define BRXAGC_TOGETHER_EN 0x2 2039#define BRXAGC_TOGETHER_EN 0x2
2027#define BRXAGC_MIN 0x4 2040#define BRXAGC_MIN 0x4
2028#define BRXHP_INI 0x7 2041#define BRXHP_INI 0x7
2029#define BRXHP_TRLNA 0x70 2042#define BRXHP_TRLNA 0x70
2030#define BRXHP_RSSI 0x700 2043#define BRXHP_RSSI 0x700
2031#define BRXHP_BBP1 0x7000 2044#define BRXHP_BBP1 0x7000
2032#define BRXHP_BBP2 0x70000 2045#define BRXHP_BBP2 0x70000
2033#define BRXHP_BBP3 0x700000 2046#define BRXHP_BBP3 0x700000
2034#define BRSSI_H 0x7f0000 2047#define BRSSI_H 0x7f0000
2035#define BRSSI_GEN 0x7f000000 2048#define BRSSI_GEN 0x7f000000
2036#define BRXSETTLE_TRSW 0x7 2049#define BRXSETTLE_TRSW 0x7
2037#define BRXSETTLE_LNA 0x38 2050#define BRXSETTLE_LNA 0x38
2038#define BRXSETTLE_RSSI 0x1c0 2051#define BRXSETTLE_RSSI 0x1c0
2039#define BRXSETTLE_BBP 0xe00 2052#define BRXSETTLE_BBP 0xe00
2040#define BRXSETTLE_RXHP 0x7000 2053#define BRXSETTLE_RXHP 0x7000
2041#define BRXSETTLE_ANTSW_RSSI 0x38000 2054#define BRXSETTLE_ANTSW_RSSI 0x38000
2042#define BRXSETTLE_ANTSW 0xc0000 2055#define BRXSETTLE_ANTSW 0xc0000
2043#define BRXPROCESS_TIME_DAGC 0x300000 2056#define BRXPROCESS_TIME_DAGC 0x300000
2044#define BRXSETTLE_HSSI 0x400000 2057#define BRXSETTLE_HSSI 0x400000
2045#define BRXPROCESS_TIME_BBPPW 0x800000 2058#define BRXPROCESS_TIME_BBPPW 0x800000
2046#define BRXANTENNA_POWER_SHIFT 0x3000000 2059#define BRXANTENNA_POWER_SHIFT 0x3000000
2047#define BRSSI_TABLE_SELECT 0xc000000 2060#define BRSSI_TABLE_SELECT 0xc000000
2048#define BRXHP_FINAL 0x7000000 2061#define BRXHP_FINAL 0x7000000
2049#define BRXHPSETTLE_BBP 0x7 2062#define BRXHPSETTLE_BBP 0x7
2050#define BRXHTSETTLE_HSSI 0x8 2063#define BRXHTSETTLE_HSSI 0x8
2051#define BRXHTSETTLE_RXHP 0x70 2064#define BRXHTSETTLE_RXHP 0x70
2052#define BRXHTSETTLE_BBPPW 0x80 2065#define BRXHTSETTLE_BBPPW 0x80
2053#define BRXHTSETTLE_IDLE 0x300 2066#define BRXHTSETTLE_IDLE 0x300
2054#define BRXHTSETTLE_RESERVED 0x1c00 2067#define BRXHTSETTLE_RESERVED 0x1c00
2055#define BRXHT_RXHP_EN 0x8000 2068#define BRXHT_RXHP_EN 0x8000
2056#define BRXAGC_FREEZE_THRES 0x30000 2069#define BRXAGC_FREEZE_THRES 0x30000
2057#define BRXAGC_TOGETHEREN 0x40000 2070#define BRXAGC_TOGETHEREN 0x40000
2058#define BRXHTAGC_MIN 0x80000 2071#define BRXHTAGC_MIN 0x80000
2059#define BRXHTAGC_EN 0x100000 2072#define BRXHTAGC_EN 0x100000
2060#define BRXHTDAGC_EN 0x200000 2073#define BRXHTDAGC_EN 0x200000
2061#define BRXHT_RXHP_BBP 0x1c00000 2074#define BRXHT_RXHP_BBP 0x1c00000
2062#define BRXHT_RXHP_FINAL 0xe0000000 2075#define BRXHT_RXHP_FINAL 0xe0000000
2063#define BRXPW_RADIO_TH 0x3 2076#define BRXPW_RADIO_TH 0x3
2064#define BRXPW_RADIO_EN 0x4 2077#define BRXPW_RADIO_EN 0x4
2065#define BRXMF_HOLD 0x3800 2078#define BRXMF_HOLD 0x3800
2066#define BRXPD_DELAY_TH1 0x38 2079#define BRXPD_DELAY_TH1 0x38
2067#define BRXPD_DELAY_TH2 0x1c0 2080#define BRXPD_DELAY_TH2 0x1c0
2068#define BRXPD_DC_COUNT_MAX 0x600 2081#define BRXPD_DC_COUNT_MAX 0x600
2069#define BRXPD_DELAY_TH 0x8000 2082#define BRXPD_DELAY_TH 0x8000
2070#define BRXPROCESS_DELAY 0xf0000 2083#define BRXPROCESS_DELAY 0xf0000
2071#define BRXSEARCHRANGE_GI2_EARLY 0x700000 2084#define BRXSEARCHRANGE_GI2_EARLY 0x700000
2072#define BRXFRAME_FUARD_COUNTER_L 0x3800000 2085#define BRXFRAME_FUARD_COUNTER_L 0x3800000
2073#define BRXSGI_GUARD_L 0xc000000 2086#define BRXSGI_GUARD_L 0xc000000
2074#define BRXSGI_SEARCH_L 0x30000000 2087#define BRXSGI_SEARCH_L 0x30000000
2075#define BRXSGI_TH 0xc0000000 2088#define BRXSGI_TH 0xc0000000
2076#define BDFSCNT0 0xff 2089#define BDFSCNT0 0xff
2077#define BDFSCNT1 0xff00 2090#define BDFSCNT1 0xff00
2078#define BDFSFLAG 0xf0000 2091#define BDFSFLAG 0xf0000
2079#define BMF_WEIGHT_SUM 0x300000 2092#define BMF_WEIGHT_SUM 0x300000
2080#define BMINIDX_TH 0x7f000000 2093#define BMINIDX_TH 0x7f000000
2081#define BDAFORMAT 0x40000 2094#define BDAFORMAT 0x40000
2082#define BTXCH_EMU_ENABLE 0x01000000 2095#define BTXCH_EMU_ENABLE 0x01000000
2083#define BTRSW_ISOLATION_A 0x7f 2096#define BTRSW_ISOLATION_A 0x7f
2084#define BTRSW_ISOLATION_B 0x7f00 2097#define BTRSW_ISOLATION_B 0x7f00
2085#define BTRSW_ISOLATION_C 0x7f0000 2098#define BTRSW_ISOLATION_C 0x7f0000
2086#define BTRSW_ISOLATION_D 0x7f000000 2099#define BTRSW_ISOLATION_D 0x7f000000
2087#define BEXT_LNA_GAIN 0x7c00 2100#define BEXT_LNA_GAIN 0x7c00
2088 2101
2089#define BSTBC_EN 0x4 2102#define BSTBC_EN 0x4
2090#define BANTENNA_MAPPING 0x10 2103#define BANTENNA_MAPPING 0x10
2091#define BNSS 0x20 2104#define BNSS 0x20
2092#define BCFO_ANTSUM_ID 0x200 2105#define BCFO_ANTSUM_ID 0x200
2093#define BPHY_COUNTER_RESET 0x8000000 2106#define BPHY_COUNTER_RESET 0x8000000
2094#define BCFO_REPORT_GET 0x4000000 2107#define BCFO_REPORT_GET 0x4000000
2095#define BOFDM_CONTINUE_TX 0x10000000 2108#define BOFDM_CONTINUE_TX 0x10000000
2096#define BOFDM_SINGLE_CARRIER 0x20000000 2109#define BOFDM_SINGLE_CARRIER 0x20000000
2097#define BOFDM_SINGLE_TONE 0x40000000 2110#define BOFDM_SINGLE_TONE 0x40000000
2098#define BHT_DETECT 0x100 2111#define BHT_DETECT 0x100
2099#define BCFOEN 0x10000 2112#define BCFOEN 0x10000
2100#define BCFOVALUE 0xfff00000 2113#define BCFOVALUE 0xfff00000
2101#define BSIGTONE_RE 0x3f 2114#define BSIGTONE_RE 0x3f
2102#define BSIGTONE_IM 0x7f00 2115#define BSIGTONE_IM 0x7f00
2103#define BCOUNTER_CCA 0xffff 2116#define BCOUNTER_CCA 0xffff
2104#define BCOUNTER_PARITYFAIL 0xffff0000 2117#define BCOUNTER_PARITYFAIL 0xffff0000
2105#define BCOUNTER_RATEILLEGAL 0xffff 2118#define BCOUNTER_RATEILLEGAL 0xffff
2106#define BCOUNTER_CRC8FAIL 0xffff0000 2119#define BCOUNTER_CRC8FAIL 0xffff0000
2107#define BCOUNTER_MCSNOSUPPORT 0xffff 2120#define BCOUNTER_MCSNOSUPPORT 0xffff
2108#define BCOUNTER_FASTSYNC 0xffff 2121#define BCOUNTER_FASTSYNC 0xffff
2109#define BSHORTCFO 0xfff 2122#define BSHORTCFO 0xfff
2110#define BSHORTCFOT_LENGTH 12 2123#define BSHORTCFOT_LENGTH 12
2111#define BSHORTCFOF_LENGTH 11 2124#define BSHORTCFOF_LENGTH 11
2112#define BLONGCFO 0x7ff 2125#define BLONGCFO 0x7ff
2113#define BLONGCFOT_LENGTH 11 2126#define BLONGCFOT_LENGTH 11
2114#define BLONGCFOF_LENGTH 11 2127#define BLONGCFOF_LENGTH 11
2115#define BTAILCFO 0x1fff 2128#define BTAILCFO 0x1fff
2116#define BTAILCFOT_LENGTH 13 2129#define BTAILCFOT_LENGTH 13
2117#define BTAILCFOF_LENGTH 12 2130#define BTAILCFOF_LENGTH 12
2118#define BNOISE_EN_PWDB 0xffff 2131#define BNOISE_EN_PWDB 0xffff
2119#define BCC_POWER_DB 0xffff0000 2132#define BCC_POWER_DB 0xffff0000
2120#define BMOISE_PWDB 0xffff 2133#define BMOISE_PWDB 0xffff
2121#define BPOWERMEAST_LENGTH 10 2134#define BPOWERMEAST_LENGTH 10
2122#define BPOWERMEASF_LENGTH 3 2135#define BPOWERMEASF_LENGTH 3
2123#define BRX_HT_BW 0x1 2136#define BRX_HT_BW 0x1
2124#define BRXSC 0x6 2137#define BRXSC 0x6
2125#define BRX_HT 0x8 2138#define BRX_HT 0x8
2126#define BNB_INTF_DET_ON 0x1 2139#define BNB_INTF_DET_ON 0x1
2127#define BINTF_WIN_LEN_CFG 0x30 2140#define BINTF_WIN_LEN_CFG 0x30
2128#define BNB_INTF_TH_CFG 0x1c0 2141#define BNB_INTF_TH_CFG 0x1c0
2129#define BRFGAIN 0x3f 2142#define BRFGAIN 0x3f
2130#define BTABLESEL 0x40 2143#define BTABLESEL 0x40
2131#define BTRSW 0x80 2144#define BTRSW 0x80
2132#define BRXSNR_A 0xff 2145#define BRXSNR_A 0xff
2133#define BRXSNR_B 0xff00 2146#define BRXSNR_B 0xff00
2134#define BRXSNR_C 0xff0000 2147#define BRXSNR_C 0xff0000
2135#define BRXSNR_D 0xff000000 2148#define BRXSNR_D 0xff000000
2136#define BSNR_EVMT_LENGTH 8 2149#define BSNR_EVMT_LENGTH 8
2137#define BSNR_EVMF_LENGTH 1 2150#define BSNR_EVMF_LENGTH 1
2138#define BCSI1ST 0xff 2151#define BCSI1ST 0xff
2139#define BCSI2ND 0xff00 2152#define BCSI2ND 0xff00
2140#define BRXEVM1ST 0xff0000 2153#define BRXEVM1ST 0xff0000
2141#define BRXEVM2ND 0xff000000 2154#define BRXEVM2ND 0xff000000
2142#define BSIGEVM 0xff 2155#define BSIGEVM 0xff
2143#define BPWDB 0xff00 2156#define BPWDB 0xff00
2144#define BSGIEN 0x10000 2157#define BSGIEN 0x10000
2145 2158
2146#define BSFACTOR_QMA1 0xf 2159#define BSFACTOR_QMA1 0xf
2147#define BSFACTOR_QMA2 0xf0 2160#define BSFACTOR_QMA2 0xf0
2148#define BSFACTOR_QMA3 0xf00 2161#define BSFACTOR_QMA3 0xf00
2149#define BSFACTOR_QMA4 0xf000 2162#define BSFACTOR_QMA4 0xf000
2150#define BSFACTOR_QMA5 0xf0000 2163#define BSFACTOR_QMA5 0xf0000
2151#define BSFACTOR_QMA6 0xf0000 2164#define BSFACTOR_QMA6 0xf0000
2152#define BSFACTOR_QMA7 0xf00000 2165#define BSFACTOR_QMA7 0xf00000
2153#define BSFACTOR_QMA8 0xf000000 2166#define BSFACTOR_QMA8 0xf000000
2154#define BSFACTOR_QMA9 0xf0000000 2167#define BSFACTOR_QMA9 0xf0000000
2155#define BCSI_SCHEME 0x100000 2168#define BCSI_SCHEME 0x100000
2156 2169
2157#define BNOISE_LVL_TOP_SET 0x3 2170#define BNOISE_LVL_TOP_SET 0x3
2158#define BCHSMOOTH 0x4 2171#define BCHSMOOTH 0x4
2159#define BCHSMOOTH_CFG1 0x38 2172#define BCHSMOOTH_CFG1 0x38
2160#define BCHSMOOTH_CFG2 0x1c0 2173#define BCHSMOOTH_CFG2 0x1c0
2161#define BCHSMOOTH_CFG3 0xe00 2174#define BCHSMOOTH_CFG3 0xe00
2162#define BCHSMOOTH_CFG4 0x7000 2175#define BCHSMOOTH_CFG4 0x7000
2163#define BMRCMODE 0x800000 2176#define BMRCMODE 0x800000
2164#define BTHEVMCFG 0x7000000 2177#define BTHEVMCFG 0x7000000
2165 2178
2166#define BLOOP_FIT_TYPE 0x1 2179#define BLOOP_FIT_TYPE 0x1
2167#define BUPD_CFO 0x40 2180#define BUPD_CFO 0x40
2168#define BUPD_CFO_OFFDATA 0x80 2181#define BUPD_CFO_OFFDATA 0x80
2169#define BADV_UPD_CFO 0x100 2182#define BADV_UPD_CFO 0x100
2170#define BADV_TIME_CTRL 0x800 2183#define BADV_TIME_CTRL 0x800
2171#define BUPD_CLKO 0x1000 2184#define BUPD_CLKO 0x1000
2172#define BFC 0x6000 2185#define BFC 0x6000
2173#define BTRACKING_MODE 0x8000 2186#define BTRACKING_MODE 0x8000
2174#define BPHCMP_ENABLE 0x10000 2187#define BPHCMP_ENABLE 0x10000
2175#define BUPD_CLKO_LTF 0x20000 2188#define BUPD_CLKO_LTF 0x20000
2176#define BCOM_CH_CFO 0x40000 2189#define BCOM_CH_CFO 0x40000
2177#define BCSI_ESTI_MODE 0x80000 2190#define BCSI_ESTI_MODE 0x80000
2178#define BADV_UPD_EQZ 0x100000 2191#define BADV_UPD_EQZ 0x100000
2179#define BUCHCFG 0x7000000 2192#define BUCHCFG 0x7000000
2180#define BUPDEQZ 0x8000000 2193#define BUPDEQZ 0x8000000
2181 2194
2182#define BRX_PESUDO_NOISE_ON 0x20000000 2195#define BRX_PESUDO_NOISE_ON 0x20000000
2183#define BRX_PESUDO_NOISE_A 0xff 2196#define BRX_PESUDO_NOISE_A 0xff
2184#define BRX_PESUDO_NOISE_B 0xff00 2197#define BRX_PESUDO_NOISE_B 0xff00
2185#define BRX_PESUDO_NOISE_C 0xff0000 2198#define BRX_PESUDO_NOISE_C 0xff0000
2186#define BRX_PESUDO_NOISE_D 0xff000000 2199#define BRX_PESUDO_NOISE_D 0xff000000
2187#define BRX_PESUDO_NOISESTATE_A 0xffff 2200#define BRX_PESUDO_NOISESTATE_A 0xffff
2188#define BRX_PESUDO_NOISESTATE_B 0xffff0000 2201#define BRX_PESUDO_NOISESTATE_B 0xffff0000
2189#define BRX_PESUDO_NOISESTATE_C 0xffff 2202#define BRX_PESUDO_NOISESTATE_C 0xffff
2190#define BRX_PESUDO_NOISESTATE_D 0xffff0000 2203#define BRX_PESUDO_NOISESTATE_D 0xffff0000
2191 2204
2192#define BZEBRA1_HSSIENABLE 0x8 2205#define BZEBRA1_HSSIENABLE 0x8
2193#define BZEBRA1_TRXCONTROL 0xc00 2206#define BZEBRA1_TRXCONTROL 0xc00
2194#define BZEBRA1_TRXGAINSETTING 0x07f 2207#define BZEBRA1_TRXGAINSETTING 0x07f
2195#define BZEBRA1_RXCOUNTER 0xc00 2208#define BZEBRA1_RXCOUNTER 0xc00
2196#define BZEBRA1_TXCHANGEPUMP 0x38 2209#define BZEBRA1_TXCHANGEPUMP 0x38
2197#define BZEBRA1_RXCHANGEPUMP 0x7 2210#define BZEBRA1_RXCHANGEPUMP 0x7
2198#define BZEBRA1_CHANNEL_NUM 0xf80 2211#define BZEBRA1_CHANNEL_NUM 0xf80
2199#define BZEBRA1_TXLPFBW 0x400 2212#define BZEBRA1_TXLPFBW 0x400
2200#define BZEBRA1_RXLPFBW 0x600 2213#define BZEBRA1_RXLPFBW 0x600
2201 2214
2202#define BRTL8256REG_MODE_CTRL1 0x100 2215#define BRTL8256REG_MODE_CTRL1 0x100
2203#define BRTL8256REG_MODE_CTRL0 0x40 2216#define BRTL8256REG_MODE_CTRL0 0x40
2204#define BRTL8256REG_TXLPFBW 0x18 2217#define BRTL8256REG_TXLPFBW 0x18
2205#define BRTL8256REG_RXLPFBW 0x600 2218#define BRTL8256REG_RXLPFBW 0x600
2206 2219
2207#define BRTL8258_TXLPFBW 0xc 2220#define BRTL8258_TXLPFBW 0xc
2208#define BRTL8258_RXLPFBW 0xc00 2221#define BRTL8258_RXLPFBW 0xc00
2209#define BRTL8258_RSSILPFBW 0xc0 2222#define BRTL8258_RSSILPFBW 0xc0
2210 2223
2211#define BBYTE0 0x1 2224#define BBYTE0 0x1
2212#define BBYTE1 0x2 2225#define BBYTE1 0x2
2213#define BBYTE2 0x4 2226#define BBYTE2 0x4
2214#define BBYTE3 0x8 2227#define BBYTE3 0x8
2215#define BWORD0 0x3 2228#define BWORD0 0x3
2216#define BWORD1 0xc 2229#define BWORD1 0xc
2217#define BWORD 0xf 2230#define BWORD 0xf
2218 2231
2219#define BENABLE 0x1 2232#define MASKBYTE0 0xff
2220#define BDISABLE 0x0 2233#define MASKBYTE1 0xff00
2221 2234#define MASKBYTE2 0xff0000
2222#define LEFT_ANTENNA 0x0 2235#define MASKBYTE3 0xff000000
2223#define RIGHT_ANTENNA 0x1 2236#define MASKHWORD 0xffff0000
2224 2237#define MASKLWORD 0x0000ffff
2225#define TCHECK_TXSTATUS 500 2238#define MASKDWORD 0xffffffff
2226#define TUPDATE_RXCOUNTER 100 2239#define MASK12BITS 0xfff
2227 2240#define MASKH4BITS 0xf0000000
2228#define REG_UN_USED_REGISTER 0x01bf 2241#define MASKOFDM_D 0xffc00000
2242#define MASKCCK 0x3f3f3f3f
2243
2244#define MASK4BITS 0x0f
2245#define MASK20BITS 0xfffff
2246#define RFREG_OFFSET_MASK 0xfffff
2247
2248#define BENABLE 0x1
2249#define BDISABLE 0x0
2250
2251#define LEFT_ANTENNA 0x0
2252#define RIGHT_ANTENNA 0x1
2253
2254#define TCHECK_TXSTATUS 500
2255#define TUPDATE_RXCOUNTER 100
2256
2257#define REG_UN_used_register 0x01bf
2229 2258
2230/* WOL bit information */ 2259/* WOL bit information */
2231#define HAL92C_WOL_PTK_UPDATE_EVENT BIT(0) 2260#define HAL92C_WOL_PTK_UPDATE_EVENT BIT(0)
2232#define HAL92C_WOL_GTK_UPDATE_EVENT BIT(1) 2261#define HAL92C_WOL_GTK_UPDATE_EVENT BIT(1)
2233#define HAL92C_WOL_DISASSOC_EVENT BIT(2) 2262#define HAL92C_WOL_DISASSOC_EVENT BIT(2)
2234#define HAL92C_WOL_DEAUTH_EVENT BIT(3) 2263#define HAL92C_WOL_DEAUTH_EVENT BIT(3)
2235#define HAL92C_WOL_FW_DISCONNECT_EVENT BIT(4) 2264#define HAL92C_WOL_FW_DISCONNECT_EVENT BIT(4)
2236 2265
2237#define WOL_REASON_PTK_UPDATE BIT(0) 2266#define WOL_REASON_PTK_UPDATE BIT(0)
2238#define WOL_REASON_GTK_UPDATE BIT(1) 2267#define WOL_REASON_GTK_UPDATE BIT(1)
2239#define WOL_REASON_DISASSOC BIT(2) 2268#define WOL_REASON_DISASSOC BIT(2)
2240#define WOL_REASON_DEAUTH BIT(3) 2269#define WOL_REASON_DEAUTH BIT(3)
2241#define WOL_REASON_FW_DISCONNECT BIT(4) 2270#define WOL_REASON_FW_DISCONNECT BIT(4)
2242
2243#endif 2271#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/rf.c b/drivers/net/wireless/rtlwifi/rtl8188ee/rf.c
index 4faafdbab9c6..40893cef7dfe 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/rf.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/rf.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -34,6 +30,8 @@
34#include "rf.h" 30#include "rf.h"
35#include "dm.h" 31#include "dm.h"
36 32
33static bool _rtl88e_phy_rf6052_config_parafile(struct ieee80211_hw *hw);
34
37void rtl88e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth) 35void rtl88e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
38{ 36{
39 struct rtl_priv *rtlpriv = rtl_priv(hw); 37 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -60,7 +58,7 @@ void rtl88e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
60} 58}
61 59
62void rtl88e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, 60void rtl88e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
63 u8 *plevel) 61 u8 *ppowerlevel)
64{ 62{
65 struct rtl_priv *rtlpriv = rtl_priv(hw); 63 struct rtl_priv *rtlpriv = rtl_priv(hw);
66 struct rtl_phy *rtlphy = &(rtlpriv->phy); 64 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -82,32 +80,36 @@ void rtl88e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
82 80
83 if (turbo_scanoff) { 81 if (turbo_scanoff) {
84 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 82 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
85 tx_agc[idx1] = plevel[idx1] | 83 tx_agc[idx1] = ppowerlevel[idx1] |
86 (plevel[idx1] << 8) | 84 (ppowerlevel[idx1] << 8) |
87 (plevel[idx1] << 16) | 85 (ppowerlevel[idx1] << 16) |
88 (plevel[idx1] << 24); 86 (ppowerlevel[idx1] << 24);
89 } 87 }
90 } 88 }
91 } else { 89 } else {
92 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 90 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
93 tx_agc[idx1] = plevel[idx1] | (plevel[idx1] << 8) | 91 tx_agc[idx1] = ppowerlevel[idx1] |
94 (plevel[idx1] << 16) | 92 (ppowerlevel[idx1] << 8) |
95 (plevel[idx1] << 24); 93 (ppowerlevel[idx1] << 16) |
94 (ppowerlevel[idx1] << 24);
96 } 95 }
97 96
98 if (rtlefuse->eeprom_regulatory == 0) { 97 if (rtlefuse->eeprom_regulatory == 0) {
99 tmpval = (rtlphy->mcs_offset[0][6]) + 98 tmpval =
100 (rtlphy->mcs_offset[0][7] << 8); 99 (rtlphy->mcs_txpwrlevel_origoffset[0][6]) +
100 (rtlphy->mcs_txpwrlevel_origoffset[0][7] <<
101 8);
101 tx_agc[RF90_PATH_A] += tmpval; 102 tx_agc[RF90_PATH_A] += tmpval;
102 103
103 tmpval = (rtlphy->mcs_offset[0][14]) + 104 tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][14]) +
104 (rtlphy->mcs_offset[0][15] << 24); 105 (rtlphy->mcs_txpwrlevel_origoffset[0][15] <<
106 24);
105 tx_agc[RF90_PATH_B] += tmpval; 107 tx_agc[RF90_PATH_B] += tmpval;
106 } 108 }
107 } 109 }
108 110
109 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 111 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
110 ptr = (u8 *)(&(tx_agc[idx1])); 112 ptr = (u8 *)(&tx_agc[idx1]);
111 for (idx2 = 0; idx2 < 4; idx2++) { 113 for (idx2 = 0; idx2 < 4; idx2++) {
112 if (*ptr > RF6052_MAX_TX_PWR) 114 if (*ptr > RF6052_MAX_TX_PWR)
113 *ptr = RF6052_MAX_TX_PWR; 115 *ptr = RF6052_MAX_TX_PWR;
@@ -127,10 +129,12 @@ void rtl88e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
127 129
128 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 130 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
129 "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, 131 "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
130 RTXAGC_A_CCK1_MCS32); 132 RTXAGC_A_CCK1_MCS32);
131 133
132 tmpval = tx_agc[RF90_PATH_A] >> 8; 134 tmpval = tx_agc[RF90_PATH_A] >> 8;
133 135
136 /*tmpval = tmpval & 0xff00ffff;*/
137
134 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); 138 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
135 139
136 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 140 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
@@ -153,148 +157,180 @@ void rtl88e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
153} 157}
154 158
155static void rtl88e_phy_get_power_base(struct ieee80211_hw *hw, 159static void rtl88e_phy_get_power_base(struct ieee80211_hw *hw,
156 u8 *pwrlvlofdm, u8 *pwrlvlbw20, 160 u8 *ppowerlevel_ofdm,
157 u8 *pwrlvlbw40, u8 channel, 161 u8 *ppowerlevel_bw20,
162 u8 *ppowerlevel_bw40, u8 channel,
158 u32 *ofdmbase, u32 *mcsbase) 163 u32 *ofdmbase, u32 *mcsbase)
159{ 164{
160 struct rtl_priv *rtlpriv = rtl_priv(hw); 165 struct rtl_priv *rtlpriv = rtl_priv(hw);
161 struct rtl_phy *rtlphy = &(rtlpriv->phy); 166 struct rtl_phy *rtlphy = &(rtlpriv->phy);
162 u32 base0, base1; 167 u32 powerbase0, powerbase1;
163 u8 i, powerlevel[2]; 168 u8 i, powerlevel[2];
164 169
165 for (i = 0; i < 2; i++) { 170 for (i = 0; i < 2; i++) {
166 base0 = pwrlvlofdm[i]; 171 powerbase0 = ppowerlevel_ofdm[i];
167 172
168 base0 = (base0 << 24) | (base0 << 16) | 173 powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
169 (base0 << 8) | base0; 174 (powerbase0 << 8) | powerbase0;
170 *(ofdmbase + i) = base0; 175 *(ofdmbase + i) = powerbase0;
171 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 176 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
172 "[OFDM power base index rf(%c) = 0x%x]\n", 177 " [OFDM power base index rf(%c) = 0x%x]\n",
173 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i)); 178 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i));
174 } 179 }
175 180
176 for (i = 0; i < 2; i++) { 181 for (i = 0; i < 2; i++) {
177 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) 182 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20)
178 powerlevel[i] = pwrlvlbw20[i]; 183 powerlevel[i] = ppowerlevel_bw20[i];
179 else 184 else
180 powerlevel[i] = pwrlvlbw40[i]; 185 powerlevel[i] = ppowerlevel_bw40[i];
181 base1 = powerlevel[i];
182 base1 = (base1 << 24) |
183 (base1 << 16) | (base1 << 8) | base1;
184 186
185 *(mcsbase + i) = base1; 187 powerbase1 = powerlevel[i];
188 powerbase1 = (powerbase1 << 24) |
189 (powerbase1 << 16) | (powerbase1 << 8) | powerbase1;
190
191 *(mcsbase + i) = powerbase1;
186 192
187 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 193 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
188 "[MCS power base index rf(%c) = 0x%x]\n", 194 " [MCS power base index rf(%c) = 0x%x]\n",
189 ((i == 0) ? 'A' : 'B'), *(mcsbase + i)); 195 ((i == 0) ? 'A' : 'B'), *(mcsbase + i));
190 } 196 }
191} 197}
192 198
193static void get_txpwr_by_reg(struct ieee80211_hw *hw, u8 chan, u8 index, 199static void _rtl88e_get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
194 u32 *base0, u32 *base1, u32 *outval) 200 u8 channel, u8 index,
201 u32 *powerbase0,
202 u32 *powerbase1,
203 u32 *p_outwriteval)
195{ 204{
196 struct rtl_priv *rtlpriv = rtl_priv(hw); 205 struct rtl_priv *rtlpriv = rtl_priv(hw);
197 struct rtl_phy *rtlphy = &(rtlpriv->phy); 206 struct rtl_phy *rtlphy = &(rtlpriv->phy);
198 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 207 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
199 u8 i, chg = 0, pwr_lim[4], pwr_diff = 0, cust_pwr_dif; 208 u8 i, chnlgroup = 0, pwr_diff_limit[4], pwr_diff = 0, customer_pwr_diff;
200 u32 writeval, cust_lim, rf, tmp; 209 u32 writeval, customer_limit, rf;
201 u8 ch = chan - 1;
202 u8 j;
203 210
204 for (rf = 0; rf < 2; rf++) { 211 for (rf = 0; rf < 2; rf++) {
205 j = index + (rf ? 8 : 0);
206 tmp = ((index < 2) ? base0[rf] : base1[rf]);
207 switch (rtlefuse->eeprom_regulatory) { 212 switch (rtlefuse->eeprom_regulatory) {
208 case 0: 213 case 0:
209 chg = 0; 214 chnlgroup = 0;
210 215
211 writeval = rtlphy->mcs_offset[chg][j] + tmp; 216 writeval =
217 rtlphy->mcs_txpwrlevel_origoffset
218 [chnlgroup][index + (rf ? 8 : 0)]
219 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
212 220
213 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 221 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
214 "RTK better performance, " 222 "RTK better performance, writeval(%c) = 0x%x\n",
215 "writeval(%c) = 0x%x\n",
216 ((rf == 0) ? 'A' : 'B'), writeval); 223 ((rf == 0) ? 'A' : 'B'), writeval);
217 break; 224 break;
218 case 1: 225 case 1:
219 if (rtlphy->pwrgroup_cnt == 1) { 226 if (rtlphy->pwrgroup_cnt == 1) {
220 chg = 0; 227 chnlgroup = 0;
221 } else { 228 } else {
222 chg = chan / 3; 229 if (channel < 3)
223 if (chan == 14) 230 chnlgroup = 0;
224 chg = 5; 231 else if (channel < 6)
232 chnlgroup = 1;
233 else if (channel < 9)
234 chnlgroup = 2;
235 else if (channel < 12)
236 chnlgroup = 3;
237 else if (channel < 14)
238 chnlgroup = 4;
239 else if (channel == 14)
240 chnlgroup = 5;
225 } 241 }
226 writeval = rtlphy->mcs_offset[chg][j] + tmp; 242
243 writeval =
244 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
245 [index + (rf ? 8 : 0)] + ((index < 2) ?
246 powerbase0[rf] :
247 powerbase1[rf]);
227 248
228 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 249 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
229 "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n", 250 "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
230 ((rf == 0) ? 'A' : 'B'), writeval); 251 ((rf == 0) ? 'A' : 'B'), writeval);
252
231 break; 253 break;
232 case 2: 254 case 2:
233 writeval = ((index < 2) ? base0[rf] : base1[rf]); 255 writeval =
256 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
234 257
235 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 258 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
236 "Better regulatory, writeval(%c) = 0x%x\n", 259 "Better regulatory, writeval(%c) = 0x%x\n",
237 ((rf == 0) ? 'A' : 'B'), writeval); 260 ((rf == 0) ? 'A' : 'B'), writeval);
238 break; 261 break;
239 case 3: 262 case 3:
240 chg = 0; 263 chnlgroup = 0;
241 264
242 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 265 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
243 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 266 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
244 "customer's limit, 40MHz rf(%c) = 0x%x\n", 267 "customer's limit, 40MHz rf(%c) = 0x%x\n",
245 ((rf == 0) ? 'A' : 'B'), 268 ((rf == 0) ? 'A' : 'B'),
246 rtlefuse->pwrgroup_ht40[rf][ch]); 269 rtlefuse->pwrgroup_ht40[rf][channel -
270 1]);
247 } else { 271 } else {
248 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 272 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
249 "customer's limit, 20MHz rf(%c) = 0x%x\n", 273 "customer's limit, 20MHz rf(%c) = 0x%x\n",
250 ((rf == 0) ? 'A' : 'B'), 274 ((rf == 0) ? 'A' : 'B'),
251 rtlefuse->pwrgroup_ht20[rf][ch]); 275 rtlefuse->pwrgroup_ht20[rf][channel -
276 1]);
252 } 277 }
253 278
254 if (index < 2) 279 if (index < 2)
255 pwr_diff = rtlefuse->txpwr_legacyhtdiff[rf][ch]; 280 pwr_diff =
281 rtlefuse->txpwr_legacyhtdiff[rf][channel-1];
256 else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) 282 else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20)
257 pwr_diff = rtlefuse->txpwr_ht20diff[rf][ch]; 283 pwr_diff =
284 rtlefuse->txpwr_ht20diff[rf][channel-1];
258 285
259 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) 286 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
260 cust_pwr_dif = rtlefuse->pwrgroup_ht40[rf][ch]; 287 customer_pwr_diff =
288 rtlefuse->pwrgroup_ht40[rf][channel-1];
261 else 289 else
262 cust_pwr_dif = rtlefuse->pwrgroup_ht20[rf][ch]; 290 customer_pwr_diff =
291 rtlefuse->pwrgroup_ht20[rf][channel-1];
263 292
264 if (pwr_diff > cust_pwr_dif) 293 if (pwr_diff > customer_pwr_diff)
265 pwr_diff = 0; 294 pwr_diff = 0;
266 else 295 else
267 pwr_diff = cust_pwr_dif - pwr_diff; 296 pwr_diff = customer_pwr_diff - pwr_diff;
268 297
269 for (i = 0; i < 4; i++) { 298 for (i = 0; i < 4; i++) {
270 pwr_lim[i] = (u8)((rtlphy->mcs_offset[chg][j] & 299 pwr_diff_limit[i] =
271 (0x7f << (i * 8))) >> (i * 8)); 300 (u8)((rtlphy->mcs_txpwrlevel_origoffset
272 301 [chnlgroup][index +
273 if (pwr_lim[i] > pwr_diff) 302 (rf ? 8 : 0)] & (0x7f <<
274 pwr_lim[i] = pwr_diff; 303 (i * 8))) >> (i * 8));
304
305 if (pwr_diff_limit[i] > pwr_diff)
306 pwr_diff_limit[i] = pwr_diff;
275 } 307 }
276 308
277 cust_lim = (pwr_lim[3] << 24) | (pwr_lim[2] << 16) | 309 customer_limit = (pwr_diff_limit[3] << 24) |
278 (pwr_lim[1] << 8) | (pwr_lim[0]); 310 (pwr_diff_limit[2] << 16) |
311 (pwr_diff_limit[1] << 8) | (pwr_diff_limit[0]);
279 312
280 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 313 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
281 "Customer's limit rf(%c) = 0x%x\n", 314 "Customer's limit rf(%c) = 0x%x\n",
282 ((rf == 0) ? 'A' : 'B'), cust_lim); 315 ((rf == 0) ? 'A' : 'B'), customer_limit);
283 316
284 writeval = cust_lim + tmp; 317 writeval = customer_limit +
318 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
285 319
286 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 320 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
287 "Customer, writeval rf(%c) = 0x%x\n", 321 "Customer, writeval rf(%c)= 0x%x\n",
288 ((rf == 0) ? 'A' : 'B'), writeval); 322 ((rf == 0) ? 'A' : 'B'), writeval);
289 break; 323 break;
290 default: 324 default:
291 chg = 0; 325 chnlgroup = 0;
292 writeval = rtlphy->mcs_offset[chg][j] + tmp; 326 writeval =
327 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
328 [index + (rf ? 8 : 0)]
329 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
293 330
294 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 331 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
295 "RTK better performance, writeval " 332 "RTK better performance, writeval rf(%c) = 0x%x\n",
296 "rf(%c) = 0x%x\n", 333 ((rf == 0) ? 'A' : 'B'), writeval);
297 ((rf == 0) ? 'A' : 'B'), writeval);
298 break; 334 break;
299 } 335 }
300 336
@@ -302,12 +338,13 @@ static void get_txpwr_by_reg(struct ieee80211_hw *hw, u8 chan, u8 index,
302 writeval = writeval - 0x06060606; 338 writeval = writeval - 0x06060606;
303 else if (rtlpriv->dm.dynamic_txhighpower_lvl == 339 else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
304 TXHIGHPWRLEVEL_BT2) 340 TXHIGHPWRLEVEL_BT2)
305 writeval -= 0x0c0c0c0c; 341 writeval = writeval - 0x0c0c0c0c;
306 *(outval + rf) = writeval; 342 *(p_outwriteval + rf) = writeval;
307 } 343 }
308} 344}
309 345
310static void write_ofdm_pwr(struct ieee80211_hw *hw, u8 index, u32 *pvalue) 346static void _rtl88e_write_ofdm_power_reg(struct ieee80211_hw *hw,
347 u8 index, u32 *value)
311{ 348{
312 struct rtl_priv *rtlpriv = rtl_priv(hw); 349 struct rtl_priv *rtlpriv = rtl_priv(hw);
313 u16 regoffset_a[6] = { 350 u16 regoffset_a[6] = {
@@ -325,16 +362,16 @@ static void write_ofdm_pwr(struct ieee80211_hw *hw, u8 index, u32 *pvalue)
325 u16 regoffset; 362 u16 regoffset;
326 363
327 for (rf = 0; rf < 2; rf++) { 364 for (rf = 0; rf < 2; rf++) {
328 writeval = pvalue[rf]; 365 writeval = value[rf];
329 for (i = 0; i < 4; i++) { 366 for (i = 0; i < 4; i++) {
330 pwr_val[i] = (u8) ((writeval & (0x7f << 367 pwr_val[i] = (u8)((writeval & (0x7f <<
331 (i * 8))) >> (i * 8)); 368 (i * 8))) >> (i * 8));
332 369
333 if (pwr_val[i] > RF6052_MAX_TX_PWR) 370 if (pwr_val[i] > RF6052_MAX_TX_PWR)
334 pwr_val[i] = RF6052_MAX_TX_PWR; 371 pwr_val[i] = RF6052_MAX_TX_PWR;
335 } 372 }
336 writeval = (pwr_val[3] << 24) | (pwr_val[2] << 16) | 373 writeval = (pwr_val[3] << 24) | (pwr_val[2] << 16) |
337 (pwr_val[1] << 8) | pwr_val[0]; 374 (pwr_val[1] << 8) | pwr_val[0];
338 375
339 if (rf == 0) 376 if (rf == 0)
340 regoffset = regoffset_a[index]; 377 regoffset = regoffset_a[index];
@@ -348,24 +385,27 @@ static void write_ofdm_pwr(struct ieee80211_hw *hw, u8 index, u32 *pvalue)
348} 385}
349 386
350void rtl88e_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, 387void rtl88e_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
351 u8 *pwrlvlofdm, 388 u8 *ppowerlevel_ofdm,
352 u8 *pwrlvlbw20, 389 u8 *ppowerlevel_bw20,
353 u8 *pwrlvlbw40, u8 chan) 390 u8 *ppowerlevel_bw40, u8 channel)
354{ 391{
355 u32 writeval[2], base0[2], base1[2]; 392 u32 writeval[2], powerbase0[2], powerbase1[2];
356 u8 index; 393 u8 index;
357 u8 direction; 394 u8 direction;
358 u32 pwrtrac_value; 395 u32 pwrtrac_value;
359 396
360 rtl88e_phy_get_power_base(hw, pwrlvlofdm, pwrlvlbw20, 397 rtl88e_phy_get_power_base(hw, ppowerlevel_ofdm,
361 pwrlvlbw40, chan, &base0[0], 398 ppowerlevel_bw20, ppowerlevel_bw40,
362 &base1[0]); 399 channel, &powerbase0[0], &powerbase1[0]);
363 400
364 rtl88e_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value); 401 rtl88e_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value);
365 402
366 for (index = 0; index < 6; index++) { 403 for (index = 0; index < 6; index++) {
367 get_txpwr_by_reg(hw, chan, index, &base0[0], &base1[0], 404 _rtl88e_get_txpower_writeval_by_regulatory(hw,
368 &writeval[0]); 405 channel, index,
406 &powerbase0[0],
407 &powerbase1[0],
408 &writeval[0]);
369 if (direction == 1) { 409 if (direction == 1) {
370 writeval[0] += pwrtrac_value; 410 writeval[0] += pwrtrac_value;
371 writeval[1] += pwrtrac_value; 411 writeval[1] += pwrtrac_value;
@@ -373,15 +413,28 @@ void rtl88e_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
373 writeval[0] -= pwrtrac_value; 413 writeval[0] -= pwrtrac_value;
374 writeval[1] -= pwrtrac_value; 414 writeval[1] -= pwrtrac_value;
375 } 415 }
376 write_ofdm_pwr(hw, index, &writeval[0]); 416 _rtl88e_write_ofdm_power_reg(hw, index, &writeval[0]);
377 } 417 }
378} 418}
379 419
380static bool rf6052_conf_para(struct ieee80211_hw *hw) 420bool rtl88e_phy_rf6052_config(struct ieee80211_hw *hw)
381{ 421{
382 struct rtl_priv *rtlpriv = rtl_priv(hw); 422 struct rtl_priv *rtlpriv = rtl_priv(hw);
383 struct rtl_phy *rtlphy = &(rtlpriv->phy); 423 struct rtl_phy *rtlphy = &(rtlpriv->phy);
384 u32 u4val = 0; 424
425 if (rtlphy->rf_type == RF_1T1R)
426 rtlphy->num_total_rfpath = 1;
427 else
428 rtlphy->num_total_rfpath = 2;
429
430 return _rtl88e_phy_rf6052_config_parafile(hw);
431}
432
433static bool _rtl88e_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
434{
435 struct rtl_priv *rtlpriv = rtl_priv(hw);
436 struct rtl_phy *rtlphy = &rtlpriv->phy;
437 u32 u4_regvalue = 0;
385 u8 rfpath; 438 u8 rfpath;
386 bool rtstatus = true; 439 bool rtstatus = true;
387 struct bb_reg_def *pphyreg; 440 struct bb_reg_def *pphyreg;
@@ -392,12 +445,12 @@ static bool rf6052_conf_para(struct ieee80211_hw *hw)
392 switch (rfpath) { 445 switch (rfpath) {
393 case RF90_PATH_A: 446 case RF90_PATH_A:
394 case RF90_PATH_C: 447 case RF90_PATH_C:
395 u4val = rtl_get_bbreg(hw, pphyreg->rfintfs, 448 u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
396 BRFSI_RFENV); 449 BRFSI_RFENV);
397 break; 450 break;
398 case RF90_PATH_B: 451 case RF90_PATH_B:
399 case RF90_PATH_D: 452 case RF90_PATH_D:
400 u4val = rtl_get_bbreg(hw, pphyreg->rfintfs, 453 u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
401 BRFSI_RFENV << 16); 454 BRFSI_RFENV << 16);
402 break; 455 break;
403 } 456 }
@@ -418,11 +471,11 @@ static bool rf6052_conf_para(struct ieee80211_hw *hw)
418 switch (rfpath) { 471 switch (rfpath) {
419 case RF90_PATH_A: 472 case RF90_PATH_A:
420 rtstatus = rtl88e_phy_config_rf_with_headerfile(hw, 473 rtstatus = rtl88e_phy_config_rf_with_headerfile(hw,
421 (enum radio_path)rfpath); 474 (enum radio_path)rfpath);
422 break; 475 break;
423 case RF90_PATH_B: 476 case RF90_PATH_B:
424 rtstatus = rtl88e_phy_config_rf_with_headerfile(hw, 477 rtstatus = rtl88e_phy_config_rf_with_headerfile(hw,
425 (enum radio_path)rfpath); 478 (enum radio_path)rfpath);
426 break; 479 break;
427 case RF90_PATH_C: 480 case RF90_PATH_C:
428 break; 481 break;
@@ -433,12 +486,13 @@ static bool rf6052_conf_para(struct ieee80211_hw *hw)
433 switch (rfpath) { 486 switch (rfpath) {
434 case RF90_PATH_A: 487 case RF90_PATH_A:
435 case RF90_PATH_C: 488 case RF90_PATH_C:
436 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, u4val); 489 rtl_set_bbreg(hw, pphyreg->rfintfs,
490 BRFSI_RFENV, u4_regvalue);
437 break; 491 break;
438 case RF90_PATH_B: 492 case RF90_PATH_B:
439 case RF90_PATH_D: 493 case RF90_PATH_D:
440 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16, 494 rtl_set_bbreg(hw, pphyreg->rfintfs,
441 u4val); 495 BRFSI_RFENV << 16, u4_regvalue);
442 break; 496 break;
443 } 497 }
444 498
@@ -447,21 +501,9 @@ static bool rf6052_conf_para(struct ieee80211_hw *hw)
447 "Radio[%d] Fail!!", rfpath); 501 "Radio[%d] Fail!!", rfpath);
448 return false; 502 return false;
449 } 503 }
504
450 } 505 }
451 506
452 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n"); 507 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
453 return rtstatus; 508 return rtstatus;
454} 509}
455
456bool rtl88e_phy_rf6052_config(struct ieee80211_hw *hw)
457{
458 struct rtl_priv *rtlpriv = rtl_priv(hw);
459 struct rtl_phy *rtlphy = &(rtlpriv->phy);
460
461 if (rtlphy->rf_type == RF_1T1R)
462 rtlphy->num_total_rfpath = 1;
463 else
464 rtlphy->num_total_rfpath = 2;
465
466 return rf6052_conf_para(hw);
467}
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h b/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h
index a39a2a3dbcc9..5c1472d88fd4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/rf.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -40,7 +36,8 @@ void rtl88e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
40void rtl88e_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, 36void rtl88e_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
41 u8 *ppowerlevel_ofdm, 37 u8 *ppowerlevel_ofdm,
42 u8 *ppowerlevel_bw20, 38 u8 *ppowerlevel_bw20,
43 u8 *ppowerlevel_bw40, u8 channel); 39 u8 *ppowerlevel_bw40,
40 u8 channel);
44bool rtl88e_phy_rf6052_config(struct ieee80211_hw *hw); 41bool rtl88e_phy_rf6052_config(struct ieee80211_hw *hw);
45 42
46#endif 43#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c b/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c
index 631b6907c17d..11344121c55e 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/sw.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,7 +26,6 @@
30#include "../wifi.h" 26#include "../wifi.h"
31#include "../core.h" 27#include "../core.h"
32#include "../pci.h" 28#include "../pci.h"
33#include "../base.h"
34#include "reg.h" 29#include "reg.h"
35#include "def.h" 30#include "def.h"
36#include "phy.h" 31#include "phy.h"
@@ -122,7 +117,7 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
122 0); 117 0);
123 118
124 rtlpci->irq_mask[0] = 119 rtlpci->irq_mask[0] =
125 (u32) (IMR_PSTIMEOUT | 120 (u32)(IMR_PSTIMEOUT |
126 IMR_HSISR_IND_ON_INT | 121 IMR_HSISR_IND_ON_INT |
127 IMR_C2HCMD | 122 IMR_C2HCMD |
128 IMR_HIGHDOK | 123 IMR_HIGHDOK |
@@ -143,6 +138,8 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
143 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 138 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
144 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 139 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
145 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; 140 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
141 if (rtlpriv->cfg->mod_params->disable_watchdog)
142 pr_info("watchdog disabled\n");
146 if (!rtlpriv->psc.inactiveps) 143 if (!rtlpriv->psc.inactiveps)
147 pr_info("rtl8188ee: Power Save off (module option)\n"); 144 pr_info("rtl8188ee: Power Save off (module option)\n");
148 if (!rtlpriv->psc.fwctrl_lps) 145 if (!rtlpriv->psc.fwctrl_lps)
@@ -162,7 +159,7 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
162 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE; 159 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
163 160
164 /* for firmware buf */ 161 /* for firmware buf */
165 rtlpriv->rtlhal.pfirmware = vmalloc(0x8000); 162 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
166 if (!rtlpriv->rtlhal.pfirmware) { 163 if (!rtlpriv->rtlhal.pfirmware) {
167 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 164 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
168 "Can't alloc buffer for fw.\n"); 165 "Can't alloc buffer for fw.\n");
@@ -199,7 +196,7 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
199 init_timer(&rtlpriv->works.fast_antenna_training_timer); 196 init_timer(&rtlpriv->works.fast_antenna_training_timer);
200 setup_timer(&rtlpriv->works.fast_antenna_training_timer, 197 setup_timer(&rtlpriv->works.fast_antenna_training_timer,
201 rtl88e_dm_fast_antenna_training_callback, 198 rtl88e_dm_fast_antenna_training_callback,
202 (unsigned long)hw); 199 (unsigned long)hw);
203 return err; 200 return err;
204} 201}
205 202
@@ -218,6 +215,12 @@ void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw)
218 del_timer_sync(&rtlpriv->works.fast_antenna_training_timer); 215 del_timer_sync(&rtlpriv->works.fast_antenna_training_timer);
219} 216}
220 217
218/* get bt coexist status */
219bool rtl88e_get_btc_status(void)
220{
221 return false;
222}
223
221static struct rtl_hal_ops rtl8188ee_hal_ops = { 224static struct rtl_hal_ops rtl8188ee_hal_ops = {
222 .init_sw_vars = rtl88e_init_sw_vars, 225 .init_sw_vars = rtl88e_init_sw_vars,
223 .deinit_sw_vars = rtl88e_deinit_sw_vars, 226 .deinit_sw_vars = rtl88e_deinit_sw_vars,
@@ -246,11 +249,12 @@ static struct rtl_hal_ops rtl8188ee_hal_ops = {
246 .set_bw_mode = rtl88e_phy_set_bw_mode, 249 .set_bw_mode = rtl88e_phy_set_bw_mode,
247 .switch_channel = rtl88e_phy_sw_chnl, 250 .switch_channel = rtl88e_phy_sw_chnl,
248 .dm_watchdog = rtl88e_dm_watchdog, 251 .dm_watchdog = rtl88e_dm_watchdog,
249 .scan_operation_backup = rtl_phy_scan_operation_backup, 252 .scan_operation_backup = rtl88e_phy_scan_operation_backup,
250 .set_rf_power_state = rtl88e_phy_set_rf_power_state, 253 .set_rf_power_state = rtl88e_phy_set_rf_power_state,
251 .led_control = rtl88ee_led_control, 254 .led_control = rtl88ee_led_control,
252 .set_desc = rtl88ee_set_desc, 255 .set_desc = rtl88ee_set_desc,
253 .get_desc = rtl88ee_get_desc, 256 .get_desc = rtl88ee_get_desc,
257 .is_tx_desc_closed = rtl88ee_is_tx_desc_closed,
254 .tx_polling = rtl88ee_tx_polling, 258 .tx_polling = rtl88ee_tx_polling,
255 .enable_hw_sec = rtl88ee_enable_hw_security_config, 259 .enable_hw_sec = rtl88ee_enable_hw_security_config,
256 .set_key = rtl88ee_set_key, 260 .set_key = rtl88ee_set_key,
@@ -259,14 +263,17 @@ static struct rtl_hal_ops rtl8188ee_hal_ops = {
259 .set_bbreg = rtl88e_phy_set_bb_reg, 263 .set_bbreg = rtl88e_phy_set_bb_reg,
260 .get_rfreg = rtl88e_phy_query_rf_reg, 264 .get_rfreg = rtl88e_phy_query_rf_reg,
261 .set_rfreg = rtl88e_phy_set_rf_reg, 265 .set_rfreg = rtl88e_phy_set_rf_reg,
266 .get_btc_status = rtl88e_get_btc_status,
267 .rx_command_packet = rtl88ee_rx_command_packet,
268
262}; 269};
263 270
264static struct rtl_mod_params rtl88ee_mod_params = { 271static struct rtl_mod_params rtl88ee_mod_params = {
265 .sw_crypto = false, 272 .sw_crypto = false,
266 .inactiveps = true, 273 .inactiveps = false,
267 .swctrl_lps = false, 274 .swctrl_lps = false,
268 .fwctrl_lps = true, 275 .fwctrl_lps = false,
269 .msi_support = false, 276 .msi_support = true,
270 .debug = DBG_EMERG, 277 .debug = DBG_EMERG,
271}; 278};
272 279
@@ -274,6 +281,7 @@ static struct rtl_hal_cfg rtl88ee_hal_cfg = {
274 .bar_id = 2, 281 .bar_id = 2,
275 .write_readback = true, 282 .write_readback = true,
276 .name = "rtl88e_pci", 283 .name = "rtl88e_pci",
284 .fw_name = "rtlwifi/rtl8188efw.bin",
277 .ops = &rtl8188ee_hal_ops, 285 .ops = &rtl8188ee_hal_ops,
278 .mod_params = &rtl88ee_mod_params, 286 .mod_params = &rtl88ee_mod_params,
279 287
@@ -285,6 +293,9 @@ static struct rtl_hal_cfg rtl88ee_hal_cfg = {
285 .maps[MAC_RCR_ACRC32] = ACRC32, 293 .maps[MAC_RCR_ACRC32] = ACRC32,
286 .maps[MAC_RCR_ACF] = ACF, 294 .maps[MAC_RCR_ACF] = ACF,
287 .maps[MAC_RCR_AAP] = AAP, 295 .maps[MAC_RCR_AAP] = AAP,
296 .maps[MAC_HIMR] = REG_HIMR,
297 .maps[MAC_HIMRE] = REG_HIMRE,
298 .maps[MAC_HSISR] = REG_HSISR,
288 299
289 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS, 300 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
290 301
@@ -345,6 +356,7 @@ static struct rtl_hal_cfg rtl88ee_hal_cfg = {
345 .maps[RTL_IMR_VIDOK] = IMR_VIDOK, 356 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
346 .maps[RTL_IMR_VODOK] = IMR_VODOK, 357 .maps[RTL_IMR_VODOK] = IMR_VODOK,
347 .maps[RTL_IMR_ROK] = IMR_ROK, 358 .maps[RTL_IMR_ROK] = IMR_ROK,
359 .maps[RTL_IMR_HSISR_IND] = IMR_HSISR_IND_ON_INT,
348 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER), 360 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
349 361
350 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M, 362 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
@@ -364,7 +376,7 @@ static struct rtl_hal_cfg rtl88ee_hal_cfg = {
364 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15, 376 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
365}; 377};
366 378
367static const struct pci_device_id rtl88ee_pci_ids[] = { 379static struct pci_device_id rtl88ee_pci_ids[] = {
368 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8179, rtl88ee_hal_cfg)}, 380 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8179, rtl88ee_hal_cfg)},
369 {}, 381 {},
370}; 382};
@@ -384,12 +396,15 @@ module_param_named(ips, rtl88ee_mod_params.inactiveps, bool, 0444);
384module_param_named(swlps, rtl88ee_mod_params.swctrl_lps, bool, 0444); 396module_param_named(swlps, rtl88ee_mod_params.swctrl_lps, bool, 0444);
385module_param_named(fwlps, rtl88ee_mod_params.fwctrl_lps, bool, 0444); 397module_param_named(fwlps, rtl88ee_mod_params.fwctrl_lps, bool, 0444);
386module_param_named(msi, rtl88ee_mod_params.msi_support, bool, 0444); 398module_param_named(msi, rtl88ee_mod_params.msi_support, bool, 0444);
399module_param_named(disable_watchdog, rtl88ee_mod_params.disable_watchdog,
400 bool, 0444);
387MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); 401MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
388MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); 402MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
389MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); 403MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
390MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); 404MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
391MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n"); 405MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
392MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); 406MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
407MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
393 408
394static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); 409static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
395 410
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/sw.h b/drivers/net/wireless/rtlwifi/rtl8188ee/sw.h
index 85e02b3bdff8..22398c3753a6 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/sw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/sw.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -32,5 +28,7 @@
32 28
33int rtl88e_init_sw_vars(struct ieee80211_hw *hw); 29int rtl88e_init_sw_vars(struct ieee80211_hw *hw);
34void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw); 30void rtl88e_deinit_sw_vars(struct ieee80211_hw *hw);
31bool rtl88e_get_btc_status(void);
32
35 33
36#endif 34#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/table.c b/drivers/net/wireless/rtlwifi/rtl8188ee/table.c
index fad373f97b2c..68bcb7fe6a65 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/table.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/table.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,7 +26,6 @@
30 *****************************************************************************/ 26 *****************************************************************************/
31 27
32#include "table.h" 28#include "table.h"
33
34u32 RTL8188EEPHY_REG_1TARRAY[] = { 29u32 RTL8188EEPHY_REG_1TARRAY[] = {
35 0x800, 0x80040000, 30 0x800, 0x80040000,
36 0x804, 0x00000003, 31 0x804, 0x00000003,
@@ -640,4 +635,5 @@ u32 RTL8188EEAGCTAB_1TARRAY[] = {
640 0xC78, 0x407D0001, 635 0xC78, 0x407D0001,
641 0xC78, 0x407E0001, 636 0xC78, 0x407E0001,
642 0xC78, 0x407F0001, 637 0xC78, 0x407F0001,
638
643}; 639};
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/table.h b/drivers/net/wireless/rtlwifi/rtl8188ee/table.h
index c1218e835129..403c4ddd236f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/table.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/table.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -35,13 +31,13 @@
35#include <linux/types.h> 31#include <linux/types.h>
36#define RTL8188EEPHY_REG_1TARRAYLEN 382 32#define RTL8188EEPHY_REG_1TARRAYLEN 382
37extern u32 RTL8188EEPHY_REG_1TARRAY[]; 33extern u32 RTL8188EEPHY_REG_1TARRAY[];
38#define RTL8188EEPHY_REG_ARRAY_PGLEN 264 34#define RTL8188EEPHY_REG_ARRAY_PGLEN 264
39extern u32 RTL8188EEPHY_REG_ARRAY_PG[]; 35extern u32 RTL8188EEPHY_REG_ARRAY_PG[];
40#define RTL8188EE_RADIOA_1TARRAYLEN 190 36#define RTL8188EE_RADIOA_1TARRAYLEN 190
41extern u32 RTL8188EE_RADIOA_1TARRAY[]; 37extern u32 RTL8188EE_RADIOA_1TARRAY[];
42#define RTL8188EEMAC_1T_ARRAYLEN 180 38#define RTL8188EEMAC_1T_ARRAYLEN 180
43extern u32 RTL8188EEMAC_1T_ARRAY[]; 39extern u32 RTL8188EEMAC_1T_ARRAY[];
44#define RTL8188EEAGCTAB_1TARRAYLEN 256 40#define RTL8188EEAGCTAB_1TARRAYLEN 256
45extern u32 RTL8188EEAGCTAB_1TARRAY[]; 41extern u32 RTL8188EEAGCTAB_1TARRAY[];
46 42
47#endif 43#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
index 5b4c225396f2..df549c96adef 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -37,6 +33,7 @@
37#include "trx.h" 33#include "trx.h"
38#include "led.h" 34#include "led.h"
39#include "dm.h" 35#include "dm.h"
36#include "phy.h"
40 37
41static u8 _rtl88ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue) 38static u8 _rtl88ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
42{ 39{
@@ -50,6 +47,164 @@ static u8 _rtl88ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
50 return skb->priority; 47 return skb->priority;
51} 48}
52 49
50/* mac80211's rate_idx is like this:
51 *
52 * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
53 *
54 * B/G rate:
55 * (rx_status->flag & RX_FLAG_HT) = 0,
56 * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
57 *
58 * N rate:
59 * (rx_status->flag & RX_FLAG_HT) = 1,
60 * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
61 *
62 * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
63 * A rate:
64 * (rx_status->flag & RX_FLAG_HT) = 0,
65 * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
66 *
67 * N rate:
68 * (rx_status->flag & RX_FLAG_HT) = 1,
69 * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
70 */
71static int _rtl88ee_rate_mapping(struct ieee80211_hw *hw,
72 bool isht, u8 desc_rate)
73{
74 int rate_idx;
75
76 if (!isht) {
77 if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
78 switch (desc_rate) {
79 case DESC92C_RATE1M:
80 rate_idx = 0;
81 break;
82 case DESC92C_RATE2M:
83 rate_idx = 1;
84 break;
85 case DESC92C_RATE5_5M:
86 rate_idx = 2;
87 break;
88 case DESC92C_RATE11M:
89 rate_idx = 3;
90 break;
91 case DESC92C_RATE6M:
92 rate_idx = 4;
93 break;
94 case DESC92C_RATE9M:
95 rate_idx = 5;
96 break;
97 case DESC92C_RATE12M:
98 rate_idx = 6;
99 break;
100 case DESC92C_RATE18M:
101 rate_idx = 7;
102 break;
103 case DESC92C_RATE24M:
104 rate_idx = 8;
105 break;
106 case DESC92C_RATE36M:
107 rate_idx = 9;
108 break;
109 case DESC92C_RATE48M:
110 rate_idx = 10;
111 break;
112 case DESC92C_RATE54M:
113 rate_idx = 11;
114 break;
115 default:
116 rate_idx = 0;
117 break;
118 }
119 } else {
120 switch (desc_rate) {
121 case DESC92C_RATE6M:
122 rate_idx = 0;
123 break;
124 case DESC92C_RATE9M:
125 rate_idx = 1;
126 break;
127 case DESC92C_RATE12M:
128 rate_idx = 2;
129 break;
130 case DESC92C_RATE18M:
131 rate_idx = 3;
132 break;
133 case DESC92C_RATE24M:
134 rate_idx = 4;
135 break;
136 case DESC92C_RATE36M:
137 rate_idx = 5;
138 break;
139 case DESC92C_RATE48M:
140 rate_idx = 6;
141 break;
142 case DESC92C_RATE54M:
143 rate_idx = 7;
144 break;
145 default:
146 rate_idx = 0;
147 break;
148 }
149 }
150 } else {
151 switch (desc_rate) {
152 case DESC92C_RATEMCS0:
153 rate_idx = 0;
154 break;
155 case DESC92C_RATEMCS1:
156 rate_idx = 1;
157 break;
158 case DESC92C_RATEMCS2:
159 rate_idx = 2;
160 break;
161 case DESC92C_RATEMCS3:
162 rate_idx = 3;
163 break;
164 case DESC92C_RATEMCS4:
165 rate_idx = 4;
166 break;
167 case DESC92C_RATEMCS5:
168 rate_idx = 5;
169 break;
170 case DESC92C_RATEMCS6:
171 rate_idx = 6;
172 break;
173 case DESC92C_RATEMCS7:
174 rate_idx = 7;
175 break;
176 case DESC92C_RATEMCS8:
177 rate_idx = 8;
178 break;
179 case DESC92C_RATEMCS9:
180 rate_idx = 9;
181 break;
182 case DESC92C_RATEMCS10:
183 rate_idx = 10;
184 break;
185 case DESC92C_RATEMCS11:
186 rate_idx = 11;
187 break;
188 case DESC92C_RATEMCS12:
189 rate_idx = 12;
190 break;
191 case DESC92C_RATEMCS13:
192 rate_idx = 13;
193 break;
194 case DESC92C_RATEMCS14:
195 rate_idx = 14;
196 break;
197 case DESC92C_RATEMCS15:
198 rate_idx = 15;
199 break;
200 default:
201 rate_idx = 0;
202 break;
203 }
204 }
205 return rate_idx;
206}
207
53static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw, 208static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
54 struct rtl_stats *pstatus, u8 *pdesc, 209 struct rtl_stats *pstatus, u8 *pdesc,
55 struct rx_fwinfo_88e *p_drvinfo, 210 struct rx_fwinfo_88e *p_drvinfo,
@@ -59,7 +214,8 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
59 struct rtl_priv *rtlpriv = rtl_priv(hw); 214 struct rtl_priv *rtlpriv = rtl_priv(hw);
60 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv); 215 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
61 struct phy_sts_cck_8192s_t *cck_buf; 216 struct phy_sts_cck_8192s_t *cck_buf;
62 struct phy_status_rpt *phystrpt = (struct phy_status_rpt *)p_drvinfo; 217 struct phy_status_rpt *phystrpt =
218 (struct phy_status_rpt *)p_drvinfo;
63 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 219 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
64 char rx_pwr_all = 0, rx_pwr[4]; 220 char rx_pwr_all = 0, rx_pwr[4];
65 u8 rf_rx_num = 0, evm, pwdb_all; 221 u8 rf_rx_num = 0, evm, pwdb_all;
@@ -72,11 +228,11 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
72 pstatus->packet_matchbssid = bpacket_match_bssid; 228 pstatus->packet_matchbssid = bpacket_match_bssid;
73 pstatus->packet_toself = bpacket_toself; 229 pstatus->packet_toself = bpacket_toself;
74 pstatus->packet_beacon = packet_beacon; 230 pstatus->packet_beacon = packet_beacon;
75 pstatus->rx_mimo_sig_qual[0] = -1; 231 pstatus->rx_mimo_signalquality[0] = -1;
76 pstatus->rx_mimo_sig_qual[1] = -1; 232 pstatus->rx_mimo_signalquality[1] = -1;
77 233
78 if (is_cck) { 234 if (is_cck) {
79 u8 cck_hipwr; 235 u8 cck_highpwr;
80 u8 cck_agc_rpt; 236 u8 cck_agc_rpt;
81 /* CCK Driver info Structure is not the same as OFDM packet. */ 237 /* CCK Driver info Structure is not the same as OFDM packet. */
82 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo; 238 cck_buf = (struct phy_sts_cck_8192s_t *)p_drvinfo;
@@ -87,53 +243,58 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
87 * hardware (for rate adaptive) 243 * hardware (for rate adaptive)
88 */ 244 */
89 if (ppsc->rfpwr_state == ERFON) 245 if (ppsc->rfpwr_state == ERFON)
90 cck_hipwr = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, 246 cck_highpwr =
247 (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2,
91 BIT(9)); 248 BIT(9));
92 else 249 else
93 cck_hipwr = false; 250 cck_highpwr = false;
94 251
95 lan_idx = ((cck_agc_rpt & 0xE0) >> 5); 252 lan_idx = ((cck_agc_rpt & 0xE0) >> 5);
96 vga_idx = (cck_agc_rpt & 0x1f); 253 vga_idx = (cck_agc_rpt & 0x1f);
97 switch (lan_idx) { 254 switch (lan_idx) {
98 case 7: 255 case 7:
99 if (vga_idx <= 27) 256 if (vga_idx <= 27)
100 rx_pwr_all = -100 + 2 * (27 - vga_idx); 257 /*VGA_idx = 27~2*/
258 rx_pwr_all = -100 + 2*(27-vga_idx);
101 else 259 else
102 rx_pwr_all = -100; 260 rx_pwr_all = -100;
103 break; 261 break;
104 case 6: 262 case 6:
105 rx_pwr_all = -48 + 2 * (2 - vga_idx); /*VGA_idx = 2~0*/ 263 /*VGA_idx = 2~0*/
264 rx_pwr_all = -48 + 2*(2-vga_idx);
106 break; 265 break;
107 case 5: 266 case 5:
108 rx_pwr_all = -42 + 2 * (7 - vga_idx); /*VGA_idx = 7~5*/ 267 /*VGA_idx = 7~5*/
268 rx_pwr_all = -42 + 2*(7-vga_idx);
109 break; 269 break;
110 case 4: 270 case 4:
111 rx_pwr_all = -36 + 2 * (7 - vga_idx); /*VGA_idx = 7~4*/ 271 /*VGA_idx = 7~4*/
272 rx_pwr_all = -36 + 2*(7-vga_idx);
112 break; 273 break;
113 case 3: 274 case 3:
114 rx_pwr_all = -24 + 2 * (7 - vga_idx); /*VGA_idx = 7~0*/ 275 /*VGA_idx = 7~0*/
276 rx_pwr_all = -24 + 2*(7-vga_idx);
115 break; 277 break;
116 case 2: 278 case 2:
117 if (cck_hipwr) 279 if (cck_highpwr)
118 rx_pwr_all = -12 + 2 * (5 - vga_idx); 280 /*VGA_idx = 5~0*/
281 rx_pwr_all = -12 + 2*(5-vga_idx);
119 else 282 else
120 rx_pwr_all = -6 + 2 * (5 - vga_idx); 283 rx_pwr_all = -6 + 2*(5-vga_idx);
121 break; 284 break;
122 case 1: 285 case 1:
123 rx_pwr_all = 8 - 2 * vga_idx; 286 rx_pwr_all = 8-2*vga_idx;
124 break; 287 break;
125 case 0: 288 case 0:
126 rx_pwr_all = 14 - 2 * vga_idx; 289 rx_pwr_all = 14-2*vga_idx;
127 break; 290 break;
128 default: 291 default:
129 break; 292 break;
130 } 293 }
131 rx_pwr_all += 6; 294 rx_pwr_all += 6;
132 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all); 295 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
133 /* CCK gain is smaller than OFDM/MCS gain, 296 /* CCK gain is smaller than OFDM/MCS gain, */
134 * so we add gain diff by experiences, 297 /* so we add gain diff by experiences, the val is 6 */
135 * the val is 6
136 */
137 pwdb_all += 6; 298 pwdb_all += 6;
138 if (pwdb_all > 100) 299 if (pwdb_all > 100)
139 pwdb_all = 100; 300 pwdb_all = 100;
@@ -148,10 +309,10 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
148 pwdb_all -= 8; 309 pwdb_all -= 8;
149 else if (pwdb_all > 4 && pwdb_all <= 14) 310 else if (pwdb_all > 4 && pwdb_all <= 14)
150 pwdb_all -= 4; 311 pwdb_all -= 4;
151 if (cck_hipwr == false) { 312 if (!cck_highpwr) {
152 if (pwdb_all >= 80) 313 if (pwdb_all >= 80)
153 pwdb_all = ((pwdb_all - 80)<<1) + 314 pwdb_all = ((pwdb_all-80)<<1) +
154 ((pwdb_all - 80)>>1) + 80; 315 ((pwdb_all-80)>>1) + 80;
155 else if ((pwdb_all <= 78) && (pwdb_all >= 20)) 316 else if ((pwdb_all <= 78) && (pwdb_all >= 20))
156 pwdb_all += 3; 317 pwdb_all += 3;
157 if (pwdb_all > 100) 318 if (pwdb_all > 100)
@@ -165,9 +326,9 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
165 if (bpacket_match_bssid) { 326 if (bpacket_match_bssid) {
166 u8 sq; 327 u8 sq;
167 328
168 if (pstatus->rx_pwdb_all > 40) { 329 if (pstatus->rx_pwdb_all > 40)
169 sq = 100; 330 sq = 100;
170 } else { 331 else {
171 sq = cck_buf->sq_rpt; 332 sq = cck_buf->sq_rpt;
172 if (sq > 64) 333 if (sq > 64)
173 sq = 0; 334 sq = 0;
@@ -178,8 +339,8 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
178 } 339 }
179 340
180 pstatus->signalquality = sq; 341 pstatus->signalquality = sq;
181 pstatus->rx_mimo_sig_qual[0] = sq; 342 pstatus->rx_mimo_signalquality[0] = sq;
182 pstatus->rx_mimo_sig_qual[1] = -1; 343 pstatus->rx_mimo_signalquality[1] = -1;
183 } 344 }
184 } else { 345 } else {
185 rtlpriv->dm.rfpath_rxenable[0] = 346 rtlpriv->dm.rfpath_rxenable[0] =
@@ -191,18 +352,20 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
191 if (rtlpriv->dm.rfpath_rxenable[i]) 352 if (rtlpriv->dm.rfpath_rxenable[i])
192 rf_rx_num++; 353 rf_rx_num++;
193 354
194 rx_pwr[i] = ((p_drvinfo->gain_trsw[i] & 0x3f) * 2)-110; 355 rx_pwr[i] = ((p_drvinfo->gain_trsw[i] &
356 0x3f) * 2) - 110;
195 357
196 /* Translate DBM to percentage. */ 358 /* Translate DBM to percentage. */
197 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]); 359 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
198 total_rssi += rssi; 360 total_rssi += rssi;
199 361
200 /* Get Rx snr value in DB */ 362 /* Get Rx snr value in DB */
201 rtlpriv->stats.rx_snr_db[i] = p_drvinfo->rxsnr[i] / 2; 363 rtlpriv->stats.rx_snr_db[i] =
364 (long)(p_drvinfo->rxsnr[i] / 2);
202 365
203 /* Record Signal Strength for next packet */ 366 /* Record Signal Strength for next packet */
204 if (bpacket_match_bssid) 367 if (bpacket_match_bssid)
205 pstatus->rx_mimo_signalstrength[i] = (u8) rssi; 368 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
206 } 369 }
207 370
208 /* (2)PWDB, Average PWDB cacluated by 371 /* (2)PWDB, Average PWDB cacluated by
@@ -227,11 +390,13 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
227 390
228 if (bpacket_match_bssid) { 391 if (bpacket_match_bssid) {
229 /* Fill value in RFD, Get the first 392 /* Fill value in RFD, Get the first
230 * spatial stream only 393 * spatial stream onlyi
231 */ 394 */
232 if (i == 0) 395 if (i == 0)
233 pstatus->signalquality = evm & 0xff; 396 pstatus->signalquality =
234 pstatus->rx_mimo_sig_qual[i] = evm & 0xff; 397 (u8)(evm & 0xff);
398 pstatus->rx_mimo_signalquality[i] =
399 (u8)(evm & 0xff);
235 } 400 }
236 } 401 }
237 } 402 }
@@ -241,10 +406,10 @@ static void _rtl88ee_query_rxphystatus(struct ieee80211_hw *hw,
241 */ 406 */
242 if (is_cck) 407 if (is_cck)
243 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw, 408 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
244 pwdb_all)); 409 pwdb_all));
245 else if (rf_rx_num != 0) 410 else if (rf_rx_num != 0)
246 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw, 411 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
247 total_rssi /= rf_rx_num)); 412 total_rssi /= rf_rx_num));
248 /*HW antenna diversity*/ 413 /*HW antenna diversity*/
249 rtldm->fat_table.antsel_rx_keep_0 = phystrpt->ant_sel; 414 rtldm->fat_table.antsel_rx_keep_0 = phystrpt->ant_sel;
250 rtldm->fat_table.antsel_rx_keep_1 = phystrpt->ant_sel_b; 415 rtldm->fat_table.antsel_rx_keep_1 = phystrpt->ant_sel_b;
@@ -256,34 +421,39 @@ static void _rtl88ee_smart_antenna(struct ieee80211_hw *hw,
256{ 421{
257 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 422 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
258 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 423 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
259 u8 ant_mux; 424 u8 antsel_tr_mux;
260 struct fast_ant_training *pfat = &(rtldm->fat_table); 425 struct fast_ant_training *pfat_table = &rtldm->fat_table;
261 426
262 if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV) { 427 if (rtlefuse->antenna_div_type == CG_TRX_SMART_ANTDIV) {
263 if (pfat->fat_state == FAT_TRAINING_STATE) { 428 if (pfat_table->fat_state == FAT_TRAINING_STATE) {
264 if (pstatus->packet_toself) { 429 if (pstatus->packet_toself) {
265 ant_mux = (pfat->antsel_rx_keep_2 << 2) | 430 antsel_tr_mux =
266 (pfat->antsel_rx_keep_1 << 1) | 431 (pfat_table->antsel_rx_keep_2 << 2) |
267 pfat->antsel_rx_keep_0; 432 (pfat_table->antsel_rx_keep_1 << 1) |
268 pfat->ant_sum[ant_mux] += pstatus->rx_pwdb_all; 433 pfat_table->antsel_rx_keep_0;
269 pfat->ant_cnt[ant_mux]++; 434 pfat_table->ant_sum[antsel_tr_mux] +=
435 pstatus->rx_pwdb_all;
436 pfat_table->ant_cnt[antsel_tr_mux]++;
270 } 437 }
271 } 438 }
272 } else if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) || 439 } else if ((rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV) ||
273 (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)) { 440 (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)) {
274 if (pstatus->packet_toself || pstatus->packet_matchbssid) { 441 if (pstatus->packet_toself || pstatus->packet_matchbssid) {
275 ant_mux = (pfat->antsel_rx_keep_2 << 2) | 442 antsel_tr_mux = (pfat_table->antsel_rx_keep_2 << 2) |
276 (pfat->antsel_rx_keep_1 << 1) | 443 (pfat_table->antsel_rx_keep_1 << 1) |
277 pfat->antsel_rx_keep_0; 444 pfat_table->antsel_rx_keep_0;
278 rtl88e_dm_ant_sel_statistics(hw, ant_mux, 0, 445 rtl88e_dm_ant_sel_statistics(hw, antsel_tr_mux, 0,
279 pstatus->rx_pwdb_all); 446 pstatus->rx_pwdb_all);
280 } 447 }
448
281 } 449 }
282} 450}
283 451
284static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw, 452static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
285 struct sk_buff *skb, struct rtl_stats *pstatus, 453 struct sk_buff *skb,
286 u8 *pdesc, struct rx_fwinfo_88e *p_drvinfo) 454 struct rtl_stats *pstatus,
455 u8 *pdesc,
456 struct rx_fwinfo_88e *p_drvinfo)
287{ 457{
288 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 458 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
289 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 459 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
@@ -292,42 +462,42 @@ static void _rtl88ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
292 u8 *praddr; 462 u8 *praddr;
293 u8 *psaddr; 463 u8 *psaddr;
294 __le16 fc; 464 __le16 fc;
295 u16 type, ufc; 465 bool packet_matchbssid, packet_toself, packet_beacon;
296 bool match_bssid, packet_toself, packet_beacon = false, addr;
297 466
298 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift; 467 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
299 468
300 hdr = (struct ieee80211_hdr *)tmp_buf; 469 hdr = (struct ieee80211_hdr *)tmp_buf;
301 fc = hdr->frame_control; 470 fc = hdr->frame_control;
302 ufc = le16_to_cpu(fc);
303 type = WLAN_FC_GET_TYPE(fc);
304 praddr = hdr->addr1; 471 praddr = hdr->addr1;
305 psaddr = ieee80211_get_SA(hdr); 472 psaddr = ieee80211_get_SA(hdr);
306 memcpy(pstatus->psaddr, psaddr, ETH_ALEN); 473 memcpy(pstatus->psaddr, psaddr, ETH_ALEN);
307 474
308 addr = ether_addr_equal(mac->bssid, 475 packet_matchbssid = ((!ieee80211_is_ctl(fc)) &&
309 (ufc & IEEE80211_FCTL_TODS) ? hdr->addr1 : 476 (ether_addr_equal(mac->bssid, ieee80211_has_tods(fc) ?
310 (ufc & IEEE80211_FCTL_FROMDS) ? hdr->addr2 : 477 hdr->addr1 : ieee80211_has_fromds(fc) ?
311 hdr->addr3); 478 hdr->addr2 : hdr->addr3)) &&
312 match_bssid = ((IEEE80211_FTYPE_CTL != type) && (!pstatus->hwerror) && 479 (!pstatus->hwerror) &&
313 (!pstatus->crc) && (!pstatus->icv)) && addr; 480 (!pstatus->crc) && (!pstatus->icv));
314 481
315 addr = ether_addr_equal(praddr, rtlefuse->dev_addr); 482 packet_toself = packet_matchbssid &&
316 packet_toself = match_bssid && addr; 483 (ether_addr_equal(praddr, rtlefuse->dev_addr));
317 484
318 if (ieee80211_is_beacon(fc)) 485 if (ieee80211_is_beacon(hdr->frame_control))
319 packet_beacon = true; 486 packet_beacon = true;
487 else
488 packet_beacon = false;
320 489
321 _rtl88ee_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo, 490 _rtl88ee_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
322 match_bssid, packet_toself, packet_beacon); 491 packet_matchbssid, packet_toself,
492 packet_beacon);
323 _rtl88ee_smart_antenna(hw, pstatus); 493 _rtl88ee_smart_antenna(hw, pstatus);
324 rtl_process_phyinfo(hw, tmp_buf, pstatus); 494 rtl_process_phyinfo(hw, tmp_buf, pstatus);
325} 495}
326 496
327static void insert_em(struct rtl_tcb_desc *ptcb_desc, u8 *virtualaddress) 497static void _rtl88ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
498 u8 *virtualaddress)
328{ 499{
329 u32 dwtmp = 0; 500 u32 dwtmp = 0;
330
331 memset(virtualaddress, 0, 8); 501 memset(virtualaddress, 0, 8);
332 502
333 SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num); 503 SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num);
@@ -335,7 +505,7 @@ static void insert_em(struct rtl_tcb_desc *ptcb_desc, u8 *virtualaddress)
335 dwtmp = ptcb_desc->empkt_len[0]; 505 dwtmp = ptcb_desc->empkt_len[0];
336 } else { 506 } else {
337 dwtmp = ptcb_desc->empkt_len[0]; 507 dwtmp = ptcb_desc->empkt_len[0];
338 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4; 508 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
339 dwtmp += ptcb_desc->empkt_len[1]; 509 dwtmp += ptcb_desc->empkt_len[1];
340 } 510 }
341 SET_EARLYMODE_LEN0(virtualaddress, dwtmp); 511 SET_EARLYMODE_LEN0(virtualaddress, dwtmp);
@@ -344,7 +514,7 @@ static void insert_em(struct rtl_tcb_desc *ptcb_desc, u8 *virtualaddress)
344 dwtmp = ptcb_desc->empkt_len[2]; 514 dwtmp = ptcb_desc->empkt_len[2];
345 } else { 515 } else {
346 dwtmp = ptcb_desc->empkt_len[2]; 516 dwtmp = ptcb_desc->empkt_len[2];
347 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4; 517 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
348 dwtmp += ptcb_desc->empkt_len[3]; 518 dwtmp += ptcb_desc->empkt_len[3];
349 } 519 }
350 SET_EARLYMODE_LEN1(virtualaddress, dwtmp); 520 SET_EARLYMODE_LEN1(virtualaddress, dwtmp);
@@ -352,7 +522,7 @@ static void insert_em(struct rtl_tcb_desc *ptcb_desc, u8 *virtualaddress)
352 dwtmp = ptcb_desc->empkt_len[4]; 522 dwtmp = ptcb_desc->empkt_len[4];
353 } else { 523 } else {
354 dwtmp = ptcb_desc->empkt_len[4]; 524 dwtmp = ptcb_desc->empkt_len[4];
355 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4; 525 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
356 dwtmp += ptcb_desc->empkt_len[5]; 526 dwtmp += ptcb_desc->empkt_len[5];
357 } 527 }
358 SET_EARLYMODE_LEN2_1(virtualaddress, dwtmp & 0xF); 528 SET_EARLYMODE_LEN2_1(virtualaddress, dwtmp & 0xF);
@@ -361,7 +531,7 @@ static void insert_em(struct rtl_tcb_desc *ptcb_desc, u8 *virtualaddress)
361 dwtmp = ptcb_desc->empkt_len[6]; 531 dwtmp = ptcb_desc->empkt_len[6];
362 } else { 532 } else {
363 dwtmp = ptcb_desc->empkt_len[6]; 533 dwtmp = ptcb_desc->empkt_len[6];
364 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4; 534 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
365 dwtmp += ptcb_desc->empkt_len[7]; 535 dwtmp += ptcb_desc->empkt_len[7];
366 } 536 }
367 SET_EARLYMODE_LEN3(virtualaddress, dwtmp); 537 SET_EARLYMODE_LEN3(virtualaddress, dwtmp);
@@ -369,7 +539,7 @@ static void insert_em(struct rtl_tcb_desc *ptcb_desc, u8 *virtualaddress)
369 dwtmp = ptcb_desc->empkt_len[8]; 539 dwtmp = ptcb_desc->empkt_len[8];
370 } else { 540 } else {
371 dwtmp = ptcb_desc->empkt_len[8]; 541 dwtmp = ptcb_desc->empkt_len[8];
372 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4; 542 dwtmp += ((dwtmp%4) ? (4-dwtmp%4) : 0)+4;
373 dwtmp += ptcb_desc->empkt_len[9]; 543 dwtmp += ptcb_desc->empkt_len[9];
374 } 544 }
375 SET_EARLYMODE_LEN4(virtualaddress, dwtmp); 545 SET_EARLYMODE_LEN4(virtualaddress, dwtmp);
@@ -387,21 +557,21 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
387 u32 phystatus = GET_RX_DESC_PHYST(pdesc); 557 u32 phystatus = GET_RX_DESC_PHYST(pdesc);
388 status->packet_report_type = (u8)GET_RX_STATUS_DESC_RPT_SEL(pdesc); 558 status->packet_report_type = (u8)GET_RX_STATUS_DESC_RPT_SEL(pdesc);
389 if (status->packet_report_type == TX_REPORT2) 559 if (status->packet_report_type == TX_REPORT2)
390 status->length = (u16) GET_RX_RPT2_DESC_PKT_LEN(pdesc); 560 status->length = (u16)GET_RX_RPT2_DESC_PKT_LEN(pdesc);
391 else 561 else
392 status->length = (u16) GET_RX_DESC_PKT_LEN(pdesc); 562 status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
393 status->rx_drvinfo_size = (u8) GET_RX_DESC_DRV_INFO_SIZE(pdesc) * 563 status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
394 RX_DRV_INFO_SIZE_UNIT; 564 RX_DRV_INFO_SIZE_UNIT;
395 status->rx_bufshift = (u8) (GET_RX_DESC_SHIFT(pdesc) & 0x03); 565 status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
396 status->icv = (u16) GET_RX_DESC_ICV(pdesc); 566 status->icv = (u16)GET_RX_DESC_ICV(pdesc);
397 status->crc = (u16) GET_RX_DESC_CRC32(pdesc); 567 status->crc = (u16)GET_RX_DESC_CRC32(pdesc);
398 status->hwerror = (status->crc | status->icv); 568 status->hwerror = (status->crc | status->icv);
399 status->decrypted = !GET_RX_DESC_SWDEC(pdesc); 569 status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
400 status->rate = (u8) GET_RX_DESC_RXMCS(pdesc); 570 status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
401 status->shortpreamble = (u16) GET_RX_DESC_SPLCP(pdesc); 571 status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc);
402 status->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1); 572 status->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1);
403 status->isfirst_ampdu = (bool) ((GET_RX_DESC_PAGGR(pdesc) == 1) && 573 status->isfirst_ampdu = (bool)((GET_RX_DESC_PAGGR(pdesc) == 1) &&
404 (GET_RX_DESC_FAGGR(pdesc) == 1)); 574 (GET_RX_DESC_FAGGR(pdesc) == 1));
405 if (status->packet_report_type == NORMAL_RX) 575 if (status->packet_report_type == NORMAL_RX)
406 status->timestamp_low = GET_RX_DESC_TSFL(pdesc); 576 status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
407 status->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc); 577 status->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
@@ -420,11 +590,14 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
420 status->wake_match = 0; 590 status->wake_match = 0;
421 if (status->wake_match) 591 if (status->wake_match)
422 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD, 592 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
423 "Get Wakeup Packet!! WakeMatch =%d\n", 593 "GGGGGGGGGGGGGet Wakeup Packet!! WakeMatch=%d\n",
424 status->wake_match); 594 status->wake_match);
425 rx_status->freq = hw->conf.chandef.chan->center_freq; 595 rx_status->freq = hw->conf.chandef.chan->center_freq;
426 rx_status->band = hw->conf.chandef.chan->band; 596 rx_status->band = hw->conf.chandef.chan->band;
427 597
598 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
599 + status->rx_bufshift);
600
428 if (status->crc) 601 if (status->crc)
429 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; 602 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
430 603
@@ -445,18 +618,11 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
445 * to decrypt it 618 * to decrypt it
446 */ 619 */
447 if (status->decrypted) { 620 if (status->decrypted) {
448 hdr = (struct ieee80211_hdr *)(skb->data + 621 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
449 status->rx_drvinfo_size + status->rx_bufshift);
450
451 if (!hdr) {
452 /* During testing, hdr was NULL */
453 return false;
454 }
455 if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
456 (ieee80211_has_protected(hdr->frame_control))) 622 (ieee80211_has_protected(hdr->frame_control)))
457 rx_status->flag &= ~RX_FLAG_DECRYPTED;
458 else
459 rx_status->flag |= RX_FLAG_DECRYPTED; 623 rx_status->flag |= RX_FLAG_DECRYPTED;
624 else
625 rx_status->flag &= ~RX_FLAG_DECRYPTED;
460 } 626 }
461 627
462 /* rate_idx: index of data rate into band's 628 /* rate_idx: index of data rate into band's
@@ -464,19 +630,18 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
464 * are use (RX_FLAG_HT) 630 * are use (RX_FLAG_HT)
465 * Notice: this is diff with windows define 631 * Notice: this is diff with windows define
466 */ 632 */
467 rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht, 633 rx_status->rate_idx = _rtl88ee_rate_mapping(hw,
468 status->rate, false); 634 status->is_ht, status->rate);
469 635
470 rx_status->mactime = status->timestamp_low; 636 rx_status->mactime = status->timestamp_low;
471 if (phystatus == true) { 637 if (phystatus == true) {
472 p_drvinfo = (struct rx_fwinfo_88e *)(skb->data + 638 p_drvinfo = (struct rx_fwinfo_88e *)(skb->data +
473 status->rx_bufshift); 639 status->rx_bufshift);
474 640
475 _rtl88ee_translate_rx_signal_stuff(hw, skb, status, pdesc, 641 _rtl88ee_translate_rx_signal_stuff(hw,
642 skb, status, pdesc,
476 p_drvinfo); 643 p_drvinfo);
477 } 644 }
478
479 /*rx_status->qual = status->signal; */
480 rx_status->signal = status->recvsignalpower + 10; 645 rx_status->signal = status->recvsignalpower + 10;
481 if (status->packet_report_type == TX_REPORT2) { 646 if (status->packet_report_type == TX_REPORT2) {
482 status->macid_valid_entry[0] = 647 status->macid_valid_entry[0] =
@@ -489,15 +654,17 @@ bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
489 654
490void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw, 655void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
491 struct ieee80211_hdr *hdr, u8 *pdesc_tx, 656 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
492 u8 *pbd_desc_tx, struct ieee80211_tx_info *info, 657 u8 *txbd, struct ieee80211_tx_info *info,
493 struct ieee80211_sta *sta, struct sk_buff *skb, 658 struct ieee80211_sta *sta,
659 struct sk_buff *skb,
494 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc) 660 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
661
495{ 662{
496 struct rtl_priv *rtlpriv = rtl_priv(hw); 663 struct rtl_priv *rtlpriv = rtl_priv(hw);
497 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 664 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
498 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 665 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
499 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 666 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
500 u8 *pdesc = pdesc_tx; 667 u8 *pdesc = (u8 *)pdesc_tx;
501 u16 seq_number; 668 u16 seq_number;
502 __le16 fc = hdr->frame_control; 669 __le16 fc = hdr->frame_control;
503 unsigned int buf_len = 0; 670 unsigned int buf_len = 0;
@@ -547,8 +714,9 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
547 if (ptcb_desc->empkt_num) { 714 if (ptcb_desc->empkt_num) {
548 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, 715 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
549 "Insert 8 byte.pTcb->EMPktNum:%d\n", 716 "Insert 8 byte.pTcb->EMPktNum:%d\n",
550 ptcb_desc->empkt_num); 717 ptcb_desc->empkt_num);
551 insert_em(ptcb_desc, (u8 *)(skb->data)); 718 _rtl88ee_insert_emcontent(ptcb_desc,
719 (u8 *)(skb->data));
552 } 720 }
553 } else { 721 } else {
554 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); 722 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
@@ -560,6 +728,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
560 short_gi = (ptcb_desc->use_shortgi) ? 1 : 0; 728 short_gi = (ptcb_desc->use_shortgi) ? 1 : 0;
561 else 729 else
562 short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0; 730 short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0;
731
563 SET_TX_DESC_DATA_SHORTGI(pdesc, short_gi); 732 SET_TX_DESC_DATA_SHORTGI(pdesc, short_gi);
564 733
565 if (info->flags & IEEE80211_TX_CTL_AMPDU) { 734 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
@@ -568,7 +737,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
568 } 737 }
569 SET_TX_DESC_SEQ(pdesc, seq_number); 738 SET_TX_DESC_SEQ(pdesc, seq_number);
570 SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable && 739 SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable &&
571 !ptcb_desc->cts_enable) ? 1 : 0)); 740 !ptcb_desc->cts_enable) ? 1 : 0));
572 SET_TX_DESC_HW_RTS_ENABLE(pdesc, 0); 741 SET_TX_DESC_HW_RTS_ENABLE(pdesc, 0);
573 SET_TX_DESC_CTS2SELF(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0)); 742 SET_TX_DESC_CTS2SELF(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0));
574 SET_TX_DESC_RTS_STBC(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0)); 743 SET_TX_DESC_RTS_STBC(pdesc, ((ptcb_desc->rts_stbc) ? 1 : 0));
@@ -581,17 +750,17 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
581 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) : 750 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
582 (ptcb_desc->rts_use_shortgi ? 1 : 0))); 751 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
583 752
584 if (ptcb_desc->btx_enable_sw_calc_duration) 753 if (ptcb_desc->tx_enable_sw_calc_duration)
585 SET_TX_DESC_NAV_USE_HDR(pdesc, 1); 754 SET_TX_DESC_NAV_USE_HDR(pdesc, 1);
586 755
587 if (bw_40) { 756 if (bw_40) {
588 if (ptcb_desc->packet_bw) { 757 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
589 SET_TX_DESC_DATA_BW(pdesc, 1); 758 SET_TX_DESC_DATA_BW(pdesc, 1);
590 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3); 759 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
591 } else { 760 } else {
592 SET_TX_DESC_DATA_BW(pdesc, 0); 761 SET_TX_DESC_DATA_BW(pdesc, 0);
593 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 762 SET_TX_DESC_TX_SUB_CARRIER(pdesc,
594 mac->cur_40_prime_sc); 763 mac->cur_40_prime_sc);
595 } 764 }
596 } else { 765 } else {
597 SET_TX_DESC_DATA_BW(pdesc, 0); 766 SET_TX_DESC_DATA_BW(pdesc, 0);
@@ -599,13 +768,14 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
599 } 768 }
600 769
601 SET_TX_DESC_LINIP(pdesc, 0); 770 SET_TX_DESC_LINIP(pdesc, 0);
602 SET_TX_DESC_PKT_SIZE(pdesc, (u16) skb_len); 771 SET_TX_DESC_PKT_SIZE(pdesc, (u16)skb_len);
603 if (sta) { 772 if (sta) {
604 u8 ampdu_density = sta->ht_cap.ampdu_density; 773 u8 ampdu_density = sta->ht_cap.ampdu_density;
605 SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density); 774 SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
606 } 775 }
607 if (info->control.hw_key) { 776 if (info->control.hw_key) {
608 struct ieee80211_key_conf *keyconf; 777 struct ieee80211_key_conf *keyconf;
778
609 keyconf = info->control.hw_key; 779 keyconf = info->control.hw_key;
610 switch (keyconf->cipher) { 780 switch (keyconf->cipher) {
611 case WLAN_CIPHER_SUITE_WEP40: 781 case WLAN_CIPHER_SUITE_WEP40:
@@ -619,6 +789,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
619 default: 789 default:
620 SET_TX_DESC_SEC_TYPE(pdesc, 0x0); 790 SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
621 break; 791 break;
792
622 } 793 }
623 } 794 }
624 795
@@ -629,6 +800,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
629 1 : 0); 800 1 : 0);
630 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0); 801 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
631 802
803 /*SET_TX_DESC_PWR_STATUS(pdesc, pwr_status);*/
632 /* Set TxRate and RTSRate in TxDesc */ 804 /* Set TxRate and RTSRate in TxDesc */
633 /* This prevent Tx initial rate of new-coming packets */ 805 /* This prevent Tx initial rate of new-coming packets */
634 /* from being overwritten by retried packet rate.*/ 806 /* from being overwritten by retried packet rate.*/
@@ -639,7 +811,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
639 if (ieee80211_is_data_qos(fc)) { 811 if (ieee80211_is_data_qos(fc)) {
640 if (mac->rdg_en) { 812 if (mac->rdg_en) {
641 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, 813 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
642 "Enable RDG function.\n"); 814 "Enable RDG function.\n");
643 SET_TX_DESC_RDG_ENABLE(pdesc, 1); 815 SET_TX_DESC_RDG_ENABLE(pdesc, 1);
644 SET_TX_DESC_HTC(pdesc, 1); 816 SET_TX_DESC_HTC(pdesc, 1);
645 } 817 }
@@ -648,7 +820,7 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
648 820
649 SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0)); 821 SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
650 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0)); 822 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
651 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) buf_len); 823 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)buf_len);
652 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping); 824 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
653 if (rtlpriv->dm.useramask) { 825 if (rtlpriv->dm.useramask) {
654 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index); 826 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
@@ -664,8 +836,9 @@ void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
664 SET_TX_DESC_HWSEQ_EN(pdesc, 1); 836 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
665 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1)); 837 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
666 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) || 838 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
667 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) 839 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
668 SET_TX_DESC_BMC(pdesc, 1); 840 SET_TX_DESC_BMC(pdesc, 1);
841 }
669 842
670 rtl88e_dm_set_tx_ant_by_tx_info(hw, pdesc, ptcb_desc->mac_id); 843 rtl88e_dm_set_tx_ant_by_tx_info(hw, pdesc, ptcb_desc->mac_id);
671 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n"); 844 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
@@ -733,8 +906,8 @@ void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw,
733 pdesc, TX_DESC_SIZE); 906 pdesc, TX_DESC_SIZE);
734} 907}
735 908
736void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, 909void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
737 u8 desc_name, u8 *val) 910 bool istx, u8 desc_name, u8 *val)
738{ 911{
739 if (istx == true) { 912 if (istx == true) {
740 switch (desc_name) { 913 switch (desc_name) {
@@ -745,7 +918,7 @@ void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
745 SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *)val); 918 SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *)val);
746 break; 919 break;
747 default: 920 default:
748 RT_ASSERT(false, "ERR txdesc :%d not processed\n", 921 RT_ASSERT(false, "ERR txdesc :%d not process\n",
749 desc_name); 922 desc_name);
750 break; 923 break;
751 } 924 }
@@ -764,7 +937,7 @@ void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
764 SET_RX_DESC_EOR(pdesc, 1); 937 SET_RX_DESC_EOR(pdesc, 1);
765 break; 938 break;
766 default: 939 default:
767 RT_ASSERT(false, "ERR rxdesc :%d not processed\n", 940 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
768 desc_name); 941 desc_name);
769 break; 942 break;
770 } 943 }
@@ -784,7 +957,7 @@ u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
784 ret = GET_TX_DESC_TX_BUFFER_ADDRESS(pdesc); 957 ret = GET_TX_DESC_TX_BUFFER_ADDRESS(pdesc);
785 break; 958 break;
786 default: 959 default:
787 RT_ASSERT(false, "ERR txdesc :%d not processed\n", 960 RT_ASSERT(false, "ERR txdesc :%d not process\n",
788 desc_name); 961 desc_name);
789 break; 962 break;
790 } 963 }
@@ -796,8 +969,11 @@ u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
796 case HW_DESC_RXPKT_LEN: 969 case HW_DESC_RXPKT_LEN:
797 ret = GET_RX_DESC_PKT_LEN(pdesc); 970 ret = GET_RX_DESC_PKT_LEN(pdesc);
798 break; 971 break;
972 case HW_DESC_RXBUFF_ADDR:
973 ret = GET_RX_DESC_BUFF_ADDR(pdesc);
974 break;
799 default: 975 default:
800 RT_ASSERT(false, "ERR rxdesc :%d not processed\n", 976 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
801 desc_name); 977 desc_name);
802 break; 978 break;
803 } 979 }
@@ -805,6 +981,22 @@ u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
805 return ret; 981 return ret;
806} 982}
807 983
984bool rtl88ee_is_tx_desc_closed(struct ieee80211_hw *hw, u8 hw_queue, u16 index)
985{
986 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
987 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
988 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
989 u8 own = (u8)rtl88ee_get_desc(entry, true, HW_DESC_OWN);
990
991 /*beacon packet will only use the first
992 *descriptor defautly,and the own may not
993 *be cleared by the hardware
994 */
995 if (own)
996 return false;
997 return true;
998}
999
808void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) 1000void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
809{ 1001{
810 struct rtl_priv *rtlpriv = rtl_priv(hw); 1002 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -815,3 +1007,10 @@ void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
815 BIT(0) << (hw_queue)); 1007 BIT(0) << (hw_queue));
816 } 1008 }
817} 1009}
1010
1011u32 rtl88ee_rx_command_packet(struct ieee80211_hw *hw,
1012 struct rtl_stats status,
1013 struct sk_buff *skb)
1014{
1015 return 0;
1016}
diff --git a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.h b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.h
index 8c2609412d2c..eab5ae0eb46c 100644
--- a/drivers/net/wireless/rtlwifi/rtl8188ee/trx.h
+++ b/drivers/net/wireless/rtlwifi/rtl8188ee/trx.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,59 +26,59 @@
30#ifndef __RTL92CE_TRX_H__ 26#ifndef __RTL92CE_TRX_H__
31#define __RTL92CE_TRX_H__ 27#define __RTL92CE_TRX_H__
32 28
33#define TX_DESC_SIZE 64 29#define TX_DESC_SIZE 64
34#define TX_DESC_AGGR_SUBFRAME_SIZE 32 30#define TX_DESC_AGGR_SUBFRAME_SIZE 32
35 31
36#define RX_DESC_SIZE 32 32#define RX_DESC_SIZE 32
37#define RX_DRV_INFO_SIZE_UNIT 8 33#define RX_DRV_INFO_SIZE_UNIT 8
38 34
39#define TX_DESC_NEXT_DESC_OFFSET 40 35#define TX_DESC_NEXT_DESC_OFFSET 40
40#define USB_HWDESC_HEADER_LEN 32 36#define USB_HWDESC_HEADER_LEN 32
41#define CRCLENGTH 4 37#define CRCLENGTH 4
42 38
43#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \ 39#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \
44 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 16, __val) 40 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 16, __val)
45#define SET_TX_DESC_OFFSET(__pdesc, __val) \ 41#define SET_TX_DESC_OFFSET(__pdesc, __val) \
46 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 8, __val) 42 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 8, __val)
47#define SET_TX_DESC_BMC(__pdesc, __val) \ 43#define SET_TX_DESC_BMC(__pdesc, __val) \
48 SET_BITS_TO_LE_4BYTE(__pdesc, 24, 1, __val) 44 SET_BITS_TO_LE_4BYTE(__pdesc, 24, 1, __val)
49#define SET_TX_DESC_HTC(__pdesc, __val) \ 45#define SET_TX_DESC_HTC(__pdesc, __val) \
50 SET_BITS_TO_LE_4BYTE(__pdesc, 25, 1, __val) 46 SET_BITS_TO_LE_4BYTE(__pdesc, 25, 1, __val)
51#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \ 47#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \
52 SET_BITS_TO_LE_4BYTE(__pdesc, 26, 1, __val) 48 SET_BITS_TO_LE_4BYTE(__pdesc, 26, 1, __val)
53#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \ 49#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \
54 SET_BITS_TO_LE_4BYTE(__pdesc, 27, 1, __val) 50 SET_BITS_TO_LE_4BYTE(__pdesc, 27, 1, __val)
55#define SET_TX_DESC_LINIP(__pdesc, __val) \ 51#define SET_TX_DESC_LINIP(__pdesc, __val) \
56 SET_BITS_TO_LE_4BYTE(__pdesc, 28, 1, __val) 52 SET_BITS_TO_LE_4BYTE(__pdesc, 28, 1, __val)
57#define SET_TX_DESC_NO_ACM(__pdesc, __val) \ 53#define SET_TX_DESC_NO_ACM(__pdesc, __val) \
58 SET_BITS_TO_LE_4BYTE(__pdesc, 29, 1, __val) 54 SET_BITS_TO_LE_4BYTE(__pdesc, 29, 1, __val)
59#define SET_TX_DESC_GF(__pdesc, __val) \ 55#define SET_TX_DESC_GF(__pdesc, __val) \
60 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val) 56 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
61#define SET_TX_DESC_OWN(__pdesc, __val) \ 57#define SET_TX_DESC_OWN(__pdesc, __val) \
62 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val) 58 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
63 59
64#define GET_TX_DESC_PKT_SIZE(__pdesc) \ 60#define GET_TX_DESC_PKT_SIZE(__pdesc) \
65 LE_BITS_TO_4BYTE(__pdesc, 0, 16) 61 LE_BITS_TO_4BYTE(__pdesc, 0, 16)
66#define GET_TX_DESC_OFFSET(__pdesc) \ 62#define GET_TX_DESC_OFFSET(__pdesc) \
67 LE_BITS_TO_4BYTE(__pdesc, 16, 8) 63 LE_BITS_TO_4BYTE(__pdesc, 16, 8)
68#define GET_TX_DESC_BMC(__pdesc) \ 64#define GET_TX_DESC_BMC(__pdesc) \
69 LE_BITS_TO_4BYTE(__pdesc, 24, 1) 65 LE_BITS_TO_4BYTE(__pdesc, 24, 1)
70#define GET_TX_DESC_HTC(__pdesc) \ 66#define GET_TX_DESC_HTC(__pdesc) \
71 LE_BITS_TO_4BYTE(__pdesc, 25, 1) 67 LE_BITS_TO_4BYTE(__pdesc, 25, 1)
72#define GET_TX_DESC_LAST_SEG(__pdesc) \ 68#define GET_TX_DESC_LAST_SEG(__pdesc) \
73 LE_BITS_TO_4BYTE(__pdesc, 26, 1) 69 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
74#define GET_TX_DESC_FIRST_SEG(__pdesc) \ 70#define GET_TX_DESC_FIRST_SEG(__pdesc) \
75 LE_BITS_TO_4BYTE(__pdesc, 27, 1) 71 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
76#define GET_TX_DESC_LINIP(__pdesc) \ 72#define GET_TX_DESC_LINIP(__pdesc) \
77 LE_BITS_TO_4BYTE(__pdesc, 28, 1) 73 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
78#define GET_TX_DESC_NO_ACM(__pdesc) \ 74#define GET_TX_DESC_NO_ACM(__pdesc) \
79 LE_BITS_TO_4BYTE(__pdesc, 29, 1) 75 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
80#define GET_TX_DESC_GF(__pdesc) \ 76#define GET_TX_DESC_GF(__pdesc) \
81 LE_BITS_TO_4BYTE(__pdesc, 30, 1) 77 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
82#define GET_TX_DESC_OWN(__pdesc) \ 78#define GET_TX_DESC_OWN(__pdesc) \
83 LE_BITS_TO_4BYTE(__pdesc, 31, 1) 79 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
84 80
85#define SET_TX_DESC_MACID(__pdesc, __val) \ 81#define SET_TX_DESC_MACID(__pdesc, __val) \
86 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 6, __val) 82 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 6, __val)
87#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \ 83#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \
88 SET_BITS_TO_LE_4BYTE(__pdesc+4, 8, 5, __val) 84 SET_BITS_TO_LE_4BYTE(__pdesc+4, 8, 5, __val)
@@ -90,11 +86,11 @@
90 SET_BITS_TO_LE_4BYTE(__pdesc+4, 13, 1, __val) 86 SET_BITS_TO_LE_4BYTE(__pdesc+4, 13, 1, __val)
91#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \ 87#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \
92 SET_BITS_TO_LE_4BYTE(__pdesc+4, 14, 1, __val) 88 SET_BITS_TO_LE_4BYTE(__pdesc+4, 14, 1, __val)
93#define SET_TX_DESC_PIFS(__pdesc, __val) \ 89#define SET_TX_DESC_PIFS(__pdesc, __val) \
94 SET_BITS_TO_LE_4BYTE(__pdesc+4, 15, 1, __val) 90 SET_BITS_TO_LE_4BYTE(__pdesc+4, 15, 1, __val)
95#define SET_TX_DESC_RATE_ID(__pdesc, __val) \ 91#define SET_TX_DESC_RATE_ID(__pdesc, __val) \
96 SET_BITS_TO_LE_4BYTE(__pdesc+4, 16, 4, __val) 92 SET_BITS_TO_LE_4BYTE(__pdesc+4, 16, 4, __val)
97#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \ 93#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \
98 SET_BITS_TO_LE_4BYTE(__pdesc+4, 20, 1, __val) 94 SET_BITS_TO_LE_4BYTE(__pdesc+4, 20, 1, __val)
99#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \ 95#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \
100 SET_BITS_TO_LE_4BYTE(__pdesc+4, 21, 1, __val) 96 SET_BITS_TO_LE_4BYTE(__pdesc+4, 21, 1, __val)
@@ -102,10 +98,10 @@
102 SET_BITS_TO_LE_4BYTE(__pdesc+4, 22, 2, __val) 98 SET_BITS_TO_LE_4BYTE(__pdesc+4, 22, 2, __val)
103#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \ 99#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \
104 SET_BITS_TO_LE_4BYTE(__pdesc+4, 26, 5, __val) 100 SET_BITS_TO_LE_4BYTE(__pdesc+4, 26, 5, __val)
105#define SET_TX_DESC_PADDING_LEN(__pdesc, __val) \ 101#define SET_TX_DESC_PADDING_LEN(__pdesc, __val) \
106 SET_BITS_TO_LE_4BYTE(__pdesc+4, 24, 8, __val) 102 SET_BITS_TO_LE_4BYTE(__pdesc+4, 24, 8, __val)
107 103
108#define GET_TX_DESC_MACID(__pdesc) \ 104#define GET_TX_DESC_MACID(__pdesc) \
109 LE_BITS_TO_4BYTE(__pdesc+4, 0, 5) 105 LE_BITS_TO_4BYTE(__pdesc+4, 0, 5)
110#define GET_TX_DESC_AGG_ENABLE(__pdesc) \ 106#define GET_TX_DESC_AGG_ENABLE(__pdesc) \
111 LE_BITS_TO_4BYTE(__pdesc+4, 5, 1) 107 LE_BITS_TO_4BYTE(__pdesc+4, 5, 1)
@@ -119,7 +115,7 @@
119 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1) 115 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1)
120#define GET_TX_DESC_LSIG_TXOP_EN(__pdesc) \ 116#define GET_TX_DESC_LSIG_TXOP_EN(__pdesc) \
121 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1) 117 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1)
122#define GET_TX_DESC_PIFS(__pdesc) \ 118#define GET_TX_DESC_PIFS(__pdesc) \
123 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1) 119 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1)
124#define GET_TX_DESC_RATE_ID(__pdesc) \ 120#define GET_TX_DESC_RATE_ID(__pdesc) \
125 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4) 121 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4)
@@ -205,7 +201,6 @@
205#define SET_TX_DESC_HWSEQ_EN(__pdesc, __val) \ 201#define SET_TX_DESC_HWSEQ_EN(__pdesc, __val) \
206 SET_BITS_TO_LE_4BYTE(__pdesc+12, 31, 1, __val) 202 SET_BITS_TO_LE_4BYTE(__pdesc+12, 31, 1, __val)
207 203
208
209#define GET_TX_DESC_NEXT_HEAP_PAGE(__pdesc) \ 204#define GET_TX_DESC_NEXT_HEAP_PAGE(__pdesc) \
210 LE_BITS_TO_4BYTE(__pdesc+12, 0, 8) 205 LE_BITS_TO_4BYTE(__pdesc+12, 0, 8)
211#define GET_TX_DESC_TAIL_PAGE(__pdesc) \ 206#define GET_TX_DESC_TAIL_PAGE(__pdesc) \
@@ -213,7 +208,6 @@
213#define GET_TX_DESC_SEQ(__pdesc) \ 208#define GET_TX_DESC_SEQ(__pdesc) \
214 LE_BITS_TO_4BYTE(__pdesc+12, 16, 12) 209 LE_BITS_TO_4BYTE(__pdesc+12, 16, 12)
215 210
216
217#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \ 211#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \
218 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 5, __val) 212 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 5, __val)
219#define SET_TX_DESC_AP_DCFE(__pdesc, __val) \ 213#define SET_TX_DESC_AP_DCFE(__pdesc, __val) \
@@ -386,7 +380,6 @@
386#define GET_TX_DESC_TX_BUFFER_SIZE(__pdesc) \ 380#define GET_TX_DESC_TX_BUFFER_SIZE(__pdesc) \
387 LE_BITS_TO_4BYTE(__pdesc+28, 0, 16) 381 LE_BITS_TO_4BYTE(__pdesc+28, 0, 16)
388 382
389
390#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc, __val) \ 383#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc, __val) \
391 SET_BITS_TO_LE_4BYTE(__pdesc+32, 0, 32, __val) 384 SET_BITS_TO_LE_4BYTE(__pdesc+32, 0, 32, __val)
392#define SET_TX_DESC_TX_BUFFER_ADDRESS64(__pdesc, __val) \ 385#define SET_TX_DESC_TX_BUFFER_ADDRESS64(__pdesc, __val) \
@@ -549,8 +542,10 @@ do { \
549 rxmcs == DESC92C_RATE5_5M ||\ 542 rxmcs == DESC92C_RATE5_5M ||\
550 rxmcs == DESC92C_RATE11M) 543 rxmcs == DESC92C_RATE11M)
551 544
545#define IS_LITTLE_ENDIAN 1
546
552struct phy_rx_agc_info_t { 547struct phy_rx_agc_info_t {
553 #ifdef __LITTLE_ENDIAN 548 #if IS_LITTLE_ENDIAN
554 u8 gain:7, trsw:1; 549 u8 gain:7, trsw:1;
555 #else 550 #else
556 u8 trsw:1, gain:7; 551 u8 trsw:1, gain:7;
@@ -562,7 +557,7 @@ struct phy_status_rpt {
562 u8 cck_sig_qual_ofdm_pwdb_all; 557 u8 cck_sig_qual_ofdm_pwdb_all;
563 u8 cck_agc_rpt_ofdm_cfosho_a; 558 u8 cck_agc_rpt_ofdm_cfosho_a;
564 u8 cck_rpt_b_ofdm_cfosho_b; 559 u8 cck_rpt_b_ofdm_cfosho_b;
565 u8 rsvd_1; 560 u8 rsvd_1;/* ch_corr_msb; */
566 u8 noise_power_db_msb; 561 u8 noise_power_db_msb;
567 u8 path_cfotail[2]; 562 u8 path_cfotail[2];
568 u8 pcts_mask[2]; 563 u8 pcts_mask[2];
@@ -574,7 +569,7 @@ struct phy_status_rpt {
574 u8 stream_target_csi[2]; 569 u8 stream_target_csi[2];
575 u8 sig_evm; 570 u8 sig_evm;
576 u8 rsvd_3; 571 u8 rsvd_3;
577#ifdef __LITTLE_ENDIAN 572#if IS_LITTLE_ENDIAN
578 u8 antsel_rx_keep_2:1; /*ex_intf_flg:1;*/ 573 u8 antsel_rx_keep_2:1; /*ex_intf_flg:1;*/
579 u8 sgi_en:1; 574 u8 sgi_en:1;
580 u8 rxsc:2; 575 u8 rxsc:2;
@@ -777,19 +772,25 @@ struct rx_desc_88e {
777 772
778void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw, 773void rtl88ee_tx_fill_desc(struct ieee80211_hw *hw,
779 struct ieee80211_hdr *hdr, u8 *pdesc_tx, 774 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
780 u8 *pbd_desc_tx, struct ieee80211_tx_info *info, 775 u8 *txbd, struct ieee80211_tx_info *info,
781 struct ieee80211_sta *sta, struct sk_buff *skb, 776 struct ieee80211_sta *sta,
777 struct sk_buff *skb,
782 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc); 778 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc);
783bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw, 779bool rtl88ee_rx_query_desc(struct ieee80211_hw *hw,
784 struct rtl_stats *status, 780 struct rtl_stats *status,
785 struct ieee80211_rx_status *rx_status, 781 struct ieee80211_rx_status *rx_status,
786 u8 *pdesc, struct sk_buff *skb); 782 u8 *pdesc, struct sk_buff *skb);
787void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, 783void rtl88ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
788 u8 desc_name, u8 *val); 784 bool istx, u8 desc_name, u8 *val);
789u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name); 785u32 rtl88ee_get_desc(u8 *pdesc, bool istx, u8 desc_name);
786bool rtl88ee_is_tx_desc_closed(struct ieee80211_hw *hw,
787 u8 hw_queue, u16 index);
790void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); 788void rtl88ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
791void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, 789void rtl88ee_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
792 bool b_firstseg, bool b_lastseg, 790 bool firstseg, bool lastseg,
793 struct sk_buff *skb); 791 struct sk_buff *skb);
792u32 rtl88ee_rx_command_packet(struct ieee80211_hw *hw,
793 struct rtl_stats status,
794 struct sk_buff *skb);
794 795
795#endif 796#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
index eb78fd8607f7..f6cb5aedfdd1 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/dm_common.c
@@ -1771,7 +1771,7 @@ static void rtl92c_check_bt_change(struct ieee80211_hw *hw)
1771 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1771 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1772 u8 tmp1byte = 0; 1772 u8 tmp1byte = 0;
1773 1773
1774 if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version) && 1774 if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version) &&
1775 rtlpcipriv->bt_coexist.bt_coexistence) 1775 rtlpcipriv->bt_coexist.bt_coexistence)
1776 tmp1byte |= BIT(5); 1776 tmp1byte |= BIT(5);
1777 if (rtlpcipriv->bt_coexist.bt_cur_state) { 1777 if (rtlpcipriv->bt_coexist.bt_cur_state) {
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
index 04a41628ceed..a00861b26ece 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,6 +26,7 @@
30#include "../wifi.h" 26#include "../wifi.h"
31#include "../pci.h" 27#include "../pci.h"
32#include "../base.h" 28#include "../base.h"
29#include "../core.h"
33#include "../rtl8192ce/reg.h" 30#include "../rtl8192ce/reg.h"
34#include "../rtl8192ce/def.h" 31#include "../rtl8192ce/def.h"
35#include "fw_common.h" 32#include "fw_common.h"
@@ -71,66 +68,31 @@ static void _rtl92c_enable_fw_download(struct ieee80211_hw *hw, bool enable)
71 } 68 }
72} 69}
73 70
74static void rtl_block_fw_writeN(struct ieee80211_hw *hw, const u8 *buffer,
75 u32 size)
76{
77 struct rtl_priv *rtlpriv = rtl_priv(hw);
78 u32 blockSize = REALTEK_USB_VENQT_MAX_BUF_SIZE - 20;
79 u8 *bufferPtr = (u8 *) buffer;
80 u32 i, offset, blockCount, remainSize;
81
82 blockCount = size / blockSize;
83 remainSize = size % blockSize;
84
85 for (i = 0; i < blockCount; i++) {
86 offset = i * blockSize;
87 rtlpriv->io.writeN_sync(rtlpriv,
88 (FW_8192C_START_ADDRESS + offset),
89 (void *)(bufferPtr + offset),
90 blockSize);
91 }
92
93 if (remainSize) {
94 offset = blockCount * blockSize;
95 rtlpriv->io.writeN_sync(rtlpriv,
96 (FW_8192C_START_ADDRESS + offset),
97 (void *)(bufferPtr + offset),
98 remainSize);
99 }
100}
101
102static void _rtl92c_fw_block_write(struct ieee80211_hw *hw, 71static void _rtl92c_fw_block_write(struct ieee80211_hw *hw,
103 const u8 *buffer, u32 size) 72 const u8 *buffer, u32 size)
104{ 73{
105 struct rtl_priv *rtlpriv = rtl_priv(hw); 74 struct rtl_priv *rtlpriv = rtl_priv(hw);
106 u32 blockSize = sizeof(u32); 75 u32 blocksize = sizeof(u32);
107 u8 *bufferPtr = (u8 *) buffer; 76 u8 *bufferptr = (u8 *)buffer;
108 u32 *pu4BytePtr = (u32 *) buffer; 77 u32 *pu4byteptr = (u32 *)buffer;
109 u32 i, offset, blockCount, remainSize; 78 u32 i, offset, blockcount, remainsize;
110 u32 data;
111
112 if (rtlpriv->io.writeN_sync) {
113 rtl_block_fw_writeN(hw, buffer, size);
114 return;
115 }
116 blockCount = size / blockSize;
117 remainSize = size % blockSize;
118 if (remainSize) {
119 /* the last word is < 4 bytes - pad it with zeros */
120 for (i = 0; i < 4 - remainSize; i++)
121 *(bufferPtr + size + i) = 0;
122 blockCount++;
123 }
124 79
125 for (i = 0; i < blockCount; i++) { 80 blockcount = size / blocksize;
126 offset = i * blockSize; 81 remainsize = size % blocksize;
127 /* for big-endian platforms, the firmware data need to be byte 82
128 * swapped as it was read as a byte string and will be written 83 for (i = 0; i < blockcount; i++) {
129 * as 32-bit dwords and byte swapped when written 84 offset = i * blocksize;
130 */
131 data = le32_to_cpu(*(__le32 *)(pu4BytePtr + i));
132 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset), 85 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset),
133 data); 86 *(pu4byteptr + i));
87 }
88
89 if (remainsize) {
90 offset = blockcount * blocksize;
91 bufferptr += offset;
92 for (i = 0; i < remainsize; i++) {
93 rtl_write_byte(rtlpriv, (FW_8192C_START_ADDRESS +
94 offset + i), *(bufferptr + i));
95 }
134 } 96 }
135} 97}
136 98
@@ -168,19 +130,20 @@ static void _rtl92c_write_fw(struct ieee80211_hw *hw,
168{ 130{
169 struct rtl_priv *rtlpriv = rtl_priv(hw); 131 struct rtl_priv *rtlpriv = rtl_priv(hw);
170 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 132 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
171 u8 *bufferPtr = buffer; 133 bool is_version_b;
134 u8 *bufferptr = (u8 *)buffer;
172 135
173 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "FW size is %d bytes\n", size); 136 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "FW size is %d bytes,\n", size);
174 137 is_version_b = IS_NORMAL_CHIP(version);
175 if (IS_CHIP_VER_B(version)) { 138 if (is_version_b) {
176 u32 pageNums, remainSize; 139 u32 pageNums, remainsize;
177 u32 page, offset; 140 u32 page, offset;
178 141
179 if (IS_HARDWARE_TYPE_8192CE(rtlhal)) 142 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8192CE)
180 _rtl92c_fill_dummy(bufferPtr, &size); 143 _rtl92c_fill_dummy(bufferptr, &size);
181 144
182 pageNums = size / FW_8192C_PAGE_SIZE; 145 pageNums = size / FW_8192C_PAGE_SIZE;
183 remainSize = size % FW_8192C_PAGE_SIZE; 146 remainsize = size % FW_8192C_PAGE_SIZE;
184 147
185 if (pageNums > 4) { 148 if (pageNums > 4) {
186 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 149 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
@@ -189,15 +152,15 @@ static void _rtl92c_write_fw(struct ieee80211_hw *hw,
189 152
190 for (page = 0; page < pageNums; page++) { 153 for (page = 0; page < pageNums; page++) {
191 offset = page * FW_8192C_PAGE_SIZE; 154 offset = page * FW_8192C_PAGE_SIZE;
192 _rtl92c_fw_page_write(hw, page, (bufferPtr + offset), 155 _rtl92c_fw_page_write(hw, page, (bufferptr + offset),
193 FW_8192C_PAGE_SIZE); 156 FW_8192C_PAGE_SIZE);
194 } 157 }
195 158
196 if (remainSize) { 159 if (remainsize) {
197 offset = pageNums * FW_8192C_PAGE_SIZE; 160 offset = pageNums * FW_8192C_PAGE_SIZE;
198 page = pageNums; 161 page = pageNums;
199 _rtl92c_fw_page_write(hw, page, (bufferPtr + offset), 162 _rtl92c_fw_page_write(hw, page, (bufferptr + offset),
200 remainSize); 163 remainsize);
201 } 164 }
202 } else { 165 } else {
203 _rtl92c_fw_block_write(hw, buffer, size); 166 _rtl92c_fw_block_write(hw, buffer, size);
@@ -207,6 +170,7 @@ static void _rtl92c_write_fw(struct ieee80211_hw *hw,
207static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw) 170static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
208{ 171{
209 struct rtl_priv *rtlpriv = rtl_priv(hw); 172 struct rtl_priv *rtlpriv = rtl_priv(hw);
173 int err = -EIO;
210 u32 counter = 0; 174 u32 counter = 0;
211 u32 value32; 175 u32 value32;
212 176
@@ -217,12 +181,13 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
217 181
218 if (counter >= FW_8192C_POLLING_TIMEOUT_COUNT) { 182 if (counter >= FW_8192C_POLLING_TIMEOUT_COUNT) {
219 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 183 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
220 "chksum report faill ! REG_MCUFWDL:0x%08x\n", value32); 184 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
221 return -EIO; 185 value32);
186 goto exit;
222 } 187 }
223 188
224 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, 189 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
225 "Checksum report OK ! REG_MCUFWDL:0x%08x\n", value32); 190 "Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32);
226 191
227 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL); 192 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
228 value32 |= MCUFWDL_RDY; 193 value32 |= MCUFWDL_RDY;
@@ -235,9 +200,10 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
235 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL); 200 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
236 if (value32 & WINTINI_RDY) { 201 if (value32 & WINTINI_RDY) {
237 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, 202 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
238 "Polling FW ready success!! REG_MCUFWDL:0x%08x\n", 203 "Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",
239 value32); 204 value32);
240 return 0; 205 err = 0;
206 goto exit;
241 } 207 }
242 208
243 mdelay(FW_8192C_POLLING_DELAY); 209 mdelay(FW_8192C_POLLING_DELAY);
@@ -245,8 +211,10 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
245 } while (counter++ < FW_8192C_POLLING_TIMEOUT_COUNT); 211 } while (counter++ < FW_8192C_POLLING_TIMEOUT_COUNT);
246 212
247 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 213 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
248 "Polling FW ready fail!! REG_MCUFWDL:0x%08x\n", value32); 214 "Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", value32);
249 return -EIO; 215
216exit:
217 return err;
250} 218}
251 219
252int rtl92c_download_fw(struct ieee80211_hw *hw) 220int rtl92c_download_fw(struct ieee80211_hw *hw)
@@ -256,21 +224,21 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
256 struct rtl92c_firmware_header *pfwheader; 224 struct rtl92c_firmware_header *pfwheader;
257 u8 *pfwdata; 225 u8 *pfwdata;
258 u32 fwsize; 226 u32 fwsize;
227 int err;
259 enum version_8192c version = rtlhal->version; 228 enum version_8192c version = rtlhal->version;
260 229
261 if (rtlpriv->max_fw_size == 0 || !rtlhal->pfirmware) 230 if (!rtlhal->pfirmware)
262 return 1; 231 return 1;
263 232
264 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware; 233 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware;
265 pfwdata = rtlhal->pfirmware; 234 pfwdata = (u8 *)rtlhal->pfirmware;
266 fwsize = rtlhal->fwsize; 235 fwsize = rtlhal->fwsize;
267 236
268 if (IS_FW_HEADER_EXIST(pfwheader)) { 237 if (IS_FW_HEADER_EXIST(pfwheader)) {
269 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 238 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
270 "Firmware Version(%d), Signature(%#x),Size(%d)\n", 239 "Firmware Version(%d), Signature(%#x),Size(%d)\n",
271 le16_to_cpu(pfwheader->version), 240 pfwheader->version, pfwheader->signature,
272 le16_to_cpu(pfwheader->signature), 241 (int)sizeof(struct rtl92c_firmware_header));
273 (uint)sizeof(struct rtl92c_firmware_header));
274 242
275 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header); 243 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header);
276 fwsize = fwsize - sizeof(struct rtl92c_firmware_header); 244 fwsize = fwsize - sizeof(struct rtl92c_firmware_header);
@@ -280,7 +248,8 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
280 _rtl92c_write_fw(hw, version, pfwdata, fwsize); 248 _rtl92c_write_fw(hw, version, pfwdata, fwsize);
281 _rtl92c_enable_fw_download(hw, false); 249 _rtl92c_enable_fw_download(hw, false);
282 250
283 if (_rtl92c_fw_free_to_go(hw)) { 251 err = _rtl92c_fw_free_to_go(hw);
252 if (err) {
284 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 253 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
285 "Firmware is not ready to run!\n"); 254 "Firmware is not ready to run!\n");
286 } else { 255 } else {
@@ -307,7 +276,7 @@ static bool _rtl92c_check_fw_read_last_h2c(struct ieee80211_hw *hw, u8 boxnum)
307} 276}
308 277
309static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw, 278static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
310 u8 element_id, u32 cmd_len, u8 *p_cmdbuffer) 279 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
311{ 280{
312 struct rtl_priv *rtlpriv = rtl_priv(hw); 281 struct rtl_priv *rtlpriv = rtl_priv(hw);
313 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 282 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
@@ -315,7 +284,8 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
315 u16 box_reg = 0, box_extreg = 0; 284 u16 box_reg = 0, box_extreg = 0;
316 u8 u1b_tmp; 285 u8 u1b_tmp;
317 bool isfw_read = false; 286 bool isfw_read = false;
318 bool bwrite_success = false; 287 u8 buf_index = 0;
288 bool bwrite_sucess = false;
319 u8 wait_h2c_limmit = 100; 289 u8 wait_h2c_limmit = 100;
320 u8 wait_writeh2c_limmit = 100; 290 u8 wait_writeh2c_limmit = 100;
321 u8 boxcontent[4], boxextcontent[2]; 291 u8 boxcontent[4], boxextcontent[2];
@@ -329,16 +299,15 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
329 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 299 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
330 if (rtlhal->h2c_setinprogress) { 300 if (rtlhal->h2c_setinprogress) {
331 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 301 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
332 "H2C set in progress! Wait to set..element_id(%d)\n", 302 "H2C set in progress! Wait to set..element_id(%d).\n",
333 element_id); 303 element_id);
334
335 while (rtlhal->h2c_setinprogress) { 304 while (rtlhal->h2c_setinprogress) {
336 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, 305 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
337 flag); 306 flag);
338 h2c_waitcounter++; 307 h2c_waitcounter++;
339 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 308 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
340 "Wait 100 us (%d times)...\n", 309 "Wait 100 us (%d times)...\n",
341 h2c_waitcounter); 310 h2c_waitcounter);
342 udelay(100); 311 udelay(100);
343 312
344 if (h2c_waitcounter > 1000) 313 if (h2c_waitcounter > 1000)
@@ -354,7 +323,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
354 } 323 }
355 } 324 }
356 325
357 while (!bwrite_success) { 326 while (!bwrite_sucess) {
358 wait_writeh2c_limmit--; 327 wait_writeh2c_limmit--;
359 if (wait_writeh2c_limmit == 0) { 328 if (wait_writeh2c_limmit == 0) {
360 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 329 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
@@ -381,14 +350,13 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
381 box_extreg = REG_HMEBOX_EXT_3; 350 box_extreg = REG_HMEBOX_EXT_3;
382 break; 351 break;
383 default: 352 default:
384 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 353 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
385 "switch case not processed\n"); 354 "switch case not process\n");
386 break; 355 break;
387 } 356 }
388 357
389 isfw_read = _rtl92c_check_fw_read_last_h2c(hw, boxnum); 358 isfw_read = _rtl92c_check_fw_read_last_h2c(hw, boxnum);
390 while (!isfw_read) { 359 while (!isfw_read) {
391
392 wait_h2c_limmit--; 360 wait_h2c_limmit--;
393 if (wait_h2c_limmit == 0) { 361 if (wait_h2c_limmit == 0) {
394 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 362 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
@@ -408,7 +376,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
408 376
409 if (!isfw_read) { 377 if (!isfw_read) {
410 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 378 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
411 "Write H2C register BOX[%d] fail!!!!! Fw do not read\n", 379 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
412 boxnum); 380 boxnum);
413 break; 381 break;
414 } 382 }
@@ -418,13 +386,13 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
418 boxcontent[0] = element_id; 386 boxcontent[0] = element_id;
419 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 387 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
420 "Write element_id box_reg(%4x) = %2x\n", 388 "Write element_id box_reg(%4x) = %2x\n",
421 box_reg, element_id); 389 box_reg, element_id);
422 390
423 switch (cmd_len) { 391 switch (cmd_len) {
424 case 1: 392 case 1:
425 boxcontent[0] &= ~(BIT(7)); 393 boxcontent[0] &= ~(BIT(7));
426 memcpy((u8 *) (boxcontent) + 1, 394 memcpy((u8 *)(boxcontent) + 1,
427 p_cmdbuffer, 1); 395 cmdbuffer + buf_index, 1);
428 396
429 for (idx = 0; idx < 4; idx++) { 397 for (idx = 0; idx < 4; idx++) {
430 rtl_write_byte(rtlpriv, box_reg + idx, 398 rtl_write_byte(rtlpriv, box_reg + idx,
@@ -433,8 +401,8 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
433 break; 401 break;
434 case 2: 402 case 2:
435 boxcontent[0] &= ~(BIT(7)); 403 boxcontent[0] &= ~(BIT(7));
436 memcpy((u8 *) (boxcontent) + 1, 404 memcpy((u8 *)(boxcontent) + 1,
437 p_cmdbuffer, 2); 405 cmdbuffer + buf_index, 2);
438 406
439 for (idx = 0; idx < 4; idx++) { 407 for (idx = 0; idx < 4; idx++) {
440 rtl_write_byte(rtlpriv, box_reg + idx, 408 rtl_write_byte(rtlpriv, box_reg + idx,
@@ -443,8 +411,8 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
443 break; 411 break;
444 case 3: 412 case 3:
445 boxcontent[0] &= ~(BIT(7)); 413 boxcontent[0] &= ~(BIT(7));
446 memcpy((u8 *) (boxcontent) + 1, 414 memcpy((u8 *)(boxcontent) + 1,
447 p_cmdbuffer, 3); 415 cmdbuffer + buf_index, 3);
448 416
449 for (idx = 0; idx < 4; idx++) { 417 for (idx = 0; idx < 4; idx++) {
450 rtl_write_byte(rtlpriv, box_reg + idx, 418 rtl_write_byte(rtlpriv, box_reg + idx,
@@ -453,10 +421,10 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
453 break; 421 break;
454 case 4: 422 case 4:
455 boxcontent[0] |= (BIT(7)); 423 boxcontent[0] |= (BIT(7));
456 memcpy((u8 *) (boxextcontent), 424 memcpy((u8 *)(boxextcontent),
457 p_cmdbuffer, 2); 425 cmdbuffer + buf_index, 2);
458 memcpy((u8 *) (boxcontent) + 1, 426 memcpy((u8 *)(boxcontent) + 1,
459 p_cmdbuffer + 2, 2); 427 cmdbuffer + buf_index + 2, 2);
460 428
461 for (idx = 0; idx < 2; idx++) { 429 for (idx = 0; idx < 2; idx++) {
462 rtl_write_byte(rtlpriv, box_extreg + idx, 430 rtl_write_byte(rtlpriv, box_extreg + idx,
@@ -470,10 +438,10 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
470 break; 438 break;
471 case 5: 439 case 5:
472 boxcontent[0] |= (BIT(7)); 440 boxcontent[0] |= (BIT(7));
473 memcpy((u8 *) (boxextcontent), 441 memcpy((u8 *)(boxextcontent),
474 p_cmdbuffer, 2); 442 cmdbuffer + buf_index, 2);
475 memcpy((u8 *) (boxcontent) + 1, 443 memcpy((u8 *)(boxcontent) + 1,
476 p_cmdbuffer + 2, 3); 444 cmdbuffer + buf_index + 2, 3);
477 445
478 for (idx = 0; idx < 2; idx++) { 446 for (idx = 0; idx < 2; idx++) {
479 rtl_write_byte(rtlpriv, box_extreg + idx, 447 rtl_write_byte(rtlpriv, box_extreg + idx,
@@ -486,12 +454,12 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
486 } 454 }
487 break; 455 break;
488 default: 456 default:
489 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 457 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
490 "switch case not processed\n"); 458 "switch case not process\n");
491 break; 459 break;
492 } 460 }
493 461
494 bwrite_success = true; 462 bwrite_sucess = true;
495 463
496 rtlhal->last_hmeboxnum = boxnum + 1; 464 rtlhal->last_hmeboxnum = boxnum + 1;
497 if (rtlhal->last_hmeboxnum == 4) 465 if (rtlhal->last_hmeboxnum == 4)
@@ -499,7 +467,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
499 467
500 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 468 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
501 "pHalData->last_hmeboxnum = %d\n", 469 "pHalData->last_hmeboxnum = %d\n",
502 rtlhal->last_hmeboxnum); 470 rtlhal->last_hmeboxnum);
503 } 471 }
504 472
505 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 473 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
@@ -510,12 +478,19 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
510} 478}
511 479
512void rtl92c_fill_h2c_cmd(struct ieee80211_hw *hw, 480void rtl92c_fill_h2c_cmd(struct ieee80211_hw *hw,
513 u8 element_id, u32 cmd_len, u8 *p_cmdbuffer) 481 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
514{ 482{
483 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
515 u32 tmp_cmdbuf[2]; 484 u32 tmp_cmdbuf[2];
516 485
486 if (!rtlhal->fw_ready) {
487 RT_ASSERT(false,
488 "return H2C cmd because of Fw download fail!!!\n");
489 return;
490 }
491
517 memset(tmp_cmdbuf, 0, 8); 492 memset(tmp_cmdbuf, 0, 8);
518 memcpy(tmp_cmdbuf, p_cmdbuffer, cmd_len); 493 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
519 _rtl92c_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf); 494 _rtl92c_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
520 495
521 return; 496 return;
@@ -534,7 +509,7 @@ void rtl92c_firmware_selfreset(struct ieee80211_hw *hw)
534 while (u1b_tmp & BIT(2)) { 509 while (u1b_tmp & BIT(2)) {
535 delay--; 510 delay--;
536 if (delay == 0) { 511 if (delay == 0) {
537 RT_ASSERT(false, "8051 reset fail\n"); 512 RT_ASSERT(false, "8051 reset fail.\n");
538 break; 513 break;
539 } 514 }
540 udelay(50); 515 udelay(50);
@@ -546,56 +521,24 @@ EXPORT_SYMBOL(rtl92c_firmware_selfreset);
546void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode) 521void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
547{ 522{
548 struct rtl_priv *rtlpriv = rtl_priv(hw); 523 struct rtl_priv *rtlpriv = rtl_priv(hw);
549 u8 u1_h2c_set_pwrmode[3] = {0}; 524 u8 u1_h2c_set_pwrmode[3] = { 0 };
550 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 525 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
551 526
552 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); 527 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
553 528
554 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode); 529 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode);
555 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 530 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
556 (rtlpriv->mac80211.p2p) ? 531 (rtlpriv->mac80211.p2p) ? ppsc->smart_ps : 1);
557 ppsc->smart_ps : 1);
558 SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode, 532 SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode,
559 ppsc->reg_max_lps_awakeintvl); 533 ppsc->reg_max_lps_awakeintvl);
560 534
561 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 535 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
562 "rtl92c_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode", 536 "rtl92c_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode\n",
563 u1_h2c_set_pwrmode, 3); 537 u1_h2c_set_pwrmode, 3);
564 rtl92c_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode); 538 rtl92c_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
565
566} 539}
567EXPORT_SYMBOL(rtl92c_set_fw_pwrmode_cmd); 540EXPORT_SYMBOL(rtl92c_set_fw_pwrmode_cmd);
568 541
569static bool _rtl92c_cmd_send_packet(struct ieee80211_hw *hw,
570 struct sk_buff *skb)
571{
572 struct rtl_priv *rtlpriv = rtl_priv(hw);
573 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
574 struct rtl8192_tx_ring *ring;
575 struct rtl_tx_desc *pdesc;
576 unsigned long flags;
577 struct sk_buff *pskb = NULL;
578
579 ring = &rtlpci->tx_ring[BEACON_QUEUE];
580
581 pskb = __skb_dequeue(&ring->queue);
582 kfree_skb(pskb);
583
584 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
585
586 pdesc = &ring->desc[0];
587
588 rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *) pdesc, 1, 1, skb);
589
590 __skb_queue_tail(&ring->queue, skb);
591
592 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
593
594 rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
595
596 return true;
597}
598
599#define BEACON_PG 0 /*->1*/ 542#define BEACON_PG 0 /*->1*/
600#define PSPOLL_PG 2 543#define PSPOLL_PG 2
601#define NULL_PG 3 544#define NULL_PG 3
@@ -713,7 +656,7 @@ static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
714}; 657};
715 658
716void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished) 659void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
717{ 660{
718 struct rtl_priv *rtlpriv = rtl_priv(hw); 661 struct rtl_priv *rtlpriv = rtl_priv(hw);
719 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 662 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -721,13 +664,13 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
721 664
722 u32 totalpacketlen; 665 u32 totalpacketlen;
723 bool rtstatus; 666 bool rtstatus;
724 u8 u1RsvdPageLoc[3] = {0}; 667 u8 u1rsvdpageloc[3] = { 0 };
725 bool dlok = false; 668 bool b_dlok = false;
726 669
727 u8 *beacon; 670 u8 *beacon;
728 u8 *pspoll; 671 u8 *p_pspoll;
729 u8 *nullfunc; 672 u8 *nullfunc;
730 u8 *probersp; 673 u8 *p_probersp;
731 /*--------------------------------------------------------- 674 /*---------------------------------------------------------
732 (1) beacon 675 (1) beacon
733 ---------------------------------------------------------*/ 676 ---------------------------------------------------------*/
@@ -738,12 +681,12 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
738 /*------------------------------------------------------- 681 /*-------------------------------------------------------
739 (2) ps-poll 682 (2) ps-poll
740 --------------------------------------------------------*/ 683 --------------------------------------------------------*/
741 pspoll = &reserved_page_packet[PSPOLL_PG * 128]; 684 p_pspoll = &reserved_page_packet[PSPOLL_PG * 128];
742 SET_80211_PS_POLL_AID(pspoll, (mac->assoc_id | 0xc000)); 685 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
743 SET_80211_PS_POLL_BSSID(pspoll, mac->bssid); 686 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
744 SET_80211_PS_POLL_TA(pspoll, mac->mac_addr); 687 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
745 688
746 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); 689 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
747 690
748 /*-------------------------------------------------------- 691 /*--------------------------------------------------------
749 (3) null data 692 (3) null data
@@ -753,57 +696,54 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
753 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr); 696 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
754 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid); 697 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
755 698
756 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG); 699 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
757 700
758 /*--------------------------------------------------------- 701 /*---------------------------------------------------------
759 (4) probe response 702 (4) probe response
760 ----------------------------------------------------------*/ 703 ----------------------------------------------------------*/
761 probersp = &reserved_page_packet[PROBERSP_PG * 128]; 704 p_probersp = &reserved_page_packet[PROBERSP_PG * 128];
762 SET_80211_HDR_ADDRESS1(probersp, mac->bssid); 705 SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid);
763 SET_80211_HDR_ADDRESS2(probersp, mac->mac_addr); 706 SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr);
764 SET_80211_HDR_ADDRESS3(probersp, mac->bssid); 707 SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid);
765 708
766 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG); 709 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1rsvdpageloc, PROBERSP_PG);
767 710
768 totalpacketlen = TOTAL_RESERVED_PKT_LEN; 711 totalpacketlen = TOTAL_RESERVED_PKT_LEN;
769 712
770 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, 713 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
771 "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL", 714 "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
772 &reserved_page_packet[0], totalpacketlen); 715 &reserved_page_packet[0], totalpacketlen);
773 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 716 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
774 "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL", 717 "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
775 u1RsvdPageLoc, 3); 718 u1rsvdpageloc, 3);
776 719
777 720
778 skb = dev_alloc_skb(totalpacketlen); 721 skb = dev_alloc_skb(totalpacketlen);
779 if (!skb) 722 memcpy((u8 *)skb_put(skb, totalpacketlen),
780 return;
781 kmemleak_not_leak(skb);
782
783 memcpy((u8 *) skb_put(skb, totalpacketlen),
784 &reserved_page_packet, totalpacketlen); 723 &reserved_page_packet, totalpacketlen);
785 724
786 rtstatus = _rtl92c_cmd_send_packet(hw, skb); 725 rtstatus = rtl_cmd_send_packet(hw, skb);
787 726
788 if (rtstatus) 727 if (rtstatus)
789 dlok = true; 728 b_dlok = true;
790 729
791 if (dlok) { 730 if (b_dlok) {
792 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 731 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
793 "Set RSVD page location to Fw\n"); 732 "Set RSVD page location to Fw.\n");
794 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 733 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
795 "H2C_RSVDPAGE", u1RsvdPageLoc, 3); 734 "H2C_RSVDPAGE:\n",
735 u1rsvdpageloc, 3);
796 rtl92c_fill_h2c_cmd(hw, H2C_RSVDPAGE, 736 rtl92c_fill_h2c_cmd(hw, H2C_RSVDPAGE,
797 sizeof(u1RsvdPageLoc), u1RsvdPageLoc); 737 sizeof(u1rsvdpageloc), u1rsvdpageloc);
798 } else 738 } else
799 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 739 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
800 "Set RSVD page location to Fw FAIL!!!!!!\n"); 740 "Set RSVD page location to Fw FAIL!!!!!!.\n");
801} 741}
802EXPORT_SYMBOL(rtl92c_set_fw_rsvdpagepkt); 742EXPORT_SYMBOL(rtl92c_set_fw_rsvdpagepkt);
803 743
804void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus) 744void rtl92c_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
805{ 745{
806 u8 u1_joinbssrpt_parm[1] = {0}; 746 u8 u1_joinbssrpt_parm[1] = { 0 };
807 747
808 SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(u1_joinbssrpt_parm, mstatus); 748 SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(u1_joinbssrpt_parm, mstatus);
809 749
@@ -813,11 +753,51 @@ EXPORT_SYMBOL(rtl92c_set_fw_joinbss_report_cmd);
813 753
814static void rtl92c_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow) 754static void rtl92c_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
815{ 755{
816 u8 u1_ctwindow_period[1] = {ctwindow}; 756 u8 u1_ctwindow_period[1] = { ctwindow};
817 757
818 rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_CTW_CMD, 1, u1_ctwindow_period); 758 rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);
819} 759}
820 760
761/* refactored routine */
762static void set_noa_data(struct rtl_priv *rtlpriv,
763 struct rtl_p2p_ps_info *p2pinfo,
764 struct p2p_ps_offload_t *p2p_ps_offload)
765{
766 int i;
767 u32 start_time, tsf_low;
768
769 /* hw only support 2 set of NoA */
770 for (i = 0 ; i < p2pinfo->noa_num ; i++) {
771 /* To control the reg setting for which NOA*/
772 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
773 if (i == 0)
774 p2p_ps_offload->noa0_en = 1;
775 else
776 p2p_ps_offload->noa1_en = 1;
777
778 /* config P2P NoA Descriptor Register */
779 rtl_write_dword(rtlpriv, 0x5E0,
780 p2pinfo->noa_duration[i]);
781 rtl_write_dword(rtlpriv, 0x5E4,
782 p2pinfo->noa_interval[i]);
783
784 /*Get Current TSF value */
785 tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
786
787 start_time = p2pinfo->noa_start_time[i];
788 if (p2pinfo->noa_count_type[i] != 1) {
789 while (start_time <= (tsf_low+(50*1024))) {
790 start_time += p2pinfo->noa_interval[i];
791 if (p2pinfo->noa_count_type[i] != 255)
792 p2pinfo->noa_count_type[i]--;
793 }
794 }
795 rtl_write_dword(rtlpriv, 0x5E8, start_time);
796 rtl_write_dword(rtlpriv, 0x5EC,
797 p2pinfo->noa_count_type[i]);
798 }
799}
800
821void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) 801void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
822{ 802{
823 struct rtl_priv *rtlpriv = rtl_priv(hw); 803 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -825,83 +805,58 @@ void rtl92c_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
825 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 805 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
826 struct rtl_p2p_ps_info *p2pinfo = &(rtlps->p2p_ps_info); 806 struct rtl_p2p_ps_info *p2pinfo = &(rtlps->p2p_ps_info);
827 struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload; 807 struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
828 u8 i;
829 u16 ctwindow; 808 u16 ctwindow;
830 u32 start_time, tsf_low;
831 809
832 switch (p2p_ps_state) { 810 switch (p2p_ps_state) {
833 case P2P_PS_DISABLE: 811 case P2P_PS_DISABLE:
834 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); 812 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
835 memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t)); 813 "P2P_PS_DISABLE\n");
836 break; 814 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
815 break;
837 case P2P_PS_ENABLE: 816 case P2P_PS_ENABLE:
838 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); 817 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
839 /* update CTWindow value. */ 818 "P2P_PS_ENABLE\n");
840 if (p2pinfo->ctwindow > 0) { 819 /* update CTWindow value. */
841 p2p_ps_offload->ctwindow_en = 1; 820 if (p2pinfo->ctwindow > 0) {
842 ctwindow = p2pinfo->ctwindow; 821 p2p_ps_offload->ctwindow_en = 1;
843 rtl92c_set_p2p_ctw_period_cmd(hw, ctwindow); 822 ctwindow = p2pinfo->ctwindow;
844 } 823 rtl92c_set_p2p_ctw_period_cmd(hw, ctwindow);
845 /* hw only support 2 set of NoA */
846 for (i = 0; i < p2pinfo->noa_num; i++) {
847 /* To control the register setting for which NOA*/
848 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
849 if (i == 0)
850 p2p_ps_offload->noa0_en = 1;
851 else
852 p2p_ps_offload->noa1_en = 1;
853
854 /* config P2P NoA Descriptor Register */
855 rtl_write_dword(rtlpriv, 0x5E0,
856 p2pinfo->noa_duration[i]);
857 rtl_write_dword(rtlpriv, 0x5E4,
858 p2pinfo->noa_interval[i]);
859
860 /*Get Current TSF value */
861 tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
862
863 start_time = p2pinfo->noa_start_time[i];
864 if (p2pinfo->noa_count_type[i] != 1) {
865 while (start_time <= (tsf_low+(50*1024))) {
866 start_time += p2pinfo->noa_interval[i];
867 if (p2pinfo->noa_count_type[i] != 255)
868 p2pinfo->noa_count_type[i]--;
869 }
870 } 824 }
871 rtl_write_dword(rtlpriv, 0x5E8, start_time); 825 /* call refactored routine */
872 rtl_write_dword(rtlpriv, 0x5EC, 826 set_noa_data(rtlpriv, p2pinfo, p2p_ps_offload);
873 p2pinfo->noa_count_type[i]);
874 }
875 827
876 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) { 828 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
877 /* rst p2p circuit */ 829 /* rst p2p circuit */
878 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4)); 830 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST,
831 BIT(4));
879 832
880 p2p_ps_offload->offload_en = 1; 833 p2p_ps_offload->offload_en = 1;
881 834
882 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) { 835 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
883 p2p_ps_offload->role = 1; 836 p2p_ps_offload->role = 1;
884 p2p_ps_offload->allstasleep = 0; 837 p2p_ps_offload->allstasleep = 0;
885 } else { 838 } else {
886 p2p_ps_offload->role = 0; 839 p2p_ps_offload->role = 0;
887 } 840 }
888 841
889 p2p_ps_offload->discovery = 0; 842 p2p_ps_offload->discovery = 0;
890 } 843 }
891 break; 844 break;
892 case P2P_PS_SCAN: 845 case P2P_PS_SCAN:
893 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n"); 846 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
894 p2p_ps_offload->discovery = 1; 847 p2p_ps_offload->discovery = 1;
895 break; 848 break;
896 case P2P_PS_SCAN_DONE: 849 case P2P_PS_SCAN_DONE:
897 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n"); 850 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
898 p2p_ps_offload->discovery = 0; 851 "P2P_PS_SCAN_DONE\n");
899 p2pinfo->p2p_ps_state = P2P_PS_ENABLE; 852 p2p_ps_offload->discovery = 0;
900 break; 853 p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
854 break;
901 default: 855 default:
902 break; 856 break;
903 } 857 }
904 858
905 rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload); 859 rtl92c_fill_h2c_cmd(hw, H2C_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
860
906} 861}
907EXPORT_SYMBOL_GPL(rtl92c_set_p2p_ps_offload_cmd); 862EXPORT_SYMBOL_GPL(rtl92c_set_p2p_ps_offload_cmd);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
index 15b2055e6212..a815bd6273da 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/fw_common.h
@@ -36,11 +36,38 @@
36#define FW_8192C_PAGE_SIZE 4096 36#define FW_8192C_PAGE_SIZE 4096
37#define FW_8192C_POLLING_DELAY 5 37#define FW_8192C_POLLING_DELAY 5
38#define FW_8192C_POLLING_TIMEOUT_COUNT 100 38#define FW_8192C_POLLING_TIMEOUT_COUNT 100
39#define NORMAL_CHIP BIT(4)
39 40
40#define IS_FW_HEADER_EXIST(_pfwhdr) \ 41#define IS_FW_HEADER_EXIST(_pfwhdr) \
41 ((le16_to_cpu(_pfwhdr->signature)&0xFFF0) == 0x92C0 ||\ 42 ((le16_to_cpu(_pfwhdr->signature)&0xFFF0) == 0x92C0 ||\
42 (le16_to_cpu(_pfwhdr->signature)&0xFFF0) == 0x88C0) 43 (le16_to_cpu(_pfwhdr->signature)&0xFFF0) == 0x88C0)
43 44
45#define CUT_VERSION_MASK (BIT(6)|BIT(7))
46#define CHIP_VENDOR_UMC BIT(5)
47#define CHIP_VENDOR_UMC_B_CUT BIT(6) /* Chip version for ECO */
48#define IS_CHIP_VER_B(version) ((version & CHIP_VER_B) ? true : false)
49#define RF_TYPE_MASK (BIT(0)|BIT(1))
50#define GET_CVID_RF_TYPE(version) \
51 ((version) & RF_TYPE_MASK)
52#define GET_CVID_CUT_VERSION(version) \
53 ((version) & CUT_VERSION_MASK)
54#define IS_NORMAL_CHIP(version) \
55 ((version & NORMAL_CHIP) ? true : false)
56#define IS_2T2R(version) \
57 (((GET_CVID_RF_TYPE(version)) == \
58 CHIP_92C_BITMASK) ? true : false)
59#define IS_92C_SERIAL(version) \
60 ((IS_2T2R(version)) ? true : false)
61#define IS_CHIP_VENDOR_UMC(version) \
62 ((version & CHIP_VENDOR_UMC) ? true : false)
63#define IS_VENDOR_UMC_A_CUT(version) \
64 ((IS_CHIP_VENDOR_UMC(version)) ? \
65 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false)
66#define IS_81XXC_VENDOR_UMC_B_CUT(version) \
67 ((IS_CHIP_VENDOR_UMC(version)) ? \
68 ((GET_CVID_CUT_VERSION(version) == \
69 CHIP_VENDOR_UMC_B_CUT) ? true : false) : false)
70
44struct rtl92c_firmware_header { 71struct rtl92c_firmware_header {
45 __le16 signature; 72 __le16 signature;
46 u8 category; 73 u8 category;
@@ -60,19 +87,6 @@ struct rtl92c_firmware_header {
60 __le32 rsvd5; 87 __le32 rsvd5;
61}; 88};
62 89
63enum rtl8192c_h2c_cmd {
64 H2C_AP_OFFLOAD = 0,
65 H2C_SETPWRMODE = 1,
66 H2C_JOINBSSRPT = 2,
67 H2C_RSVDPAGE = 3,
68 H2C_RSSI_REPORT = 5,
69 H2C_RA_MASK = 6,
70 H2C_MACID_PS_MODE = 7,
71 H2C_P2P_PS_OFFLOAD = 8,
72 H2C_P2P_PS_CTW_CMD = 32,
73 MAX_H2CCMD
74};
75
76#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0)) 90#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))
77 91
78#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \ 92#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
index 9e32ac8a4425..77e61b19bf36 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.c
@@ -27,12 +27,13 @@
27 * 27 *
28 *****************************************************************************/ 28 *****************************************************************************/
29 29
30#include <linux/export.h>
31#include "../wifi.h" 30#include "../wifi.h"
32#include "../rtl8192ce/reg.h" 31#include "../rtl8192ce/reg.h"
33#include "../rtl8192ce/def.h" 32#include "../rtl8192ce/def.h"
34#include "dm_common.h" 33#include "dm_common.h"
34#include "fw_common.h"
35#include "phy_common.h" 35#include "phy_common.h"
36#include <linux/export.h>
36 37
37u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) 38u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
38{ 39{
@@ -50,7 +51,6 @@ u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
50 bitmask, regaddr, originalvalue); 51 bitmask, regaddr, originalvalue);
51 52
52 return returnvalue; 53 return returnvalue;
53
54} 54}
55EXPORT_SYMBOL(rtl92c_phy_query_bb_reg); 55EXPORT_SYMBOL(rtl92c_phy_query_bb_reg);
56 56
@@ -75,7 +75,6 @@ void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw,
75 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 75 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
76 "regaddr(%#x), bitmask(%#x), data(%#x)\n", 76 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
77 regaddr, bitmask, data); 77 regaddr, bitmask, data);
78
79} 78}
80EXPORT_SYMBOL(rtl92c_phy_set_bb_reg); 79EXPORT_SYMBOL(rtl92c_phy_set_bb_reg);
81 80
@@ -84,7 +83,6 @@ u32 _rtl92c_phy_fw_rf_serial_read(struct ieee80211_hw *hw,
84{ 83{
85 RT_ASSERT(false, "deprecated!\n"); 84 RT_ASSERT(false, "deprecated!\n");
86 return 0; 85 return 0;
87
88} 86}
89EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_read); 87EXPORT_SYMBOL(_rtl92c_phy_fw_rf_serial_read);
90 88
@@ -129,10 +127,10 @@ u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
129 tmplong | BLSSIREADEDGE); 127 tmplong | BLSSIREADEDGE);
130 mdelay(1); 128 mdelay(1);
131 if (rfpath == RF90_PATH_A) 129 if (rfpath == RF90_PATH_A)
132 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1, 130 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
133 BIT(8)); 131 BIT(8));
134 else if (rfpath == RF90_PATH_B) 132 else if (rfpath == RF90_PATH_B)
135 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1, 133 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
136 BIT(8)); 134 BIT(8));
137 if (rfpi_enable) 135 if (rfpi_enable)
138 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi, 136 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
@@ -141,7 +139,8 @@ u32 _rtl92c_phy_rf_serial_read(struct ieee80211_hw *hw,
141 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb, 139 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
142 BLSSIREADBACKDATA); 140 BLSSIREADBACKDATA);
143 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x]=0x%x\n", 141 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x]=0x%x\n",
144 rfpath, pphyreg->rf_rb, retvalue); 142 rfpath, pphyreg->rf_rb,
143 retvalue);
145 return retvalue; 144 return retvalue;
146} 145}
147EXPORT_SYMBOL(_rtl92c_phy_rf_serial_read); 146EXPORT_SYMBOL(_rtl92c_phy_rf_serial_read);
@@ -165,7 +164,8 @@ void _rtl92c_phy_rf_serial_write(struct ieee80211_hw *hw,
165 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff; 164 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
166 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr); 165 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
167 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n", 166 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
168 rfpath, pphyreg->rf3wire_offset, data_and_addr); 167 rfpath, pphyreg->rf3wire_offset,
168 data_and_addr);
169} 169}
170EXPORT_SYMBOL(_rtl92c_phy_rf_serial_write); 170EXPORT_SYMBOL(_rtl92c_phy_rf_serial_write);
171 171
@@ -174,7 +174,7 @@ u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask)
174 u32 i; 174 u32 i;
175 175
176 for (i = 0; i <= 31; i++) { 176 for (i = 0; i <= 31; i++) {
177 if ((bitmask >> i) & 0x1) 177 if (((bitmask >> i) & 0x1) == 1)
178 break; 178 break;
179 } 179 }
180 return i; 180 return i;
@@ -210,11 +210,10 @@ bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
210 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 210 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
211 bool rtstatus; 211 bool rtstatus;
212 212
213 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
214 rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw, 213 rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
215 BASEBAND_CONFIG_PHY_REG); 214 BASEBAND_CONFIG_PHY_REG);
216 if (!rtstatus) { 215 if (!rtstatus) {
217 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!\n"); 216 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
218 return false; 217 return false;
219 } 218 }
220 if (rtlphy->rf_type == RF_1T2R) { 219 if (rtlphy->rf_type == RF_1T2R) {
@@ -227,7 +226,7 @@ bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
227 BASEBAND_CONFIG_PHY_REG); 226 BASEBAND_CONFIG_PHY_REG);
228 } 227 }
229 if (!rtstatus) { 228 if (!rtstatus) {
230 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!\n"); 229 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
231 return false; 230 return false;
232 } 231 }
233 rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw, 232 rtstatus = rtlpriv->cfg->ops->config_bb_with_headerfile(hw,
@@ -236,12 +235,12 @@ bool _rtl92c_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
236 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n"); 235 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
237 return false; 236 return false;
238 } 237 }
239 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw, 238 rtlphy->cck_high_power =
240 RFPGA0_XA_HSSIPARAMETER2, 239 (bool)(rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, 0x200));
241 0x200));
242 240
243 return true; 241 return true;
244} 242}
243
245EXPORT_SYMBOL(_rtl92c_phy_bb8192c_config_parafile); 244EXPORT_SYMBOL(_rtl92c_phy_bb8192c_config_parafile);
246 245
247void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw, 246void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
@@ -250,51 +249,153 @@ void _rtl92c_store_pwrIndex_diffrate_offset(struct ieee80211_hw *hw,
250{ 249{
251 struct rtl_priv *rtlpriv = rtl_priv(hw); 250 struct rtl_priv *rtlpriv = rtl_priv(hw);
252 struct rtl_phy *rtlphy = &(rtlpriv->phy); 251 struct rtl_phy *rtlphy = &(rtlpriv->phy);
253 int index;
254
255 if (regaddr == RTXAGC_A_RATE18_06)
256 index = 0;
257 else if (regaddr == RTXAGC_A_RATE54_24)
258 index = 1;
259 else if (regaddr == RTXAGC_A_CCK1_MCS32)
260 index = 6;
261 else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
262 index = 7;
263 else if (regaddr == RTXAGC_A_MCS03_MCS00)
264 index = 2;
265 else if (regaddr == RTXAGC_A_MCS07_MCS04)
266 index = 3;
267 else if (regaddr == RTXAGC_A_MCS11_MCS08)
268 index = 4;
269 else if (regaddr == RTXAGC_A_MCS15_MCS12)
270 index = 5;
271 else if (regaddr == RTXAGC_B_RATE18_06)
272 index = 8;
273 else if (regaddr == RTXAGC_B_RATE54_24)
274 index = 9;
275 else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
276 index = 14;
277 else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
278 index = 15;
279 else if (regaddr == RTXAGC_B_MCS03_MCS00)
280 index = 10;
281 else if (regaddr == RTXAGC_B_MCS07_MCS04)
282 index = 11;
283 else if (regaddr == RTXAGC_B_MCS11_MCS08)
284 index = 12;
285 else if (regaddr == RTXAGC_B_MCS15_MCS12)
286 index = 13;
287 else
288 return;
289 252
290 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index] = data; 253 if (regaddr == RTXAGC_A_RATE18_06) {
291 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 254 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][0] =
292 "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n", 255 data;
293 rtlphy->pwrgroup_cnt, index, 256 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
294 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index]); 257 "MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
258 rtlphy->pwrgroup_cnt,
259 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
260 pwrgroup_cnt][0]);
261 }
262 if (regaddr == RTXAGC_A_RATE54_24) {
263 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][1] =
264 data;
265 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
266 "MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
267 rtlphy->pwrgroup_cnt,
268 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
269 pwrgroup_cnt][1]);
270 }
271 if (regaddr == RTXAGC_A_CCK1_MCS32) {
272 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][6] =
273 data;
274 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
275 "MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
276 rtlphy->pwrgroup_cnt,
277 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
278 pwrgroup_cnt][6]);
279 }
280 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
281 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][7] =
282 data;
283 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
284 "MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
285 rtlphy->pwrgroup_cnt,
286 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
287 pwrgroup_cnt][7]);
288 }
289 if (regaddr == RTXAGC_A_MCS03_MCS00) {
290 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][2] =
291 data;
292 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
293 "MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
294 rtlphy->pwrgroup_cnt,
295 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
296 pwrgroup_cnt][2]);
297 }
298 if (regaddr == RTXAGC_A_MCS07_MCS04) {
299 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][3] =
300 data;
301 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
302 "MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
303 rtlphy->pwrgroup_cnt,
304 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
305 pwrgroup_cnt][3]);
306 }
307 if (regaddr == RTXAGC_A_MCS11_MCS08) {
308 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][4] =
309 data;
310 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
311 "MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
312 rtlphy->pwrgroup_cnt,
313 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
314 pwrgroup_cnt][4]);
315 }
316 if (regaddr == RTXAGC_A_MCS15_MCS12) {
317 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][5] =
318 data;
319 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
320 "MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
321 rtlphy->pwrgroup_cnt,
322 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
323 pwrgroup_cnt][5]);
324 }
325 if (regaddr == RTXAGC_B_RATE18_06) {
326 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][8] =
327 data;
328 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
329 "MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
330 rtlphy->pwrgroup_cnt,
331 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
332 pwrgroup_cnt][8]);
333 }
334 if (regaddr == RTXAGC_B_RATE54_24) {
335 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][9] =
336 data;
337 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
338 "MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
339 rtlphy->pwrgroup_cnt,
340 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
341 pwrgroup_cnt][9]);
342 }
343 if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
344 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][14] =
345 data;
346 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
347 "MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
348 rtlphy->pwrgroup_cnt,
349 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
350 pwrgroup_cnt][14]);
351 }
352 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
353 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][15] =
354 data;
355 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
356 "MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
357 rtlphy->pwrgroup_cnt,
358 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
359 pwrgroup_cnt][15]);
360 }
361 if (regaddr == RTXAGC_B_MCS03_MCS00) {
362 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][10] =
363 data;
364 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
365 "MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
366 rtlphy->pwrgroup_cnt,
367 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
368 pwrgroup_cnt][10]);
369 }
370 if (regaddr == RTXAGC_B_MCS07_MCS04) {
371 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][11] =
372 data;
373 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
374 "MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
375 rtlphy->pwrgroup_cnt,
376 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
377 pwrgroup_cnt][11]);
378 }
379 if (regaddr == RTXAGC_B_MCS11_MCS08) {
380 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][12] =
381 data;
382 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
383 "MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
384 rtlphy->pwrgroup_cnt,
385 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
386 pwrgroup_cnt][12]);
387 }
388 if (regaddr == RTXAGC_B_MCS15_MCS12) {
389 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][13] =
390 data;
391 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
392 "MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
393 rtlphy->pwrgroup_cnt,
394 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
395 pwrgroup_cnt][13]);
295 396
296 if (index == 13)
297 rtlphy->pwrgroup_cnt++; 397 rtlphy->pwrgroup_cnt++;
398 }
298} 399}
299EXPORT_SYMBOL(_rtl92c_store_pwrIndex_diffrate_offset); 400EXPORT_SYMBOL(_rtl92c_store_pwrIndex_diffrate_offset);
300 401
@@ -304,29 +405,29 @@ void rtl92c_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
304 struct rtl_phy *rtlphy = &(rtlpriv->phy); 405 struct rtl_phy *rtlphy = &(rtlpriv->phy);
305 406
306 rtlphy->default_initialgain[0] = 407 rtlphy->default_initialgain[0] =
307 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0); 408 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
308 rtlphy->default_initialgain[1] = 409 rtlphy->default_initialgain[1] =
309 (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0); 410 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
310 rtlphy->default_initialgain[2] = 411 rtlphy->default_initialgain[2] =
311 (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0); 412 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
312 rtlphy->default_initialgain[3] = 413 rtlphy->default_initialgain[3] =
313 (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0); 414 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
314 415
315 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 416 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
316 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n", 417 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
317 rtlphy->default_initialgain[0], 418 rtlphy->default_initialgain[0],
318 rtlphy->default_initialgain[1], 419 rtlphy->default_initialgain[1],
319 rtlphy->default_initialgain[2], 420 rtlphy->default_initialgain[2],
320 rtlphy->default_initialgain[3]); 421 rtlphy->default_initialgain[3]);
321 422
322 rtlphy->framesync = (u8) rtl_get_bbreg(hw, 423 rtlphy->framesync = (u8)rtl_get_bbreg(hw,
323 ROFDM0_RXDETECTOR3, MASKBYTE0); 424 ROFDM0_RXDETECTOR3, MASKBYTE0);
324 rtlphy->framesync_c34 = rtl_get_bbreg(hw, 425 rtlphy->framesync_c34 = rtl_get_bbreg(hw,
325 ROFDM0_RXDETECTOR2, MASKDWORD); 426 ROFDM0_RXDETECTOR2, MASKDWORD);
326 427
327 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 428 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
328 "Default framesync (0x%x) = 0x%x\n", 429 "Default framesync (0x%x) = 0x%x\n",
329 ROFDM0_RXDETECTOR3, rtlphy->framesync); 430 ROFDM0_RXDETECTOR3, rtlphy->framesync);
330} 431}
331 432
332void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw) 433void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
@@ -426,19 +527,17 @@ void rtl92c_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
426 long txpwr_dbm; 527 long txpwr_dbm;
427 528
428 txpwr_level = rtlphy->cur_cck_txpwridx; 529 txpwr_level = rtlphy->cur_cck_txpwridx;
429 txpwr_dbm = _rtl92c_phy_txpwr_idx_to_dbm(hw, 530 txpwr_dbm = _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B,
430 WIRELESS_MODE_B, txpwr_level); 531 txpwr_level);
431 txpwr_level = rtlphy->cur_ofdm24g_txpwridx + 532 txpwr_level = rtlphy->cur_ofdm24g_txpwridx +
432 rtlefuse->legacy_ht_txpowerdiff; 533 rtlefuse->legacy_ht_txpowerdiff;
433 if (_rtl92c_phy_txpwr_idx_to_dbm(hw, 534 if (_rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
434 WIRELESS_MODE_G,
435 txpwr_level) > txpwr_dbm) 535 txpwr_level) > txpwr_dbm)
436 txpwr_dbm = 536 txpwr_dbm =
437 _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, 537 _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
438 txpwr_level); 538 txpwr_level);
439 txpwr_level = rtlphy->cur_ofdm24g_txpwridx; 539 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
440 if (_rtl92c_phy_txpwr_idx_to_dbm(hw, 540 if (_rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
441 WIRELESS_MODE_N_24G,
442 txpwr_level) > txpwr_dbm) 541 txpwr_level) > txpwr_dbm)
443 txpwr_dbm = 542 txpwr_dbm =
444 _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G, 543 _rtl92c_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
@@ -480,21 +579,19 @@ static void _rtl92c_ccxpower_index_check(struct ieee80211_hw *hw,
480 579
481 rtlphy->cur_cck_txpwridx = cckpowerlevel[0]; 580 rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
482 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0]; 581 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
483
484} 582}
485 583
486void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel) 584void rtl92c_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
487{ 585{
488 struct rtl_priv *rtlpriv = rtl_priv(hw); 586 struct rtl_priv *rtlpriv = rtl_priv(hw);
489 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv); 587 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
490 u8 cckpowerlevel[2], ofdmpowerlevel[2]; 588 u8 cckpowerlevel[2], ofdmpowerlevel[2];
491 589
492 if (!rtlefuse->txpwr_fromeprom) 590 if (!rtlefuse->txpwr_fromeprom)
493 return; 591 return;
494 _rtl92c_get_txpower_index(hw, channel, 592 _rtl92c_get_txpower_index(hw, channel,
495 &cckpowerlevel[0], &ofdmpowerlevel[0]); 593 &cckpowerlevel[0], &ofdmpowerlevel[0]);
496 _rtl92c_ccxpower_index_check(hw, 594 _rtl92c_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
497 channel, &cckpowerlevel[0],
498 &ofdmpowerlevel[0]); 595 &ofdmpowerlevel[0]);
499 rtlpriv->cfg->ops->phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]); 596 rtlpriv->cfg->ops->phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
500 rtlpriv->cfg->ops->phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], 597 rtlpriv->cfg->ops->phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0],
@@ -509,11 +606,9 @@ bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
509 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 606 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
510 u8 idx; 607 u8 idx;
511 u8 rf_path; 608 u8 rf_path;
512 u8 ccktxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw, 609 u8 ccktxpwridx = _rtl92c_phy_dbm_to_txpwr_idx(hw, WIRELESS_MODE_B,
513 WIRELESS_MODE_B,
514 power_indbm); 610 power_indbm);
515 u8 ofdmtxpwridx = _rtl92c_phy_dbm_to_txpwr_Idx(hw, 611 u8 ofdmtxpwridx = _rtl92c_phy_dbm_to_txpwr_idx(hw, WIRELESS_MODE_N_24G,
516 WIRELESS_MODE_N_24G,
517 power_indbm); 612 power_indbm);
518 if (ofdmtxpwridx - rtlefuse->legacy_ht_txpowerdiff > 0) 613 if (ofdmtxpwridx - rtlefuse->legacy_ht_txpowerdiff > 0)
519 ofdmtxpwridx -= rtlefuse->legacy_ht_txpowerdiff; 614 ofdmtxpwridx -= rtlefuse->legacy_ht_txpowerdiff;
@@ -521,7 +616,7 @@ bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
521 ofdmtxpwridx = 0; 616 ofdmtxpwridx = 0;
522 RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE, 617 RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE,
523 "%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n", 618 "%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n",
524 power_indbm, ccktxpwridx, ofdmtxpwridx); 619 power_indbm, ccktxpwridx, ofdmtxpwridx);
525 for (idx = 0; idx < 14; idx++) { 620 for (idx = 0; idx < 14; idx++) {
526 for (rf_path = 0; rf_path < 2; rf_path++) { 621 for (rf_path = 0; rf_path < 2; rf_path++) {
527 rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx; 622 rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx;
@@ -536,7 +631,7 @@ bool rtl92c_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
536} 631}
537EXPORT_SYMBOL(rtl92c_phy_update_txpower_dbm); 632EXPORT_SYMBOL(rtl92c_phy_update_txpower_dbm);
538 633
539u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw, 634u8 _rtl92c_phy_dbm_to_txpwr_idx(struct ieee80211_hw *hw,
540 enum wireless_mode wirelessmode, 635 enum wireless_mode wirelessmode,
541 long power_indbm) 636 long power_indbm)
542{ 637{
@@ -557,7 +652,7 @@ u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
557 } 652 }
558 653
559 if ((power_indbm - offset) > 0) 654 if ((power_indbm - offset) > 0)
560 txpwridx = (u8) ((power_indbm - offset) * 2); 655 txpwridx = (u8)((power_indbm - offset) * 2);
561 else 656 else
562 txpwridx = 0; 657 txpwridx = 0;
563 658
@@ -566,7 +661,7 @@ u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
566 661
567 return txpwridx; 662 return txpwridx;
568} 663}
569EXPORT_SYMBOL(_rtl92c_phy_dbm_to_txpwr_Idx); 664EXPORT_SYMBOL(_rtl92c_phy_dbm_to_txpwr_idx);
570 665
571long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, 666long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
572 enum wireless_mode wirelessmode, 667 enum wireless_mode wirelessmode,
@@ -607,7 +702,7 @@ void rtl92c_phy_set_bw_mode(struct ieee80211_hw *hw,
607 rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw); 702 rtlpriv->cfg->ops->phy_set_bw_mode_callback(hw);
608 } else { 703 } else {
609 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 704 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
610 "FALSE driver sleep or unload\n"); 705 "false driver sleep or unload\n");
611 rtlphy->set_bwmode_inprogress = false; 706 rtlphy->set_bwmode_inprogress = false;
612 rtlphy->current_chan_bw = tmp_bw; 707 rtlphy->current_chan_bw = tmp_bw;
613 } 708 }
@@ -640,7 +735,7 @@ void rtl92c_phy_sw_chnl_callback(struct ieee80211_hw *hw)
640 } 735 }
641 break; 736 break;
642 } while (true); 737 } while (true);
643 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n"); 738 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
644} 739}
645EXPORT_SYMBOL(rtl92c_phy_sw_chnl_callback); 740EXPORT_SYMBOL(rtl92c_phy_sw_chnl_callback);
646 741
@@ -655,14 +750,14 @@ u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
655 if (rtlphy->set_bwmode_inprogress) 750 if (rtlphy->set_bwmode_inprogress)
656 return 0; 751 return 0;
657 RT_ASSERT((rtlphy->current_channel <= 14), 752 RT_ASSERT((rtlphy->current_channel <= 14),
658 "WIRELESS_MODE_G but channel>14\n"); 753 "WIRELESS_MODE_G but channel>14");
659 rtlphy->sw_chnl_inprogress = true; 754 rtlphy->sw_chnl_inprogress = true;
660 rtlphy->sw_chnl_stage = 0; 755 rtlphy->sw_chnl_stage = 0;
661 rtlphy->sw_chnl_step = 0; 756 rtlphy->sw_chnl_step = 0;
662 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { 757 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
663 rtl92c_phy_sw_chnl_callback(hw); 758 rtl92c_phy_sw_chnl_callback(hw);
664 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD, 759 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
665 "sw_chnl_inprogress false schedule workitem\n"); 760 "sw_chnl_inprogress false schdule workitem\n");
666 rtlphy->sw_chnl_inprogress = false; 761 rtlphy->sw_chnl_inprogress = false;
667 } else { 762 } else {
668 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD, 763 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
@@ -673,22 +768,22 @@ u8 rtl92c_phy_sw_chnl(struct ieee80211_hw *hw)
673} 768}
674EXPORT_SYMBOL(rtl92c_phy_sw_chnl); 769EXPORT_SYMBOL(rtl92c_phy_sw_chnl);
675 770
676static void _rtl92c_phy_sw_rf_setting(struct ieee80211_hw *hw, u8 channel) 771static void _rtl92c_phy_sw_rf_seting(struct ieee80211_hw *hw, u8 channel)
677{ 772{
678 struct rtl_priv *rtlpriv = rtl_priv(hw); 773 struct rtl_priv *rtlpriv = rtl_priv(hw);
679 struct rtl_phy *rtlphy = &(rtlpriv->phy); 774 struct rtl_phy *rtlphy = &(rtlpriv->phy);
680 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 775 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
681 776 if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version)) {
682 if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) { 777 if (channel == 6 &&
683 if (channel == 6 && rtlphy->current_chan_bw == 778 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) {
684 HT_CHANNEL_WIDTH_20) 779 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1,
685 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 780 MASKDWORD, 0x00255);
686 0x00255); 781 } else {
687 else{ 782 u32 backuprf0x1A =
688 u32 backupRF0x1A = (u32)rtl_get_rfreg(hw, RF90_PATH_A, 783 (u32)rtl_get_rfreg(hw, RF90_PATH_A, RF_RX_G1,
689 RF_RX_G1, RFREG_OFFSET_MASK); 784 RFREG_OFFSET_MASK);
690 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 785 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD,
691 backupRF0x1A); 786 backuprf0x1A);
692 } 787 }
693 } 788 }
694} 789}
@@ -701,7 +796,7 @@ static bool _rtl92c_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
701 struct swchnlcmd *pcmd; 796 struct swchnlcmd *pcmd;
702 797
703 if (cmdtable == NULL) { 798 if (cmdtable == NULL) {
704 RT_ASSERT(false, "cmdtable cannot be NULL\n"); 799 RT_ASSERT(false, "cmdtable cannot be NULL.\n");
705 return false; 800 return false;
706 } 801 }
707 802
@@ -747,7 +842,7 @@ bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
747 rfdependcmdcnt = 0; 842 rfdependcmdcnt = 0;
748 843
749 RT_ASSERT((channel >= 1 && channel <= 14), 844 RT_ASSERT((channel >= 1 && channel <= 14),
750 "invalid channel for Zebra: %d\n", channel); 845 "illegal channel for Zebra: %d\n", channel);
751 846
752 _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++, 847 _rtl92c_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
753 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG, 848 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
@@ -768,6 +863,10 @@ bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
768 case 2: 863 case 2:
769 currentcmd = &postcommoncmd[*step]; 864 currentcmd = &postcommoncmd[*step];
770 break; 865 break;
866 default:
867 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
868 "Invalid 'stage' = %d, Check it!\n", *stage);
869 return true;
771 } 870 }
772 871
773 if (currentcmd->cmdid == CMDID_END) { 872 if (currentcmd->cmdid == CMDID_END) {
@@ -794,7 +893,7 @@ bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
794 break; 893 break;
795 case CMDID_WRITEPORT_UCHAR: 894 case CMDID_WRITEPORT_UCHAR:
796 rtl_write_byte(rtlpriv, currentcmd->para1, 895 rtl_write_byte(rtlpriv, currentcmd->para1,
797 (u8) currentcmd->para2); 896 (u8)currentcmd->para2);
798 break; 897 break;
799 case CMDID_RF_WRITEREG: 898 case CMDID_RF_WRITEREG:
800 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) { 899 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
@@ -806,12 +905,12 @@ bool _rtl92c_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
806 currentcmd->para1, 905 currentcmd->para1,
807 RFREG_OFFSET_MASK, 906 RFREG_OFFSET_MASK,
808 rtlphy->rfreg_chnlval[rfpath]); 907 rtlphy->rfreg_chnlval[rfpath]);
809 _rtl92c_phy_sw_rf_setting(hw, channel);
810 } 908 }
909 _rtl92c_phy_sw_rf_seting(hw, channel);
811 break; 910 break;
812 default: 911 default:
813 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 912 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
814 "switch case not processed\n"); 913 "switch case not process\n");
815 break; 914 break;
816 } 915 }
817 916
@@ -900,7 +999,7 @@ static u8 _rtl92c_phy_path_b_iqk(struct ieee80211_hw *hw)
900} 999}
901 1000
902static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw, 1001static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
903 bool iqk_ok, long result[][8], 1002 bool b_iqk_ok, long result[][8],
904 u8 final_candidate, bool btxonly) 1003 u8 final_candidate, bool btxonly)
905{ 1004{
906 u32 oldval_0, x, tx0_a, reg; 1005 u32 oldval_0, x, tx0_a, reg;
@@ -908,7 +1007,7 @@ static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
908 1007
909 if (final_candidate == 0xFF) { 1008 if (final_candidate == 0xFF) {
910 return; 1009 return;
911 } else if (iqk_ok) { 1010 } else if (b_iqk_ok) {
912 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 1011 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
913 MASKDWORD) >> 22) & 0x3FF; 1012 MASKDWORD) >> 22) & 0x3FF;
914 x = result[final_candidate][0]; 1013 x = result[final_candidate][0];
@@ -940,7 +1039,7 @@ static void _rtl92c_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
940} 1039}
941 1040
942static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw, 1041static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
943 bool iqk_ok, long result[][8], 1042 bool b_iqk_ok, long result[][8],
944 u8 final_candidate, bool btxonly) 1043 u8 final_candidate, bool btxonly)
945{ 1044{
946 u32 oldval_1, x, tx1_a, reg; 1045 u32 oldval_1, x, tx1_a, reg;
@@ -948,7 +1047,7 @@ static void _rtl92c_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
948 1047
949 if (final_candidate == 0xFF) { 1048 if (final_candidate == 0xFF) {
950 return; 1049 return;
951 } else if (iqk_ok) { 1050 } else if (b_iqk_ok) {
952 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 1051 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
953 MASKDWORD) >> 22) & 0x3FF; 1052 MASKDWORD) >> 22) & 0x3FF;
954 x = result[final_candidate][4]; 1053 x = result[final_candidate][4];
@@ -1017,7 +1116,7 @@ static void _rtl92c_phy_reload_mac_registers(struct ieee80211_hw *hw,
1017 u32 i; 1116 u32 i;
1018 1117
1019 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) 1118 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1020 rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]); 1119 rtl_write_byte(rtlpriv, macreg[i], (u8)macbackup[i]);
1021 rtl_write_dword(rtlpriv, macreg[i], macbackup[i]); 1120 rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
1022} 1121}
1023 1122
@@ -1043,14 +1142,14 @@ static void _rtl92c_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1043 u32 *macreg, u32 *macbackup) 1142 u32 *macreg, u32 *macbackup)
1044{ 1143{
1045 struct rtl_priv *rtlpriv = rtl_priv(hw); 1144 struct rtl_priv *rtlpriv = rtl_priv(hw);
1046 u32 i; 1145 u32 i = 0;
1047 1146
1048 rtl_write_byte(rtlpriv, macreg[0], 0x3F); 1147 rtl_write_byte(rtlpriv, macreg[i], 0x3F);
1049 1148
1050 for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++) 1149 for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1051 rtl_write_byte(rtlpriv, macreg[i], 1150 rtl_write_byte(rtlpriv, macreg[i],
1052 (u8) (macbackup[i] & (~BIT(3)))); 1151 (u8)(macbackup[i] & (~BIT(3))));
1053 rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5)))); 1152 rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] & (~BIT(5))));
1054} 1153}
1055 1154
1056static void _rtl92c_phy_path_a_standby(struct ieee80211_hw *hw) 1155static void _rtl92c_phy_path_a_standby(struct ieee80211_hw *hw)
@@ -1126,7 +1225,6 @@ static bool _rtl92c_phy_simularity_compare(struct ieee80211_hw *hw,
1126 } else { 1225 } else {
1127 return false; 1226 return false;
1128 } 1227 }
1129
1130} 1228}
1131 1229
1132static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, 1230static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
@@ -1142,51 +1240,37 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
1142 0xe88, 0xe8c, 0xed0, 0xed4, 1240 0xe88, 0xe8c, 0xed0, 0xed4,
1143 0xed8, 0xedc, 0xee0, 0xeec 1241 0xed8, 0xedc, 0xee0, 0xeec
1144 }; 1242 };
1145
1146 u32 iqk_mac_reg[IQK_MAC_REG_NUM] = { 1243 u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1147 0x522, 0x550, 0x551, 0x040 1244 0x522, 0x550, 0x551, 0x040
1148 }; 1245 };
1149
1150 u32 iqk_bb_reg_92C[9] = {
1151 0xc04, 0xc08, 0x874, 0xb68,
1152 0xb6c, 0x870, 0x860, 0x864,
1153 0x800
1154 };
1155
1156 const u32 retrycount = 2; 1246 const u32 retrycount = 2;
1247 u32 bbvalue;
1157 1248
1158 if (t == 0) { 1249 if (t == 0) {
1159 /* dummy read */ 1250 bbvalue = rtl_get_bbreg(hw, 0x800, MASKDWORD);
1160 rtl_get_bbreg(hw, 0x800, MASKDWORD);
1161 1251
1162 _rtl92c_phy_save_adda_registers(hw, adda_reg, 1252 _rtl92c_phy_save_adda_registers(hw, adda_reg,
1163 rtlphy->adda_backup, 16); 1253 rtlphy->adda_backup, 16);
1164 _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg, 1254 _rtl92c_phy_save_mac_registers(hw, iqk_mac_reg,
1165 rtlphy->iqk_mac_backup); 1255 rtlphy->iqk_mac_backup);
1166 _rtl92c_phy_save_adda_registers(hw, iqk_bb_reg_92C,
1167 rtlphy->iqk_bb_backup, 9);
1168 } 1256 }
1169 _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t); 1257 _rtl92c_phy_path_adda_on(hw, adda_reg, true, is2t);
1170 if (t == 0) { 1258 if (t == 0) {
1171 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw, 1259 rtlphy->rfpi_enable =
1172 RFPGA0_XA_HSSIPARAMETER1, 1260 (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
1173 BIT(8)); 1261 BIT(8));
1174 } 1262 }
1175 1263
1176 if (!rtlphy->rfpi_enable) 1264 if (!rtlphy->rfpi_enable)
1177 _rtl92c_phy_pi_mode_switch(hw, true); 1265 _rtl92c_phy_pi_mode_switch(hw, true);
1178 1266 if (t == 0) {
1179 rtl_set_bbreg(hw, 0x800, BIT(24), 0x0); 1267 rtlphy->reg_c04 = rtl_get_bbreg(hw, 0xc04, MASKDWORD);
1180 1268 rtlphy->reg_c08 = rtl_get_bbreg(hw, 0xc08, MASKDWORD);
1269 rtlphy->reg_874 = rtl_get_bbreg(hw, 0x874, MASKDWORD);
1270 }
1181 rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600); 1271 rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
1182 rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4); 1272 rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
1183 rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000); 1273 rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
1184
1185 rtl_set_bbreg(hw, 0x870, BIT(10), 0x1);
1186 rtl_set_bbreg(hw, 0x870, BIT(26), 0x1);
1187 rtl_set_bbreg(hw, 0x860, BIT(10), 0x0);
1188 rtl_set_bbreg(hw, 0x864, BIT(10), 0x0);
1189
1190 if (is2t) { 1274 if (is2t) {
1191 rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000); 1275 rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00010000);
1192 rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000); 1276 rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00010000);
@@ -1228,8 +1312,8 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
1228 pathb_ok = _rtl92c_phy_path_b_iqk(hw); 1312 pathb_ok = _rtl92c_phy_path_b_iqk(hw);
1229 if (pathb_ok == 0x03) { 1313 if (pathb_ok == 0x03) {
1230 result[t][4] = (rtl_get_bbreg(hw, 1314 result[t][4] = (rtl_get_bbreg(hw,
1231 0xeb4, 1315 0xeb4,
1232 MASKDWORD) & 1316 MASKDWORD) &
1233 0x3FF0000) >> 16; 1317 0x3FF0000) >> 16;
1234 result[t][5] = 1318 result[t][5] =
1235 (rtl_get_bbreg(hw, 0xebc, MASKDWORD) & 1319 (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
@@ -1243,17 +1327,21 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
1243 break; 1327 break;
1244 } else if (i == (retrycount - 1) && pathb_ok == 0x01) { 1328 } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1245 result[t][4] = (rtl_get_bbreg(hw, 1329 result[t][4] = (rtl_get_bbreg(hw,
1246 0xeb4, 1330 0xeb4,
1247 MASKDWORD) & 1331 MASKDWORD) &
1248 0x3FF0000) >> 16; 1332 0x3FF0000) >> 16;
1249 } 1333 }
1250 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) & 1334 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
1251 0x3FF0000) >> 16; 1335 0x3FF0000) >> 16;
1252 } 1336 }
1253 } 1337 }
1254 1338 rtl_set_bbreg(hw, 0xc04, MASKDWORD, rtlphy->reg_c04);
1339 rtl_set_bbreg(hw, 0x874, MASKDWORD, rtlphy->reg_874);
1340 rtl_set_bbreg(hw, 0xc08, MASKDWORD, rtlphy->reg_c08);
1255 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0); 1341 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
1256 1342 rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
1343 if (is2t)
1344 rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
1257 if (t != 0) { 1345 if (t != 0) {
1258 if (!rtlphy->rfpi_enable) 1346 if (!rtlphy->rfpi_enable)
1259 _rtl92c_phy_pi_mode_switch(hw, false); 1347 _rtl92c_phy_pi_mode_switch(hw, false);
@@ -1261,379 +1349,12 @@ static void _rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw,
1261 rtlphy->adda_backup, 16); 1349 rtlphy->adda_backup, 16);
1262 _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg, 1350 _rtl92c_phy_reload_mac_registers(hw, iqk_mac_reg,
1263 rtlphy->iqk_mac_backup); 1351 rtlphy->iqk_mac_backup);
1264 _rtl92c_phy_reload_adda_registers(hw, iqk_bb_reg_92C,
1265 rtlphy->iqk_bb_backup, 9);
1266
1267 rtl_set_bbreg(hw, 0x840, MASKDWORD, 0x00032ed3);
1268 if (is2t)
1269 rtl_set_bbreg(hw, 0x844, MASKDWORD, 0x00032ed3);
1270
1271 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
1272 rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
1273 } 1352 }
1274} 1353}
1275 1354
1276static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw, 1355static void _rtl92c_phy_ap_calibrate(struct ieee80211_hw *hw,
1277 char delta, bool is2t) 1356 char delta, bool is2t)
1278{ 1357{
1279#if 0 /* This routine is deliberately dummied out for later fixes */
1280 struct rtl_priv *rtlpriv = rtl_priv(hw);
1281 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1282 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1283
1284 u32 reg_d[PATH_NUM];
1285 u32 tmpreg, index, offset, path, i, pathbound = PATH_NUM, apkbound;
1286
1287 u32 bb_backup[APK_BB_REG_NUM];
1288 u32 bb_reg[APK_BB_REG_NUM] = {
1289 0x904, 0xc04, 0x800, 0xc08, 0x874
1290 };
1291 u32 bb_ap_mode[APK_BB_REG_NUM] = {
1292 0x00000020, 0x00a05430, 0x02040000,
1293 0x000800e4, 0x00204000
1294 };
1295 u32 bb_normal_ap_mode[APK_BB_REG_NUM] = {
1296 0x00000020, 0x00a05430, 0x02040000,
1297 0x000800e4, 0x22204000
1298 };
1299
1300 u32 afe_backup[APK_AFE_REG_NUM];
1301 u32 afe_reg[APK_AFE_REG_NUM] = {
1302 0x85c, 0xe6c, 0xe70, 0xe74, 0xe78,
1303 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
1304 0xed0, 0xed4, 0xed8, 0xedc, 0xee0,
1305 0xeec
1306 };
1307
1308 u32 mac_backup[IQK_MAC_REG_NUM];
1309 u32 mac_reg[IQK_MAC_REG_NUM] = {
1310 0x522, 0x550, 0x551, 0x040
1311 };
1312
1313 u32 apk_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
1314 {0x0852c, 0x1852c, 0x5852c, 0x1852c, 0x5852c},
1315 {0x2852e, 0x0852e, 0x3852e, 0x0852e, 0x0852e}
1316 };
1317
1318 u32 apk_normal_rf_init_value[PATH_NUM][APK_BB_REG_NUM] = {
1319 {0x0852c, 0x0a52c, 0x3a52c, 0x5a52c, 0x5a52c},
1320 {0x0852c, 0x0a52c, 0x5a52c, 0x5a52c, 0x5a52c}
1321 };
1322
1323 u32 apk_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
1324 {0x52019, 0x52014, 0x52013, 0x5200f, 0x5208d},
1325 {0x5201a, 0x52019, 0x52016, 0x52033, 0x52050}
1326 };
1327
1328 u32 apk_normal_rf_value_0[PATH_NUM][APK_BB_REG_NUM] = {
1329 {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a},
1330 {0x52019, 0x52017, 0x52010, 0x5200d, 0x5206a}
1331 };
1332
1333 u32 afe_on_off[PATH_NUM] = {
1334 0x04db25a4, 0x0b1b25a4
1335 };
1336
1337 const u32 apk_offset[PATH_NUM] = { 0xb68, 0xb6c };
1338
1339 u32 apk_normal_offset[PATH_NUM] = { 0xb28, 0xb98 };
1340
1341 u32 apk_value[PATH_NUM] = { 0x92fc0000, 0x12fc0000 };
1342
1343 u32 apk_normal_value[PATH_NUM] = { 0x92680000, 0x12680000 };
1344
1345 const char apk_delta_mapping[APK_BB_REG_NUM][13] = {
1346 {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1347 {-4, -3, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1348 {-6, -4, -2, -2, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1349 {-1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6},
1350 {-11, -9, -7, -5, -3, -1, 0, 0, 0, 0, 0, 0, 0}
1351 };
1352
1353 const u32 apk_normal_setting_value_1[13] = {
1354 0x01017018, 0xf7ed8f84, 0x1b1a1816, 0x2522201e, 0x322e2b28,
1355 0x433f3a36, 0x5b544e49, 0x7b726a62, 0xa69a8f84, 0xdfcfc0b3,
1356 0x12680000, 0x00880000, 0x00880000
1357 };
1358
1359 const u32 apk_normal_setting_value_2[16] = {
1360 0x01c7021d, 0x01670183, 0x01000123, 0x00bf00e2, 0x008d00a3,
1361 0x0068007b, 0x004d0059, 0x003a0042, 0x002b0031, 0x001f0025,
1362 0x0017001b, 0x00110014, 0x000c000f, 0x0009000b, 0x00070008,
1363 0x00050006
1364 };
1365
1366 u32 apk_result[PATH_NUM][APK_BB_REG_NUM];
1367
1368 long bb_offset, delta_v, delta_offset;
1369
1370 if (!is2t)
1371 pathbound = 1;
1372
1373 return;
1374
1375 for (index = 0; index < PATH_NUM; index++) {
1376 apk_offset[index] = apk_normal_offset[index];
1377 apk_value[index] = apk_normal_value[index];
1378 afe_on_off[index] = 0x6fdb25a4;
1379 }
1380
1381 for (index = 0; index < APK_BB_REG_NUM; index++) {
1382 for (path = 0; path < pathbound; path++) {
1383 apk_rf_init_value[path][index] =
1384 apk_normal_rf_init_value[path][index];
1385 apk_rf_value_0[path][index] =
1386 apk_normal_rf_value_0[path][index];
1387 }
1388 bb_ap_mode[index] = bb_normal_ap_mode[index];
1389
1390 apkbound = 6;
1391 }
1392
1393 for (index = 0; index < APK_BB_REG_NUM; index++) {
1394 if (index == 0)
1395 continue;
1396 bb_backup[index] = rtl_get_bbreg(hw, bb_reg[index], MASKDWORD);
1397 }
1398
1399 _rtl92c_phy_save_mac_registers(hw, mac_reg, mac_backup);
1400
1401 _rtl92c_phy_save_adda_registers(hw, afe_reg, afe_backup, 16);
1402
1403 for (path = 0; path < pathbound; path++) {
1404 if (path == RF90_PATH_A) {
1405 offset = 0xb00;
1406 for (index = 0; index < 11; index++) {
1407 rtl_set_bbreg(hw, offset, MASKDWORD,
1408 apk_normal_setting_value_1
1409 [index]);
1410
1411 offset += 0x04;
1412 }
1413
1414 rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
1415
1416 offset = 0xb68;
1417 for (; index < 13; index++) {
1418 rtl_set_bbreg(hw, offset, MASKDWORD,
1419 apk_normal_setting_value_1
1420 [index]);
1421
1422 offset += 0x04;
1423 }
1424
1425 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
1426
1427 offset = 0xb00;
1428 for (index = 0; index < 16; index++) {
1429 rtl_set_bbreg(hw, offset, MASKDWORD,
1430 apk_normal_setting_value_2
1431 [index]);
1432
1433 offset += 0x04;
1434 }
1435 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
1436 } else if (path == RF90_PATH_B) {
1437 offset = 0xb70;
1438 for (index = 0; index < 10; index++) {
1439 rtl_set_bbreg(hw, offset, MASKDWORD,
1440 apk_normal_setting_value_1
1441 [index]);
1442
1443 offset += 0x04;
1444 }
1445 rtl_set_bbreg(hw, 0xb28, MASKDWORD, 0x12680000);
1446 rtl_set_bbreg(hw, 0xb98, MASKDWORD, 0x12680000);
1447
1448 offset = 0xb68;
1449 index = 11;
1450 for (; index < 13; index++) {
1451 rtl_set_bbreg(hw, offset, MASKDWORD,
1452 apk_normal_setting_value_1
1453 [index]);
1454
1455 offset += 0x04;
1456 }
1457
1458 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x40000000);
1459
1460 offset = 0xb60;
1461 for (index = 0; index < 16; index++) {
1462 rtl_set_bbreg(hw, offset, MASKDWORD,
1463 apk_normal_setting_value_2
1464 [index]);
1465
1466 offset += 0x04;
1467 }
1468 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
1469 }
1470
1471 reg_d[path] = rtl_get_rfreg(hw, (enum radio_path)path,
1472 0xd, MASKDWORD);
1473
1474 for (index = 0; index < APK_AFE_REG_NUM; index++)
1475 rtl_set_bbreg(hw, afe_reg[index], MASKDWORD,
1476 afe_on_off[path]);
1477
1478 if (path == RF90_PATH_A) {
1479 for (index = 0; index < APK_BB_REG_NUM; index++) {
1480 if (index == 0)
1481 continue;
1482 rtl_set_bbreg(hw, bb_reg[index], MASKDWORD,
1483 bb_ap_mode[index]);
1484 }
1485 }
1486
1487 _rtl92c_phy_mac_setting_calibration(hw, mac_reg, mac_backup);
1488
1489 if (path == 0) {
1490 rtl_set_rfreg(hw, RF90_PATH_B, 0x0, MASKDWORD, 0x10000);
1491 } else {
1492 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASKDWORD,
1493 0x10000);
1494 rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
1495 0x1000f);
1496 rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
1497 0x20103);
1498 }
1499
1500 delta_offset = ((delta + 14) / 2);
1501 if (delta_offset < 0)
1502 delta_offset = 0;
1503 else if (delta_offset > 12)
1504 delta_offset = 12;
1505
1506 for (index = 0; index < APK_BB_REG_NUM; index++) {
1507 if (index != 1)
1508 continue;
1509
1510 tmpreg = apk_rf_init_value[path][index];
1511
1512 if (!rtlefuse->apk_thermalmeterignore) {
1513 bb_offset = (tmpreg & 0xF0000) >> 16;
1514
1515 if (!(tmpreg & BIT(15)))
1516 bb_offset = -bb_offset;
1517
1518 delta_v =
1519 apk_delta_mapping[index][delta_offset];
1520
1521 bb_offset += delta_v;
1522
1523 if (bb_offset < 0) {
1524 tmpreg = tmpreg & (~BIT(15));
1525 bb_offset = -bb_offset;
1526 } else {
1527 tmpreg = tmpreg | BIT(15);
1528 }
1529
1530 tmpreg =
1531 (tmpreg & 0xFFF0FFFF) | (bb_offset << 16);
1532 }
1533
1534 rtl_set_rfreg(hw, (enum radio_path)path, 0xc,
1535 MASKDWORD, 0x8992e);
1536 rtl_set_rfreg(hw, (enum radio_path)path, 0x0,
1537 MASKDWORD, apk_rf_value_0[path][index]);
1538 rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
1539 MASKDWORD, tmpreg);
1540
1541 i = 0;
1542 do {
1543 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80000000);
1544 rtl_set_bbreg(hw, apk_offset[path],
1545 MASKDWORD, apk_value[0]);
1546 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1547 ("PHY_APCalibrate() offset 0x%x "
1548 "value 0x%x\n",
1549 apk_offset[path],
1550 rtl_get_bbreg(hw, apk_offset[path],
1551 MASKDWORD)));
1552
1553 mdelay(3);
1554
1555 rtl_set_bbreg(hw, apk_offset[path],
1556 MASKDWORD, apk_value[1]);
1557 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1558 ("PHY_APCalibrate() offset 0x%x "
1559 "value 0x%x\n",
1560 apk_offset[path],
1561 rtl_get_bbreg(hw, apk_offset[path],
1562 MASKDWORD)));
1563
1564 mdelay(20);
1565
1566 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
1567
1568 if (path == RF90_PATH_A)
1569 tmpreg = rtl_get_bbreg(hw, 0xbd8,
1570 0x03E00000);
1571 else
1572 tmpreg = rtl_get_bbreg(hw, 0xbd8,
1573 0xF8000000);
1574
1575 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1576 ("PHY_APCalibrate() offset "
1577 "0xbd8[25:21] %x\n", tmpreg));
1578
1579 i++;
1580
1581 } while (tmpreg > apkbound && i < 4);
1582
1583 apk_result[path][index] = tmpreg;
1584 }
1585 }
1586
1587 _rtl92c_phy_reload_mac_registers(hw, mac_reg, mac_backup);
1588
1589 for (index = 0; index < APK_BB_REG_NUM; index++) {
1590 if (index == 0)
1591 continue;
1592 rtl_set_bbreg(hw, bb_reg[index], MASKDWORD, bb_backup[index]);
1593 }
1594
1595 _rtl92c_phy_reload_adda_registers(hw, afe_reg, afe_backup, 16);
1596
1597 for (path = 0; path < pathbound; path++) {
1598 rtl_set_rfreg(hw, (enum radio_path)path, 0xd,
1599 MASKDWORD, reg_d[path]);
1600
1601 if (path == RF90_PATH_B) {
1602 rtl_set_rfreg(hw, RF90_PATH_A, 0x10, MASKDWORD,
1603 0x1000f);
1604 rtl_set_rfreg(hw, RF90_PATH_A, 0x11, MASKDWORD,
1605 0x20101);
1606 }
1607
1608 if (apk_result[path][1] > 6)
1609 apk_result[path][1] = 6;
1610 }
1611
1612 for (path = 0; path < pathbound; path++) {
1613 rtl_set_rfreg(hw, (enum radio_path)path, 0x3, MASKDWORD,
1614 ((apk_result[path][1] << 15) |
1615 (apk_result[path][1] << 10) |
1616 (apk_result[path][1] << 5) |
1617 apk_result[path][1]));
1618
1619 if (path == RF90_PATH_A)
1620 rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
1621 ((apk_result[path][1] << 15) |
1622 (apk_result[path][1] << 10) |
1623 (0x00 << 5) | 0x05));
1624 else
1625 rtl_set_rfreg(hw, (enum radio_path)path, 0x4, MASKDWORD,
1626 ((apk_result[path][1] << 15) |
1627 (apk_result[path][1] << 10) |
1628 (0x02 << 5) | 0x05));
1629
1630 rtl_set_rfreg(hw, (enum radio_path)path, 0xe, MASKDWORD,
1631 ((0x08 << 15) | (0x08 << 10) | (0x08 << 5) |
1632 0x08));
1633
1634 }
1635 rtlphy->b_apk_done = true;
1636#endif
1637} 1358}
1638 1359
1639static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw, 1360static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw,
@@ -1657,15 +1378,13 @@ static void _rtl92c_phy_set_rfpath_switch(struct ieee80211_hw *hw,
1657 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x2); 1378 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x2);
1658 else 1379 else
1659 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1); 1380 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1);
1660
1661 } 1381 }
1662
1663} 1382}
1664 1383
1665#undef IQK_ADDA_REG_NUM 1384#undef IQK_ADDA_REG_NUM
1666#undef IQK_DELAY_TIME 1385#undef IQK_DELAY_TIME
1667 1386
1668void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery) 1387void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
1669{ 1388{
1670 struct rtl_priv *rtlpriv = rtl_priv(hw); 1389 struct rtl_priv *rtlpriv = rtl_priv(hw);
1671 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1390 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -1673,10 +1392,10 @@ void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1673 1392
1674 long result[4][8]; 1393 long result[4][8];
1675 u8 i, final_candidate; 1394 u8 i, final_candidate;
1676 bool patha_ok, pathb_ok; 1395 bool b_patha_ok, b_pathb_ok;
1677 long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_ec4, reg_tmp = 0; 1396 long reg_e94, reg_e9c, reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4,
1397 reg_ecc, reg_tmp = 0;
1678 bool is12simular, is13simular, is23simular; 1398 bool is12simular, is13simular, is23simular;
1679 bool start_conttx = false, singletone = false;
1680 u32 iqk_bb_reg[10] = { 1399 u32 iqk_bb_reg[10] = {
1681 ROFDM0_XARXIQIMBALANCE, 1400 ROFDM0_XARXIQIMBALANCE,
1682 ROFDM0_XBRXIQIMBALANCE, 1401 ROFDM0_XBRXIQIMBALANCE,
@@ -1690,14 +1409,12 @@ void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1690 ROFDM0_RXIQEXTANTA 1409 ROFDM0_RXIQEXTANTA
1691 }; 1410 };
1692 1411
1693 if (recovery) { 1412 if (b_recovery) {
1694 _rtl92c_phy_reload_adda_registers(hw, 1413 _rtl92c_phy_reload_adda_registers(hw,
1695 iqk_bb_reg, 1414 iqk_bb_reg,
1696 rtlphy->iqk_bb_backup, 10); 1415 rtlphy->iqk_bb_backup, 10);
1697 return; 1416 return;
1698 } 1417 }
1699 if (start_conttx || singletone)
1700 return;
1701 for (i = 0; i < 8; i++) { 1418 for (i = 0; i < 8; i++) {
1702 result[0][i] = 0; 1419 result[0][i] = 0;
1703 result[1][i] = 0; 1420 result[1][i] = 0;
@@ -1705,8 +1422,8 @@ void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1705 result[3][i] = 0; 1422 result[3][i] = 0;
1706 } 1423 }
1707 final_candidate = 0xff; 1424 final_candidate = 0xff;
1708 patha_ok = false; 1425 b_patha_ok = false;
1709 pathb_ok = false; 1426 b_pathb_ok = false;
1710 is12simular = false; 1427 is12simular = false;
1711 is23simular = false; 1428 is23simular = false;
1712 is13simular = false; 1429 is13simular = false;
@@ -1752,29 +1469,34 @@ void rtl92c_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1752 reg_e94 = result[i][0]; 1469 reg_e94 = result[i][0];
1753 reg_e9c = result[i][1]; 1470 reg_e9c = result[i][1];
1754 reg_ea4 = result[i][2]; 1471 reg_ea4 = result[i][2];
1472 reg_eac = result[i][3];
1755 reg_eb4 = result[i][4]; 1473 reg_eb4 = result[i][4];
1756 reg_ebc = result[i][5]; 1474 reg_ebc = result[i][5];
1757 reg_ec4 = result[i][6]; 1475 reg_ec4 = result[i][6];
1476 reg_ecc = result[i][7];
1758 } 1477 }
1759 if (final_candidate != 0xff) { 1478 if (final_candidate != 0xff) {
1760 rtlphy->reg_e94 = reg_e94 = result[final_candidate][0]; 1479 rtlphy->reg_e94 = reg_e94 = result[final_candidate][0];
1761 rtlphy->reg_e9c = reg_e9c = result[final_candidate][1]; 1480 rtlphy->reg_e9c = reg_e9c = result[final_candidate][1];
1762 reg_ea4 = result[final_candidate][2]; 1481 reg_ea4 = result[final_candidate][2];
1482 reg_eac = result[final_candidate][3];
1763 rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4]; 1483 rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4];
1764 rtlphy->reg_ebc = reg_ebc = result[final_candidate][5]; 1484 rtlphy->reg_ebc = reg_ebc = result[final_candidate][5];
1765 reg_ec4 = result[final_candidate][6]; 1485 reg_ec4 = result[final_candidate][6];
1766 patha_ok = pathb_ok = true; 1486 reg_ecc = result[final_candidate][7];
1487 b_patha_ok = true;
1488 b_pathb_ok = true;
1767 } else { 1489 } else {
1768 rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; 1490 rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100;
1769 rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0; 1491 rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;
1770 } 1492 }
1771 if (reg_e94 != 0) /*&&(reg_ea4 != 0) */ 1493 if (reg_e94 != 0) /*&&(reg_ea4 != 0) */
1772 _rtl92c_phy_path_a_fill_iqk_matrix(hw, patha_ok, result, 1494 _rtl92c_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
1773 final_candidate, 1495 final_candidate,
1774 (reg_ea4 == 0)); 1496 (reg_ea4 == 0));
1775 if (IS_92C_SERIAL(rtlhal->version)) { 1497 if (IS_92C_SERIAL(rtlhal->version)) {
1776 if (reg_eb4 != 0) /*&&(reg_ec4 != 0) */ 1498 if (reg_eb4 != 0) /*&&(reg_ec4 != 0) */
1777 _rtl92c_phy_path_b_fill_iqk_matrix(hw, pathb_ok, 1499 _rtl92c_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok,
1778 result, 1500 result,
1779 final_candidate, 1501 final_candidate,
1780 (reg_ec4 == 0)); 1502 (reg_ec4 == 0));
@@ -1788,10 +1510,7 @@ void rtl92c_phy_lc_calibrate(struct ieee80211_hw *hw)
1788{ 1510{
1789 struct rtl_priv *rtlpriv = rtl_priv(hw); 1511 struct rtl_priv *rtlpriv = rtl_priv(hw);
1790 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1512 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1791 bool start_conttx = false, singletone = false;
1792 1513
1793 if (start_conttx || singletone)
1794 return;
1795 if (IS_92C_SERIAL(rtlhal->version)) 1514 if (IS_92C_SERIAL(rtlhal->version))
1796 rtlpriv->cfg->ops->phy_lc_calibrate(hw, true); 1515 rtlpriv->cfg->ops->phy_lc_calibrate(hw, true);
1797 else 1516 else
@@ -1833,22 +1552,22 @@ bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1833 1552
1834 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1553 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1835 "-->IO Cmd(%#x), set_io_inprogress(%d)\n", 1554 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
1836 iotype, rtlphy->set_io_inprogress); 1555 iotype, rtlphy->set_io_inprogress);
1837 do { 1556 do {
1838 switch (iotype) { 1557 switch (iotype) {
1839 case IO_CMD_RESUME_DM_BY_SCAN: 1558 case IO_CMD_RESUME_DM_BY_SCAN:
1840 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1559 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1841 "[IO CMD] Resume DM after scan\n"); 1560 "[IO CMD] Resume DM after scan.\n");
1842 postprocessing = true; 1561 postprocessing = true;
1843 break; 1562 break;
1844 case IO_CMD_PAUSE_DM_BY_SCAN: 1563 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
1845 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1564 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1846 "[IO CMD] Pause DM before scan\n"); 1565 "[IO CMD] Pause DM before scan.\n");
1847 postprocessing = true; 1566 postprocessing = true;
1848 break; 1567 break;
1849 default: 1568 default:
1850 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1569 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1851 "switch case not processed\n"); 1570 "switch case not process\n");
1852 break; 1571 break;
1853 } 1572 }
1854 } while (false); 1573 } while (false);
@@ -1859,7 +1578,7 @@ bool rtl92c_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1859 return false; 1578 return false;
1860 } 1579 }
1861 rtl92c_phy_set_io(hw); 1580 rtl92c_phy_set_io(hw);
1862 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype); 1581 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
1863 return true; 1582 return true;
1864} 1583}
1865EXPORT_SYMBOL(rtl92c_phy_set_io_cmd); 1584EXPORT_SYMBOL(rtl92c_phy_set_io_cmd);
@@ -1868,30 +1587,30 @@ void rtl92c_phy_set_io(struct ieee80211_hw *hw)
1868{ 1587{
1869 struct rtl_priv *rtlpriv = rtl_priv(hw); 1588 struct rtl_priv *rtlpriv = rtl_priv(hw);
1870 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1589 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1871 struct dig_t dm_digtable = rtlpriv->dm_digtable; 1590 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
1872 1591
1873 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1592 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1874 "--->Cmd(%#x), set_io_inprogress(%d)\n", 1593 "--->Cmd(%#x), set_io_inprogress(%d)\n",
1875 rtlphy->current_io_type, rtlphy->set_io_inprogress); 1594 rtlphy->current_io_type, rtlphy->set_io_inprogress);
1876 switch (rtlphy->current_io_type) { 1595 switch (rtlphy->current_io_type) {
1877 case IO_CMD_RESUME_DM_BY_SCAN: 1596 case IO_CMD_RESUME_DM_BY_SCAN:
1878 dm_digtable.cur_igvalue = rtlphy->initgain_backup.xaagccore1; 1597 dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
1879 rtl92c_dm_write_dig(hw); 1598 rtl92c_dm_write_dig(hw);
1880 rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel); 1599 rtl92c_phy_set_txpower_level(hw, rtlphy->current_channel);
1881 break; 1600 break;
1882 case IO_CMD_PAUSE_DM_BY_SCAN: 1601 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
1883 rtlphy->initgain_backup.xaagccore1 = dm_digtable.cur_igvalue; 1602 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
1884 dm_digtable.cur_igvalue = 0x37; 1603 dm_digtable->cur_igvalue = 0x17;
1885 rtl92c_dm_write_dig(hw); 1604 rtl92c_dm_write_dig(hw);
1886 break; 1605 break;
1887 default: 1606 default:
1888 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1607 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1889 "switch case not processed\n"); 1608 "switch case not process\n");
1890 break; 1609 break;
1891 } 1610 }
1892 rtlphy->set_io_inprogress = false; 1611 rtlphy->set_io_inprogress = false;
1893 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n", 1612 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1894 rtlphy->current_io_type); 1613 "(%#x)\n", rtlphy->current_io_type);
1895} 1614}
1896EXPORT_SYMBOL(rtl92c_phy_set_io); 1615EXPORT_SYMBOL(rtl92c_phy_set_io);
1897 1616
@@ -1931,7 +1650,7 @@ void _rtl92c_phy_set_rf_sleep(struct ieee80211_hw *hw)
1931 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 1650 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
1932 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 1651 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1933 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 1652 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
1934 "Switch RF timeout !!!\n"); 1653 "Switch RF timeout !!!.\n");
1935 return; 1654 return;
1936 } 1655 }
1937 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 1656 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h
index e79dabe9ba1d..64bc49f4dbc6 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192c/phy_common.h
@@ -226,7 +226,7 @@ u32 _rtl92c_phy_calculate_bit_shift(u32 bitmask);
226long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, 226long _rtl92c_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
227 enum wireless_mode wirelessmode, 227 enum wireless_mode wirelessmode,
228 u8 txpwridx); 228 u8 txpwridx);
229u8 _rtl92c_phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw, 229u8 _rtl92c_phy_dbm_to_txpwr_idx(struct ieee80211_hw *hw,
230 enum wireless_mode wirelessmode, 230 enum wireless_mode wirelessmode,
231 long power_indbm); 231 long power_indbm);
232void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw); 232void _rtl92c_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
index fa24de43ce79..831df101d7b7 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/def.h
@@ -146,21 +146,6 @@ enum version_8192c {
146 VERSION_UNKNOWN = 0x88, 146 VERSION_UNKNOWN = 0x88,
147}; 147};
148 148
149#define CUT_VERSION_MASK (BIT(6)|BIT(7))
150#define CHIP_VENDOR_UMC BIT(5)
151#define CHIP_VENDOR_UMC_B_CUT BIT(6) /* Chip version for ECO */
152#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? \
153 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false)
154#define IS_CHIP_VER_B(version) ((version & CHIP_VER_B) ? true : false)
155#define IS_92C_SERIAL(version) ((version & CHIP_92C_BITMASK) ? true : false)
156#define IS_CHIP_VENDOR_UMC(version) \
157 ((version & CHIP_VENDOR_UMC) ? true : false)
158#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
159#define IS_81xxC_VENDOR_UMC_B_CUT(version) \
160 ((IS_CHIP_VENDOR_UMC(version)) ? \
161 ((GET_CVID_CUT_VERSION(version) == CHIP_VENDOR_UMC_B_CUT) ? \
162 true : false) : false)
163
164enum rtl819x_loopback_e { 149enum rtl819x_loopback_e {
165 RTL819X_NO_LOOPBACK = 0, 150 RTL819X_NO_LOOPBACK = 0,
166 RTL819X_MAC_LOOPBACK = 1, 151 RTL819X_MAC_LOOPBACK = 1,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
index d4a3d032c7bf..9c5311c299fd 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/dm.h
@@ -86,70 +86,6 @@
86#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 86#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
87#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67 87#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
88 88
89struct swat_t {
90 u8 failure_cnt;
91 u8 try_flag;
92 u8 stop_trying;
93 long pre_rssi;
94 long trying_threshold;
95 u8 cur_antenna;
96 u8 pre_antenna;
97};
98
99enum tag_dynamic_init_gain_operation_type_definition {
100 DIG_TYPE_THRESH_HIGH = 0,
101 DIG_TYPE_THRESH_LOW = 1,
102 DIG_TYPE_BACKOFF = 2,
103 DIG_TYPE_RX_GAIN_MIN = 3,
104 DIG_TYPE_RX_GAIN_MAX = 4,
105 DIG_TYPE_ENABLE = 5,
106 DIG_TYPE_DISABLE = 6,
107 DIG_OP_TYPE_MAX
108};
109
110enum tag_cck_packet_detection_threshold_type_definition {
111 CCK_PD_STAGE_LowRssi = 0,
112 CCK_PD_STAGE_HighRssi = 1,
113 CCK_FA_STAGE_Low = 2,
114 CCK_FA_STAGE_High = 3,
115 CCK_PD_STAGE_MAX = 4,
116};
117
118enum dm_1r_cca_e {
119 CCA_1R = 0,
120 CCA_2R = 1,
121 CCA_MAX = 2,
122};
123
124enum dm_rf_e {
125 RF_SAVE = 0,
126 RF_NORMAL = 1,
127 RF_MAX = 2,
128};
129
130enum dm_sw_ant_switch_e {
131 ANS_ANTENNA_B = 1,
132 ANS_ANTENNA_A = 2,
133 ANS_ANTENNA_MAX = 3,
134};
135
136enum dm_dig_ext_port_alg_e {
137 DIG_EXT_PORT_STAGE_0 = 0,
138 DIG_EXT_PORT_STAGE_1 = 1,
139 DIG_EXT_PORT_STAGE_2 = 2,
140 DIG_EXT_PORT_STAGE_3 = 3,
141 DIG_EXT_PORT_STAGE_MAX = 4,
142};
143
144enum dm_dig_connect_e {
145 DIG_STA_DISCONNECT = 0,
146 DIG_STA_CONNECT = 1,
147 DIG_STA_BEFORE_CONNECT = 2,
148 DIG_MULTISTA_DISCONNECT = 3,
149 DIG_MULTISTA_CONNECT = 4,
150 DIG_CONNECT_MAX
151};
152
153void rtl92c_dm_init(struct ieee80211_hw *hw); 89void rtl92c_dm_init(struct ieee80211_hw *hw);
154void rtl92c_dm_watchdog(struct ieee80211_hw *hw); 90void rtl92c_dm_watchdog(struct ieee80211_hw *hw);
155void rtl92c_dm_write_dig(struct ieee80211_hw *hw); 91void rtl92c_dm_write_dig(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
index df98a5e4729a..8ec0f031f48a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.c
@@ -37,7 +37,9 @@
37#include "reg.h" 37#include "reg.h"
38#include "def.h" 38#include "def.h"
39#include "phy.h" 39#include "phy.h"
40#include "../rtl8192c/dm_common.h"
40#include "../rtl8192c/fw_common.h" 41#include "../rtl8192c/fw_common.h"
42#include "../rtl8192c/phy_common.h"
41#include "dm.h" 43#include "dm.h"
42#include "led.h" 44#include "led.h"
43#include "hw.h" 45#include "hw.h"
@@ -53,7 +55,7 @@ static void _rtl92ce_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
53 rtlpci->reg_bcn_ctrl_val |= set_bits; 55 rtlpci->reg_bcn_ctrl_val |= set_bits;
54 rtlpci->reg_bcn_ctrl_val &= ~clear_bits; 56 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
55 57
56 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val); 58 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
57} 59}
58 60
59static void _rtl92ce_stop_tx_beacon(struct ieee80211_hw *hw) 61static void _rtl92ce_stop_tx_beacon(struct ieee80211_hw *hw)
@@ -985,7 +987,7 @@ int rtl92ce_hw_init(struct ieee80211_hw *hw)
985 !IS_92C_SERIAL(rtlhal->version)) { 987 !IS_92C_SERIAL(rtlhal->version)) {
986 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 0x30255); 988 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 0x30255);
987 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G2, MASKDWORD, 0x50a00); 989 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G2, MASKDWORD, 0x50a00);
988 } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) { 990 } else if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version)) {
989 rtl_set_rfreg(hw, RF90_PATH_A, 0x0C, MASKDWORD, 0x894AE); 991 rtl_set_rfreg(hw, RF90_PATH_A, 0x0C, MASKDWORD, 0x894AE);
990 rtl_set_rfreg(hw, RF90_PATH_A, 0x0A, MASKDWORD, 0x1AF31); 992 rtl_set_rfreg(hw, RF90_PATH_A, 0x0A, MASKDWORD, 0x1AF31);
991 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, MASKDWORD, 0x8F425); 993 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, MASKDWORD, 0x8F425);
@@ -1330,7 +1332,7 @@ static void _rtl92ce_poweroff_adapter(struct ieee80211_hw *hw)
1330 rtl_write_word(rtlpriv, REG_GPIO_IO_SEL, 0x0790); 1332 rtl_write_word(rtlpriv, REG_GPIO_IO_SEL, 0x0790);
1331 rtl_write_word(rtlpriv, REG_LEDCFG0, 0x8080); 1333 rtl_write_word(rtlpriv, REG_LEDCFG0, 0x8080);
1332 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x80); 1334 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x80);
1333 if (!IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) 1335 if (!IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version))
1334 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x23); 1336 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x23);
1335 if (rtlpcipriv->bt_coexist.bt_coexistence) { 1337 if (rtlpcipriv->bt_coexist.bt_coexistence) {
1336 u4b_tmp = rtl_read_dword(rtlpriv, REG_AFE_XTAL_CTRL); 1338 u4b_tmp = rtl_read_dword(rtlpriv, REG_AFE_XTAL_CTRL);
@@ -1494,7 +1496,7 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1494 1496
1495 for (rf_path = 0; rf_path < 2; rf_path++) { 1497 for (rf_path = 0; rf_path < 2; rf_path++) {
1496 for (i = 0; i < 14; i++) { 1498 for (i = 0; i < 14; i++) {
1497 index = _rtl92c_get_chnl_group((u8) i); 1499 index = rtl92c_get_chnl_group((u8)i);
1498 1500
1499 rtlefuse->txpwrlevel_cck[rf_path][i] = 1501 rtlefuse->txpwrlevel_cck[rf_path][i] =
1500 rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][index]; 1502 rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][index];
@@ -1543,7 +1545,7 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1543 1545
1544 for (rf_path = 0; rf_path < 2; rf_path++) { 1546 for (rf_path = 0; rf_path < 2; rf_path++) {
1545 for (i = 0; i < 14; i++) { 1547 for (i = 0; i < 14; i++) {
1546 index = _rtl92c_get_chnl_group((u8) i); 1548 index = rtl92c_get_chnl_group((u8)i);
1547 1549
1548 if (rf_path == RF90_PATH_A) { 1550 if (rf_path == RF90_PATH_A) {
1549 rtlefuse->pwrgroup_ht20[rf_path][i] = 1551 rtlefuse->pwrgroup_ht20[rf_path][i] =
@@ -1573,7 +1575,7 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1573 } 1575 }
1574 1576
1575 for (i = 0; i < 14; i++) { 1577 for (i = 0; i < 14; i++) {
1576 index = _rtl92c_get_chnl_group((u8) i); 1578 index = rtl92c_get_chnl_group((u8)i);
1577 1579
1578 if (!autoload_fail) 1580 if (!autoload_fail)
1579 tempval = hwinfo[EEPROM_TXPOWERHT20DIFF + index]; 1581 tempval = hwinfo[EEPROM_TXPOWERHT20DIFF + index];
@@ -1590,7 +1592,7 @@ static void _rtl92ce_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1590 if (rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] & BIT(3)) 1592 if (rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] & BIT(3))
1591 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] |= 0xF0; 1593 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] |= 0xF0;
1592 1594
1593 index = _rtl92c_get_chnl_group((u8) i); 1595 index = rtl92c_get_chnl_group((u8)i);
1594 1596
1595 if (!autoload_fail) 1597 if (!autoload_fail)
1596 tempval = hwinfo[EEPROM_TXPOWER_OFDMDIFF + index]; 1598 tempval = hwinfo[EEPROM_TXPOWER_OFDMDIFF + index];
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.h b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.h
index 5533070f266c..98a086822aac 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/hw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/hw.h
@@ -30,7 +30,7 @@
30#ifndef __RTL92CE_HW_H__ 30#ifndef __RTL92CE_HW_H__
31#define __RTL92CE_HW_H__ 31#define __RTL92CE_HW_H__
32 32
33static inline u8 _rtl92c_get_chnl_group(u8 chnl) 33static inline u8 rtl92c_get_chnl_group(u8 chnl)
34{ 34{
35 u8 group; 35 u8 group;
36 36
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
index 98b22303c84d..bc5ca989b915 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
@@ -35,8 +35,11 @@
35#include "def.h" 35#include "def.h"
36#include "hw.h" 36#include "hw.h"
37#include "phy.h" 37#include "phy.h"
38#include "../rtl8192c/phy_common.h"
38#include "rf.h" 39#include "rf.h"
39#include "dm.h" 40#include "dm.h"
41#include "../rtl8192c/dm_common.h"
42#include "../rtl8192c/fw_common.h"
40#include "table.h" 43#include "table.h"
41 44
42static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); 45static bool _rtl92c_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
index 94486cca4000..e5e1353a94c3 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/phy.h
@@ -78,113 +78,6 @@
78 78
79#define RTL92C_MAX_PATH_NUM 2 79#define RTL92C_MAX_PATH_NUM 2
80 80
81enum swchnlcmd_id {
82 CMDID_END,
83 CMDID_SET_TXPOWEROWER_LEVEL,
84 CMDID_BBREGWRITE10,
85 CMDID_WRITEPORT_ULONG,
86 CMDID_WRITEPORT_USHORT,
87 CMDID_WRITEPORT_UCHAR,
88 CMDID_RF_WRITEREG,
89};
90
91struct swchnlcmd {
92 enum swchnlcmd_id cmdid;
93 u32 para1;
94 u32 para2;
95 u32 msdelay;
96};
97
98enum hw90_block_e {
99 HW90_BLOCK_MAC = 0,
100 HW90_BLOCK_PHY0 = 1,
101 HW90_BLOCK_PHY1 = 2,
102 HW90_BLOCK_RF = 3,
103 HW90_BLOCK_MAXIMUM = 4,
104};
105
106enum baseband_config_type {
107 BASEBAND_CONFIG_PHY_REG = 0,
108 BASEBAND_CONFIG_AGC_TAB = 1,
109};
110
111enum ra_offset_area {
112 RA_OFFSET_LEGACY_OFDM1,
113 RA_OFFSET_LEGACY_OFDM2,
114 RA_OFFSET_HT_OFDM1,
115 RA_OFFSET_HT_OFDM2,
116 RA_OFFSET_HT_OFDM3,
117 RA_OFFSET_HT_OFDM4,
118 RA_OFFSET_HT_CCK,
119};
120
121enum antenna_path {
122 ANTENNA_NONE,
123 ANTENNA_D,
124 ANTENNA_C,
125 ANTENNA_CD,
126 ANTENNA_B,
127 ANTENNA_BD,
128 ANTENNA_BC,
129 ANTENNA_BCD,
130 ANTENNA_A,
131 ANTENNA_AD,
132 ANTENNA_AC,
133 ANTENNA_ACD,
134 ANTENNA_AB,
135 ANTENNA_ABD,
136 ANTENNA_ABC,
137 ANTENNA_ABCD
138};
139
140struct r_antenna_select_ofdm {
141 u32 r_tx_antenna:4;
142 u32 r_ant_l:4;
143 u32 r_ant_non_ht:4;
144 u32 r_ant_ht1:4;
145 u32 r_ant_ht2:4;
146 u32 r_ant_ht_s1:4;
147 u32 r_ant_non_ht_s1:4;
148 u32 ofdm_txsc:2;
149 u32 reserved:2;
150};
151
152struct r_antenna_select_cck {
153 u8 r_cckrx_enable_2:2;
154 u8 r_cckrx_enable:2;
155 u8 r_ccktx_enable:4;
156};
157
158struct efuse_contents {
159 u8 mac_addr[ETH_ALEN];
160 u8 cck_tx_power_idx[6];
161 u8 ht40_1s_tx_power_idx[6];
162 u8 ht40_2s_tx_power_idx_diff[3];
163 u8 ht20_tx_power_idx_diff[3];
164 u8 ofdm_tx_power_idx_diff[3];
165 u8 ht40_max_power_offset[3];
166 u8 ht20_max_power_offset[3];
167 u8 channel_plan;
168 u8 thermal_meter;
169 u8 rf_option[5];
170 u8 version;
171 u8 oem_id;
172 u8 regulatory;
173};
174
175struct tx_power_struct {
176 u8 cck[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
177 u8 ht40_1s[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
178 u8 ht40_2s[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
179 u8 ht20_diff[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
180 u8 legacy_ht_diff[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
181 u8 legacy_ht_txpowerdiff;
182 u8 groupht20[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
183 u8 groupht40[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
184 u8 pwrgroup_cnt;
185 u32 mcs_original_offset[4][16];
186};
187
188bool rtl92c_phy_bb_config(struct ieee80211_hw *hw); 81bool rtl92c_phy_bb_config(struct ieee80211_hw *hw);
189u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask); 82u32 rtl92c_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask);
190void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask, 83void rtl92c_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
index 4bbdfb2df363..d86b5b566444 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/sw.c
@@ -35,6 +35,9 @@
35#include "def.h" 35#include "def.h"
36#include "phy.h" 36#include "phy.h"
37#include "dm.h" 37#include "dm.h"
38#include "../rtl8192c/dm_common.h"
39#include "../rtl8192c/fw_common.h"
40#include "../rtl8192c/phy_common.h"
38#include "hw.h" 41#include "hw.h"
39#include "rf.h" 42#include "rf.h"
40#include "sw.h" 43#include "sw.h"
@@ -165,7 +168,7 @@ int rtl92c_init_sw_vars(struct ieee80211_hw *hw)
165 if (IS_VENDOR_UMC_A_CUT(rtlhal->version) && 168 if (IS_VENDOR_UMC_A_CUT(rtlhal->version) &&
166 !IS_92C_SERIAL(rtlhal->version)) 169 !IS_92C_SERIAL(rtlhal->version))
167 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin"; 170 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU.bin";
168 else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) 171 else if (IS_81XXC_VENDOR_UMC_B_CUT(rtlhal->version))
169 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin"; 172 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cfwU_B.bin";
170 173
171 rtlpriv->max_fw_size = 0x4000; 174 rtlpriv->max_fw_size = 0x4000;
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
index 8f04817cb7ec..2fb9c7acb76a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192ce/trx.c
@@ -125,7 +125,7 @@ static void _rtl92ce_query_rxphystatus(struct ieee80211_hw *hw,
125 u32 rssi, total_rssi = 0; 125 u32 rssi, total_rssi = 0;
126 bool is_cck_rate; 126 bool is_cck_rate;
127 127
128 is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc); 128 is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
129 pstats->packet_matchbssid = packet_match_bssid; 129 pstats->packet_matchbssid = packet_match_bssid;
130 pstats->packet_toself = packet_toself; 130 pstats->packet_toself = packet_toself;
131 pstats->is_cck = is_cck_rate; 131 pstats->is_cck = is_cck_rate;
@@ -361,7 +361,7 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
361 stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc); 361 stats->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc);
362 stats->is_ht = (bool)GET_RX_DESC_RXHT(pdesc); 362 stats->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
363 363
364 stats->is_cck = RX_HAL_IS_CCK_RATE(pdesc); 364 stats->is_cck = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
365 365
366 rx_status->freq = hw->conf.chandef.chan->center_freq; 366 rx_status->freq = hw->conf.chandef.chan->center_freq;
367 rx_status->band = hw->conf.chandef.chan->band; 367 rx_status->band = hw->conf.chandef.chan->band;
@@ -389,10 +389,6 @@ bool rtl92ce_rx_query_desc(struct ieee80211_hw *hw,
389 * to decrypt it 389 * to decrypt it
390 */ 390 */
391 if (stats->decrypted) { 391 if (stats->decrypted) {
392 if (!hdr) {
393 /* In testing, hdr was NULL here */
394 return false;
395 }
396 if ((_ieee80211_is_robust_mgmt_frame(hdr)) && 392 if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
397 (ieee80211_has_protected(hdr->frame_control))) 393 (ieee80211_has_protected(hdr->frame_control)))
398 rx_status->flag &= ~RX_FLAG_DECRYPTED; 394 rx_status->flag &= ~RX_FLAG_DECRYPTED;
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/def.h b/drivers/net/wireless/rtlwifi/rtl8192cu/def.h
index f916555e6311..c940a87175ca 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/def.h
@@ -38,9 +38,6 @@
38#define CHIP_VENDOR_UMC BIT(5) 38#define CHIP_VENDOR_UMC BIT(5)
39#define CHIP_VENDOR_UMC_B_CUT BIT(6) 39#define CHIP_VENDOR_UMC_B_CUT BIT(6)
40 40
41#define IS_NORMAL_CHIP(version) \
42 (((version) & NORMAL_CHIP) ? true : false)
43
44#define IS_8723_SERIES(version) \ 41#define IS_8723_SERIES(version) \
45 (((version) & CHIP_8723) ? true : false) 42 (((version) & CHIP_8723) ? true : false)
46 43
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
index 270cbffcac70..04aa0b5f5b3d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/hw.c
@@ -36,8 +36,11 @@
36#include "reg.h" 36#include "reg.h"
37#include "def.h" 37#include "def.h"
38#include "phy.h" 38#include "phy.h"
39#include "../rtl8192c/phy_common.h"
39#include "mac.h" 40#include "mac.h"
40#include "dm.h" 41#include "dm.h"
42#include "../rtl8192c/dm_common.h"
43#include "../rtl8192c/fw_common.h"
41#include "hw.h" 44#include "hw.h"
42#include "../rtl8192ce/hw.h" 45#include "../rtl8192ce/hw.h"
43#include "trx.h" 46#include "trx.h"
@@ -180,7 +183,7 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
180 eprom_chnl_txpwr_ht40_2sdf[rf_path][i]); 183 eprom_chnl_txpwr_ht40_2sdf[rf_path][i]);
181 for (rf_path = 0; rf_path < 2; rf_path++) { 184 for (rf_path = 0; rf_path < 2; rf_path++) {
182 for (i = 0; i < 14; i++) { 185 for (i = 0; i < 14; i++) {
183 index = _rtl92c_get_chnl_group((u8) i); 186 index = rtl92c_get_chnl_group((u8)i);
184 rtlefuse->txpwrlevel_cck[rf_path][i] = 187 rtlefuse->txpwrlevel_cck[rf_path][i] =
185 rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][index]; 188 rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][index];
186 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 189 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
@@ -222,7 +225,7 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
222 } 225 }
223 for (rf_path = 0; rf_path < 2; rf_path++) { 226 for (rf_path = 0; rf_path < 2; rf_path++) {
224 for (i = 0; i < 14; i++) { 227 for (i = 0; i < 14; i++) {
225 index = _rtl92c_get_chnl_group((u8) i); 228 index = rtl92c_get_chnl_group((u8)i);
226 if (rf_path == RF90_PATH_A) { 229 if (rf_path == RF90_PATH_A) {
227 rtlefuse->pwrgroup_ht20[rf_path][i] = 230 rtlefuse->pwrgroup_ht20[rf_path][i] =
228 (rtlefuse->eeprom_pwrlimit_ht20[index] 231 (rtlefuse->eeprom_pwrlimit_ht20[index]
@@ -249,7 +252,7 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
249 } 252 }
250 } 253 }
251 for (i = 0; i < 14; i++) { 254 for (i = 0; i < 14; i++) {
252 index = _rtl92c_get_chnl_group((u8) i); 255 index = rtl92c_get_chnl_group((u8)i);
253 if (!autoload_fail) 256 if (!autoload_fail)
254 tempval = hwinfo[EEPROM_TXPOWERHT20DIFF + index]; 257 tempval = hwinfo[EEPROM_TXPOWERHT20DIFF + index];
255 else 258 else
@@ -261,7 +264,7 @@ static void _rtl92cu_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
261 rtlefuse->txpwr_ht20diff[RF90_PATH_A][i] |= 0xF0; 264 rtlefuse->txpwr_ht20diff[RF90_PATH_A][i] |= 0xF0;
262 if (rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] & BIT(3)) 265 if (rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] & BIT(3))
263 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] |= 0xF0; 266 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] |= 0xF0;
264 index = _rtl92c_get_chnl_group((u8) i); 267 index = rtl92c_get_chnl_group((u8)i);
265 if (!autoload_fail) 268 if (!autoload_fail)
266 tempval = hwinfo[EEPROM_TXPOWER_OFDMDIFF + index]; 269 tempval = hwinfo[EEPROM_TXPOWER_OFDMDIFF + index];
267 else 270 else
@@ -1169,13 +1172,13 @@ n. LEDCFG 0x4C[15:0] = 0x8080
1169 /* 1. Disable GPIO[7:0] */ 1172 /* 1. Disable GPIO[7:0] */
1170 rtl_write_word(rtlpriv, REG_GPIO_PIN_CTRL+2, 0x0000); 1173 rtl_write_word(rtlpriv, REG_GPIO_PIN_CTRL+2, 0x0000);
1171 value32 = rtl_read_dword(rtlpriv, REG_GPIO_PIN_CTRL) & 0xFFFF00FF; 1174 value32 = rtl_read_dword(rtlpriv, REG_GPIO_PIN_CTRL) & 0xFFFF00FF;
1172 value8 = (u8) (value32&0x000000FF); 1175 value8 = (u8)(value32&0x000000FF);
1173 value32 |= ((value8<<8) | 0x00FF0000); 1176 value32 |= ((value8<<8) | 0x00FF0000);
1174 rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, value32); 1177 rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, value32);
1175 /* 2. Disable GPIO[10:8] */ 1178 /* 2. Disable GPIO[10:8] */
1176 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG+3, 0x00); 1179 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG+3, 0x00);
1177 value16 = rtl_read_word(rtlpriv, REG_GPIO_MUXCFG+2) & 0xFF0F; 1180 value16 = rtl_read_word(rtlpriv, REG_GPIO_MUXCFG+2) & 0xFF0F;
1178 value8 = (u8) (value16&0x000F); 1181 value8 = (u8)(value16&0x000F);
1179 value16 |= ((value8<<4) | 0x0780); 1182 value16 |= ((value8<<4) | 0x0780);
1180 rtl_write_word(rtlpriv, REG_GPIO_PIN_CTRL+2, value16); 1183 rtl_write_word(rtlpriv, REG_GPIO_PIN_CTRL+2, value16);
1181 /* 3. Disable LED0 & 1 */ 1184 /* 3. Disable LED0 & 1 */
@@ -1245,7 +1248,7 @@ static void _rtl92cu_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
1245 1248
1246 rtlusb->reg_bcn_ctrl_val |= set_bits; 1249 rtlusb->reg_bcn_ctrl_val |= set_bits;
1247 rtlusb->reg_bcn_ctrl_val &= ~clear_bits; 1250 rtlusb->reg_bcn_ctrl_val &= ~clear_bits;
1248 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlusb->reg_bcn_ctrl_val); 1251 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlusb->reg_bcn_ctrl_val);
1249} 1252}
1250 1253
1251static void _rtl92cu_stop_tx_beacon(struct ieee80211_hw *hw) 1254static void _rtl92cu_stop_tx_beacon(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
index e26312fb4356..c2d8ec6afcda 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/mac.c
@@ -40,6 +40,7 @@
40#include "dm.h" 40#include "dm.h"
41#include "mac.h" 41#include "mac.h"
42#include "trx.h" 42#include "trx.h"
43#include "../rtl8192c/fw_common.h"
43 44
44#include <linux/module.h> 45#include <linux/module.h>
45 46
@@ -786,7 +787,7 @@ static void _rtl92c_query_rxphystatus(struct ieee80211_hw *hw,
786 bool is_cck_rate; 787 bool is_cck_rate;
787 u8 *pdesc = (u8 *)p_desc; 788 u8 *pdesc = (u8 *)p_desc;
788 789
789 is_cck_rate = RX_HAL_IS_CCK_RATE(p_desc); 790 is_cck_rate = RX_HAL_IS_CCK_RATE(p_desc->rxmcs);
790 pstats->packet_matchbssid = packet_match_bssid; 791 pstats->packet_matchbssid = packet_match_bssid;
791 pstats->packet_toself = packet_toself; 792 pstats->packet_toself = packet_toself;
792 pstats->packet_beacon = packet_beacon; 793 pstats->packet_beacon = packet_beacon;
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
index 9831ff1128ca..12f6d474b492 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
@@ -34,8 +34,11 @@
34#include "reg.h" 34#include "reg.h"
35#include "def.h" 35#include "def.h"
36#include "phy.h" 36#include "phy.h"
37#include "../rtl8192c/phy_common.h"
37#include "rf.h" 38#include "rf.h"
38#include "dm.h" 39#include "dm.h"
40#include "../rtl8192c/dm_common.h"
41#include "../rtl8192c/fw_common.h"
39#include "table.h" 42#include "table.h"
40 43
41u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw, 44u32 rtl92cu_phy_query_rf_reg(struct ieee80211_hw *hw,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
index 1ac6383e7947..7c5fbaf5fee0 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/sw.c
@@ -42,6 +42,7 @@
42#include "trx.h" 42#include "trx.h"
43#include "led.h" 43#include "led.h"
44#include "hw.h" 44#include "hw.h"
45#include "../rtl8192c/fw_common.h"
45#include <linux/module.h> 46#include <linux/module.h>
46 47
47MODULE_AUTHOR("Georgia <georgia@realtek.com>"); 48MODULE_AUTHOR("Georgia <georgia@realtek.com>");
@@ -75,7 +76,7 @@ static int rtl92cu_init_sw_vars(struct ieee80211_hw *hw)
75 if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) && 76 if (IS_VENDOR_UMC_A_CUT(rtlpriv->rtlhal.version) &&
76 !IS_92C_SERIAL(rtlpriv->rtlhal.version)) { 77 !IS_92C_SERIAL(rtlpriv->rtlhal.version)) {
77 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin"; 78 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_A.bin";
78 } else if (IS_81xxC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) { 79 } else if (IS_81XXC_VENDOR_UMC_B_CUT(rtlpriv->rtlhal.version)) {
79 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin"; 80 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_B.bin";
80 } else { 81 } else {
81 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin"; 82 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192cufw_TMSC.bin";
@@ -121,7 +122,6 @@ static struct rtl_hal_ops rtl8192cu_hal_ops = {
121 .fill_tx_desc = rtl92cu_tx_fill_desc, 122 .fill_tx_desc = rtl92cu_tx_fill_desc,
122 .fill_fake_txdesc = rtl92cu_fill_fake_txdesc, 123 .fill_fake_txdesc = rtl92cu_fill_fake_txdesc,
123 .fill_tx_cmddesc = rtl92cu_tx_fill_cmddesc, 124 .fill_tx_cmddesc = rtl92cu_tx_fill_cmddesc,
124 .cmd_send_packet = rtl92cu_cmd_send_packet,
125 .query_rx_desc = rtl92cu_rx_query_desc, 125 .query_rx_desc = rtl92cu_rx_query_desc,
126 .set_channel_access = rtl92cu_update_channel_access_setting, 126 .set_channel_access = rtl92cu_update_channel_access_setting,
127 .radio_onoff_checking = rtl92cu_gpio_radio_on_off_checking, 127 .radio_onoff_checking = rtl92cu_gpio_radio_on_off_checking,
diff --git a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
index 035e0dc3922c..f383d5f1fed5 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192cu/trx.c
@@ -38,6 +38,7 @@
38#include "dm.h" 38#include "dm.h"
39#include "mac.h" 39#include "mac.h"
40#include "trx.h" 40#include "trx.h"
41#include "../rtl8192c/fw_common.h"
41 42
42static int _ConfigVerTOutEP(struct ieee80211_hw *hw) 43static int _ConfigVerTOutEP(struct ieee80211_hw *hw)
43{ 44{
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/fw.h b/drivers/net/wireless/rtlwifi/rtl8192de/fw.h
index 1ffacdda734c..a55a803a0b4d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/fw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/fw.h
@@ -132,18 +132,6 @@ struct rtl92d_firmware_header {
132 u32 rsvd5; 132 u32 rsvd5;
133}; 133};
134 134
135enum rtl8192d_h2c_cmd {
136 H2C_AP_OFFLOAD = 0,
137 H2C_SETPWRMODE = 1,
138 H2C_JOINBSSRPT = 2,
139 H2C_RSVDPAGE = 3,
140 H2C_RSSI_REPORT = 5,
141 H2C_RA_MASK = 6,
142 H2C_MAC_MODE_SEL = 9,
143 H2C_PWRM = 15,
144 MAX_H2CCMD
145};
146
147int rtl92d_download_fw(struct ieee80211_hw *hw); 135int rtl92d_download_fw(struct ieee80211_hw *hw);
148void rtl92d_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, 136void rtl92d_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
149 u32 cmd_len, u8 *p_cmdbuffer); 137 u32 cmd_len, u8 *p_cmdbuffer);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
index 99c2ab5dfceb..8efbcc7af250 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192de/trx.c
@@ -127,7 +127,7 @@ static void _rtl92de_query_rxphystatus(struct ieee80211_hw *hw,
127 u32 rssi, total_rssi = 0; 127 u32 rssi, total_rssi = 0;
128 bool is_cck_rate; 128 bool is_cck_rate;
129 129
130 is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc); 130 is_cck_rate = RX_HAL_IS_CCK_RATE(pdesc->rxmcs);
131 pstats->packet_matchbssid = packet_match_bssid; 131 pstats->packet_matchbssid = packet_match_bssid;
132 pstats->packet_toself = packet_toself; 132 pstats->packet_toself = packet_toself;
133 pstats->packet_beacon = packet_beacon; 133 pstats->packet_beacon = packet_beacon;
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile b/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
new file mode 100644
index 000000000000..11952b99daf8
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/Makefile
@@ -0,0 +1,19 @@
1obj-m := rtl8192ee.o
2
3
4rtl8192ee-objs := \
5 dm.o \
6 fw.o \
7 hw.o \
8 led.o \
9 phy.o \
10 pwrseq.o \
11 rf.o \
12 sw.o \
13 table.o \
14 trx.o \
15
16
17obj-$(CONFIG_RTL8821AE) += rtl8192ee.o
18
19ccflags-y += -D__CHECK_ENDIAN__
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/def.h b/drivers/net/wireless/rtlwifi/rtl8192ee/def.h
new file mode 100644
index 000000000000..60f5728b4e2d
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/def.h
@@ -0,0 +1,101 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_DEF_H__
27#define __RTL92E_DEF_H__
28
29#define RX_DESC_NUM_92E 512
30
31#define HAL_PRIME_CHNL_OFFSET_DONT_CARE 0
32#define HAL_PRIME_CHNL_OFFSET_LOWER 1
33#define HAL_PRIME_CHNL_OFFSET_UPPER 2
34
35#define RX_MPDU_QUEUE 0
36
37#define IS_HT_RATE(_rate) \
38 (_rate >= DESC92C_RATEMCS0)
39#define IS_CCK_RATE(_rate) \
40 (_rate >= DESC92C_RATE1M && _rate <= DESC92C_RATE11M)
41#define IS_OFDM_RATE(_rate) \
42 (_rate >= DESC92C_RATE6M && _rate <= DESC92C_RATE54M)
43
44enum version_8192e {
45 VERSION_TEST_CHIP_2T2R_8192E = 0x0024,
46 VERSION_NORMAL_CHIP_2T2R_8192E = 0x102C,
47 VERSION_UNKNOWN = 0xFF,
48};
49
50enum rx_packet_type {
51 NORMAL_RX,
52 TX_REPORT1,
53 TX_REPORT2,
54 HIS_REPORT,
55 C2H_PACKET,
56};
57
58enum rtl_desc_qsel {
59 QSLT_BK = 0x2,
60 QSLT_BE = 0x0,
61 QSLT_VI = 0x5,
62 QSLT_VO = 0x7,
63 QSLT_BEACON = 0x10,
64 QSLT_HIGH = 0x11,
65 QSLT_MGNT = 0x12,
66 QSLT_CMD = 0x13,
67};
68
69enum rtl_desc92c_rate {
70 DESC92C_RATE1M = 0x00,
71 DESC92C_RATE2M = 0x01,
72 DESC92C_RATE5_5M = 0x02,
73 DESC92C_RATE11M = 0x03,
74
75 DESC92C_RATE6M = 0x04,
76 DESC92C_RATE9M = 0x05,
77 DESC92C_RATE12M = 0x06,
78 DESC92C_RATE18M = 0x07,
79 DESC92C_RATE24M = 0x08,
80 DESC92C_RATE36M = 0x09,
81 DESC92C_RATE48M = 0x0a,
82 DESC92C_RATE54M = 0x0b,
83
84 DESC92C_RATEMCS0 = 0x0c,
85 DESC92C_RATEMCS1 = 0x0d,
86 DESC92C_RATEMCS2 = 0x0e,
87 DESC92C_RATEMCS3 = 0x0f,
88 DESC92C_RATEMCS4 = 0x10,
89 DESC92C_RATEMCS5 = 0x11,
90 DESC92C_RATEMCS6 = 0x12,
91 DESC92C_RATEMCS7 = 0x13,
92 DESC92C_RATEMCS8 = 0x14,
93 DESC92C_RATEMCS9 = 0x15,
94 DESC92C_RATEMCS10 = 0x16,
95 DESC92C_RATEMCS11 = 0x17,
96 DESC92C_RATEMCS12 = 0x18,
97 DESC92C_RATEMCS13 = 0x19,
98 DESC92C_RATEMCS14 = 0x1a,
99 DESC92C_RATEMCS15 = 0x1b,
100};
101#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
new file mode 100644
index 000000000000..77deedf79d1d
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.c
@@ -0,0 +1,1263 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../base.h"
28#include "../pci.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "dm.h"
33#include "fw.h"
34#include "trx.h"
35
36static const u32 ofdmswing_table[OFDM_TABLE_SIZE] = {
37 0x7f8001fe, /* 0, +6.0dB */
38 0x788001e2, /* 1, +5.5dB */
39 0x71c001c7, /* 2, +5.0dB */
40 0x6b8001ae, /* 3, +4.5dB */
41 0x65400195, /* 4, +4.0dB */
42 0x5fc0017f, /* 5, +3.5dB */
43 0x5a400169, /* 6, +3.0dB */
44 0x55400155, /* 7, +2.5dB */
45 0x50800142, /* 8, +2.0dB */
46 0x4c000130, /* 9, +1.5dB */
47 0x47c0011f, /* 10, +1.0dB */
48 0x43c0010f, /* 11, +0.5dB */
49 0x40000100, /* 12, +0dB */
50 0x3c8000f2, /* 13, -0.5dB */
51 0x390000e4, /* 14, -1.0dB */
52 0x35c000d7, /* 15, -1.5dB */
53 0x32c000cb, /* 16, -2.0dB */
54 0x300000c0, /* 17, -2.5dB */
55 0x2d4000b5, /* 18, -3.0dB */
56 0x2ac000ab, /* 19, -3.5dB */
57 0x288000a2, /* 20, -4.0dB */
58 0x26000098, /* 21, -4.5dB */
59 0x24000090, /* 22, -5.0dB */
60 0x22000088, /* 23, -5.5dB */
61 0x20000080, /* 24, -6.0dB */
62 0x1e400079, /* 25, -6.5dB */
63 0x1c800072, /* 26, -7.0dB */
64 0x1b00006c, /* 27. -7.5dB */
65 0x19800066, /* 28, -8.0dB */
66 0x18000060, /* 29, -8.5dB */
67 0x16c0005b, /* 30, -9.0dB */
68 0x15800056, /* 31, -9.5dB */
69 0x14400051, /* 32, -10.0dB */
70 0x1300004c, /* 33, -10.5dB */
71 0x12000048, /* 34, -11.0dB */
72 0x11000044, /* 35, -11.5dB */
73 0x10000040, /* 36, -12.0dB */
74 0x0f00003c, /* 37, -12.5dB */
75 0x0e400039, /* 38, -13.0dB */
76 0x0d800036, /* 39, -13.5dB */
77 0x0cc00033, /* 40, -14.0dB */
78 0x0c000030, /* 41, -14.5dB */
79 0x0b40002d, /* 42, -15.0dB */
80};
81
82static const u8 cckswing_table_ch1ch13[CCK_TABLE_SIZE][8] = {
83 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04}, /* 0, +0dB */
84 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 1, -0.5dB */
85 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 2, -1.0dB */
86 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 3, -1.5dB */
87 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 4, -2.0dB */
88 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 5, -2.5dB */
89 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 6, -3.0dB */
90 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 7, -3.5dB */
91 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 8, -4.0dB */
92 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 9, -4.5dB */
93 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 10, -5.0dB */
94 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 11, -5.5dB */
95 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 12, -6.0dB */
96 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 13, -6.5dB */
97 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 14, -7.0dB */
98 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 15, -7.5dB */
99 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */
100 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 17, -8.5dB */
101 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 18, -9.0dB */
102 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 19, -9.5dB */
103 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 20, -10.0dB */
104 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 21, -10.5dB */
105 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 22, -11.0dB */
106 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 23, -11.5dB */
107 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 24, -12.0dB */
108 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 25, -12.5dB */
109 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 26, -13.0dB */
110 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 27, -13.5dB */
111 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 28, -14.0dB */
112 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 29, -14.5dB */
113 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 30, -15.0dB */
114 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 31, -15.5dB */
115 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01} /* 32, -16.0dB */
116};
117
118static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
119 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00}, /* 0, +0dB */
120 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 1, -0.5dB */
121 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 2, -1.0dB */
122 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 3, -1.5dB */
123 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 4, -2.0dB */
124 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 5, -2.5dB */
125 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 6, -3.0dB */
126 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 7, -3.5dB */
127 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 8, -4.0dB */
128 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 9, -4.5dB */
129 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 10, -5.0dB */
130 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 11, -5.5dB */
131 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 12, -6.0dB */
132 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 13, -6.5dB */
133 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 14, -7.0dB */
134 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 15, -7.5dB */
135 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */
136 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 17, -8.5dB */
137 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 18, -9.0dB */
138 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 19, -9.5dB */
139 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 20, -10.0dB */
140 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 21, -10.5dB */
141 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 22, -11.0dB */
142 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 23, -11.5dB */
143 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 24, -12.0dB */
144 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 25, -12.5dB */
145 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 26, -13.0dB */
146 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 27, -13.5dB */
147 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 28, -14.0dB */
148 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 29, -14.5dB */
149 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 30, -15.0dB */
150 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 31, -15.5dB */
151 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} /* 32, -16.0dB */
152};
153
154static void rtl92ee_dm_diginit(struct ieee80211_hw *hw)
155{
156 struct rtl_priv *rtlpriv = rtl_priv(hw);
157 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
158
159 dm_dig->cur_igvalue = rtl_get_bbreg(hw, DM_REG_IGI_A_11N,
160 DM_BIT_IGI_11N);
161 dm_dig->rssi_lowthresh = DM_DIG_THRESH_LOW;
162 dm_dig->rssi_highthresh = DM_DIG_THRESH_HIGH;
163 dm_dig->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
164 dm_dig->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
165 dm_dig->rx_gain_max = DM_DIG_MAX;
166 dm_dig->rx_gain_min = DM_DIG_MIN;
167 dm_dig->back_val = DM_DIG_BACKOFF_DEFAULT;
168 dm_dig->back_range_max = DM_DIG_BACKOFF_MAX;
169 dm_dig->back_range_min = DM_DIG_BACKOFF_MIN;
170 dm_dig->pre_cck_cca_thres = 0xff;
171 dm_dig->cur_cck_cca_thres = 0x83;
172 dm_dig->forbidden_igi = DM_DIG_MIN;
173 dm_dig->large_fa_hit = 0;
174 dm_dig->recover_cnt = 0;
175 dm_dig->dig_dynamic_min = DM_DIG_MIN;
176 dm_dig->dig_dynamic_min_1 = DM_DIG_MIN;
177 dm_dig->media_connect_0 = false;
178 dm_dig->media_connect_1 = false;
179 rtlpriv->dm.dm_initialgain_enable = true;
180 dm_dig->bt30_cur_igi = 0x32;
181}
182
183static void rtl92ee_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
184{
185 u32 ret_value;
186 struct rtl_priv *rtlpriv = rtl_priv(hw);
187 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
188
189 rtl_set_bbreg(hw, DM_REG_OFDM_FA_HOLDC_11N, BIT(31), 1);
190 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTD_11N, BIT(31), 1);
191
192 ret_value = rtl_get_bbreg(hw, DM_REG_OFDM_FA_TYPE1_11N, MASKDWORD);
193 falsealm_cnt->cnt_fast_fsync_fail = (ret_value & 0xffff);
194 falsealm_cnt->cnt_sb_search_fail = ((ret_value & 0xffff0000) >> 16);
195
196 ret_value = rtl_get_bbreg(hw, DM_REG_OFDM_FA_TYPE2_11N, MASKDWORD);
197 falsealm_cnt->cnt_ofdm_cca = (ret_value & 0xffff);
198 falsealm_cnt->cnt_parity_fail = ((ret_value & 0xffff0000) >> 16);
199
200 ret_value = rtl_get_bbreg(hw, DM_REG_OFDM_FA_TYPE3_11N, MASKDWORD);
201 falsealm_cnt->cnt_rate_illegal = (ret_value & 0xffff);
202 falsealm_cnt->cnt_crc8_fail = ((ret_value & 0xffff0000) >> 16);
203
204 ret_value = rtl_get_bbreg(hw, DM_REG_OFDM_FA_TYPE4_11N, MASKDWORD);
205 falsealm_cnt->cnt_mcs_fail = (ret_value & 0xffff);
206
207 falsealm_cnt->cnt_ofdm_fail = falsealm_cnt->cnt_parity_fail +
208 falsealm_cnt->cnt_rate_illegal +
209 falsealm_cnt->cnt_crc8_fail +
210 falsealm_cnt->cnt_mcs_fail +
211 falsealm_cnt->cnt_fast_fsync_fail +
212 falsealm_cnt->cnt_sb_search_fail;
213
214 ret_value = rtl_get_bbreg(hw, DM_REG_SC_CNT_11N, MASKDWORD);
215 falsealm_cnt->cnt_bw_lsc = (ret_value & 0xffff);
216 falsealm_cnt->cnt_bw_usc = ((ret_value & 0xffff0000) >> 16);
217
218 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(12), 1);
219 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(14), 1);
220
221 ret_value = rtl_get_bbreg(hw, DM_REG_CCK_FA_LSB_11N, MASKBYTE0);
222 falsealm_cnt->cnt_cck_fail = ret_value;
223
224 ret_value = rtl_get_bbreg(hw, DM_REG_CCK_FA_MSB_11N, MASKBYTE3);
225 falsealm_cnt->cnt_cck_fail += (ret_value & 0xff) << 8;
226
227 ret_value = rtl_get_bbreg(hw, DM_REG_CCK_CCA_CNT_11N, MASKDWORD);
228 falsealm_cnt->cnt_cck_cca = ((ret_value & 0xff) << 8) |
229 ((ret_value & 0xFF00) >> 8);
230
231 falsealm_cnt->cnt_all = falsealm_cnt->cnt_fast_fsync_fail +
232 falsealm_cnt->cnt_sb_search_fail +
233 falsealm_cnt->cnt_parity_fail +
234 falsealm_cnt->cnt_rate_illegal +
235 falsealm_cnt->cnt_crc8_fail +
236 falsealm_cnt->cnt_mcs_fail +
237 falsealm_cnt->cnt_cck_fail;
238
239 falsealm_cnt->cnt_cca_all = falsealm_cnt->cnt_ofdm_cca +
240 falsealm_cnt->cnt_cck_cca;
241
242 /*reset false alarm counter registers*/
243 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTC_11N, BIT(31), 1);
244 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTC_11N, BIT(31), 0);
245 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTD_11N, BIT(27), 1);
246 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTD_11N, BIT(27), 0);
247 /*update ofdm counter*/
248 rtl_set_bbreg(hw, DM_REG_OFDM_FA_HOLDC_11N, BIT(31), 0);
249 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTD_11N, BIT(31), 0);
250 /*reset CCK CCA counter*/
251 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(13) | BIT(12), 0);
252 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(13) | BIT(12), 2);
253 /*reset CCK FA counter*/
254 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(15) | BIT(14), 0);
255 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(15) | BIT(14), 2);
256
257 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
258 "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
259 falsealm_cnt->cnt_parity_fail,
260 falsealm_cnt->cnt_rate_illegal,
261 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
262
263 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
264 "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
265 falsealm_cnt->cnt_ofdm_fail,
266 falsealm_cnt->cnt_cck_fail, falsealm_cnt->cnt_all);
267}
268
269static void rtl92ee_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
270{
271 struct rtl_priv *rtlpriv = rtl_priv(hw);
272 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
273 u8 cur_cck_cca_thresh;
274
275 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
276 if (dm_dig->rssi_val_min > 25) {
277 cur_cck_cca_thresh = 0xcd;
278 } else if ((dm_dig->rssi_val_min <= 25) &&
279 (dm_dig->rssi_val_min > 10)) {
280 cur_cck_cca_thresh = 0x83;
281 } else {
282 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
283 cur_cck_cca_thresh = 0x83;
284 else
285 cur_cck_cca_thresh = 0x40;
286 }
287 } else {
288 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
289 cur_cck_cca_thresh = 0x83;
290 else
291 cur_cck_cca_thresh = 0x40;
292 }
293 rtl92ee_dm_write_cck_cca_thres(hw, cur_cck_cca_thresh);
294}
295
296static void rtl92ee_dm_dig(struct ieee80211_hw *hw)
297{
298 struct rtl_priv *rtlpriv = rtl_priv(hw);
299 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
300 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
301 u8 dig_dynamic_min , dig_maxofmin;
302 bool bfirstconnect , bfirstdisconnect;
303 u8 dm_dig_max, dm_dig_min;
304 u8 current_igi = dm_dig->cur_igvalue;
305 u8 offset;
306
307 /* AP,BT */
308 if (mac->act_scanning)
309 return;
310
311 dig_dynamic_min = dm_dig->dig_dynamic_min;
312 bfirstconnect = (mac->link_state >= MAC80211_LINKED) &&
313 !dm_dig->media_connect_0;
314 bfirstdisconnect = (mac->link_state < MAC80211_LINKED) &&
315 dm_dig->media_connect_0;
316
317 dm_dig_max = 0x5a;
318 dm_dig_min = DM_DIG_MIN;
319 dig_maxofmin = DM_DIG_MAX_AP;
320
321 if (mac->link_state >= MAC80211_LINKED) {
322 if ((dm_dig->rssi_val_min + 10) > dm_dig_max)
323 dm_dig->rx_gain_max = dm_dig_max;
324 else if ((dm_dig->rssi_val_min + 10) < dm_dig_min)
325 dm_dig->rx_gain_max = dm_dig_min;
326 else
327 dm_dig->rx_gain_max = dm_dig->rssi_val_min + 10;
328
329 if (rtlpriv->dm.one_entry_only) {
330 offset = 0;
331 if (dm_dig->rssi_val_min - offset < dm_dig_min)
332 dig_dynamic_min = dm_dig_min;
333 else if (dm_dig->rssi_val_min - offset >
334 dig_maxofmin)
335 dig_dynamic_min = dig_maxofmin;
336 else
337 dig_dynamic_min = dm_dig->rssi_val_min - offset;
338 } else {
339 dig_dynamic_min = dm_dig_min;
340 }
341
342 } else {
343 dm_dig->rx_gain_max = dm_dig_max;
344 dig_dynamic_min = dm_dig_min;
345 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "no link\n");
346 }
347
348 if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
349 if (dm_dig->large_fa_hit != 3)
350 dm_dig->large_fa_hit++;
351 if (dm_dig->forbidden_igi < current_igi) {
352 dm_dig->forbidden_igi = current_igi;
353 dm_dig->large_fa_hit = 1;
354 }
355
356 if (dm_dig->large_fa_hit >= 3) {
357 if (dm_dig->forbidden_igi + 1 > dm_dig->rx_gain_max)
358 dm_dig->rx_gain_min =
359 dm_dig->rx_gain_max;
360 else
361 dm_dig->rx_gain_min =
362 dm_dig->forbidden_igi + 1;
363 dm_dig->recover_cnt = 3600;
364 }
365 } else {
366 if (dm_dig->recover_cnt != 0) {
367 dm_dig->recover_cnt--;
368 } else {
369 if (dm_dig->large_fa_hit < 3) {
370 if ((dm_dig->forbidden_igi - 1) <
371 dig_dynamic_min) {
372 dm_dig->forbidden_igi = dig_dynamic_min;
373 dm_dig->rx_gain_min =
374 dig_dynamic_min;
375 } else {
376 dm_dig->forbidden_igi--;
377 dm_dig->rx_gain_min =
378 dm_dig->forbidden_igi + 1;
379 }
380 } else {
381 dm_dig->large_fa_hit = 0;
382 }
383 }
384 }
385
386 if (rtlpriv->dm.dbginfo.num_qry_beacon_pkt < 5)
387 dm_dig->rx_gain_min = dm_dig_min;
388
389 if (dm_dig->rx_gain_min > dm_dig->rx_gain_max)
390 dm_dig->rx_gain_min = dm_dig->rx_gain_max;
391
392 if (mac->link_state >= MAC80211_LINKED) {
393 if (bfirstconnect) {
394 if (dm_dig->rssi_val_min <= dig_maxofmin)
395 current_igi = dm_dig->rssi_val_min;
396 else
397 current_igi = dig_maxofmin;
398
399 dm_dig->large_fa_hit = 0;
400 } else {
401 if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH2)
402 current_igi += 4;
403 else if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH1)
404 current_igi += 2;
405 else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
406 current_igi -= 2;
407
408 if (rtlpriv->dm.dbginfo.num_qry_beacon_pkt < 5 &&
409 rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH1)
410 current_igi = dm_dig->rx_gain_min;
411 }
412 } else {
413 if (bfirstdisconnect) {
414 current_igi = dm_dig->rx_gain_min;
415 } else {
416 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
417 current_igi += 4;
418 else if (rtlpriv->falsealm_cnt.cnt_all > 8000)
419 current_igi += 2;
420 else if (rtlpriv->falsealm_cnt.cnt_all < 500)
421 current_igi -= 2;
422 }
423 }
424
425 if (current_igi > dm_dig->rx_gain_max)
426 current_igi = dm_dig->rx_gain_max;
427 if (current_igi < dm_dig->rx_gain_min)
428 current_igi = dm_dig->rx_gain_min;
429
430 rtl92ee_dm_write_dig(hw , current_igi);
431 dm_dig->media_connect_0 = ((mac->link_state >= MAC80211_LINKED) ?
432 true : false);
433 dm_dig->dig_dynamic_min = dig_dynamic_min;
434}
435
436void rtl92ee_dm_write_cck_cca_thres(struct ieee80211_hw *hw, u8 cur_thres)
437{
438 struct rtl_priv *rtlpriv = rtl_priv(hw);
439 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
440
441 if (dm_dig->cur_cck_cca_thres != cur_thres)
442 rtl_write_byte(rtlpriv, DM_REG_CCK_CCA_11N, cur_thres);
443
444 dm_dig->pre_cck_cca_thres = dm_dig->cur_cck_cca_thres;
445 dm_dig->cur_cck_cca_thres = cur_thres;
446}
447
448void rtl92ee_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi)
449{
450 struct rtl_priv *rtlpriv = rtl_priv(hw);
451 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
452
453 if (dm_dig->stop_dig)
454 return;
455
456 if (dm_dig->cur_igvalue != current_igi) {
457 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, current_igi);
458 if (rtlpriv->phy.rf_type != RF_1T1R)
459 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, 0x7f, current_igi);
460 }
461 dm_dig->pre_igvalue = dm_dig->cur_igvalue;
462 dm_dig->cur_igvalue = current_igi;
463}
464
465static void rtl92ee_rssi_dump_to_register(struct ieee80211_hw *hw)
466{
467 struct rtl_priv *rtlpriv = rtl_priv(hw);
468
469 rtl_write_byte(rtlpriv, RA_RSSIDUMP,
470 rtlpriv->stats.rx_rssi_percentage[0]);
471 rtl_write_byte(rtlpriv, RB_RSSIDUMP,
472 rtlpriv->stats.rx_rssi_percentage[1]);
473 /*It seems the following values are not initialized.
474 *According to Windows code,
475 *these value will only be valid with JAGUAR chips
476 */
477 /* Rx EVM */
478 rtl_write_byte(rtlpriv, RS1_RXEVMDUMP, rtlpriv->stats.rx_evm_dbm[0]);
479 rtl_write_byte(rtlpriv, RS2_RXEVMDUMP, rtlpriv->stats.rx_evm_dbm[1]);
480 /* Rx SNR */
481 rtl_write_byte(rtlpriv, RA_RXSNRDUMP,
482 (u8)(rtlpriv->stats.rx_snr_db[0]));
483 rtl_write_byte(rtlpriv, RB_RXSNRDUMP,
484 (u8)(rtlpriv->stats.rx_snr_db[1]));
485 /* Rx Cfo_Short */
486 rtl_write_word(rtlpriv, RA_CFOSHORTDUMP,
487 rtlpriv->stats.rx_cfo_short[0]);
488 rtl_write_word(rtlpriv, RB_CFOSHORTDUMP,
489 rtlpriv->stats.rx_cfo_short[1]);
490 /* Rx Cfo_Tail */
491 rtl_write_word(rtlpriv, RA_CFOLONGDUMP, rtlpriv->stats.rx_cfo_tail[0]);
492 rtl_write_word(rtlpriv, RB_CFOLONGDUMP, rtlpriv->stats.rx_cfo_tail[1]);
493}
494
495static void rtl92ee_dm_find_minimum_rssi(struct ieee80211_hw *hw)
496{
497 struct rtl_priv *rtlpriv = rtl_priv(hw);
498 struct dig_t *rtl_dm_dig = &rtlpriv->dm_digtable;
499 struct rtl_mac *mac = rtl_mac(rtlpriv);
500
501 /* Determine the minimum RSSI */
502 if ((mac->link_state < MAC80211_LINKED) &&
503 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
504 rtl_dm_dig->min_undec_pwdb_for_dm = 0;
505 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
506 "Not connected to any\n");
507 }
508 if (mac->link_state >= MAC80211_LINKED) {
509 if (mac->opmode == NL80211_IFTYPE_AP ||
510 mac->opmode == NL80211_IFTYPE_ADHOC) {
511 rtl_dm_dig->min_undec_pwdb_for_dm =
512 rtlpriv->dm.entry_min_undec_sm_pwdb;
513 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
514 "AP Client PWDB = 0x%lx\n",
515 rtlpriv->dm.entry_min_undec_sm_pwdb);
516 } else {
517 rtl_dm_dig->min_undec_pwdb_for_dm =
518 rtlpriv->dm.undec_sm_pwdb;
519 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
520 "STA Default Port PWDB = 0x%x\n",
521 rtl_dm_dig->min_undec_pwdb_for_dm);
522 }
523 } else {
524 rtl_dm_dig->min_undec_pwdb_for_dm =
525 rtlpriv->dm.entry_min_undec_sm_pwdb;
526 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
527 "AP Ext Port or disconnet PWDB = 0x%x\n",
528 rtl_dm_dig->min_undec_pwdb_for_dm);
529 }
530 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
531 "MinUndecoratedPWDBForDM =%d\n",
532 rtl_dm_dig->min_undec_pwdb_for_dm);
533}
534
535static void rtl92ee_dm_check_rssi_monitor(struct ieee80211_hw *hw)
536{
537 struct rtl_priv *rtlpriv = rtl_priv(hw);
538 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
539 struct rtl_mac *mac = rtl_mac(rtlpriv);
540 struct rtl_dm *dm = rtl_dm(rtlpriv);
541 struct rtl_sta_info *drv_priv;
542 u8 h2c[4] = { 0 };
543 long max = 0, min = 0xff;
544 u8 i = 0;
545
546 if (mac->opmode == NL80211_IFTYPE_AP ||
547 mac->opmode == NL80211_IFTYPE_ADHOC ||
548 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
549 /* AP & ADHOC & MESH */
550 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
551 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
552 struct rssi_sta *stat = &drv_priv->rssi_stat;
553
554 if (stat->undec_sm_pwdb < min)
555 min = stat->undec_sm_pwdb;
556 if (stat->undec_sm_pwdb > max)
557 max = stat->undec_sm_pwdb;
558
559 h2c[3] = 0;
560 h2c[2] = (u8)(dm->undec_sm_pwdb & 0xFF);
561 h2c[1] = 0x20;
562 h2c[0] = ++i;
563 rtl92ee_fill_h2c_cmd(hw, H2C_92E_RSSI_REPORT, 4, h2c);
564 }
565 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
566
567 /* If associated entry is found */
568 if (max != 0) {
569 dm->entry_max_undec_sm_pwdb = max;
570 RTPRINT(rtlpriv, FDM, DM_PWDB,
571 "EntryMaxPWDB = 0x%lx(%ld)\n", max, max);
572 } else {
573 dm->entry_max_undec_sm_pwdb = 0;
574 }
575 /* If associated entry is found */
576 if (min != 0xff) {
577 dm->entry_min_undec_sm_pwdb = min;
578 RTPRINT(rtlpriv, FDM, DM_PWDB,
579 "EntryMinPWDB = 0x%lx(%ld)\n", min, min);
580 } else {
581 dm->entry_min_undec_sm_pwdb = 0;
582 }
583 }
584
585 /* Indicate Rx signal strength to FW. */
586 if (dm->useramask) {
587 h2c[3] = 0;
588 h2c[2] = (u8)(dm->undec_sm_pwdb & 0xFF);
589 h2c[1] = 0x20;
590 h2c[0] = 0;
591 rtl92ee_fill_h2c_cmd(hw, H2C_92E_RSSI_REPORT, 4, h2c);
592 } else {
593 rtl_write_byte(rtlpriv, 0x4fe, dm->undec_sm_pwdb);
594 }
595 rtl92ee_rssi_dump_to_register(hw);
596 rtl92ee_dm_find_minimum_rssi(hw);
597 dm_dig->rssi_val_min = rtlpriv->dm_digtable.min_undec_pwdb_for_dm;
598}
599
600static void rtl92ee_dm_init_primary_cca_check(struct ieee80211_hw *hw)
601{
602 struct rtl_priv *rtlpriv = rtl_priv(hw);
603 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
604 struct dynamic_primary_cca *primarycca = &rtlpriv->primarycca;
605
606 rtlhal->rts_en = 0;
607 primarycca->dup_rts_flag = 0;
608 primarycca->intf_flag = 0;
609 primarycca->intf_type = 0;
610 primarycca->monitor_flag = 0;
611 primarycca->ch_offset = 0;
612 primarycca->mf_state = 0;
613}
614
615static bool rtl92ee_dm_is_edca_turbo_disable(struct ieee80211_hw *hw)
616{
617 struct rtl_priv *rtlpriv = rtl_priv(hw);
618
619 if (rtlpriv->mac80211.mode == WIRELESS_MODE_B)
620 return true;
621
622 return false;
623}
624
625void rtl92ee_dm_init_edca_turbo(struct ieee80211_hw *hw)
626{
627 struct rtl_priv *rtlpriv = rtl_priv(hw);
628
629 rtlpriv->dm.current_turbo_edca = false;
630 rtlpriv->dm.is_cur_rdlstate = false;
631 rtlpriv->dm.is_any_nonbepkts = false;
632}
633
634static void rtl92ee_dm_check_edca_turbo(struct ieee80211_hw *hw)
635{
636 struct rtl_priv *rtlpriv = rtl_priv(hw);
637
638 static u64 last_txok_cnt;
639 static u64 last_rxok_cnt;
640 u64 cur_txok_cnt = 0;
641 u64 cur_rxok_cnt = 0;
642 u32 edca_be_ul = 0x5ea42b;
643 u32 edca_be_dl = 0x5ea42b; /*not sure*/
644 u32 edca_be = 0x5ea42b;
645 bool is_cur_rdlstate;
646 bool b_edca_turbo_on = false;
647
648 if (rtlpriv->dm.dbginfo.num_non_be_pkt > 0x100)
649 rtlpriv->dm.is_any_nonbepkts = true;
650 rtlpriv->dm.dbginfo.num_non_be_pkt = 0;
651
652 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
653 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
654
655 /*b_bias_on_rx = false;*/
656 b_edca_turbo_on = ((!rtlpriv->dm.is_any_nonbepkts) &&
657 (!rtlpriv->dm.disable_framebursting)) ?
658 true : false;
659
660 if (rtl92ee_dm_is_edca_turbo_disable(hw))
661 goto check_exit;
662
663 if (b_edca_turbo_on) {
664 is_cur_rdlstate = (cur_rxok_cnt > cur_txok_cnt * 4) ?
665 true : false;
666
667 edca_be = is_cur_rdlstate ? edca_be_dl : edca_be_ul;
668 rtl_write_dword(rtlpriv , REG_EDCA_BE_PARAM , edca_be);
669 rtlpriv->dm.is_cur_rdlstate = is_cur_rdlstate;
670 rtlpriv->dm.current_turbo_edca = true;
671 } else {
672 if (rtlpriv->dm.current_turbo_edca) {
673 u8 tmp = AC0_BE;
674
675 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
676 (u8 *)(&tmp));
677 }
678 rtlpriv->dm.current_turbo_edca = false;
679 }
680
681check_exit:
682 rtlpriv->dm.is_any_nonbepkts = false;
683 last_txok_cnt = rtlpriv->stats.txbytesunicast;
684 last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
685}
686
687static void rtl92ee_dm_dynamic_edcca(struct ieee80211_hw *hw)
688{
689 struct rtl_priv *rtlpriv = rtl_priv(hw);
690 u8 reg_c50 , reg_c58;
691 bool fw_current_in_ps_mode = false;
692
693 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
694 (u8 *)(&fw_current_in_ps_mode));
695 if (fw_current_in_ps_mode)
696 return;
697
698 reg_c50 = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
699 reg_c58 = rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
700
701 if (reg_c50 > 0x28 && reg_c58 > 0x28) {
702 if (!rtlpriv->rtlhal.pre_edcca_enable) {
703 rtl_write_byte(rtlpriv, ROFDM0_ECCATHRESHOLD, 0x03);
704 rtl_write_byte(rtlpriv, ROFDM0_ECCATHRESHOLD + 2, 0x00);
705 rtlpriv->rtlhal.pre_edcca_enable = true;
706 }
707 } else if (reg_c50 < 0x25 && reg_c58 < 0x25) {
708 if (rtlpriv->rtlhal.pre_edcca_enable) {
709 rtl_write_byte(rtlpriv, ROFDM0_ECCATHRESHOLD, 0x7f);
710 rtl_write_byte(rtlpriv, ROFDM0_ECCATHRESHOLD + 2, 0x7f);
711 rtlpriv->rtlhal.pre_edcca_enable = false;
712 }
713 }
714}
715
716static void rtl92ee_dm_adaptivity(struct ieee80211_hw *hw)
717{
718 rtl92ee_dm_dynamic_edcca(hw);
719}
720
721static void rtl92ee_dm_write_dynamic_cca(struct ieee80211_hw *hw,
722 u8 cur_mf_state)
723{
724 struct dynamic_primary_cca *primarycca = &rtl_priv(hw)->primarycca;
725
726 if (primarycca->mf_state != cur_mf_state)
727 rtl_set_bbreg(hw, DM_REG_L1SBD_PD_CH_11N, BIT(8) | BIT(7),
728 cur_mf_state);
729
730 primarycca->mf_state = cur_mf_state;
731}
732
733static void rtl92ee_dm_dynamic_primary_cca_ckeck(struct ieee80211_hw *hw)
734{
735 struct rtl_priv *rtlpriv = rtl_priv(hw);
736 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
737 struct dynamic_primary_cca *primarycca = &rtlpriv->primarycca;
738 bool is40mhz = false;
739 u64 ofdm_cca, ofdm_fa, bw_usc_cnt, bw_lsc_cnt;
740 u8 sec_ch_offset;
741 u8 cur_mf_state;
742 static u8 count_down = MONITOR_TIME;
743
744 ofdm_cca = falsealm_cnt->cnt_ofdm_cca;
745 ofdm_fa = falsealm_cnt->cnt_ofdm_fail;
746 bw_usc_cnt = falsealm_cnt->cnt_bw_usc;
747 bw_lsc_cnt = falsealm_cnt->cnt_bw_lsc;
748 is40mhz = rtlpriv->mac80211.bw_40;
749 sec_ch_offset = rtlpriv->mac80211.cur_40_prime_sc;
750 /* NIC: 2: sec is below, 1: sec is above */
751
752 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP) {
753 cur_mf_state = MF_USC_LSC;
754 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
755 return;
756 }
757
758 if (rtlpriv->mac80211.link_state < MAC80211_LINKED)
759 return;
760
761 if (is40mhz)
762 return;
763
764 if (primarycca->pricca_flag == 0) {
765 /* Primary channel is above
766 * NOTE: duplicate CTS can remove this condition
767 */
768 if (sec_ch_offset == 2) {
769 if ((ofdm_cca > OFDMCCA_TH) &&
770 (bw_lsc_cnt > (bw_usc_cnt + BW_IND_BIAS)) &&
771 (ofdm_fa > (ofdm_cca >> 1))) {
772 primarycca->intf_type = 1;
773 primarycca->intf_flag = 1;
774 cur_mf_state = MF_USC;
775 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
776 primarycca->pricca_flag = 1;
777 } else if ((ofdm_cca > OFDMCCA_TH) &&
778 (bw_lsc_cnt > (bw_usc_cnt + BW_IND_BIAS)) &&
779 (ofdm_fa < (ofdm_cca >> 1))) {
780 primarycca->intf_type = 2;
781 primarycca->intf_flag = 1;
782 cur_mf_state = MF_USC;
783 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
784 primarycca->pricca_flag = 1;
785 primarycca->dup_rts_flag = 1;
786 rtlpriv->rtlhal.rts_en = 1;
787 } else {
788 primarycca->intf_type = 0;
789 primarycca->intf_flag = 0;
790 cur_mf_state = MF_USC_LSC;
791 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
792 rtlpriv->rtlhal.rts_en = 0;
793 primarycca->dup_rts_flag = 0;
794 }
795 } else if (sec_ch_offset == 1) {
796 if ((ofdm_cca > OFDMCCA_TH) &&
797 (bw_usc_cnt > (bw_lsc_cnt + BW_IND_BIAS)) &&
798 (ofdm_fa > (ofdm_cca >> 1))) {
799 primarycca->intf_type = 1;
800 primarycca->intf_flag = 1;
801 cur_mf_state = MF_LSC;
802 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
803 primarycca->pricca_flag = 1;
804 } else if ((ofdm_cca > OFDMCCA_TH) &&
805 (bw_usc_cnt > (bw_lsc_cnt + BW_IND_BIAS)) &&
806 (ofdm_fa < (ofdm_cca >> 1))) {
807 primarycca->intf_type = 2;
808 primarycca->intf_flag = 1;
809 cur_mf_state = MF_LSC;
810 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
811 primarycca->pricca_flag = 1;
812 primarycca->dup_rts_flag = 1;
813 rtlpriv->rtlhal.rts_en = 1;
814 } else {
815 primarycca->intf_type = 0;
816 primarycca->intf_flag = 0;
817 cur_mf_state = MF_USC_LSC;
818 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
819 rtlpriv->rtlhal.rts_en = 0;
820 primarycca->dup_rts_flag = 0;
821 }
822 }
823 } else {/* PrimaryCCA->PriCCA_flag==1 */
824 count_down--;
825 if (count_down == 0) {
826 count_down = MONITOR_TIME;
827 primarycca->pricca_flag = 0;
828 cur_mf_state = MF_USC_LSC;
829 /* default */
830 rtl92ee_dm_write_dynamic_cca(hw, cur_mf_state);
831 rtlpriv->rtlhal.rts_en = 0;
832 primarycca->dup_rts_flag = 0;
833 primarycca->intf_type = 0;
834 primarycca->intf_flag = 0;
835 }
836 }
837}
838
839static void rtl92ee_dm_dynamic_atc_switch(struct ieee80211_hw *hw)
840{
841 struct rtl_priv *rtlpriv = rtl_priv(hw);
842 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
843 u8 crystal_cap;
844 u32 packet_count;
845 int cfo_khz_a , cfo_khz_b , cfo_ave = 0, adjust_xtal = 0;
846 int cfo_ave_diff;
847
848 if (rtlpriv->mac80211.link_state < MAC80211_LINKED) {
849 if (rtldm->atc_status == ATC_STATUS_OFF) {
850 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(11),
851 ATC_STATUS_ON);
852 rtldm->atc_status = ATC_STATUS_ON;
853 }
854 /* Disable CFO tracking for BT */
855 if (rtlpriv->cfg->ops->get_btc_status()) {
856 if (!rtlpriv->btcoexist.btc_ops->
857 btc_is_bt_disabled(rtlpriv)) {
858 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
859 "odm_DynamicATCSwitch(): Disable CFO tracking for BT!!\n");
860 return;
861 }
862 }
863 /* Reset Crystal Cap */
864 if (rtldm->crystal_cap != rtlpriv->efuse.crystalcap) {
865 rtldm->crystal_cap = rtlpriv->efuse.crystalcap;
866 crystal_cap = rtldm->crystal_cap & 0x3f;
867 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
868 (crystal_cap | (crystal_cap << 6)));
869 }
870 } else {
871 cfo_khz_a = (int)(rtldm->cfo_tail[0] * 3125) / 1280;
872 cfo_khz_b = (int)(rtldm->cfo_tail[1] * 3125) / 1280;
873 packet_count = rtldm->packet_count;
874
875 if (packet_count == rtldm->packet_count_pre)
876 return;
877
878 rtldm->packet_count_pre = packet_count;
879
880 if (rtlpriv->phy.rf_type == RF_1T1R)
881 cfo_ave = cfo_khz_a;
882 else
883 cfo_ave = (int)(cfo_khz_a + cfo_khz_b) >> 1;
884
885 cfo_ave_diff = (rtldm->cfo_ave_pre >= cfo_ave) ?
886 (rtldm->cfo_ave_pre - cfo_ave) :
887 (cfo_ave - rtldm->cfo_ave_pre);
888
889 if (cfo_ave_diff > 20 && rtldm->large_cfo_hit == 0) {
890 rtldm->large_cfo_hit = 1;
891 return;
892 }
893 rtldm->large_cfo_hit = 0;
894
895 rtldm->cfo_ave_pre = cfo_ave;
896
897 if (cfo_ave >= -rtldm->cfo_threshold &&
898 cfo_ave <= rtldm->cfo_threshold && rtldm->is_freeze == 0) {
899 if (rtldm->cfo_threshold == CFO_THRESHOLD_XTAL) {
900 rtldm->cfo_threshold = CFO_THRESHOLD_XTAL + 10;
901 rtldm->is_freeze = 1;
902 } else {
903 rtldm->cfo_threshold = CFO_THRESHOLD_XTAL;
904 }
905 }
906
907 if (cfo_ave > rtldm->cfo_threshold && rtldm->crystal_cap < 0x3f)
908 adjust_xtal = ((cfo_ave - CFO_THRESHOLD_XTAL) >> 2) + 1;
909 else if ((cfo_ave < -rtlpriv->dm.cfo_threshold) &&
910 rtlpriv->dm.crystal_cap > 0)
911 adjust_xtal = ((cfo_ave + CFO_THRESHOLD_XTAL) >> 2) - 1;
912
913 if (adjust_xtal != 0) {
914 rtldm->is_freeze = 0;
915 rtldm->crystal_cap += adjust_xtal;
916
917 if (rtldm->crystal_cap > 0x3f)
918 rtldm->crystal_cap = 0x3f;
919 else if (rtldm->crystal_cap < 0)
920 rtldm->crystal_cap = 0;
921
922 crystal_cap = rtldm->crystal_cap & 0x3f;
923 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
924 (crystal_cap | (crystal_cap << 6)));
925 }
926
927 if (cfo_ave < CFO_THRESHOLD_ATC &&
928 cfo_ave > -CFO_THRESHOLD_ATC) {
929 if (rtldm->atc_status == ATC_STATUS_ON) {
930 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(11),
931 ATC_STATUS_OFF);
932 rtldm->atc_status = ATC_STATUS_OFF;
933 }
934 } else {
935 if (rtldm->atc_status == ATC_STATUS_OFF) {
936 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(11),
937 ATC_STATUS_ON);
938 rtldm->atc_status = ATC_STATUS_ON;
939 }
940 }
941 }
942}
943
944static void rtl92ee_dm_init_txpower_tracking(struct ieee80211_hw *hw)
945{
946 struct rtl_priv *rtlpriv = rtl_priv(hw);
947 struct rtl_dm *dm = rtl_dm(rtlpriv);
948 u8 path;
949
950 dm->txpower_tracking = true;
951 dm->default_ofdm_index = 30;
952 dm->default_cck_index = 20;
953
954 dm->swing_idx_cck_base = dm->default_cck_index;
955 dm->cck_index = dm->default_cck_index;
956
957 for (path = RF90_PATH_A; path < MAX_RF_PATH; path++) {
958 dm->swing_idx_ofdm_base[path] = dm->default_ofdm_index;
959 dm->ofdm_index[path] = dm->default_ofdm_index;
960 dm->delta_power_index[path] = 0;
961 dm->delta_power_index_last[path] = 0;
962 dm->power_index_offset[path] = 0;
963 }
964}
965
966void rtl92ee_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
967{
968 struct rtl_priv *rtlpriv = rtl_priv(hw);
969 struct rate_adaptive *p_ra = &rtlpriv->ra;
970
971 p_ra->ratr_state = DM_RATR_STA_INIT;
972 p_ra->pre_ratr_state = DM_RATR_STA_INIT;
973
974 if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
975 rtlpriv->dm.useramask = true;
976 else
977 rtlpriv->dm.useramask = false;
978
979 p_ra->ldpc_thres = 35;
980 p_ra->use_ldpc = false;
981 p_ra->high_rssi_thresh_for_ra = 50;
982 p_ra->low_rssi_thresh_for_ra40m = 20;
983}
984
985static bool _rtl92ee_dm_ra_state_check(struct ieee80211_hw *hw,
986 s32 rssi, u8 *ratr_state)
987{
988 struct rtl_priv *rtlpriv = rtl_priv(hw);
989 struct rate_adaptive *p_ra = &rtlpriv->ra;
990 const u8 go_up_gap = 5;
991 u32 high_rssithresh_for_ra = p_ra->high_rssi_thresh_for_ra;
992 u32 low_rssithresh_for_ra = p_ra->low_rssi_thresh_for_ra40m;
993 u8 state;
994
995 /* Threshold Adjustment:
996 * when RSSI state trends to go up one or two levels,
997 * make sure RSSI is high enough.
998 * Here GoUpGap is added to solve
999 * the boundary's level alternation issue.
1000 */
1001 switch (*ratr_state) {
1002 case DM_RATR_STA_INIT:
1003 case DM_RATR_STA_HIGH:
1004 break;
1005 case DM_RATR_STA_MIDDLE:
1006 high_rssithresh_for_ra += go_up_gap;
1007 break;
1008 case DM_RATR_STA_LOW:
1009 high_rssithresh_for_ra += go_up_gap;
1010 low_rssithresh_for_ra += go_up_gap;
1011 break;
1012 default:
1013 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
1014 "wrong rssi level setting %d !", *ratr_state);
1015 break;
1016 }
1017
1018 /* Decide RATRState by RSSI. */
1019 if (rssi > high_rssithresh_for_ra)
1020 state = DM_RATR_STA_HIGH;
1021 else if (rssi > low_rssithresh_for_ra)
1022 state = DM_RATR_STA_MIDDLE;
1023 else
1024 state = DM_RATR_STA_LOW;
1025
1026 if (*ratr_state != state) {
1027 *ratr_state = state;
1028 return true;
1029 }
1030
1031 return false;
1032}
1033
1034static void rtl92ee_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
1035{
1036 struct rtl_priv *rtlpriv = rtl_priv(hw);
1037 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1038 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1039 struct rate_adaptive *p_ra = &rtlpriv->ra;
1040 struct ieee80211_sta *sta = NULL;
1041
1042 if (is_hal_stop(rtlhal)) {
1043 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1044 "driver is going to unload\n");
1045 return;
1046 }
1047
1048 if (!rtlpriv->dm.useramask) {
1049 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1050 "driver does not control rate adaptive mask\n");
1051 return;
1052 }
1053
1054 if (mac->link_state == MAC80211_LINKED &&
1055 mac->opmode == NL80211_IFTYPE_STATION) {
1056 if (rtlpriv->dm.undec_sm_pwdb < p_ra->ldpc_thres) {
1057 p_ra->use_ldpc = true;
1058 p_ra->lower_rts_rate = true;
1059 } else if (rtlpriv->dm.undec_sm_pwdb >
1060 (p_ra->ldpc_thres - 5)) {
1061 p_ra->use_ldpc = false;
1062 p_ra->lower_rts_rate = false;
1063 }
1064 if (_rtl92ee_dm_ra_state_check(hw, rtlpriv->dm.undec_sm_pwdb,
1065 &p_ra->ratr_state)) {
1066 rcu_read_lock();
1067 sta = rtl_find_sta(hw, mac->bssid);
1068 if (sta)
1069 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
1070 p_ra->ratr_state);
1071 rcu_read_unlock();
1072
1073 p_ra->pre_ratr_state = p_ra->ratr_state;
1074 }
1075 }
1076}
1077
1078static void rtl92ee_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw)
1079{
1080 struct rtl_priv *rtlpriv = rtl_priv(hw);
1081
1082 rtlpriv->dm.crystal_cap = rtlpriv->efuse.crystalcap;
1083
1084 rtlpriv->dm.atc_status = rtl_get_bbreg(hw, ROFDM1_CFOTRACKING, BIT(11));
1085 rtlpriv->dm.cfo_threshold = CFO_THRESHOLD_XTAL;
1086}
1087
1088void rtl92ee_dm_init(struct ieee80211_hw *hw)
1089{
1090 struct rtl_priv *rtlpriv = rtl_priv(hw);
1091
1092 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
1093
1094 rtl92ee_dm_diginit(hw);
1095 rtl92ee_dm_init_rate_adaptive_mask(hw);
1096 rtl92ee_dm_init_primary_cca_check(hw);
1097 rtl92ee_dm_init_edca_turbo(hw);
1098 rtl92ee_dm_init_txpower_tracking(hw);
1099 rtl92ee_dm_init_dynamic_atc_switch(hw);
1100}
1101
1102static void rtl92ee_dm_common_info_self_update(struct ieee80211_hw *hw)
1103{
1104 struct rtl_priv *rtlpriv = rtl_priv(hw);
1105 struct rtl_sta_info *drv_priv;
1106 u8 cnt = 0;
1107
1108 rtlpriv->dm.one_entry_only = false;
1109
1110 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_STATION &&
1111 rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
1112 rtlpriv->dm.one_entry_only = true;
1113 return;
1114 }
1115
1116 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
1117 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC ||
1118 rtlpriv->mac80211.opmode == NL80211_IFTYPE_MESH_POINT) {
1119 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1120 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
1121 cnt++;
1122 }
1123 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1124
1125 if (cnt == 1)
1126 rtlpriv->dm.one_entry_only = true;
1127 }
1128}
1129
1130void rtl92ee_dm_dynamic_arfb_select(struct ieee80211_hw *hw,
1131 u8 rate, bool collision_state)
1132{
1133 struct rtl_priv *rtlpriv = rtl_priv(hw);
1134
1135 if (rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS12) {
1136 if (collision_state == 1) {
1137 if (rate == DESC92C_RATEMCS12) {
1138 rtl_write_dword(rtlpriv, REG_DARFRC, 0x0);
1139 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1140 0x07060501);
1141 } else if (rate == DESC92C_RATEMCS11) {
1142 rtl_write_dword(rtlpriv, REG_DARFRC, 0x0);
1143 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1144 0x07070605);
1145 } else if (rate == DESC92C_RATEMCS10) {
1146 rtl_write_dword(rtlpriv, REG_DARFRC, 0x0);
1147 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1148 0x08080706);
1149 } else if (rate == DESC92C_RATEMCS9) {
1150 rtl_write_dword(rtlpriv, REG_DARFRC, 0x0);
1151 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1152 0x08080707);
1153 } else {
1154 rtl_write_dword(rtlpriv, REG_DARFRC, 0x0);
1155 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1156 0x09090808);
1157 }
1158 } else { /* collision_state == 0 */
1159 if (rate == DESC92C_RATEMCS12) {
1160 rtl_write_dword(rtlpriv, REG_DARFRC,
1161 0x05010000);
1162 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1163 0x09080706);
1164 } else if (rate == DESC92C_RATEMCS11) {
1165 rtl_write_dword(rtlpriv, REG_DARFRC,
1166 0x06050000);
1167 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1168 0x09080807);
1169 } else if (rate == DESC92C_RATEMCS10) {
1170 rtl_write_dword(rtlpriv, REG_DARFRC,
1171 0x07060000);
1172 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1173 0x0a090908);
1174 } else if (rate == DESC92C_RATEMCS9) {
1175 rtl_write_dword(rtlpriv, REG_DARFRC,
1176 0x07070000);
1177 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1178 0x0a090808);
1179 } else {
1180 rtl_write_dword(rtlpriv, REG_DARFRC,
1181 0x08080000);
1182 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1183 0x0b0a0909);
1184 }
1185 }
1186 } else { /* MCS13~MCS15, 1SS, G-mode */
1187 if (collision_state == 1) {
1188 if (rate == DESC92C_RATEMCS15) {
1189 rtl_write_dword(rtlpriv, REG_DARFRC,
1190 0x00000000);
1191 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1192 0x05040302);
1193 } else if (rate == DESC92C_RATEMCS14) {
1194 rtl_write_dword(rtlpriv, REG_DARFRC,
1195 0x00000000);
1196 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1197 0x06050302);
1198 } else if (rate == DESC92C_RATEMCS13) {
1199 rtl_write_dword(rtlpriv, REG_DARFRC,
1200 0x00000000);
1201 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1202 0x07060502);
1203 } else {
1204 rtl_write_dword(rtlpriv, REG_DARFRC,
1205 0x00000000);
1206 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1207 0x06050402);
1208 }
1209 } else{ /* collision_state == 0 */
1210 if (rate == DESC92C_RATEMCS15) {
1211 rtl_write_dword(rtlpriv, REG_DARFRC,
1212 0x03020000);
1213 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1214 0x07060504);
1215 } else if (rate == DESC92C_RATEMCS14) {
1216 rtl_write_dword(rtlpriv, REG_DARFRC,
1217 0x03020000);
1218 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1219 0x08070605);
1220 } else if (rate == DESC92C_RATEMCS13) {
1221 rtl_write_dword(rtlpriv, REG_DARFRC,
1222 0x05020000);
1223 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1224 0x09080706);
1225 } else {
1226 rtl_write_dword(rtlpriv, REG_DARFRC,
1227 0x04020000);
1228 rtl_write_dword(rtlpriv, REG_DARFRC + 4,
1229 0x08070605);
1230 }
1231 }
1232 }
1233}
1234
1235void rtl92ee_dm_watchdog(struct ieee80211_hw *hw)
1236{
1237 struct rtl_priv *rtlpriv = rtl_priv(hw);
1238 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1239 bool fw_current_inpsmode = false;
1240 bool fw_ps_awake = true;
1241
1242 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
1243 (u8 *)(&fw_current_inpsmode));
1244 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
1245 (u8 *)(&fw_ps_awake));
1246 if (ppsc->p2p_ps_info.p2p_ps_mode)
1247 fw_ps_awake = false;
1248
1249 if ((ppsc->rfpwr_state == ERFON) &&
1250 ((!fw_current_inpsmode) && fw_ps_awake) &&
1251 (!ppsc->rfchange_inprogress)) {
1252 rtl92ee_dm_common_info_self_update(hw);
1253 rtl92ee_dm_false_alarm_counter_statistics(hw);
1254 rtl92ee_dm_check_rssi_monitor(hw);
1255 rtl92ee_dm_dig(hw);
1256 rtl92ee_dm_adaptivity(hw);
1257 rtl92ee_dm_cck_packet_detection_thresh(hw);
1258 rtl92ee_dm_refresh_rate_adaptive_mask(hw);
1259 rtl92ee_dm_check_edca_turbo(hw);
1260 rtl92ee_dm_dynamic_atc_switch(hw);
1261 rtl92ee_dm_dynamic_primary_cca_ckeck(hw);
1262 }
1263}
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
new file mode 100644
index 000000000000..881db7d6fef7
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/dm.h
@@ -0,0 +1,267 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_DM_H__
27#define __RTL92E_DM_H__
28
29#define OFDMCCA_TH 500
30#define BW_IND_BIAS 500
31#define MF_USC 2
32#define MF_LSC 1
33#define MF_USC_LSC 0
34#define MONITOR_TIME 30
35
36#define MAIN_ANT 0
37#define AUX_ANT 1
38#define MAIN_ANT_CG_TRX 1
39#define AUX_ANT_CG_TRX 0
40#define MAIN_ANT_CGCS_RX 0
41#define AUX_ANT_CGCS_RX 1
42
43/*RF REG LIST*/
44#define DM_REG_RF_MODE_11N 0x00
45#define DM_REG_RF_0B_11N 0x0B
46#define DM_REG_CHNBW_11N 0x18
47#define DM_REG_T_METER_11N 0x24
48#define DM_REG_RF_25_11N 0x25
49#define DM_REG_RF_26_11N 0x26
50#define DM_REG_RF_27_11N 0x27
51#define DM_REG_RF_2B_11N 0x2B
52#define DM_REG_RF_2C_11N 0x2C
53#define DM_REG_RXRF_A3_11N 0x3C
54#define DM_REG_T_METER_92D_11N 0x42
55#define DM_REG_T_METER_92E_11N 0x42
56
57/*BB REG LIST*/
58/*PAGE 8 */
59#define DM_REG_BB_CTRL_11N 0x800
60#define DM_REG_RF_PIN_11N 0x804
61#define DM_REG_PSD_CTRL_11N 0x808
62#define DM_REG_TX_ANT_CTRL_11N 0x80C
63#define DM_REG_BB_PWR_SAV5_11N 0x818
64#define DM_REG_CCK_RPT_FORMAT_11N 0x824
65#define DM_REG_RX_DEFUALT_A_11N 0x858
66#define DM_REG_RX_DEFUALT_B_11N 0x85A
67#define DM_REG_BB_PWR_SAV3_11N 0x85C
68#define DM_REG_ANTSEL_CTRL_11N 0x860
69#define DM_REG_RX_ANT_CTRL_11N 0x864
70#define DM_REG_PIN_CTRL_11N 0x870
71#define DM_REG_BB_PWR_SAV1_11N 0x874
72#define DM_REG_ANTSEL_PATH_11N 0x878
73#define DM_REG_BB_3WIRE_11N 0x88C
74#define DM_REG_SC_CNT_11N 0x8C4
75#define DM_REG_PSD_DATA_11N 0x8B4
76/*PAGE 9*/
77#define DM_REG_ANT_MAPPING1_11N 0x914
78#define DM_REG_ANT_MAPPING2_11N 0x918
79/*PAGE A*/
80#define DM_REG_CCK_ANTDIV_PARA1_11N 0xA00
81#define DM_REG_CCK_CCA_11N 0xA0A
82#define DM_REG_CCK_ANTDIV_PARA2_11N 0xA0C
83#define DM_REG_CCK_ANTDIV_PARA3_11N 0xA10
84#define DM_REG_CCK_ANTDIV_PARA4_11N 0xA14
85#define DM_REG_CCK_FILTER_PARA1_11N 0xA22
86#define DM_REG_CCK_FILTER_PARA2_11N 0xA23
87#define DM_REG_CCK_FILTER_PARA3_11N 0xA24
88#define DM_REG_CCK_FILTER_PARA4_11N 0xA25
89#define DM_REG_CCK_FILTER_PARA5_11N 0xA26
90#define DM_REG_CCK_FILTER_PARA6_11N 0xA27
91#define DM_REG_CCK_FILTER_PARA7_11N 0xA28
92#define DM_REG_CCK_FILTER_PARA8_11N 0xA29
93#define DM_REG_CCK_FA_RST_11N 0xA2C
94#define DM_REG_CCK_FA_MSB_11N 0xA58
95#define DM_REG_CCK_FA_LSB_11N 0xA5C
96#define DM_REG_CCK_CCA_CNT_11N 0xA60
97#define DM_REG_BB_PWR_SAV4_11N 0xA74
98/*PAGE B */
99#define DM_REG_LNA_SWITCH_11N 0xB2C
100#define DM_REG_PATH_SWITCH_11N 0xB30
101#define DM_REG_RSSI_CTRL_11N 0xB38
102#define DM_REG_CONFIG_ANTA_11N 0xB68
103#define DM_REG_RSSI_BT_11N 0xB9C
104/*PAGE C */
105#define DM_REG_OFDM_FA_HOLDC_11N 0xC00
106#define DM_REG_RX_PATH_11N 0xC04
107#define DM_REG_TRMUX_11N 0xC08
108#define DM_REG_OFDM_FA_RSTC_11N 0xC0C
109#define DM_REG_RXIQI_MATRIX_11N 0xC14
110#define DM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C
111#define DM_REG_IGI_A_11N 0xC50
112#define DM_REG_ANTDIV_PARA2_11N 0xC54
113#define DM_REG_IGI_B_11N 0xC58
114#define DM_REG_ANTDIV_PARA3_11N 0xC5C
115#define DM_REG_L1SBD_PD_CH_11N 0XC6C
116#define DM_REG_BB_PWR_SAV2_11N 0xC70
117#define DM_REG_RX_OFF_11N 0xC7C
118#define DM_REG_TXIQK_MATRIXA_11N 0xC80
119#define DM_REG_TXIQK_MATRIXB_11N 0xC88
120#define DM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94
121#define DM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C
122#define DM_REG_RXIQK_MATRIX_LSB_11N 0xCA0
123#define DM_REG_ANTDIV_PARA1_11N 0xCA4
124#define DM_REG_OFDM_FA_TYPE1_11N 0xCF0
125/*PAGE D */
126#define DM_REG_OFDM_FA_RSTD_11N 0xD00
127#define DM_REG_OFDM_FA_TYPE2_11N 0xDA0
128#define DM_REG_OFDM_FA_TYPE3_11N 0xDA4
129#define DM_REG_OFDM_FA_TYPE4_11N 0xDA8
130/*PAGE E */
131#define DM_REG_TXAGC_A_6_18_11N 0xE00
132#define DM_REG_TXAGC_A_24_54_11N 0xE04
133#define DM_REG_TXAGC_A_1_MCS32_11N 0xE08
134#define DM_REG_TXAGC_A_MCS0_3_11N 0xE10
135#define DM_REG_TXAGC_A_MCS4_7_11N 0xE14
136#define DM_REG_TXAGC_A_MCS8_11_11N 0xE18
137#define DM_REG_TXAGC_A_MCS12_15_11N 0xE1C
138#define DM_REG_FPGA0_IQK_11N 0xE28
139#define DM_REG_TXIQK_TONE_A_11N 0xE30
140#define DM_REG_RXIQK_TONE_A_11N 0xE34
141#define DM_REG_TXIQK_PI_A_11N 0xE38
142#define DM_REG_RXIQK_PI_A_11N 0xE3C
143#define DM_REG_TXIQK_11N 0xE40
144#define DM_REG_RXIQK_11N 0xE44
145#define DM_REG_IQK_AGC_PTS_11N 0xE48
146#define DM_REG_IQK_AGC_RSP_11N 0xE4C
147#define DM_REG_BLUETOOTH_11N 0xE6C
148#define DM_REG_RX_WAIT_CCA_11N 0xE70
149#define DM_REG_TX_CCK_RFON_11N 0xE74
150#define DM_REG_TX_CCK_BBON_11N 0xE78
151#define DM_REG_OFDM_RFON_11N 0xE7C
152#define DM_REG_OFDM_BBON_11N 0xE80
153#define DM_REG_TX2RX_11N 0xE84
154#define DM_REG_TX2TX_11N 0xE88
155#define DM_REG_RX_CCK_11N 0xE8C
156#define DM_REG_RX_OFDM_11N 0xED0
157#define DM_REG_RX_WAIT_RIFS_11N 0xED4
158#define DM_REG_RX2RX_11N 0xED8
159#define DM_REG_STANDBY_11N 0xEDC
160#define DM_REG_SLEEP_11N 0xEE0
161#define DM_REG_PMPD_ANAEN_11N 0xEEC
162
163/*MAC REG LIST*/
164#define DM_REG_BB_RST_11N 0x02
165#define DM_REG_ANTSEL_PIN_11N 0x4C
166#define DM_REG_EARLY_MODE_11N 0x4D0
167#define DM_REG_RSSI_MONITOR_11N 0x4FE
168#define DM_REG_EDCA_VO_11N 0x500
169#define DM_REG_EDCA_VI_11N 0x504
170#define DM_REG_EDCA_BE_11N 0x508
171#define DM_REG_EDCA_BK_11N 0x50C
172#define DM_REG_TXPAUSE_11N 0x522
173#define DM_REG_RESP_TX_11N 0x6D8
174#define DM_REG_ANT_TRAIN_PARA1_11N 0x7b0
175#define DM_REG_ANT_TRAIN_PARA2_11N 0x7b4
176
177/*DIG Related*/
178#define DM_BIT_IGI_11N 0x0000007F
179
180#define HAL_DM_DIG_DISABLE BIT(0)
181#define HAL_DM_HIPWR_DISABLE BIT(1)
182
183#define OFDM_TABLE_LENGTH 43
184#define CCK_TABLE_LENGTH 33
185
186#define OFDM_TABLE_SIZE 43
187#define CCK_TABLE_SIZE 33
188
189#define BW_AUTO_SWITCH_HIGH_LOW 25
190#define BW_AUTO_SWITCH_LOW_HIGH 30
191
192#define DM_DIG_THRESH_HIGH 40
193#define DM_DIG_THRESH_LOW 35
194
195#define DM_FALSEALARM_THRESH_LOW 400
196#define DM_FALSEALARM_THRESH_HIGH 1000
197
198#define DM_DIG_MAX 0x3e
199#define DM_DIG_MIN 0x1e
200
201#define DM_DIG_MAX_AP 0x32
202#define DM_DIG_MIN_AP 0x20
203
204#define DM_DIG_FA_UPPER 0x3e
205#define DM_DIG_FA_LOWER 0x1e
206#define DM_DIG_FA_TH0 0x200
207#define DM_DIG_FA_TH1 0x300
208#define DM_DIG_FA_TH2 0x400
209
210#define DM_DIG_BACKOFF_MAX 12
211#define DM_DIG_BACKOFF_MIN -4
212#define DM_DIG_BACKOFF_DEFAULT 10
213
214#define RXPATHSELECTION_SS_TH_LOW 30
215#define RXPATHSELECTION_DIFF_TH 18
216
217#define DM_RATR_STA_INIT 0
218#define DM_RATR_STA_HIGH 1
219#define DM_RATR_STA_MIDDLE 2
220#define DM_RATR_STA_LOW 3
221
222#define CTS2SELF_THVAL 30
223#define REGC38_TH 20
224
225#define WAIOTTHVAL 25
226
227#define TXHIGHPWRLEVEL_NORMAL 0
228#define TXHIGHPWRLEVEL_LEVEL1 1
229#define TXHIGHPWRLEVEL_LEVEL2 2
230#define TXHIGHPWRLEVEL_BT1 3
231#define TXHIGHPWRLEVEL_BT2 4
232
233#define DM_TYPE_BYFW 0
234#define DM_TYPE_BYDRIVER 1
235
236#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
237#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
238#define TXPWRTRACK_MAX_IDX 6
239
240/* Dynamic ATC switch */
241#define ATC_STATUS_OFF 0x0 /* enable */
242#define ATC_STATUS_ON 0x1 /* disable */
243#define CFO_THRESHOLD_XTAL 10 /* kHz */
244#define CFO_THRESHOLD_ATC 80 /* kHz */
245
246/* RSSI Dump Message */
247#define RA_RSSIDUMP 0xcb0
248#define RB_RSSIDUMP 0xcb1
249#define RS1_RXEVMDUMP 0xcb2
250#define RS2_RXEVMDUMP 0xcb3
251#define RA_RXSNRDUMP 0xcb4
252#define RB_RXSNRDUMP 0xcb5
253#define RA_CFOSHORTDUMP 0xcb6
254#define RB_CFOSHORTDUMP 0xcb8
255#define RA_CFOLONGDUMP 0xcba
256#define RB_CFOLONGDUMP 0xcbc
257
258void rtl92ee_dm_init(struct ieee80211_hw *hw);
259void rtl92ee_dm_watchdog(struct ieee80211_hw *hw);
260void rtl92ee_dm_write_cck_cca_thres(struct ieee80211_hw *hw,
261 u8 cur_thres);
262void rtl92ee_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi);
263void rtl92ee_dm_init_edca_turbo(struct ieee80211_hw *hw);
264void rtl92ee_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
265void rtl92ee_dm_dynamic_arfb_select(struct ieee80211_hw *hw,
266 u8 rate, bool collision_state);
267#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/fw.c b/drivers/net/wireless/rtlwifi/rtl8192ee/fw.c
new file mode 100644
index 000000000000..45c128b91f7f
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/fw.c
@@ -0,0 +1,906 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../base.h"
29#include "../core.h"
30#include "reg.h"
31#include "def.h"
32#include "fw.h"
33#include "dm.h"
34
35static void _rtl92ee_enable_fw_download(struct ieee80211_hw *hw, bool enable)
36{
37 struct rtl_priv *rtlpriv = rtl_priv(hw);
38 u8 tmp;
39
40 if (enable) {
41 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05);
42
43 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
44 rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
45 } else {
46 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
47 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
48 }
49}
50
51static void _rtl92ee_fw_block_write(struct ieee80211_hw *hw,
52 const u8 *buffer, u32 size)
53{
54 struct rtl_priv *rtlpriv = rtl_priv(hw);
55 u32 blocksize = sizeof(u32);
56 u8 *bufferptr = (u8 *)buffer;
57 u32 *pu4byteptr = (u32 *)buffer;
58 u32 i, offset, blockcount, remainsize;
59
60 blockcount = size / blocksize;
61 remainsize = size % blocksize;
62
63 for (i = 0; i < blockcount; i++) {
64 offset = i * blocksize;
65 rtl_write_dword(rtlpriv, (FW_8192C_START_ADDRESS + offset),
66 *(pu4byteptr + i));
67 }
68
69 if (remainsize) {
70 offset = blockcount * blocksize;
71 bufferptr += offset;
72 for (i = 0; i < remainsize; i++) {
73 rtl_write_byte(rtlpriv,
74 (FW_8192C_START_ADDRESS + offset + i),
75 *(bufferptr + i));
76 }
77 }
78}
79
80static void _rtl92ee_fw_page_write(struct ieee80211_hw *hw, u32 page,
81 const u8 *buffer, u32 size)
82{
83 struct rtl_priv *rtlpriv = rtl_priv(hw);
84 u8 value8;
85 u8 u8page = (u8)(page & 0x07);
86
87 value8 = (rtl_read_byte(rtlpriv, REG_MCUFWDL + 2) & 0xF8) | u8page;
88 rtl_write_byte(rtlpriv, (REG_MCUFWDL + 2), value8);
89
90 _rtl92ee_fw_block_write(hw, buffer, size);
91}
92
93static void _rtl92ee_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
94{
95 u32 fwlen = *pfwlen;
96 u8 remain = (u8)(fwlen % 4);
97
98 remain = (remain == 0) ? 0 : (4 - remain);
99
100 while (remain > 0) {
101 pfwbuf[fwlen] = 0;
102 fwlen++;
103 remain--;
104 }
105
106 *pfwlen = fwlen;
107}
108
109static void _rtl92ee_write_fw(struct ieee80211_hw *hw,
110 enum version_8192e version,
111 u8 *buffer, u32 size)
112{
113 struct rtl_priv *rtlpriv = rtl_priv(hw);
114 u8 *bufferptr = (u8 *)buffer;
115 u32 pagenums, remainsize;
116 u32 page, offset;
117
118 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD , "FW size is %d bytes,\n", size);
119
120 _rtl92ee_fill_dummy(bufferptr, &size);
121
122 pagenums = size / FW_8192C_PAGE_SIZE;
123 remainsize = size % FW_8192C_PAGE_SIZE;
124
125 if (pagenums > 8) {
126 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
127 "Page numbers should not greater then 8\n");
128 }
129
130 for (page = 0; page < pagenums; page++) {
131 offset = page * FW_8192C_PAGE_SIZE;
132 _rtl92ee_fw_page_write(hw, page, (bufferptr + offset),
133 FW_8192C_PAGE_SIZE);
134 udelay(2);
135 }
136
137 if (remainsize) {
138 offset = pagenums * FW_8192C_PAGE_SIZE;
139 page = pagenums;
140 _rtl92ee_fw_page_write(hw, page, (bufferptr + offset),
141 remainsize);
142 }
143}
144
145static int _rtl92ee_fw_free_to_go(struct ieee80211_hw *hw)
146{
147 struct rtl_priv *rtlpriv = rtl_priv(hw);
148 int err = -EIO;
149 u32 counter = 0;
150 u32 value32;
151
152 do {
153 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
154 } while ((counter++ < FW_8192C_POLLING_TIMEOUT_COUNT) &&
155 (!(value32 & FWDL_CHKSUM_RPT)));
156
157 if (counter >= FW_8192C_POLLING_TIMEOUT_COUNT) {
158 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
159 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
160 value32);
161 goto exit;
162 }
163
164 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
165 "Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32);
166
167 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
168 value32 |= MCUFWDL_RDY;
169 value32 &= ~WINTINI_RDY;
170 rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
171
172 rtl92ee_firmware_selfreset(hw);
173 counter = 0;
174
175 do {
176 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
177 if (value32 & WINTINI_RDY) {
178 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD ,
179 "Polling FW ready success!! REG_MCUFWDL:0x%08x. count = %d\n",
180 value32, counter);
181 err = 0;
182 goto exit;
183 }
184
185 udelay(FW_8192C_POLLING_DELAY*10);
186
187 } while (counter++ < FW_8192C_POLLING_TIMEOUT_COUNT);
188
189 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
190 "Polling FW ready fail!! REG_MCUFWDL:0x%08x. count = %d\n",
191 value32, counter);
192
193exit:
194 return err;
195}
196
197int rtl92ee_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
198{
199 struct rtl_priv *rtlpriv = rtl_priv(hw);
200 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
201 struct rtl92c_firmware_header *pfwheader;
202 u8 *pfwdata;
203 u32 fwsize;
204 int err;
205 enum version_8192e version = rtlhal->version;
206
207 if (!rtlhal->pfirmware)
208 return 1;
209
210 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware;
211 rtlhal->fw_version = pfwheader->version;
212 rtlhal->fw_subversion = pfwheader->subversion;
213 pfwdata = (u8 *)rtlhal->pfirmware;
214 fwsize = rtlhal->fwsize;
215 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
216 "normal Firmware SIZE %d\n" , fwsize);
217
218 if (IS_FW_HEADER_EXIST(pfwheader)) {
219 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
220 "Firmware Version(%d), Signature(%#x),Size(%d)\n",
221 pfwheader->version, pfwheader->signature,
222 (int)sizeof(struct rtl92c_firmware_header));
223
224 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header);
225 fwsize = fwsize - sizeof(struct rtl92c_firmware_header);
226 } else {
227 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
228 "Firmware no Header, Signature(%#x)\n",
229 pfwheader->signature);
230 }
231
232 if (rtlhal->mac_func_enable) {
233 if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
234 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0);
235 rtl92ee_firmware_selfreset(hw);
236 }
237 }
238 _rtl92ee_enable_fw_download(hw, true);
239 _rtl92ee_write_fw(hw, version, pfwdata, fwsize);
240 _rtl92ee_enable_fw_download(hw, false);
241
242 err = _rtl92ee_fw_free_to_go(hw);
243 if (err) {
244 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
245 "Firmware is not ready to run!\n");
246 } else {
247 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD ,
248 "Firmware is ready to run!\n");
249 }
250
251 return 0;
252}
253
254static bool _rtl92ee_check_fw_read_last_h2c(struct ieee80211_hw *hw, u8 boxnum)
255{
256 struct rtl_priv *rtlpriv = rtl_priv(hw);
257 u8 val_hmetfr;
258 bool result = false;
259
260 val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
261 if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
262 result = true;
263 return result;
264}
265
266static void _rtl92ee_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
267 u32 cmd_len, u8 *cmdbuffer)
268{
269 struct rtl_priv *rtlpriv = rtl_priv(hw);
270 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
271 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
272 u8 boxnum;
273 u16 box_reg = 0, box_extreg = 0;
274 u8 u1b_tmp;
275 bool isfw_read = false;
276 u8 buf_index = 0;
277 bool bwrite_sucess = false;
278 u8 wait_h2c_limmit = 100;
279 u8 boxcontent[4], boxextcontent[4];
280 u32 h2c_waitcounter = 0;
281 unsigned long flag;
282 u8 idx;
283
284 if (ppsc->dot11_psmode != EACTIVE ||
285 ppsc->inactive_pwrstate == ERFOFF) {
286 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
287 "FillH2CCommand8192E(): Return because RF is off!!!\n");
288 return;
289 }
290
291 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD , "come in\n");
292
293 /* 1. Prevent race condition in setting H2C cmd.
294 * (copy from MgntActSet_RF_State().)
295 */
296 while (true) {
297 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
298 if (rtlhal->h2c_setinprogress) {
299 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
300 "H2C set in progress! Wait to set..element_id(%d).\n",
301 element_id);
302
303 while (rtlhal->h2c_setinprogress) {
304 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
305 flag);
306 h2c_waitcounter++;
307 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
308 "Wait 100 us (%d times)...\n",
309 h2c_waitcounter);
310 udelay(100);
311
312 if (h2c_waitcounter > 1000)
313 return;
314 spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
315 flag);
316 }
317 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
318 } else {
319 rtlhal->h2c_setinprogress = true;
320 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
321 break;
322 }
323 }
324
325 while (!bwrite_sucess) {
326 /* 2. Find the last BOX number which has been writen. */
327 boxnum = rtlhal->last_hmeboxnum;
328 switch (boxnum) {
329 case 0:
330 box_reg = REG_HMEBOX_0;
331 box_extreg = REG_HMEBOX_EXT_0;
332 break;
333 case 1:
334 box_reg = REG_HMEBOX_1;
335 box_extreg = REG_HMEBOX_EXT_1;
336 break;
337 case 2:
338 box_reg = REG_HMEBOX_2;
339 box_extreg = REG_HMEBOX_EXT_2;
340 break;
341 case 3:
342 box_reg = REG_HMEBOX_3;
343 box_extreg = REG_HMEBOX_EXT_3;
344 break;
345 default:
346 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
347 "switch case not process\n");
348 break;
349 }
350
351 /* 3. Check if the box content is empty. */
352 isfw_read = false;
353 u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
354
355 if (u1b_tmp != 0xea) {
356 isfw_read = true;
357 } else {
358 if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xea ||
359 rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xea)
360 rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xff);
361 }
362
363 if (isfw_read) {
364 wait_h2c_limmit = 100;
365 isfw_read = _rtl92ee_check_fw_read_last_h2c(hw, boxnum);
366 while (!isfw_read) {
367 wait_h2c_limmit--;
368 if (wait_h2c_limmit == 0) {
369 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
370 "Waiting too long for FW read clear HMEBox(%d)!!!\n",
371 boxnum);
372 break;
373 }
374 udelay(10);
375 isfw_read =
376 _rtl92ee_check_fw_read_last_h2c(hw, boxnum);
377 u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
378 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
379 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
380 boxnum, u1b_tmp);
381 }
382 }
383
384 /* If Fw has not read the last
385 * H2C cmd, break and give up this H2C.
386 */
387 if (!isfw_read) {
388 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
389 "Write H2C reg BOX[%d] fail,Fw don't read.\n",
390 boxnum);
391 break;
392 }
393 /* 4. Fill the H2C cmd into box */
394 memset(boxcontent, 0, sizeof(boxcontent));
395 memset(boxextcontent, 0, sizeof(boxextcontent));
396 boxcontent[0] = element_id;
397 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
398 "Write element_id box_reg(%4x) = %2x\n",
399 box_reg, element_id);
400
401 switch (cmd_len) {
402 case 1:
403 case 2:
404 case 3:
405 /*boxcontent[0] &= ~(BIT(7));*/
406 memcpy((u8 *)(boxcontent) + 1,
407 cmdbuffer + buf_index, cmd_len);
408
409 for (idx = 0; idx < 4; idx++) {
410 rtl_write_byte(rtlpriv, box_reg + idx,
411 boxcontent[idx]);
412 }
413 break;
414 case 4:
415 case 5:
416 case 6:
417 case 7:
418 /*boxcontent[0] |= (BIT(7));*/
419 memcpy((u8 *)(boxextcontent),
420 cmdbuffer + buf_index+3, cmd_len-3);
421 memcpy((u8 *)(boxcontent) + 1,
422 cmdbuffer + buf_index, 3);
423
424 for (idx = 0; idx < 4; idx++) {
425 rtl_write_byte(rtlpriv, box_extreg + idx,
426 boxextcontent[idx]);
427 }
428
429 for (idx = 0; idx < 4; idx++) {
430 rtl_write_byte(rtlpriv, box_reg + idx,
431 boxcontent[idx]);
432 }
433 break;
434 default:
435 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
436 "switch case not process\n");
437 break;
438 }
439
440 bwrite_sucess = true;
441
442 rtlhal->last_hmeboxnum = boxnum + 1;
443 if (rtlhal->last_hmeboxnum == 4)
444 rtlhal->last_hmeboxnum = 0;
445
446 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD ,
447 "pHalData->last_hmeboxnum = %d\n",
448 rtlhal->last_hmeboxnum);
449 }
450
451 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
452 rtlhal->h2c_setinprogress = false;
453 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
454
455 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD , "go out\n");
456}
457
458void rtl92ee_fill_h2c_cmd(struct ieee80211_hw *hw,
459 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
460{
461 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
462 u32 tmp_cmdbuf[2];
463
464 if (!rtlhal->fw_ready) {
465 RT_ASSERT(false,
466 "return H2C cmd because of Fw download fail!!!\n");
467 return;
468 }
469
470 memset(tmp_cmdbuf, 0, 8);
471 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
472 _rtl92ee_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
473}
474
475void rtl92ee_firmware_selfreset(struct ieee80211_hw *hw)
476{
477 u8 u1b_tmp;
478 struct rtl_priv *rtlpriv = rtl_priv(hw);
479
480 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
481 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
482
483 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
484 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
485
486 udelay(50);
487
488 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
489 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp | BIT(0)));
490
491 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
492 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp | BIT(2)));
493
494 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD ,
495 " _8051Reset92E(): 8051 reset success .\n");
496}
497
498void rtl92ee_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
499{
500 struct rtl_priv *rtlpriv = rtl_priv(hw);
501 u8 u1_h2c_set_pwrmode[H2C_92E_PWEMODE_LENGTH] = { 0 };
502 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
503 u8 rlbm , power_state = 0;
504
505 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD , "FW LPS mode = %d\n", mode);
506
507 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
508 rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/
509 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
510 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
511 (rtlpriv->mac80211.p2p) ?
512 ppsc->smart_ps : 1);
513 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
514 ppsc->reg_max_lps_awakeintvl);
515 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
516 if (mode == FW_PS_ACTIVE_MODE)
517 power_state |= FW_PWR_STATE_ACTIVE;
518 else
519 power_state |= FW_PWR_STATE_RF_OFF;
520 SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
521
522 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
523 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
524 u1_h2c_set_pwrmode, H2C_92E_PWEMODE_LENGTH);
525 rtl92ee_fill_h2c_cmd(hw, H2C_92E_SETPWRMODE, H2C_92E_PWEMODE_LENGTH,
526 u1_h2c_set_pwrmode);
527}
528
529void rtl92ee_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus)
530{
531 u8 parm[3] = { 0 , 0 , 0 };
532 /* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
533 * bit1=0-->update Media Status to MACID
534 * bit1=1-->update Media Status from MACID to MACID_End
535 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
536 * parm[2]: MACID_End
537 */
538
539 SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
540 SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
541
542 rtl92ee_fill_h2c_cmd(hw, H2C_92E_MSRRPT, 3, parm);
543}
544
545#define BEACON_PG 0 /* ->1 */
546#define PSPOLL_PG 2
547#define NULL_PG 3
548#define PROBERSP_PG 4 /* ->5 */
549
550#define TOTAL_RESERVED_PKT_LEN 768
551
552static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
553 /* page 0 beacon */
554 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
555 0xFF, 0xFF, 0x00, 0xE0, 0x4C, 0x02, 0xB1, 0x78,
556 0xEC, 0x1A, 0x59, 0x0B, 0xAD, 0xD4, 0x20, 0x00,
557 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
558 0x64, 0x00, 0x10, 0x04, 0x00, 0x05, 0x54, 0x65,
559 0x73, 0x74, 0x32, 0x01, 0x08, 0x82, 0x84, 0x0B,
560 0x16, 0x24, 0x30, 0x48, 0x6C, 0x03, 0x01, 0x06,
561 0x06, 0x02, 0x00, 0x00, 0x2A, 0x01, 0x02, 0x32,
562 0x04, 0x0C, 0x12, 0x18, 0x60, 0x2D, 0x1A, 0x6C,
563 0x09, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00,
564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
565 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
566 0x00, 0x3D, 0x00, 0xDD, 0x07, 0x00, 0xE0, 0x4C,
567 0x02, 0x02, 0x00, 0x00, 0xDD, 0x18, 0x00, 0x50,
568 0xF2, 0x01, 0x01, 0x00, 0x00, 0x50, 0xF2, 0x04,
569 0x01, 0x00, 0x00, 0x50, 0xF2, 0x04, 0x01, 0x00,
570
571 /* page 1 beacon */
572 0x00, 0x50, 0xF2, 0x02, 0x00, 0x00, 0x00, 0x00,
573 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
574 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
575 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
576 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
577 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
578 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
579 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
580 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
581 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
582 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
583 0x10, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
584 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00,
585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
588
589 /* page 2 ps-poll */
590 0xA4, 0x10, 0x01, 0xC0, 0xEC, 0x1A, 0x59, 0x0B,
591 0xAD, 0xD4, 0x00, 0xE0, 0x4C, 0x02, 0xB1, 0x78,
592 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
593 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
594 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
595 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
596 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
597 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
598 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
599 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
600 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
601 0x18, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
602 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
603 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
604 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
605 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
606
607 /* page 3 null */
608 0x48, 0x01, 0x00, 0x00, 0xEC, 0x1A, 0x59, 0x0B,
609 0xAD, 0xD4, 0x00, 0xE0, 0x4C, 0x02, 0xB1, 0x78,
610 0xEC, 0x1A, 0x59, 0x0B, 0xAD, 0xD4, 0x00, 0x00,
611 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
612 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
613 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
615 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
616 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
617 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
618 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
619 0x72, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
620 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
623 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
624
625 /* page 4 probe_resp */
626 0x50, 0x00, 0x00, 0x00, 0x00, 0x40, 0x10, 0x10,
627 0x00, 0x03, 0x00, 0xE0, 0x4C, 0x76, 0x00, 0x42,
628 0x00, 0x40, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00,
629 0x9E, 0x46, 0x15, 0x32, 0x27, 0xF2, 0x2D, 0x00,
630 0x64, 0x00, 0x00, 0x04, 0x00, 0x0C, 0x6C, 0x69,
631 0x6E, 0x6B, 0x73, 0x79, 0x73, 0x5F, 0x77, 0x6C,
632 0x61, 0x6E, 0x01, 0x04, 0x82, 0x84, 0x8B, 0x96,
633 0x03, 0x01, 0x01, 0x06, 0x02, 0x00, 0x00, 0x2A,
634 0x01, 0x00, 0x32, 0x08, 0x24, 0x30, 0x48, 0x6C,
635 0x0C, 0x12, 0x18, 0x60, 0x2D, 0x1A, 0x6C, 0x18,
636 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
637 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
638 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
639 0x3D, 0x00, 0xDD, 0x06, 0x00, 0xE0, 0x4C, 0x02,
640 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
642
643 /* page 5 probe_resp */
644 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
645 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
646 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
647 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
648 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
650 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
651 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
652 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
653 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
654 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
658 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
659 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
660};
661
662void rtl92ee_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
663{
664 struct rtl_priv *rtlpriv = rtl_priv(hw);
665 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
666 struct sk_buff *skb = NULL;
667
668 u32 totalpacketlen;
669 bool rtstatus;
670 u8 u1rsvdpageloc[5] = { 0 };
671 bool b_dlok = false;
672
673 u8 *beacon;
674 u8 *p_pspoll;
675 u8 *nullfunc;
676 u8 *p_probersp;
677 /*---------------------------------------------------------
678 * (1) beacon
679 *---------------------------------------------------------
680 */
681 beacon = &reserved_page_packet[BEACON_PG * 128];
682 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
683 SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
684
685 /*-------------------------------------------------------
686 * (2) ps-poll
687 *--------------------------------------------------------
688 */
689 p_pspoll = &reserved_page_packet[PSPOLL_PG * 128];
690 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
691 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
692 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
693
694 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
695
696 /*--------------------------------------------------------
697 * (3) null data
698 *---------------------------------------------------------
699 */
700 nullfunc = &reserved_page_packet[NULL_PG * 128];
701 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
702 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
703 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
704
705 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
706
707 /*---------------------------------------------------------
708 * (4) probe response
709 *----------------------------------------------------------
710 */
711 p_probersp = &reserved_page_packet[PROBERSP_PG * 128];
712 SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid);
713 SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr);
714 SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid);
715
716 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1rsvdpageloc, PROBERSP_PG);
717
718 totalpacketlen = TOTAL_RESERVED_PKT_LEN;
719
720 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD ,
721 "rtl92ee_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
722 &reserved_page_packet[0], totalpacketlen);
723 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD ,
724 "rtl92ee_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
725 u1rsvdpageloc, 3);
726
727 skb = dev_alloc_skb(totalpacketlen);
728 memcpy((u8 *)skb_put(skb, totalpacketlen),
729 &reserved_page_packet, totalpacketlen);
730
731 rtstatus = rtl_cmd_send_packet(hw, skb);
732
733 if (rtstatus)
734 b_dlok = true;
735
736 if (b_dlok) {
737 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD ,
738 "Set RSVD page location to Fw.\n");
739 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD ,
740 "H2C_RSVDPAGE:\n", u1rsvdpageloc, 3);
741 rtl92ee_fill_h2c_cmd(hw, H2C_92E_RSVDPAGE,
742 sizeof(u1rsvdpageloc), u1rsvdpageloc);
743 } else {
744 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
745 "Set RSVD page location to Fw FAIL!!!!!!.\n");
746 }
747}
748
749/*Shoud check FW support p2p or not.*/
750static void rtl92ee_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
751{
752 u8 u1_ctwindow_period[1] = {ctwindow};
753
754 rtl92ee_fill_h2c_cmd(hw, H2C_92E_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);
755}
756
757void rtl92ee_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
758{
759 struct rtl_priv *rtlpriv = rtl_priv(hw);
760 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
761 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
762 struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
763 struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
764 u8 i;
765 u16 ctwindow;
766 u32 start_time, tsf_low;
767
768 switch (p2p_ps_state) {
769 case P2P_PS_DISABLE:
770 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD , "P2P_PS_DISABLE\n");
771 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
772 break;
773 case P2P_PS_ENABLE:
774 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD , "P2P_PS_ENABLE\n");
775 /* update CTWindow value. */
776 if (p2pinfo->ctwindow > 0) {
777 p2p_ps_offload->ctwindow_en = 1;
778 ctwindow = p2pinfo->ctwindow;
779 rtl92ee_set_p2p_ctw_period_cmd(hw, ctwindow);
780 }
781 /* hw only support 2 set of NoA */
782 for (i = 0 ; i < p2pinfo->noa_num ; i++) {
783 /* To control the register setting for which NOA*/
784 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
785 if (i == 0)
786 p2p_ps_offload->noa0_en = 1;
787 else
788 p2p_ps_offload->noa1_en = 1;
789 /* config P2P NoA Descriptor Register */
790 rtl_write_dword(rtlpriv, 0x5E0,
791 p2pinfo->noa_duration[i]);
792 rtl_write_dword(rtlpriv, 0x5E4,
793 p2pinfo->noa_interval[i]);
794
795 /*Get Current TSF value */
796 tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
797
798 start_time = p2pinfo->noa_start_time[i];
799 if (p2pinfo->noa_count_type[i] != 1) {
800 while (start_time <= (tsf_low + (50 * 1024))) {
801 start_time += p2pinfo->noa_interval[i];
802 if (p2pinfo->noa_count_type[i] != 255)
803 p2pinfo->noa_count_type[i]--;
804 }
805 }
806 rtl_write_dword(rtlpriv, 0x5E8, start_time);
807 rtl_write_dword(rtlpriv, 0x5EC,
808 p2pinfo->noa_count_type[i]);
809 }
810 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
811 /* rst p2p circuit */
812 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
813 p2p_ps_offload->offload_en = 1;
814
815 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
816 p2p_ps_offload->role = 1;
817 p2p_ps_offload->allstasleep = 0;
818 } else {
819 p2p_ps_offload->role = 0;
820 }
821 p2p_ps_offload->discovery = 0;
822 }
823 break;
824 case P2P_PS_SCAN:
825 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD , "P2P_PS_SCAN\n");
826 p2p_ps_offload->discovery = 1;
827 break;
828 case P2P_PS_SCAN_DONE:
829 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD , "P2P_PS_SCAN_DONE\n");
830 p2p_ps_offload->discovery = 0;
831 p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
832 break;
833 default:
834 break;
835 }
836 rtl92ee_fill_h2c_cmd(hw, H2C_92E_P2P_PS_OFFLOAD, 1,
837 (u8 *)p2p_ps_offload);
838}
839
840static void _rtl92ee_c2h_ra_report_handler(struct ieee80211_hw *hw,
841 u8 *cmd_buf, u8 cmd_len)
842{
843 u8 rate = cmd_buf[0] & 0x3F;
844 bool collision_state = cmd_buf[3] & BIT(0);
845
846 rtl92ee_dm_dynamic_arfb_select(hw, rate, collision_state);
847}
848
849static void _rtl92ee_c2h_content_parsing(struct ieee80211_hw *hw, u8 c2h_cmd_id,
850 u8 c2h_cmd_len, u8 *tmp_buf)
851{
852 struct rtl_priv *rtlpriv = rtl_priv(hw);
853
854 switch (c2h_cmd_id) {
855 case C2H_8192E_DBG:
856 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
857 "[C2H], C2H_8723BE_DBG!!\n");
858 break;
859 case C2H_8192E_TXBF:
860 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
861 "[C2H], C2H_8192E_TXBF!!\n");
862 break;
863 case C2H_8192E_TX_REPORT:
864 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE ,
865 "[C2H], C2H_8723BE_TX_REPORT!\n");
866 break;
867 case C2H_8192E_BT_INFO:
868 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
869 "[C2H], C2H_8723BE_BT_INFO!!\n");
870 rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
871 c2h_cmd_len);
872 break;
873 case C2H_8192E_BT_MP:
874 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
875 "[C2H], C2H_8723BE_BT_MP!!\n");
876 break;
877 case C2H_8192E_RA_RPT:
878 _rtl92ee_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
879 break;
880 default:
881 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
882 "[C2H], Unkown packet!! CmdId(%#X)!\n", c2h_cmd_id);
883 break;
884 }
885}
886
887void rtl92ee_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
888{
889 struct rtl_priv *rtlpriv = rtl_priv(hw);
890 u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
891 u8 *tmp_buf = NULL;
892
893 c2h_cmd_id = buffer[0];
894 c2h_cmd_seq = buffer[1];
895 c2h_cmd_len = len - 2;
896 tmp_buf = buffer + 2;
897
898 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
899 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
900 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
901
902 RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_TRACE,
903 "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
904
905 _rtl92ee_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
906}
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/fw.h b/drivers/net/wireless/rtlwifi/rtl8192ee/fw.h
new file mode 100644
index 000000000000..3e2a48e5fb4d
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/fw.h
@@ -0,0 +1,208 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 * Larry Finger <Larry.Finger@lwfinger.net>
22 *
23 *****************************************************************************/
24
25#ifndef __RTL92E__FW__H__
26#define __RTL92E__FW__H__
27
28#define FW_8192C_SIZE 0x8000
29#define FW_8192C_START_ADDRESS 0x1000
30#define FW_8192C_END_ADDRESS 0x5FFF
31#define FW_8192C_PAGE_SIZE 4096
32#define FW_8192C_POLLING_DELAY 5
33#define FW_8192C_POLLING_TIMEOUT_COUNT 3000
34
35#define IS_FW_HEADER_EXIST(_pfwhdr) \
36 ((_pfwhdr->signature&0xFFF0) == 0x92E0)
37#define USE_OLD_WOWLAN_DEBUG_FW 0
38
39#define H2C_92E_RSVDPAGE_LOC_LEN 5
40#define H2C_92E_PWEMODE_LENGTH 5
41#define H2C_92E_JOINBSSRPT_LENGTH 1
42#define H2C_92E_AP_OFFLOAD_LENGTH 3
43#define H2C_92E_WOWLAN_LENGTH 3
44#define H2C_92E_KEEP_ALIVE_CTRL_LENGTH 3
45#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
46#define H2C_92E_REMOTE_WAKE_CTRL_LEN 1
47#else
48#define H2C_92E_REMOTE_WAKE_CTRL_LEN 3
49#endif
50#define H2C_92E_AOAC_GLOBAL_INFO_LEN 2
51#define H2C_92E_AOAC_RSVDPAGE_LOC_LEN 7
52
53/* Fw PS state for RPWM.
54*BIT[2:0] = HW state
55*BIT[3] = Protocol PS state, 1: register active state, 0: register sleep state
56*BIT[4] = sub-state
57*/
58#define FW_PS_RF_ON BIT(2)
59#define FW_PS_REGISTER_ACTIVE BIT(3)
60
61#define FW_PS_ACK BIT(6)
62#define FW_PS_TOGGLE BIT(7)
63
64 /* 92E RPWM value*/
65 /* BIT[0] = 1: 32k, 0: 40M*/
66#define FW_PS_CLOCK_OFF BIT(0) /* 32k */
67#define FW_PS_CLOCK_ON 0 /* 40M */
68
69#define FW_PS_STATE_MASK (0x0F)
70#define FW_PS_STATE_HW_MASK (0x07)
71#define FW_PS_STATE_INT_MASK (0x3F)
72
73#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x))
74
75#define FW_PS_STATE_ALL_ON_92E (FW_PS_CLOCK_ON)
76#define FW_PS_STATE_RF_ON_92E (FW_PS_CLOCK_ON)
77#define FW_PS_STATE_RF_OFF_92E (FW_PS_CLOCK_ON)
78#define FW_PS_STATE_RF_OFF_LOW_PWR (FW_PS_CLOCK_OFF)
79
80/* For 92E H2C PwrMode Cmd ID 5.*/
81#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
82#define FW_PWR_STATE_RF_OFF 0
83
84#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK)
85
86#define IS_IN_LOW_POWER_STATE_92E(__state) \
87 (FW_PS_STATE(__state) == FW_PS_CLOCK_OFF)
88
89#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
90#define FW_PWR_STATE_RF_OFF 0
91
92struct rtl92c_firmware_header {
93 u16 signature;
94 u8 category;
95 u8 function;
96 u16 version;
97 u8 subversion;
98 u8 rsvd1;
99 u8 month;
100 u8 date;
101 u8 hour;
102 u8 minute;
103 u16 ramcodesize;
104 u16 rsvd2;
105 u32 svnindex;
106 u32 rsvd3;
107 u32 rsvd4;
108 u32 rsvd5;
109};
110
111enum rtl8192e_h2c_cmd {
112 H2C_92E_RSVDPAGE = 0,
113 H2C_92E_MSRRPT = 1,
114 H2C_92E_SCAN = 2,
115 H2C_92E_KEEP_ALIVE_CTRL = 3,
116 H2C_92E_DISCONNECT_DECISION = 4,
117#if (USE_OLD_WOWLAN_DEBUG_FW == 1)
118 H2C_92E_WO_WLAN = 5,
119#endif
120 H2C_92E_INIT_OFFLOAD = 6,
121#if (USE_OLD_WOWLAN_DEBUG_FW == 1)
122 H2C_92E_REMOTE_WAKE_CTRL = 7,
123#endif
124 H2C_92E_AP_OFFLOAD = 8,
125 H2C_92E_BCN_RSVDPAGE = 9,
126 H2C_92E_PROBERSP_RSVDPAGE = 10,
127
128 H2C_92E_SETPWRMODE = 0x20,
129 H2C_92E_PS_TUNING_PARA = 0x21,
130 H2C_92E_PS_TUNING_PARA2 = 0x22,
131 H2C_92E_PS_LPS_PARA = 0x23,
132 H2C_92E_P2P_PS_OFFLOAD = 024,
133
134#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
135 H2C_92E_WO_WLAN = 0x80,
136 H2C_92E_REMOTE_WAKE_CTRL = 0x81,
137 H2C_92E_AOAC_GLOBAL_INFO = 0x82,
138 H2C_92E_AOAC_RSVDPAGE = 0x83,
139#endif
140 H2C_92E_RA_MASK = 0x40,
141 H2C_92E_RSSI_REPORT = 0x42,
142 H2C_92E_SELECTIVE_SUSPEND_ROF_CMD,
143 H2C_92E_P2P_PS_MODE,
144 H2C_92E_PSD_RESULT,
145 /*Not defined CTW CMD for P2P yet*/
146 H2C_92E_P2P_PS_CTW_CMD,
147 MAX_92E_H2CCMD
148};
149
150enum rtl8192e_c2h_evt {
151 C2H_8192E_DBG = 0,
152 C2H_8192E_LB = 1,
153 C2H_8192E_TXBF = 2,
154 C2H_8192E_TX_REPORT = 3,
155 C2H_8192E_BT_INFO = 9,
156 C2H_8192E_BT_MP = 11,
157 C2H_8192E_RA_RPT = 12,
158 MAX_8192E_C2HEVENT
159};
160
161#define pagenum_128(_len) \
162 (u32)(((_len) >> 7) + ((_len) & 0x7F ? 1 : 0))
163
164#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
165 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
166#define SET_H2CCMD_PWRMODE_PARM_RLBM(__cmd, __val) \
167 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 4, __val)
168#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__cmd, __val) \
169 SET_BITS_TO_LE_1BYTE((__cmd)+1, 4, 4, __val)
170#define SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(__cmd, __val) \
171 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __val)
172#define SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__cmd, __val) \
173 SET_BITS_TO_LE_1BYTE((__cmd)+3, 0, 8, __val)
174#define SET_H2CCMD_PWRMODE_PARM_PWR_STATE(__cmd, __val) \
175 SET_BITS_TO_LE_1BYTE((__cmd)+4, 0, 8, __val)
176#define GET_92E_H2CCMD_PWRMODE_PARM_MODE(__cmd) \
177 LE_BITS_TO_1BYTE(__cmd, 0, 8)
178
179#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__ph2ccmd, __val) \
180 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
181#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val) \
182 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
183#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \
184 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
185#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \
186 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
187
188/* _MEDIA_STATUS_RPT_PARM_CMD1 */
189#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__cmd, __val) \
190 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __val)
191#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__cmd, __val) \
192 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __val)
193#define SET_H2CCMD_MSRRPT_PARM_MACID(__cmd, __val) \
194 SET_BITS_TO_LE_1BYTE(__cmd+1, 0, 8, __val)
195#define SET_H2CCMD_MSRRPT_PARM_MACID_END(__cmd, __val) \
196 SET_BITS_TO_LE_1BYTE(__cmd+2, 0, 8, __val)
197
198int rtl92ee_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw);
199void rtl92ee_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
200 u32 cmd_len, u8 *cmdbuffer);
201void rtl92ee_firmware_selfreset(struct ieee80211_hw *hw);
202void rtl92ee_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
203void rtl92ee_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus);
204void rtl92ee_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
205void rtl92ee_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
206void rtl92ee_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
207
208#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
new file mode 100644
index 000000000000..dfdc9b20e4ad
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.c
@@ -0,0 +1,2569 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../efuse.h"
28#include "../base.h"
29#include "../regd.h"
30#include "../cam.h"
31#include "../ps.h"
32#include "../pci.h"
33#include "reg.h"
34#include "def.h"
35#include "phy.h"
36#include "dm.h"
37#include "fw.h"
38#include "led.h"
39#include "hw.h"
40#include "../pwrseqcmd.h"
41#include "pwrseq.h"
42
43#define LLT_CONFIG 5
44
45static void _rtl92ee_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
46 u8 set_bits, u8 clear_bits)
47{
48 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
49 struct rtl_priv *rtlpriv = rtl_priv(hw);
50
51 rtlpci->reg_bcn_ctrl_val |= set_bits;
52 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
53
54 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
55}
56
57static void _rtl92ee_stop_tx_beacon(struct ieee80211_hw *hw)
58{
59 struct rtl_priv *rtlpriv = rtl_priv(hw);
60 u8 tmp;
61
62 tmp = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
63 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp & (~BIT(6)));
64 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
65 tmp = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
66 tmp &= ~(BIT(0));
67 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp);
68}
69
70static void _rtl92ee_resume_tx_beacon(struct ieee80211_hw *hw)
71{
72 struct rtl_priv *rtlpriv = rtl_priv(hw);
73 u8 tmp;
74
75 tmp = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
76 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp | BIT(6));
77 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
78 tmp = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
79 tmp |= BIT(0);
80 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp);
81}
82
83static void _rtl92ee_enable_bcn_sub_func(struct ieee80211_hw *hw)
84{
85 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(1));
86}
87
88static void _rtl92ee_return_beacon_queue_skb(struct ieee80211_hw *hw)
89{
90 struct rtl_priv *rtlpriv = rtl_priv(hw);
91 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
92 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
93 unsigned long flags;
94
95 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
96 while (skb_queue_len(&ring->queue)) {
97 struct rtl_tx_buffer_desc *entry =
98 &ring->buffer_desc[ring->idx];
99 struct sk_buff *skb = __skb_dequeue(&ring->queue);
100
101 pci_unmap_single(rtlpci->pdev,
102 rtlpriv->cfg->ops->get_desc(
103 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
104 skb->len, PCI_DMA_TODEVICE);
105 kfree_skb(skb);
106 ring->idx = (ring->idx + 1) % ring->entries;
107 }
108 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
109}
110
111static void _rtl92ee_disable_bcn_sub_func(struct ieee80211_hw *hw)
112{
113 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(1), 0);
114}
115
116static void _rtl92ee_set_fw_clock_on(struct ieee80211_hw *hw,
117 u8 rpwm_val, bool b_need_turn_off_ckk)
118{
119 struct rtl_priv *rtlpriv = rtl_priv(hw);
120 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
121 bool b_support_remote_wake_up;
122 u32 count = 0, isr_regaddr, content;
123 bool b_schedule_timer = b_need_turn_off_ckk;
124
125 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
126 (u8 *)(&b_support_remote_wake_up));
127
128 if (!rtlhal->fw_ready)
129 return;
130 if (!rtlpriv->psc.fw_current_inpsmode)
131 return;
132
133 while (1) {
134 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
135 if (rtlhal->fw_clk_change_in_progress) {
136 while (rtlhal->fw_clk_change_in_progress) {
137 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
138 count++;
139 udelay(100);
140 if (count > 1000)
141 return;
142 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
143 }
144 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
145 } else {
146 rtlhal->fw_clk_change_in_progress = false;
147 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
148 break;
149 }
150 }
151
152 if (IS_IN_LOW_POWER_STATE_92E(rtlhal->fw_ps_state)) {
153 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
154 (u8 *)(&rpwm_val));
155 if (FW_PS_IS_ACK(rpwm_val)) {
156 isr_regaddr = REG_HISR;
157 content = rtl_read_dword(rtlpriv, isr_regaddr);
158 while (!(content & IMR_CPWM) && (count < 500)) {
159 udelay(50);
160 count++;
161 content = rtl_read_dword(rtlpriv, isr_regaddr);
162 }
163
164 if (content & IMR_CPWM) {
165 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
166 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_92E;
167 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
168 "Receive CPWM INT!!! PSState = %X\n",
169 rtlhal->fw_ps_state);
170 }
171 }
172
173 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
174 rtlhal->fw_clk_change_in_progress = false;
175 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
176 if (b_schedule_timer) {
177 mod_timer(&rtlpriv->works.fw_clockoff_timer,
178 jiffies + MSECS(10));
179 }
180 } else {
181 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
182 rtlhal->fw_clk_change_in_progress = false;
183 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
184 }
185}
186
187static void _rtl92ee_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
188{
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
191 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
192 struct rtl8192_tx_ring *ring;
193 enum rf_pwrstate rtstate;
194 bool b_schedule_timer = false;
195 u8 queue;
196
197 if (!rtlhal->fw_ready)
198 return;
199 if (!rtlpriv->psc.fw_current_inpsmode)
200 return;
201 if (!rtlhal->allow_sw_to_change_hwclc)
202 return;
203
204 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
205 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
206 return;
207
208 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
209 ring = &rtlpci->tx_ring[queue];
210 if (skb_queue_len(&ring->queue)) {
211 b_schedule_timer = true;
212 break;
213 }
214 }
215
216 if (b_schedule_timer) {
217 mod_timer(&rtlpriv->works.fw_clockoff_timer,
218 jiffies + MSECS(10));
219 return;
220 }
221
222 if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR) {
223 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
224 if (!rtlhal->fw_clk_change_in_progress) {
225 rtlhal->fw_clk_change_in_progress = true;
226 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
227 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
228 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
229 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
230 (u8 *)(&rpwm_val));
231 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
232 rtlhal->fw_clk_change_in_progress = false;
233 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
234 } else {
235 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
236 mod_timer(&rtlpriv->works.fw_clockoff_timer,
237 jiffies + MSECS(10));
238 }
239 }
240}
241
242static void _rtl92ee_set_fw_ps_rf_on(struct ieee80211_hw *hw)
243{
244 u8 rpwm_val = 0;
245
246 rpwm_val |= (FW_PS_STATE_RF_OFF_92E | FW_PS_ACK);
247 _rtl92ee_set_fw_clock_on(hw, rpwm_val, true);
248}
249
250static void _rtl92ee_set_fw_ps_rf_off_low_power(struct ieee80211_hw *hw)
251{
252 u8 rpwm_val = 0;
253
254 rpwm_val |= FW_PS_STATE_RF_OFF_LOW_PWR;
255 _rtl92ee_set_fw_clock_off(hw, rpwm_val);
256}
257
258void rtl92ee_fw_clk_off_timer_callback(unsigned long data)
259{
260 struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
261
262 _rtl92ee_set_fw_ps_rf_off_low_power(hw);
263}
264
265static void _rtl92ee_fwlps_leave(struct ieee80211_hw *hw)
266{
267 struct rtl_priv *rtlpriv = rtl_priv(hw);
268 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
269 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
270 bool fw_current_inps = false;
271 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
272
273 if (ppsc->low_power_enable) {
274 rpwm_val = (FW_PS_STATE_ALL_ON_92E | FW_PS_ACK);/* RF on */
275 _rtl92ee_set_fw_clock_on(hw, rpwm_val, false);
276 rtlhal->allow_sw_to_change_hwclc = false;
277 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
278 (u8 *)(&fw_pwrmode));
279 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
280 (u8 *)(&fw_current_inps));
281 } else {
282 rpwm_val = FW_PS_STATE_ALL_ON_92E; /* RF on */
283 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
284 (u8 *)(&rpwm_val));
285 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
286 (u8 *)(&fw_pwrmode));
287 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
288 (u8 *)(&fw_current_inps));
289 }
290}
291
292static void _rtl92ee_fwlps_enter(struct ieee80211_hw *hw)
293{
294 struct rtl_priv *rtlpriv = rtl_priv(hw);
295 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
296 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
297 bool fw_current_inps = true;
298 u8 rpwm_val;
299
300 if (ppsc->low_power_enable) {
301 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR; /* RF off */
302 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
303 (u8 *)(&fw_current_inps));
304 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
305 (u8 *)(&ppsc->fwctrl_psmode));
306 rtlhal->allow_sw_to_change_hwclc = true;
307 _rtl92ee_set_fw_clock_off(hw, rpwm_val);
308 } else {
309 rpwm_val = FW_PS_STATE_RF_OFF_92E; /* RF off */
310 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
311 (u8 *)(&fw_current_inps));
312 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
313 (u8 *)(&ppsc->fwctrl_psmode));
314 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
315 (u8 *)(&rpwm_val));
316 }
317}
318
319void rtl92ee_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
320{
321 struct rtl_priv *rtlpriv = rtl_priv(hw);
322 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
323 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
324
325 switch (variable) {
326 case HW_VAR_RCR:
327 *((u32 *)(val)) = rtlpci->receive_config;
328 break;
329 case HW_VAR_RF_STATE:
330 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
331 break;
332 case HW_VAR_FWLPS_RF_ON:{
333 enum rf_pwrstate rfstate;
334 u32 val_rcr;
335
336 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE,
337 (u8 *)(&rfstate));
338 if (rfstate == ERFOFF) {
339 *((bool *)(val)) = true;
340 } else {
341 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
342 val_rcr &= 0x00070000;
343 if (val_rcr)
344 *((bool *)(val)) = false;
345 else
346 *((bool *)(val)) = true;
347 }
348 }
349 break;
350 case HW_VAR_FW_PSMODE_STATUS:
351 *((bool *)(val)) = ppsc->fw_current_inpsmode;
352 break;
353 case HW_VAR_CORRECT_TSF:{
354 u64 tsf;
355 u32 *ptsf_low = (u32 *)&tsf;
356 u32 *ptsf_high = ((u32 *)&tsf) + 1;
357
358 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
359 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
360
361 *((u64 *)(val)) = tsf;
362 }
363 break;
364 default:
365 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
366 "switch case not process %x\n", variable);
367 break;
368 }
369}
370
371static void _rtl92ee_download_rsvd_page(struct ieee80211_hw *hw)
372{
373 struct rtl_priv *rtlpriv = rtl_priv(hw);
374 u8 tmp_regcr, tmp_reg422;
375 u8 bcnvalid_reg, txbc_reg;
376 u8 count = 0, dlbcn_count = 0;
377 bool b_recover = false;
378
379 /*Set REG_CR bit 8. DMA beacon by SW.*/
380 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
381 rtl_write_byte(rtlpriv, REG_CR + 1, tmp_regcr | BIT(0));
382
383 /* Disable Hw protection for a time which revserd for Hw sending beacon.
384 * Fix download reserved page packet fail
385 * that access collision with the protection time.
386 * 2010.05.11. Added by tynli.
387 */
388 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
389 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
390
391 /* Set FWHW_TXQ_CTRL 0x422[6]=0 to
392 * tell Hw the packet is not a real beacon frame.
393 */
394 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
395 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422 & (~BIT(6)));
396
397 if (tmp_reg422 & BIT(6))
398 b_recover = true;
399
400 do {
401 /* Clear beacon valid check bit */
402 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_DWBCN0_CTRL + 2);
403 rtl_write_byte(rtlpriv, REG_DWBCN0_CTRL + 2,
404 bcnvalid_reg | BIT(0));
405
406 /* Return Beacon TCB */
407 _rtl92ee_return_beacon_queue_skb(hw);
408
409 /* download rsvd page */
410 rtl92ee_set_fw_rsvdpagepkt(hw, false);
411
412 txbc_reg = rtl_read_byte(rtlpriv, REG_MGQ_TXBD_NUM + 3);
413 count = 0;
414 while ((txbc_reg & BIT(4)) && count < 20) {
415 count++;
416 udelay(10);
417 txbc_reg = rtl_read_byte(rtlpriv, REG_MGQ_TXBD_NUM + 3);
418 }
419 rtl_write_byte(rtlpriv, REG_MGQ_TXBD_NUM + 3,
420 txbc_reg | BIT(4));
421
422 /* check rsvd page download OK. */
423 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_DWBCN0_CTRL + 2);
424 count = 0;
425 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
426 count++;
427 udelay(50);
428 bcnvalid_reg = rtl_read_byte(rtlpriv,
429 REG_DWBCN0_CTRL + 2);
430 }
431
432 if (bcnvalid_reg & BIT(0))
433 rtl_write_byte(rtlpriv, REG_DWBCN0_CTRL + 2, BIT(0));
434
435 dlbcn_count++;
436 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
437
438 if (!(bcnvalid_reg & BIT(0)))
439 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
440 "Download RSVD page failed!\n");
441
442 /* Enable Bcn */
443 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
444 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
445
446 if (b_recover)
447 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
448
449 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
450 rtl_write_byte(rtlpriv, REG_CR + 1, tmp_regcr & (~BIT(0)));
451}
452
453void rtl92ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
454{
455 struct rtl_priv *rtlpriv = rtl_priv(hw);
456 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
457 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
458 struct rtl_efuse *efuse = rtl_efuse(rtl_priv(hw));
459 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
460 u8 idx;
461
462 switch (variable) {
463 case HW_VAR_ETHER_ADDR:
464 for (idx = 0; idx < ETH_ALEN; idx++)
465 rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]);
466 break;
467 case HW_VAR_BASIC_RATE:{
468 u16 b_rate_cfg = ((u16 *)val)[0];
469
470 b_rate_cfg = b_rate_cfg & 0x15f;
471 b_rate_cfg |= 0x01;
472 b_rate_cfg = (b_rate_cfg | 0xd) & (~BIT(1));
473 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
474 rtl_write_byte(rtlpriv, REG_RRSR + 1, (b_rate_cfg >> 8) & 0xff);
475 break; }
476 case HW_VAR_BSSID:
477 for (idx = 0; idx < ETH_ALEN; idx++)
478 rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]);
479 break;
480 case HW_VAR_SIFS:
481 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
482 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
483
484 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
485 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
486
487 if (!mac->ht_enable)
488 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 0x0e0e);
489 else
490 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
491 *((u16 *)val));
492 break;
493 case HW_VAR_SLOT_TIME:{
494 u8 e_aci;
495
496 RT_TRACE(rtlpriv, COMP_MLME, DBG_TRACE,
497 "HW_VAR_SLOT_TIME %x\n", val[0]);
498
499 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
500
501 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
502 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
503 (u8 *)(&e_aci));
504 }
505 break; }
506 case HW_VAR_ACK_PREAMBLE:{
507 u8 reg_tmp;
508 u8 short_preamble = (bool)(*(u8 *)val);
509
510 reg_tmp = (rtlpriv->mac80211.cur_40_prime_sc) << 5;
511 if (short_preamble)
512 reg_tmp |= 0x80;
513 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_tmp);
514 rtlpriv->mac80211.short_preamble = short_preamble;
515 }
516 break;
517 case HW_VAR_WPA_CONFIG:
518 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
519 break;
520 case HW_VAR_AMPDU_FACTOR:{
521 u8 regtoset_normal[4] = { 0x41, 0xa8, 0x72, 0xb9 };
522 u8 fac;
523 u8 *reg = NULL;
524 u8 i = 0;
525
526 reg = regtoset_normal;
527
528 fac = *((u8 *)val);
529 if (fac <= 3) {
530 fac = (1 << (fac + 2));
531 if (fac > 0xf)
532 fac = 0xf;
533 for (i = 0; i < 4; i++) {
534 if ((reg[i] & 0xf0) > (fac << 4))
535 reg[i] = (reg[i] & 0x0f) |
536 (fac << 4);
537 if ((reg[i] & 0x0f) > fac)
538 reg[i] = (reg[i] & 0xf0) | fac;
539 rtl_write_byte(rtlpriv,
540 (REG_AGGLEN_LMT + i),
541 reg[i]);
542 }
543 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
544 "Set HW_VAR_AMPDU_FACTOR:%#x\n", fac);
545 }
546 }
547 break;
548 case HW_VAR_AC_PARAM:{
549 u8 e_aci = *((u8 *)val);
550
551 if (rtlpci->acm_method != EACMWAY2_SW)
552 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL,
553 (u8 *)(&e_aci));
554 }
555 break;
556 case HW_VAR_ACM_CTRL:{
557 u8 e_aci = *((u8 *)val);
558 union aci_aifsn *aifs = (union aci_aifsn *)(&mac->ac[0].aifs);
559
560 u8 acm = aifs->f.acm;
561 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
562
563 acm_ctrl = acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
564
565 if (acm) {
566 switch (e_aci) {
567 case AC0_BE:
568 acm_ctrl |= ACMHW_BEQEN;
569 break;
570 case AC2_VI:
571 acm_ctrl |= ACMHW_VIQEN;
572 break;
573 case AC3_VO:
574 acm_ctrl |= ACMHW_VOQEN;
575 break;
576 default:
577 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
578 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
579 acm);
580 break;
581 }
582 } else {
583 switch (e_aci) {
584 case AC0_BE:
585 acm_ctrl &= (~ACMHW_BEQEN);
586 break;
587 case AC2_VI:
588 acm_ctrl &= (~ACMHW_VIQEN);
589 break;
590 case AC3_VO:
591 acm_ctrl &= (~ACMHW_BEQEN);
592 break;
593 default:
594 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
595 "switch case not process\n");
596 break;
597 }
598 }
599
600 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
601 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
602 acm_ctrl);
603 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
604 }
605 break;
606 case HW_VAR_RCR:{
607 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
608 rtlpci->receive_config = ((u32 *)(val))[0];
609 }
610 break;
611 case HW_VAR_RETRY_LIMIT:{
612 u8 retry_limit = ((u8 *)(val))[0];
613
614 rtl_write_word(rtlpriv, REG_RETRY_LIMIT,
615 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
616 retry_limit << RETRY_LIMIT_LONG_SHIFT);
617 }
618 break;
619 case HW_VAR_DUAL_TSF_RST:
620 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
621 break;
622 case HW_VAR_EFUSE_BYTES:
623 efuse->efuse_usedbytes = *((u16 *)val);
624 break;
625 case HW_VAR_EFUSE_USAGE:
626 efuse->efuse_usedpercentage = *((u8 *)val);
627 break;
628 case HW_VAR_IO_CMD:
629 rtl92ee_phy_set_io_cmd(hw, (*(enum io_type *)val));
630 break;
631 case HW_VAR_SET_RPWM:{
632 u8 rpwm_val;
633
634 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
635 udelay(1);
636
637 if (rpwm_val & BIT(7)) {
638 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, (*(u8 *)val));
639 } else {
640 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
641 ((*(u8 *)val) | BIT(7)));
642 }
643 }
644 break;
645 case HW_VAR_H2C_FW_PWRMODE:
646 rtl92ee_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
647 break;
648 case HW_VAR_FW_PSMODE_STATUS:
649 ppsc->fw_current_inpsmode = *((bool *)val);
650 break;
651 case HW_VAR_RESUME_CLK_ON:
652 _rtl92ee_set_fw_ps_rf_on(hw);
653 break;
654 case HW_VAR_FW_LPS_ACTION:{
655 bool b_enter_fwlps = *((bool *)val);
656
657 if (b_enter_fwlps)
658 _rtl92ee_fwlps_enter(hw);
659 else
660 _rtl92ee_fwlps_leave(hw);
661 }
662 break;
663 case HW_VAR_H2C_FW_JOINBSSRPT:{
664 u8 mstatus = (*(u8 *)val);
665
666 if (mstatus == RT_MEDIA_CONNECT) {
667 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
668 _rtl92ee_download_rsvd_page(hw);
669 }
670 rtl92ee_set_fw_media_status_rpt_cmd(hw, mstatus);
671 }
672 break;
673 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
674 rtl92ee_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
675 break;
676 case HW_VAR_AID:{
677 u16 u2btmp;
678
679 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
680 u2btmp &= 0xC000;
681 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT,
682 (u2btmp | mac->assoc_id));
683 }
684 break;
685 case HW_VAR_CORRECT_TSF:{
686 u8 btype_ibss = ((u8 *)(val))[0];
687
688 if (btype_ibss)
689 _rtl92ee_stop_tx_beacon(hw);
690
691 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(3));
692
693 rtl_write_dword(rtlpriv, REG_TSFTR,
694 (u32)(mac->tsf & 0xffffffff));
695 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
696 (u32)((mac->tsf >> 32) & 0xffffffff));
697
698 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
699
700 if (btype_ibss)
701 _rtl92ee_resume_tx_beacon(hw);
702 }
703 break;
704 case HW_VAR_KEEP_ALIVE: {
705 u8 array[2];
706
707 array[0] = 0xff;
708 array[1] = *((u8 *)val);
709 rtl92ee_fill_h2c_cmd(hw, H2C_92E_KEEP_ALIVE_CTRL, 2, array);
710 }
711 break;
712 default:
713 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
714 "switch case not process %x\n", variable);
715 break;
716 }
717}
718
719static bool _rtl92ee_llt_table_init(struct ieee80211_hw *hw)
720{
721 struct rtl_priv *rtlpriv = rtl_priv(hw);
722 u8 txpktbuf_bndy;
723 u8 u8tmp, testcnt = 0;
724
725 txpktbuf_bndy = 0xFA;
726
727 rtl_write_dword(rtlpriv, REG_RQPN, 0x80E90808);
728
729 rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy);
730 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x3d00 - 1);
731
732 rtl_write_byte(rtlpriv, REG_DWBCN0_CTRL + 1, txpktbuf_bndy);
733 rtl_write_byte(rtlpriv, REG_DWBCN1_CTRL + 1, txpktbuf_bndy);
734
735 rtl_write_byte(rtlpriv, REG_BCNQ_BDNY, txpktbuf_bndy);
736 rtl_write_byte(rtlpriv, REG_BCNQ1_BDNY, txpktbuf_bndy);
737
738 rtl_write_byte(rtlpriv, REG_MGQ_BDNY, txpktbuf_bndy);
739 rtl_write_byte(rtlpriv, 0x45D, txpktbuf_bndy);
740
741 rtl_write_byte(rtlpriv, REG_PBP, 0x31);
742 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
743
744 u8tmp = rtl_read_byte(rtlpriv, REG_AUTO_LLT + 2);
745 rtl_write_byte(rtlpriv, REG_AUTO_LLT + 2, u8tmp | BIT(0));
746
747 while (u8tmp & BIT(0)) {
748 u8tmp = rtl_read_byte(rtlpriv, REG_AUTO_LLT + 2);
749 udelay(10);
750 testcnt++;
751 if (testcnt > 10)
752 break;
753 }
754
755 return true;
756}
757
758static void _rtl92ee_gen_refresh_led_state(struct ieee80211_hw *hw)
759{
760 struct rtl_priv *rtlpriv = rtl_priv(hw);
761 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
762 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
763 struct rtl_led *pled0 = &pcipriv->ledctl.sw_led0;
764
765 if (rtlpriv->rtlhal.up_first_time)
766 return;
767
768 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
769 rtl92ee_sw_led_on(hw, pled0);
770 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
771 rtl92ee_sw_led_on(hw, pled0);
772 else
773 rtl92ee_sw_led_off(hw, pled0);
774}
775
776static bool _rtl92ee_init_mac(struct ieee80211_hw *hw)
777{
778 struct rtl_priv *rtlpriv = rtl_priv(hw);
779 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
780 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
781
782 u8 bytetmp;
783 u16 wordtmp;
784 u32 dwordtmp;
785
786 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0);
787
788 dwordtmp = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
789 if (dwordtmp & BIT(24)) {
790 rtl_write_byte(rtlpriv, 0x7c, 0xc3);
791 } else {
792 bytetmp = rtl_read_byte(rtlpriv, 0x16);
793 rtl_write_byte(rtlpriv, 0x16, bytetmp | BIT(4) | BIT(6));
794 rtl_write_byte(rtlpriv, 0x7c, 0x83);
795 }
796 /* 1. 40Mhz crystal source*/
797 bytetmp = rtl_read_byte(rtlpriv, REG_AFE_CTRL2);
798 bytetmp &= 0xfb;
799 rtl_write_byte(rtlpriv, REG_AFE_CTRL2, bytetmp);
800
801 dwordtmp = rtl_read_dword(rtlpriv, REG_AFE_CTRL4);
802 dwordtmp &= 0xfffffc7f;
803 rtl_write_dword(rtlpriv, REG_AFE_CTRL4, dwordtmp);
804
805 /* 2. 92E AFE parameter
806 * MP chip then check version
807 */
808 bytetmp = rtl_read_byte(rtlpriv, REG_AFE_CTRL2);
809 bytetmp &= 0xbf;
810 rtl_write_byte(rtlpriv, REG_AFE_CTRL2, bytetmp);
811
812 dwordtmp = rtl_read_dword(rtlpriv, REG_AFE_CTRL4);
813 dwordtmp &= 0xffdfffff;
814 rtl_write_dword(rtlpriv, REG_AFE_CTRL4, dwordtmp);
815
816 /* HW Power on sequence */
817 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
818 PWR_INTF_PCI_MSK,
819 RTL8192E_NIC_ENABLE_FLOW)) {
820 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
821 "init MAC Fail as rtl_hal_pwrseqcmdparsing\n");
822 return false;
823 }
824
825 /* Release MAC IO register reset */
826 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
827 bytetmp = 0xff;
828 rtl_write_byte(rtlpriv, REG_CR, bytetmp);
829 mdelay(2);
830 bytetmp = 0x7f;
831 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
832 mdelay(2);
833
834 /* Add for wakeup online */
835 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
836 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp | BIT(3));
837 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
838 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp & (~BIT(4)));
839 /* Release MAC IO register reset */
840 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
841
842 if (!rtlhal->mac_func_enable) {
843 if (_rtl92ee_llt_table_init(hw) == false) {
844 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
845 "LLT table init fail\n");
846 return false;
847 }
848 }
849
850 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
851 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
852
853 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
854 wordtmp &= 0xf;
855 wordtmp |= 0xF5B1;
856 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
857 /* Reported Tx status from HW for rate adaptive.*/
858 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
859
860 /* Set RCR register */
861 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
862 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xffff);
863
864 /* Set TCR register */
865 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
866
867 /* Set TX/RX descriptor physical address(from OS API). */
868 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
869 ((u64)rtlpci->tx_ring[BEACON_QUEUE].buffer_desc_dma) &
870 DMA_BIT_MASK(32));
871 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
872 (u64)rtlpci->tx_ring[MGNT_QUEUE].buffer_desc_dma &
873 DMA_BIT_MASK(32));
874 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
875 (u64)rtlpci->tx_ring[VO_QUEUE].buffer_desc_dma &
876 DMA_BIT_MASK(32));
877 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
878 (u64)rtlpci->tx_ring[VI_QUEUE].buffer_desc_dma &
879 DMA_BIT_MASK(32));
880
881 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
882 (u64)rtlpci->tx_ring[BE_QUEUE].buffer_desc_dma &
883 DMA_BIT_MASK(32));
884
885 dwordtmp = rtl_read_dword(rtlpriv, REG_BEQ_DESA);
886
887 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
888 (u64)rtlpci->tx_ring[BK_QUEUE].buffer_desc_dma &
889 DMA_BIT_MASK(32));
890 rtl_write_dword(rtlpriv, REG_HQ0_DESA,
891 (u64)rtlpci->tx_ring[HIGH_QUEUE].buffer_desc_dma &
892 DMA_BIT_MASK(32));
893
894 rtl_write_dword(rtlpriv, REG_RX_DESA,
895 (u64)rtlpci->rx_ring[RX_MPDU_QUEUE].dma &
896 DMA_BIT_MASK(32));
897
898 /* if we want to support 64 bit DMA, we should set it here,
899 * but now we do not support 64 bit DMA
900 */
901
902 rtl_write_dword(rtlpriv, REG_TSFTIMER_HCI, 0x3fffffff);
903
904 bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 3);
905 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, bytetmp | 0xF7);
906
907 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
908
909 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
910
911 rtl_write_word(rtlpriv, REG_MGQ_TXBD_NUM,
912 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
913 rtl_write_word(rtlpriv, REG_VOQ_TXBD_NUM,
914 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
915 rtl_write_word(rtlpriv, REG_VIQ_TXBD_NUM,
916 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
917 rtl_write_word(rtlpriv, REG_BEQ_TXBD_NUM,
918 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
919 rtl_write_word(rtlpriv, REG_VOQ_TXBD_NUM,
920 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
921 rtl_write_word(rtlpriv, REG_BKQ_TXBD_NUM,
922 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
923 rtl_write_word(rtlpriv, REG_HI0Q_TXBD_NUM,
924 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
925 rtl_write_word(rtlpriv, REG_HI1Q_TXBD_NUM,
926 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
927 rtl_write_word(rtlpriv, REG_HI2Q_TXBD_NUM,
928 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
929 rtl_write_word(rtlpriv, REG_HI3Q_TXBD_NUM,
930 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
931 rtl_write_word(rtlpriv, REG_HI4Q_TXBD_NUM,
932 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
933 rtl_write_word(rtlpriv, REG_HI5Q_TXBD_NUM,
934 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
935 rtl_write_word(rtlpriv, REG_HI6Q_TXBD_NUM,
936 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
937 rtl_write_word(rtlpriv, REG_HI7Q_TXBD_NUM,
938 TX_DESC_NUM_92E | ((RTL8192EE_SEG_NUM << 12) & 0x3000));
939 /*Rx*/
940#if (DMA_IS_64BIT == 1)
941 rtl_write_word(rtlpriv, REG_RX_RXBD_NUM,
942 RX_DESC_NUM_92E |
943 ((RTL8192EE_SEG_NUM << 13) & 0x6000) | 0x8000);
944#else
945 rtl_write_word(rtlpriv, REG_RX_RXBD_NUM,
946 RX_DESC_NUM_92E |
947 ((RTL8192EE_SEG_NUM << 13) & 0x6000) | 0x0000);
948#endif
949
950 rtl_write_dword(rtlpriv, REG_TSFTIMER_HCI, 0XFFFFFFFF);
951
952 _rtl92ee_gen_refresh_led_state(hw);
953 return true;
954}
955
956static void _rtl92ee_hw_configure(struct ieee80211_hw *hw)
957{
958 struct rtl_priv *rtlpriv = rtl_priv(hw);
959 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
960 u32 reg_rrsr;
961
962 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
963 /* Init value for RRSR. */
964 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
965
966 /* ARFB table 9 for 11ac 5G 2SS */
967 rtl_write_dword(rtlpriv, REG_ARFR0, 0x00000010);
968 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0x3e0ff000);
969
970 /* ARFB table 10 for 11ac 5G 1SS */
971 rtl_write_dword(rtlpriv, REG_ARFR1, 0x00000010);
972 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x000ff000);
973
974 /* Set SLOT time */
975 rtl_write_byte(rtlpriv, REG_SLOT, 0x09);
976
977 /* CF-End setting. */
978 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F80);
979
980 /* Set retry limit */
981 rtl_write_word(rtlpriv, REG_RETRY_LIMIT, 0x0707);
982
983 /* BAR settings */
984 rtl_write_dword(rtlpriv, REG_BAR_MODE_CTRL, 0x0201ffff);
985
986 /* Set Data / Response auto rate fallack retry count */
987 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
988 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
989 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
990 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
991
992 /* Beacon related, for rate adaptive */
993 rtl_write_byte(rtlpriv, REG_ATIMWND, 0x2);
994 rtl_write_byte(rtlpriv, REG_BCN_MAX_ERR, 0xff);
995
996 rtlpci->reg_bcn_ctrl_val = 0x1d;
997 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
998
999 /* Marked out by Bruce, 2010-09-09.
1000 * This register is configured for the 2nd Beacon (multiple BSSID).
1001 * We shall disable this register if we only support 1 BSSID.
1002 * vivi guess 92d also need this, also 92d now doesnot set this reg
1003 */
1004 rtl_write_byte(rtlpriv, REG_BCN_CTRL_1, 0);
1005
1006 /* TBTT prohibit hold time. Suggested by designer TimChen. */
1007 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); /* 8 ms */
1008
1009 rtl_write_byte(rtlpriv, REG_PIFS, 0);
1010 rtl_write_byte(rtlpriv, REG_AGGR_BREAK_TIME, 0x16);
1011
1012 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
1013 rtl_write_word(rtlpriv, REG_PROT_MODE_CTRL, 0x08ff);
1014
1015 /* For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
1016 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
1017
1018 /* ACKTO for IOT issue. */
1019 rtl_write_byte(rtlpriv, REG_ACKTO, 0x40);
1020
1021 /* Set Spec SIFS (used in NAV) */
1022 rtl_write_word(rtlpriv, REG_SPEC_SIFS, 0x100a);
1023 rtl_write_word(rtlpriv, REG_MAC_SPEC_SIFS, 0x100a);
1024
1025 /* Set SIFS for CCK */
1026 rtl_write_word(rtlpriv, REG_SIFS_CTX, 0x100a);
1027
1028 /* Set SIFS for OFDM */
1029 rtl_write_word(rtlpriv, REG_SIFS_TRX, 0x100a);
1030
1031 /* Note Data sheet don't define */
1032 rtl_write_word(rtlpriv, 0x4C7, 0x80);
1033
1034 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
1035
1036 rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1717);
1037
1038 /* Set Multicast Address. 2009.01.07. by tynli. */
1039 rtl_write_dword(rtlpriv, REG_MAR, 0xffffffff);
1040 rtl_write_dword(rtlpriv, REG_MAR + 4, 0xffffffff);
1041}
1042
1043static void _rtl92ee_enable_aspm_back_door(struct ieee80211_hw *hw)
1044{
1045 struct rtl_priv *rtlpriv = rtl_priv(hw);
1046 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1047 u32 tmp32 = 0, count = 0;
1048 u8 tmp8 = 0;
1049
1050 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0x78);
1051 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x2);
1052 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1053 count = 0;
1054 while (tmp8 && count < 20) {
1055 udelay(10);
1056 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1057 count++;
1058 }
1059
1060 if (0 == tmp8) {
1061 tmp32 = rtl_read_dword(rtlpriv, REG_BACKDOOR_DBI_RDATA);
1062 if ((tmp32 & 0xff00) != 0x2000) {
1063 tmp32 &= 0xffff00ff;
1064 rtl_write_dword(rtlpriv, REG_BACKDOOR_DBI_WDATA,
1065 tmp32 | BIT(13));
1066 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0xf078);
1067 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x1);
1068
1069 tmp8 = rtl_read_byte(rtlpriv,
1070 REG_BACKDOOR_DBI_DATA + 2);
1071 count = 0;
1072 while (tmp8 && count < 20) {
1073 udelay(10);
1074 tmp8 = rtl_read_byte(rtlpriv,
1075 REG_BACKDOOR_DBI_DATA + 2);
1076 count++;
1077 }
1078 }
1079 }
1080
1081 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0x70c);
1082 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x2);
1083 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1084 count = 0;
1085 while (tmp8 && count < 20) {
1086 udelay(10);
1087 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1088 count++;
1089 }
1090 if (0 == tmp8) {
1091 tmp32 = rtl_read_dword(rtlpriv, REG_BACKDOOR_DBI_RDATA);
1092 rtl_write_dword(rtlpriv, REG_BACKDOOR_DBI_WDATA,
1093 tmp32 | BIT(31));
1094 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0xf70c);
1095 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x1);
1096 }
1097
1098 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1099 count = 0;
1100 while (tmp8 && count < 20) {
1101 udelay(10);
1102 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1103 count++;
1104 }
1105
1106 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0x718);
1107 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x2);
1108 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1109 count = 0;
1110 while (tmp8 && count < 20) {
1111 udelay(10);
1112 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1113 count++;
1114 }
1115 if (ppsc->support_backdoor || (0 == tmp8)) {
1116 tmp32 = rtl_read_dword(rtlpriv, REG_BACKDOOR_DBI_RDATA);
1117 rtl_write_dword(rtlpriv, REG_BACKDOOR_DBI_WDATA,
1118 tmp32 | BIT(11) | BIT(12));
1119 rtl_write_word(rtlpriv, REG_BACKDOOR_DBI_DATA, 0xf718);
1120 rtl_write_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2, 0x1);
1121 }
1122 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1123 count = 0;
1124 while (tmp8 && count < 20) {
1125 udelay(10);
1126 tmp8 = rtl_read_byte(rtlpriv, REG_BACKDOOR_DBI_DATA + 2);
1127 count++;
1128 }
1129}
1130
1131void rtl92ee_enable_hw_security_config(struct ieee80211_hw *hw)
1132{
1133 struct rtl_priv *rtlpriv = rtl_priv(hw);
1134 u8 sec_reg_value;
1135 u8 tmp;
1136
1137 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1138 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1139 rtlpriv->sec.pairwise_enc_algorithm,
1140 rtlpriv->sec.group_enc_algorithm);
1141
1142 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1143 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1144 "not open hw encryption\n");
1145 return;
1146 }
1147
1148 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1149
1150 if (rtlpriv->sec.use_defaultkey) {
1151 sec_reg_value |= SCR_TXUSEDK;
1152 sec_reg_value |= SCR_RXUSEDK;
1153 }
1154
1155 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1156
1157 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1158 rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1));
1159
1160 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1161 "The SECR-value %x\n", sec_reg_value);
1162
1163 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1164}
1165
1166int rtl92ee_hw_init(struct ieee80211_hw *hw)
1167{
1168 struct rtl_priv *rtlpriv = rtl_priv(hw);
1169 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1170 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1171 struct rtl_phy *rtlphy = &rtlpriv->phy;
1172 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1173 bool rtstatus = true;
1174 int err = 0;
1175 u8 tmp_u1b, u1byte;
1176 u32 tmp_u4b;
1177
1178 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, " Rtl8192EE hw init\n");
1179 rtlpriv->rtlhal.being_init_adapter = true;
1180 rtlpriv->intf_ops->disable_aspm(hw);
1181
1182 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CLKR+1);
1183 u1byte = rtl_read_byte(rtlpriv, REG_CR);
1184 if ((tmp_u1b & BIT(3)) && (u1byte != 0 && u1byte != 0xEA)) {
1185 rtlhal->mac_func_enable = true;
1186 } else {
1187 rtlhal->mac_func_enable = false;
1188 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_92E;
1189 }
1190
1191 rtstatus = _rtl92ee_init_mac(hw);
1192
1193 rtl_write_byte(rtlpriv, 0x577, 0x03);
1194
1195 /*for Crystal 40 Mhz setting */
1196 rtl_write_byte(rtlpriv, REG_AFE_CTRL4, 0x2A);
1197 rtl_write_byte(rtlpriv, REG_AFE_CTRL4 + 1, 0x00);
1198 rtl_write_byte(rtlpriv, REG_AFE_CTRL2, 0x83);
1199
1200 /*Forced the antenna b to wifi */
1201 if (rtlpriv->btcoexist.btc_info.btcoexist == 1) {
1202 rtl_write_byte(rtlpriv, 0x64, 0);
1203 rtl_write_byte(rtlpriv, 0x65, 1);
1204 }
1205 if (!rtstatus) {
1206 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1207 err = 1;
1208 return err;
1209 }
1210 rtlhal->rx_tag = 0;
1211 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, 0x8000);
1212 err = rtl92ee_download_fw(hw, false);
1213 if (err) {
1214 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1215 "Failed to download FW. Init HW without FW now..\n");
1216 err = 1;
1217 rtlhal->fw_ready = false;
1218 return err;
1219 }
1220 rtlhal->fw_ready = true;
1221 /*fw related variable initialize */
1222 ppsc->fw_current_inpsmode = false;
1223 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_92E;
1224 rtlhal->fw_clk_change_in_progress = false;
1225 rtlhal->allow_sw_to_change_hwclc = false;
1226 rtlhal->last_hmeboxnum = 0;
1227
1228 rtl92ee_phy_mac_config(hw);
1229
1230 rtl92ee_phy_bb_config(hw);
1231
1232 rtl92ee_phy_rf_config(hw);
1233
1234 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, RF90_PATH_A,
1235 RF_CHNLBW, RFREG_OFFSET_MASK);
1236 rtlphy->rfreg_chnlval[1] = rtl_get_rfreg(hw, RF90_PATH_B,
1237 RF_CHNLBW, RFREG_OFFSET_MASK);
1238 rtlphy->backup_rf_0x1a = (u32)rtl_get_rfreg(hw, RF90_PATH_A, RF_RX_G1,
1239 RFREG_OFFSET_MASK);
1240 rtlphy->rfreg_chnlval[0] = (rtlphy->rfreg_chnlval[0] & 0xfffff3ff) |
1241 BIT(10) | BIT(11);
1242
1243 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK,
1244 rtlphy->rfreg_chnlval[0]);
1245 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK,
1246 rtlphy->rfreg_chnlval[0]);
1247
1248 /*---- Set CCK and OFDM Block "ON"----*/
1249 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1250 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1251
1252 /* Must set this,
1253 * otherwise the rx sensitivity will be very pool. Maddest
1254 */
1255 rtl_set_rfreg(hw, RF90_PATH_A, 0xB1, RFREG_OFFSET_MASK, 0x54418);
1256
1257 /*Set Hardware(MAC default setting.)*/
1258 _rtl92ee_hw_configure(hw);
1259
1260 rtlhal->mac_func_enable = true;
1261
1262 rtl_cam_reset_all_entry(hw);
1263 rtl92ee_enable_hw_security_config(hw);
1264
1265 ppsc->rfpwr_state = ERFON;
1266
1267 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1268 _rtl92ee_enable_aspm_back_door(hw);
1269 rtlpriv->intf_ops->enable_aspm(hw);
1270
1271 rtl92ee_bt_hw_init(hw);
1272
1273 rtlpriv->rtlhal.being_init_adapter = false;
1274
1275 if (ppsc->rfpwr_state == ERFON) {
1276 if (rtlphy->iqk_initialized) {
1277 rtl92ee_phy_iq_calibrate(hw, true);
1278 } else {
1279 rtl92ee_phy_iq_calibrate(hw, false);
1280 rtlphy->iqk_initialized = true;
1281 }
1282 }
1283
1284 rtlphy->rfpath_rx_enable[0] = true;
1285 if (rtlphy->rf_type == RF_2T2R)
1286 rtlphy->rfpath_rx_enable[1] = true;
1287
1288 efuse_one_byte_read(hw, 0x1FA, &tmp_u1b);
1289 if (!(tmp_u1b & BIT(0))) {
1290 rtl_set_rfreg(hw, RF90_PATH_A, 0x15, 0x0F, 0x05);
1291 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "PA BIAS path A\n");
1292 }
1293
1294 if ((!(tmp_u1b & BIT(1))) && (rtlphy->rf_type == RF_2T2R)) {
1295 rtl_set_rfreg(hw, RF90_PATH_B, 0x15, 0x0F, 0x05);
1296 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "PA BIAS path B\n");
1297 }
1298
1299 rtl_write_byte(rtlpriv, REG_NAV_UPPER, ((30000 + 127) / 128));
1300
1301 /*Fixed LDPC rx hang issue. */
1302 tmp_u4b = rtl_read_dword(rtlpriv, REG_SYS_SWR_CTRL1);
1303 rtl_write_byte(rtlpriv, REG_SYS_SWR_CTRL2, 0x75);
1304 tmp_u4b = (tmp_u4b & 0xfff00fff) | (0x7E << 12);
1305 rtl_write_dword(rtlpriv, REG_SYS_SWR_CTRL1, tmp_u4b);
1306
1307 rtl92ee_dm_init(hw);
1308
1309 rtl_write_dword(rtlpriv, 0x4fc, 0);
1310
1311 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1312 "end of Rtl8192EE hw init %x\n", err);
1313 return 0;
1314}
1315
1316static enum version_8192e _rtl92ee_read_chip_version(struct ieee80211_hw *hw)
1317{
1318 struct rtl_priv *rtlpriv = rtl_priv(hw);
1319 struct rtl_phy *rtlphy = &rtlpriv->phy;
1320 enum version_8192e version = VERSION_UNKNOWN;
1321 u32 value32;
1322
1323 rtlphy->rf_type = RF_2T2R;
1324
1325 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
1326 if (value32 & TRP_VAUX_EN)
1327 version = (enum version_8192e)VERSION_TEST_CHIP_2T2R_8192E;
1328 else
1329 version = (enum version_8192e)VERSION_NORMAL_CHIP_2T2R_8192E;
1330
1331 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1332 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1333 "RF_2T2R" : "RF_1T1R");
1334
1335 return version;
1336}
1337
1338static int _rtl92ee_set_media_status(struct ieee80211_hw *hw,
1339 enum nl80211_iftype type)
1340{
1341 struct rtl_priv *rtlpriv = rtl_priv(hw);
1342 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1343 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1344 u8 mode = MSR_NOLINK;
1345
1346 switch (type) {
1347 case NL80211_IFTYPE_UNSPECIFIED:
1348 mode = MSR_NOLINK;
1349 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1350 "Set Network type to NO LINK!\n");
1351 break;
1352 case NL80211_IFTYPE_ADHOC:
1353 case NL80211_IFTYPE_MESH_POINT:
1354 mode = MSR_ADHOC;
1355 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1356 "Set Network type to Ad Hoc!\n");
1357 break;
1358 case NL80211_IFTYPE_STATION:
1359 mode = MSR_INFRA;
1360 ledaction = LED_CTL_LINK;
1361 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1362 "Set Network type to STA!\n");
1363 break;
1364 case NL80211_IFTYPE_AP:
1365 mode = MSR_AP;
1366 ledaction = LED_CTL_LINK;
1367 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1368 "Set Network type to AP!\n");
1369 break;
1370 default:
1371 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1372 "Network type %d not support!\n", type);
1373 return 1;
1374 }
1375
1376 /* MSR_INFRA == Link in infrastructure network;
1377 * MSR_ADHOC == Link in ad hoc network;
1378 * Therefore, check link state is necessary.
1379 *
1380 * MSR_AP == AP mode; link state is not cared here.
1381 */
1382 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1383 mode = MSR_NOLINK;
1384 ledaction = LED_CTL_NO_LINK;
1385 }
1386
1387 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1388 _rtl92ee_stop_tx_beacon(hw);
1389 _rtl92ee_enable_bcn_sub_func(hw);
1390 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1391 _rtl92ee_resume_tx_beacon(hw);
1392 _rtl92ee_disable_bcn_sub_func(hw);
1393 } else {
1394 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1395 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1396 mode);
1397 }
1398
1399 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
1400 rtlpriv->cfg->ops->led_control(hw, ledaction);
1401 if (mode == MSR_AP)
1402 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1403 else
1404 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1405 return 0;
1406}
1407
1408void rtl92ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1409{
1410 struct rtl_priv *rtlpriv = rtl_priv(hw);
1411 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1412 u32 reg_rcr = rtlpci->receive_config;
1413
1414 if (rtlpriv->psc.rfpwr_state != ERFON)
1415 return;
1416
1417 if (check_bssid) {
1418 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1419 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1420 (u8 *)(&reg_rcr));
1421 _rtl92ee_set_bcn_ctrl_reg(hw, 0, BIT(4));
1422 } else {
1423 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1424 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(4), 0);
1425 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1426 (u8 *)(&reg_rcr));
1427 }
1428}
1429
1430int rtl92ee_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
1431{
1432 struct rtl_priv *rtlpriv = rtl_priv(hw);
1433
1434 if (_rtl92ee_set_media_status(hw, type))
1435 return -EOPNOTSUPP;
1436
1437 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1438 if (type != NL80211_IFTYPE_AP &&
1439 type != NL80211_IFTYPE_MESH_POINT)
1440 rtl92ee_set_check_bssid(hw, true);
1441 } else {
1442 rtl92ee_set_check_bssid(hw, false);
1443 }
1444
1445 return 0;
1446}
1447
1448/* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
1449void rtl92ee_set_qos(struct ieee80211_hw *hw, int aci)
1450{
1451 struct rtl_priv *rtlpriv = rtl_priv(hw);
1452
1453 rtl92ee_dm_init_edca_turbo(hw);
1454 switch (aci) {
1455 case AC1_BK:
1456 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1457 break;
1458 case AC0_BE:
1459 /* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4b_ac_param); */
1460 break;
1461 case AC2_VI:
1462 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
1463 break;
1464 case AC3_VO:
1465 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
1466 break;
1467 default:
1468 RT_ASSERT(false, "invalid aci: %d !\n", aci);
1469 break;
1470 }
1471}
1472
1473static void rtl92ee_clear_interrupt(struct ieee80211_hw *hw)
1474{
1475 struct rtl_priv *rtlpriv = rtl_priv(hw);
1476 u32 tmp;
1477
1478 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1479 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1480
1481 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1482 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1483
1484 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
1485 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
1486}
1487
1488void rtl92ee_enable_interrupt(struct ieee80211_hw *hw)
1489{
1490 struct rtl_priv *rtlpriv = rtl_priv(hw);
1491 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1492
1493 rtl92ee_clear_interrupt(hw);/*clear it here first*/
1494
1495 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1496 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1497 rtlpci->irq_enabled = true;
1498}
1499
1500void rtl92ee_disable_interrupt(struct ieee80211_hw *hw)
1501{
1502 struct rtl_priv *rtlpriv = rtl_priv(hw);
1503 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1504
1505 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1506 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1507 rtlpci->irq_enabled = false;
1508 /*synchronize_irq(rtlpci->pdev->irq);*/
1509}
1510
1511static void _rtl92ee_poweroff_adapter(struct ieee80211_hw *hw)
1512{
1513 struct rtl_priv *rtlpriv = rtl_priv(hw);
1514 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1515 u8 u1b_tmp;
1516
1517 rtlhal->mac_func_enable = false;
1518
1519 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "POWER OFF adapter\n");
1520
1521 /* Run LPS WL RFOFF flow */
1522 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1523 PWR_INTF_PCI_MSK, RTL8192E_NIC_LPS_ENTER_FLOW);
1524 /* turn off RF */
1525 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1526
1527 /* ==== Reset digital sequence ====== */
1528 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && rtlhal->fw_ready)
1529 rtl92ee_firmware_selfreset(hw);
1530
1531 /* Reset MCU */
1532 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1533 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1534
1535 /* reset MCU ready status */
1536 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1537
1538 /* HW card disable configuration. */
1539 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1540 PWR_INTF_PCI_MSK, RTL8192E_NIC_DISABLE_FLOW);
1541
1542 /* Reset MCU IO Wrapper */
1543 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1544 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1545 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1546 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp | BIT(0)));
1547
1548 /* lock ISO/CLK/Power control register */
1549 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0E);
1550}
1551
1552void rtl92ee_card_disable(struct ieee80211_hw *hw)
1553{
1554 struct rtl_priv *rtlpriv = rtl_priv(hw);
1555 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1556 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1557 enum nl80211_iftype opmode;
1558
1559 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "RTL8192ee card disable\n");
1560
1561 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1562
1563 mac->link_state = MAC80211_NOLINK;
1564 opmode = NL80211_IFTYPE_UNSPECIFIED;
1565
1566 _rtl92ee_set_media_status(hw, opmode);
1567
1568 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1569 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1570 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1571
1572 _rtl92ee_poweroff_adapter(hw);
1573
1574 /* after power off we should do iqk again */
1575 rtlpriv->phy.iqk_initialized = false;
1576}
1577
1578void rtl92ee_interrupt_recognized(struct ieee80211_hw *hw,
1579 u32 *p_inta, u32 *p_intb)
1580{
1581 struct rtl_priv *rtlpriv = rtl_priv(hw);
1582 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1583
1584 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
1585 rtl_write_dword(rtlpriv, ISR, *p_inta);
1586
1587 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
1588 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
1589}
1590
1591void rtl92ee_set_beacon_related_registers(struct ieee80211_hw *hw)
1592{
1593 struct rtl_priv *rtlpriv = rtl_priv(hw);
1594 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1595 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1596 u16 bcn_interval, atim_window;
1597
1598 bcn_interval = mac->beacon_interval;
1599 atim_window = 2; /*FIX MERGE */
1600 rtl92ee_disable_interrupt(hw);
1601 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1602 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1603 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1604 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1605 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1606 rtl_write_byte(rtlpriv, 0x606, 0x30);
1607 rtlpci->reg_bcn_ctrl_val |= BIT(3);
1608 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
1609}
1610
1611void rtl92ee_set_beacon_interval(struct ieee80211_hw *hw)
1612{
1613 struct rtl_priv *rtlpriv = rtl_priv(hw);
1614 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1615 u16 bcn_interval = mac->beacon_interval;
1616
1617 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
1618 "beacon_interval:%d\n", bcn_interval);
1619 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1620}
1621
1622void rtl92ee_update_interrupt_mask(struct ieee80211_hw *hw,
1623 u32 add_msr, u32 rm_msr)
1624{
1625 struct rtl_priv *rtlpriv = rtl_priv(hw);
1626 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1627
1628 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
1629 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
1630
1631 if (add_msr)
1632 rtlpci->irq_mask[0] |= add_msr;
1633 if (rm_msr)
1634 rtlpci->irq_mask[0] &= (~rm_msr);
1635 rtl92ee_disable_interrupt(hw);
1636 rtl92ee_enable_interrupt(hw);
1637}
1638
1639static u8 _rtl92ee_get_chnl_group(u8 chnl)
1640{
1641 u8 group = 0;
1642
1643 if (chnl <= 14) {
1644 if (1 <= chnl && chnl <= 2)
1645 group = 0;
1646 else if (3 <= chnl && chnl <= 5)
1647 group = 1;
1648 else if (6 <= chnl && chnl <= 8)
1649 group = 2;
1650 else if (9 <= chnl && chnl <= 11)
1651 group = 3;
1652 else if (12 <= chnl && chnl <= 14)
1653 group = 4;
1654 } else {
1655 if (36 <= chnl && chnl <= 42)
1656 group = 0;
1657 else if (44 <= chnl && chnl <= 48)
1658 group = 1;
1659 else if (50 <= chnl && chnl <= 58)
1660 group = 2;
1661 else if (60 <= chnl && chnl <= 64)
1662 group = 3;
1663 else if (100 <= chnl && chnl <= 106)
1664 group = 4;
1665 else if (108 <= chnl && chnl <= 114)
1666 group = 5;
1667 else if (116 <= chnl && chnl <= 122)
1668 group = 6;
1669 else if (124 <= chnl && chnl <= 130)
1670 group = 7;
1671 else if (132 <= chnl && chnl <= 138)
1672 group = 8;
1673 else if (140 <= chnl && chnl <= 144)
1674 group = 9;
1675 else if (149 <= chnl && chnl <= 155)
1676 group = 10;
1677 else if (157 <= chnl && chnl <= 161)
1678 group = 11;
1679 else if (165 <= chnl && chnl <= 171)
1680 group = 12;
1681 else if (173 <= chnl && chnl <= 177)
1682 group = 13;
1683 }
1684 return group;
1685}
1686
1687static void _rtl8192ee_read_power_value_fromprom(struct ieee80211_hw *hw,
1688 struct txpower_info_2g *pwr2g,
1689 struct txpower_info_5g *pwr5g,
1690 bool autoload_fail, u8 *hwinfo)
1691{
1692 struct rtl_priv *rtlpriv = rtl_priv(hw);
1693 u32 rf, addr = EEPROM_TX_PWR_INX, group, i = 0;
1694
1695 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1696 "hal_ReadPowerValueFromPROM92E(): PROMContent[0x%x]=0x%x\n",
1697 (addr + 1), hwinfo[addr + 1]);
1698 if (0xFF == hwinfo[addr+1]) /*YJ,add,120316*/
1699 autoload_fail = true;
1700
1701 if (autoload_fail) {
1702 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1703 "auto load fail : Use Default value!\n");
1704 for (rf = 0 ; rf < MAX_RF_PATH ; rf++) {
1705 /* 2.4G default value */
1706 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1707 pwr2g->index_cck_base[rf][group] = 0x2D;
1708 pwr2g->index_bw40_base[rf][group] = 0x2D;
1709 }
1710 for (i = 0; i < MAX_TX_COUNT; i++) {
1711 if (i == 0) {
1712 pwr2g->bw20_diff[rf][0] = 0x02;
1713 pwr2g->ofdm_diff[rf][0] = 0x04;
1714 } else {
1715 pwr2g->bw20_diff[rf][i] = 0xFE;
1716 pwr2g->bw40_diff[rf][i] = 0xFE;
1717 pwr2g->cck_diff[rf][i] = 0xFE;
1718 pwr2g->ofdm_diff[rf][i] = 0xFE;
1719 }
1720 }
1721
1722 /*5G default value*/
1723 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++)
1724 pwr5g->index_bw40_base[rf][group] = 0x2A;
1725
1726 for (i = 0; i < MAX_TX_COUNT; i++) {
1727 if (i == 0) {
1728 pwr5g->ofdm_diff[rf][0] = 0x04;
1729 pwr5g->bw20_diff[rf][0] = 0x00;
1730 pwr5g->bw80_diff[rf][0] = 0xFE;
1731 pwr5g->bw160_diff[rf][0] = 0xFE;
1732 } else {
1733 pwr5g->ofdm_diff[rf][0] = 0xFE;
1734 pwr5g->bw20_diff[rf][0] = 0xFE;
1735 pwr5g->bw40_diff[rf][0] = 0xFE;
1736 pwr5g->bw80_diff[rf][0] = 0xFE;
1737 pwr5g->bw160_diff[rf][0] = 0xFE;
1738 }
1739 }
1740 }
1741 return;
1742 }
1743
1744 rtl_priv(hw)->efuse.txpwr_fromeprom = true;
1745
1746 for (rf = 0 ; rf < MAX_RF_PATH ; rf++) {
1747 /*2.4G default value*/
1748 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1749 pwr2g->index_cck_base[rf][group] = hwinfo[addr++];
1750 if (pwr2g->index_cck_base[rf][group] == 0xFF)
1751 pwr2g->index_cck_base[rf][group] = 0x2D;
1752 }
1753 for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) {
1754 pwr2g->index_bw40_base[rf][group] = hwinfo[addr++];
1755 if (pwr2g->index_bw40_base[rf][group] == 0xFF)
1756 pwr2g->index_bw40_base[rf][group] = 0x2D;
1757 }
1758 for (i = 0; i < MAX_TX_COUNT; i++) {
1759 if (i == 0) {
1760 pwr2g->bw40_diff[rf][i] = 0;
1761 if (hwinfo[addr] == 0xFF) {
1762 pwr2g->bw20_diff[rf][i] = 0x02;
1763 } else {
1764 pwr2g->bw20_diff[rf][i] = (hwinfo[addr]
1765 & 0xf0) >> 4;
1766 if (pwr2g->bw20_diff[rf][i] & BIT(3))
1767 pwr2g->bw20_diff[rf][i] |= 0xF0;
1768 }
1769
1770 if (hwinfo[addr] == 0xFF) {
1771 pwr2g->ofdm_diff[rf][i] = 0x04;
1772 } else {
1773 pwr2g->ofdm_diff[rf][i] = (hwinfo[addr]
1774 & 0x0f);
1775 if (pwr2g->ofdm_diff[rf][i] & BIT(3))
1776 pwr2g->ofdm_diff[rf][i] |= 0xF0;
1777 }
1778 pwr2g->cck_diff[rf][i] = 0;
1779 addr++;
1780 } else {
1781 if (hwinfo[addr] == 0xFF) {
1782 pwr2g->bw40_diff[rf][i] = 0xFE;
1783 } else {
1784 pwr2g->bw40_diff[rf][i] = (hwinfo[addr]
1785 & 0xf0) >> 4;
1786 if (pwr2g->bw40_diff[rf][i] & BIT(3))
1787 pwr2g->bw40_diff[rf][i] |= 0xF0;
1788 }
1789
1790 if (hwinfo[addr] == 0xFF) {
1791 pwr2g->bw20_diff[rf][i] = 0xFE;
1792 } else {
1793 pwr2g->bw20_diff[rf][i] = (hwinfo[addr]
1794 & 0x0f);
1795 if (pwr2g->bw20_diff[rf][i] & BIT(3))
1796 pwr2g->bw20_diff[rf][i] |= 0xF0;
1797 }
1798 addr++;
1799
1800 if (hwinfo[addr] == 0xFF) {
1801 pwr2g->ofdm_diff[rf][i] = 0xFE;
1802 } else {
1803 pwr2g->ofdm_diff[rf][i] = (hwinfo[addr]
1804 & 0xf0) >> 4;
1805 if (pwr2g->ofdm_diff[rf][i] & BIT(3))
1806 pwr2g->ofdm_diff[rf][i] |= 0xF0;
1807 }
1808
1809 if (hwinfo[addr] == 0xFF) {
1810 pwr2g->cck_diff[rf][i] = 0xFE;
1811 } else {
1812 pwr2g->cck_diff[rf][i] = (hwinfo[addr]
1813 & 0x0f);
1814 if (pwr2g->cck_diff[rf][i] & BIT(3))
1815 pwr2g->cck_diff[rf][i] |= 0xF0;
1816 }
1817 addr++;
1818 }
1819 }
1820
1821 /*5G default value*/
1822 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
1823 pwr5g->index_bw40_base[rf][group] = hwinfo[addr++];
1824 if (pwr5g->index_bw40_base[rf][group] == 0xFF)
1825 pwr5g->index_bw40_base[rf][group] = 0xFE;
1826 }
1827
1828 for (i = 0; i < MAX_TX_COUNT; i++) {
1829 if (i == 0) {
1830 pwr5g->bw40_diff[rf][i] = 0;
1831
1832 if (hwinfo[addr] == 0xFF) {
1833 pwr5g->bw20_diff[rf][i] = 0;
1834 } else {
1835 pwr5g->bw20_diff[rf][0] = (hwinfo[addr]
1836 & 0xf0) >> 4;
1837 if (pwr5g->bw20_diff[rf][i] & BIT(3))
1838 pwr5g->bw20_diff[rf][i] |= 0xF0;
1839 }
1840
1841 if (hwinfo[addr] == 0xFF) {
1842 pwr5g->ofdm_diff[rf][i] = 0x04;
1843 } else {
1844 pwr5g->ofdm_diff[rf][0] = (hwinfo[addr]
1845 & 0x0f);
1846 if (pwr5g->ofdm_diff[rf][i] & BIT(3))
1847 pwr5g->ofdm_diff[rf][i] |= 0xF0;
1848 }
1849 addr++;
1850 } else {
1851 if (hwinfo[addr] == 0xFF) {
1852 pwr5g->bw40_diff[rf][i] = 0xFE;
1853 } else {
1854 pwr5g->bw40_diff[rf][i] = (hwinfo[addr]
1855 & 0xf0) >> 4;
1856 if (pwr5g->bw40_diff[rf][i] & BIT(3))
1857 pwr5g->bw40_diff[rf][i] |= 0xF0;
1858 }
1859
1860 if (hwinfo[addr] == 0xFF) {
1861 pwr5g->bw20_diff[rf][i] = 0xFE;
1862 } else {
1863 pwr5g->bw20_diff[rf][i] = (hwinfo[addr]
1864 & 0x0f);
1865 if (pwr5g->bw20_diff[rf][i] & BIT(3))
1866 pwr5g->bw20_diff[rf][i] |= 0xF0;
1867 }
1868 addr++;
1869 }
1870 }
1871
1872 if (hwinfo[addr] == 0xFF) {
1873 pwr5g->ofdm_diff[rf][1] = 0xFE;
1874 pwr5g->ofdm_diff[rf][2] = 0xFE;
1875 } else {
1876 pwr5g->ofdm_diff[rf][1] = (hwinfo[addr] & 0xf0) >> 4;
1877 pwr5g->ofdm_diff[rf][2] = (hwinfo[addr] & 0x0f);
1878 }
1879 addr++;
1880
1881 if (hwinfo[addr] == 0xFF)
1882 pwr5g->ofdm_diff[rf][3] = 0xFE;
1883 else
1884 pwr5g->ofdm_diff[rf][3] = (hwinfo[addr] & 0x0f);
1885 addr++;
1886
1887 for (i = 1; i < MAX_TX_COUNT; i++) {
1888 if (pwr5g->ofdm_diff[rf][i] == 0xFF)
1889 pwr5g->ofdm_diff[rf][i] = 0xFE;
1890 else if (pwr5g->ofdm_diff[rf][i] & BIT(3))
1891 pwr5g->ofdm_diff[rf][i] |= 0xF0;
1892 }
1893
1894 for (i = 0; i < MAX_TX_COUNT; i++) {
1895 if (hwinfo[addr] == 0xFF) {
1896 pwr5g->bw80_diff[rf][i] = 0xFE;
1897 } else {
1898 pwr5g->bw80_diff[rf][i] = (hwinfo[addr] & 0xf0)
1899 >> 4;
1900 if (pwr5g->bw80_diff[rf][i] & BIT(3))
1901 pwr5g->bw80_diff[rf][i] |= 0xF0;
1902 }
1903
1904 if (hwinfo[addr] == 0xFF) {
1905 pwr5g->bw160_diff[rf][i] = 0xFE;
1906 } else {
1907 pwr5g->bw160_diff[rf][i] =
1908 (hwinfo[addr] & 0x0f);
1909 if (pwr5g->bw160_diff[rf][i] & BIT(3))
1910 pwr5g->bw160_diff[rf][i] |= 0xF0;
1911 }
1912 addr++;
1913 }
1914 }
1915}
1916
1917static void _rtl92ee_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1918 bool autoload_fail, u8 *hwinfo)
1919{
1920 struct rtl_priv *rtlpriv = rtl_priv(hw);
1921 struct rtl_efuse *efu = rtl_efuse(rtl_priv(hw));
1922 struct txpower_info_2g pwr2g;
1923 struct txpower_info_5g pwr5g;
1924 u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
1925 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
1926 56, 58, 60, 62, 64, 100, 102, 104, 106,
1927 108, 110, 112, 114, 116, 118, 120, 122,
1928 124, 126, 128, 130, 132, 134, 136, 138,
1929 140, 142, 144, 149, 151, 153, 155, 157,
1930 159, 161, 163, 165, 167, 168, 169, 171,
1931 173, 175, 177
1932 };
1933 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
1934 42, 58, 106, 122, 138, 155, 171
1935 };
1936 u8 rf, idx;
1937 u8 i;
1938
1939 _rtl8192ee_read_power_value_fromprom(hw, &pwr2g, &pwr5g,
1940 autoload_fail, hwinfo);
1941
1942 for (rf = 0; rf < MAX_RF_PATH; rf++) {
1943 for (i = 0; i < 14; i++) {
1944 idx = _rtl92ee_get_chnl_group(i + 1);
1945
1946 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
1947 efu->txpwrlevel_cck[rf][i] =
1948 pwr2g.index_cck_base[rf][5];
1949 efu->txpwrlevel_ht40_1s[rf][i] =
1950 pwr2g.index_bw40_base[rf][idx];
1951 } else {
1952 efu->txpwrlevel_cck[rf][i] =
1953 pwr2g.index_cck_base[rf][idx];
1954 efu->txpwrlevel_ht40_1s[rf][i] =
1955 pwr2g.index_bw40_base[rf][idx];
1956 }
1957 }
1958 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
1959 idx = _rtl92ee_get_chnl_group(channel5g[i]);
1960 efu->txpwr_5g_bw40base[rf][i] =
1961 pwr5g.index_bw40_base[rf][idx];
1962 }
1963 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
1964 u8 upper, lower;
1965
1966 idx = _rtl92ee_get_chnl_group(channel5g_80m[i]);
1967 upper = pwr5g.index_bw40_base[rf][idx];
1968 lower = pwr5g.index_bw40_base[rf][idx + 1];
1969
1970 efu->txpwr_5g_bw80base[rf][i] = (upper + lower) / 2;
1971 }
1972 for (i = 0; i < MAX_TX_COUNT; i++) {
1973 efu->txpwr_cckdiff[rf][i] = pwr2g.cck_diff[rf][i];
1974 efu->txpwr_legacyhtdiff[rf][i] = pwr2g.ofdm_diff[rf][i];
1975 efu->txpwr_ht20diff[rf][i] = pwr2g.bw20_diff[rf][i];
1976 efu->txpwr_ht40diff[rf][i] = pwr2g.bw40_diff[rf][i];
1977
1978 efu->txpwr_5g_ofdmdiff[rf][i] = pwr5g.ofdm_diff[rf][i];
1979 efu->txpwr_5g_bw20diff[rf][i] = pwr5g.bw20_diff[rf][i];
1980 efu->txpwr_5g_bw40diff[rf][i] = pwr5g.bw40_diff[rf][i];
1981 efu->txpwr_5g_bw80diff[rf][i] = pwr5g.bw80_diff[rf][i];
1982 }
1983 }
1984
1985 if (!autoload_fail)
1986 efu->eeprom_thermalmeter = hwinfo[EEPROM_THERMAL_METER_92E];
1987 else
1988 efu->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1989
1990 if (efu->eeprom_thermalmeter == 0xff || autoload_fail) {
1991 efu->apk_thermalmeterignore = true;
1992 efu->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1993 }
1994
1995 efu->thermalmeter[0] = efu->eeprom_thermalmeter;
1996 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1997 "thermalmeter = 0x%x\n", efu->eeprom_thermalmeter);
1998
1999 if (!autoload_fail) {
2000 efu->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION_92E]
2001 & 0x07;
2002 if (hwinfo[EEPROM_RF_BOARD_OPTION_92E] == 0xFF)
2003 efu->eeprom_regulatory = 0;
2004 } else {
2005 efu->eeprom_regulatory = 0;
2006 }
2007 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2008 "eeprom_regulatory = 0x%x\n", efu->eeprom_regulatory);
2009}
2010
2011static void _rtl92ee_read_adapter_info(struct ieee80211_hw *hw)
2012{
2013 struct rtl_priv *rtlpriv = rtl_priv(hw);
2014 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2015 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2016 u16 i, usvalue;
2017 u8 hwinfo[HWSET_MAX_SIZE];
2018 u16 eeprom_id;
2019
2020 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
2021 rtl_efuse_shadow_map_update(hw);
2022
2023 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
2024 HWSET_MAX_SIZE);
2025 } else if (rtlefuse->epromtype == EEPROM_93C46) {
2026 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2027 "RTL819X Not boot from eeprom, check it !!");
2028 return;
2029 } else {
2030 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2031 "boot from neither eeprom nor efuse, check it !!");
2032 return;
2033 }
2034
2035 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
2036 hwinfo, HWSET_MAX_SIZE);
2037
2038 eeprom_id = *((u16 *)&hwinfo[0]);
2039 if (eeprom_id != RTL8192E_EEPROM_ID) {
2040 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2041 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
2042 rtlefuse->autoload_failflag = true;
2043 } else {
2044 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2045 rtlefuse->autoload_failflag = false;
2046 }
2047
2048 if (rtlefuse->autoload_failflag)
2049 return;
2050 /*VID DID SVID SDID*/
2051 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
2052 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
2053 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
2054 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
2055 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "EEPROMId = 0x%4x\n", eeprom_id);
2056 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2057 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
2058 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2059 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
2060 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2061 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
2062 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2063 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
2064 /*customer ID*/
2065 rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
2066 if (rtlefuse->eeprom_oemid == 0xFF)
2067 rtlefuse->eeprom_oemid = 0;
2068
2069 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2070 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
2071 /*EEPROM version*/
2072 rtlefuse->eeprom_version = *(u8 *)&hwinfo[EEPROM_VERSION];
2073 /*mac address*/
2074 for (i = 0; i < 6; i += 2) {
2075 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
2076 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
2077 }
2078
2079 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2080 "dev_addr: %pM\n", rtlefuse->dev_addr);
2081 /*channel plan */
2082 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
2083 /* set channel paln to world wide 13 */
2084 rtlefuse->channel_plan = COUNTRY_CODE_WORLD_WIDE_13;
2085 /*tx power*/
2086 _rtl92ee_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
2087 hwinfo);
2088
2089 rtl92ee_read_bt_coexist_info_from_hwpg(hw, rtlefuse->autoload_failflag,
2090 hwinfo);
2091
2092 /*board type*/
2093 rtlefuse->board_type = (((*(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION_92E])
2094 & 0xE0) >> 5);
2095 if ((*(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION_92E]) == 0xFF)
2096 rtlefuse->board_type = 0;
2097
2098 rtlhal->board_type = rtlefuse->board_type;
2099 /*parse xtal*/
2100 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_92E];
2101 if (hwinfo[EEPROM_XTAL_92E] == 0xFF)
2102 rtlefuse->crystalcap = 0x20;
2103
2104 /*antenna diversity*/
2105 rtlefuse->antenna_div_type = NO_ANTDIV;
2106 rtlefuse->antenna_div_cfg = 0;
2107
2108 if (rtlhal->oem_id == RT_CID_DEFAULT) {
2109 switch (rtlefuse->eeprom_oemid) {
2110 case EEPROM_CID_DEFAULT:
2111 if (rtlefuse->eeprom_did == 0x818B) {
2112 if ((rtlefuse->eeprom_svid == 0x10EC) &&
2113 (rtlefuse->eeprom_smid == 0x001B))
2114 rtlhal->oem_id = RT_CID_819X_LENOVO;
2115 } else {
2116 rtlhal->oem_id = RT_CID_DEFAULT;
2117 }
2118 break;
2119 default:
2120 rtlhal->oem_id = RT_CID_DEFAULT;
2121 break;
2122 }
2123 }
2124}
2125
2126static void _rtl92ee_hal_customized_behavior(struct ieee80211_hw *hw)
2127{
2128 struct rtl_priv *rtlpriv = rtl_priv(hw);
2129 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2130 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2131
2132 pcipriv->ledctl.led_opendrain = true;
2133
2134 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2135 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
2136}
2137
2138void rtl92ee_read_eeprom_info(struct ieee80211_hw *hw)
2139{
2140 struct rtl_priv *rtlpriv = rtl_priv(hw);
2141 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2142 struct rtl_phy *rtlphy = &rtlpriv->phy;
2143 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2144 u8 tmp_u1b;
2145
2146 rtlhal->version = _rtl92ee_read_chip_version(hw);
2147 if (get_rf_type(rtlphy) == RF_1T1R) {
2148 rtlpriv->dm.rfpath_rxenable[0] = true;
2149 } else {
2150 rtlpriv->dm.rfpath_rxenable[0] = true;
2151 rtlpriv->dm.rfpath_rxenable[1] = true;
2152 }
2153 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
2154 rtlhal->version);
2155 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
2156 if (tmp_u1b & BIT(4)) {
2157 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
2158 rtlefuse->epromtype = EEPROM_93C46;
2159 } else {
2160 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
2161 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
2162 }
2163 if (tmp_u1b & BIT(5)) {
2164 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
2165 rtlefuse->autoload_failflag = false;
2166 _rtl92ee_read_adapter_info(hw);
2167 } else {
2168 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
2169 }
2170 _rtl92ee_hal_customized_behavior(hw);
2171
2172 rtlphy->rfpath_rx_enable[0] = true;
2173 if (rtlphy->rf_type == RF_2T2R)
2174 rtlphy->rfpath_rx_enable[1] = true;
2175}
2176
2177static u8 _rtl92ee_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, u8 rate_index)
2178{
2179 u8 ret = 0;
2180
2181 switch (rate_index) {
2182 case RATR_INX_WIRELESS_NGB:
2183 ret = 0;
2184 break;
2185 case RATR_INX_WIRELESS_N:
2186 case RATR_INX_WIRELESS_NG:
2187 ret = 4;
2188 break;
2189 case RATR_INX_WIRELESS_NB:
2190 ret = 2;
2191 break;
2192 case RATR_INX_WIRELESS_GB:
2193 ret = 6;
2194 break;
2195 case RATR_INX_WIRELESS_G:
2196 ret = 7;
2197 break;
2198 case RATR_INX_WIRELESS_B:
2199 ret = 8;
2200 break;
2201 default:
2202 ret = 0;
2203 break;
2204 }
2205 return ret;
2206}
2207
2208static void rtl92ee_update_hal_rate_mask(struct ieee80211_hw *hw,
2209 struct ieee80211_sta *sta,
2210 u8 rssi_level)
2211{
2212 struct rtl_priv *rtlpriv = rtl_priv(hw);
2213 struct rtl_phy *rtlphy = &rtlpriv->phy;
2214 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2215 struct rtl_sta_info *sta_entry = NULL;
2216 u32 ratr_bitmap;
2217 u8 ratr_index;
2218 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
2219 ? 1 : 0;
2220 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2221 1 : 0;
2222 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2223 1 : 0;
2224 enum wireless_mode wirelessmode = 0;
2225 bool b_shortgi = false;
2226 u8 rate_mask[7] = {0};
2227 u8 macid = 0;
2228 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
2229 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2230 wirelessmode = sta_entry->wireless_mode;
2231 if (mac->opmode == NL80211_IFTYPE_STATION ||
2232 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2233 curtxbw_40mhz = mac->bw_40;
2234 else if (mac->opmode == NL80211_IFTYPE_AP ||
2235 mac->opmode == NL80211_IFTYPE_ADHOC)
2236 macid = sta->aid + 1;
2237
2238 ratr_bitmap = sta->supp_rates[0];
2239 if (mac->opmode == NL80211_IFTYPE_ADHOC)
2240 ratr_bitmap = 0xfff;
2241
2242 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
2243 sta->ht_cap.mcs.rx_mask[0] << 12);
2244
2245 switch (wirelessmode) {
2246 case WIRELESS_MODE_B:
2247 ratr_index = RATR_INX_WIRELESS_B;
2248 if (ratr_bitmap & 0x0000000c)
2249 ratr_bitmap &= 0x0000000d;
2250 else
2251 ratr_bitmap &= 0x0000000f;
2252 break;
2253 case WIRELESS_MODE_G:
2254 ratr_index = RATR_INX_WIRELESS_GB;
2255
2256 if (rssi_level == 1)
2257 ratr_bitmap &= 0x00000f00;
2258 else if (rssi_level == 2)
2259 ratr_bitmap &= 0x00000ff0;
2260 else
2261 ratr_bitmap &= 0x00000ff5;
2262 break;
2263 case WIRELESS_MODE_N_24G:
2264 if (curtxbw_40mhz)
2265 ratr_index = RATR_INX_WIRELESS_NGB;
2266 else
2267 ratr_index = RATR_INX_WIRELESS_NB;
2268
2269 if (rtlphy->rf_type == RF_1T1R) {
2270 if (curtxbw_40mhz) {
2271 if (rssi_level == 1)
2272 ratr_bitmap &= 0x000f0000;
2273 else if (rssi_level == 2)
2274 ratr_bitmap &= 0x000ff000;
2275 else
2276 ratr_bitmap &= 0x000ff015;
2277 } else {
2278 if (rssi_level == 1)
2279 ratr_bitmap &= 0x000f0000;
2280 else if (rssi_level == 2)
2281 ratr_bitmap &= 0x000ff000;
2282 else
2283 ratr_bitmap &= 0x000ff005;
2284 }
2285 } else {
2286 if (curtxbw_40mhz) {
2287 if (rssi_level == 1)
2288 ratr_bitmap &= 0x0f8f0000;
2289 else if (rssi_level == 2)
2290 ratr_bitmap &= 0x0ffff000;
2291 else
2292 ratr_bitmap &= 0x0ffff015;
2293 } else {
2294 if (rssi_level == 1)
2295 ratr_bitmap &= 0x0f8f0000;
2296 else if (rssi_level == 2)
2297 ratr_bitmap &= 0x0ffff000;
2298 else
2299 ratr_bitmap &= 0x0ffff005;
2300 }
2301 }
2302
2303 if ((curtxbw_40mhz && b_curshortgi_40mhz) ||
2304 (!curtxbw_40mhz && b_curshortgi_20mhz)) {
2305 if (macid == 0)
2306 b_shortgi = true;
2307 else if (macid == 1)
2308 b_shortgi = false;
2309 }
2310 break;
2311 default:
2312 ratr_index = RATR_INX_WIRELESS_NGB;
2313
2314 if (rtlphy->rf_type == RF_1T1R)
2315 ratr_bitmap &= 0x000ff0ff;
2316 else
2317 ratr_bitmap &= 0x0f8ff0ff;
2318 break;
2319 }
2320 ratr_index = _rtl92ee_mrate_idx_to_arfr_id(hw, ratr_index);
2321 sta_entry->ratr_index = ratr_index;
2322
2323 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2324 "ratr_bitmap :%x\n", ratr_bitmap);
2325 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2326 (ratr_index << 28);
2327 rate_mask[0] = macid;
2328 rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
2329 rate_mask[2] = curtxbw_40mhz;
2330 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
2331 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
2332 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
2333 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
2334 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2335 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
2336 ratr_index, ratr_bitmap, rate_mask[0], rate_mask[1],
2337 rate_mask[2], rate_mask[3], rate_mask[4],
2338 rate_mask[5], rate_mask[6]);
2339 rtl92ee_fill_h2c_cmd(hw, H2C_92E_RA_MASK, 7, rate_mask);
2340 _rtl92ee_set_bcn_ctrl_reg(hw, BIT(3), 0);
2341}
2342
2343void rtl92ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
2344 struct ieee80211_sta *sta, u8 rssi_level)
2345{
2346 struct rtl_priv *rtlpriv = rtl_priv(hw);
2347
2348 if (rtlpriv->dm.useramask)
2349 rtl92ee_update_hal_rate_mask(hw, sta, rssi_level);
2350}
2351
2352void rtl92ee_update_channel_access_setting(struct ieee80211_hw *hw)
2353{
2354 struct rtl_priv *rtlpriv = rtl_priv(hw);
2355 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2356 u16 sifs_timer;
2357
2358 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
2359 (u8 *)&mac->slot_time);
2360 if (!mac->ht_enable)
2361 sifs_timer = 0x0a0a;
2362 else
2363 sifs_timer = 0x0e0e;
2364 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2365}
2366
2367bool rtl92ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2368{
2369 *valid = 1;
2370 return true;
2371}
2372
2373void rtl92ee_set_key(struct ieee80211_hw *hw, u32 key_index,
2374 u8 *p_macaddr, bool is_group, u8 enc_algo,
2375 bool is_wepkey, bool clear_all)
2376{
2377 struct rtl_priv *rtlpriv = rtl_priv(hw);
2378 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2379 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2380 u8 *macaddr = p_macaddr;
2381 u32 entry_id = 0;
2382 bool is_pairwise = false;
2383
2384 static u8 cam_const_addr[4][6] = {
2385 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2386 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
2387 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
2388 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
2389 };
2390 static u8 cam_const_broad[] = {
2391 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
2392 };
2393
2394 if (clear_all) {
2395 u8 idx = 0;
2396 u8 cam_offset = 0;
2397 u8 clear_number = 5;
2398
2399 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
2400
2401 for (idx = 0; idx < clear_number; idx++) {
2402 rtl_cam_mark_invalid(hw, cam_offset + idx);
2403 rtl_cam_empty_entry(hw, cam_offset + idx);
2404
2405 if (idx < 5) {
2406 memset(rtlpriv->sec.key_buf[idx], 0,
2407 MAX_KEY_LEN);
2408 rtlpriv->sec.key_len[idx] = 0;
2409 }
2410 }
2411
2412 } else {
2413 switch (enc_algo) {
2414 case WEP40_ENCRYPTION:
2415 enc_algo = CAM_WEP40;
2416 break;
2417 case WEP104_ENCRYPTION:
2418 enc_algo = CAM_WEP104;
2419 break;
2420 case TKIP_ENCRYPTION:
2421 enc_algo = CAM_TKIP;
2422 break;
2423 case AESCCMP_ENCRYPTION:
2424 enc_algo = CAM_AES;
2425 break;
2426 default:
2427 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2428 "switch case not process\n");
2429 enc_algo = CAM_TKIP;
2430 break;
2431 }
2432
2433 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
2434 macaddr = cam_const_addr[key_index];
2435 entry_id = key_index;
2436 } else {
2437 if (is_group) {
2438 macaddr = cam_const_broad;
2439 entry_id = key_index;
2440 } else {
2441 if (mac->opmode == NL80211_IFTYPE_AP ||
2442 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
2443 entry_id = rtl_cam_get_free_entry(hw,
2444 p_macaddr);
2445 if (entry_id >= TOTAL_CAM_ENTRY) {
2446 RT_TRACE(rtlpriv, COMP_SEC,
2447 DBG_EMERG,
2448 "Can not find free hw security cam entry\n");
2449 return;
2450 }
2451 } else {
2452 entry_id = CAM_PAIRWISE_KEY_POSITION;
2453 }
2454
2455 key_index = PAIRWISE_KEYIDX;
2456 is_pairwise = true;
2457 }
2458 }
2459
2460 if (rtlpriv->sec.key_len[key_index] == 0) {
2461 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2462 "delete one entry, entry_id is %d\n",
2463 entry_id);
2464 if (mac->opmode == NL80211_IFTYPE_AP ||
2465 mac->opmode == NL80211_IFTYPE_MESH_POINT)
2466 rtl_cam_del_entry(hw, p_macaddr);
2467 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
2468 } else {
2469 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2470 "add one entry\n");
2471 if (is_pairwise) {
2472 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2473 "set Pairwiase key\n");
2474
2475 rtl_cam_add_one_entry(hw, macaddr, key_index,
2476 entry_id, enc_algo,
2477 CAM_CONFIG_NO_USEDK,
2478 rtlpriv->sec.key_buf[key_index]);
2479 } else {
2480 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2481 "set group key\n");
2482
2483 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2484 rtl_cam_add_one_entry(hw,
2485 rtlefuse->dev_addr,
2486 PAIRWISE_KEYIDX,
2487 CAM_PAIRWISE_KEY_POSITION,
2488 enc_algo, CAM_CONFIG_NO_USEDK,
2489 rtlpriv->sec.key_buf[entry_id]);
2490 }
2491
2492 rtl_cam_add_one_entry(hw, macaddr, key_index,
2493 entry_id, enc_algo,
2494 CAM_CONFIG_NO_USEDK,
2495 rtlpriv->sec.key_buf[entry_id]);
2496 }
2497 }
2498 }
2499}
2500
2501void rtl92ee_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2502 bool auto_load_fail, u8 *hwinfo)
2503{
2504 struct rtl_priv *rtlpriv = rtl_priv(hw);
2505 u8 value;
2506
2507 if (!auto_load_fail) {
2508 value = hwinfo[EEPROM_RF_BOARD_OPTION_92E];
2509 if (((value & 0xe0) >> 5) == 0x1)
2510 rtlpriv->btcoexist.btc_info.btcoexist = 1;
2511 else
2512 rtlpriv->btcoexist.btc_info.btcoexist = 0;
2513
2514 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8192E;
2515 rtlpriv->btcoexist.btc_info.ant_num = ANT_TOTAL_X2;
2516 } else {
2517 rtlpriv->btcoexist.btc_info.btcoexist = 1;
2518 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8192E;
2519 rtlpriv->btcoexist.btc_info.ant_num = ANT_TOTAL_X1;
2520 }
2521}
2522
2523void rtl92ee_bt_reg_init(struct ieee80211_hw *hw)
2524{
2525 struct rtl_priv *rtlpriv = rtl_priv(hw);
2526
2527 /* 0:Low, 1:High, 2:From Efuse. */
2528 rtlpriv->btcoexist.reg_bt_iso = 2;
2529 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2530 rtlpriv->btcoexist.reg_bt_sco = 3;
2531 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2532 rtlpriv->btcoexist.reg_bt_sco = 0;
2533}
2534
2535void rtl92ee_bt_hw_init(struct ieee80211_hw *hw)
2536{
2537 struct rtl_priv *rtlpriv = rtl_priv(hw);
2538
2539 if (rtlpriv->cfg->ops->get_btc_status())
2540 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
2541}
2542
2543void rtl92ee_suspend(struct ieee80211_hw *hw)
2544{
2545}
2546
2547void rtl92ee_resume(struct ieee80211_hw *hw)
2548{
2549}
2550
2551/* Turn on AAP (RCR:bit 0) for promicuous mode. */
2552void rtl92ee_allow_all_destaddr(struct ieee80211_hw *hw,
2553 bool allow_all_da, bool write_into_reg)
2554{
2555 struct rtl_priv *rtlpriv = rtl_priv(hw);
2556 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2557
2558 if (allow_all_da) /* Set BIT0 */
2559 rtlpci->receive_config |= RCR_AAP;
2560 else /* Clear BIT0 */
2561 rtlpci->receive_config &= ~RCR_AAP;
2562
2563 if (write_into_reg)
2564 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
2565
2566 RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD,
2567 "receive_config=0x%08X, write_into_reg=%d\n",
2568 rtlpci->receive_config, write_into_reg);
2569}
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/hw.h b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.h
new file mode 100644
index 000000000000..05413f189685
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/hw.h
@@ -0,0 +1,62 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_HW_H__
27#define __RTL92E_HW_H__
28
29void rtl92ee_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
30void rtl92ee_read_eeprom_info(struct ieee80211_hw *hw);
31void rtl92ee_interrupt_recognized(struct ieee80211_hw *hw,
32 u32 *p_inta, u32 *p_intb);
33int rtl92ee_hw_init(struct ieee80211_hw *hw);
34void rtl92ee_card_disable(struct ieee80211_hw *hw);
35void rtl92ee_enable_interrupt(struct ieee80211_hw *hw);
36void rtl92ee_disable_interrupt(struct ieee80211_hw *hw);
37int rtl92ee_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type);
38void rtl92ee_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid);
39void rtl92ee_set_qos(struct ieee80211_hw *hw, int aci);
40void rtl92ee_set_beacon_related_registers(struct ieee80211_hw *hw);
41void rtl92ee_set_beacon_interval(struct ieee80211_hw *hw);
42void rtl92ee_update_interrupt_mask(struct ieee80211_hw *hw,
43 u32 add_msr, u32 rm_msr);
44void rtl92ee_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
45void rtl92ee_update_hal_rate_tbl(struct ieee80211_hw *hw,
46 struct ieee80211_sta *sta, u8 rssi_level);
47void rtl92ee_update_channel_access_setting(struct ieee80211_hw *hw);
48bool rtl92ee_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
49void rtl92ee_enable_hw_security_config(struct ieee80211_hw *hw);
50void rtl92ee_set_key(struct ieee80211_hw *hw, u32 key_index,
51 u8 *p_macaddr, bool is_group, u8 enc_algo,
52 bool is_wepkey, bool clear_all);
53void rtl92ee_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
54 bool autoload_fail, u8 *hwinfo);
55void rtl92ee_bt_reg_init(struct ieee80211_hw *hw);
56void rtl92ee_bt_hw_init(struct ieee80211_hw *hw);
57void rtl92ee_suspend(struct ieee80211_hw *hw);
58void rtl92ee_resume(struct ieee80211_hw *hw);
59void rtl92ee_allow_all_destaddr(struct ieee80211_hw *hw, bool allow_all_da,
60 bool write_into_reg);
61void rtl92ee_fw_clk_off_timer_callback(unsigned long data);
62#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/led.c b/drivers/net/wireless/rtlwifi/rtl8192ee/led.c
new file mode 100644
index 000000000000..8388e371c8e2
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/led.c
@@ -0,0 +1,145 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "reg.h"
29#include "led.h"
30
31static void _rtl92ee_init_led(struct ieee80211_hw *hw,
32 struct rtl_led *pled, enum rtl_led_pin ledpin)
33{
34 pled->hw = hw;
35 pled->ledpin = ledpin;
36 pled->ledon = false;
37}
38
39void rtl92ee_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
40{
41 u32 ledcfg;
42 struct rtl_priv *rtlpriv = rtl_priv(hw);
43
44 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
45 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
46
47 switch (pled->ledpin) {
48 case LED_PIN_GPIO0:
49 break;
50 case LED_PIN_LED0:
51 ledcfg = rtl_read_dword(rtlpriv , REG_GPIO_PIN_CTRL);
52 ledcfg &= ~BIT(13);
53 ledcfg |= BIT(21);
54 ledcfg &= ~BIT(29);
55
56 rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, ledcfg);
57
58 break;
59 case LED_PIN_LED1:
60
61 break;
62 default:
63 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
64 "switch case not process\n");
65 break;
66 }
67 pled->ledon = true;
68}
69
70void rtl92ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
71{
72 struct rtl_priv *rtlpriv = rtl_priv(hw);
73 u32 ledcfg;
74
75 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
76 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
77
78 switch (pled->ledpin) {
79 case LED_PIN_GPIO0:
80 break;
81 case LED_PIN_LED0:
82
83 ledcfg = rtl_read_dword(rtlpriv , REG_GPIO_PIN_CTRL);
84 ledcfg |= ~BIT(21);
85 ledcfg &= ~BIT(29);
86 rtl_write_dword(rtlpriv, REG_GPIO_PIN_CTRL, ledcfg);
87
88 break;
89 case LED_PIN_LED1:
90
91 break;
92 default:
93 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
94 "switch case not process\n");
95 break;
96 }
97 pled->ledon = false;
98}
99
100void rtl92ee_init_sw_leds(struct ieee80211_hw *hw)
101{
102 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
103
104 _rtl92ee_init_led(hw, &pcipriv->ledctl.sw_led0, LED_PIN_LED0);
105 _rtl92ee_init_led(hw, &pcipriv->ledctl.sw_led1, LED_PIN_LED1);
106}
107
108static void _rtl92ee_sw_led_control(struct ieee80211_hw *hw,
109 enum led_ctl_mode ledaction)
110{
111 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
112 struct rtl_led *pLed0 = &pcipriv->ledctl.sw_led0;
113
114 switch (ledaction) {
115 case LED_CTL_POWER_ON:
116 case LED_CTL_LINK:
117 case LED_CTL_NO_LINK:
118 rtl92ee_sw_led_on(hw, pLed0);
119 break;
120 case LED_CTL_POWER_OFF:
121 rtl92ee_sw_led_off(hw, pLed0);
122 break;
123 default:
124 break;
125 }
126}
127
128void rtl92ee_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction)
129{
130 struct rtl_priv *rtlpriv = rtl_priv(hw);
131 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
132
133 if ((ppsc->rfoff_reason > RF_CHANGE_BY_PS) &&
134 (ledaction == LED_CTL_TX ||
135 ledaction == LED_CTL_RX ||
136 ledaction == LED_CTL_SITE_SURVEY ||
137 ledaction == LED_CTL_LINK ||
138 ledaction == LED_CTL_NO_LINK ||
139 ledaction == LED_CTL_START_TO_LINK ||
140 ledaction == LED_CTL_POWER_ON)) {
141 return;
142 }
143 RT_TRACE(rtlpriv, COMP_LED, DBG_TRACE, "ledaction %d,\n", ledaction);
144 _rtl92ee_sw_led_control(hw, ledaction);
145}
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/led.h b/drivers/net/wireless/rtlwifi/rtl8192ee/led.h
new file mode 100644
index 000000000000..8ef640a2ef7f
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/led.h
@@ -0,0 +1,34 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_LED_H__
27#define __RTL92E_LED_H__
28
29void rtl92ee_init_sw_leds(struct ieee80211_hw *hw);
30void rtl92ee_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled);
31void rtl92ee_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled);
32void rtl92ee_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction);
33
34#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/phy.c b/drivers/net/wireless/rtlwifi/rtl8192ee/phy.c
new file mode 100644
index 000000000000..a863a44f9e16
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/phy.c
@@ -0,0 +1,3219 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../ps.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "rf.h"
33#include "dm.h"
34#include "table.h"
35
36static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
37 enum radio_path rfpath, u32 offset);
38static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
39 enum radio_path rfpath, u32 offset,
40 u32 data);
41static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask);
42static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw);
43static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
44static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
45 u8 configtype);
46static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
47 u8 configtype);
48static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw);
49static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
50 u32 cmdtableidx, u32 cmdtablesz,
51 enum swchnlcmd_id cmdid,
52 u32 para1, u32 para2,
53 u32 msdelay);
54static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
55 u8 channel, u8 *stage,
56 u8 *step, u32 *delay);
57static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
58 enum wireless_mode wirelessmode,
59 u8 txpwridx);
60static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw);
61static void rtl92ee_phy_set_io(struct ieee80211_hw *hw);
62
63u32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
64{
65 struct rtl_priv *rtlpriv = rtl_priv(hw);
66 u32 returnvalue, originalvalue, bitshift;
67
68 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
69 "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask);
70 originalvalue = rtl_read_dword(rtlpriv, regaddr);
71 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
72 returnvalue = (originalvalue & bitmask) >> bitshift;
73
74 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
75 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
76 bitmask, regaddr, originalvalue);
77
78 return returnvalue;
79}
80
81void rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
82 u32 bitmask, u32 data)
83{
84 struct rtl_priv *rtlpriv = rtl_priv(hw);
85 u32 originalvalue, bitshift;
86
87 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
88 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
89 regaddr, bitmask, data);
90
91 if (bitmask != MASKDWORD) {
92 originalvalue = rtl_read_dword(rtlpriv, regaddr);
93 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
94 data = ((originalvalue & (~bitmask)) | (data << bitshift));
95 }
96
97 rtl_write_dword(rtlpriv, regaddr, data);
98
99 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
100 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
101 regaddr, bitmask, data);
102}
103
104u32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw,
105 enum radio_path rfpath, u32 regaddr, u32 bitmask)
106{
107 struct rtl_priv *rtlpriv = rtl_priv(hw);
108 u32 original_value, readback_value, bitshift;
109 unsigned long flags;
110
111 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
112 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
113 regaddr, rfpath, bitmask);
114
115 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
116
117 original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr);
118 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
119 readback_value = (original_value & bitmask) >> bitshift;
120
121 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
122
123 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
124 "regaddr(%#x),rfpath(%#x),bitmask(%#x),original_value(%#x)\n",
125 regaddr, rfpath, bitmask, original_value);
126
127 return readback_value;
128}
129
130void rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw,
131 enum radio_path rfpath,
132 u32 addr, u32 bitmask, u32 data)
133{
134 struct rtl_priv *rtlpriv = rtl_priv(hw);
135 u32 original_value, bitshift;
136 unsigned long flags;
137
138 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
139 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
140 addr, bitmask, data, rfpath);
141
142 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
143
144 if (bitmask != RFREG_OFFSET_MASK) {
145 original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr);
146 bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
147 data = (original_value & (~bitmask)) | (data << bitshift);
148 }
149
150 _rtl92ee_phy_rf_serial_write(hw, rfpath, addr, data);
151
152 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
153
154 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
155 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
156 addr, bitmask, data, rfpath);
157}
158
159static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
160 enum radio_path rfpath, u32 offset)
161{
162 struct rtl_priv *rtlpriv = rtl_priv(hw);
163 struct rtl_phy *rtlphy = &rtlpriv->phy;
164 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
165 u32 newoffset;
166 u32 tmplong, tmplong2;
167 u8 rfpi_enable = 0;
168 u32 retvalue;
169
170 offset &= 0xff;
171 newoffset = offset;
172 if (RT_CANNOT_IO(hw)) {
173 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n");
174 return 0xFFFFFFFF;
175 }
176 tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
177 if (rfpath == RF90_PATH_A)
178 tmplong2 = tmplong;
179 else
180 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
181 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
182 (newoffset << 23) | BLSSIREADEDGE;
183 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
184 tmplong & (~BLSSIREADEDGE));
185 mdelay(1);
186 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
187 mdelay(2);
188 if (rfpath == RF90_PATH_A)
189 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
190 BIT(8));
191 else if (rfpath == RF90_PATH_B)
192 rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
193 BIT(8));
194 if (rfpi_enable)
195 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
196 BLSSIREADBACKDATA);
197 else
198 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
199 BLSSIREADBACKDATA);
200 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
201 "RFR-%d Addr[0x%x]=0x%x\n",
202 rfpath, pphyreg->rf_rb, retvalue);
203 return retvalue;
204}
205
206static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
207 enum radio_path rfpath, u32 offset,
208 u32 data)
209{
210 u32 data_and_addr;
211 u32 newoffset;
212 struct rtl_priv *rtlpriv = rtl_priv(hw);
213 struct rtl_phy *rtlphy = &rtlpriv->phy;
214 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
215
216 if (RT_CANNOT_IO(hw)) {
217 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
218 return;
219 }
220 offset &= 0xff;
221 newoffset = offset;
222 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
223 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
224 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
225 "RFW-%d Addr[0x%x]=0x%x\n", rfpath,
226 pphyreg->rf3wire_offset, data_and_addr);
227}
228
229static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask)
230{
231 u32 i;
232
233 for (i = 0; i <= 31; i++) {
234 if (((bitmask >> i) & 0x1) == 1)
235 break;
236 }
237 return i;
238}
239
240bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw)
241{
242 return _rtl92ee_phy_config_mac_with_headerfile(hw);
243}
244
245bool rtl92ee_phy_bb_config(struct ieee80211_hw *hw)
246{
247 struct rtl_priv *rtlpriv = rtl_priv(hw);
248 bool rtstatus = true;
249 u16 regval;
250 u32 tmp;
251 u8 crystal_cap;
252
253 phy_init_bb_rf_register_def(hw);
254 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
255 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
256 regval | BIT(13) | BIT(0) | BIT(1));
257
258 rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
259 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
260 FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
261 FEN_BB_GLB_RSTN | FEN_BBRSTB);
262
263 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
264
265 tmp = rtl_read_dword(rtlpriv, 0x4c);
266 rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
267
268 rtstatus = _rtl92ee_phy_bb8192ee_config_parafile(hw);
269
270 crystal_cap = rtlpriv->efuse.eeprom_crystalcap & 0x3F;
271 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
272 (crystal_cap | (crystal_cap << 6)));
273 return rtstatus;
274}
275
276bool rtl92ee_phy_rf_config(struct ieee80211_hw *hw)
277{
278 return rtl92ee_phy_rf6052_config(hw);
279}
280
281static bool _check_condition(struct ieee80211_hw *hw,
282 const u32 condition)
283{
284 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
285 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
286 u32 _board = rtlefuse->board_type; /*need efuse define*/
287 u32 _interface = rtlhal->interface;
288 u32 _platform = 0x08;/*SupportPlatform */
289 u32 cond = condition;
290
291 if (condition == 0xCDCDCDCD)
292 return true;
293
294 cond = condition & 0xFF;
295 if ((_board != cond) && (cond != 0xFF))
296 return false;
297
298 cond = condition & 0xFF00;
299 cond = cond >> 8;
300 if ((_interface & cond) == 0 && cond != 0x07)
301 return false;
302
303 cond = condition & 0xFF0000;
304 cond = cond >> 16;
305 if ((_platform & cond) == 0 && cond != 0x0F)
306 return false;
307
308 return true;
309}
310
311static void _rtl92ee_config_rf_reg(struct ieee80211_hw *hw, u32 addr, u32 data,
312 enum radio_path rfpath, u32 regaddr)
313{
314 if (addr == 0xfe || addr == 0xffe) {
315 mdelay(50);
316 } else {
317 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
318 udelay(1);
319
320 if (addr == 0xb6) {
321 u32 getvalue;
322 u8 count = 0;
323
324 getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
325 udelay(1);
326
327 while ((getvalue >> 8) != (data >> 8)) {
328 count++;
329 rtl_set_rfreg(hw, rfpath, regaddr,
330 RFREG_OFFSET_MASK, data);
331 udelay(1);
332 getvalue = rtl_get_rfreg(hw, rfpath, addr,
333 MASKDWORD);
334 if (count > 5)
335 break;
336 }
337 }
338
339 if (addr == 0xb2) {
340 u32 getvalue;
341 u8 count = 0;
342
343 getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
344 udelay(1);
345
346 while (getvalue != data) {
347 count++;
348 rtl_set_rfreg(hw, rfpath, regaddr,
349 RFREG_OFFSET_MASK, data);
350 udelay(1);
351 rtl_set_rfreg(hw, rfpath, 0x18,
352 RFREG_OFFSET_MASK, 0x0fc07);
353 udelay(1);
354 getvalue = rtl_get_rfreg(hw, rfpath, addr,
355 MASKDWORD);
356 if (count > 5)
357 break;
358 }
359 }
360 }
361}
362
363static void _rtl92ee_config_rf_radio_a(struct ieee80211_hw *hw,
364 u32 addr, u32 data)
365{
366 u32 content = 0x1000; /*RF Content: radio_a_txt*/
367 u32 maskforphyset = (u32)(content & 0xE000);
368
369 _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_A,
370 addr | maskforphyset);
371}
372
373static void _rtl92ee_config_rf_radio_b(struct ieee80211_hw *hw,
374 u32 addr, u32 data)
375{
376 u32 content = 0x1001; /*RF Content: radio_b_txt*/
377 u32 maskforphyset = (u32)(content & 0xE000);
378
379 _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_B,
380 addr | maskforphyset);
381}
382
383static void _rtl92ee_config_bb_reg(struct ieee80211_hw *hw,
384 u32 addr, u32 data)
385{
386 if (addr == 0xfe)
387 mdelay(50);
388 else if (addr == 0xfd)
389 mdelay(5);
390 else if (addr == 0xfc)
391 mdelay(1);
392 else if (addr == 0xfb)
393 udelay(50);
394 else if (addr == 0xfa)
395 udelay(5);
396 else if (addr == 0xf9)
397 udelay(1);
398 else
399 rtl_set_bbreg(hw, addr, MASKDWORD , data);
400
401 udelay(1);
402}
403
404static void _rtl92ee_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
405{
406 struct rtl_priv *rtlpriv = rtl_priv(hw);
407 struct rtl_phy *rtlphy = &rtlpriv->phy;
408
409 u8 band = BAND_ON_2_4G, rf = 0, txnum = 0, sec = 0;
410
411 for (; band <= BAND_ON_5G; ++band)
412 for (; rf < TX_PWR_BY_RATE_NUM_RF; ++rf)
413 for (; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
414 for (; sec < TX_PWR_BY_RATE_NUM_SECTION; ++sec)
415 rtlphy->tx_power_by_rate_offset
416 [band][rf][txnum][sec] = 0;
417}
418
419static void _rtl92ee_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
420 u8 band, u8 path,
421 u8 rate_section, u8 txnum,
422 u8 value)
423{
424 struct rtl_priv *rtlpriv = rtl_priv(hw);
425 struct rtl_phy *rtlphy = &rtlpriv->phy;
426
427 if (path > RF90_PATH_D) {
428 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
429 "Invalid Rf Path %d\n", path);
430 return;
431 }
432
433 if (band == BAND_ON_2_4G) {
434 switch (rate_section) {
435 case CCK:
436 rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
437 break;
438 case OFDM:
439 rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
440 break;
441 case HT_MCS0_MCS7:
442 rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
443 break;
444 case HT_MCS8_MCS15:
445 rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
446 break;
447 default:
448 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
449 "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
450 rate_section, path, txnum);
451 break;
452 };
453 } else {
454 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
455 "Invalid Band %d\n", band);
456 }
457}
458
459static u8 _rtl92ee_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
460 u8 band, u8 path, u8 txnum,
461 u8 rate_section)
462{
463 struct rtl_priv *rtlpriv = rtl_priv(hw);
464 struct rtl_phy *rtlphy = &rtlpriv->phy;
465 u8 value = 0;
466
467 if (path > RF90_PATH_D) {
468 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
469 "Invalid Rf Path %d\n", path);
470 return 0;
471 }
472
473 if (band == BAND_ON_2_4G) {
474 switch (rate_section) {
475 case CCK:
476 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
477 break;
478 case OFDM:
479 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
480 break;
481 case HT_MCS0_MCS7:
482 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
483 break;
484 case HT_MCS8_MCS15:
485 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
486 break;
487 default:
488 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
489 "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
490 rate_section, path, txnum);
491 break;
492 };
493 } else {
494 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
495 "Invalid Band %d()\n", band);
496 }
497 return value;
498}
499
500static void _rtl92ee_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
501{
502 struct rtl_priv *rtlpriv = rtl_priv(hw);
503 struct rtl_phy *rtlphy = &rtlpriv->phy;
504 u16 raw = 0;
505 u8 base = 0, path = 0;
506
507 for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
508 if (path == RF90_PATH_A) {
509 raw = (u16)(rtlphy->tx_power_by_rate_offset
510 [BAND_ON_2_4G][path][RF_1TX][3] >> 24) &
511 0xFF;
512 base = (raw >> 4) * 10 + (raw & 0xF);
513 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
514 path, CCK, RF_1TX,
515 base);
516 } else if (path == RF90_PATH_B) {
517 raw = (u16)(rtlphy->tx_power_by_rate_offset
518 [BAND_ON_2_4G][path][RF_1TX][3] >> 0) &
519 0xFF;
520 base = (raw >> 4) * 10 + (raw & 0xF);
521 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
522 path, CCK, RF_1TX,
523 base);
524 }
525 raw = (u16)(rtlphy->tx_power_by_rate_offset
526 [BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF;
527 base = (raw >> 4) * 10 + (raw & 0xF);
528 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
529 OFDM, RF_1TX, base);
530
531 raw = (u16)(rtlphy->tx_power_by_rate_offset
532 [BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF;
533 base = (raw >> 4) * 10 + (raw & 0xF);
534 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
535 HT_MCS0_MCS7, RF_1TX,
536 base);
537
538 raw = (u16)(rtlphy->tx_power_by_rate_offset
539 [BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF;
540 base = (raw >> 4) * 10 + (raw & 0xF);
541 _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
542 HT_MCS8_MCS15, RF_2TX,
543 base);
544 }
545}
546
547static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
548 u8 end, u8 base)
549{
550 char i = 0;
551 u8 tmp = 0;
552 u32 temp_data = 0;
553
554 for (i = 3; i >= 0; --i) {
555 if (i >= start && i <= end) {
556 /* Get the exact value */
557 tmp = (u8)(*data >> (i * 8)) & 0xF;
558 tmp += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
559
560 /* Change the value to a relative value */
561 tmp = (tmp > base) ? tmp - base : base - tmp;
562 } else {
563 tmp = (u8)(*data >> (i * 8)) & 0xFF;
564 }
565 temp_data <<= 8;
566 temp_data |= tmp;
567 }
568 *data = temp_data;
569}
570
571static void phy_convert_txpwr_dbm_to_rel_val(struct ieee80211_hw *hw)
572{
573 struct rtl_priv *rtlpriv = rtl_priv(hw);
574 struct rtl_phy *rtlphy = &rtlpriv->phy;
575 u8 base = 0, rf = 0, band = BAND_ON_2_4G;
576
577 for (rf = RF90_PATH_A; rf <= RF90_PATH_B; ++rf) {
578 if (rf == RF90_PATH_A) {
579 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
580 rf, RF_1TX,
581 CCK);
582 _phy_convert_txpower_dbm_to_relative_value(
583 &rtlphy->tx_power_by_rate_offset
584 [band][rf][RF_1TX][2],
585 1, 1, base);
586 _phy_convert_txpower_dbm_to_relative_value(
587 &rtlphy->tx_power_by_rate_offset
588 [band][rf][RF_1TX][3],
589 1, 3, base);
590 } else if (rf == RF90_PATH_B) {
591 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
592 rf, RF_1TX,
593 CCK);
594 _phy_convert_txpower_dbm_to_relative_value(
595 &rtlphy->tx_power_by_rate_offset
596 [band][rf][RF_1TX][3],
597 0, 0, base);
598 _phy_convert_txpower_dbm_to_relative_value(
599 &rtlphy->tx_power_by_rate_offset
600 [band][rf][RF_1TX][2],
601 1, 3, base);
602 }
603 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
604 RF_1TX, OFDM);
605 _phy_convert_txpower_dbm_to_relative_value(
606 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][0],
607 0, 3, base);
608 _phy_convert_txpower_dbm_to_relative_value(
609 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][1],
610 0, 3, base);
611
612 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
613 RF_1TX,
614 HT_MCS0_MCS7);
615 _phy_convert_txpower_dbm_to_relative_value(
616 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][4],
617 0, 3, base);
618 _phy_convert_txpower_dbm_to_relative_value(
619 &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][5],
620 0, 3, base);
621
622 base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
623 RF_2TX,
624 HT_MCS8_MCS15);
625 _phy_convert_txpower_dbm_to_relative_value(
626 &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][6],
627 0, 3, base);
628
629 _phy_convert_txpower_dbm_to_relative_value(
630 &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][7],
631 0, 3, base);
632 }
633
634 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
635 "<==phy_convert_txpwr_dbm_to_rel_val()\n");
636}
637
638static void _rtl92ee_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
639{
640 _rtl92ee_phy_store_txpower_by_rate_base(hw);
641 phy_convert_txpwr_dbm_to_rel_val(hw);
642}
643
644static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw)
645{
646 struct rtl_priv *rtlpriv = rtl_priv(hw);
647 struct rtl_phy *rtlphy = &rtlpriv->phy;
648 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
649 bool rtstatus;
650
651 rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_PHY_REG);
652 if (!rtstatus) {
653 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
654 return false;
655 }
656
657 _rtl92ee_phy_init_tx_power_by_rate(hw);
658 if (!rtlefuse->autoload_failflag) {
659 rtlphy->pwrgroup_cnt = 0;
660 rtstatus =
661 phy_config_bb_with_pghdrfile(hw, BASEBAND_CONFIG_PHY_REG);
662 }
663 _rtl92ee_phy_txpower_by_rate_configuration(hw);
664 if (!rtstatus) {
665 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
666 return false;
667 }
668 rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_AGC_TAB);
669 if (!rtstatus) {
670 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
671 return false;
672 }
673 rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
674 RFPGA0_XA_HSSIPARAMETER2,
675 0x200));
676
677 return true;
678}
679
680static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
681{
682 struct rtl_priv *rtlpriv = rtl_priv(hw);
683 u32 i;
684 u32 arraylength;
685 u32 *ptrarray;
686
687 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8192EMACPHY_Array\n");
688 arraylength = RTL8192EE_MAC_ARRAY_LEN;
689 ptrarray = RTL8192EE_MAC_ARRAY;
690 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
691 "Img:RTL8192EE_MAC_ARRAY LEN %d\n" , arraylength);
692 for (i = 0; i < arraylength; i = i + 2)
693 rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]);
694 return true;
695}
696
697#define READ_NEXT_PAIR(v1, v2, i) \
698 do { \
699 i += 2; \
700 v1 = array[i]; \
701 v2 = array[i+1]; \
702 } while (0)
703
704static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
705 u8 configtype)
706{
707 int i;
708 u32 *array;
709 u16 len;
710 struct rtl_priv *rtlpriv = rtl_priv(hw);
711 u32 v1 = 0, v2 = 0;
712
713 if (configtype == BASEBAND_CONFIG_PHY_REG) {
714 len = RTL8192EE_PHY_REG_ARRAY_LEN;
715 array = RTL8192EE_PHY_REG_ARRAY;
716
717 for (i = 0; i < len; i = i + 2) {
718 v1 = array[i];
719 v2 = array[i+1];
720 if (v1 < 0xcdcdcdcd) {
721 _rtl92ee_config_bb_reg(hw, v1, v2);
722 } else {/*This line is the start line of branch.*/
723 /* to protect READ_NEXT_PAIR not overrun */
724 if (i >= len - 2)
725 break;
726
727 if (!_check_condition(hw , array[i])) {
728 /*Discard the following pairs*/
729 READ_NEXT_PAIR(v1, v2, i);
730 while (v2 != 0xDEAD &&
731 v2 != 0xCDEF &&
732 v2 != 0xCDCD && i < len - 2) {
733 READ_NEXT_PAIR(v1, v2, i);
734 }
735 i -= 2; /* prevent from for-loop += 2*/
736 } else {
737 /* Configure matched pairs and
738 * skip to end of if-else.
739 */
740 READ_NEXT_PAIR(v1, v2, i);
741 while (v2 != 0xDEAD &&
742 v2 != 0xCDEF &&
743 v2 != 0xCDCD && i < len - 2) {
744 _rtl92ee_config_bb_reg(hw, v1,
745 v2);
746 READ_NEXT_PAIR(v1, v2, i);
747 }
748
749 while (v2 != 0xDEAD && i < len - 2)
750 READ_NEXT_PAIR(v1, v2, i);
751 }
752 }
753 }
754 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
755 len = RTL8192EE_AGC_TAB_ARRAY_LEN;
756 array = RTL8192EE_AGC_TAB_ARRAY;
757
758 for (i = 0; i < len; i = i + 2) {
759 v1 = array[i];
760 v2 = array[i+1];
761 if (v1 < 0xCDCDCDCD) {
762 rtl_set_bbreg(hw, array[i], MASKDWORD,
763 array[i + 1]);
764 udelay(1);
765 continue;
766 } else{/*This line is the start line of branch.*/
767 /* to protect READ_NEXT_PAIR not overrun */
768 if (i >= len - 2)
769 break;
770
771 if (!_check_condition(hw , array[i])) {
772 /*Discard the following pairs*/
773 READ_NEXT_PAIR(v1, v2, i);
774 while (v2 != 0xDEAD &&
775 v2 != 0xCDEF &&
776 v2 != 0xCDCD &&
777 i < len - 2) {
778 READ_NEXT_PAIR(v1, v2, i);
779 }
780 i -= 2; /* prevent from for-loop += 2*/
781 } else {
782 /* Configure matched pairs and
783 * skip to end of if-else.
784 */
785 READ_NEXT_PAIR(v1, v2, i);
786 while (v2 != 0xDEAD &&
787 v2 != 0xCDEF &&
788 v2 != 0xCDCD &&
789 i < len - 2) {
790 rtl_set_bbreg(hw,
791 array[i],
792 MASKDWORD,
793 array[i + 1]);
794 udelay(1);
795 READ_NEXT_PAIR(v1 , v2 , i);
796 }
797
798 while (v2 != 0xDEAD &&
799 i < len - 2) {
800 READ_NEXT_PAIR(v1 , v2 , i);
801 }
802 }
803 }
804 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
805 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
806 array[i],
807 array[i + 1]);
808 }
809 }
810 return true;
811}
812
813static u8 _rtl92ee_get_rate_section_index(u32 regaddr)
814{
815 u8 index = 0;
816
817 switch (regaddr) {
818 case RTXAGC_A_RATE18_06:
819 case RTXAGC_B_RATE18_06:
820 index = 0;
821 break;
822 case RTXAGC_A_RATE54_24:
823 case RTXAGC_B_RATE54_24:
824 index = 1;
825 break;
826 case RTXAGC_A_CCK1_MCS32:
827 case RTXAGC_B_CCK1_55_MCS32:
828 index = 2;
829 break;
830 case RTXAGC_B_CCK11_A_CCK2_11:
831 index = 3;
832 break;
833 case RTXAGC_A_MCS03_MCS00:
834 case RTXAGC_B_MCS03_MCS00:
835 index = 4;
836 break;
837 case RTXAGC_A_MCS07_MCS04:
838 case RTXAGC_B_MCS07_MCS04:
839 index = 5;
840 break;
841 case RTXAGC_A_MCS11_MCS08:
842 case RTXAGC_B_MCS11_MCS08:
843 index = 6;
844 break;
845 case RTXAGC_A_MCS15_MCS12:
846 case RTXAGC_B_MCS15_MCS12:
847 index = 7;
848 break;
849 default:
850 regaddr &= 0xFFF;
851 if (regaddr >= 0xC20 && regaddr <= 0xC4C)
852 index = (u8)((regaddr - 0xC20) / 4);
853 else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
854 index = (u8)((regaddr - 0xE20) / 4);
855 break;
856 };
857 return index;
858}
859
860static void _rtl92ee_store_tx_power_by_rate(struct ieee80211_hw *hw,
861 enum band_type band,
862 enum radio_path rfpath,
863 u32 txnum, u32 regaddr,
864 u32 bitmask, u32 data)
865{
866 struct rtl_priv *rtlpriv = rtl_priv(hw);
867 struct rtl_phy *rtlphy = &rtlpriv->phy;
868 u8 section = _rtl92ee_get_rate_section_index(regaddr);
869
870 if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
871 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid Band %d\n", band);
872 return;
873 }
874
875 if (rfpath > MAX_RF_PATH - 1) {
876 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR,
877 "Invalid RfPath %d\n", rfpath);
878 return;
879 }
880 if (txnum > MAX_RF_PATH - 1) {
881 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid TxNum %d\n", txnum);
882 return;
883 }
884
885 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][section] = data;
886}
887
888static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
889 u8 configtype)
890{
891 struct rtl_priv *rtlpriv = rtl_priv(hw);
892 int i;
893 u32 *phy_regarray_table_pg;
894 u16 phy_regarray_pg_len;
895 u32 v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0;
896
897 phy_regarray_pg_len = RTL8192EE_PHY_REG_ARRAY_PG_LEN;
898 phy_regarray_table_pg = RTL8192EE_PHY_REG_ARRAY_PG;
899
900 if (configtype == BASEBAND_CONFIG_PHY_REG) {
901 for (i = 0; i < phy_regarray_pg_len; i = i + 6) {
902 v1 = phy_regarray_table_pg[i];
903 v2 = phy_regarray_table_pg[i+1];
904 v3 = phy_regarray_table_pg[i+2];
905 v4 = phy_regarray_table_pg[i+3];
906 v5 = phy_regarray_table_pg[i+4];
907 v6 = phy_regarray_table_pg[i+5];
908
909 if (v1 < 0xcdcdcdcd) {
910 _rtl92ee_store_tx_power_by_rate(hw, v1, v2, v3,
911 v4, v5, v6);
912 continue;
913 }
914 }
915 } else {
916 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
917 "configtype != BaseBand_Config_PHY_REG\n");
918 }
919 return true;
920}
921
922#define READ_NEXT_RF_PAIR(v1, v2, i) \
923 do { \
924 i += 2; \
925 v1 = array[i]; \
926 v2 = array[i+1]; \
927 } while (0)
928
929bool rtl92ee_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
930 enum radio_path rfpath)
931{
932 struct rtl_priv *rtlpriv = rtl_priv(hw);
933 int i;
934 u32 *array;
935 u16 len;
936 u32 v1 = 0, v2 = 0;
937
938 switch (rfpath) {
939 case RF90_PATH_A:
940 len = RTL8192EE_RADIOA_ARRAY_LEN;
941 array = RTL8192EE_RADIOA_ARRAY;
942 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
943 "Radio_A:RTL8192EE_RADIOA_ARRAY %d\n" , len);
944 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
945 for (i = 0; i < len; i = i + 2) {
946 v1 = array[i];
947 v2 = array[i+1];
948 if (v1 < 0xcdcdcdcd) {
949 _rtl92ee_config_rf_radio_a(hw, v1, v2);
950 continue;
951 } else {/*This line is the start line of branch.*/
952 /* to protect READ_NEXT_PAIR not overrun */
953 if (i >= len - 2)
954 break;
955
956 if (!_check_condition(hw , array[i])) {
957 /*Discard the following pairs*/
958 READ_NEXT_RF_PAIR(v1, v2, i);
959 while (v2 != 0xDEAD &&
960 v2 != 0xCDEF &&
961 v2 != 0xCDCD && i < len - 2) {
962 READ_NEXT_RF_PAIR(v1, v2, i);
963 }
964 i -= 2; /* prevent from for-loop += 2*/
965 } else {
966 /* Configure matched pairs and
967 * skip to end of if-else.
968 */
969 READ_NEXT_RF_PAIR(v1, v2, i);
970 while (v2 != 0xDEAD &&
971 v2 != 0xCDEF &&
972 v2 != 0xCDCD && i < len - 2) {
973 _rtl92ee_config_rf_radio_a(hw,
974 v1,
975 v2);
976 READ_NEXT_RF_PAIR(v1, v2, i);
977 }
978
979 while (v2 != 0xDEAD && i < len - 2)
980 READ_NEXT_RF_PAIR(v1, v2, i);
981 }
982 }
983 }
984 break;
985
986 case RF90_PATH_B:
987 len = RTL8192EE_RADIOB_ARRAY_LEN;
988 array = RTL8192EE_RADIOB_ARRAY;
989 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
990 "Radio_A:RTL8192EE_RADIOB_ARRAY %d\n" , len);
991 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
992 for (i = 0; i < len; i = i + 2) {
993 v1 = array[i];
994 v2 = array[i+1];
995 if (v1 < 0xcdcdcdcd) {
996 _rtl92ee_config_rf_radio_b(hw, v1, v2);
997 continue;
998 } else {/*This line is the start line of branch.*/
999 /* to protect READ_NEXT_PAIR not overrun */
1000 if (i >= len - 2)
1001 break;
1002
1003 if (!_check_condition(hw , array[i])) {
1004 /*Discard the following pairs*/
1005 READ_NEXT_RF_PAIR(v1, v2, i);
1006 while (v2 != 0xDEAD &&
1007 v2 != 0xCDEF &&
1008 v2 != 0xCDCD && i < len - 2) {
1009 READ_NEXT_RF_PAIR(v1, v2, i);
1010 }
1011 i -= 2; /* prevent from for-loop += 2*/
1012 } else {
1013 /* Configure matched pairs and
1014 * skip to end of if-else.
1015 */
1016 READ_NEXT_RF_PAIR(v1, v2, i);
1017 while (v2 != 0xDEAD &&
1018 v2 != 0xCDEF &&
1019 v2 != 0xCDCD && i < len - 2) {
1020 _rtl92ee_config_rf_radio_b(hw,
1021 v1,
1022 v2);
1023 READ_NEXT_RF_PAIR(v1, v2, i);
1024 }
1025
1026 while (v2 != 0xDEAD && i < len - 2)
1027 READ_NEXT_RF_PAIR(v1, v2, i);
1028 }
1029 }
1030 }
1031 break;
1032 case RF90_PATH_C:
1033 case RF90_PATH_D:
1034 break;
1035 }
1036 return true;
1037}
1038
1039void rtl92ee_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
1040{
1041 struct rtl_priv *rtlpriv = rtl_priv(hw);
1042 struct rtl_phy *rtlphy = &rtlpriv->phy;
1043
1044 rtlphy->default_initialgain[0] =
1045 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
1046 rtlphy->default_initialgain[1] =
1047 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
1048 rtlphy->default_initialgain[2] =
1049 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
1050 rtlphy->default_initialgain[3] =
1051 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
1052
1053 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1054 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
1055 rtlphy->default_initialgain[0],
1056 rtlphy->default_initialgain[1],
1057 rtlphy->default_initialgain[2],
1058 rtlphy->default_initialgain[3]);
1059
1060 rtlphy->framesync = (u8)rtl_get_bbreg(hw,
1061 ROFDM0_RXDETECTOR3, MASKBYTE0);
1062 rtlphy->framesync_c34 = rtl_get_bbreg(hw,
1063 ROFDM0_RXDETECTOR2, MASKDWORD);
1064
1065 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1066 "Default framesync (0x%x) = 0x%x\n",
1067 ROFDM0_RXDETECTOR3, rtlphy->framesync);
1068}
1069
1070static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw)
1071{
1072 struct rtl_priv *rtlpriv = rtl_priv(hw);
1073 struct rtl_phy *rtlphy = &rtlpriv->phy;
1074
1075 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1076 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1077
1078 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
1079 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
1080
1081 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
1082 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
1083
1084 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
1085 RFPGA0_XA_LSSIPARAMETER;
1086 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
1087 RFPGA0_XB_LSSIPARAMETER;
1088
1089 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
1090 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
1091
1092 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
1093 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
1094
1095 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
1096 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
1097}
1098
1099void rtl92ee_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
1100{
1101 struct rtl_priv *rtlpriv = rtl_priv(hw);
1102 struct rtl_phy *rtlphy = &rtlpriv->phy;
1103 u8 txpwr_level;
1104 long txpwr_dbm;
1105
1106 txpwr_level = rtlphy->cur_cck_txpwridx;
1107 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B,
1108 txpwr_level);
1109 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1110 if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) >
1111 txpwr_dbm)
1112 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
1113 txpwr_level);
1114 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1115 if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
1116 txpwr_level) > txpwr_dbm)
1117 txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw,
1118 WIRELESS_MODE_N_24G,
1119 txpwr_level);
1120 *powerlevel = txpwr_dbm;
1121}
1122
1123static u8 _rtl92ee_phy_get_ratesection_intxpower_byrate(enum radio_path path,
1124 u8 rate)
1125{
1126 u8 rate_section = 0;
1127
1128 switch (rate) {
1129 case DESC92C_RATE1M:
1130 rate_section = 2;
1131 break;
1132 case DESC92C_RATE2M:
1133 case DESC92C_RATE5_5M:
1134 if (path == RF90_PATH_A)
1135 rate_section = 3;
1136 else if (path == RF90_PATH_B)
1137 rate_section = 2;
1138 break;
1139 case DESC92C_RATE11M:
1140 rate_section = 3;
1141 break;
1142 case DESC92C_RATE6M:
1143 case DESC92C_RATE9M:
1144 case DESC92C_RATE12M:
1145 case DESC92C_RATE18M:
1146 rate_section = 0;
1147 break;
1148 case DESC92C_RATE24M:
1149 case DESC92C_RATE36M:
1150 case DESC92C_RATE48M:
1151 case DESC92C_RATE54M:
1152 rate_section = 1;
1153 break;
1154 case DESC92C_RATEMCS0:
1155 case DESC92C_RATEMCS1:
1156 case DESC92C_RATEMCS2:
1157 case DESC92C_RATEMCS3:
1158 rate_section = 4;
1159 break;
1160 case DESC92C_RATEMCS4:
1161 case DESC92C_RATEMCS5:
1162 case DESC92C_RATEMCS6:
1163 case DESC92C_RATEMCS7:
1164 rate_section = 5;
1165 break;
1166 case DESC92C_RATEMCS8:
1167 case DESC92C_RATEMCS9:
1168 case DESC92C_RATEMCS10:
1169 case DESC92C_RATEMCS11:
1170 rate_section = 6;
1171 break;
1172 case DESC92C_RATEMCS12:
1173 case DESC92C_RATEMCS13:
1174 case DESC92C_RATEMCS14:
1175 case DESC92C_RATEMCS15:
1176 rate_section = 7;
1177 break;
1178 default:
1179 RT_ASSERT(true, "Rate_Section is Illegal\n");
1180 break;
1181 }
1182 return rate_section;
1183}
1184
1185static u8 _rtl92ee_get_txpower_by_rate(struct ieee80211_hw *hw,
1186 enum band_type band,
1187 enum radio_path rf, u8 rate)
1188{
1189 struct rtl_priv *rtlpriv = rtl_priv(hw);
1190 struct rtl_phy *rtlphy = &rtlpriv->phy;
1191 u8 shift = 0, sec, tx_num;
1192 char diff = 0;
1193
1194 sec = _rtl92ee_phy_get_ratesection_intxpower_byrate(rf, rate);
1195 tx_num = RF_TX_NUM_NONIMPLEMENT;
1196
1197 if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
1198 if ((rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS15))
1199 tx_num = RF_2TX;
1200 else
1201 tx_num = RF_1TX;
1202 }
1203
1204 switch (rate) {
1205 case DESC92C_RATE1M:
1206 case DESC92C_RATE6M:
1207 case DESC92C_RATE24M:
1208 case DESC92C_RATEMCS0:
1209 case DESC92C_RATEMCS4:
1210 case DESC92C_RATEMCS8:
1211 case DESC92C_RATEMCS12:
1212 shift = 0;
1213 break;
1214 case DESC92C_RATE2M:
1215 case DESC92C_RATE9M:
1216 case DESC92C_RATE36M:
1217 case DESC92C_RATEMCS1:
1218 case DESC92C_RATEMCS5:
1219 case DESC92C_RATEMCS9:
1220 case DESC92C_RATEMCS13:
1221 shift = 8;
1222 break;
1223 case DESC92C_RATE5_5M:
1224 case DESC92C_RATE12M:
1225 case DESC92C_RATE48M:
1226 case DESC92C_RATEMCS2:
1227 case DESC92C_RATEMCS6:
1228 case DESC92C_RATEMCS10:
1229 case DESC92C_RATEMCS14:
1230 shift = 16;
1231 break;
1232 case DESC92C_RATE11M:
1233 case DESC92C_RATE18M:
1234 case DESC92C_RATE54M:
1235 case DESC92C_RATEMCS3:
1236 case DESC92C_RATEMCS7:
1237 case DESC92C_RATEMCS11:
1238 case DESC92C_RATEMCS15:
1239 shift = 24;
1240 break;
1241 default:
1242 RT_ASSERT(true, "Rate_Section is Illegal\n");
1243 break;
1244 }
1245
1246 diff = (u8)(rtlphy->tx_power_by_rate_offset[band][rf][tx_num][sec] >>
1247 shift) & 0xff;
1248
1249 return diff;
1250}
1251
1252static u8 _rtl92ee_get_txpower_index(struct ieee80211_hw *hw,
1253 enum radio_path rfpath, u8 rate,
1254 u8 bw, u8 channel)
1255{
1256 struct rtl_priv *rtlpriv = rtl_priv(hw);
1257 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
1258 u8 index = (channel - 1);
1259 u8 tx_power = 0;
1260 u8 diff = 0;
1261
1262 if (channel < 1 || channel > 14) {
1263 index = 0;
1264 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_DMESG,
1265 "Illegal channel!!\n");
1266 }
1267
1268 if (IS_CCK_RATE(rate))
1269 tx_power = rtlefuse->txpwrlevel_cck[rfpath][index];
1270 else if (DESC92C_RATE6M <= rate)
1271 tx_power = rtlefuse->txpwrlevel_ht40_1s[rfpath][index];
1272
1273 /* OFDM-1T*/
1274 if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M &&
1275 !IS_CCK_RATE(rate))
1276 tx_power += rtlefuse->txpwr_legacyhtdiff[rfpath][TX_1S];
1277
1278 /* BW20-1S, BW20-2S */
1279 if (bw == HT_CHANNEL_WIDTH_20) {
1280 if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1281 tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_1S];
1282 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1283 tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_2S];
1284 } else if (bw == HT_CHANNEL_WIDTH_20_40) {/* BW40-1S, BW40-2S */
1285 if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1286 tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_1S];
1287 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1288 tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_2S];
1289 }
1290
1291 if (rtlefuse->eeprom_regulatory != 2)
1292 diff = _rtl92ee_get_txpower_by_rate(hw, BAND_ON_2_4G,
1293 rfpath, rate);
1294
1295 tx_power += diff;
1296
1297 if (tx_power > MAX_POWER_INDEX)
1298 tx_power = MAX_POWER_INDEX;
1299
1300 return tx_power;
1301}
1302
1303static void _rtl92ee_set_txpower_index(struct ieee80211_hw *hw, u8 pwr_idx,
1304 enum radio_path rfpath, u8 rate)
1305{
1306 struct rtl_priv *rtlpriv = rtl_priv(hw);
1307
1308 if (rfpath == RF90_PATH_A) {
1309 switch (rate) {
1310 case DESC92C_RATE1M:
1311 rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1,
1312 pwr_idx);
1313 break;
1314 case DESC92C_RATE2M:
1315 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE1,
1316 pwr_idx);
1317 break;
1318 case DESC92C_RATE5_5M:
1319 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE2,
1320 pwr_idx);
1321 break;
1322 case DESC92C_RATE11M:
1323 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE3,
1324 pwr_idx);
1325 break;
1326 case DESC92C_RATE6M:
1327 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE0,
1328 pwr_idx);
1329 break;
1330 case DESC92C_RATE9M:
1331 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE1,
1332 pwr_idx);
1333 break;
1334 case DESC92C_RATE12M:
1335 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE2,
1336 pwr_idx);
1337 break;
1338 case DESC92C_RATE18M:
1339 rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE3,
1340 pwr_idx);
1341 break;
1342 case DESC92C_RATE24M:
1343 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE0,
1344 pwr_idx);
1345 break;
1346 case DESC92C_RATE36M:
1347 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE1,
1348 pwr_idx);
1349 break;
1350 case DESC92C_RATE48M:
1351 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE2,
1352 pwr_idx);
1353 break;
1354 case DESC92C_RATE54M:
1355 rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE3,
1356 pwr_idx);
1357 break;
1358 case DESC92C_RATEMCS0:
1359 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE0,
1360 pwr_idx);
1361 break;
1362 case DESC92C_RATEMCS1:
1363 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE1,
1364 pwr_idx);
1365 break;
1366 case DESC92C_RATEMCS2:
1367 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE2,
1368 pwr_idx);
1369 break;
1370 case DESC92C_RATEMCS3:
1371 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE3,
1372 pwr_idx);
1373 break;
1374 case DESC92C_RATEMCS4:
1375 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE0,
1376 pwr_idx);
1377 break;
1378 case DESC92C_RATEMCS5:
1379 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE1,
1380 pwr_idx);
1381 break;
1382 case DESC92C_RATEMCS6:
1383 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE2,
1384 pwr_idx);
1385 break;
1386 case DESC92C_RATEMCS7:
1387 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE3,
1388 pwr_idx);
1389 break;
1390 case DESC92C_RATEMCS8:
1391 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE0,
1392 pwr_idx);
1393 break;
1394 case DESC92C_RATEMCS9:
1395 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE1,
1396 pwr_idx);
1397 break;
1398 case DESC92C_RATEMCS10:
1399 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE2,
1400 pwr_idx);
1401 break;
1402 case DESC92C_RATEMCS11:
1403 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE3,
1404 pwr_idx);
1405 break;
1406 case DESC92C_RATEMCS12:
1407 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE0,
1408 pwr_idx);
1409 break;
1410 case DESC92C_RATEMCS13:
1411 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE1,
1412 pwr_idx);
1413 break;
1414 case DESC92C_RATEMCS14:
1415 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE2,
1416 pwr_idx);
1417 break;
1418 case DESC92C_RATEMCS15:
1419 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE3,
1420 pwr_idx);
1421 break;
1422 default:
1423 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1424 "Invalid Rate!!\n");
1425 break;
1426 }
1427 } else if (rfpath == RF90_PATH_B) {
1428 switch (rate) {
1429 case DESC92C_RATE1M:
1430 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE1,
1431 pwr_idx);
1432 break;
1433 case DESC92C_RATE2M:
1434 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE2,
1435 pwr_idx);
1436 break;
1437 case DESC92C_RATE5_5M:
1438 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE3,
1439 pwr_idx);
1440 break;
1441 case DESC92C_RATE11M:
1442 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0,
1443 pwr_idx);
1444 break;
1445 case DESC92C_RATE6M:
1446 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE0,
1447 pwr_idx);
1448 break;
1449 case DESC92C_RATE9M:
1450 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE1,
1451 pwr_idx);
1452 break;
1453 case DESC92C_RATE12M:
1454 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE2,
1455 pwr_idx);
1456 break;
1457 case DESC92C_RATE18M:
1458 rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE3,
1459 pwr_idx);
1460 break;
1461 case DESC92C_RATE24M:
1462 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE0,
1463 pwr_idx);
1464 break;
1465 case DESC92C_RATE36M:
1466 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE1,
1467 pwr_idx);
1468 break;
1469 case DESC92C_RATE48M:
1470 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE2,
1471 pwr_idx);
1472 break;
1473 case DESC92C_RATE54M:
1474 rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE3,
1475 pwr_idx);
1476 break;
1477 case DESC92C_RATEMCS0:
1478 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE0,
1479 pwr_idx);
1480 break;
1481 case DESC92C_RATEMCS1:
1482 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE1,
1483 pwr_idx);
1484 break;
1485 case DESC92C_RATEMCS2:
1486 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE2,
1487 pwr_idx);
1488 break;
1489 case DESC92C_RATEMCS3:
1490 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE3,
1491 pwr_idx);
1492 break;
1493 case DESC92C_RATEMCS4:
1494 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE0,
1495 pwr_idx);
1496 break;
1497 case DESC92C_RATEMCS5:
1498 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE1,
1499 pwr_idx);
1500 break;
1501 case DESC92C_RATEMCS6:
1502 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE2,
1503 pwr_idx);
1504 break;
1505 case DESC92C_RATEMCS7:
1506 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE3,
1507 pwr_idx);
1508 break;
1509 case DESC92C_RATEMCS8:
1510 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE0,
1511 pwr_idx);
1512 break;
1513 case DESC92C_RATEMCS9:
1514 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE1,
1515 pwr_idx);
1516 break;
1517 case DESC92C_RATEMCS10:
1518 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE2,
1519 pwr_idx);
1520 break;
1521 case DESC92C_RATEMCS11:
1522 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE3,
1523 pwr_idx);
1524 break;
1525 case DESC92C_RATEMCS12:
1526 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE0,
1527 pwr_idx);
1528 break;
1529 case DESC92C_RATEMCS13:
1530 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE1,
1531 pwr_idx);
1532 break;
1533 case DESC92C_RATEMCS14:
1534 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE2,
1535 pwr_idx);
1536 break;
1537 case DESC92C_RATEMCS15:
1538 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE3,
1539 pwr_idx);
1540 break;
1541 default:
1542 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1543 "Invalid Rate!!\n");
1544 break;
1545 }
1546 } else {
1547 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid RFPath!!\n");
1548 }
1549}
1550
1551static void phy_set_txpower_index_by_rate_array(struct ieee80211_hw *hw,
1552 enum radio_path rfpath, u8 bw,
1553 u8 channel, u8 *rates, u8 size)
1554{
1555 u8 i;
1556 u8 power_index;
1557
1558 for (i = 0; i < size; i++) {
1559 power_index = _rtl92ee_get_txpower_index(hw, rfpath, rates[i],
1560 bw, channel);
1561 _rtl92ee_set_txpower_index(hw, power_index, rfpath, rates[i]);
1562 }
1563}
1564
1565static void phy_set_txpower_index_by_rate_section(struct ieee80211_hw *hw,
1566 enum radio_path rfpath,
1567 u8 channel,
1568 enum rate_section section)
1569{
1570 struct rtl_priv *rtlpriv = rtl_priv(hw);
1571 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1572 struct rtl_phy *rtlphy = &rtlpriv->phy;
1573
1574 if (section == CCK) {
1575 u8 cck_rates[] = {DESC92C_RATE1M, DESC92C_RATE2M,
1576 DESC92C_RATE5_5M, DESC92C_RATE11M};
1577 if (rtlhal->current_bandtype == BAND_ON_2_4G)
1578 phy_set_txpower_index_by_rate_array(hw, rfpath,
1579 rtlphy->current_chan_bw,
1580 channel, cck_rates, 4);
1581 } else if (section == OFDM) {
1582 u8 ofdm_rates[] = {DESC92C_RATE6M, DESC92C_RATE9M,
1583 DESC92C_RATE12M, DESC92C_RATE18M,
1584 DESC92C_RATE24M, DESC92C_RATE36M,
1585 DESC92C_RATE48M, DESC92C_RATE54M};
1586 phy_set_txpower_index_by_rate_array(hw, rfpath,
1587 rtlphy->current_chan_bw,
1588 channel, ofdm_rates, 8);
1589 } else if (section == HT_MCS0_MCS7) {
1590 u8 ht_rates1t[] = {DESC92C_RATEMCS0, DESC92C_RATEMCS1,
1591 DESC92C_RATEMCS2, DESC92C_RATEMCS3,
1592 DESC92C_RATEMCS4, DESC92C_RATEMCS5,
1593 DESC92C_RATEMCS6, DESC92C_RATEMCS7};
1594 phy_set_txpower_index_by_rate_array(hw, rfpath,
1595 rtlphy->current_chan_bw,
1596 channel, ht_rates1t, 8);
1597 } else if (section == HT_MCS8_MCS15) {
1598 u8 ht_rates2t[] = {DESC92C_RATEMCS8, DESC92C_RATEMCS9,
1599 DESC92C_RATEMCS10, DESC92C_RATEMCS11,
1600 DESC92C_RATEMCS12, DESC92C_RATEMCS13,
1601 DESC92C_RATEMCS14, DESC92C_RATEMCS15};
1602 phy_set_txpower_index_by_rate_array(hw, rfpath,
1603 rtlphy->current_chan_bw,
1604 channel, ht_rates2t, 8);
1605 } else
1606 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR,
1607 "Invalid RateSection %d\n", section);
1608}
1609
1610void rtl92ee_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1611{
1612 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1613 struct rtl_phy *rtlphy = &rtl_priv(hw)->phy;
1614 enum radio_path rfpath;
1615
1616 if (!rtlefuse->txpwr_fromeprom)
1617 return;
1618 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1619 rfpath++) {
1620 phy_set_txpower_index_by_rate_section(hw, rfpath,
1621 channel, CCK);
1622 phy_set_txpower_index_by_rate_section(hw, rfpath,
1623 channel, OFDM);
1624 phy_set_txpower_index_by_rate_section(hw, rfpath,
1625 channel,
1626 HT_MCS0_MCS7);
1627
1628 if (rtlphy->num_total_rfpath >= 2)
1629 phy_set_txpower_index_by_rate_section(hw,
1630 rfpath, channel,
1631 HT_MCS8_MCS15);
1632 }
1633}
1634
1635static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
1636 enum wireless_mode wirelessmode,
1637 u8 txpwridx)
1638{
1639 long offset;
1640 long pwrout_dbm;
1641
1642 switch (wirelessmode) {
1643 case WIRELESS_MODE_B:
1644 offset = -7;
1645 break;
1646 case WIRELESS_MODE_G:
1647 case WIRELESS_MODE_N_24G:
1648 offset = -8;
1649 break;
1650 default:
1651 offset = -8;
1652 break;
1653 }
1654 pwrout_dbm = txpwridx / 2 + offset;
1655 return pwrout_dbm;
1656}
1657
1658void rtl92ee_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1659{
1660 struct rtl_priv *rtlpriv = rtl_priv(hw);
1661 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1662 enum io_type iotype;
1663
1664 if (!is_hal_stop(rtlhal)) {
1665 switch (operation) {
1666 case SCAN_OPT_BACKUP_BAND0:
1667 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1668 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1669 (u8 *)&iotype);
1670
1671 break;
1672 case SCAN_OPT_RESTORE:
1673 iotype = IO_CMD_RESUME_DM_BY_SCAN;
1674 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1675 (u8 *)&iotype);
1676 break;
1677 default:
1678 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1679 "Unknown Scan Backup operation.\n");
1680 break;
1681 }
1682 }
1683}
1684
1685void rtl92ee_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1686{
1687 struct rtl_priv *rtlpriv = rtl_priv(hw);
1688 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1689 struct rtl_phy *rtlphy = &rtlpriv->phy;
1690 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1691 u8 reg_bw_opmode;
1692 u8 reg_prsr_rsc;
1693
1694 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1695 "Switch to %s bandwidth\n",
1696 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1697 "20MHz" : "40MHz");
1698
1699 if (is_hal_stop(rtlhal)) {
1700 rtlphy->set_bwmode_inprogress = false;
1701 return;
1702 }
1703
1704 reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1705 reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1706
1707 switch (rtlphy->current_chan_bw) {
1708 case HT_CHANNEL_WIDTH_20:
1709 reg_bw_opmode |= BW_OPMODE_20MHZ;
1710 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1711 break;
1712 case HT_CHANNEL_WIDTH_20_40:
1713 reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1714 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1715 reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1716 (mac->cur_40_prime_sc << 5);
1717 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1718 break;
1719 default:
1720 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1721 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
1722 break;
1723 }
1724
1725 switch (rtlphy->current_chan_bw) {
1726 case HT_CHANNEL_WIDTH_20:
1727 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1728 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1729 rtl_set_bbreg(hw, ROFDM0_TXPSEUDONOISEWGT,
1730 (BIT(31) | BIT(30)), 0);
1731 break;
1732 case HT_CHANNEL_WIDTH_20_40:
1733 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1734 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1735 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
1736 (mac->cur_40_prime_sc >> 1));
1737 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00,
1738 mac->cur_40_prime_sc);
1739
1740 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1741 (mac->cur_40_prime_sc ==
1742 HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1743 break;
1744 default:
1745 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1746 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
1747 break;
1748 }
1749 rtl92ee_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1750 rtlphy->set_bwmode_inprogress = false;
1751 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
1752}
1753
1754void rtl92ee_phy_set_bw_mode(struct ieee80211_hw *hw,
1755 enum nl80211_channel_type ch_type)
1756{
1757 struct rtl_priv *rtlpriv = rtl_priv(hw);
1758 struct rtl_phy *rtlphy = &rtlpriv->phy;
1759 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1760 u8 tmp_bw = rtlphy->current_chan_bw;
1761
1762 if (rtlphy->set_bwmode_inprogress)
1763 return;
1764 rtlphy->set_bwmode_inprogress = true;
1765 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1766 rtl92ee_phy_set_bw_mode_callback(hw);
1767 } else {
1768 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1769 "false driver sleep or unload\n");
1770 rtlphy->set_bwmode_inprogress = false;
1771 rtlphy->current_chan_bw = tmp_bw;
1772 }
1773}
1774
1775void rtl92ee_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1776{
1777 struct rtl_priv *rtlpriv = rtl_priv(hw);
1778 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1779 struct rtl_phy *rtlphy = &rtlpriv->phy;
1780 u32 delay;
1781
1782 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1783 "switch to channel%d\n", rtlphy->current_channel);
1784 if (is_hal_stop(rtlhal))
1785 return;
1786 do {
1787 if (!rtlphy->sw_chnl_inprogress)
1788 break;
1789 if (!_rtl92ee_phy_sw_chnl_step_by_step
1790 (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
1791 &rtlphy->sw_chnl_step, &delay)) {
1792 if (delay > 0)
1793 mdelay(delay);
1794 else
1795 continue;
1796 } else {
1797 rtlphy->sw_chnl_inprogress = false;
1798 }
1799 break;
1800 } while (true);
1801 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
1802}
1803
1804u8 rtl92ee_phy_sw_chnl(struct ieee80211_hw *hw)
1805{
1806 struct rtl_priv *rtlpriv = rtl_priv(hw);
1807 struct rtl_phy *rtlphy = &rtlpriv->phy;
1808 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1809
1810 if (rtlphy->sw_chnl_inprogress)
1811 return 0;
1812 if (rtlphy->set_bwmode_inprogress)
1813 return 0;
1814 RT_ASSERT((rtlphy->current_channel <= 14),
1815 "WIRELESS_MODE_G but channel>14");
1816 rtlphy->sw_chnl_inprogress = true;
1817 rtlphy->sw_chnl_stage = 0;
1818 rtlphy->sw_chnl_step = 0;
1819 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1820 rtl92ee_phy_sw_chnl_callback(hw);
1821 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1822 "sw_chnl_inprogress false schdule workitem current channel %d\n",
1823 rtlphy->current_channel);
1824 rtlphy->sw_chnl_inprogress = false;
1825 } else {
1826 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1827 "sw_chnl_inprogress false driver sleep or unload\n");
1828 rtlphy->sw_chnl_inprogress = false;
1829 }
1830 return 1;
1831}
1832
1833static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1834 u8 channel, u8 *stage, u8 *step,
1835 u32 *delay)
1836{
1837 struct rtl_priv *rtlpriv = rtl_priv(hw);
1838 struct rtl_phy *rtlphy = &rtlpriv->phy;
1839 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1840 u32 precommoncmdcnt;
1841 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
1842 u32 postcommoncmdcnt;
1843 struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
1844 u32 rfdependcmdcnt;
1845 struct swchnlcmd *currentcmd = NULL;
1846 u8 rfpath;
1847 u8 num_total_rfpath = rtlphy->num_total_rfpath;
1848
1849 precommoncmdcnt = 0;
1850 _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1851 MAX_PRECMD_CNT,
1852 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
1853 _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1854 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1855
1856 postcommoncmdcnt = 0;
1857
1858 _rtl92ee_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1859 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
1860
1861 rfdependcmdcnt = 0;
1862
1863 RT_ASSERT((channel >= 1 && channel <= 14),
1864 "illegal channel for Zebra: %d\n", channel);
1865
1866 _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1867 MAX_RFDEPENDCMD_CNT,
1868 CMDID_RF_WRITEREG,
1869 RF_CHNLBW, channel, 10);
1870
1871 _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1872 MAX_RFDEPENDCMD_CNT, CMDID_END,
1873 0, 0, 0);
1874
1875 do {
1876 switch (*stage) {
1877 case 0:
1878 currentcmd = &precommoncmd[*step];
1879 break;
1880 case 1:
1881 currentcmd = &rfdependcmd[*step];
1882 break;
1883 case 2:
1884 currentcmd = &postcommoncmd[*step];
1885 break;
1886 default:
1887 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1888 "Invalid 'stage' = %d, Check it!\n" , *stage);
1889 return true;
1890 }
1891
1892 if (currentcmd->cmdid == CMDID_END) {
1893 if ((*stage) == 2)
1894 return true;
1895 (*stage)++;
1896 (*step) = 0;
1897 continue;
1898 }
1899
1900 switch (currentcmd->cmdid) {
1901 case CMDID_SET_TXPOWEROWER_LEVEL:
1902 rtl92ee_phy_set_txpower_level(hw, channel);
1903 break;
1904 case CMDID_WRITEPORT_ULONG:
1905 rtl_write_dword(rtlpriv, currentcmd->para1,
1906 currentcmd->para2);
1907 break;
1908 case CMDID_WRITEPORT_USHORT:
1909 rtl_write_word(rtlpriv, currentcmd->para1,
1910 (u16)currentcmd->para2);
1911 break;
1912 case CMDID_WRITEPORT_UCHAR:
1913 rtl_write_byte(rtlpriv, currentcmd->para1,
1914 (u8)currentcmd->para2);
1915 break;
1916 case CMDID_RF_WRITEREG:
1917 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
1918 rtlphy->rfreg_chnlval[rfpath] =
1919 ((rtlphy->rfreg_chnlval[rfpath] &
1920 0xfffff00) | currentcmd->para2);
1921
1922 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1923 currentcmd->para1,
1924 0x3ff,
1925 rtlphy->rfreg_chnlval[rfpath]);
1926 }
1927 break;
1928 default:
1929 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1930 "switch case not process\n");
1931 break;
1932 }
1933
1934 break;
1935 } while (true);
1936
1937 (*delay) = currentcmd->msdelay;
1938 (*step)++;
1939 return false;
1940}
1941
1942static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
1943 u32 cmdtableidx, u32 cmdtablesz,
1944 enum swchnlcmd_id cmdid,
1945 u32 para1, u32 para2, u32 msdelay)
1946{
1947 struct swchnlcmd *pcmd;
1948
1949 if (cmdtable == NULL) {
1950 RT_ASSERT(false, "cmdtable cannot be NULL.\n");
1951 return false;
1952 }
1953
1954 if (cmdtableidx >= cmdtablesz)
1955 return false;
1956
1957 pcmd = cmdtable + cmdtableidx;
1958 pcmd->cmdid = cmdid;
1959 pcmd->para1 = para1;
1960 pcmd->para2 = para2;
1961 pcmd->msdelay = msdelay;
1962 return true;
1963}
1964
1965static u8 _rtl92ee_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
1966{
1967 u32 reg_eac, reg_e94, reg_e9c;
1968 u8 result = 0x00;
1969 /* path-A IQK setting */
1970 /* PA/PAD controlled by 0x0 */
1971 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1972 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
1973 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1974
1975 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1976 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1977 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1978 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1979
1980 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82140303);
1981 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160000);
1982
1983 /*LO calibration setting*/
1984 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1985
1986 /*One shot, path A LOK & IQK*/
1987 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1988 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1989
1990 mdelay(IQK_DELAY_TIME);
1991
1992 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1993 reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1994 reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1995
1996 if (!(reg_eac & BIT(28)) &&
1997 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1998 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1999 result |= 0x01;
2000 else
2001 return result;
2002
2003 return result;
2004}
2005
2006static u8 _rtl92ee_phy_path_b_iqk(struct ieee80211_hw *hw)
2007{
2008 u32 reg_eac, reg_eb4, reg_ebc;
2009 u8 result = 0x00;
2010
2011 /* PA/PAD controlled by 0x0 */
2012 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2013 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2014 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2015
2016 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
2017 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2018
2019 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2020 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2021 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2022 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2023
2024 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x821403e2);
2025 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160000);
2026
2027 /* LO calibration setting */
2028 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
2029
2030 /*One shot, path B LOK & IQK*/
2031 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2032 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2033
2034 mdelay(IQK_DELAY_TIME);
2035
2036 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
2037 reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
2038 reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
2039
2040 if (!(reg_eac & BIT(31)) &&
2041 (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2042 (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
2043 result |= 0x01;
2044 else
2045 return result;
2046
2047 return result;
2048}
2049
2050static u8 _rtl92ee_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2051{
2052 u32 reg_eac, reg_e94, reg_e9c, reg_ea4 , u32temp;
2053 u8 result = 0x00;
2054
2055 /*Get TXIMR Setting*/
2056 /*Modify RX IQK mode table*/
2057 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2058
2059 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2060 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2061 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2062 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2063
2064 /*PA/PAD control by 0x56, and set = 0x0*/
2065 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2066 rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2067
2068 /*enter IQK mode*/
2069 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2070
2071 /*IQK Setting*/
2072 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2073 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2074
2075 /*path a IQK setting*/
2076 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2077 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2078 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2079 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2080
2081 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2082 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160c1f);
2083
2084 /*LO calibration Setting*/
2085 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2086
2087 /*one shot,path A LOK & iqk*/
2088 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2089 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2090
2091 mdelay(IQK_DELAY_TIME);
2092
2093 /* Check failed */
2094 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2095 reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
2096 reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
2097
2098 if (!(reg_eac & BIT(28)) &&
2099 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
2100 (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) {
2101 result |= 0x01;
2102 } else {
2103 /* PA/PAD controlled by 0x0 */
2104 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2105 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2106 return result;
2107 }
2108
2109 u32temp = 0x80007C00 | (reg_e94 & 0x3FF0000) |
2110 ((reg_e9c & 0x3FF0000) >> 16);
2111 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2112 /*RX IQK*/
2113 /*Modify RX IQK mode table*/
2114 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2115
2116 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2117
2118 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2119 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2120 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2121
2122 /*PA/PAD control by 0x56, and set = 0x0*/
2123 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2124 rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2125
2126 /*enter IQK mode*/
2127 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2128
2129 /*IQK Setting*/
2130 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2131
2132 /*path a IQK setting*/
2133 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2134 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2135 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2136 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2137
2138 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2139 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160c1f);
2140
2141 /*LO calibration Setting*/
2142 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2143 /*one shot,path A LOK & iqk*/
2144 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2145 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2146
2147 mdelay(IQK_DELAY_TIME);
2148 /*Check failed*/
2149 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2150 reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
2151
2152 /*PA/PAD controlled by 0x0*/
2153 /*leave IQK mode*/
2154 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2155 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2156 /*if Tx is OK, check whether Rx is OK*/
2157 if (!(reg_eac & BIT(27)) &&
2158 (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
2159 (((reg_eac & 0x03FF0000) >> 16) != 0x36))
2160 result |= 0x02;
2161
2162 return result;
2163}
2164
2165static u8 _rtl92ee_phy_path_b_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2166{
2167 struct rtl_priv *rtlpriv = rtl_priv(hw);
2168 u32 reg_eac, reg_eb4, reg_ebc, reg_ecc, reg_ec4, u32temp;
2169 u8 result = 0x00;
2170
2171 /*Get TXIMR Setting*/
2172 /*Modify RX IQK mode table*/
2173 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2174
2175 rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2176 rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2177 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2178 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2179
2180 /*PA/PAD all off*/
2181 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2182 rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2183
2184 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2185
2186 /*IQK Setting*/
2187 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2188 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2189
2190 /*path a IQK setting*/
2191 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2192 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2193 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2194 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2195
2196 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2197 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160c1f);
2198
2199 /*LO calibration Setting*/
2200 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2201
2202 /*one shot,path A LOK & iqk*/
2203 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2204 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2205
2206 mdelay(IQK_DELAY_TIME);
2207
2208 /* Check failed */
2209 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2210 reg_eb4 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, MASKDWORD);
2211 reg_ebc = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, MASKDWORD);
2212
2213 if (!(reg_eac & BIT(31)) &&
2214 (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2215 (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) {
2216 result |= 0x01;
2217 } else {
2218 /* PA/PAD controlled by 0x0 */
2219 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2220 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2221 return result;
2222 }
2223
2224 u32temp = 0x80007C00 | (reg_eb4 & 0x3FF0000) |
2225 ((reg_ebc & 0x3FF0000) >> 16);
2226 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2227 /*RX IQK*/
2228 /*Modify RX IQK mode table*/
2229 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2230 rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2231
2232 rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2233 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2234 rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2235
2236 /*PA/PAD all off*/
2237 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2238 rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2239
2240 /*enter IQK mode*/
2241 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2242
2243 /*IQK Setting*/
2244 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2245
2246 /*path b IQK setting*/
2247 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2248 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2249 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2250 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2251
2252 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2253 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28160c1f);
2254
2255 /*LO calibration Setting*/
2256 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2257 /*one shot,path A LOK & iqk*/
2258 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2259 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2260
2261 mdelay(IQK_DELAY_TIME);
2262 /*Check failed*/
2263 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2264 reg_ec4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASKDWORD);
2265 reg_ecc = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, MASKDWORD);
2266 /*PA/PAD controlled by 0x0*/
2267 /*leave IQK mode*/
2268 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2269 rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2270 /*if Tx is OK, check whether Rx is OK*/
2271 if (!(reg_eac & BIT(30)) &&
2272 (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
2273 (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
2274 result |= 0x02;
2275 else
2276 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "Path B Rx IQK fail!!\n");
2277
2278 return result;
2279}
2280
2281static void _rtl92ee_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
2282 bool b_iqk_ok, long result[][8],
2283 u8 final_candidate,
2284 bool btxonly)
2285{
2286 u32 oldval_0, x, tx0_a, reg;
2287 long y, tx0_c;
2288
2289 if (final_candidate == 0xFF) {
2290 return;
2291 } else if (b_iqk_ok) {
2292 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2293 MASKDWORD) >> 22) & 0x3FF;
2294 x = result[final_candidate][0];
2295 if ((x & 0x00000200) != 0)
2296 x = x | 0xFFFFFC00;
2297 tx0_a = (x * oldval_0) >> 8;
2298 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
2299 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
2300 ((x * oldval_0 >> 7) & 0x1));
2301 y = result[final_candidate][1];
2302 if ((y & 0x00000200) != 0)
2303 y = y | 0xFFFFFC00;
2304 tx0_c = (y * oldval_0) >> 8;
2305 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
2306 ((tx0_c & 0x3C0) >> 6));
2307 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
2308 (tx0_c & 0x3F));
2309 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
2310 ((y * oldval_0 >> 7) & 0x1));
2311
2312 if (btxonly)
2313 return;
2314
2315 reg = result[final_candidate][2];
2316 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2317
2318 reg = result[final_candidate][3] & 0x3F;
2319 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2320
2321 reg = (result[final_candidate][3] >> 6) & 0xF;
2322 rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg);
2323 }
2324}
2325
2326static void _rtl92ee_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
2327 bool b_iqk_ok, long result[][8],
2328 u8 final_candidate,
2329 bool btxonly)
2330{
2331 u32 oldval_1, x, tx1_a, reg;
2332 long y, tx1_c;
2333
2334 if (final_candidate == 0xFF) {
2335 return;
2336 } else if (b_iqk_ok) {
2337 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2338 MASKDWORD) >> 22) & 0x3FF;
2339 x = result[final_candidate][4];
2340 if ((x & 0x00000200) != 0)
2341 x = x | 0xFFFFFC00;
2342 tx1_a = (x * oldval_1) >> 8;
2343 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx1_a);
2344 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
2345 ((x * oldval_1 >> 7) & 0x1));
2346 y = result[final_candidate][5];
2347 if ((y & 0x00000200) != 0)
2348 y = y | 0xFFFFFC00;
2349 tx1_c = (y * oldval_1) >> 8;
2350 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2351 ((tx1_c & 0x3C0) >> 6));
2352 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2353 (tx1_c & 0x3F));
2354 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
2355 ((y * oldval_1 >> 7) & 0x1));
2356
2357 if (btxonly)
2358 return;
2359
2360 reg = result[final_candidate][6];
2361 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2362
2363 reg = result[final_candidate][7] & 0x3F;
2364 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2365
2366 reg = (result[final_candidate][7] >> 6) & 0xF;
2367 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0xF0000000, reg);
2368 }
2369}
2370
2371static void _rtl92ee_phy_save_adda_registers(struct ieee80211_hw *hw,
2372 u32 *addareg, u32 *addabackup,
2373 u32 registernum)
2374{
2375 u32 i;
2376
2377 for (i = 0; i < registernum; i++)
2378 addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
2379}
2380
2381static void _rtl92ee_phy_save_mac_registers(struct ieee80211_hw *hw,
2382 u32 *macreg, u32 *macbackup)
2383{
2384 struct rtl_priv *rtlpriv = rtl_priv(hw);
2385 u32 i;
2386
2387 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2388 macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
2389
2390 macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
2391}
2392
2393static void _rtl92ee_phy_reload_adda_registers(struct ieee80211_hw *hw,
2394 u32 *addareg, u32 *addabackup,
2395 u32 regiesternum)
2396{
2397 u32 i;
2398
2399 for (i = 0; i < regiesternum; i++)
2400 rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
2401}
2402
2403static void _rtl92ee_phy_reload_mac_registers(struct ieee80211_hw *hw,
2404 u32 *macreg, u32 *macbackup)
2405{
2406 struct rtl_priv *rtlpriv = rtl_priv(hw);
2407 u32 i;
2408
2409 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2410 rtl_write_byte(rtlpriv, macreg[i], (u8)macbackup[i]);
2411 rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
2412}
2413
2414static void _rtl92ee_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
2415 bool is_patha_on, bool is2t)
2416{
2417 u32 pathon;
2418 u32 i;
2419
2420 pathon = is_patha_on ? 0x0fc01616 : 0x0fc01616;
2421 if (!is2t) {
2422 pathon = 0x0fc01616;
2423 rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0fc01616);
2424 } else {
2425 rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
2426 }
2427
2428 for (i = 1; i < IQK_ADDA_REG_NUM; i++)
2429 rtl_set_bbreg(hw, addareg[i], MASKDWORD, pathon);
2430}
2431
2432static void _rtl92ee_phy_mac_setting_calibration(struct ieee80211_hw *hw,
2433 u32 *macreg, u32 *macbackup)
2434{
2435 rtl_set_bbreg(hw, 0x520, 0x00ff0000, 0xff);
2436}
2437
2438static void _rtl92ee_phy_path_a_standby(struct ieee80211_hw *hw)
2439{
2440 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
2441 rtl_set_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK, 0x10000);
2442 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2443}
2444
2445static bool _rtl92ee_phy_simularity_compare(struct ieee80211_hw *hw,
2446 long result[][8], u8 c1, u8 c2)
2447{
2448 u32 i, j, diff, simularity_bitmap, bound;
2449
2450 u8 final_candidate[2] = { 0xFF, 0xFF };
2451 bool bresult = true/*, is2t = true*/;
2452 s32 tmp1, tmp2;
2453
2454 bound = 8;
2455
2456 simularity_bitmap = 0;
2457
2458 for (i = 0; i < bound; i++) {
2459 if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
2460 if ((result[c1][i] & 0x00000200) != 0)
2461 tmp1 = result[c1][i] | 0xFFFFFC00;
2462 else
2463 tmp1 = result[c1][i];
2464
2465 if ((result[c2][i] & 0x00000200) != 0)
2466 tmp2 = result[c2][i] | 0xFFFFFC00;
2467 else
2468 tmp2 = result[c2][i];
2469 } else {
2470 tmp1 = result[c1][i];
2471 tmp2 = result[c2][i];
2472 }
2473
2474 diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
2475
2476 if (diff > MAX_TOLERANCE) {
2477 if ((i == 2 || i == 6) && !simularity_bitmap) {
2478 if (result[c1][i] + result[c1][i + 1] == 0)
2479 final_candidate[(i / 4)] = c2;
2480 else if (result[c2][i] + result[c2][i + 1] == 0)
2481 final_candidate[(i / 4)] = c1;
2482 else
2483 simularity_bitmap |= (1 << i);
2484 } else {
2485 simularity_bitmap |= (1 << i);
2486 }
2487 }
2488 }
2489
2490 if (simularity_bitmap == 0) {
2491 for (i = 0; i < (bound / 4); i++) {
2492 if (final_candidate[i] != 0xFF) {
2493 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2494 result[3][j] =
2495 result[final_candidate[i]][j];
2496 bresult = false;
2497 }
2498 }
2499 return bresult;
2500 }
2501 if (!(simularity_bitmap & 0x03)) {/*path A TX OK*/
2502 for (i = 0; i < 2; i++)
2503 result[3][i] = result[c1][i];
2504 }
2505 if (!(simularity_bitmap & 0x0c)) {/*path A RX OK*/
2506 for (i = 2; i < 4; i++)
2507 result[3][i] = result[c1][i];
2508 }
2509 if (!(simularity_bitmap & 0x30)) {/*path B TX OK*/
2510 for (i = 4; i < 6; i++)
2511 result[3][i] = result[c1][i];
2512 }
2513 if (!(simularity_bitmap & 0xc0)) {/*path B RX OK*/
2514 for (i = 6; i < 8; i++)
2515 result[3][i] = result[c1][i];
2516 }
2517 return false;
2518}
2519
2520static void _rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw,
2521 long result[][8], u8 t, bool is2t)
2522{
2523 struct rtl_priv *rtlpriv = rtl_priv(hw);
2524 struct rtl_phy *rtlphy = &rtlpriv->phy;
2525 u32 i;
2526 u8 patha_ok, pathb_ok;
2527 u8 tmp_0xc50 = (u8)rtl_get_bbreg(hw, 0xc50, MASKBYTE0);
2528 u8 tmp_0xc58 = (u8)rtl_get_bbreg(hw, 0xc58, MASKBYTE0);
2529 u32 adda_reg[IQK_ADDA_REG_NUM] = {
2530 0x85c, 0xe6c, 0xe70, 0xe74,
2531 0xe78, 0xe7c, 0xe80, 0xe84,
2532 0xe88, 0xe8c, 0xed0, 0xed4,
2533 0xed8, 0xedc, 0xee0, 0xeec
2534 };
2535 u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2536 0x522, 0x550, 0x551, 0x040
2537 };
2538 u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2539 ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
2540 RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
2541 0x870, 0x860,
2542 0x864, 0x800
2543 };
2544 const u32 retrycount = 2;
2545
2546 if (t == 0) {
2547 _rtl92ee_phy_save_adda_registers(hw, adda_reg,
2548 rtlphy->adda_backup,
2549 IQK_ADDA_REG_NUM);
2550 _rtl92ee_phy_save_mac_registers(hw, iqk_mac_reg,
2551 rtlphy->iqk_mac_backup);
2552 _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2553 rtlphy->iqk_bb_backup,
2554 IQK_BB_REG_NUM);
2555 }
2556
2557 _rtl92ee_phy_path_adda_on(hw, adda_reg, true, is2t);
2558
2559 /*BB setting*/
2560 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2561 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2562 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2563 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208200);
2564
2565 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(10), 0x01);
2566 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(26), 0x01);
2567 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 0x01);
2568 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10), 0x01);
2569
2570 _rtl92ee_phy_mac_setting_calibration(hw, iqk_mac_reg,
2571 rtlphy->iqk_mac_backup);
2572 /* Page B init*/
2573 /* IQ calibration setting*/
2574 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2575 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2576 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2577
2578 for (i = 0 ; i < retrycount ; i++) {
2579 patha_ok = _rtl92ee_phy_path_a_iqk(hw, is2t);
2580
2581 if (patha_ok == 0x01) {
2582 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2583 "Path A Tx IQK Success!!\n");
2584 result[t][0] = (rtl_get_bbreg(hw,
2585 RTX_POWER_BEFORE_IQK_A,
2586 MASKDWORD) & 0x3FF0000)
2587 >> 16;
2588 result[t][1] = (rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A,
2589 MASKDWORD) & 0x3FF0000)
2590 >> 16;
2591 break;
2592 }
2593 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2594 "Path A Tx IQK Fail!!, ret = 0x%x\n",
2595 patha_ok);
2596 }
2597
2598 for (i = 0 ; i < retrycount ; i++) {
2599 patha_ok = _rtl92ee_phy_path_a_rx_iqk(hw, is2t);
2600
2601 if (patha_ok == 0x03) {
2602 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2603 "Path A Rx IQK Success!!\n");
2604 result[t][2] = (rtl_get_bbreg(hw,
2605 RRX_POWER_BEFORE_IQK_A_2,
2606 MASKDWORD) & 0x3FF0000)
2607 >> 16;
2608 result[t][3] = (rtl_get_bbreg(hw,
2609 RRX_POWER_AFTER_IQK_A_2,
2610 MASKDWORD) & 0x3FF0000)
2611 >> 16;
2612 break;
2613 }
2614 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2615 "Path A Rx IQK Fail!!, ret = 0x%x\n",
2616 patha_ok);
2617 }
2618
2619 if (0x00 == patha_ok)
2620 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2621 "Path A IQK failed!!, ret = 0\n");
2622 if (is2t) {
2623 _rtl92ee_phy_path_a_standby(hw);
2624 /* Turn Path B ADDA on */
2625 _rtl92ee_phy_path_adda_on(hw, adda_reg, false, is2t);
2626
2627 /* IQ calibration setting */
2628 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2629 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2630 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2631
2632 for (i = 0 ; i < retrycount ; i++) {
2633 pathb_ok = _rtl92ee_phy_path_b_iqk(hw);
2634 if (pathb_ok == 0x01) {
2635 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2636 "Path B Tx IQK Success!!\n");
2637 result[t][4] = (rtl_get_bbreg(hw,
2638 RTX_POWER_BEFORE_IQK_B,
2639 MASKDWORD) & 0x3FF0000)
2640 >> 16;
2641 result[t][5] = (rtl_get_bbreg(hw,
2642 RTX_POWER_AFTER_IQK_B,
2643 MASKDWORD) & 0x3FF0000)
2644 >> 16;
2645 break;
2646 }
2647 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2648 "Path B Tx IQK Fail!!, ret = 0x%x\n",
2649 pathb_ok);
2650 }
2651
2652 for (i = 0 ; i < retrycount ; i++) {
2653 pathb_ok = _rtl92ee_phy_path_b_rx_iqk(hw, is2t);
2654 if (pathb_ok == 0x03) {
2655 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2656 "Path B Rx IQK Success!!\n");
2657 result[t][6] = (rtl_get_bbreg(hw,
2658 RRX_POWER_BEFORE_IQK_B_2,
2659 MASKDWORD) & 0x3FF0000)
2660 >> 16;
2661 result[t][7] = (rtl_get_bbreg(hw,
2662 RRX_POWER_AFTER_IQK_B_2,
2663 MASKDWORD) & 0x3FF0000)
2664 >> 16;
2665 break;
2666 }
2667 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2668 "Path B Rx IQK Fail!!, ret = 0x%x\n",
2669 pathb_ok);
2670 }
2671
2672 if (0x00 == pathb_ok)
2673 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2674 "Path B IQK failed!!, ret = 0\n");
2675 }
2676 /* Back to BB mode, load original value */
2677 RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
2678 "IQK:Back to BB mode, load original value!\n");
2679 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0);
2680
2681 if (t != 0) {
2682 /* Reload ADDA power saving parameters */
2683 _rtl92ee_phy_reload_adda_registers(hw, adda_reg,
2684 rtlphy->adda_backup,
2685 IQK_ADDA_REG_NUM);
2686
2687 /* Reload MAC parameters */
2688 _rtl92ee_phy_reload_mac_registers(hw, iqk_mac_reg,
2689 rtlphy->iqk_mac_backup);
2690
2691 _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2692 rtlphy->iqk_bb_backup,
2693 IQK_BB_REG_NUM);
2694
2695 /* Restore RX initial gain */
2696 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2697 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_0xc50);
2698 if (is2t) {
2699 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2700 rtl_set_bbreg(hw, 0xc58, MASKBYTE0, tmp_0xc58);
2701 }
2702
2703 /* load 0xe30 IQC default value */
2704 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2705 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2706 }
2707}
2708
2709static void _rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2710{
2711 u8 tmpreg;
2712 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
2713 struct rtl_priv *rtlpriv = rtl_priv(hw);
2714
2715 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2716
2717 if ((tmpreg & 0x70) != 0)
2718 rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2719 else
2720 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2721
2722 if ((tmpreg & 0x70) != 0) {
2723 rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
2724
2725 if (is2t)
2726 rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
2727 MASK12BITS);
2728
2729 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
2730 (rf_a_mode & 0x8FFFF) | 0x10000);
2731
2732 if (is2t)
2733 rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2734 (rf_b_mode & 0x8FFFF) | 0x10000);
2735 }
2736 lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
2737
2738 rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
2739
2740 mdelay(100);
2741
2742 if ((tmpreg & 0x70) != 0) {
2743 rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2744 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
2745
2746 if (is2t)
2747 rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2748 rf_b_mode);
2749 } else {
2750 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2751 }
2752}
2753
2754static void _rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw,
2755 bool bmain, bool is2t)
2756{
2757 struct rtl_priv *rtlpriv = rtl_priv(hw);
2758 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2759 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2760
2761 RT_TRACE(rtlpriv, COMP_INIT , DBG_LOUD , "\n");
2762
2763 if (is_hal_stop(rtlhal)) {
2764 u8 u1btmp;
2765
2766 u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
2767 rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
2768 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
2769 }
2770 if (is2t) {
2771 if (bmain)
2772 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2773 BIT(5) | BIT(6), 0x1);
2774 else
2775 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2776 BIT(5) | BIT(6), 0x2);
2777 } else {
2778 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
2779 rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
2780
2781 /* We use the RF definition of MAIN and AUX,
2782 * left antenna and right antenna repectively.
2783 * Default output at AUX.
2784 */
2785 if (bmain) {
2786 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2787 BIT(14) | BIT(13) | BIT(12), 0);
2788 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2789 BIT(5) | BIT(4) | BIT(3), 0);
2790 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2791 rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 0);
2792 } else {
2793 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2794 BIT(14) | BIT(13) | BIT(12), 1);
2795 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2796 BIT(5) | BIT(4) | BIT(3), 1);
2797 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2798 rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 1);
2799 }
2800 }
2801}
2802
2803#undef IQK_ADDA_REG_NUM
2804#undef IQK_DELAY_TIME
2805
2806static u8 rtl92ee_get_rightchnlplace_for_iqk(u8 chnl)
2807{
2808 u8 channel_all[59] = {
2809 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2810 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2811 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2812 114, 116, 118, 120, 122, 124, 126, 128, 130,
2813 132, 134, 136, 138, 140, 149, 151, 153, 155,
2814 157, 159, 161, 163, 165
2815 };
2816 u8 place = chnl;
2817
2818 if (chnl > 14) {
2819 for (place = 14; place < sizeof(channel_all); place++) {
2820 if (channel_all[place] == chnl)
2821 return place - 13;
2822 }
2823 }
2824
2825 return 0;
2826}
2827
2828void rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
2829{
2830 struct rtl_priv *rtlpriv = rtl_priv(hw);
2831 struct rtl_phy *rtlphy = &rtlpriv->phy;
2832 long result[4][8];
2833 u8 i, final_candidate;
2834 bool b_patha_ok, b_pathb_ok;
2835 long reg_e94, reg_e9c, reg_ea4, reg_eac;
2836 long reg_eb4, reg_ebc, reg_ec4, reg_ecc;
2837 bool is12simular, is13simular, is23simular;
2838 u8 idx;
2839 u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2840 ROFDM0_XARXIQIMBALANCE,
2841 ROFDM0_XBRXIQIMBALANCE,
2842 ROFDM0_ECCATHRESHOLD,
2843 ROFDM0_AGCRSSITABLE,
2844 ROFDM0_XATXIQIMBALANCE,
2845 ROFDM0_XBTXIQIMBALANCE,
2846 ROFDM0_XCTXAFE,
2847 ROFDM0_XDTXAFE,
2848 ROFDM0_RXIQEXTANTA
2849 };
2850
2851 if (b_recovery) {
2852 _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2853 rtlphy->iqk_bb_backup, 9);
2854 return;
2855 }
2856
2857 for (i = 0; i < 8; i++) {
2858 result[0][i] = 0;
2859 result[1][i] = 0;
2860 result[2][i] = 0;
2861
2862 if ((i == 0) || (i == 2) || (i == 4) || (i == 6))
2863 result[3][i] = 0x100;
2864 else
2865 result[3][i] = 0;
2866 }
2867 final_candidate = 0xff;
2868 b_patha_ok = false;
2869 b_pathb_ok = false;
2870 is12simular = false;
2871 is23simular = false;
2872 is13simular = false;
2873 for (i = 0; i < 3; i++) {
2874 _rtl92ee_phy_iq_calibrate(hw, result, i, true);
2875 if (i == 1) {
2876 is12simular = _rtl92ee_phy_simularity_compare(hw,
2877 result,
2878 0, 1);
2879 if (is12simular) {
2880 final_candidate = 0;
2881 break;
2882 }
2883 }
2884
2885 if (i == 2) {
2886 is13simular = _rtl92ee_phy_simularity_compare(hw,
2887 result,
2888 0, 2);
2889 if (is13simular) {
2890 final_candidate = 0;
2891 break;
2892 }
2893 is23simular = _rtl92ee_phy_simularity_compare(hw,
2894 result,
2895 1, 2);
2896 if (is23simular)
2897 final_candidate = 1;
2898 else
2899 final_candidate = 3;
2900 }
2901 }
2902
2903 for (i = 0; i < 4; i++) {
2904 reg_e94 = result[i][0];
2905 reg_e9c = result[i][1];
2906 reg_ea4 = result[i][2];
2907 reg_eac = result[i][3];
2908 reg_eb4 = result[i][4];
2909 reg_ebc = result[i][5];
2910 reg_ec4 = result[i][6];
2911 reg_ecc = result[i][7];
2912 }
2913
2914 if (final_candidate != 0xff) {
2915 reg_e94 = result[final_candidate][0];
2916 rtlphy->reg_e94 = reg_e94;
2917 reg_e9c = result[final_candidate][1];
2918 rtlphy->reg_e9c = reg_e9c;
2919 reg_ea4 = result[final_candidate][2];
2920 reg_eac = result[final_candidate][3];
2921 reg_eb4 = result[final_candidate][4];
2922 rtlphy->reg_eb4 = reg_eb4;
2923 reg_ebc = result[final_candidate][5];
2924 rtlphy->reg_ebc = reg_ebc;
2925 reg_ec4 = result[final_candidate][6];
2926 reg_ecc = result[final_candidate][7];
2927 b_patha_ok = true;
2928 b_pathb_ok = true;
2929 } else {
2930 rtlphy->reg_e94 = 0x100;
2931 rtlphy->reg_eb4 = 0x100;
2932 rtlphy->reg_e9c = 0x0;
2933 rtlphy->reg_ebc = 0x0;
2934 }
2935
2936 if (reg_e94 != 0)
2937 _rtl92ee_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
2938 final_candidate,
2939 (reg_ea4 == 0));
2940
2941 _rtl92ee_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result,
2942 final_candidate,
2943 (reg_ec4 == 0));
2944
2945 idx = rtl92ee_get_rightchnlplace_for_iqk(rtlphy->current_channel);
2946
2947 /* To Fix BSOD when final_candidate is 0xff */
2948 if (final_candidate < 4) {
2949 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2950 rtlphy->iqk_matrix[idx].value[0][i] =
2951 result[final_candidate][i];
2952
2953 rtlphy->iqk_matrix[idx].iqk_done = true;
2954 }
2955 _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2956 rtlphy->iqk_bb_backup, 9);
2957}
2958
2959void rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw)
2960{
2961 struct rtl_priv *rtlpriv = rtl_priv(hw);
2962 struct rtl_phy *rtlphy = &rtlpriv->phy;
2963 struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
2964 u32 timeout = 2000, timecount = 0;
2965
2966 while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2967 udelay(50);
2968 timecount += 50;
2969 }
2970
2971 rtlphy->lck_inprogress = true;
2972 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2973 "LCK:Start!!! currentband %x delay %d ms\n",
2974 rtlhal->current_bandtype, timecount);
2975
2976 _rtl92ee_phy_lc_calibrate(hw, false);
2977
2978 rtlphy->lck_inprogress = false;
2979}
2980
2981void rtl92ee_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
2982{
2983}
2984
2985void rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
2986{
2987 _rtl92ee_phy_set_rfpath_switch(hw, bmain, false);
2988}
2989
2990bool rtl92ee_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2991{
2992 struct rtl_priv *rtlpriv = rtl_priv(hw);
2993 struct rtl_phy *rtlphy = &rtlpriv->phy;
2994 bool postprocessing = false;
2995
2996 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2997 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2998 iotype, rtlphy->set_io_inprogress);
2999 do {
3000 switch (iotype) {
3001 case IO_CMD_RESUME_DM_BY_SCAN:
3002 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3003 "[IO CMD] Resume DM after scan.\n");
3004 postprocessing = true;
3005 break;
3006 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
3007 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3008 "[IO CMD] Pause DM before scan.\n");
3009 postprocessing = true;
3010 break;
3011 default:
3012 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
3013 "switch case not process\n");
3014 break;
3015 }
3016 } while (false);
3017 if (postprocessing && !rtlphy->set_io_inprogress) {
3018 rtlphy->set_io_inprogress = true;
3019 rtlphy->current_io_type = iotype;
3020 } else {
3021 return false;
3022 }
3023 rtl92ee_phy_set_io(hw);
3024 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
3025 return true;
3026}
3027
3028static void rtl92ee_phy_set_io(struct ieee80211_hw *hw)
3029{
3030 struct rtl_priv *rtlpriv = rtl_priv(hw);
3031 struct rtl_phy *rtlphy = &rtlpriv->phy;
3032 struct dig_t *dm_dig = &rtlpriv->dm_digtable;
3033
3034 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3035 "--->Cmd(%#x), set_io_inprogress(%d)\n",
3036 rtlphy->current_io_type, rtlphy->set_io_inprogress);
3037 switch (rtlphy->current_io_type) {
3038 case IO_CMD_RESUME_DM_BY_SCAN:
3039 rtl92ee_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
3040 rtl92ee_dm_write_cck_cca_thres(hw, rtlphy->initgain_backup.cca);
3041 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE , "no set txpower\n");
3042 rtl92ee_phy_set_txpower_level(hw, rtlphy->current_channel);
3043 break;
3044 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
3045 /* 8192eebt */
3046 rtlphy->initgain_backup.xaagccore1 = dm_dig->cur_igvalue;
3047 rtl92ee_dm_write_dig(hw, 0x17);
3048 rtlphy->initgain_backup.cca = dm_dig->cur_cck_cca_thres;
3049 rtl92ee_dm_write_cck_cca_thres(hw, 0x40);
3050 break;
3051 default:
3052 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
3053 "switch case not process\n");
3054 break;
3055 }
3056 rtlphy->set_io_inprogress = false;
3057 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
3058 "(%#x)\n", rtlphy->current_io_type);
3059}
3060
3061static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw)
3062{
3063 struct rtl_priv *rtlpriv = rtl_priv(hw);
3064
3065 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3066 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3067 /*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/
3068 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3069 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3070 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3071}
3072
3073static void _rtl92ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
3074{
3075 struct rtl_priv *rtlpriv = rtl_priv(hw);
3076
3077 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3078 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3079
3080 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3081 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3082}
3083
3084static bool _rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3085 enum rf_pwrstate rfpwr_state)
3086{
3087 struct rtl_priv *rtlpriv = rtl_priv(hw);
3088 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3089 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3090 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3091 bool bresult = true;
3092 u8 i, queue_id;
3093 struct rtl8192_tx_ring *ring = NULL;
3094
3095 switch (rfpwr_state) {
3096 case ERFON:
3097 if ((ppsc->rfpwr_state == ERFOFF) &&
3098 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3099 bool rtstatus;
3100 u32 initializecount = 0;
3101
3102 do {
3103 initializecount++;
3104 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3105 "IPS Set eRf nic enable\n");
3106 rtstatus = rtl_ps_enable_nic(hw);
3107 } while (!rtstatus && (initializecount < 10));
3108 RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3109 } else {
3110 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3111 "Set ERFON sleeping:%d ms\n",
3112 jiffies_to_msecs(jiffies -
3113 ppsc->last_sleep_jiffies));
3114 ppsc->last_awake_jiffies = jiffies;
3115 rtl92ee_phy_set_rf_on(hw);
3116 }
3117 if (mac->link_state == MAC80211_LINKED)
3118 rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
3119 else
3120 rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
3121 break;
3122 case ERFOFF:
3123 for (queue_id = 0, i = 0;
3124 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3125 ring = &pcipriv->dev.tx_ring[queue_id];
3126 if (queue_id == BEACON_QUEUE ||
3127 skb_queue_len(&ring->queue) == 0) {
3128 queue_id++;
3129 continue;
3130 } else {
3131 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3132 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3133 (i + 1), queue_id,
3134 skb_queue_len(&ring->queue));
3135
3136 udelay(10);
3137 i++;
3138 }
3139 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3140 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3141 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3142 MAX_DOZE_WAITING_TIMES_9x,
3143 queue_id,
3144 skb_queue_len(&ring->queue));
3145 break;
3146 }
3147 }
3148
3149 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3150 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3151 "IPS Set eRf nic disable\n");
3152 rtl_ps_disable_nic(hw);
3153 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3154 } else {
3155 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
3156 rtlpriv->cfg->ops->led_control(hw,
3157 LED_CTL_NO_LINK);
3158 } else {
3159 rtlpriv->cfg->ops->led_control(hw,
3160 LED_CTL_POWER_OFF);
3161 }
3162 }
3163 break;
3164 case ERFSLEEP:
3165 if (ppsc->rfpwr_state == ERFOFF)
3166 break;
3167 for (queue_id = 0, i = 0;
3168 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3169 ring = &pcipriv->dev.tx_ring[queue_id];
3170 if (skb_queue_len(&ring->queue) == 0) {
3171 queue_id++;
3172 continue;
3173 } else {
3174 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3175 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3176 (i + 1), queue_id,
3177 skb_queue_len(&ring->queue));
3178 udelay(10);
3179 i++;
3180 }
3181 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3182 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3183 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3184 MAX_DOZE_WAITING_TIMES_9x,
3185 queue_id,
3186 skb_queue_len(&ring->queue));
3187 break;
3188 }
3189 }
3190 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3191 "Set ERFSLEEP awaked:%d ms\n",
3192 jiffies_to_msecs(jiffies -
3193 ppsc->last_awake_jiffies));
3194 ppsc->last_sleep_jiffies = jiffies;
3195 _rtl92ee_phy_set_rf_sleep(hw);
3196 break;
3197 default:
3198 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
3199 "switch case not process\n");
3200 bresult = false;
3201 break;
3202 }
3203 if (bresult)
3204 ppsc->rfpwr_state = rfpwr_state;
3205 return bresult;
3206}
3207
3208bool rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3209 enum rf_pwrstate rfpwr_state)
3210{
3211 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3212
3213 bool bresult = false;
3214
3215 if (rfpwr_state == ppsc->rfpwr_state)
3216 return bresult;
3217 bresult = _rtl92ee_phy_set_rf_power_state(hw, rfpwr_state);
3218 return bresult;
3219}
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/phy.h b/drivers/net/wireless/rtlwifi/rtl8192ee/phy.h
new file mode 100644
index 000000000000..c6e97c8df54c
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/phy.h
@@ -0,0 +1,153 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_PHY_H__
27#define __RTL92E_PHY_H__
28
29/* MAX_TX_COUNT must always set to 4, otherwise read efuse table sequence
30 * will be wrong.
31 */
32#define MAX_TX_COUNT 4
33#define TX_1S 0
34#define TX_2S 1
35#define TX_3S 2
36#define TX_4S 3
37
38#define MAX_POWER_INDEX 0x3f
39
40#define MAX_PRECMD_CNT 16
41#define MAX_RFDEPENDCMD_CNT 16
42#define MAX_POSTCMD_CNT 16
43
44#define MAX_DOZE_WAITING_TIMES_9x 64
45
46#define RT_CANNOT_IO(hw) false
47#define HIGHPOWER_RADIOA_ARRAYLEN 22
48
49#define IQK_ADDA_REG_NUM 16
50#define IQK_MAC_REG_NUM 4
51#define IQK_BB_REG_NUM 9
52#define MAX_TOLERANCE 5
53#define IQK_DELAY_TIME 10
54#define index_mapping_NUM 15
55
56#define APK_BB_REG_NUM 5
57#define APK_AFE_REG_NUM 16
58#define APK_CURVE_REG_NUM 4
59#define PATH_NUM 2
60
61#define LOOP_LIMIT 5
62#define MAX_STALL_TIME 50
63#define ANTENNADIVERSITYVALUE 0x80
64#define MAX_TXPWR_IDX_NMODE_92S 63
65#define RESET_CNT_LIMIT 3
66
67#define RF6052_MAX_PATH 2
68
69#define CT_OFFSET_MAC_ADDR 0X16
70
71#define CT_OFFSET_CCK_TX_PWR_IDX 0x5A
72#define CT_OFFSET_HT401S_TX_PWR_IDX 0x60
73#define CT_OFFSET_HT402S_TX_PWR_IDX_DIFF 0x66
74#define CT_OFFSET_HT20_TX_PWR_IDX_DIFF 0x69
75#define CT_OFFSET_OFDM_TX_PWR_IDX_DIFF 0x6C
76
77#define CT_OFFSET_HT40_MAX_PWR_OFFSET 0x6F
78#define CT_OFFSET_HT20_MAX_PWR_OFFSET 0x72
79
80#define CT_OFFSET_CHANNEL_PLAH 0x75
81#define CT_OFFSET_THERMAL_METER 0x78
82#define CT_OFFSET_RF_OPTION 0x79
83#define CT_OFFSET_VERSION 0x7E
84#define CT_OFFSET_CUSTOMER_ID 0x7F
85
86#define RTL92C_MAX_PATH_NUM 2
87
88enum swchnlcmd_id {
89 CMDID_END,
90 CMDID_SET_TXPOWEROWER_LEVEL,
91 CMDID_BBREGWRITE10,
92 CMDID_WRITEPORT_ULONG,
93 CMDID_WRITEPORT_USHORT,
94 CMDID_WRITEPORT_UCHAR,
95 CMDID_RF_WRITEREG,
96};
97
98struct swchnlcmd {
99 enum swchnlcmd_id cmdid;
100 u32 para1;
101 u32 para2;
102 u32 msdelay;
103};
104
105enum baseband_config_type {
106 BASEBAND_CONFIG_PHY_REG = 0,
107 BASEBAND_CONFIG_AGC_TAB = 1,
108};
109
110enum ant_div_type {
111 NO_ANTDIV = 0xFF,
112 CG_TRX_HW_ANTDIV = 0x01,
113 CGCS_RX_HW_ANTDIV = 0x02,
114 FIXED_HW_ANTDIV = 0x03,
115 CG_TRX_SMART_ANTDIV = 0x04,
116 CGCS_RX_SW_ANTDIV = 0x05,
117};
118
119u32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw,
120 u32 regaddr, u32 bitmask);
121void rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw,
122 u32 regaddr, u32 bitmask, u32 data);
123u32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw,
124 enum radio_path rfpath, u32 regaddr,
125 u32 bitmask);
126void rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw,
127 enum radio_path rfpath, u32 regaddr,
128 u32 bitmask, u32 data);
129bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw);
130bool rtl92ee_phy_bb_config(struct ieee80211_hw *hw);
131bool rtl92ee_phy_rf_config(struct ieee80211_hw *hw);
132void rtl92ee_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
133void rtl92ee_phy_get_txpower_level(struct ieee80211_hw *hw,
134 long *powerlevel);
135void rtl92ee_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel);
136void rtl92ee_phy_scan_operation_backup(struct ieee80211_hw *hw,
137 u8 operation);
138void rtl92ee_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
139void rtl92ee_phy_set_bw_mode(struct ieee80211_hw *hw,
140 enum nl80211_channel_type ch_type);
141void rtl92ee_phy_sw_chnl_callback(struct ieee80211_hw *hw);
142u8 rtl92ee_phy_sw_chnl(struct ieee80211_hw *hw);
143void rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery);
144void rtl92ee_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
145void rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw);
146void rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
147bool rtl92ee_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
148 enum radio_path rfpath);
149bool rtl92ee_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
150bool rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
151 enum rf_pwrstate rfpwr_state);
152
153#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.c b/drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.c
new file mode 100644
index 000000000000..1a701d007f0c
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.c
@@ -0,0 +1,112 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "pwrseq.h"
27
28/* drivers should parse below arrays and do the corresponding actions */
29
30/*3 Power on Array*/
31struct wlan_pwr_cfg rtl8192E_power_on_flow
32 [RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS +
33 RTL8192E_TRANS_END_STEPS] = {
34 RTL8192E_TRANS_CARDEMU_TO_ACT
35 RTL8192E_TRANS_END
36};
37
38/*3Radio off GPIO Array */
39struct wlan_pwr_cfg rtl8192E_radio_off_flow
40 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS
41 + RTL8192E_TRANS_END_STEPS] = {
42 RTL8192E_TRANS_ACT_TO_CARDEMU
43 RTL8192E_TRANS_END
44};
45
46/*3Card Disable Array*/
47struct wlan_pwr_cfg rtl8192E_card_disable_flow
48 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
49 RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS +
50 RTL8192E_TRANS_END_STEPS] = {
51 RTL8192E_TRANS_ACT_TO_CARDEMU
52 RTL8192E_TRANS_CARDEMU_TO_CARDDIS
53 RTL8192E_TRANS_END
54};
55
56/*3 Card Enable Array*/
57struct wlan_pwr_cfg rtl8192E_card_enable_flow
58 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
59 RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS +
60 RTL8192E_TRANS_END_STEPS] = {
61 RTL8192E_TRANS_CARDDIS_TO_CARDEMU
62 RTL8192E_TRANS_CARDEMU_TO_ACT
63 RTL8192E_TRANS_END
64};
65
66/*3Suspend Array*/
67struct wlan_pwr_cfg rtl8192E_suspend_flow
68 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
69 RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS +
70 RTL8192E_TRANS_END_STEPS] = {
71 RTL8192E_TRANS_ACT_TO_CARDEMU
72 RTL8192E_TRANS_CARDEMU_TO_SUS
73 RTL8192E_TRANS_END
74};
75
76/*3 Resume Array*/
77struct wlan_pwr_cfg rtl8192E_resume_flow
78 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
79 RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS +
80 RTL8192E_TRANS_END_STEPS] = {
81 RTL8192E_TRANS_SUS_TO_CARDEMU
82 RTL8192E_TRANS_CARDEMU_TO_ACT
83 RTL8192E_TRANS_END
84};
85
86/*3HWPDN Array*/
87struct wlan_pwr_cfg rtl8192E_hwpdn_flow
88 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
89 RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS +
90 RTL8192E_TRANS_END_STEPS] = {
91 RTL8192E_TRANS_ACT_TO_CARDEMU
92 RTL8192E_TRANS_CARDEMU_TO_PDN
93 RTL8192E_TRANS_END
94};
95
96/*3 Enter LPS */
97struct wlan_pwr_cfg rtl8192E_enter_lps_flow
98 [RTL8192E_TRANS_ACT_TO_LPS_STEPS +
99 RTL8192E_TRANS_END_STEPS] = {
100 /*FW behavior*/
101 RTL8192E_TRANS_ACT_TO_LPS
102 RTL8192E_TRANS_END
103};
104
105/*3 Leave LPS */
106struct wlan_pwr_cfg rtl8192E_leave_lps_flow
107 [RTL8192E_TRANS_LPS_TO_ACT_STEPS +
108 RTL8192E_TRANS_END_STEPS] = {
109 /*FW behavior*/
110 RTL8192E_TRANS_LPS_TO_ACT
111 RTL8192E_TRANS_END
112};
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.h b/drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.h
new file mode 100644
index 000000000000..781eeaa6af49
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/pwrseq.h
@@ -0,0 +1,340 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_PWRSEQ_H__
27#define __RTL92E_PWRSEQ_H__
28
29#include "../pwrseqcmd.h"
30/**
31 * Check document WM-20110607-Paul-RTL8192E_Power_Architecture-R02.vsd
32 * There are 6 HW Power States:
33 * 0: POFF--Power Off
34 * 1: PDN--Power Down
35 * 2: CARDEMU--Card Emulation
36 * 3: ACT--Active Mode
37 * 4: LPS--Low Power State
38 * 5: SUS--Suspend
39 *
40 * The transision from different states are defined below
41 * TRANS_CARDEMU_TO_ACT
42 * TRANS_ACT_TO_CARDEMU
43 * TRANS_CARDEMU_TO_SUS
44 * TRANS_SUS_TO_CARDEMU
45 * TRANS_CARDEMU_TO_PDN
46 * TRANS_ACT_TO_LPS
47 * TRANS_LPS_TO_ACT
48 *
49 * TRANS_END
50 * PWR SEQ Version: rtl8192E_PwrSeq_V09.h
51 */
52
53#define RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS 18
54#define RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS 18
55#define RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS 18
56#define RTL8192E_TRANS_SUS_TO_CARDEMU_STEPS 18
57#define RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS 18
58#define RTL8192E_TRANS_PDN_TO_CARDEMU_STEPS 18
59#define RTL8192E_TRANS_ACT_TO_LPS_STEPS 23
60#define RTL8192E_TRANS_LPS_TO_ACT_STEPS 23
61#define RTL8192E_TRANS_END_STEPS 1
62
63#define RTL8192E_TRANS_CARDEMU_TO_ACT \
64 /* format */ \
65 /* comments here */ \
66 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
67 /* disable HWPDN 0x04[15]=0*/ \
68 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
69 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(7), 0}, \
70 /* disable SW LPS 0x04[10]=0*/ \
71 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
72 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(2), 0}, \
73 /* disable WL suspend*/ \
74 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
75 PWR_BASEADDR_MAC , PWR_CMD_WRITE, (BIT(4)|BIT(3)), 0}, \
76 /* wait till 0x04[17] = 1 power ready*/ \
77 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
78 PWR_BASEADDR_MAC , PWR_CMD_POLLING, BIT(1), BIT(1)}, \
79 /* release WLON reset 0x04[16]=1*/ \
80 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
81 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(0), BIT(0)}, \
82 /* polling until return 0*/ \
83 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
84 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(0), BIT(0)}, \
85 /**/ \
86 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
87 PWR_BASEADDR_MAC , PWR_CMD_POLLING, BIT(0), 0},
88
89#define RTL8192E_TRANS_ACT_TO_CARDEMU \
90 /* format */ \
91 /* comments here */ \
92 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
93 /*0x1F[7:0] = 0 turn off RF*/ \
94 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
95 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0}, \
96 /*0x4C[23]=0x4E[7]=0, switch DPDT_SEL_P output from register 0x65[2] */\
97 {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
98 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(7), 0}, \
99 /*0x04[9] = 1 turn off MAC by HW state machine*/ \
100 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
101 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(1), BIT(1)}, \
102 /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \
103 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
104 PWR_BASEADDR_MAC , PWR_CMD_POLLING, BIT(1), 0},
105
106#define RTL8192E_TRANS_CARDEMU_TO_SUS \
107 /* format */ \
108 /* comments here */ \
109 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
110 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \
111 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
112 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(4) | BIT(3), (BIT(4) | BIT(3))},\
113 /*0x04[12:11] = 2b'01 enable WL suspend*/ \
114 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
115 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \
116 PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, \
117 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \
118 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
119 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},\
120 /*Set SDIO suspend local register*/ \
121 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
122 PWR_BASEADDR_SDIO , PWR_CMD_WRITE, BIT(0), BIT(0)}, \
123 /*wait power state to suspend*/ \
124 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
125 PWR_BASEADDR_SDIO , PWR_CMD_POLLING, BIT(1), 0},
126
127#define RTL8192E_TRANS_SUS_TO_CARDEMU \
128 /* format */ \
129 /* comments here */ \
130 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
131 /*Set SDIO suspend local register*/ \
132 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
133 PWR_BASEADDR_SDIO , PWR_CMD_WRITE, BIT(0), 0}, \
134 /*wait power state to suspend*/ \
135 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
136 PWR_BASEADDR_SDIO , PWR_CMD_POLLING, BIT(1), BIT(1)}, \
137 /*0x04[12:11] = 2b'01enable WL suspend*/ \
138 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
139 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
140
141#define RTL8192E_TRANS_CARDEMU_TO_CARDDIS \
142 /* format */ \
143 /* comments here */ \
144 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
145 /*0x07=0x20 , SOP option to disable BG/MB*/ \
146 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
147 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0x20}, \
148 /*Unlock small LDO Register*/ \
149 {0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
150 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(2), BIT(2)}, \
151 /*Disable small LDO*/ \
152 {0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
153 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(0), 0}, \
154 /*0x04[12:11] = 2b'01 enable WL suspend*/ \
155 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
156 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \
157 PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, \
158 /*0x04[10] = 1, enable SW LPS*/ \
159 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
160 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(2), BIT(2)}, \
161 /*Set SDIO suspend local register*/ \
162 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
163 PWR_BASEADDR_SDIO , PWR_CMD_WRITE, BIT(0), BIT(0)}, \
164 /*wait power state to suspend*/ \
165 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
166 PWR_BASEADDR_SDIO , PWR_CMD_POLLING, BIT(1), 0},
167
168#define RTL8192E_TRANS_CARDDIS_TO_CARDEMU \
169 /* format */ \
170 /* comments here */ \
171 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
172 /*Set SDIO suspend local register*/ \
173 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
174 PWR_BASEADDR_SDIO , PWR_CMD_WRITE, BIT(0), 0}, \
175 /*wait power state to suspend*/ \
176 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
177 PWR_BASEADDR_SDIO , PWR_CMD_POLLING, BIT(1), BIT(1)}, \
178 /*Enable small LDO*/ \
179 {0x0011, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
180 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(0), BIT(0)}, \
181 /*Lock small LDO Register*/ \
182 {0x00CC, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
183 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(2), 0}, \
184 /*0x04[12:11] = 2b'01enable WL suspend*/ \
185 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
186 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
187
188#define RTL8192E_TRANS_CARDEMU_TO_PDN \
189 /* format */ \
190 /* comments here */ \
191 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
192 /* 0x04[16] = 0*/ \
193 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
194 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(0), 0}, \
195 /* 0x04[15] = 1*/ \
196 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
197 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(7), BIT(7)},
198
199#define RTL8192E_TRANS_PDN_TO_CARDEMU \
200 /* format */ \
201 /* comments here */ \
202 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
203 /* 0x04[15] = 0*/ \
204 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
205 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(7), 0},
206
207#define RTL8192E_TRANS_ACT_TO_LPS \
208 /* format */ \
209 /* comments here */ \
210 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
211 /*PCIe DMA stop*/ \
212 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
213 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0xFF}, \
214 /*Tx Pause*/ \
215 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
216 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0xFF}, \
217 /*Should be zero if no packet is transmitting*/ \
218 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
219 PWR_BASEADDR_MAC , PWR_CMD_POLLING, 0xFF, 0}, \
220 /*Should be zero if no packet is transmitting*/ \
221 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
222 PWR_BASEADDR_MAC , PWR_CMD_POLLING, 0xFF, 0}, \
223 /*Should be zero if no packet is transmitting*/ \
224 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
225 PWR_BASEADDR_MAC , PWR_CMD_POLLING, 0xFF, 0}, \
226 /*Should be zero if no packet is transmitting*/ \
227 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
228 PWR_BASEADDR_MAC , PWR_CMD_POLLING, 0xFF, 0}, \
229 /*CCK and OFDM are disabled,and clock are gated*/ \
230 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
231 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(0), 0}, \
232 /*Delay 1us*/ \
233 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
234 PWR_BASEADDR_MAC , PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US}, \
235 /*Whole BB is reset*/ \
236 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
237 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(1), 0}, \
238 /*Reset MAC TRX*/ \
239 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
240 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0x03}, \
241 /*check if removed later*/ \
242 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
243 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(1), 0}, \
244 /*When driver enter Sus/ Disable, enable LOP for BT*/ \
245 {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
246 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0x00}, \
247 /*Respond TxOK to scheduler*/ \
248 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
249 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(5), BIT(5)},
250
251#define RTL8192E_TRANS_LPS_TO_ACT \
252 /* format */ \
253 /* comments here */ \
254 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
255 /*SDIO RPWM, For Repeatly In and out, Taggle bit should be changed*/\
256 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
257 PWR_BASEADDR_SDIO , PWR_CMD_WRITE, 0xFF, 0x84}, \
258 /*USB RPWM*/ \
259 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \
260 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0x84}, \
261 /*PCIe RPWM*/ \
262 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
263 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0x84}, \
264 /*Delay*/ \
265 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
266 PWR_BASEADDR_MAC , PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, \
267 /*0x08[4] = 0 switch TSF to 40M*/ \
268 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
269 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(4), 0}, \
270 /*Polling 0x109[7]=0 TSF in 40M*/ \
271 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
272 PWR_BASEADDR_MAC , PWR_CMD_POLLING, BIT(7), 0}, \
273 /*0x101[1] = 1*/ \
274 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
275 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(1), BIT(1)}, \
276 /*0x100[7:0] = 0xFF enable WMAC TRX*/ \
277 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
278 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0xFF}, \
279 /* 0x02[1:0] = 2b'11 enable BB macro*/ \
280 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
281 PWR_BASEADDR_MAC , PWR_CMD_WRITE, BIT(1) | BIT(0), BIT(1) | BIT(0)},\
282 /*0x522 = 0*/ \
283 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
284 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0}, \
285 /*Clear ISR*/ \
286 {0x013D, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
287 PWR_BASEADDR_MAC , PWR_CMD_WRITE, 0xFF, 0xFF},
288
289#define RTL8192E_TRANS_END \
290 /* format */ \
291 /* comments here */ \
292 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
293 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
294 0, PWR_CMD_END, 0, 0},
295
296extern struct wlan_pwr_cfg rtl8192E_power_on_flow
297 [RTL8192E_TRANS_CARDEMU_TO_ACT_STEPS +
298 RTL8192E_TRANS_END_STEPS];
299extern struct wlan_pwr_cfg rtl8192E_radio_off_flow
300 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
301 RTL8192E_TRANS_END_STEPS];
302extern struct wlan_pwr_cfg rtl8192E_card_disable_flow
303 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
304 RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS +
305 RTL8192E_TRANS_END_STEPS];
306extern struct wlan_pwr_cfg rtl8192E_card_enable_flow
307 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
308 RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS +
309 RTL8192E_TRANS_END_STEPS];
310extern struct wlan_pwr_cfg rtl8192E_suspend_flow
311 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
312 RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS +
313 RTL8192E_TRANS_END_STEPS];
314extern struct wlan_pwr_cfg rtl8192E_resume_flow
315 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
316 RTL8192E_TRANS_CARDEMU_TO_SUS_STEPS +
317 RTL8192E_TRANS_END_STEPS];
318extern struct wlan_pwr_cfg rtl8192E_hwpdn_flow
319 [RTL8192E_TRANS_ACT_TO_CARDEMU_STEPS +
320 RTL8192E_TRANS_CARDEMU_TO_PDN_STEPS +
321 RTL8192E_TRANS_END_STEPS];
322extern struct wlan_pwr_cfg rtl8192E_enter_lps_flow
323 [RTL8192E_TRANS_ACT_TO_LPS_STEPS +
324 RTL8192E_TRANS_END_STEPS];
325extern struct wlan_pwr_cfg rtl8192E_leave_lps_flow
326 [RTL8192E_TRANS_LPS_TO_ACT_STEPS +
327 RTL8192E_TRANS_END_STEPS];
328
329/* RTL8192EE Power Configuration CMDs for PCIe interface */
330#define RTL8192E_NIC_PWR_ON_FLOW rtl8192E_power_on_flow
331#define RTL8192E_NIC_RF_OFF_FLOW rtl8192E_radio_off_flow
332#define RTL8192E_NIC_DISABLE_FLOW rtl8192E_card_disable_flow
333#define RTL8192E_NIC_ENABLE_FLOW rtl8192E_card_enable_flow
334#define RTL8192E_NIC_SUSPEND_FLOW rtl8192E_suspend_flow
335#define RTL8192E_NIC_RESUME_FLOW rtl8192E_resume_flow
336#define RTL8192E_NIC_PDN_FLOW rtl8192E_hwpdn_flow
337#define RTL8192E_NIC_LPS_ENTER_FLOW rtl8192E_enter_lps_flow
338#define RTL8192E_NIC_LPS_LEAVE_FLOW rtl8192E_leave_lps_flow
339
340#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/reg.h b/drivers/net/wireless/rtlwifi/rtl8192ee/reg.h
new file mode 100644
index 000000000000..3f2a9596e7cd
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/reg.h
@@ -0,0 +1,2231 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_REG_H__
27#define __RTL92E_REG_H__
28
29#define TXPKT_BUF_SELECT 0x69
30#define RXPKT_BUF_SELECT 0xA5
31#define DISABLE_TRXPKT_BUF_ACCESS 0x0
32
33#define REG_SYS_ISO_CTRL 0x0000
34#define REG_SYS_FUNC_EN 0x0002
35#define REG_APS_FSMCO 0x0004
36#define REG_SYS_CLKR 0x0008
37#define REG_9346CR 0x000A
38#define REG_EE_VPD 0x000C
39#define REG_SYS_SWR_CTRL1 0x0010
40#define REG_SPS0_CTRL 0x0011
41#define REG_SYS_SWR_CTRL2 0x0014
42#define REG_SYS_SWR_CTRL3 0x0018
43#define REG_RSV_CTRL 0x001C
44#define REG_RF_CTRL 0x001F
45#define REG_LPLDO_CTRL 0x0023
46#define REG_AFE_CTRL1 0x0024
47#define REG_AFE_XTAL_CTRL 0x0024
48#define REG_AFE_CTRL2 0x0028
49#define REG_MAC_PHY_CTRL 0x002c
50#define REG_AFE_CTRL3 0x002c
51#define REG_EFUSE_CTRL 0x0030
52#define REG_EFUSE_TEST 0x0034
53#define REG_PWR_DATA 0x0038
54#define REG_CAL_TIMER 0x003C
55#define REG_ACLK_MON 0x003E
56#define REG_GPIO_MUXCFG 0x0040
57#define REG_GPIO_IO_SEL 0x0042
58#define REG_MAC_PINMUX_CFG 0x0043
59#define REG_GPIO_PIN_CTRL 0x0044
60#define REG_GPIO_INTM 0x0048
61#define REG_LEDCFG0 0x004C
62#define REG_LEDCFG1 0x004D
63#define REG_LEDCFG2 0x004E
64#define REG_LEDCFG3 0x004F
65#define REG_FSIMR 0x0050
66#define REG_FSISR 0x0054
67#define REG_HSIMR 0x0058
68#define REG_HSISR 0x005c
69#define REG_SDIO_CTRL 0x0070
70#define REG_OPT_CTRL 0x0074
71#define REG_GPIO_OUTPUT 0x006c
72#define REG_AFE_CTRL4 0x0078
73#define REG_MCUFWDL 0x0080
74
75#define REG_HIMR 0x00B0
76#define REG_HISR 0x00B4
77#define REG_HIMRE 0x00B8
78#define REG_HISRE 0x00BC
79
80#define REG_EFUSE_ACCESS 0x00CF
81#define REG_HPON_FSM 0x00EC
82#define REG_SYS_CFG1 0x00F0
83#define REG_SYS_CFG2 0x00FC
84
85#define REG_CR 0x0100
86#define REG_PBP 0x0104
87#define REG_PKT_BUFF_ACCESS_CTRL 0x0106
88#define REG_TRXDMA_CTRL 0x010C
89#define REG_TRXFF_BNDY 0x0114
90#define REG_TRXFF_STATUS 0x0118
91#define REG_RXFF_PTR 0x011C
92
93#define REG_CPWM 0x012F
94#define REG_FWIMR 0x0130
95#define REG_FWISR 0x0134
96#define REG_PKTBUF_DBG_CTRL 0x0140
97#define REG_RXPKTBUF_CTRL 0x0142
98#define REG_PKTBUF_DBG_DATA_L 0x0144
99#define REG_PKTBUF_DBG_DATA_H 0x0148
100
101#define REG_TC0_CTRL 0x0150
102#define REG_TC1_CTRL 0x0154
103#define REG_TC2_CTRL 0x0158
104#define REG_TC3_CTRL 0x015C
105#define REG_TC4_CTRL 0x0160
106#define REG_TCUNIT_BASE 0x0164
107#define REG_RSVD3 0x0168
108#define REG_C2HEVT_MSG_NORMAL 0x01A0
109#define REG_C2HEVT_CLEAR 0x01AF
110#define REG_MCUTST_1 0x01c0
111#define REG_MCUTST_WOWLAN 0x01C7
112#define REG_FMETHR 0x01C8
113#define REG_HMETFR 0x01CC
114#define REG_HMEBOX_0 0x01D0
115#define REG_HMEBOX_1 0x01D4
116#define REG_HMEBOX_2 0x01D8
117#define REG_HMEBOX_3 0x01DC
118
119#define REG_LLT_INIT 0x01E0
120
121#define REG_HMEBOX_EXT_0 0x01F0
122#define REG_HMEBOX_EXT_1 0x01F4
123#define REG_HMEBOX_EXT_2 0x01F8
124#define REG_HMEBOX_EXT_3 0x01FC
125
126/*-----------------------------------------------------
127 *
128 * 0x0200h ~ 0x027Fh TXDMA Configuration
129 *
130 *-----------------------------------------------------
131 */
132#define REG_RQPN 0x0200
133#define REG_FIFOPAGE 0x0204
134#define REG_DWBCN0_CTRL 0x0208
135#define REG_TXDMA_OFFSET_CHK 0x020C
136#define REG_TXDMA_STATUS 0x0210
137#define REG_RQPN_NPQ 0x0214
138#define REG_AUTO_LLT 0x0224
139#define REG_DWBCN1_CTRL 0x0228
140
141/*-----------------------------------------------------
142 *
143 * 0x0280h ~ 0x02FFh RXDMA Configuration
144 *
145 *-----------------------------------------------------
146 */
147#define REG_RXDMA_AGG_PG_TH 0x0280
148#define REG_FW_UPD_RDPTR 0x0284
149#define REG_RXDMA_CONTROL 0x0286
150#define REG_RXPKT_NUM 0x0287
151#define REG_RXDMA_STATUS 0x0288
152#define REG_RXDMA_PRO 0x0290
153#define REG_EARLY_MODE_CONTROL 0x02BC
154#define REG_RSVD5 0x02F0
155#define REG_RSVD6 0x02F4
156
157/*-----------------------------------------------------
158 *
159 * 0x0300h ~ 0x03FFh PCIe
160 *
161 *-----------------------------------------------------
162 */
163#define REG_PCIE_CTRL_REG 0x0300
164#define REG_INT_MIG 0x0304
165#define REG_BCNQ_DESA 0x0308
166#define REG_MGQ_DESA 0x0310
167#define REG_VOQ_DESA 0x0318
168#define REG_VIQ_DESA 0x0320
169#define REG_BEQ_DESA 0x0328
170#define REG_BKQ_DESA 0x0330
171#define REG_RX_DESA 0x0338
172#define REG_HQ0_DESA 0x0340
173#define REG_HQ1_DESA 0x0348
174#define REG_HQ2_DESA 0x0350
175#define REG_HQ3_DESA 0x0358
176#define REG_HQ4_DESA 0x0360
177#define REG_HQ5_DESA 0x0368
178#define REG_HQ6_DESA 0x0370
179#define REG_HQ7_DESA 0x0378
180#define REG_MGQ_TXBD_NUM 0x0380
181#define REG_RX_RXBD_NUM 0x0382
182#define REG_VOQ_TXBD_NUM 0x0384
183#define REG_VIQ_TXBD_NUM 0x0386
184#define REG_BEQ_TXBD_NUM 0x0388
185#define REG_BKQ_TXBD_NUM 0x038A
186#define REG_HI0Q_TXBD_NUM 0x038C
187#define REG_HI1Q_TXBD_NUM 0x038E
188#define REG_HI2Q_TXBD_NUM 0x0390
189#define REG_HI3Q_TXBD_NUM 0x0392
190#define REG_HI4Q_TXBD_NUM 0x0394
191#define REG_HI5Q_TXBD_NUM 0x0396
192#define REG_HI6Q_TXBD_NUM 0x0398
193#define REG_HI7Q_TXBD_NUM 0x039A
194#define REG_TSFTIMER_HCI 0x039C
195/*Read Write Point*/
196#define REG_VOQ_TXBD_IDX 0x03A0
197#define REG_VIQ_TXBD_IDX 0x03A4
198#define REG_BEQ_TXBD_IDX 0x03A8
199#define REG_BKQ_TXBD_IDX 0x03AC
200#define REG_MGQ_TXBD_IDX 0x03B0
201#define REG_RXQ_TXBD_IDX 0x03B4
202
203#define REG_HI0Q_TXBD_IDX 0x03B8
204#define REG_HI1Q_TXBD_IDX 0x03BC
205#define REG_HI2Q_TXBD_IDX 0x03C0
206#define REG_HI3Q_TXBD_IDX 0x03C4
207
208#define REG_HI4Q_TXBD_IDX 0x03C8
209#define REG_HI5Q_TXBD_IDX 0x03CC
210#define REG_HI6Q_TXBD_IDX 0x03D0
211#define REG_HI7Q_TXBD_IDX 0x03D4
212#define REG_PCIE_HCPWM 0x03D8
213#define REG_PCIE_CTRL2 0x03DB
214#define REG_PCIE_HRPWM 0x03DC
215#define REG_H2C_MSG_DRV2FW_INFO 0x03E0
216#define REG_PCIE_C2H_MSG_REQUEST 0x03E4
217#define REG_BACKDOOR_DBI_WDATA 0x03E8
218#define REG_BACKDOOR_DBI_RDATA 0x03EC
219#define REG_BACKDOOR_DBI_DATA 0x03F0
220#define REG_MDIO 0x03F4
221#define REG_MDIO_DATA 0x03F8
222
223#define REG_HDAQ_DESA_NODEF 0x0000
224#define REG_CMDQ_DESA_NODEF 0x0000
225/* spec version 11
226 *-----------------------------------------------------
227 *
228 * 0x0400h ~ 0x047Fh Protocol Configuration
229 *
230 *-----------------------------------------------------
231 */
232#define REG_VOQ_INFORMATION 0x0400
233#define REG_VIQ_INFORMATION 0x0404
234#define REG_BEQ_INFORMATION 0x0408
235#define REG_BKQ_INFORMATION 0x040C
236#define REG_MGQ_INFORMATION 0x0410
237#define REG_HGQ_INFORMATION 0x0414
238#define REG_BCNQ_INFORMATION 0x0418
239#define REG_TXPKT_EMPTY 0x041A
240
241#define REG_FWHW_TXQ_CTRL 0x0420
242#define REG_HWSEQ_CTRL 0x0423
243#define REG_BCNQ_BDNY 0x0424
244#define REG_MGQ_BDNY 0x0425
245#define REG_LIFECTRL_CTRL 0x0426
246#define REG_MULTI_BCNQ_OFFSET 0x0427
247#define REG_SPEC_SIFS 0x0428
248#define REG_RETRY_LIMIT 0x042A
249#define REG_TXBF_CTRL 0x042C
250#define REG_DARFRC 0x0430
251#define REG_RARFRC 0x0438
252#define REG_RRSR 0x0440
253#define REG_ARFR0 0x0444
254#define REG_ARFR1 0x044C
255#define REG_AMPDU_MAX_TIME 0x0456
256#define REG_BCNQ1_BDNY 0x0457
257#define REG_AGGLEN_LMT 0x0458
258#define REG_AMPDU_MIN_SPACE 0x045C
259#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D
260#define REG_NDPA_OPT_CTRL 0x045F
261#define REG_FAST_EDCA_CTRL 0x0460
262#define REG_RD_RESP_PKT_TH 0x0463
263#define REG_POWER_STAGE1 0x04B4
264#define REG_POWER_STAGE2 0x04B8
265#define REG_AMPDU_BURST_MODE 0x04BC
266#define REG_PKT_VO_VI_LIFE_TIME 0x04C0
267#define REG_PKT_BE_BK_LIFE_TIME 0x04C2
268#define REG_STBC_SETTING 0x04C4
269#define REG_PROT_MODE_CTRL 0x04C8
270#define REG_MAX_AGGR_NUM 0x04CA
271#define REG_RTS_MAX_AGGR_NUM 0x04CB
272#define REG_BAR_MODE_CTRL 0x04CC
273#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
274#define REG_MACID_PKT_DROP0 0x04D0
275
276/*-----------------------------------------------------
277 *
278 * 0x0500h ~ 0x05FFh EDCA Configuration
279 *
280 *-----------------------------------------------------
281 */
282#define REG_EDCA_VO_PARAM 0x0500
283#define REG_EDCA_VI_PARAM 0x0504
284#define REG_EDCA_BE_PARAM 0x0508
285#define REG_EDCA_BK_PARAM 0x050C
286#define REG_BCNTCFG 0x0510
287#define REG_PIFS 0x0512
288#define REG_RDG_PIFS 0x0513
289#define REG_SIFS_CTX 0x0514
290#define REG_SIFS_TRX 0x0516
291#define REG_AGGR_BREAK_TIME 0x051A
292#define REG_SLOT 0x051B
293#define REG_TX_PTCL_CTRL 0x0520
294#define REG_TXPAUSE 0x0522
295#define REG_DIS_TXREQ_CLR 0x0523
296#define REG_RD_CTRL 0x0524
297
298#define REG_TBTT_PROHIBIT 0x0540
299#define REG_RD_NAV_NXT 0x0544
300#define REG_NAV_PROT_LEN 0x0546
301#define REG_BCN_CTRL 0x0550
302#define REG_BCN_CTRL_1 0x0551
303#define REG_MBID_NUM 0x0552
304#define REG_DUAL_TSF_RST 0x0553
305#define REG_BCN_INTERVAL 0x0554
306#define REG_DRVERLYINT 0x0558
307#define REG_BCNDMATIM 0x0559
308#define REG_ATIMWND 0x055A
309#define REG_BCN_MAX_ERR 0x055D
310#define REG_RXTSF_OFFSET_CCK 0x055E
311#define REG_RXTSF_OFFSET_OFDM 0x055F
312#define REG_TSFTR 0x0560
313#define REG_CTWND 0x0572
314#define REG_PSTIMER 0x0580
315#define REG_TIMER0 0x0584
316#define REG_TIMER1 0x0588
317#define REG_BCN_PREDL_ITV 0x058F
318#define REG_ACMHWCTRL 0x05C0
319
320/*-----------------------------------------------------
321 *
322 * 0x0600h ~ 0x07FFh WMAC Configuration
323 *
324 *-----------------------------------------------------
325 */
326#define REG_MAC_CR 0x0600
327#define REG_BWOPMODE 0x0603
328#define REG_TCR 0x0604
329#define REG_RCR 0x0608
330#define REG_RX_PKT_LIMIT 0x060C
331#define REG_RX_DLK_TIME 0x060D
332#define REG_RX_DRVINFO_SZ 0x060F
333
334#define REG_MACID 0x0610
335#define REG_BSSID 0x0618
336#define REG_MAR 0x0620
337#define REG_MBIDCAMCFG 0x0628
338
339#define REG_USTIME_EDCA 0x0638
340#define REG_MAC_SPEC_SIFS 0x063A
341#define REG_RESP_SIFS_CCK 0x063C
342#define REG_RESP_SIFS_OFDM 0x063E
343#define REG_ACKTO 0x0640
344#define REG_CTS2TO 0x0641
345#define REG_EIFS 0x0642
346
347#define REG_NAV_UPPER 0x0652
348
349/* Security*/
350#define REG_CAMCMD 0x0670
351#define REG_CAMWRITE 0x0674
352#define REG_CAMREAD 0x0678
353#define REG_CAMDBG 0x067C
354#define REG_SECCFG 0x0680
355
356/* Power*/
357#define REG_WOW_CTRL 0x0690
358#define REG_PS_RX_INFO 0x0692
359#define REG_UAPSD_TID 0x0693
360#define REG_WKFMCAM_NUM 0x0698
361#define REG_WKFMCAM_RWD 0x069C
362#define REG_RXFLTMAP0 0x06A0
363#define REG_RXFLTMAP1 0x06A2
364#define REG_RXFLTMAP2 0x06A4
365#define REG_BCN_PSR_RPT 0x06A8
366#define REG_BT_COEX_TABLE 0x06C0
367#define REG_BFMER0_INFO 0x06E4
368#define REG_BFMER1_INFO 0x06EC
369#define REG_CSI_RPT_PARAM_BW20 0x06F4
370#define REG_CSI_RPT_PARAM_BW40 0x06F8
371#define REG_CSI_RPT_PARAM_BW80 0x06FC
372/* Hardware Port 2*/
373#define REG_MACID1 0x0700
374#define REG_BSSID1 0x0708
375#define REG_BFMEE_SEL 0x0714
376#define REG_SND_PTCL_CTRL 0x0718
377
378#define CR9346 REG_9346CR
379#define MSR (REG_CR + 2)
380#define ISR REG_HISR
381#define TSFR REG_TSFTR
382
383#define MACIDR0 REG_MACID
384#define MACIDR4 (REG_MACID + 4)
385
386#define PBP REG_PBP
387
388#define IDR0 MACIDR0
389#define IDR4 MACIDR4
390
391#define UNUSED_REGISTER 0x1BF
392#define DCAM UNUSED_REGISTER
393#define PSR UNUSED_REGISTER
394#define BBADDR UNUSED_REGISTER
395#define PHYDATAR UNUSED_REGISTER
396
397#define INVALID_BBRF_VALUE 0x12345678
398
399#define MAX_MSS_DENSITY_2T 0x13
400#define MAX_MSS_DENSITY_1T 0x0A
401
402#define CMDEEPROM_EN BIT(5)
403#define CMDEEPROM_SEL BIT(4)
404#define CMD9346CR_9356SEL BIT(4)
405#define AUTOLOAD_EEPROM (CMDEEPROM_EN | CMDEEPROM_SEL)
406#define AUTOLOAD_EFUSE CMDEEPROM_EN
407
408#define GPIOSEL_GPIO 0
409#define GPIOSEL_ENBT BIT(5)
410
411#define GPIO_IN REG_GPIO_PIN_CTRL
412#define GPIO_OUT (REG_GPIO_PIN_CTRL + 1)
413#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL + 2)
414#define GPIO_MOD (REG_GPIO_PIN_CTRL + 3)
415
416#define MSR_NOLINK 0x00
417#define MSR_ADHOC 0x01
418#define MSR_INFRA 0x02
419#define MSR_AP 0x03
420
421#define RRSR_RSC_OFFSET 21
422#define RRSR_SHORT_OFFSET 23
423#define RRSR_RSC_BW_40M 0x600000
424#define RRSR_RSC_UPSUBCHNL 0x400000
425#define RRSR_RSC_LOWSUBCHNL 0x200000
426#define RRSR_SHORT 0x800000
427#define RRSR_1M BIT(0)
428#define RRSR_2M BIT(1)
429#define RRSR_5_5M BIT(2)
430#define RRSR_11M BIT(3)
431#define RRSR_6M BIT(4)
432#define RRSR_9M BIT(5)
433#define RRSR_12M BIT(6)
434#define RRSR_18M BIT(7)
435#define RRSR_24M BIT(8)
436#define RRSR_36M BIT(9)
437#define RRSR_48M BIT(10)
438#define RRSR_54M BIT(11)
439#define RRSR_MCS0 BIT(12)
440#define RRSR_MCS1 BIT(13)
441#define RRSR_MCS2 BIT(14)
442#define RRSR_MCS3 BIT(15)
443#define RRSR_MCS4 BIT(16)
444#define RRSR_MCS5 BIT(17)
445#define RRSR_MCS6 BIT(18)
446#define RRSR_MCS7 BIT(19)
447#define BRSR_ACKSHORTPMB BIT(23)
448
449#define RATR_1M 0x00000001
450#define RATR_2M 0x00000002
451#define RATR_55M 0x00000004
452#define RATR_11M 0x00000008
453#define RATR_6M 0x00000010
454#define RATR_9M 0x00000020
455#define RATR_12M 0x00000040
456#define RATR_18M 0x00000080
457#define RATR_24M 0x00000100
458#define RATR_36M 0x00000200
459#define RATR_48M 0x00000400
460#define RATR_54M 0x00000800
461#define RATR_MCS0 0x00001000
462#define RATR_MCS1 0x00002000
463#define RATR_MCS2 0x00004000
464#define RATR_MCS3 0x00008000
465#define RATR_MCS4 0x00010000
466#define RATR_MCS5 0x00020000
467#define RATR_MCS6 0x00040000
468#define RATR_MCS7 0x00080000
469#define RATR_MCS8 0x00100000
470#define RATR_MCS9 0x00200000
471#define RATR_MCS10 0x00400000
472#define RATR_MCS11 0x00800000
473#define RATR_MCS12 0x01000000
474#define RATR_MCS13 0x02000000
475#define RATR_MCS14 0x04000000
476#define RATR_MCS15 0x08000000
477
478#define RATE_1M BIT(0)
479#define RATE_2M BIT(1)
480#define RATE_5_5M BIT(2)
481#define RATE_11M BIT(3)
482#define RATE_6M BIT(4)
483#define RATE_9M BIT(5)
484#define RATE_12M BIT(6)
485#define RATE_18M BIT(7)
486#define RATE_24M BIT(8)
487#define RATE_36M BIT(9)
488#define RATE_48M BIT(10)
489#define RATE_54M BIT(11)
490#define RATE_MCS0 BIT(12)
491#define RATE_MCS1 BIT(13)
492#define RATE_MCS2 BIT(14)
493#define RATE_MCS3 BIT(15)
494#define RATE_MCS4 BIT(16)
495#define RATE_MCS5 BIT(17)
496#define RATE_MCS6 BIT(18)
497#define RATE_MCS7 BIT(19)
498#define RATE_MCS8 BIT(20)
499#define RATE_MCS9 BIT(21)
500#define RATE_MCS10 BIT(22)
501#define RATE_MCS11 BIT(23)
502#define RATE_MCS12 BIT(24)
503#define RATE_MCS13 BIT(25)
504#define RATE_MCS14 BIT(26)
505#define RATE_MCS15 BIT(27)
506
507#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M)
508#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M |\
509 RATR_24M | RATR_36M | RATR_48M | RATR_54M)
510#define RATE_ALL_OFDM_1SS (RATR_MCS0 | RATR_MCS1 | RATR_MCS2 |\
511 RATR_MCS3 | RATR_MCS4 | RATR_MCS5 |\
512 RATR_MCS6 | RATR_MCS7)
513#define RATE_ALL_OFDM_2SS (RATR_MCS8 | RATR_MCS9 | RATR_MCS10 |\
514 RATR_MCS11 | RATR_MCS12 | RATR_MCS13 |\
515 RATR_MCS14 | RATR_MCS15)
516
517#define BW_OPMODE_20MHZ BIT(2)
518#define BW_OPMODE_5G BIT(1)
519#define CAM_VALID BIT(15)
520#define CAM_NOTVALID 0x0000
521#define CAM_USEDK BIT(5)
522
523#define CAM_NONE 0x0
524#define CAM_WEP40 0x01
525#define CAM_TKIP 0x02
526#define CAM_AES 0x04
527#define CAM_WEP104 0x05
528
529#define TOTAL_CAM_ENTRY 32
530#define HALF_CAM_ENTRY 16
531
532#define CAM_WRITE BIT(16)
533#define CAM_READ 0x00000000
534#define CAM_POLLINIG BIT(31)
535
536#define SCR_USEDK 0x01
537#define SCR_TXSEC_ENABLE 0x02
538#define SCR_RXSEC_ENABLE 0x04
539
540/*********************************************
541* 8192EE IMR/ISR bits
542**********************************************/
543#define IMR_DISABLED 0x0
544/* IMR DW0(0x0060-0063) Bit 0-31 */
545#define IMR_TIMER2 BIT(31)
546#define IMR_TIMER1 BIT(30)
547#define IMR_PSTIMEOUT BIT(29)
548#define IMR_GTINT4 BIT(28)
549#define IMR_GTINT3 BIT(27)
550#define IMR_TBDER BIT(26)
551#define IMR_TBDOK BIT(25)
552#define IMR_TSF_BIT32_TOGGLE BIT(24)
553#define IMR_BCNDMAINT0 BIT(20)
554#define IMR_BCNDOK0 BIT(16)
555#define IMR_BCNDMAINT_E BIT(14)
556#define IMR_ATIMEND BIT(12)
557#define IMR_HISR1_IND_INT BIT(11)
558#define IMR_C2HCMD BIT(10)
559#define IMR_CPWM2 BIT(9)
560#define IMR_CPWM BIT(8)
561#define IMR_HIGHDOK BIT(7)
562#define IMR_MGNTDOK BIT(6)
563#define IMR_BKDOK BIT(5)
564#define IMR_BEDOK BIT(4)
565#define IMR_VIDOK BIT(3)
566#define IMR_VODOK BIT(2)
567#define IMR_RDU BIT(1)
568#define IMR_ROK BIT(0)
569
570/* IMR DW1(0x00B4-00B7) Bit 0-31 */
571#define IMR_MCUERR BIT(28)
572#define IMR_BCNDMAINT7 BIT(27)
573#define IMR_BCNDMAINT6 BIT(26)
574#define IMR_BCNDMAINT5 BIT(25)
575#define IMR_BCNDMAINT4 BIT(24)
576#define IMR_BCNDMAINT3 BIT(23)
577#define IMR_BCNDMAINT2 BIT(22)
578#define IMR_BCNDMAINT1 BIT(21)
579#define IMR_BCNDOK7 BIT(20)
580#define IMR_BCNDOK6 BIT(19)
581#define IMR_BCNDOK5 BIT(18)
582#define IMR_BCNDOK4 BIT(17)
583#define IMR_BCNDOK3 BIT(16)
584#define IMR_BCNDOK2 BIT(15)
585#define IMR_BCNDOK1 BIT(14)
586#define IMR_ATIMEND_E BIT(13)
587#define IMR_TXERR BIT(11)
588#define IMR_RXERR BIT(10)
589#define IMR_TXFOVW BIT(9)
590#define IMR_RXFOVW BIT(8)
591
592#define HWSET_MAX_SIZE 512
593#define EFUSE_MAX_SECTION 64
594#define EFUSE_REAL_CONTENT_LEN 256
595#define EFUSE_OOB_PROTECT_BYTES 18
596
597#define EEPROM_DEFAULT_TSSI 0x0
598#define EEPROM_DEFAULT_TXPOWERDIFF 0x0
599#define EEPROM_DEFAULT_CRYSTALCAP 0x5
600#define EEPROM_DEFAULT_BOARDTYPE 0x02
601#define EEPROM_DEFAULT_TXPOWER 0x1010
602#define EEPROM_DEFAULT_HT2T_TXPWR 0x10
603
604#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
605#define EEPROM_DEFAULT_THERMALMETER 0x1A
606#define EEPROM_DEFAULT_ANTTXPOWERDIFF 0x0
607#define EEPROM_DEFAULT_TXPWDIFF_CRYSTALCAP 0x5
608#define EEPROM_DEFAULT_TXPOWERLEVEL 0x22
609#define EEPROM_DEFAULT_HT40_2SDIFF 0x0
610#define EEPROM_DEFAULT_HT20_DIFF 2
611#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
612#define EEPROM_DEFAULT_HT40_PWRMAXOFFSET 0
613#define EEPROM_DEFAULT_HT20_PWRMAXOFFSET 0
614
615#define RF_OPTION1 0x79
616#define RF_OPTION2 0x7A
617#define RF_OPTION3 0x7B
618#define RF_OPTION4 0x7C
619
620#define EEPROM_DEFAULT_PID 0x1234
621#define EEPROM_DEFAULT_VID 0x5678
622#define EEPROM_DEFAULT_CUSTOMERID 0xAB
623#define EEPROM_DEFAULT_SUBCUSTOMERID 0xCD
624#define EEPROM_DEFAULT_VERSION 0
625
626#define EEPROM_CHANNEL_PLAN_FCC 0x0
627#define EEPROM_CHANNEL_PLAN_IC 0x1
628#define EEPROM_CHANNEL_PLAN_ETSI 0x2
629#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
630#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
631#define EEPROM_CHANNEL_PLAN_MKK 0x5
632#define EEPROM_CHANNEL_PLAN_MKK1 0x6
633#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
634#define EEPROM_CHANNEL_PLAN_TELEC 0x8
635#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
636#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
637#define EEPROM_CHANNEL_PLAN_NCC 0xB
638#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
639
640#define EEPROM_CID_DEFAULT 0x0
641#define EEPROM_CID_TOSHIBA 0x4
642#define EEPROM_CID_CCX 0x10
643#define EEPROM_CID_QMI 0x0D
644#define EEPROM_CID_WHQL 0xFE
645
646#define RTL8192E_EEPROM_ID 0x8129
647
648#define EEPROM_HPON 0x02
649#define EEPROM_CLK 0x06
650#define EEPROM_TESTR 0x08
651
652#define EEPROM_TXPOWERCCK 0x10
653#define EEPROM_TXPOWERHT40_1S 0x16
654#define EEPROM_TXPOWERHT20DIFF 0x1B
655#define EEPROM_TXPOWER_OFDMDIFF 0x1B
656
657#define EEPROM_TX_PWR_INX 0x10
658
659#define EEPROM_CHANNELPLAN 0xB8
660#define EEPROM_XTAL_92E 0xB9
661#define EEPROM_THERMAL_METER_92E 0xBA
662#define EEPROM_IQK_LCK_92E 0xBB
663
664#define EEPROM_RF_BOARD_OPTION_92E 0xC1
665#define EEPROM_RF_FEATURE_OPTION_92E 0xC2
666#define EEPROM_RF_BT_SETTING_92E 0xC3
667#define EEPROM_VERSION 0xC4
668#define EEPROM_CUSTOMER_ID 0xC5
669#define EEPROM_RF_ANTENNA_OPT_92E 0xC9
670
671#define EEPROM_MAC_ADDR 0xD0
672#define EEPROM_VID 0xD6
673#define EEPROM_DID 0xD8
674#define EEPROM_SVID 0xDA
675#define EEPROM_SMID 0xDC
676
677#define STOPBECON BIT(6)
678#define STOPHIGHT BIT(5)
679#define STOPMGT BIT(4)
680#define STOPVO BIT(3)
681#define STOPVI BIT(2)
682#define STOPBE BIT(1)
683#define STOPBK BIT(0)
684
685#define RCR_APPFCS BIT(31)
686#define RCR_APP_MIC BIT(30)
687#define RCR_APP_ICV BIT(29)
688#define RCR_APP_PHYST_RXFF BIT(28)
689#define RCR_APP_BA_SSN BIT(27)
690#define RCR_ENMBID BIT(24)
691#define RCR_LSIGEN BIT(23)
692#define RCR_MFBEN BIT(22)
693#define RCR_HTC_LOC_CTRL BIT(14)
694#define RCR_AMF BIT(13)
695#define RCR_ACF BIT(12)
696#define RCR_ADF BIT(11)
697#define RCR_AICV BIT(9)
698#define RCR_ACRC32 BIT(8)
699#define RCR_CBSSID_BCN BIT(7)
700#define RCR_CBSSID_DATA BIT(6)
701#define RCR_CBSSID RCR_CBSSID_DATA
702#define RCR_APWRMGT BIT(5)
703#define RCR_ADD3 BIT(4)
704#define RCR_AB BIT(3)
705#define RCR_AM BIT(2)
706#define RCR_APM BIT(1)
707#define RCR_AAP BIT(0)
708#define RCR_MXDMA_OFFSET 8
709#define RCR_FIFO_OFFSET 13
710
711#define RSV_CTRL 0x001C
712#define RD_CTRL 0x0524
713
714#define REG_USB_INFO 0xFE17
715#define REG_USB_SPECIAL_OPTION 0xFE55
716#define REG_USB_DMA_AGG_TO 0xFE5B
717#define REG_USB_AGG_TO 0xFE5C
718#define REG_USB_AGG_TH 0xFE5D
719
720#define REG_USB_VID 0xFE60
721#define REG_USB_PID 0xFE62
722#define REG_USB_OPTIONAL 0xFE64
723#define REG_USB_CHIRP_K 0xFE65
724#define REG_USB_PHY 0xFE66
725#define REG_USB_MAC_ADDR 0xFE70
726#define REG_USB_HRPWM 0xFE58
727#define REG_USB_HCPWM 0xFE57
728
729#define SW18_FPWM BIT(3)
730
731#define ISO_MD2PP BIT(0)
732#define ISO_UA2USB BIT(1)
733#define ISO_UD2CORE BIT(2)
734#define ISO_PA2PCIE BIT(3)
735#define ISO_PD2CORE BIT(4)
736#define ISO_IP2MAC BIT(5)
737#define ISO_DIOP BIT(6)
738#define ISO_DIOE BIT(7)
739#define ISO_EB2CORE BIT(8)
740#define ISO_DIOR BIT(9)
741
742#define PWC_EV25V BIT(14)
743#define PWC_EV12V BIT(15)
744
745#define FEN_BBRSTB BIT(0)
746#define FEN_BB_GLB_RSTN BIT(1)
747#define FEN_USBA BIT(2)
748#define FEN_UPLL BIT(3)
749#define FEN_USBD BIT(4)
750#define FEN_DIO_PCIE BIT(5)
751#define FEN_PCIEA BIT(6)
752#define FEN_PPLL BIT(7)
753#define FEN_PCIED BIT(8)
754#define FEN_DIOE BIT(9)
755#define FEN_CPUEN BIT(10)
756#define FEN_DCORE BIT(11)
757#define FEN_ELDR BIT(12)
758#define FEN_DIO_RF BIT(13)
759#define FEN_HWPDN BIT(14)
760#define FEN_MREGEN BIT(15)
761
762#define PFM_LDALL BIT(0)
763#define PFM_ALDN BIT(1)
764#define PFM_LDKP BIT(2)
765#define PFM_WOWL BIT(3)
766#define ENPDN BIT(4)
767#define PDN_PL BIT(5)
768#define APFM_ONMAC BIT(8)
769#define APFM_OFF BIT(9)
770#define APFM_RSM BIT(10)
771#define AFSM_HSUS BIT(11)
772#define AFSM_PCIE BIT(12)
773#define APDM_MAC BIT(13)
774#define APDM_HOST BIT(14)
775#define APDM_HPDN BIT(15)
776#define RDY_MACON BIT(16)
777#define SUS_HOST BIT(17)
778#define ROP_ALD BIT(20)
779#define ROP_PWR BIT(21)
780#define ROP_SPS BIT(22)
781#define SOP_MRST BIT(25)
782#define SOP_FUSE BIT(26)
783#define SOP_ABG BIT(27)
784#define SOP_AMB BIT(28)
785#define SOP_RCK BIT(29)
786#define SOP_A8M BIT(30)
787#define XOP_BTCK BIT(31)
788
789#define ANAD16V_EN BIT(0)
790#define ANA8M BIT(1)
791#define MACSLP BIT(4)
792#define LOADER_CLK_EN BIT(5)
793#define _80M_SSC_DIS BIT(7)
794#define _80M_SSC_EN_HO BIT(8)
795#define PHY_SSC_RSTB BIT(9)
796#define SEC_CLK_EN BIT(10)
797#define MAC_CLK_EN BIT(11)
798#define SYS_CLK_EN BIT(12)
799#define RING_CLK_EN BIT(13)
800
801#define BOOT_FROM_EEPROM BIT(4)
802#define EEPROM_EN BIT(5)
803
804#define AFE_BGEN BIT(0)
805#define AFE_MBEN BIT(1)
806#define MAC_ID_EN BIT(7)
807
808#define WLOCK_ALL BIT(0)
809#define WLOCK_00 BIT(1)
810#define WLOCK_04 BIT(2)
811#define WLOCK_08 BIT(3)
812#define WLOCK_40 BIT(4)
813#define R_DIS_PRST_0 BIT(5)
814#define R_DIS_PRST_1 BIT(6)
815#define LOCK_ALL_EN BIT(7)
816
817#define RF_EN BIT(0)
818#define RF_RSTB BIT(1)
819#define RF_SDMRSTB BIT(2)
820
821#define LDA15_EN BIT(0)
822#define LDA15_STBY BIT(1)
823#define LDA15_OBUF BIT(2)
824#define LDA15_REG_VOS BIT(3)
825#define _LDA15_VOADJ(x) (((x) & 0x7) << 4)
826
827#define LDV12_EN BIT(0)
828#define LDV12_SDBY BIT(1)
829#define LPLDO_HSM BIT(2)
830#define LPLDO_LSM_DIS BIT(3)
831#define _LDV12_VADJ(x) (((x) & 0xF) << 4)
832
833#define XTAL_EN BIT(0)
834#define XTAL_BSEL BIT(1)
835#define _XTAL_BOSC(x) (((x) & 0x3) << 2)
836#define _XTAL_CADJ(x) (((x) & 0xF) << 4)
837#define XTAL_GATE_USB BIT(8)
838#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9)
839#define XTAL_GATE_AFE BIT(11)
840#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12)
841#define XTAL_RF_GATE BIT(14)
842#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15)
843#define XTAL_GATE_DIG BIT(17)
844#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18)
845#define XTAL_BT_GATE BIT(20)
846#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21)
847#define _XTAL_GPIO(x) (((x) & 0x7) << 23)
848
849#define CKDLY_AFE BIT(26)
850#define CKDLY_USB BIT(27)
851#define CKDLY_DIG BIT(28)
852#define CKDLY_BT BIT(29)
853
854#define APLL_EN BIT(0)
855#define APLL_320_EN BIT(1)
856#define APLL_FREF_SEL BIT(2)
857#define APLL_EDGE_SEL BIT(3)
858#define APLL_WDOGB BIT(4)
859#define APLL_LPFEN BIT(5)
860
861#define APLL_REF_CLK_13MHZ 0x1
862#define APLL_REF_CLK_19_2MHZ 0x2
863#define APLL_REF_CLK_20MHZ 0x3
864#define APLL_REF_CLK_25MHZ 0x4
865#define APLL_REF_CLK_26MHZ 0x5
866#define APLL_REF_CLK_38_4MHZ 0x6
867#define APLL_REF_CLK_40MHZ 0x7
868
869#define APLL_320EN BIT(14)
870#define APLL_80EN BIT(15)
871#define APLL_1MEN BIT(24)
872
873#define ALD_EN BIT(18)
874#define EF_PD BIT(19)
875#define EF_FLAG BIT(31)
876
877#define EF_TRPT BIT(7)
878#define LDOE25_EN BIT(31)
879
880#define RSM_EN BIT(0)
881#define TIMER_EN BIT(4)
882
883#define TRSW0EN BIT(2)
884#define TRSW1EN BIT(3)
885#define EROM_EN BIT(4)
886#define ENBT BIT(5)
887#define ENUART BIT(8)
888#define UART_910 BIT(9)
889#define ENPMAC BIT(10)
890#define SIC_SWRST BIT(11)
891#define ENSIC BIT(12)
892#define SIC_23 BIT(13)
893#define ENHDP BIT(14)
894#define SIC_LBK BIT(15)
895
896#define LED0PL BIT(4)
897#define LED1PL BIT(12)
898#define LED0DIS BIT(7)
899
900#define MCUFWDL_EN BIT(0)
901#define MCUFWDL_RDY BIT(1)
902#define FWDL_CHKSUM_RPT BIT(2)
903#define MACINI_RDY BIT(3)
904#define BBINI_RDY BIT(4)
905#define RFINI_RDY BIT(5)
906#define WINTINI_RDY BIT(6)
907#define CPRST BIT(23)
908
909#define XCLK_VLD BIT(0)
910#define ACLK_VLD BIT(1)
911#define UCLK_VLD BIT(2)
912#define PCLK_VLD BIT(3)
913#define PCIRSTB BIT(4)
914#define V15_VLD BIT(5)
915#define TRP_B15V_EN BIT(7)
916#define SIC_IDLE BIT(8)
917#define BD_MAC2 BIT(9)
918#define BD_MAC1 BIT(10)
919#define IC_MACPHY_MODE BIT(11)
920#define VENDOR_ID BIT(19)
921#define PAD_HWPD_IDN BIT(22)
922#define TRP_VAUX_EN BIT(23)
923#define TRP_BT_EN BIT(24)
924#define BD_PKG_SEL BIT(25)
925#define BD_HCI_SEL BIT(26)
926#define TYPE_ID BIT(27)
927
928#define CHIP_VER_RTL_MASK 0xF000
929#define CHIP_VER_RTL_SHIFT 12
930
931#define REG_LBMODE (REG_CR + 3)
932
933#define HCI_TXDMA_EN BIT(0)
934#define HCI_RXDMA_EN BIT(1)
935#define TXDMA_EN BIT(2)
936#define RXDMA_EN BIT(3)
937#define PROTOCOL_EN BIT(4)
938#define SCHEDULE_EN BIT(5)
939#define MACTXEN BIT(6)
940#define MACRXEN BIT(7)
941#define ENSWBCN BIT(8)
942#define ENSEC BIT(9)
943
944#define _NETTYPE(x) (((x) & 0x3) << 16)
945#define MASK_NETTYPE 0x30000
946#define NT_NO_LINK 0x0
947#define NT_LINK_AD_HOC 0x1
948#define NT_LINK_AP 0x2
949#define NT_AS_AP 0x3
950
951#define _LBMODE(x) (((x) & 0xF) << 24)
952#define MASK_LBMODE 0xF000000
953#define LOOPBACK_NORMAL 0x0
954#define LOOPBACK_IMMEDIATELY 0xB
955#define LOOPBACK_MAC_DELAY 0x3
956#define LOOPBACK_PHY 0x1
957#define LOOPBACK_DMA 0x7
958
959#define GET_RX_PAGE_SIZE(value) ((value) & 0xF)
960#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4)
961#define _PSRX_MASK 0xF
962#define _PSTX_MASK 0xF0
963#define _PSRX(x) (x)
964#define _PSTX(x) ((x) << 4)
965
966#define PBP_64 0x0
967#define PBP_128 0x1
968#define PBP_256 0x2
969#define PBP_512 0x3
970#define PBP_1024 0x4
971
972#define RXDMA_ARBBW_EN BIT(0)
973#define RXSHFT_EN BIT(1)
974#define RXDMA_AGG_EN BIT(2)
975#define QS_VO_QUEUE BIT(8)
976#define QS_VI_QUEUE BIT(9)
977#define QS_BE_QUEUE BIT(10)
978#define QS_BK_QUEUE BIT(11)
979#define QS_MANAGER_QUEUE BIT(12)
980#define QS_HIGH_QUEUE BIT(13)
981
982#define HQSEL_VOQ BIT(0)
983#define HQSEL_VIQ BIT(1)
984#define HQSEL_BEQ BIT(2)
985#define HQSEL_BKQ BIT(3)
986#define HQSEL_MGTQ BIT(4)
987#define HQSEL_HIQ BIT(5)
988
989#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14)
990#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12)
991#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10)
992#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8)
993#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6)
994#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4)
995
996#define QUEUE_LOW 1
997#define QUEUE_NORMAL 2
998#define QUEUE_HIGH 3
999
1000#define _LLT_NO_ACTIVE 0x0
1001#define _LLT_WRITE_ACCESS 0x1
1002#define _LLT_READ_ACCESS 0x2
1003
1004#define _LLT_INIT_DATA(x) ((x) & 0xFF)
1005#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8)
1006#define _LLT_OP(x) (((x) & 0x3) << 30)
1007#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3)
1008
1009#define BB_WRITE_READ_MASK (BIT(31) | BIT(30))
1010#define BB_WRITE_EN BIT(30)
1011#define BB_READ_EN BIT(31)
1012
1013#define _HPQ(x) ((x) & 0xFF)
1014#define _LPQ(x) (((x) & 0xFF) << 8)
1015#define _PUBQ(x) (((x) & 0xFF) << 16)
1016#define _NPQ(x) ((x) & 0xFF)
1017
1018#define HPQ_PUBLIC_DIS BIT(24)
1019#define LPQ_PUBLIC_DIS BIT(25)
1020#define LD_RQPN BIT(31)
1021
1022#define BCN_VALID BIT(16)
1023#define BCN_HEAD(x) (((x) & 0xFF) << 8)
1024#define BCN_HEAD_MASK 0xFF00
1025
1026#define BLK_DESC_NUM_SHIFT 4
1027#define BLK_DESC_NUM_MASK 0xF
1028
1029#define DROP_DATA_EN BIT(9)
1030
1031#define EN_AMPDU_RTY_NEW BIT(7)
1032
1033#define _INIRTSMCS_SEL(x) ((x) & 0x3F)
1034
1035#define _SPEC_SIFS_CCK(x) ((x) & 0xFF)
1036#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8)
1037
1038#define RATE_REG_BITMAP_ALL 0xFFFFF
1039
1040#define _RRSC_BITMAP(x) ((x) & 0xFFFFF)
1041
1042#define _RRSR_RSC(x) (((x) & 0x3) << 21)
1043#define RRSR_RSC_RESERVED 0x0
1044#define RRSR_RSC_UPPER_SUBCHANNEL 0x1
1045#define RRSR_RSC_LOWER_SUBCHANNEL 0x2
1046#define RRSR_RSC_DUPLICATE_MODE 0x3
1047
1048#define USE_SHORT_G1 BIT(20)
1049
1050#define _AGGLMT_MCS0(x) ((x) & 0xF)
1051#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4)
1052#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8)
1053#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12)
1054#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16)
1055#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20)
1056#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24)
1057#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28)
1058
1059#define RETRY_LIMIT_SHORT_SHIFT 8
1060#define RETRY_LIMIT_LONG_SHIFT 0
1061
1062#define _DARF_RC1(x) ((x) & 0x1F)
1063#define _DARF_RC2(x) (((x) & 0x1F) << 8)
1064#define _DARF_RC3(x) (((x) & 0x1F) << 16)
1065#define _DARF_RC4(x) (((x) & 0x1F) << 24)
1066#define _DARF_RC5(x) ((x) & 0x1F)
1067#define _DARF_RC6(x) (((x) & 0x1F) << 8)
1068#define _DARF_RC7(x) (((x) & 0x1F) << 16)
1069#define _DARF_RC8(x) (((x) & 0x1F) << 24)
1070
1071#define _RARF_RC1(x) ((x) & 0x1F)
1072#define _RARF_RC2(x) (((x) & 0x1F) << 8)
1073#define _RARF_RC3(x) (((x) & 0x1F) << 16)
1074#define _RARF_RC4(x) (((x) & 0x1F) << 24)
1075#define _RARF_RC5(x) ((x) & 0x1F)
1076#define _RARF_RC6(x) (((x) & 0x1F) << 8)
1077#define _RARF_RC7(x) (((x) & 0x1F) << 16)
1078#define _RARF_RC8(x) (((x) & 0x1F) << 24)
1079
1080#define AC_PARAM_TXOP_LIMIT_OFFSET 16
1081#define AC_PARAM_ECW_MAX_OFFSET 12
1082#define AC_PARAM_ECW_MIN_OFFSET 8
1083#define AC_PARAM_AIFS_OFFSET 0
1084
1085#define _AIFS(x) (x)
1086#define _ECW_MAX_MIN(x) ((x) << 8)
1087#define _TXOP_LIMIT(x) ((x) << 16)
1088
1089#define _BCNIFS(x) ((x) & 0xFF)
1090#define _BCNECW(x) ((((x) & 0xF)) << 8)
1091
1092#define _LRL(x) ((x) & 0x3F)
1093#define _SRL(x) (((x) & 0x3F) << 8)
1094
1095#define _SIFS_CCK_CTX(x) ((x) & 0xFF)
1096#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8)
1097
1098#define _SIFS_OFDM_CTX(x) ((x) & 0xFF)
1099#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8)
1100
1101#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8)
1102
1103#define DIS_EDCA_CNT_DWN BIT(11)
1104
1105#define EN_MBSSID BIT(1)
1106#define EN_TXBCN_RPT BIT(2)
1107#define EN_BCN_FUNCTION BIT(3)
1108
1109#define TSFTR_RST BIT(0)
1110#define TSFTR1_RST BIT(1)
1111
1112#define STOP_BCNQ BIT(6)
1113
1114#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4)
1115#define DIS_TSF_UDT0_TEST_CHIP BIT(5)
1116
1117#define ACMHW_HWEN BIT(0)
1118#define ACMHW_BEQEN BIT(1)
1119#define ACMHW_VIQEN BIT(2)
1120#define ACMHW_VOQEN BIT(3)
1121#define ACMHW_BEQSTATUS BIT(4)
1122#define ACMHW_VIQSTATUS BIT(5)
1123#define ACMHW_VOQSTATUS BIT(6)
1124
1125#define APSDOFF BIT(6)
1126#define APSDOFF_STATUS BIT(7)
1127
1128#define BW_20MHZ BIT(2)
1129
1130#define RATE_BITMAP_ALL 0xFFFFF
1131
1132#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1
1133
1134#define TSFRST BIT(0)
1135#define DIS_GCLK BIT(1)
1136#define PAD_SEL BIT(2)
1137#define PWR_ST BIT(6)
1138#define PWRBIT_OW_EN BIT(7)
1139#define ACRC BIT(8)
1140#define CFENDFORM BIT(9)
1141#define ICV BIT(10)
1142
1143#define AAP BIT(0)
1144#define APM BIT(1)
1145#define AM BIT(2)
1146#define AB BIT(3)
1147#define ADD3 BIT(4)
1148#define APWRMGT BIT(5)
1149#define CBSSID BIT(6)
1150#define CBSSID_DATA BIT(6)
1151#define CBSSID_BCN BIT(7)
1152#define ACRC32 BIT(8)
1153#define AICV BIT(9)
1154#define ADF BIT(11)
1155#define ACF BIT(12)
1156#define AMF BIT(13)
1157#define HTC_LOC_CTRL BIT(14)
1158#define UC_DATA_EN BIT(16)
1159#define BM_DATA_EN BIT(17)
1160#define MFBEN BIT(22)
1161#define LSIGEN BIT(23)
1162#define ENMBID BIT(24)
1163#define APP_BASSN BIT(27)
1164#define APP_PHYSTS BIT(28)
1165#define APP_ICV BIT(29)
1166#define APP_MIC BIT(30)
1167#define APP_FCS BIT(31)
1168
1169#define _MIN_SPACE(x) ((x) & 0x7)
1170#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
1171
1172#define RXERR_TYPE_OFDM_PPDU 0
1173#define RXERR_TYPE_OFDM_FALSE_ALARM 1
1174#define RXERR_TYPE_OFDM_MPDU_OK 2
1175#define RXERR_TYPE_OFDM_MPDU_FAIL 3
1176#define RXERR_TYPE_CCK_PPDU 4
1177#define RXERR_TYPE_CCK_FALSE_ALARM 5
1178#define RXERR_TYPE_CCK_MPDU_OK 6
1179#define RXERR_TYPE_CCK_MPDU_FAIL 7
1180#define RXERR_TYPE_HT_PPDU 8
1181#define RXERR_TYPE_HT_FALSE_ALARM 9
1182#define RXERR_TYPE_HT_MPDU_TOTAL 10
1183#define RXERR_TYPE_HT_MPDU_OK 11
1184#define RXERR_TYPE_HT_MPDU_FAIL 12
1185#define RXERR_TYPE_RX_FULL_DROP 15
1186
1187#define RXERR_COUNTER_MASK 0xFFFFF
1188#define RXERR_RPT_RST BIT(27)
1189#define _RXERR_RPT_SEL(type) ((type) << 28)
1190
1191#define SCR_TXUSEDK BIT(0)
1192#define SCR_RXUSEDK BIT(1)
1193#define SCR_TXENCENABLE BIT(2)
1194#define SCR_RXDECENABLE BIT(3)
1195#define SCR_SKBYA2 BIT(4)
1196#define SCR_NOSKMC BIT(5)
1197#define SCR_TXBCUSEDK BIT(6)
1198#define SCR_RXBCUSEDK BIT(7)
1199
1200#define USB_IS_HIGH_SPEED 0
1201#define USB_IS_FULL_SPEED 1
1202#define USB_SPEED_MASK BIT(5)
1203
1204#define USB_NORMAL_SIE_EP_MASK 0xF
1205#define USB_NORMAL_SIE_EP_SHIFT 4
1206
1207#define USB_TEST_EP_MASK 0x30
1208#define USB_TEST_EP_SHIFT 4
1209
1210#define USB_AGG_EN BIT(3)
1211
1212#define MAC_ADDR_LEN 6
1213#define LAST_ENTRY_OF_TX_PKT_BUFFER 175
1214
1215#define POLLING_LLT_THRESHOLD 20
1216#define POLLING_READY_TIMEOUT_COUNT 3000
1217
1218#define MAX_MSS_DENSITY_2T 0x13
1219#define MAX_MSS_DENSITY_1T 0x0A
1220
1221#define EPROM_CMD_OPERATING_MODE_MASK ((1 << 7) | (1 << 6))
1222#define EPROM_CMD_CONFIG 0x3
1223#define EPROM_CMD_LOAD 1
1224
1225#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE
1226
1227#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2)
1228
1229#define RPMAC_RESET 0x100
1230#define RPMAC_TXSTART 0x104
1231#define RPMAC_TXLEGACYSIG 0x108
1232#define RPMAC_TXHTSIG1 0x10c
1233#define RPMAC_TXHTSIG2 0x110
1234#define RPMAC_PHYDEBUG 0x114
1235#define RPMAC_TXPACKETNUM 0x118
1236#define RPMAC_TXIDLE 0x11c
1237#define RPMAC_TXMACHEADER0 0x120
1238#define RPMAC_TXMACHEADER1 0x124
1239#define RPMAC_TXMACHEADER2 0x128
1240#define RPMAC_TXMACHEADER3 0x12c
1241#define RPMAC_TXMACHEADER4 0x130
1242#define RPMAC_TXMACHEADER5 0x134
1243#define RPMAC_TXDADATYPE 0x138
1244#define RPMAC_TXRANDOMSEED 0x13c
1245#define RPMAC_CCKPLCPPREAMBLE 0x140
1246#define RPMAC_CCKPLCPHEADER 0x144
1247#define RPMAC_CCKCRC16 0x148
1248#define RPMAC_OFDMRXCRC32OK 0x170
1249#define RPMAC_OFDMRXCRC32ER 0x174
1250#define RPMAC_OFDMRXPARITYER 0x178
1251#define RPMAC_OFDMRXCRC8ER 0x17c
1252#define RPMAC_CCKCRXRC16ER 0x180
1253#define RPMAC_CCKCRXRC32ER 0x184
1254#define RPMAC_CCKCRXRC32OK 0x188
1255#define RPMAC_TXSTATUS 0x18c
1256
1257#define RFPGA0_RFMOD 0x800
1258
1259#define RFPGA0_TXINFO 0x804
1260#define RFPGA0_PSDFUNCTION 0x808
1261
1262#define RFPGA0_TXGAINSTAGE 0x80c
1263
1264#define RFPGA0_RFTIMING1 0x810
1265#define RFPGA0_RFTIMING2 0x814
1266
1267#define RFPGA0_XA_HSSIPARAMETER1 0x820
1268#define RFPGA0_XA_HSSIPARAMETER2 0x824
1269#define RFPGA0_XB_HSSIPARAMETER1 0x828
1270#define RFPGA0_XB_HSSIPARAMETER2 0x82c
1271
1272#define RFPGA0_XA_LSSIPARAMETER 0x840
1273#define RFPGA0_XB_LSSIPARAMETER 0x844
1274
1275#define RFPGA0_RFWAKEUPPARAMETER 0x850
1276#define RFPGA0_RFSLEEPUPPARAMETER 0x854
1277
1278#define RFPGA0_XAB_SWITCHCONTROL 0x858
1279#define RFPGA0_XCD_SWITCHCONTROL 0x85c
1280
1281#define RFPGA0_XA_RFINTERFACEOE 0x860
1282#define RFPGA0_XB_RFINTERFACEOE 0x864
1283
1284#define RFPGA0_XAB_RFINTERFACESW 0x870
1285#define RFPGA0_XCD_RFINTERFACESW 0x874
1286
1287#define RFPGA0_XAB_RFPARAMETER 0x878
1288#define RFPGA0_XCD_RFPARAMETER 0x87c
1289
1290#define RFPGA0_ANALOGPARAMETER1 0x880
1291#define RFPGA0_ANALOGPARAMETER2 0x884
1292#define RFPGA0_ANALOGPARAMETER3 0x888
1293#define RFPGA0_ANALOGPARAMETER4 0x88c
1294
1295#define RFPGA0_XA_LSSIREADBACK 0x8a0
1296#define RFPGA0_XB_LSSIREADBACK 0x8a4
1297#define RFPGA0_XC_LSSIREADBACK 0x8a8
1298#define RFPGA0_XD_LSSIREADBACK 0x8ac
1299
1300#define RFPGA0_PSDREPORT 0x8b4
1301#define TRANSCEIVEA_HSPI_READBACK 0x8b8
1302#define TRANSCEIVEB_HSPI_READBACK 0x8bc
1303#define REG_SC_CNT 0x8c4
1304#define RFPGA0_XAB_RFINTERFACERB 0x8e0
1305#define RFPGA0_XCD_RFINTERFACERB 0x8e4
1306
1307#define RFPGA1_RFMOD 0x900
1308
1309#define RFPGA1_TXBLOCK 0x904
1310#define RFPGA1_DEBUGSELECT 0x908
1311#define RFPGA1_TXINFO 0x90c
1312
1313#define RCCK0_SYSTEM 0xa00
1314
1315#define RCCK0_AFESETTING 0xa04
1316#define RCCK0_CCA 0xa08
1317
1318#define RCCK0_RXAGC1 0xa0c
1319#define RCCK0_RXAGC2 0xa10
1320
1321#define RCCK0_RXHP 0xa14
1322
1323#define RCCK0_DSPPARAMETER1 0xa18
1324#define RCCK0_DSPPARAMETER2 0xa1c
1325
1326#define RCCK0_TXFILTER1 0xa20
1327#define RCCK0_TXFILTER2 0xa24
1328#define RCCK0_DEBUGPORT 0xa28
1329#define RCCK0_FALSEALARMREPORT 0xa2c
1330#define RCCK0_TRSSIREPORT 0xa50
1331#define RCCK0_RXREPORT 0xa54
1332#define RCCK0_FACOUNTERLOWER 0xa5c
1333#define RCCK0_FACOUNTERUPPER 0xa58
1334#define RCCK0_CCA_CNT 0xa60
1335
1336/* PageB(0xB00) */
1337#define RPDP_ANTA 0xb00
1338#define RPDP_ANTA_4 0xb04
1339#define RPDP_ANTA_8 0xb08
1340#define RPDP_ANTA_C 0xb0c
1341#define RPDP_ANTA_10 0xb10
1342#define RPDP_ANTA_14 0xb14
1343#define RPDP_ANTA_18 0xb18
1344#define RPDP_ANTA_1C 0xb1c
1345#define RPDP_ANTA_20 0xb20
1346#define RPDP_ANTA_24 0xb24
1347
1348#define RCONFIG_PMPD_ANTA 0xb28
1349#define RCONFIG_RAM64x16 0xb2c
1350
1351#define RBNDA 0xb30
1352#define RHSSIPAR 0xb34
1353
1354#define RCONFIG_ANTA 0xb68
1355#define RCONFIG_ANTB 0xb6c
1356
1357#define RPDP_ANTB 0xb70
1358#define RPDP_ANTB_4 0xb74
1359#define RPDP_ANTB_8 0xb78
1360#define RPDP_ANTB_C 0xb7c
1361#define RPDP_ANTB_10 0xb80
1362#define RPDP_ANTB_14 0xb84
1363#define RPDP_ANTB_18 0xb88
1364#define RPDP_ANTB_1C 0xb8c
1365#define RPDP_ANTB_20 0xb90
1366#define RPDP_ANTB_24 0xb94
1367
1368#define RCONFIG_PMPD_ANTB 0xb98
1369
1370#define RBNDB 0xba0
1371
1372#define RAPK 0xbd8
1373#define RPM_RX0_ANTA 0xbdc
1374#define RPM_RX1_ANTA 0xbe0
1375#define RPM_RX2_ANTA 0xbe4
1376#define RPM_RX3_ANTA 0xbe8
1377#define RPM_RX0_ANTB 0xbec
1378#define RPM_RX1_ANTB 0xbf0
1379#define RPM_RX2_ANTB 0xbf4
1380#define RPM_RX3_ANTB 0xbf8
1381
1382/*Page C*/
1383#define ROFDM0_LSTF 0xc00
1384
1385#define ROFDM0_TRXPATHENABLE 0xc04
1386#define ROFDM0_TRMUXPAR 0xc08
1387#define ROFDM0_TRSWISOLATION 0xc0c
1388
1389#define ROFDM0_XARXAFE 0xc10
1390#define ROFDM0_XARXIQIMBALANCE 0xc14
1391#define ROFDM0_XBRXAFE 0xc18
1392#define ROFDM0_XBRXIQIMBALANCE 0xc1c
1393#define ROFDM0_XCRXAFE 0xc20
1394#define ROFDM0_XCRXIQIMBANLANCE 0xc24
1395#define ROFDM0_XDRXAFE 0xc28
1396#define ROFDM0_XDRXIQIMBALANCE 0xc2c
1397
1398#define ROFDM0_RXDETECTOR1 0xc30
1399#define ROFDM0_RXDETECTOR2 0xc34
1400#define ROFDM0_RXDETECTOR3 0xc38
1401#define ROFDM0_RXDETECTOR4 0xc3c
1402
1403#define ROFDM0_RXDSP 0xc40
1404#define ROFDM0_CFOANDDAGC 0xc44
1405#define ROFDM0_CCADROPTHRESHOLD 0xc48
1406#define ROFDM0_ECCATHRESHOLD 0xc4c
1407
1408#define ROFDM0_XAAGCCORE1 0xc50
1409#define ROFDM0_XAAGCCORE2 0xc54
1410#define ROFDM0_XBAGCCORE1 0xc58
1411#define ROFDM0_XBAGCCORE2 0xc5c
1412#define ROFDM0_XCAGCCORE1 0xc60
1413#define ROFDM0_XCAGCCORE2 0xc64
1414#define ROFDM0_XDAGCCORE1 0xc68
1415#define ROFDM0_XDAGCCORE2 0xc6c
1416
1417#define ROFDM0_AGCPARAMETER1 0xc70
1418#define ROFDM0_AGCPARAMETER2 0xc74
1419#define ROFDM0_AGCRSSITABLE 0xc78
1420#define ROFDM0_HTSTFAGC 0xc7c
1421
1422#define ROFDM0_XATXIQIMBALANCE 0xc80
1423#define ROFDM0_XATXAFE 0xc84
1424#define ROFDM0_XBTXIQIMBALANCE 0xc88
1425#define ROFDM0_XBTXAFE 0xc8c
1426#define ROFDM0_XCTXIQIMBALANCE 0xc90
1427#define ROFDM0_XCTXAFE 0xc94
1428#define ROFDM0_XDTXIQIMBALANCE 0xc98
1429#define ROFDM0_XDTXAFE 0xc9c
1430
1431#define ROFDM0_RXIQEXTANTA 0xca0
1432#define ROFDM0_TXCOEFF1 0xca4
1433#define ROFDM0_TXCOEFF2 0xca8
1434#define ROFDM0_TXCOEFF3 0xcac
1435#define ROFDM0_TXCOEFF4 0xcb0
1436#define ROFDM0_TXCOEFF5 0xcb4
1437#define ROFDM0_TXCOEFF6 0xcb8
1438
1439#define ROFDM0_RXHPPARAMETER 0xce0
1440#define ROFDM0_TXPSEUDONOISEWGT 0xce4
1441#define ROFDM0_FRAMESYNC 0xcf0
1442#define ROFDM0_DFSREPORT 0xcf4
1443
1444#define ROFDM1_LSTF 0xd00
1445#define ROFDM1_TRXPATHENABLE 0xd04
1446
1447#define ROFDM1_CF0 0xd08
1448#define ROFDM1_CSI1 0xd10
1449#define ROFDM1_SBD 0xd14
1450#define ROFDM1_CSI2 0xd18
1451#define ROFDM1_CFOTRACKING 0xd2c
1452#define ROFDM1_TRXMESAURE1 0xd34
1453#define ROFDM1_INTFDET 0xd3c
1454#define ROFDM1_PSEUDONOISESTATEAB 0xd50
1455#define ROFDM1_PSEUDONOISESTATECD 0xd54
1456#define ROFDM1_RXPSEUDONOISEWGT 0xd58
1457
1458#define ROFDM_PHYCOUNTER1 0xda0
1459#define ROFDM_PHYCOUNTER2 0xda4
1460#define ROFDM_PHYCOUNTER3 0xda8
1461
1462#define ROFDM_SHORTCFOAB 0xdac
1463#define ROFDM_SHORTCFOCD 0xdb0
1464#define ROFDM_LONGCFOAB 0xdb4
1465#define ROFDM_LONGCFOCD 0xdb8
1466#define ROFDM_TAILCF0AB 0xdbc
1467#define ROFDM_TAILCF0CD 0xdc0
1468#define ROFDM_PWMEASURE1 0xdc4
1469#define ROFDM_PWMEASURE2 0xdc8
1470#define ROFDM_BWREPORT 0xdcc
1471#define ROFDM_AGCREPORT 0xdd0
1472#define ROFDM_RXSNR 0xdd4
1473#define ROFDM_RXEVMCSI 0xdd8
1474#define ROFDM_SIGREPORT 0xddc
1475
1476#define RTXAGC_A_RATE18_06 0xe00
1477#define RTXAGC_A_RATE54_24 0xe04
1478#define RTXAGC_A_CCK1_MCS32 0xe08
1479#define RTXAGC_A_MCS03_MCS00 0xe10
1480#define RTXAGC_A_MCS07_MCS04 0xe14
1481#define RTXAGC_A_MCS11_MCS08 0xe18
1482#define RTXAGC_A_MCS15_MCS12 0xe1c
1483
1484#define RTXAGC_B_RATE18_06 0x830
1485#define RTXAGC_B_RATE54_24 0x834
1486#define RTXAGC_B_CCK1_55_MCS32 0x838
1487#define RTXAGC_B_MCS03_MCS00 0x83c
1488#define RTXAGC_B_MCS07_MCS04 0x848
1489#define RTXAGC_B_MCS11_MCS08 0x84c
1490#define RTXAGC_B_MCS15_MCS12 0x868
1491#define RTXAGC_B_CCK11_A_CCK2_11 0x86c
1492
1493#define RFPGA0_IQK 0xe28
1494#define RTX_IQK_TONE_A 0xe30
1495#define RRX_IQK_TONE_A 0xe34
1496#define RTX_IQK_PI_A 0xe38
1497#define RRX_IQK_PI_A 0xe3c
1498
1499#define RTX_IQK 0xe40
1500#define RRX_IQK 0xe44
1501#define RIQK_AGC_PTS 0xe48
1502#define RIQK_AGC_RSP 0xe4c
1503#define RTX_IQK_TONE_B 0xe50
1504#define RRX_IQK_TONE_B 0xe54
1505#define RTX_IQK_PI_B 0xe58
1506#define RRX_IQK_PI_B 0xe5c
1507#define RIQK_AGC_CONT 0xe60
1508
1509#define RBLUE_TOOTH 0xe6c
1510#define RRX_WAIT_CCA 0xe70
1511#define RTX_CCK_RFON 0xe74
1512#define RTX_CCK_BBON 0xe78
1513#define RTX_OFDM_RFON 0xe7c
1514#define RTX_OFDM_BBON 0xe80
1515#define RTX_TO_RX 0xe84
1516#define RTX_TO_TX 0xe88
1517#define RRX_CCK 0xe8c
1518
1519#define RTX_POWER_BEFORE_IQK_A 0xe94
1520#define RTX_POWER_AFTER_IQK_A 0xe9c
1521
1522#define RRX_POWER_BEFORE_IQK_A 0xea0
1523#define RRX_POWER_BEFORE_IQK_A_2 0xea4
1524#define RRX_POWER_AFTER_IQK_A 0xea8
1525#define RRX_POWER_AFTER_IQK_A_2 0xeac
1526
1527#define RTX_POWER_BEFORE_IQK_B 0xeb4
1528#define RTX_POWER_AFTER_IQK_B 0xebc
1529
1530#define RRX_POWER_BEFORE_IQK_B 0xec0
1531#define RRX_POWER_BEFORE_IQK_B_2 0xec4
1532#define RRX_POWER_AFTER_IQK_B 0xec8
1533#define RRX_POWER_AFTER_IQK_B_2 0xecc
1534
1535#define RRX_OFDM 0xed0
1536#define RRX_WAIT_RIFS 0xed4
1537#define RRX_TO_RX 0xed8
1538#define RSTANDBY 0xedc
1539#define RSLEEP 0xee0
1540#define RPMPD_ANAEN 0xeec
1541
1542#define RZEBRA1_HSSIENABLE 0x0
1543#define RZEBRA1_TRXENABLE1 0x1
1544#define RZEBRA1_TRXENABLE2 0x2
1545#define RZEBRA1_AGC 0x4
1546#define RZEBRA1_CHARGEPUMP 0x5
1547#define RZEBRA1_CHANNEL 0x7
1548
1549#define RZEBRA1_TXGAIN 0x8
1550#define RZEBRA1_TXLPF 0x9
1551#define RZEBRA1_RXLPF 0xb
1552#define RZEBRA1_RXHPFCORNER 0xc
1553
1554#define RGLOBALCTRL 0
1555#define RRTL8256_TXLPF 19
1556#define RRTL8256_RXLPF 11
1557#define RRTL8258_TXLPF 0x11
1558#define RRTL8258_RXLPF 0x13
1559#define RRTL8258_RSSILPF 0xa
1560
1561#define RF_AC 0x00
1562
1563#define RF_IQADJ_G1 0x01
1564#define RF_IQADJ_G2 0x02
1565#define RF_POW_TRSW 0x05
1566
1567#define RF_GAIN_RX 0x06
1568#define RF_GAIN_TX 0x07
1569
1570#define RF_TXM_IDAC 0x08
1571#define RF_BS_IQGEN 0x0F
1572
1573#define RF_MODE1 0x10
1574#define RF_MODE2 0x11
1575
1576#define RF_RX_AGC_HP 0x12
1577#define RF_TX_AGC 0x13
1578#define RF_BIAS 0x14
1579#define RF_IPA 0x15
1580#define RF_POW_ABILITY 0x17
1581#define RF_MODE_AG 0x18
1582#define RRFCHANNEL 0x18
1583#define RF_CHNLBW 0x18
1584#define RF_TOP 0x19
1585
1586#define RF_RX_G1 0x1A
1587#define RF_RX_G2 0x1B
1588
1589#define RF_RX_BB2 0x1C
1590#define RF_RX_BB1 0x1D
1591
1592#define RF_RCK1 0x1E
1593#define RF_RCK2 0x1F
1594
1595#define RF_TX_G1 0x20
1596#define RF_TX_G2 0x21
1597#define RF_TX_G3 0x22
1598
1599#define RF_TX_BB1 0x23
1600#define RF_T_METER 0x42
1601
1602#define RF_SYN_G1 0x25
1603#define RF_SYN_G2 0x26
1604#define RF_SYN_G3 0x27
1605#define RF_SYN_G4 0x28
1606#define RF_SYN_G5 0x29
1607#define RF_SYN_G6 0x2A
1608#define RF_SYN_G7 0x2B
1609#define RF_SYN_G8 0x2C
1610
1611#define RF_RCK_OS 0x30
1612#define RF_TXPA_G1 0x31
1613#define RF_TXPA_G2 0x32
1614#define RF_TXPA_G3 0x33
1615
1616#define RF_TX_BIAS_A 0x35
1617#define RF_TX_BIAS_D 0x36
1618#define RF_LOBF_9 0x38
1619#define RF_RXRF_A3 0x3C
1620#define RF_TRSW 0x3F
1621
1622#define RF_TXRF_A2 0x41
1623#define RF_TXPA_G4 0x46
1624#define RF_TXPA_A4 0x4B
1625
1626#define RF_WE_LUT 0xEF
1627
1628#define BBBRESETB 0x100
1629#define BGLOBALRESETB 0x200
1630#define BOFDMTXSTART 0x4
1631#define BCCKTXSTART 0x8
1632#define BCRC32DEBUG 0x100
1633#define BPMACLOOPBACK 0x10
1634#define BTXLSIG 0xffffff
1635#define BOFDMTXRATE 0xf
1636#define BOFDMTXRESERVED 0x10
1637#define BOFDMTXLENGTH 0x1ffe0
1638#define BOFDMTXPARITY 0x20000
1639#define BTXHTSIG1 0xffffff
1640#define BTXHTMCSRATE 0x7f
1641#define BTXHTBW 0x80
1642#define BTXHTLENGTH 0xffff00
1643#define BTXHTSIG2 0xffffff
1644#define BTXHTSMOOTHING 0x1
1645#define BTXHTSOUNDING 0x2
1646#define BTXHTRESERVED 0x4
1647#define BTXHTAGGREATION 0x8
1648#define BTXHTSTBC 0x30
1649#define BTXHTADVANCECODING 0x40
1650#define BTXHTSHORTGI 0x80
1651#define BTXHTNUMBERHT_LTF 0x300
1652#define BTXHTCRC8 0x3fc00
1653#define BCOUNTERRESET 0x10000
1654#define BNUMOFOFDMTX 0xffff
1655#define BNUMOFCCKTX 0xffff0000
1656#define BTXIDLEINTERVAL 0xffff
1657#define BOFDMSERVICE 0xffff0000
1658#define BTXMACHEADER 0xffffffff
1659#define BTXDATAINIT 0xff
1660#define BTXHTMODE 0x100
1661#define BTXDATATYPE 0x30000
1662#define BTXRANDOMSEED 0xffffffff
1663#define BCCKTXPREAMBLE 0x1
1664#define BCCKTXSFD 0xffff0000
1665#define BCCKTXSIG 0xff
1666#define BCCKTXSERVICE 0xff00
1667#define BCCKLENGTHEXT 0x8000
1668#define BCCKTXLENGHT 0xffff0000
1669#define BCCKTXCRC16 0xffff
1670#define BCCKTXSTATUS 0x1
1671#define BOFDMTXSTATUS 0x2
1672#define IS_BB_REG_OFFSET_92S(_offset) \
1673 ((_offset >= 0x800) && (_offset <= 0xfff))
1674
1675#define BRFMOD 0x1
1676#define BJAPANMODE 0x2
1677#define BCCKTXSC 0x30
1678#define BCCKEN 0x1000000
1679#define BOFDMEN 0x2000000
1680
1681#define BOFDMRXADCPHASE 0x10000
1682#define BOFDMTXDACPHASE 0x40000
1683#define BXATXAGC 0x3f
1684
1685#define BXBTXAGC 0xf00
1686#define BXCTXAGC 0xf000
1687#define BXDTXAGC 0xf0000
1688
1689#define BPASTART 0xf0000000
1690#define BTRSTART 0x00f00000
1691#define BRFSTART 0x0000f000
1692#define BBBSTART 0x000000f0
1693#define BBBCCKSTART 0x0000000f
1694#define BPAEND 0xf
1695#define BTREND 0x0f000000
1696#define BRFEND 0x000f0000
1697#define BCCAMASK 0x000000f0
1698#define BR2RCCAMASK 0x00000f00
1699#define BHSSI_R2TDELAY 0xf8000000
1700#define BHSSI_T2RDELAY 0xf80000
1701#define BCONTXHSSI 0x400
1702#define BIGFROMCCK 0x200
1703#define BAGCADDRESS 0x3f
1704#define BRXHPTX 0x7000
1705#define BRXHP2RX 0x38000
1706#define BRXHPCCKINI 0xc0000
1707#define BAGCTXCODE 0xc00000
1708#define BAGCRXCODE 0x300000
1709
1710#define B3WIREDATALENGTH 0x800
1711#define B3WIREADDREAALENGTH 0x400
1712
1713#define B3WIRERFPOWERDOWN 0x1
1714#define B5GPAPEPOLARITY 0x40000000
1715#define B2GPAPEPOLARITY 0x80000000
1716#define BRFSW_TXDEFAULTANT 0x3
1717#define BRFSW_TXOPTIONANT 0x30
1718#define BRFSW_RXDEFAULTANT 0x300
1719#define BRFSW_RXOPTIONANT 0x3000
1720#define BRFSI_3WIREDATA 0x1
1721#define BRFSI_3WIRECLOCK 0x2
1722#define BRFSI_3WIRELOAD 0x4
1723#define BRFSI_3WIRERW 0x8
1724#define BRFSI_3WIRE 0xf
1725
1726#define BRFSI_RFENV 0x10
1727
1728#define BRFSI_TRSW 0x20
1729#define BRFSI_TRSWB 0x40
1730#define BRFSI_ANTSW 0x100
1731#define BRFSI_ANTSWB 0x200
1732#define BRFSI_PAPE 0x400
1733#define BRFSI_PAPE5G 0x800
1734#define BBANDSELECT 0x1
1735#define BHTSIG2_GI 0x80
1736#define BHTSIG2_SMOOTHING 0x01
1737#define BHTSIG2_SOUNDING 0x02
1738#define BHTSIG2_AGGREATON 0x08
1739#define BHTSIG2_STBC 0x30
1740#define BHTSIG2_ADVCODING 0x40
1741#define BHTSIG2_NUMOFHTLTF 0x300
1742#define BHTSIG2_CRC8 0x3fc
1743#define BHTSIG1_MCS 0x7f
1744#define BHTSIG1_BANDWIDTH 0x80
1745#define BHTSIG1_HTLENGTH 0xffff
1746#define BLSIG_RATE 0xf
1747#define BLSIG_RESERVED 0x10
1748#define BLSIG_LENGTH 0x1fffe
1749#define BLSIG_PARITY 0x20
1750#define BCCKRXPHASE 0x4
1751
1752#define BLSSIREADADDRESS 0x7f800000
1753#define BLSSIREADEDGE 0x80000000
1754
1755#define BLSSIREADBACKDATA 0xfffff
1756
1757#define BLSSIREADOKFLAG 0x1000
1758#define BCCKSAMPLERATE 0x8
1759#define BREGULATOR0STANDBY 0x1
1760#define BREGULATORPLLSTANDBY 0x2
1761#define BREGULATOR1STANDBY 0x4
1762#define BPLLPOWERUP 0x8
1763#define BDPLLPOWERUP 0x10
1764#define BDA10POWERUP 0x20
1765#define BAD7POWERUP 0x200
1766#define BDA6POWERUP 0x2000
1767#define BXTALPOWERUP 0x4000
1768#define B40MDCLKPOWERUP 0x8000
1769#define BDA6DEBUGMODE 0x20000
1770#define BDA6SWING 0x380000
1771
1772#define BADCLKPHASE 0x4000000
1773#define B80MCLKDELAY 0x18000000
1774#define BAFEWATCHDOGENABLE 0x20000000
1775
1776#define BXTALCAP01 0xc0000000
1777#define BXTALCAP23 0x3
1778#define BXTALCAP92X 0x0f000000
1779#define BXTALCAP 0x0f000000
1780
1781#define BINTDIFCLKENABLE 0x400
1782#define BEXTSIGCLKENABLE 0x800
1783#define BBANDGAP_MBIAS_POWERUP 0x10000
1784#define BAD11SH_GAIN 0xc0000
1785#define BAD11NPUT_RANGE 0x700000
1786#define BAD110P_CURRENT 0x3800000
1787#define BLPATH_LOOPBACK 0x4000000
1788#define BQPATH_LOOPBACK 0x8000000
1789#define BAFE_LOOPBACK 0x10000000
1790#define BDA10_SWING 0x7e0
1791#define BDA10_REVERSE 0x800
1792#define BDA_CLK_SOURCE 0x1000
1793#define BDA7INPUT_RANGE 0x6000
1794#define BDA7_GAIN 0x38000
1795#define BDA7OUTPUT_CM_MODE 0x40000
1796#define BDA7INPUT_CM_MODE 0x380000
1797#define BDA7CURRENT 0xc00000
1798#define BREGULATOR_ADJUST 0x7000000
1799#define BAD11POWERUP_ATTX 0x1
1800#define BDA10PS_ATTX 0x10
1801#define BAD11POWERUP_ATRX 0x100
1802#define BDA10PS_ATRX 0x1000
1803#define BCCKRX_AGC_FORMAT 0x200
1804#define BPSDFFT_SAMPLE_POINT 0xc000
1805#define BPSD_AVERAGE_NUM 0x3000
1806#define BIQPATH_CONTROL 0xc00
1807#define BPSD_FREQ 0x3ff
1808#define BPSD_ANTENNA_PATH 0x30
1809#define BPSD_IQ_SWITCH 0x40
1810#define BPSD_RX_TRIGGER 0x400000
1811#define BPSD_TX_TRIGGER 0x80000000
1812#define BPSD_SINE_TONE_SCALE 0x7f000000
1813#define BPSD_REPORT 0xffff
1814
1815#define BOFDM_TXSC 0x30000000
1816#define BCCK_TXON 0x1
1817#define BOFDM_TXON 0x2
1818#define BDEBUG_PAGE 0xfff
1819#define BDEBUG_ITEM 0xff
1820#define BANTL 0x10
1821#define BANT_NONHT 0x100
1822#define BANT_HT1 0x1000
1823#define BANT_HT2 0x10000
1824#define BANT_HT1S1 0x100000
1825#define BANT_NONHTS1 0x1000000
1826
1827#define BCCK_BBMODE 0x3
1828#define BCCK_TXPOWERSAVING 0x80
1829#define BCCK_RXPOWERSAVING 0x40
1830
1831#define BCCK_SIDEBAND 0x10
1832
1833#define BCCK_SCRAMBLE 0x8
1834#define BCCK_ANTDIVERSITY 0x8000
1835#define BCCK_CARRIER_RECOVERY 0x4000
1836#define BCCK_TXRATE 0x3000
1837#define BCCK_DCCANCEL 0x0800
1838#define BCCK_ISICANCEL 0x0400
1839#define BCCK_MATCH_FILTER 0x0200
1840#define BCCK_EQUALIZER 0x0100
1841#define BCCK_PREAMBLE_DETECT 0x800000
1842#define BCCK_FAST_FALSECCA 0x400000
1843#define BCCK_CH_ESTSTART 0x300000
1844#define BCCK_CCA_COUNT 0x080000
1845#define BCCK_CS_LIM 0x070000
1846#define BCCK_BIST_MODE 0x80000000
1847#define BCCK_CCAMASK 0x40000000
1848#define BCCK_TX_DAC_PHASE 0x4
1849#define BCCK_RX_ADC_PHASE 0x20000000
1850#define BCCKR_CP_MODE 0x0100
1851#define BCCK_TXDC_OFFSET 0xf0
1852#define BCCK_RXDC_OFFSET 0xf
1853#define BCCK_CCA_MODE 0xc000
1854#define BCCK_FALSECS_LIM 0x3f00
1855#define BCCK_CS_RATIO 0xc00000
1856#define BCCK_CORGBIT_SEL 0x300000
1857#define BCCK_PD_LIM 0x0f0000
1858#define BCCK_NEWCCA 0x80000000
1859#define BCCK_RXHP_OF_IG 0x8000
1860#define BCCK_RXIG 0x7f00
1861#define BCCK_LNA_POLARITY 0x800000
1862#define BCCK_RX1ST_BAIN 0x7f0000
1863#define BCCK_RF_EXTEND 0x20000000
1864#define BCCK_RXAGC_SATLEVEL 0x1f000000
1865#define BCCK_RXAGC_SATCOUNT 0xe0
1866#define BCCKRXRFSETTLE 0x1f
1867#define BCCK_FIXED_RXAGC 0x8000
1868#define BCCK_ANTENNA_POLARITY 0x2000
1869#define BCCK_TXFILTER_TYPE 0x0c00
1870#define BCCK_RXAGC_REPORTTYPE 0x0300
1871#define BCCK_RXDAGC_EN 0x80000000
1872#define BCCK_RXDAGC_PERIOD 0x20000000
1873#define BCCK_RXDAGC_SATLEVEL 0x1f000000
1874#define BCCK_TIMING_RECOVERY 0x800000
1875#define BCCK_TXC0 0x3f0000
1876#define BCCK_TXC1 0x3f000000
1877#define BCCK_TXC2 0x3f
1878#define BCCK_TXC3 0x3f00
1879#define BCCK_TXC4 0x3f0000
1880#define BCCK_TXC5 0x3f000000
1881#define BCCK_TXC6 0x3f
1882#define BCCK_TXC7 0x3f00
1883#define BCCK_DEBUGPORT 0xff0000
1884#define BCCK_DAC_DEBUG 0x0f000000
1885#define BCCK_FALSEALARM_ENABLE 0x8000
1886#define BCCK_FALSEALARM_READ 0x4000
1887#define BCCK_TRSSI 0x7f
1888#define BCCK_RXAGC_REPORT 0xfe
1889#define BCCK_RXREPORT_ANTSEL 0x80000000
1890#define BCCK_RXREPORT_MFOFF 0x40000000
1891#define BCCK_RXREPORT_SQLOSS 0x20000000
1892#define BCCK_RXREPORT_PKTLOSS 0x10000000
1893#define BCCK_RXREPORT_LOCKEDBIT 0x08000000
1894#define BCCK_RXREPORT_RATEERROR 0x04000000
1895#define BCCK_RXREPORT_RXRATE 0x03000000
1896#define BCCK_RXFA_COUNTER_LOWER 0xff
1897#define BCCK_RXFA_COUNTER_UPPER 0xff000000
1898#define BCCK_RXHPAGC_START 0xe000
1899#define BCCK_RXHPAGC_FINAL 0x1c00
1900#define BCCK_RXFALSEALARM_ENABLE 0x8000
1901#define BCCK_FACOUNTER_FREEZE 0x4000
1902#define BCCK_TXPATH_SEL 0x10000000
1903#define BCCK_DEFAULT_RXPATH 0xc000000
1904#define BCCK_OPTION_RXPATH 0x3000000
1905
1906#define BNUM_OFSTF 0x3
1907#define BSHIFT_L 0xc0
1908#define BGI_TH 0xc
1909#define BRXPATH_A 0x1
1910#define BRXPATH_B 0x2
1911#define BRXPATH_C 0x4
1912#define BRXPATH_D 0x8
1913#define BTXPATH_A 0x1
1914#define BTXPATH_B 0x2
1915#define BTXPATH_C 0x4
1916#define BTXPATH_D 0x8
1917#define BTRSSI_FREQ 0x200
1918#define BADC_BACKOFF 0x3000
1919#define BDFIR_BACKOFF 0xc000
1920#define BTRSSI_LATCH_PHASE 0x10000
1921#define BRX_LDC_OFFSET 0xff
1922#define BRX_QDC_OFFSET 0xff00
1923#define BRX_DFIR_MODE 0x1800000
1924#define BRX_DCNF_TYPE 0xe000000
1925#define BRXIQIMB_A 0x3ff
1926#define BRXIQIMB_B 0xfc00
1927#define BRXIQIMB_C 0x3f0000
1928#define BRXIQIMB_D 0xffc00000
1929#define BDC_DC_NOTCH 0x60000
1930#define BRXNB_NOTCH 0x1f000000
1931#define BPD_TH 0xf
1932#define BPD_TH_OPT2 0xc000
1933#define BPWED_TH 0x700
1934#define BIFMF_WIN_L 0x800
1935#define BPD_OPTION 0x1000
1936#define BMF_WIN_L 0xe000
1937#define BBW_SEARCH_L 0x30000
1938#define BWIN_ENH_L 0xc0000
1939#define BBW_TH 0x700000
1940#define BED_TH2 0x3800000
1941#define BBW_OPTION 0x4000000
1942#define BRADIO_TH 0x18000000
1943#define BWINDOW_L 0xe0000000
1944#define BSBD_OPTION 0x1
1945#define BFRAME_TH 0x1c
1946#define BFS_OPTION 0x60
1947#define BDC_SLOPE_CHECK 0x80
1948#define BFGUARD_COUNTER_DC_L 0xe00
1949#define BFRAME_WEIGHT_SHORT 0x7000
1950#define BSUB_TUNE 0xe00000
1951#define BFRAME_DC_LENGTH 0xe000000
1952#define BSBD_START_OFFSET 0x30000000
1953#define BFRAME_TH_2 0x7
1954#define BFRAME_GI2_TH 0x38
1955#define BGI2_SYNC_EN 0x40
1956#define BSARCH_SHORT_EARLY 0x300
1957#define BSARCH_SHORT_LATE 0xc00
1958#define BSARCH_GI2_LATE 0x70000
1959#define BCFOANTSUM 0x1
1960#define BCFOACC 0x2
1961#define BCFOSTARTOFFSET 0xc
1962#define BCFOLOOPBACK 0x70
1963#define BCFOSUMWEIGHT 0x80
1964#define BDAGCENABLE 0x10000
1965#define BTXIQIMB_A 0x3ff
1966#define BTXIQIMB_b 0xfc00
1967#define BTXIQIMB_C 0x3f0000
1968#define BTXIQIMB_D 0xffc00000
1969#define BTXIDCOFFSET 0xff
1970#define BTXIQDCOFFSET 0xff00
1971#define BTXDFIRMODE 0x10000
1972#define BTXPESUDO_NOISEON 0x4000000
1973#define BTXPESUDO_NOISE_A 0xff
1974#define BTXPESUDO_NOISE_B 0xff00
1975#define BTXPESUDO_NOISE_C 0xff0000
1976#define BTXPESUDO_NOISE_D 0xff000000
1977#define BCCA_DROPOPTION 0x20000
1978#define BCCA_DROPTHRES 0xfff00000
1979#define BEDCCA_H 0xf
1980#define BEDCCA_L 0xf0
1981#define BLAMBDA_ED 0x300
1982#define BRX_INITIALGAIN 0x7f
1983#define BRX_ANTDIV_EN 0x80
1984#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00
1985#define BRX_HIGHPOWER_FLOW 0x8000
1986#define BRX_AGC_FREEZE_THRES 0xc0000
1987#define BRX_FREEZESTEP_AGC1 0x300000
1988#define BRX_FREEZESTEP_AGC2 0xc00000
1989#define BRX_FREEZESTEP_AGC3 0x3000000
1990#define BRX_FREEZESTEP_AGC0 0xc000000
1991#define BRXRSSI_CMP_EN 0x10000000
1992#define BRXQUICK_AGCEN 0x20000000
1993#define BRXAGC_FREEZE_THRES_MODE 0x40000000
1994#define BRX_OVERFLOW_CHECKTYPE 0x80000000
1995#define BRX_AGCSHIFT 0x7f
1996#define BTRSW_TRI_ONLY 0x80
1997#define BPOWER_THRES 0x300
1998#define BRXAGC_EN 0x1
1999#define BRXAGC_TOGETHER_EN 0x2
2000#define BRXAGC_MIN 0x4
2001#define BRXHP_INI 0x7
2002#define BRXHP_TRLNA 0x70
2003#define BRXHP_RSSI 0x700
2004#define BRXHP_BBP1 0x7000
2005#define BRXHP_BBP2 0x70000
2006#define BRXHP_BBP3 0x700000
2007#define BRSSI_H 0x7f0000
2008#define BRSSI_GEN 0x7f000000
2009#define BRXSETTLE_TRSW 0x7
2010#define BRXSETTLE_LNA 0x38
2011#define BRXSETTLE_RSSI 0x1c0
2012#define BRXSETTLE_BBP 0xe00
2013#define BRXSETTLE_RXHP 0x7000
2014#define BRXSETTLE_ANTSW_RSSI 0x38000
2015#define BRXSETTLE_ANTSW 0xc0000
2016#define BRXPROCESS_TIME_DAGC 0x300000
2017#define BRXSETTLE_HSSI 0x400000
2018#define BRXPROCESS_TIME_BBPPW 0x800000
2019#define BRXANTENNA_POWER_SHIFT 0x3000000
2020#define BRSSI_TABLE_SELECT 0xc000000
2021#define BRXHP_FINAL 0x7000000
2022#define BRXHPSETTLE_BBP 0x7
2023#define BRXHTSETTLE_HSSI 0x8
2024#define BRXHTSETTLE_RXHP 0x70
2025#define BRXHTSETTLE_BBPPW 0x80
2026#define BRXHTSETTLE_IDLE 0x300
2027#define BRXHTSETTLE_RESERVED 0x1c00
2028#define BRXHT_RXHP_EN 0x8000
2029#define BRXAGC_FREEZE_THRES 0x30000
2030#define BRXAGC_TOGETHEREN 0x40000
2031#define BRXHTAGC_MIN 0x80000
2032#define BRXHTAGC_EN 0x100000
2033#define BRXHTDAGC_EN 0x200000
2034#define BRXHT_RXHP_BBP 0x1c00000
2035#define BRXHT_RXHP_FINAL 0xe0000000
2036#define BRXPW_RADIO_TH 0x3
2037#define BRXPW_RADIO_EN 0x4
2038#define BRXMF_HOLD 0x3800
2039#define BRXPD_DELAY_TH1 0x38
2040#define BRXPD_DELAY_TH2 0x1c0
2041#define BRXPD_DC_COUNT_MAX 0x600
2042#define BRXPD_DELAY_TH 0x8000
2043#define BRXPROCESS_DELAY 0xf0000
2044#define BRXSEARCHRANGE_GI2_EARLY 0x700000
2045#define BRXFRAME_FUARD_COUNTER_L 0x3800000
2046#define BRXSGI_GUARD_L 0xc000000
2047#define BRXSGI_SEARCH_L 0x30000000
2048#define BRXSGI_TH 0xc0000000
2049#define BDFSCNT0 0xff
2050#define BDFSCNT1 0xff00
2051#define BDFSFLAG 0xf0000
2052#define BMF_WEIGHT_SUM 0x300000
2053#define BMINIDX_TH 0x7f000000
2054#define BDAFORMAT 0x40000
2055#define BTXCH_EMU_ENABLE 0x01000000
2056#define BTRSW_ISOLATION_A 0x7f
2057#define BTRSW_ISOLATION_B 0x7f00
2058#define BTRSW_ISOLATION_C 0x7f0000
2059#define BTRSW_ISOLATION_D 0x7f000000
2060#define BEXT_LNA_GAIN 0x7c00
2061
2062#define BSTBC_EN 0x4
2063#define BANTENNA_MAPPING 0x10
2064#define BNSS 0x20
2065#define BCFO_ANTSUM_ID 0x200
2066#define BPHY_COUNTER_RESET 0x8000000
2067#define BCFO_REPORT_GET 0x4000000
2068#define BOFDM_CONTINUE_TX 0x10000000
2069#define BOFDM_SINGLE_CARRIER 0x20000000
2070#define BOFDM_SINGLE_TONE 0x40000000
2071#define BHT_DETECT 0x100
2072#define BCFOEN 0x10000
2073#define BCFOVALUE 0xfff00000
2074#define BSIGTONE_RE 0x3f
2075#define BSIGTONE_IM 0x7f00
2076#define BCOUNTER_CCA 0xffff
2077#define BCOUNTER_PARITYFAIL 0xffff0000
2078#define BCOUNTER_RATEILLEGAL 0xffff
2079#define BCOUNTER_CRC8FAIL 0xffff0000
2080#define BCOUNTER_MCSNOSUPPORT 0xffff
2081#define BCOUNTER_FASTSYNC 0xffff
2082#define BSHORTCFO 0xfff
2083#define BSHORTCFOT_LENGTH 12
2084#define BSHORTCFOF_LENGTH 11
2085#define BLONGCFO 0x7ff
2086#define BLONGCFOT_LENGTH 11
2087#define BLONGCFOF_LENGTH 11
2088#define BTAILCFO 0x1fff
2089#define BTAILCFOT_LENGTH 13
2090#define BTAILCFOF_LENGTH 12
2091#define BNOISE_EN_PWDB 0xffff
2092#define BCC_POWER_DB 0xffff0000
2093#define BMOISE_PWDB 0xffff
2094#define BPOWERMEAST_LENGTH 10
2095#define BPOWERMEASF_LENGTH 3
2096#define BRX_HT_BW 0x1
2097#define BRXSC 0x6
2098#define BRX_HT 0x8
2099#define BNB_INTF_DET_ON 0x1
2100#define BINTF_WIN_LEN_CFG 0x30
2101#define BNB_INTF_TH_CFG 0x1c0
2102#define BRFGAIN 0x3f
2103#define BTABLESEL 0x40
2104#define BTRSW 0x80
2105#define BRXSNR_A 0xff
2106#define BRXSNR_B 0xff00
2107#define BRXSNR_C 0xff0000
2108#define BRXSNR_D 0xff000000
2109#define BSNR_EVMT_LENGTH 8
2110#define BSNR_EVMF_LENGTH 1
2111#define BCSI1ST 0xff
2112#define BCSI2ND 0xff00
2113#define BRXEVM1ST 0xff0000
2114#define BRXEVM2ND 0xff000000
2115#define BSIGEVM 0xff
2116#define BPWDB 0xff00
2117#define BSGIEN 0x10000
2118
2119#define BSFACTOR_QMA1 0xf
2120#define BSFACTOR_QMA2 0xf0
2121#define BSFACTOR_QMA3 0xf00
2122#define BSFACTOR_QMA4 0xf000
2123#define BSFACTOR_QMA5 0xf0000
2124#define BSFACTOR_QMA6 0xf0000
2125#define BSFACTOR_QMA7 0xf00000
2126#define BSFACTOR_QMA8 0xf000000
2127#define BSFACTOR_QMA9 0xf0000000
2128#define BCSI_SCHEME 0x100000
2129
2130#define BNOISE_LVL_TOP_SET 0x3
2131#define BCHSMOOTH 0x4
2132#define BCHSMOOTH_CFG1 0x38
2133#define BCHSMOOTH_CFG2 0x1c0
2134#define BCHSMOOTH_CFG3 0xe00
2135#define BCHSMOOTH_CFG4 0x7000
2136#define BMRCMODE 0x800000
2137#define BTHEVMCFG 0x7000000
2138
2139#define BLOOP_FIT_TYPE 0x1
2140#define BUPD_CFO 0x40
2141#define BUPD_CFO_OFFDATA 0x80
2142#define BADV_UPD_CFO 0x100
2143#define BADV_TIME_CTRL 0x800
2144#define BUPD_CLKO 0x1000
2145#define BFC 0x6000
2146#define BTRACKING_MODE 0x8000
2147#define BPHCMP_ENABLE 0x10000
2148#define BUPD_CLKO_LTF 0x20000
2149#define BCOM_CH_CFO 0x40000
2150#define BCSI_ESTI_MODE 0x80000
2151#define BADV_UPD_EQZ 0x100000
2152#define BUCHCFG 0x7000000
2153#define BUPDEQZ 0x8000000
2154
2155#define BRX_PESUDO_NOISE_ON 0x20000000
2156#define BRX_PESUDO_NOISE_A 0xff
2157#define BRX_PESUDO_NOISE_B 0xff00
2158#define BRX_PESUDO_NOISE_C 0xff0000
2159#define BRX_PESUDO_NOISE_D 0xff000000
2160#define BRX_PESUDO_NOISESTATE_A 0xffff
2161#define BRX_PESUDO_NOISESTATE_B 0xffff0000
2162#define BRX_PESUDO_NOISESTATE_C 0xffff
2163#define BRX_PESUDO_NOISESTATE_D 0xffff0000
2164
2165#define BZEBRA1_HSSIENABLE 0x8
2166#define BZEBRA1_TRXCONTROL 0xc00
2167#define BZEBRA1_TRXGAINSETTING 0x07f
2168#define BZEBRA1_RXCOUNTER 0xc00
2169#define BZEBRA1_TXCHANGEPUMP 0x38
2170#define BZEBRA1_RXCHANGEPUMP 0x7
2171#define BZEBRA1_CHANNEL_NUM 0xf80
2172#define BZEBRA1_TXLPFBW 0x400
2173#define BZEBRA1_RXLPFBW 0x600
2174
2175#define BRTL8256REG_MODE_CTRL1 0x100
2176#define BRTL8256REG_MODE_CTRL0 0x40
2177#define BRTL8256REG_TXLPFBW 0x18
2178#define BRTL8256REG_RXLPFBW 0x600
2179
2180#define BRTL8258_TXLPFBW 0xc
2181#define BRTL8258_RXLPFBW 0xc00
2182#define BRTL8258_RSSILPFBW 0xc0
2183
2184#define BBYTE0 0x1
2185#define BBYTE1 0x2
2186#define BBYTE2 0x4
2187#define BBYTE3 0x8
2188#define BWORD0 0x3
2189#define BWORD1 0xc
2190#define BWORD 0xf
2191
2192#define MASKBYTE0 0xff
2193#define MASKBYTE1 0xff00
2194#define MASKBYTE2 0xff0000
2195#define MASKBYTE3 0xff000000
2196#define MASKHWORD 0xffff0000
2197#define MASKLWORD 0x0000ffff
2198#define MASKDWORD 0xffffffff
2199#define MASK12BITS 0xfff
2200#define MASKH4BITS 0xf0000000
2201#define MASKOFDM_D 0xffc00000
2202#define MASKCCK 0x3f3f3f3f
2203
2204#define MASK4BITS 0x0f
2205#define MASK20BITS 0xfffff
2206#define RFREG_OFFSET_MASK 0xfffff
2207
2208#define BENABLE 0x1
2209#define BDISABLE 0x0
2210
2211#define LEFT_ANTENNA 0x0
2212#define RIGHT_ANTENNA 0x1
2213
2214#define TCHECK_TXSTATUS 500
2215#define TUPDATE_RXCOUNTER 100
2216
2217#define REG_UN_used_register 0x01bf
2218
2219/* WOL bit information */
2220#define HAL92C_WOL_PTK_UPDATE_EVENT BIT(0)
2221#define HAL92C_WOL_GTK_UPDATE_EVENT BIT(1)
2222#define HAL92C_WOL_DISASSOC_EVENT BIT(2)
2223#define HAL92C_WOL_DEAUTH_EVENT BIT(3)
2224#define HAL92C_WOL_FW_DISCONNECT_EVENT BIT(4)
2225
2226#define WOL_REASON_PTK_UPDATE BIT(0)
2227#define WOL_REASON_GTK_UPDATE BIT(1)
2228#define WOL_REASON_DISASSOC BIT(2)
2229#define WOL_REASON_DEAUTH BIT(3)
2230#define WOL_REASON_FW_DISCONNECT BIT(4)
2231#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/rf.c b/drivers/net/wireless/rtlwifi/rtl8192ee/rf.c
new file mode 100644
index 000000000000..c9bc33cd1090
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/rf.c
@@ -0,0 +1,152 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "reg.h"
28#include "def.h"
29#include "phy.h"
30#include "rf.h"
31#include "dm.h"
32
33static bool _rtl92ee_phy_rf6052_config_parafile(struct ieee80211_hw *hw);
34
35void rtl92ee_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
36{
37 struct rtl_priv *rtlpriv = rtl_priv(hw);
38 struct rtl_phy *rtlphy = &rtlpriv->phy;
39
40 switch (bandwidth) {
41 case HT_CHANNEL_WIDTH_20:
42 rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] &
43 0xfffff3ff) | BIT(10) | BIT(11));
44 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK,
45 rtlphy->rfreg_chnlval[0]);
46 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK,
47 rtlphy->rfreg_chnlval[0]);
48 break;
49 case HT_CHANNEL_WIDTH_20_40:
50 rtlphy->rfreg_chnlval[0] = ((rtlphy->rfreg_chnlval[0] &
51 0xfffff3ff) | BIT(10));
52 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK,
53 rtlphy->rfreg_chnlval[0]);
54 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, RFREG_OFFSET_MASK,
55 rtlphy->rfreg_chnlval[0]);
56 break;
57 default:
58 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
59 "unknown bandwidth: %#X\n", bandwidth);
60 break;
61 }
62}
63
64bool rtl92ee_phy_rf6052_config(struct ieee80211_hw *hw)
65{
66 struct rtl_priv *rtlpriv = rtl_priv(hw);
67 struct rtl_phy *rtlphy = &rtlpriv->phy;
68
69 if (rtlphy->rf_type == RF_1T1R)
70 rtlphy->num_total_rfpath = 1;
71 else
72 rtlphy->num_total_rfpath = 2;
73
74 return _rtl92ee_phy_rf6052_config_parafile(hw);
75}
76
77static bool _rtl92ee_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
78{
79 struct rtl_priv *rtlpriv = rtl_priv(hw);
80 struct rtl_phy *rtlphy = &rtlpriv->phy;
81 u32 u4_regvalue = 0;
82 u8 rfpath;
83 bool rtstatus = true;
84 struct bb_reg_def *pphyreg;
85
86 for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
87 pphyreg = &rtlphy->phyreg_def[rfpath];
88
89 switch (rfpath) {
90 case RF90_PATH_A:
91 case RF90_PATH_C:
92 u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
93 BRFSI_RFENV);
94 break;
95 case RF90_PATH_B:
96 case RF90_PATH_D:
97 u4_regvalue = rtl_get_bbreg(hw, pphyreg->rfintfs,
98 BRFSI_RFENV << 16);
99 break;
100 }
101
102 rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
103 udelay(1);
104
105 rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
106 udelay(1);
107
108 rtl_set_bbreg(hw, pphyreg->rfhssi_para2,
109 B3WIREADDREAALENGTH, 0x0);
110 udelay(1);
111
112 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
113 udelay(1);
114
115 switch (rfpath) {
116 case RF90_PATH_A:
117 rtstatus = rtl92ee_phy_config_rf_with_headerfile(hw,
118 (enum radio_path)rfpath);
119 break;
120 case RF90_PATH_B:
121 rtstatus = rtl92ee_phy_config_rf_with_headerfile(hw,
122 (enum radio_path)rfpath);
123 break;
124 case RF90_PATH_C:
125 break;
126 case RF90_PATH_D:
127 break;
128 }
129
130 switch (rfpath) {
131 case RF90_PATH_A:
132 case RF90_PATH_C:
133 rtl_set_bbreg(hw, pphyreg->rfintfs,
134 BRFSI_RFENV, u4_regvalue);
135 break;
136 case RF90_PATH_B:
137 case RF90_PATH_D:
138 rtl_set_bbreg(hw, pphyreg->rfintfs,
139 BRFSI_RFENV << 16, u4_regvalue);
140 break;
141 }
142
143 if (!rtstatus) {
144 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
145 "Radio[%d] Fail!!", rfpath);
146 return false;
147 }
148 }
149
150 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
151 return rtstatus;
152}
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/rf.h b/drivers/net/wireless/rtlwifi/rtl8192ee/rf.h
new file mode 100644
index 000000000000..8bdeed3c064e
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/rf.h
@@ -0,0 +1,36 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_RF_H__
27#define __RTL92E_RF_H__
28
29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31
32void rtl92ee_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth);
34bool rtl92ee_phy_rf6052_config(struct ieee80211_hw *hw);
35
36#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/sw.c b/drivers/net/wireless/rtlwifi/rtl8192ee/sw.c
new file mode 100644
index 000000000000..9b5a7d5be121
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/sw.c
@@ -0,0 +1,399 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../core.h"
28#include "../pci.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "dm.h"
33#include "hw.h"
34#include "sw.h"
35#include "fw.h"
36#include "trx.h"
37#include "led.h"
38#include "table.h"
39
40#include "../btcoexist/rtl_btc.h"
41
42#include <linux/vmalloc.h>
43#include <linux/module.h>
44
45static void rtl92ee_init_aspm_vars(struct ieee80211_hw *hw)
46{
47 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
48
49 /*close ASPM for AMD defaultly */
50 rtlpci->const_amdpci_aspm = 0;
51
52 /**
53 * ASPM PS mode.
54 * 0 - Disable ASPM,
55 * 1 - Enable ASPM without Clock Req,
56 * 2 - Enable ASPM with Clock Req,
57 * 3 - Alwyas Enable ASPM with Clock Req,
58 * 4 - Always Enable ASPM without Clock Req.
59 * set defult to RTL8192CE:3 RTL8192E:2
60 */
61 rtlpci->const_pci_aspm = 3;
62
63 /*Setting for PCI-E device */
64 rtlpci->const_devicepci_aspm_setting = 0x03;
65
66 /*Setting for PCI-E bridge */
67 rtlpci->const_hostpci_aspm_setting = 0x02;
68
69 /**
70 * In Hw/Sw Radio Off situation.
71 * 0 - Default,
72 * 1 - From ASPM setting without low Mac Pwr,
73 * 2 - From ASPM setting with low Mac Pwr,
74 * 3 - Bus D3
75 * set default to RTL8192CE:0 RTL8192SE:2
76 */
77 rtlpci->const_hwsw_rfoff_d3 = 0;
78
79 /**
80 * This setting works for those device with
81 * backdoor ASPM setting such as EPHY setting.
82 * 0 - Not support ASPM,
83 * 1 - Support ASPM,
84 * 2 - According to chipset.
85 */
86 rtlpci->const_support_pciaspm = 1;
87}
88
89int rtl92ee_init_sw_vars(struct ieee80211_hw *hw)
90{
91 struct rtl_priv *rtlpriv = rtl_priv(hw);
92 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
93 int err = 0;
94
95 rtl92ee_bt_reg_init(hw);
96 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
97 rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
98
99 rtlpriv->dm.dm_initialgain_enable = 1;
100 rtlpriv->dm.dm_flag = 0;
101 rtlpriv->dm.disable_framebursting = 0;
102 rtlpci->transmit_config = CFENDFORM | BIT(15);
103
104 /*just 2.4G band*/
105 rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G;
106 rtlpriv->rtlhal.bandset = BAND_ON_2_4G;
107 rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY;
108
109 rtlpci->receive_config = (RCR_APPFCS |
110 RCR_APP_MIC |
111 RCR_APP_ICV |
112 RCR_APP_PHYST_RXFF |
113 RCR_HTC_LOC_CTRL |
114 RCR_AMF |
115 RCR_ACF |
116 RCR_ADF |
117 RCR_AICV |
118 RCR_ACRC32 |
119 RCR_AB |
120 RCR_AM |
121 RCR_APM |
122 0);
123
124 rtlpci->irq_mask[0] = (u32)(IMR_PSTIMEOUT |
125 IMR_C2HCMD |
126 IMR_HIGHDOK |
127 IMR_MGNTDOK |
128 IMR_BKDOK |
129 IMR_BEDOK |
130 IMR_VIDOK |
131 IMR_VODOK |
132 IMR_RDU |
133 IMR_ROK |
134 0);
135 rtlpci->irq_mask[1] = (u32)(IMR_RXFOVW | 0);
136
137 /* for debug level */
138 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
139 /* for LPS & IPS */
140 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
141 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
142 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
143 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
144 if (rtlpriv->cfg->mod_params->disable_watchdog)
145 pr_info("watchdog disabled\n");
146 rtlpriv->psc.reg_fwctrl_lps = 3;
147 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
148 /* for ASPM, you can close aspm through
149 * set const_support_pciaspm = 0
150 */
151 rtl92ee_init_aspm_vars(hw);
152
153 if (rtlpriv->psc.reg_fwctrl_lps == 1)
154 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
155 else if (rtlpriv->psc.reg_fwctrl_lps == 2)
156 rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE;
157 else if (rtlpriv->psc.reg_fwctrl_lps == 3)
158 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
159
160 /* for early mode */
161 rtlpriv->rtlhal.earlymode_enable = false;
162
163 /*low power */
164 rtlpriv->psc.low_power_enable = false;
165
166 /* for firmware buf */
167 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
168 if (!rtlpriv->rtlhal.pfirmware) {
169 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
170 "Can't alloc buffer for fw\n");
171 return 1;
172 }
173
174 /* request fw */
175 rtlpriv->cfg->fw_name = "rtlwifi/rtl8192eefw.bin";
176
177 rtlpriv->max_fw_size = 0x8000;
178 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
179 err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
180 rtlpriv->io.dev, GFP_KERNEL, hw,
181 rtl_fw_cb);
182 if (err) {
183 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
184 "Failed to request firmware!\n");
185 return 1;
186 }
187
188 return 0;
189}
190
191void rtl92ee_deinit_sw_vars(struct ieee80211_hw *hw)
192{
193 struct rtl_priv *rtlpriv = rtl_priv(hw);
194
195 if (rtlpriv->rtlhal.pfirmware) {
196 vfree(rtlpriv->rtlhal.pfirmware);
197 rtlpriv->rtlhal.pfirmware = NULL;
198 }
199}
200
201/* get bt coexist status */
202bool rtl92ee_get_btc_status(void)
203{
204 return true;
205}
206
207static struct rtl_hal_ops rtl8192ee_hal_ops = {
208 .init_sw_vars = rtl92ee_init_sw_vars,
209 .deinit_sw_vars = rtl92ee_deinit_sw_vars,
210 .read_eeprom_info = rtl92ee_read_eeprom_info,
211 .interrupt_recognized = rtl92ee_interrupt_recognized,/*need check*/
212 .hw_init = rtl92ee_hw_init,
213 .hw_disable = rtl92ee_card_disable,
214 .hw_suspend = rtl92ee_suspend,
215 .hw_resume = rtl92ee_resume,
216 .enable_interrupt = rtl92ee_enable_interrupt,
217 .disable_interrupt = rtl92ee_disable_interrupt,
218 .set_network_type = rtl92ee_set_network_type,
219 .set_chk_bssid = rtl92ee_set_check_bssid,
220 .set_qos = rtl92ee_set_qos,
221 .set_bcn_reg = rtl92ee_set_beacon_related_registers,
222 .set_bcn_intv = rtl92ee_set_beacon_interval,
223 .update_interrupt_mask = rtl92ee_update_interrupt_mask,
224 .get_hw_reg = rtl92ee_get_hw_reg,
225 .set_hw_reg = rtl92ee_set_hw_reg,
226 .update_rate_tbl = rtl92ee_update_hal_rate_tbl,
227 .pre_fill_tx_bd_desc = rtl92ee_pre_fill_tx_bd_desc,
228 .rx_desc_buff_remained_cnt = rtl92ee_rx_desc_buff_remained_cnt,
229 .rx_check_dma_ok = rtl92ee_rx_check_dma_ok,
230 .fill_tx_desc = rtl92ee_tx_fill_desc,
231 .fill_tx_cmddesc = rtl92ee_tx_fill_cmddesc,
232 .query_rx_desc = rtl92ee_rx_query_desc,
233 .set_channel_access = rtl92ee_update_channel_access_setting,
234 .radio_onoff_checking = rtl92ee_gpio_radio_on_off_checking,
235 .set_bw_mode = rtl92ee_phy_set_bw_mode,
236 .switch_channel = rtl92ee_phy_sw_chnl,
237 .dm_watchdog = rtl92ee_dm_watchdog,
238 .scan_operation_backup = rtl92ee_phy_scan_operation_backup,
239 .set_rf_power_state = rtl92ee_phy_set_rf_power_state,
240 .led_control = rtl92ee_led_control,
241 .set_desc = rtl92ee_set_desc,
242 .get_desc = rtl92ee_get_desc,
243 .is_tx_desc_closed = rtl92ee_is_tx_desc_closed,
244 .tx_polling = rtl92ee_tx_polling,
245 .enable_hw_sec = rtl92ee_enable_hw_security_config,
246 .set_key = rtl92ee_set_key,
247 .init_sw_leds = rtl92ee_init_sw_leds,
248 .get_bbreg = rtl92ee_phy_query_bb_reg,
249 .set_bbreg = rtl92ee_phy_set_bb_reg,
250 .get_rfreg = rtl92ee_phy_query_rf_reg,
251 .set_rfreg = rtl92ee_phy_set_rf_reg,
252 .fill_h2c_cmd = rtl92ee_fill_h2c_cmd,
253 .get_btc_status = rtl92ee_get_btc_status,
254 .rx_command_packet = rtl92ee_rx_command_packet,
255};
256
257static struct rtl_mod_params rtl92ee_mod_params = {
258 .sw_crypto = false,
259 .inactiveps = false,
260 .swctrl_lps = false,
261 .fwctrl_lps = true,
262 .msi_support = true,
263 .debug = DBG_EMERG,
264};
265
266static struct rtl_hal_cfg rtl92ee_hal_cfg = {
267 .bar_id = 2,
268 .write_readback = true,
269 .name = "rtl92ee_pci",
270 .fw_name = "rtlwifi/rtl8192eefw.bin",
271 .ops = &rtl8192ee_hal_ops,
272 .mod_params = &rtl92ee_mod_params,
273
274 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
275 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
276 .maps[SYS_CLK] = REG_SYS_CLKR,
277 .maps[MAC_RCR_AM] = AM,
278 .maps[MAC_RCR_AB] = AB,
279 .maps[MAC_RCR_ACRC32] = ACRC32,
280 .maps[MAC_RCR_ACF] = ACF,
281 .maps[MAC_RCR_AAP] = AAP,
282 .maps[MAC_HIMR] = REG_HIMR,
283 .maps[MAC_HIMRE] = REG_HIMRE,
284
285 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
286
287 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
288 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
289 .maps[EFUSE_CLK] = 0,
290 .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL,
291 .maps[EFUSE_PWC_EV12V] = PWC_EV12V,
292 .maps[EFUSE_FEN_ELDR] = FEN_ELDR,
293 .maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN,
294 .maps[EFUSE_ANA8M] = ANA8M,
295 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE,
296 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
297 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
298 .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES,
299
300 .maps[RWCAM] = REG_CAMCMD,
301 .maps[WCAMI] = REG_CAMWRITE,
302 .maps[RCAMO] = REG_CAMREAD,
303 .maps[CAMDBG] = REG_CAMDBG,
304 .maps[SECR] = REG_SECCFG,
305 .maps[SEC_CAM_NONE] = CAM_NONE,
306 .maps[SEC_CAM_WEP40] = CAM_WEP40,
307 .maps[SEC_CAM_TKIP] = CAM_TKIP,
308 .maps[SEC_CAM_AES] = CAM_AES,
309 .maps[SEC_CAM_WEP104] = CAM_WEP104,
310
311 .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6,
312 .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5,
313 .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4,
314 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
315 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
316 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
317 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
318 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
319 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
320 .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4,
321 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
322 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
323 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
324
325 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
326 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
327 .maps[RTL_IMR_BCNINT] = IMR_BCNDMAINT0,
328 .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW,
329 .maps[RTL_IMR_RDU] = IMR_RDU,
330 .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND,
331 .maps[RTL_IMR_BDOK] = IMR_BCNDOK0,
332 .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK,
333 .maps[RTL_IMR_TBDER] = IMR_TBDER,
334 .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK,
335 .maps[RTL_IMR_TBDOK] = IMR_TBDOK,
336 .maps[RTL_IMR_BKDOK] = IMR_BKDOK,
337 .maps[RTL_IMR_BEDOK] = IMR_BEDOK,
338 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
339 .maps[RTL_IMR_VODOK] = IMR_VODOK,
340 .maps[RTL_IMR_ROK] = IMR_ROK,
341 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
342
343 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
344 .maps[RTL_RC_CCK_RATE2M] = DESC92C_RATE2M,
345 .maps[RTL_RC_CCK_RATE5_5M] = DESC92C_RATE5_5M,
346 .maps[RTL_RC_CCK_RATE11M] = DESC92C_RATE11M,
347 .maps[RTL_RC_OFDM_RATE6M] = DESC92C_RATE6M,
348 .maps[RTL_RC_OFDM_RATE9M] = DESC92C_RATE9M,
349 .maps[RTL_RC_OFDM_RATE12M] = DESC92C_RATE12M,
350 .maps[RTL_RC_OFDM_RATE18M] = DESC92C_RATE18M,
351 .maps[RTL_RC_OFDM_RATE24M] = DESC92C_RATE24M,
352 .maps[RTL_RC_OFDM_RATE36M] = DESC92C_RATE36M,
353 .maps[RTL_RC_OFDM_RATE48M] = DESC92C_RATE48M,
354 .maps[RTL_RC_OFDM_RATE54M] = DESC92C_RATE54M,
355
356 .maps[RTL_RC_HT_RATEMCS7] = DESC92C_RATEMCS7,
357 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
358};
359
360static struct pci_device_id rtl92ee_pci_ids[] = {
361 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x818B, rtl92ee_hal_cfg)},
362 {},
363};
364
365MODULE_DEVICE_TABLE(pci, rtl92ee_pci_ids);
366
367MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
368MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
369MODULE_LICENSE("GPL");
370MODULE_DESCRIPTION("Realtek 8192EE 802.11n PCI wireless");
371MODULE_FIRMWARE("rtlwifi/rtl8192eefw.bin");
372
373module_param_named(swenc, rtl92ee_mod_params.sw_crypto, bool, 0444);
374module_param_named(debug, rtl92ee_mod_params.debug, int, 0444);
375module_param_named(ips, rtl92ee_mod_params.inactiveps, bool, 0444);
376module_param_named(swlps, rtl92ee_mod_params.swctrl_lps, bool, 0444);
377module_param_named(fwlps, rtl92ee_mod_params.fwctrl_lps, bool, 0444);
378module_param_named(msi, rtl92ee_mod_params.msi_support, bool, 0444);
379module_param_named(disable_watchdog, rtl92ee_mod_params.disable_watchdog,
380 bool, 0444);
381MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
382MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
383MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
384MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
385MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
386MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
387MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
388
389static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
390
391static struct pci_driver rtl92ee_driver = {
392 .name = KBUILD_MODNAME,
393 .id_table = rtl92ee_pci_ids,
394 .probe = rtl_pci_probe,
395 .remove = rtl_pci_disconnect,
396 .driver.pm = &rtlwifi_pm_ops,
397};
398
399module_pci_driver(rtl92ee_driver);
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/sw.h b/drivers/net/wireless/rtlwifi/rtl8192ee/sw.h
new file mode 100644
index 000000000000..21433d0332d0
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/sw.h
@@ -0,0 +1,33 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_SW_H__
27#define __RTL92E_SW_H__
28
29int rtl92ee_init_sw_vars(struct ieee80211_hw *hw);
30void rtl92ee_deinit_sw_vars(struct ieee80211_hw *hw);
31bool rtl92ee_get_btc_status(void);
32
33#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/table.c b/drivers/net/wireless/rtlwifi/rtl8192ee/table.c
new file mode 100644
index 000000000000..abcdd0670fd8
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/table.c
@@ -0,0 +1,882 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Created on 2010/ 5/18, 1:41
23 *
24 * Larry Finger <Larry.Finger@lwfinger.net>
25 *
26 *****************************************************************************/
27
28#include "table.h"
29u32 RTL8192EE_PHY_REG_ARRAY[] = {
30 0x800, 0x80040000,
31 0x804, 0x00000003,
32 0x808, 0x0000FC00,
33 0x80C, 0x0000000A,
34 0x810, 0x10001331,
35 0x814, 0x020C3D10,
36 0x818, 0x02220385,
37 0x81C, 0x00000000,
38 0x820, 0x01000100,
39 0x824, 0x00390204,
40 0x828, 0x01000100,
41 0x82C, 0x00390204,
42 0x830, 0x32323232,
43 0x834, 0x30303030,
44 0x838, 0x30303030,
45 0x83C, 0x30303030,
46 0x840, 0x00010000,
47 0x844, 0x00010000,
48 0x848, 0x28282828,
49 0x84C, 0x28282828,
50 0x850, 0x00000000,
51 0x854, 0x00000000,
52 0x858, 0x009A009A,
53 0x85C, 0x01000014,
54 0x860, 0x66F60000,
55 0x864, 0x061F0000,
56 0x868, 0x30303030,
57 0x86C, 0x30303030,
58 0x870, 0x00000000,
59 0x874, 0x55004200,
60 0x878, 0x08080808,
61 0x87C, 0x00000000,
62 0x880, 0xB0000C1C,
63 0x884, 0x00000001,
64 0x888, 0x00000000,
65 0x88C, 0xCC0000C0,
66 0x890, 0x00000800,
67 0x894, 0xFFFFFFFE,
68 0x898, 0x40302010,
69 0x900, 0x00000000,
70 0x904, 0x00000023,
71 0x908, 0x00000000,
72 0x90C, 0x81121313,
73 0x910, 0x806C0001,
74 0x914, 0x00000001,
75 0x918, 0x00000000,
76 0x91C, 0x00010000,
77 0x924, 0x00000001,
78 0x928, 0x00000000,
79 0x92C, 0x00000000,
80 0x930, 0x00000000,
81 0x934, 0x00000000,
82 0x938, 0x00000000,
83 0x93C, 0x00000000,
84 0x940, 0x00000000,
85 0x944, 0x00000000,
86 0x94C, 0x00000008,
87 0xA00, 0x00D0C7C8,
88 0xA04, 0x81FF000C,
89 0xA08, 0x8C838300,
90 0xA0C, 0x2E68120F,
91 0xA10, 0x95009B78,
92 0xA14, 0x1114D028,
93 0xA18, 0x00881117,
94 0xA1C, 0x89140F00,
95 0xA20, 0x1A1B0000,
96 0xA24, 0x090E1317,
97 0xA28, 0x00000204,
98 0xA2C, 0x00D30000,
99 0xA70, 0x101FBF00,
100 0xA74, 0x00000007,
101 0xA78, 0x00000900,
102 0xA7C, 0x225B0606,
103 0xA80, 0x218075B1,
104 0xB38, 0x00000000,
105 0xC00, 0x48071D40,
106 0xC04, 0x03A05633,
107 0xC08, 0x000000E4,
108 0xC0C, 0x6C6C6C6C,
109 0xC10, 0x08800000,
110 0xC14, 0x40000100,
111 0xC18, 0x08800000,
112 0xC1C, 0x40000100,
113 0xC20, 0x00000000,
114 0xC24, 0x00000000,
115 0xC28, 0x00000000,
116 0xC2C, 0x00000000,
117 0xC30, 0x69E9AC47,
118 0xC34, 0x469652AF,
119 0xC38, 0x49795994,
120 0xC3C, 0x0A97971C,
121 0xC40, 0x1F7C403F,
122 0xC44, 0x000100B7,
123 0xC48, 0xEC020107,
124 0xC4C, 0x007F037F,
125 0xFF010718, 0xABCD,
126 0xC50, 0x00340220,
127 0xCDCDCDCD, 0xCDCD,
128 0xC50, 0x00340020,
129 0xFF010718, 0xDEAD,
130 0xC54, 0x0080801F,
131 0xFF010718, 0xABCD,
132 0xC58, 0x00000220,
133 0xCDCDCDCD, 0xCDCD,
134 0xC58, 0x00000020,
135 0xFF010718, 0xDEAD,
136 0xC5C, 0x00248492,
137 0xC60, 0x00000000,
138 0xC64, 0x7112848B,
139 0xC68, 0x47C00BFF,
140 0xC6C, 0x00000036,
141 0xC70, 0x00000600,
142 0xC74, 0x02013169,
143 0xC78, 0x0000001F,
144 0xC7C, 0x00B91612,
145 0xFF010718, 0xABCD,
146 0xC80, 0x2D4000B5,
147 0xCDCDCDCD, 0xCDCD,
148 0xC80, 0x40000100,
149 0xFF010718, 0xDEAD,
150 0xC84, 0x21F60000,
151 0xFF010718, 0xABCD,
152 0xC88, 0x2D4000B5,
153 0xCDCDCDCD, 0xCDCD,
154 0xC88, 0x40000100,
155 0xFF010718, 0xDEAD,
156 0xC8C, 0xA0E40000,
157 0xC90, 0x00121820,
158 0xC94, 0x00000000,
159 0xC98, 0x00121820,
160 0xC9C, 0x00007F7F,
161 0xCA0, 0x00000000,
162 0xCA4, 0x000300A0,
163 0xCA8, 0x00000000,
164 0xCAC, 0x00000000,
165 0xCB0, 0x00000000,
166 0xCB4, 0x00000000,
167 0xCB8, 0x00000000,
168 0xCBC, 0x28000000,
169 0xCC0, 0x00000000,
170 0xCC4, 0x00000000,
171 0xCC8, 0x00000000,
172 0xCCC, 0x00000000,
173 0xCD0, 0x00000000,
174 0xCD4, 0x00000000,
175 0xCD8, 0x64B22427,
176 0xCDC, 0x00766932,
177 0xCE0, 0x00222222,
178 0xCE4, 0x00040000,
179 0xCE8, 0x77644302,
180 0xCEC, 0x2F97D40C,
181 0xD00, 0x00080740,
182 0xD04, 0x00020403,
183 0xD08, 0x0000907F,
184 0xD0C, 0x20010201,
185 0xD10, 0xA0633333,
186 0xD14, 0x3333BC43,
187 0xD18, 0x7A8F5B6B,
188 0xD1C, 0x0000007F,
189 0xD2C, 0xCC979975,
190 0xD30, 0x00000000,
191 0xD34, 0x80608000,
192 0xD38, 0x00000000,
193 0xD3C, 0x00127353,
194 0xD40, 0x00000000,
195 0xD44, 0x00000000,
196 0xD48, 0x00000000,
197 0xD4C, 0x00000000,
198 0xD50, 0x6437140A,
199 0xD54, 0x00000000,
200 0xD58, 0x00000282,
201 0xD5C, 0x30032064,
202 0xD60, 0x4653DE68,
203 0xD64, 0x04518A3C,
204 0xD68, 0x00002101,
205 0xD6C, 0x2A201C16,
206 0xD70, 0x1812362E,
207 0xD74, 0x322C2220,
208 0xD78, 0x000E3C24,
209 0xD80, 0x01081008,
210 0xD84, 0x00000800,
211 0xD88, 0xF0B50000,
212 0xE00, 0x30303030,
213 0xE04, 0x30303030,
214 0xE08, 0x03903030,
215 0xE10, 0x30303030,
216 0xE14, 0x30303030,
217 0xE18, 0x30303030,
218 0xE1C, 0x30303030,
219 0xE28, 0x00000000,
220 0xE30, 0x1000DC1F,
221 0xE34, 0x10008C1F,
222 0xE38, 0x02140102,
223 0xE3C, 0x681604C2,
224 0xE40, 0x01007C00,
225 0xE44, 0x01004800,
226 0xE48, 0xFB000000,
227 0xE4C, 0x000028D1,
228 0xE50, 0x1000DC1F,
229 0xE54, 0x10008C1F,
230 0xE58, 0x02140102,
231 0xE5C, 0x28160D05,
232 0xE60, 0x00000008,
233 0xE68, 0x0FC05656,
234 0xE6C, 0x03C09696,
235 0xE70, 0x03C09696,
236 0xE74, 0x0C005656,
237 0xE78, 0x0C005656,
238 0xE7C, 0x0C005656,
239 0xE80, 0x0C005656,
240 0xE84, 0x03C09696,
241 0xE88, 0x0C005656,
242 0xE8C, 0x03C09696,
243 0xED0, 0x03C09696,
244 0xED4, 0x03C09696,
245 0xED8, 0x03C09696,
246 0xEDC, 0x0000D6D6,
247 0xEE0, 0x0000D6D6,
248 0xEEC, 0x0FC01616,
249 0xEE4, 0xB0000C1C,
250 0xEE8, 0x00000001,
251 0xF14, 0x00000003,
252 0xF4C, 0x00000000,
253 0xF00, 0x00000300,
254};
255
256u32 RTL8192EE_PHY_REG_ARRAY_PG[] = {
257 0, 0, 0, 0x00000e08, 0x0000ff00, 0x00003200,
258 0, 0, 1, 0x00000e08, 0x0000ff00, 0x00003200,
259 0, 0, 0, 0x0000086c, 0xffffff00, 0x32323200,
260 0, 0, 1, 0x0000086c, 0xffffff00, 0x32323200,
261 0, 0, 0, 0x00000e00, 0xffffffff, 0x34343636,
262 0, 0, 1, 0x00000e00, 0xffffffff, 0x34343636,
263 0, 0, 0, 0x00000e04, 0xffffffff, 0x28283032,
264 0, 0, 1, 0x00000e04, 0xffffffff, 0x28283032,
265 0, 0, 0, 0x00000e10, 0xffffffff, 0x34363840,
266 0, 0, 1, 0x00000e10, 0xffffffff, 0x34363840,
267 0, 0, 0, 0x00000e14, 0xffffffff, 0x26283032,
268 0, 0, 1, 0x00000e14, 0xffffffff, 0x26283032,
269 0, 0, 1, 0x00000e18, 0xffffffff, 0x36384040,
270 0, 0, 1, 0x00000e1c, 0xffffffff, 0x24262832,
271 0, 1, 0, 0x00000838, 0xffffff00, 0x32323200,
272 0, 1, 1, 0x00000838, 0xffffff00, 0x32323200,
273 0, 1, 0, 0x0000086c, 0x000000ff, 0x00000032,
274 0, 1, 1, 0x0000086c, 0x000000ff, 0x00000032,
275 0, 1, 0, 0x00000830, 0xffffffff, 0x34343636,
276 0, 1, 1, 0x00000830, 0xffffffff, 0x34343636,
277 0, 1, 0, 0x00000834, 0xffffffff, 0x28283032,
278 0, 1, 1, 0x00000834, 0xffffffff, 0x28283032,
279 0, 1, 0, 0x0000083c, 0xffffffff, 0x34363840,
280 0, 1, 1, 0x0000083c, 0xffffffff, 0x34363840,
281 0, 1, 0, 0x00000848, 0xffffffff, 0x26283032,
282 0, 1, 1, 0x00000848, 0xffffffff, 0x26283032,
283 0, 1, 1, 0x0000084c, 0xffffffff, 0x36384040,
284 0, 1, 1, 0x00000868, 0xffffffff, 0x24262832
285};
286
287u32 RTL8192EE_RADIOA_ARRAY[] = {
288 0x07F, 0x00000082,
289 0x081, 0x0003FC00,
290 0x000, 0x00030000,
291 0x008, 0x00008400,
292 0x018, 0x00000407,
293 0x019, 0x00000012,
294 0x01B, 0x00000064,
295 0x01E, 0x00080009,
296 0x01F, 0x00000880,
297 0x02F, 0x0001A060,
298 0x03F, 0x00000000,
299 0x042, 0x000060C0,
300 0x057, 0x000D0000,
301 0x058, 0x000BE180,
302 0x067, 0x00001552,
303 0x083, 0x00000000,
304 0x0B0, 0x000FF9F1,
305 0x0B1, 0x00055418,
306 0x0B2, 0x0008CC00,
307 0x0B4, 0x00043083,
308 0x0B5, 0x00008166,
309 0x0B6, 0x0000803E,
310 0x0B7, 0x0001C69F,
311 0x0B8, 0x0000407F,
312 0x0B9, 0x00080001,
313 0x0BA, 0x00040001,
314 0x0BB, 0x00000400,
315 0x0BF, 0x000C0000,
316 0x0C2, 0x00002400,
317 0x0C3, 0x00000009,
318 0x0C4, 0x00040C91,
319 0x0C5, 0x00099999,
320 0x0C6, 0x000000A3,
321 0x0C7, 0x00088820,
322 0x0C8, 0x00076C06,
323 0x0C9, 0x00000000,
324 0x0CA, 0x00080000,
325 0x0DF, 0x00000180,
326 0x0EF, 0x000001A0,
327 0x051, 0x00069545,
328 0x052, 0x0007E45E,
329 0x053, 0x00000071,
330 0x056, 0x00051FF3,
331 0x035, 0x000000A8,
332 0x035, 0x000001E2,
333 0x035, 0x000002A8,
334 0x036, 0x00001C24,
335 0x036, 0x00009C24,
336 0x036, 0x00011C24,
337 0x036, 0x00019C24,
338 0x018, 0x00000C07,
339 0x05A, 0x00048000,
340 0x019, 0x000739D0,
341 0xFF010718, 0xABCD,
342 0x034, 0x0000A093,
343 0x034, 0x0000908F,
344 0x034, 0x0000808C,
345 0x034, 0x0000704D,
346 0x034, 0x0000604A,
347 0x034, 0x00005047,
348 0x034, 0x0000400A,
349 0x034, 0x00003007,
350 0x034, 0x00002004,
351 0x034, 0x00001001,
352 0x034, 0x00000000,
353 0xCDCDCDCD, 0xCDCD,
354 0x034, 0x0000ADD7,
355 0x034, 0x00009DD4,
356 0x034, 0x00008DD1,
357 0x034, 0x00007DCE,
358 0x034, 0x00006DCB,
359 0x034, 0x00005DC8,
360 0x034, 0x00004DC5,
361 0x034, 0x000034CC,
362 0x034, 0x0000244F,
363 0x034, 0x0000144C,
364 0x034, 0x00000014,
365 0xFF010718, 0xDEAD,
366 0x000, 0x00030159,
367 0x084, 0x00068180,
368 0x086, 0x0000014E,
369 0x087, 0x00048E00,
370 0x08E, 0x00065540,
371 0x08F, 0x00088000,
372 0x0EF, 0x000020A0,
373 0xFF010718, 0xABCD,
374 0x03B, 0x000F07B0,
375 0xCDCDCDCD, 0xCDCD,
376 0x03B, 0x000F02B0,
377 0xFF010718, 0xDEAD,
378 0x03B, 0x000EF7B0,
379 0x03B, 0x000D4FB0,
380 0x03B, 0x000CF060,
381 0x03B, 0x000B0090,
382 0x03B, 0x000A0080,
383 0x03B, 0x00090080,
384 0x03B, 0x0008F780,
385 0xFF010718, 0xABCD,
386 0x03B, 0x000787B0,
387 0xCDCDCDCD, 0xCDCD,
388 0x03B, 0x00078730,
389 0xFF010718, 0xDEAD,
390 0x03B, 0x00060FB0,
391 0x03B, 0x0005FFA0,
392 0x03B, 0x00040620,
393 0x03B, 0x00037090,
394 0x03B, 0x00020080,
395 0x03B, 0x0001F060,
396 0x03B, 0x0000FFB0,
397 0x0EF, 0x000000A0,
398 0x0FE, 0x00000000,
399 0x018, 0x0000FC07,
400 0x0FE, 0x00000000,
401 0x0FE, 0x00000000,
402 0x0FE, 0x00000000,
403 0x0FE, 0x00000000,
404 0x01E, 0x00000001,
405 0x01F, 0x00080000,
406 0x000, 0x00033E70,
407};
408
409u32 RTL8192EE_RADIOB_ARRAY[] = {
410 0x07F, 0x00000082,
411 0x081, 0x0003FC00,
412 0x000, 0x00030000,
413 0x008, 0x00008400,
414 0x018, 0x00000407,
415 0x019, 0x00000012,
416 0x01B, 0x00000064,
417 0x01E, 0x00080009,
418 0x01F, 0x00000880,
419 0x02F, 0x0001A060,
420 0x03F, 0x00000000,
421 0x042, 0x000060C0,
422 0x057, 0x000D0000,
423 0x058, 0x000BE180,
424 0x067, 0x00001552,
425 0x07F, 0x00000082,
426 0x081, 0x0003F000,
427 0x083, 0x00000000,
428 0x0DF, 0x00000180,
429 0x0EF, 0x000001A0,
430 0x051, 0x00069545,
431 0x052, 0x0007E42E,
432 0x053, 0x00000071,
433 0x056, 0x00051FF3,
434 0x035, 0x000000A8,
435 0x035, 0x000001E0,
436 0x035, 0x000002A8,
437 0x036, 0x00001CA8,
438 0x036, 0x00009C24,
439 0x036, 0x00011C24,
440 0x036, 0x00019C24,
441 0x018, 0x00000C07,
442 0x05A, 0x00048000,
443 0x019, 0x000739D0,
444 0xFF010718, 0xABCD,
445 0x034, 0x0000A093,
446 0x034, 0x0000908F,
447 0x034, 0x0000808C,
448 0x034, 0x0000704D,
449 0x034, 0x0000604A,
450 0x034, 0x00005047,
451 0x034, 0x0000400A,
452 0x034, 0x00003007,
453 0x034, 0x00002004,
454 0x034, 0x00001001,
455 0x034, 0x00000000,
456 0xCDCDCDCD, 0xCDCD,
457 0x034, 0x0000ADD7,
458 0x034, 0x00009DD4,
459 0x034, 0x00008DD1,
460 0x034, 0x00007DCE,
461 0x034, 0x00006DCB,
462 0x034, 0x00005DC8,
463 0x034, 0x00004DC5,
464 0x034, 0x000034CC,
465 0x034, 0x0000244F,
466 0x034, 0x0000144C,
467 0x034, 0x00000014,
468 0xFF010718, 0xDEAD,
469 0x000, 0x00030159,
470 0x084, 0x00068180,
471 0x086, 0x000000CE,
472 0x087, 0x00048A00,
473 0x08E, 0x00065540,
474 0x08F, 0x00088000,
475 0x0EF, 0x000020A0,
476 0xFF010718, 0xABCD,
477 0x03B, 0x000F07B0,
478 0xCDCDCDCD, 0xCDCD,
479 0x03B, 0x000F02B0,
480 0xFF010718, 0xDEAD,
481 0x03B, 0x000EF7B0,
482 0x03B, 0x000D4FB0,
483 0x03B, 0x000CF060,
484 0x03B, 0x000B0090,
485 0x03B, 0x000A0080,
486 0x03B, 0x00090080,
487 0x03B, 0x0008F780,
488 0xFF010718, 0xABCD,
489 0x03B, 0x000787B0,
490 0xCDCDCDCD, 0xCDCD,
491 0x03B, 0x00078730,
492 0xFF010718, 0xDEAD,
493 0x03B, 0x00060FB0,
494 0x03B, 0x0005FFA0,
495 0x03B, 0x00040620,
496 0x03B, 0x00037090,
497 0x03B, 0x00020080,
498 0x03B, 0x0001F060,
499 0x03B, 0x0000FFB0,
500 0x0EF, 0x000000A0,
501 0x000, 0x00010159,
502 0x0FE, 0x00000000,
503 0x0FE, 0x00000000,
504 0x0FE, 0x00000000,
505 0x0FE, 0x00000000,
506 0x01E, 0x00000001,
507 0x01F, 0x00080000,
508 0x000, 0x00033E70,
509};
510
511u32 RTL8192EE_MAC_ARRAY[] = {
512 0x011, 0x000000EB,
513 0x012, 0x00000007,
514 0x014, 0x00000075,
515 0x303, 0x000000A7,
516 0x428, 0x0000000A,
517 0x429, 0x00000010,
518 0x430, 0x00000000,
519 0x431, 0x00000000,
520 0x432, 0x00000000,
521 0x433, 0x00000001,
522 0x434, 0x00000004,
523 0x435, 0x00000005,
524 0x436, 0x00000007,
525 0x437, 0x00000008,
526 0x43C, 0x00000004,
527 0x43D, 0x00000005,
528 0x43E, 0x00000007,
529 0x43F, 0x00000008,
530 0x440, 0x0000005D,
531 0x441, 0x00000001,
532 0x442, 0x00000000,
533 0x444, 0x00000010,
534 0x445, 0x00000000,
535 0x446, 0x00000000,
536 0x447, 0x00000000,
537 0x448, 0x00000000,
538 0x449, 0x000000F0,
539 0x44A, 0x0000000F,
540 0x44B, 0x0000003E,
541 0x44C, 0x00000010,
542 0x44D, 0x00000000,
543 0x44E, 0x00000000,
544 0x44F, 0x00000000,
545 0x450, 0x00000000,
546 0x451, 0x000000F0,
547 0x452, 0x0000000F,
548 0x453, 0x00000000,
549 0x456, 0x0000005E,
550 0x460, 0x00000066,
551 0x461, 0x00000066,
552 0x4C8, 0x000000FF,
553 0x4C9, 0x00000008,
554 0x4CC, 0x000000FF,
555 0x4CD, 0x000000FF,
556 0x4CE, 0x00000001,
557 0x500, 0x00000026,
558 0x501, 0x000000A2,
559 0x502, 0x0000002F,
560 0x503, 0x00000000,
561 0x504, 0x00000028,
562 0x505, 0x000000A3,
563 0x506, 0x0000005E,
564 0x507, 0x00000000,
565 0x508, 0x0000002B,
566 0x509, 0x000000A4,
567 0x50A, 0x0000005E,
568 0x50B, 0x00000000,
569 0x50C, 0x0000004F,
570 0x50D, 0x000000A4,
571 0x50E, 0x00000000,
572 0x50F, 0x00000000,
573 0x512, 0x0000001C,
574 0x514, 0x0000000A,
575 0x516, 0x0000000A,
576 0x525, 0x0000004F,
577 0x540, 0x00000012,
578 0x541, 0x00000064,
579 0x550, 0x00000010,
580 0x551, 0x00000010,
581 0x559, 0x00000002,
582 0x55C, 0x00000050,
583 0x55D, 0x000000FF,
584 0x605, 0x00000030,
585 0x608, 0x0000000E,
586 0x609, 0x0000002A,
587 0x620, 0x000000FF,
588 0x621, 0x000000FF,
589 0x622, 0x000000FF,
590 0x623, 0x000000FF,
591 0x624, 0x000000FF,
592 0x625, 0x000000FF,
593 0x626, 0x000000FF,
594 0x627, 0x000000FF,
595 0x638, 0x00000050,
596 0x63C, 0x0000000A,
597 0x63D, 0x0000000A,
598 0x63E, 0x0000000E,
599 0x63F, 0x0000000E,
600 0x640, 0x00000040,
601 0x642, 0x00000040,
602 0x643, 0x00000000,
603 0x652, 0x000000C8,
604 0x66E, 0x00000005,
605 0x700, 0x00000021,
606 0x701, 0x00000043,
607 0x702, 0x00000065,
608 0x703, 0x00000087,
609 0x708, 0x00000021,
610 0x709, 0x00000043,
611 0x70A, 0x00000065,
612 0x70B, 0x00000087,
613};
614
615u32 RTL8192EE_AGC_TAB_ARRAY[] = {
616 0xFF010718, 0xABCD,
617 0xC78, 0xFA000001,
618 0xC78, 0xF9010001,
619 0xC78, 0xF8020001,
620 0xC78, 0xF7030001,
621 0xC78, 0xF6040001,
622 0xC78, 0xF5050001,
623 0xC78, 0xF4060001,
624 0xC78, 0xF3070001,
625 0xC78, 0xF2080001,
626 0xC78, 0xF1090001,
627 0xC78, 0xF00A0001,
628 0xC78, 0xEF0B0001,
629 0xC78, 0xEE0C0001,
630 0xC78, 0xED0D0001,
631 0xC78, 0xEC0E0001,
632 0xC78, 0xEB0F0001,
633 0xC78, 0xEA100001,
634 0xC78, 0xE9110001,
635 0xC78, 0xE8120001,
636 0xC78, 0xE7130001,
637 0xC78, 0xE6140001,
638 0xC78, 0xE5150001,
639 0xC78, 0xE4160001,
640 0xC78, 0xE3170001,
641 0xC78, 0xE2180001,
642 0xC78, 0xE1190001,
643 0xC78, 0x8A1A0001,
644 0xC78, 0x891B0001,
645 0xC78, 0x881C0001,
646 0xC78, 0x871D0001,
647 0xC78, 0x861E0001,
648 0xC78, 0x851F0001,
649 0xC78, 0x84200001,
650 0xC78, 0x83210001,
651 0xC78, 0x82220001,
652 0xC78, 0x6A230001,
653 0xC78, 0x69240001,
654 0xC78, 0x68250001,
655 0xC78, 0x67260001,
656 0xC78, 0x66270001,
657 0xC78, 0x65280001,
658 0xC78, 0x64290001,
659 0xC78, 0x632A0001,
660 0xC78, 0x622B0001,
661 0xC78, 0x612C0001,
662 0xC78, 0x602D0001,
663 0xC78, 0x472E0001,
664 0xC78, 0x462F0001,
665 0xC78, 0x45300001,
666 0xC78, 0x44310001,
667 0xC78, 0x43320001,
668 0xC78, 0x42330001,
669 0xC78, 0x41340001,
670 0xC78, 0x40350001,
671 0xC78, 0x40360001,
672 0xC78, 0x40370001,
673 0xC78, 0x40380001,
674 0xC78, 0x40390001,
675 0xC78, 0x403A0001,
676 0xC78, 0x403B0001,
677 0xC78, 0x403C0001,
678 0xC78, 0x403D0001,
679 0xC78, 0x403E0001,
680 0xC78, 0x403F0001,
681 0xCDCDCDCD, 0xCDCD,
682 0xC78, 0xFB000001,
683 0xC78, 0xFB010001,
684 0xC78, 0xFB020001,
685 0xC78, 0xFB030001,
686 0xC78, 0xFB040001,
687 0xC78, 0xFB050001,
688 0xC78, 0xFA060001,
689 0xC78, 0xF9070001,
690 0xC78, 0xF8080001,
691 0xC78, 0xF7090001,
692 0xC78, 0xF60A0001,
693 0xC78, 0xF50B0001,
694 0xC78, 0xF40C0001,
695 0xC78, 0xF30D0001,
696 0xC78, 0xF20E0001,
697 0xC78, 0xF10F0001,
698 0xC78, 0xF0100001,
699 0xC78, 0xEF110001,
700 0xC78, 0xEE120001,
701 0xC78, 0xED130001,
702 0xC78, 0xEC140001,
703 0xC78, 0xEB150001,
704 0xC78, 0xEA160001,
705 0xC78, 0xE9170001,
706 0xC78, 0xE8180001,
707 0xC78, 0xE7190001,
708 0xC78, 0xC81A0001,
709 0xC78, 0xC71B0001,
710 0xC78, 0xC61C0001,
711 0xC78, 0x071D0001,
712 0xC78, 0x061E0001,
713 0xC78, 0x051F0001,
714 0xC78, 0x04200001,
715 0xC78, 0x03210001,
716 0xC78, 0xAA220001,
717 0xC78, 0xA9230001,
718 0xC78, 0xA8240001,
719 0xC78, 0xA7250001,
720 0xC78, 0xA6260001,
721 0xC78, 0x85270001,
722 0xC78, 0x84280001,
723 0xC78, 0x83290001,
724 0xC78, 0x252A0001,
725 0xC78, 0x242B0001,
726 0xC78, 0x232C0001,
727 0xC78, 0x222D0001,
728 0xC78, 0x672E0001,
729 0xC78, 0x662F0001,
730 0xC78, 0x65300001,
731 0xC78, 0x64310001,
732 0xC78, 0x63320001,
733 0xC78, 0x62330001,
734 0xC78, 0x61340001,
735 0xC78, 0x45350001,
736 0xC78, 0x44360001,
737 0xC78, 0x43370001,
738 0xC78, 0x42380001,
739 0xC78, 0x41390001,
740 0xC78, 0x403A0001,
741 0xC78, 0x403B0001,
742 0xC78, 0x403C0001,
743 0xC78, 0x403D0001,
744 0xC78, 0x403E0001,
745 0xC78, 0x403F0001,
746 0xFF010718, 0xDEAD,
747 0xFF010718, 0xABCD,
748 0xC78, 0xFA400001,
749 0xC78, 0xF9410001,
750 0xC78, 0xF8420001,
751 0xC78, 0xF7430001,
752 0xC78, 0xF6440001,
753 0xC78, 0xF5450001,
754 0xC78, 0xF4460001,
755 0xC78, 0xF3470001,
756 0xC78, 0xF2480001,
757 0xC78, 0xF1490001,
758 0xC78, 0xF04A0001,
759 0xC78, 0xEF4B0001,
760 0xC78, 0xEE4C0001,
761 0xC78, 0xED4D0001,
762 0xC78, 0xEC4E0001,
763 0xC78, 0xEB4F0001,
764 0xC78, 0xEA500001,
765 0xC78, 0xE9510001,
766 0xC78, 0xE8520001,
767 0xC78, 0xE7530001,
768 0xC78, 0xE6540001,
769 0xC78, 0xE5550001,
770 0xC78, 0xE4560001,
771 0xC78, 0xE3570001,
772 0xC78, 0xE2580001,
773 0xC78, 0xE1590001,
774 0xC78, 0x8A5A0001,
775 0xC78, 0x895B0001,
776 0xC78, 0x885C0001,
777 0xC78, 0x875D0001,
778 0xC78, 0x865E0001,
779 0xC78, 0x855F0001,
780 0xC78, 0x84600001,
781 0xC78, 0x83610001,
782 0xC78, 0x82620001,
783 0xC78, 0x6A630001,
784 0xC78, 0x69640001,
785 0xC78, 0x68650001,
786 0xC78, 0x67660001,
787 0xC78, 0x66670001,
788 0xC78, 0x65680001,
789 0xC78, 0x64690001,
790 0xC78, 0x636A0001,
791 0xC78, 0x626B0001,
792 0xC78, 0x616C0001,
793 0xC78, 0x606D0001,
794 0xC78, 0x476E0001,
795 0xC78, 0x466F0001,
796 0xC78, 0x45700001,
797 0xC78, 0x44710001,
798 0xC78, 0x43720001,
799 0xC78, 0x42730001,
800 0xC78, 0x41740001,
801 0xC78, 0x40750001,
802 0xC78, 0x40760001,
803 0xC78, 0x40770001,
804 0xC78, 0x40780001,
805 0xC78, 0x40790001,
806 0xC78, 0x407A0001,
807 0xC78, 0x407B0001,
808 0xC78, 0x407C0001,
809 0xC78, 0x407D0001,
810 0xC78, 0x407E0001,
811 0xC78, 0x407F0001,
812 0xC50, 0x00040222,
813 0xC50, 0x00040220,
814 0xCDCDCDCD, 0xCDCD,
815 0xC78, 0xFB400001,
816 0xC78, 0xFB410001,
817 0xC78, 0xFB420001,
818 0xC78, 0xFB430001,
819 0xC78, 0xFB440001,
820 0xC78, 0xFB450001,
821 0xC78, 0xFA460001,
822 0xC78, 0xF9470001,
823 0xC78, 0xF8480001,
824 0xC78, 0xF7490001,
825 0xC78, 0xF64A0001,
826 0xC78, 0xF54B0001,
827 0xC78, 0xF44C0001,
828 0xC78, 0xF34D0001,
829 0xC78, 0xF24E0001,
830 0xC78, 0xF14F0001,
831 0xC78, 0xF0500001,
832 0xC78, 0xEF510001,
833 0xC78, 0xEE520001,
834 0xC78, 0xED530001,
835 0xC78, 0xEC540001,
836 0xC78, 0xEB550001,
837 0xC78, 0xEA560001,
838 0xC78, 0xE9570001,
839 0xC78, 0xE8580001,
840 0xC78, 0xE7590001,
841 0xC78, 0xE65A0001,
842 0xC78, 0xE55B0001,
843 0xC78, 0xE45C0001,
844 0xC78, 0xE35D0001,
845 0xC78, 0xE25E0001,
846 0xC78, 0xE15F0001,
847 0xC78, 0x8A600001,
848 0xC78, 0x89610001,
849 0xC78, 0x88620001,
850 0xC78, 0x87630001,
851 0xC78, 0x86640001,
852 0xC78, 0x85650001,
853 0xC78, 0x84660001,
854 0xC78, 0x83670001,
855 0xC78, 0x82680001,
856 0xC78, 0x6B690001,
857 0xC78, 0x6A6A0001,
858 0xC78, 0x696B0001,
859 0xC78, 0x686C0001,
860 0xC78, 0x676D0001,
861 0xC78, 0x666E0001,
862 0xC78, 0x656F0001,
863 0xC78, 0x64700001,
864 0xC78, 0x63710001,
865 0xC78, 0x62720001,
866 0xC78, 0x61730001,
867 0xC78, 0x49740001,
868 0xC78, 0x48750001,
869 0xC78, 0x47760001,
870 0xC78, 0x46770001,
871 0xC78, 0x45780001,
872 0xC78, 0x44790001,
873 0xC78, 0x437A0001,
874 0xC78, 0x427B0001,
875 0xC78, 0x417C0001,
876 0xC78, 0x407D0001,
877 0xC78, 0x407E0001,
878 0xC78, 0x407F0001,
879 0xC50, 0x00040022,
880 0xC50, 0x00040020,
881 0xFF010718, 0xDEAD,
882};
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/table.h b/drivers/net/wireless/rtlwifi/rtl8192ee/table.h
new file mode 100644
index 000000000000..bff9df88815d
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/table.h
@@ -0,0 +1,45 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Created on 2010/ 5/18, 1:41
23 *
24 * Larry Finger <Larry.Finger@lwfinger.net>
25 *
26 *****************************************************************************/
27
28#ifndef __RTL92E_TABLE__H_
29#define __RTL92E_TABLE__H_
30
31#include <linux/types.h>
32#define RTL8192EE_PHY_REG_ARRAY_LEN 448
33extern u32 RTL8192EE_PHY_REG_ARRAY[];
34#define RTL8192EE_PHY_REG_ARRAY_PG_LEN 168
35extern u32 RTL8192EE_PHY_REG_ARRAY_PG[];
36#define RTL8192EE_RADIOA_ARRAY_LEN 238
37extern u32 RTL8192EE_RADIOA_ARRAY[];
38#define RTL8192EE_RADIOB_ARRAY_LEN 198
39extern u32 RTL8192EE_RADIOB_ARRAY[];
40#define RTL8192EE_MAC_ARRAY_LEN 202
41extern u32 RTL8192EE_MAC_ARRAY[];
42#define RTL8192EE_AGC_TAB_ARRAY_LEN 532
43extern u32 RTL8192EE_AGC_TAB_ARRAY[];
44
45#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
new file mode 100644
index 000000000000..2fcbef1d029f
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.c
@@ -0,0 +1,1293 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../base.h"
29#include "../stats.h"
30#include "reg.h"
31#include "def.h"
32#include "phy.h"
33#include "trx.h"
34#include "led.h"
35#include "dm.h"
36#include "fw.h"
37
38static u8 _rtl92ee_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
39{
40 __le16 fc = rtl_get_fc(skb);
41
42 if (unlikely(ieee80211_is_beacon(fc)))
43 return QSLT_BEACON;
44 if (ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))
45 return QSLT_MGNT;
46
47 return skb->priority;
48}
49
50/* mac80211's rate_idx is like this:
51 *
52 * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
53 *
54 * B/G rate:
55 * (rx_status->flag & RX_FLAG_HT) = 0,
56 * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
57 *
58 * N rate:
59 * (rx_status->flag & RX_FLAG_HT) = 1,
60 * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
61 *
62 * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
63 * A rate:
64 * (rx_status->flag & RX_FLAG_HT) = 0,
65 * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
66 *
67 * N rate:
68 * (rx_status->flag & RX_FLAG_HT) = 1,
69 * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
70 */
71static int _rtl92ee_rate_mapping(struct ieee80211_hw *hw,
72 bool isht, u8 desc_rate)
73{
74 int rate_idx;
75
76 if (!isht) {
77 if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
78 switch (desc_rate) {
79 case DESC92C_RATE1M:
80 rate_idx = 0;
81 break;
82 case DESC92C_RATE2M:
83 rate_idx = 1;
84 break;
85 case DESC92C_RATE5_5M:
86 rate_idx = 2;
87 break;
88 case DESC92C_RATE11M:
89 rate_idx = 3;
90 break;
91 case DESC92C_RATE6M:
92 rate_idx = 4;
93 break;
94 case DESC92C_RATE9M:
95 rate_idx = 5;
96 break;
97 case DESC92C_RATE12M:
98 rate_idx = 6;
99 break;
100 case DESC92C_RATE18M:
101 rate_idx = 7;
102 break;
103 case DESC92C_RATE24M:
104 rate_idx = 8;
105 break;
106 case DESC92C_RATE36M:
107 rate_idx = 9;
108 break;
109 case DESC92C_RATE48M:
110 rate_idx = 10;
111 break;
112 case DESC92C_RATE54M:
113 rate_idx = 11;
114 break;
115 default:
116 rate_idx = 0;
117 break;
118 }
119 } else {
120 switch (desc_rate) {
121 case DESC92C_RATE6M:
122 rate_idx = 0;
123 break;
124 case DESC92C_RATE9M:
125 rate_idx = 1;
126 break;
127 case DESC92C_RATE12M:
128 rate_idx = 2;
129 break;
130 case DESC92C_RATE18M:
131 rate_idx = 3;
132 break;
133 case DESC92C_RATE24M:
134 rate_idx = 4;
135 break;
136 case DESC92C_RATE36M:
137 rate_idx = 5;
138 break;
139 case DESC92C_RATE48M:
140 rate_idx = 6;
141 break;
142 case DESC92C_RATE54M:
143 rate_idx = 7;
144 break;
145 default:
146 rate_idx = 0;
147 break;
148 }
149 }
150 } else {
151 switch (desc_rate) {
152 case DESC92C_RATEMCS0:
153 rate_idx = 0;
154 break;
155 case DESC92C_RATEMCS1:
156 rate_idx = 1;
157 break;
158 case DESC92C_RATEMCS2:
159 rate_idx = 2;
160 break;
161 case DESC92C_RATEMCS3:
162 rate_idx = 3;
163 break;
164 case DESC92C_RATEMCS4:
165 rate_idx = 4;
166 break;
167 case DESC92C_RATEMCS5:
168 rate_idx = 5;
169 break;
170 case DESC92C_RATEMCS6:
171 rate_idx = 6;
172 break;
173 case DESC92C_RATEMCS7:
174 rate_idx = 7;
175 break;
176 case DESC92C_RATEMCS8:
177 rate_idx = 8;
178 break;
179 case DESC92C_RATEMCS9:
180 rate_idx = 9;
181 break;
182 case DESC92C_RATEMCS10:
183 rate_idx = 10;
184 break;
185 case DESC92C_RATEMCS11:
186 rate_idx = 11;
187 break;
188 case DESC92C_RATEMCS12:
189 rate_idx = 12;
190 break;
191 case DESC92C_RATEMCS13:
192 rate_idx = 13;
193 break;
194 case DESC92C_RATEMCS14:
195 rate_idx = 14;
196 break;
197 case DESC92C_RATEMCS15:
198 rate_idx = 15;
199 break;
200 default:
201 rate_idx = 0;
202 break;
203 }
204 }
205 return rate_idx;
206}
207
208static void _rtl92ee_query_rxphystatus(struct ieee80211_hw *hw,
209 struct rtl_stats *pstatus, u8 *pdesc,
210 struct rx_fwinfo *p_drvinfo,
211 bool bpacket_match_bssid,
212 bool bpacket_toself,
213 bool packet_beacon)
214{
215 struct rtl_priv *rtlpriv = rtl_priv(hw);
216 struct phy_status_rpt *p_phystrpt = (struct phy_status_rpt *)p_drvinfo;
217 char rx_pwr_all = 0, rx_pwr[4];
218 u8 rf_rx_num = 0, evm, pwdb_all;
219 u8 i, max_spatial_stream;
220 u32 rssi, total_rssi = 0;
221 bool is_cck = pstatus->is_cck;
222 u8 lan_idx, vga_idx;
223
224 /* Record it for next packet processing */
225 pstatus->packet_matchbssid = bpacket_match_bssid;
226 pstatus->packet_toself = bpacket_toself;
227 pstatus->packet_beacon = packet_beacon;
228 pstatus->rx_mimo_signalquality[0] = -1;
229 pstatus->rx_mimo_signalquality[1] = -1;
230
231 if (is_cck) {
232 u8 cck_highpwr;
233 u8 cck_agc_rpt;
234 /* CCK Driver info Structure is not the same as OFDM packet. */
235 cck_agc_rpt = p_phystrpt->cck_agc_rpt_ofdm_cfosho_a;
236
237 /* (1)Hardware does not provide RSSI for CCK
238 * (2)PWDB, Average PWDB cacluated by
239 * hardware (for rate adaptive)
240 */
241 cck_highpwr = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2,
242 BIT(9));
243
244 lan_idx = ((cck_agc_rpt & 0xE0) >> 5);
245 vga_idx = (cck_agc_rpt & 0x1f);
246 switch (lan_idx) {
247 case 7: /*VGA_idx = 27~2*/
248 if (vga_idx <= 27)
249 rx_pwr_all = -100 + 2 * (27 - vga_idx);
250 else
251 rx_pwr_all = -100;
252 break;
253 case 6: /*VGA_idx = 2~0*/
254 rx_pwr_all = -48 + 2 * (2 - vga_idx);
255 break;
256 case 5: /*VGA_idx = 7~5*/
257 rx_pwr_all = -42 + 2 * (7 - vga_idx);
258 break;
259 case 4: /*VGA_idx = 7~4*/
260 rx_pwr_all = -36 + 2 * (7 - vga_idx);
261 break;
262 case 3: /*VGA_idx = 7~0*/
263 rx_pwr_all = -24 + 2 * (7 - vga_idx);
264 break;
265 case 2: /*VGA_idx = 5~0*/
266 if (cck_highpwr)
267 rx_pwr_all = -12 + 2 * (5 - vga_idx);
268 else
269 rx_pwr_all = -6 + 2 * (5 - vga_idx);
270 break;
271 case 1:
272 rx_pwr_all = 8 - 2 * vga_idx;
273 break;
274 case 0:
275 rx_pwr_all = 14 - 2 * vga_idx;
276 break;
277 default:
278 break;
279 }
280 rx_pwr_all += 16;
281 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
282
283 if (!cck_highpwr) {
284 if (pwdb_all >= 80)
285 pwdb_all = ((pwdb_all - 80) << 1) +
286 ((pwdb_all - 80) >> 1) + 80;
287 else if ((pwdb_all <= 78) && (pwdb_all >= 20))
288 pwdb_all += 3;
289 if (pwdb_all > 100)
290 pwdb_all = 100;
291 }
292
293 pstatus->rx_pwdb_all = pwdb_all;
294 pstatus->bt_rx_rssi_percentage = pwdb_all;
295 pstatus->recvsignalpower = rx_pwr_all;
296
297 /* (3) Get Signal Quality (EVM) */
298 if (bpacket_match_bssid) {
299 u8 sq, sq_rpt;
300
301 if (pstatus->rx_pwdb_all > 40) {
302 sq = 100;
303 } else {
304 sq_rpt = p_phystrpt->cck_sig_qual_ofdm_pwdb_all;
305 if (sq_rpt > 64)
306 sq = 0;
307 else if (sq_rpt < 20)
308 sq = 100;
309 else
310 sq = ((64 - sq_rpt) * 100) / 44;
311 }
312
313 pstatus->signalquality = sq;
314 pstatus->rx_mimo_signalquality[0] = sq;
315 pstatus->rx_mimo_signalquality[1] = -1;
316 }
317 } else {
318 /* (1)Get RSSI for HT rate */
319 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
320 /* we will judge RF RX path now. */
321 if (rtlpriv->dm.rfpath_rxenable[i])
322 rf_rx_num++;
323
324 rx_pwr[i] = ((p_phystrpt->path_agc[i].gain & 0x3f) * 2)
325 - 110;
326
327 pstatus->rx_pwr[i] = rx_pwr[i];
328 /* Translate DBM to percentage. */
329 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
330 total_rssi += rssi;
331
332 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
333 }
334
335 /* (2)PWDB, Average PWDB cacluated by
336 * hardware (for rate adaptive)
337 */
338 rx_pwr_all = ((p_phystrpt->cck_sig_qual_ofdm_pwdb_all >> 1)
339 & 0x7f) - 110;
340
341 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
342 pstatus->rx_pwdb_all = pwdb_all;
343 pstatus->bt_rx_rssi_percentage = pwdb_all;
344 pstatus->rxpower = rx_pwr_all;
345 pstatus->recvsignalpower = rx_pwr_all;
346
347 /* (3)EVM of HT rate */
348 if (pstatus->rate >= DESC92C_RATEMCS8 &&
349 pstatus->rate <= DESC92C_RATEMCS15)
350 max_spatial_stream = 2;
351 else
352 max_spatial_stream = 1;
353
354 for (i = 0; i < max_spatial_stream; i++) {
355 evm = rtl_evm_db_to_percentage(
356 p_phystrpt->stream_rxevm[i]);
357
358 if (bpacket_match_bssid) {
359 /* Fill value in RFD, Get the first
360 * spatial stream only
361 */
362 if (i == 0)
363 pstatus->signalquality = (u8)(evm &
364 0xff);
365 pstatus->rx_mimo_signalquality[i] = (u8)(evm &
366 0xff);
367 }
368 }
369
370 if (bpacket_match_bssid) {
371 for (i = RF90_PATH_A; i <= RF90_PATH_B; i++)
372 rtl_priv(hw)->dm.cfo_tail[i] =
373 (int)p_phystrpt->path_cfotail[i];
374
375 if (rtl_priv(hw)->dm.packet_count == 0xffffffff)
376 rtl_priv(hw)->dm.packet_count = 0;
377 else
378 rtl_priv(hw)->dm.packet_count++;
379 }
380 }
381
382 /* UI BSS List signal strength(in percentage),
383 * make it good looking, from 0~100.
384 */
385 if (is_cck)
386 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
387 pwdb_all));
388 else if (rf_rx_num != 0)
389 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
390 total_rssi /= rf_rx_num));
391}
392
393static void _rtl92ee_translate_rx_signal_stuff(struct ieee80211_hw *hw,
394 struct sk_buff *skb,
395 struct rtl_stats *pstatus,
396 u8 *pdesc,
397 struct rx_fwinfo *p_drvinfo)
398{
399 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
400 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
401 struct ieee80211_hdr *hdr;
402 u8 *tmp_buf;
403 u8 *praddr;
404 u8 *psaddr;
405 __le16 fc;
406 bool packet_matchbssid, packet_toself, packet_beacon;
407
408 tmp_buf = skb->data + pstatus->rx_drvinfo_size +
409 pstatus->rx_bufshift + 24;
410
411 hdr = (struct ieee80211_hdr *)tmp_buf;
412 fc = hdr->frame_control;
413 praddr = hdr->addr1;
414 psaddr = ieee80211_get_SA(hdr);
415 ether_addr_copy(pstatus->psaddr, psaddr);
416
417 packet_matchbssid = (!ieee80211_is_ctl(fc) &&
418 (ether_addr_equal(mac->bssid,
419 ieee80211_has_tods(fc) ?
420 hdr->addr1 :
421 ieee80211_has_fromds(fc) ?
422 hdr->addr2 : hdr->addr3)) &&
423 (!pstatus->hwerror) && (!pstatus->crc) &&
424 (!pstatus->icv));
425
426 packet_toself = packet_matchbssid &&
427 (ether_addr_equal(praddr, rtlefuse->dev_addr));
428
429 if (ieee80211_is_beacon(fc))
430 packet_beacon = true;
431 else
432 packet_beacon = false;
433
434 if (packet_beacon && packet_matchbssid)
435 rtl_priv(hw)->dm.dbginfo.num_qry_beacon_pkt++;
436
437 if (packet_matchbssid && ieee80211_is_data_qos(hdr->frame_control) &&
438 !is_multicast_ether_addr(ieee80211_get_DA(hdr))) {
439 struct ieee80211_qos_hdr *hdr_qos =
440 (struct ieee80211_qos_hdr *)tmp_buf;
441 u16 tid = le16_to_cpu(hdr_qos->qos_ctrl) & 0xf;
442
443 if (tid != 0 && tid != 3)
444 rtl_priv(hw)->dm.dbginfo.num_non_be_pkt++;
445 }
446
447 _rtl92ee_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
448 packet_matchbssid, packet_toself,
449 packet_beacon);
450 rtl_process_phyinfo(hw, tmp_buf, pstatus);
451}
452
453static void _rtl92ee_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
454 u8 *virtualaddress)
455{
456 u32 dwtmp = 0;
457
458 memset(virtualaddress, 0, 8);
459
460 SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num);
461 if (ptcb_desc->empkt_num == 1) {
462 dwtmp = ptcb_desc->empkt_len[0];
463 } else {
464 dwtmp = ptcb_desc->empkt_len[0];
465 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4;
466 dwtmp += ptcb_desc->empkt_len[1];
467 }
468 SET_EARLYMODE_LEN0(virtualaddress, dwtmp);
469
470 if (ptcb_desc->empkt_num <= 3) {
471 dwtmp = ptcb_desc->empkt_len[2];
472 } else {
473 dwtmp = ptcb_desc->empkt_len[2];
474 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4;
475 dwtmp += ptcb_desc->empkt_len[3];
476 }
477 SET_EARLYMODE_LEN1(virtualaddress, dwtmp);
478 if (ptcb_desc->empkt_num <= 5) {
479 dwtmp = ptcb_desc->empkt_len[4];
480 } else {
481 dwtmp = ptcb_desc->empkt_len[4];
482 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4;
483 dwtmp += ptcb_desc->empkt_len[5];
484 }
485 SET_EARLYMODE_LEN2_1(virtualaddress, dwtmp & 0xF);
486 SET_EARLYMODE_LEN2_2(virtualaddress, dwtmp >> 4);
487 if (ptcb_desc->empkt_num <= 7) {
488 dwtmp = ptcb_desc->empkt_len[6];
489 } else {
490 dwtmp = ptcb_desc->empkt_len[6];
491 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4;
492 dwtmp += ptcb_desc->empkt_len[7];
493 }
494 SET_EARLYMODE_LEN3(virtualaddress, dwtmp);
495 if (ptcb_desc->empkt_num <= 9) {
496 dwtmp = ptcb_desc->empkt_len[8];
497 } else {
498 dwtmp = ptcb_desc->empkt_len[8];
499 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0) + 4;
500 dwtmp += ptcb_desc->empkt_len[9];
501 }
502 SET_EARLYMODE_LEN4(virtualaddress, dwtmp);
503}
504
505bool rtl92ee_rx_query_desc(struct ieee80211_hw *hw,
506 struct rtl_stats *status,
507 struct ieee80211_rx_status *rx_status,
508 u8 *pdesc, struct sk_buff *skb)
509{
510 struct rtl_priv *rtlpriv = rtl_priv(hw);
511 struct rx_fwinfo *p_drvinfo;
512 struct ieee80211_hdr *hdr;
513 u32 phystatus = GET_RX_DESC_PHYST(pdesc);
514
515 status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
516 status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
517 RX_DRV_INFO_SIZE_UNIT;
518 status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
519 status->icv = (u16)GET_RX_DESC_ICV(pdesc);
520 status->crc = (u16)GET_RX_DESC_CRC32(pdesc);
521 status->hwerror = (status->crc | status->icv);
522 status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
523 status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
524 status->isampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
525 status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
526 status->is_cck = RTL92EE_RX_HAL_IS_CCK_RATE(status->rate);
527
528 status->macid = GET_RX_DESC_MACID(pdesc);
529 if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
530 status->wake_match = BIT(2);
531 else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
532 status->wake_match = BIT(1);
533 else if (GET_RX_STATUS_DESC_UNICAST_MATCH(pdesc))
534 status->wake_match = BIT(0);
535 else
536 status->wake_match = 0;
537 if (status->wake_match)
538 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
539 "GGGGGGGGGGGGGet Wakeup Packet!! WakeMatch=%d\n",
540 status->wake_match);
541 rx_status->freq = hw->conf.chandef.chan->center_freq;
542 rx_status->band = hw->conf.chandef.chan->band;
543
544 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size +
545 status->rx_bufshift + 24);
546
547 if (status->crc)
548 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
549
550 if (status->rx_is40Mhzpacket)
551 rx_status->flag |= RX_FLAG_40MHZ;
552
553 if (status->is_ht)
554 rx_status->flag |= RX_FLAG_HT;
555
556 rx_status->flag |= RX_FLAG_MACTIME_START;
557
558 /* hw will set status->decrypted true, if it finds the
559 * frame is open data frame or mgmt frame.
560 * So hw will not decryption robust managment frame
561 * for IEEE80211w but still set status->decrypted
562 * true, so here we should set it back to undecrypted
563 * for IEEE80211w frame, and mac80211 sw will help
564 * to decrypt it
565 */
566 if (status->decrypted) {
567 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
568 (ieee80211_has_protected(hdr->frame_control)))
569 rx_status->flag |= RX_FLAG_DECRYPTED;
570 else
571 rx_status->flag &= ~RX_FLAG_DECRYPTED;
572 }
573
574 /* rate_idx: index of data rate into band's
575 * supported rates or MCS index if HT rates
576 * are use (RX_FLAG_HT)
577 * Notice: this is diff with windows define
578 */
579 rx_status->rate_idx = _rtl92ee_rate_mapping(hw,
580 status->is_ht,
581 status->rate);
582
583 rx_status->mactime = status->timestamp_low;
584 if (phystatus) {
585 p_drvinfo = (struct rx_fwinfo *)(skb->data +
586 status->rx_bufshift + 24);
587
588 _rtl92ee_translate_rx_signal_stuff(hw, skb, status, pdesc,
589 p_drvinfo);
590 }
591 rx_status->signal = status->recvsignalpower + 10;
592 if (status->packet_report_type == TX_REPORT2) {
593 status->macid_valid_entry[0] =
594 GET_RX_RPT2_DESC_MACID_VALID_1(pdesc);
595 status->macid_valid_entry[1] =
596 GET_RX_RPT2_DESC_MACID_VALID_2(pdesc);
597 }
598 return true;
599}
600
601/*in Windows, this == Rx_92EE_Interrupt*/
602void rtl92ee_rx_check_dma_ok(struct ieee80211_hw *hw, u8 *header_desc,
603 u8 queue_index)
604{
605 u8 first_seg = 0;
606 u8 last_seg = 0;
607 u16 total_len = 0;
608 u16 read_cnt = 0;
609
610 if (header_desc == NULL)
611 return;
612
613 total_len = (u16)GET_RX_BUFFER_DESC_TOTAL_LENGTH(header_desc);
614
615 first_seg = (u8)GET_RX_BUFFER_DESC_FS(header_desc);
616
617 last_seg = (u8)GET_RX_BUFFER_DESC_LS(header_desc);
618
619 while (total_len == 0 && first_seg == 0 && last_seg == 0) {
620 read_cnt++;
621 total_len = (u16)GET_RX_BUFFER_DESC_TOTAL_LENGTH(header_desc);
622 first_seg = (u8)GET_RX_BUFFER_DESC_FS(header_desc);
623 last_seg = (u8)GET_RX_BUFFER_DESC_LS(header_desc);
624
625 if (read_cnt > 20)
626 break;
627 }
628}
629
630u16 rtl92ee_rx_desc_buff_remained_cnt(struct ieee80211_hw *hw, u8 queue_index)
631{
632 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
633 struct rtl_priv *rtlpriv = rtl_priv(hw);
634 u16 read_point = 0, write_point = 0, remind_cnt = 0;
635 u32 tmp_4byte = 0;
636 static u16 last_read_point;
637 static bool start_rx;
638
639 tmp_4byte = rtl_read_dword(rtlpriv, REG_RXQ_TXBD_IDX);
640 read_point = (u16)((tmp_4byte>>16) & 0x7ff);
641 write_point = (u16)(tmp_4byte & 0x7ff);
642
643 if (write_point != rtlpci->rx_ring[queue_index].next_rx_rp) {
644 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_DMESG,
645 "!!!write point is 0x%x, reg 0x3B4 value is 0x%x\n",
646 write_point, tmp_4byte);
647 tmp_4byte = rtl_read_dword(rtlpriv, REG_RXQ_TXBD_IDX);
648 read_point = (u16)((tmp_4byte>>16) & 0x7ff);
649 write_point = (u16)(tmp_4byte & 0x7ff);
650 }
651
652 if (read_point > 0)
653 start_rx = true;
654 if (!start_rx)
655 return 0;
656
657 if ((last_read_point > (RX_DESC_NUM_92E / 2)) &&
658 (read_point <= (RX_DESC_NUM_92E / 2))) {
659 remind_cnt = RX_DESC_NUM_92E - write_point;
660 } else {
661 remind_cnt = (read_point >= write_point) ?
662 (read_point - write_point) :
663 (RX_DESC_NUM_92E - write_point + read_point);
664 }
665
666 if (remind_cnt == 0)
667 return 0;
668
669 rtlpci->rx_ring[queue_index].next_rx_rp = write_point;
670
671 last_read_point = read_point;
672 return remind_cnt;
673}
674
675static u16 get_desc_addr_fr_q_idx(u16 queue_index)
676{
677 u16 desc_address = REG_BEQ_TXBD_IDX;
678
679 switch (queue_index) {
680 case BK_QUEUE:
681 desc_address = REG_BKQ_TXBD_IDX;
682 break;
683 case BE_QUEUE:
684 desc_address = REG_BEQ_TXBD_IDX;
685 break;
686 case VI_QUEUE:
687 desc_address = REG_VIQ_TXBD_IDX;
688 break;
689 case VO_QUEUE:
690 desc_address = REG_VOQ_TXBD_IDX;
691 break;
692 case BEACON_QUEUE:
693 desc_address = REG_BEQ_TXBD_IDX;
694 break;
695 case TXCMD_QUEUE:
696 desc_address = REG_BEQ_TXBD_IDX;
697 break;
698 case MGNT_QUEUE:
699 desc_address = REG_MGQ_TXBD_IDX;
700 break;
701 case HIGH_QUEUE:
702 desc_address = REG_HI0Q_TXBD_IDX;
703 break;
704 case HCCA_QUEUE:
705 desc_address = REG_BEQ_TXBD_IDX;
706 break;
707 default:
708 break;
709 }
710 return desc_address;
711}
712
713void rtl92ee_get_available_desc(struct ieee80211_hw *hw, u8 q_idx)
714{
715 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
716 struct rtl_priv *rtlpriv = rtl_priv(hw);
717 u16 point_diff = 0;
718 u16 current_tx_read_point = 0, current_tx_write_point = 0;
719 u32 tmp_4byte;
720
721 tmp_4byte = rtl_read_dword(rtlpriv,
722 get_desc_addr_fr_q_idx(q_idx));
723 current_tx_read_point = (u16)((tmp_4byte >> 16) & 0x0fff);
724 current_tx_write_point = (u16)((tmp_4byte) & 0x0fff);
725
726 point_diff = ((current_tx_read_point > current_tx_write_point) ?
727 (current_tx_read_point - current_tx_write_point) :
728 (TX_DESC_NUM_92E - current_tx_write_point +
729 current_tx_read_point));
730
731 rtlpci->tx_ring[q_idx].avl_desc = point_diff;
732}
733
734void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
735 u8 *tx_bd_desc, u8 *desc, u8 queue_index,
736 struct sk_buff *skb, dma_addr_t addr)
737{
738 struct rtl_priv *rtlpriv = rtl_priv(hw);
739 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
740 u32 pkt_len = skb->len;
741 u16 desc_size = 40; /*tx desc size*/
742 u32 psblen = 0;
743 u16 tx_page_size = 0;
744 u32 total_packet_size = 0;
745 u16 current_bd_desc;
746 u8 i = 0;
747 u16 real_desc_size = 0x28;
748 u16 append_early_mode_size = 0;
749#if (RTL8192EE_SEG_NUM == 0)
750 u8 segmentnum = 2;
751#elif (RTL8192EE_SEG_NUM == 1)
752 u8 segmentnum = 4;
753#elif (RTL8192EE_SEG_NUM == 2)
754 u8 segmentnum = 8;
755#endif
756
757 tx_page_size = 2;
758 current_bd_desc = rtlpci->tx_ring[queue_index].cur_tx_wp;
759
760 total_packet_size = desc_size+pkt_len;
761
762 if (rtlpriv->rtlhal.earlymode_enable) {
763 if (queue_index < BEACON_QUEUE) {
764 append_early_mode_size = 8;
765 total_packet_size += append_early_mode_size;
766 }
767 }
768
769 if (tx_page_size > 0) {
770 psblen = (pkt_len + real_desc_size + append_early_mode_size) /
771 (tx_page_size * 128);
772
773 if (psblen * (tx_page_size * 128) < total_packet_size)
774 psblen += 1;
775 }
776
777 /* Reset */
778 SET_TX_BUFF_DESC_LEN_0(tx_bd_desc, 0);
779 SET_TX_BUFF_DESC_PSB(tx_bd_desc, 0);
780 SET_TX_BUFF_DESC_OWN(tx_bd_desc, 0);
781
782 for (i = 1; i < segmentnum; i++) {
783 SET_TXBUFFER_DESC_LEN_WITH_OFFSET(tx_bd_desc, i, 0);
784 SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(tx_bd_desc, i, 0);
785 SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(tx_bd_desc, i, 0);
786#if (DMA_IS_64BIT == 1)
787 SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(tx_bd_desc, i, 0);
788#endif
789 }
790 SET_TX_BUFF_DESC_LEN_1(tx_bd_desc, 0);
791 SET_TX_BUFF_DESC_AMSDU_1(tx_bd_desc, 0);
792
793 SET_TX_BUFF_DESC_LEN_2(tx_bd_desc, 0);
794 SET_TX_BUFF_DESC_AMSDU_2(tx_bd_desc, 0);
795 SET_TX_BUFF_DESC_LEN_3(tx_bd_desc, 0);
796 SET_TX_BUFF_DESC_AMSDU_3(tx_bd_desc, 0);
797 /* Clear all status */
798 CLEAR_PCI_TX_DESC_CONTENT(desc, TX_DESC_SIZE);
799
800 if (rtlpriv->rtlhal.earlymode_enable) {
801 if (queue_index < BEACON_QUEUE) {
802 /* This if needs braces */
803 SET_TX_BUFF_DESC_LEN_0(tx_bd_desc, desc_size + 8);
804 } else {
805 SET_TX_BUFF_DESC_LEN_0(tx_bd_desc, desc_size);
806 }
807 } else {
808 SET_TX_BUFF_DESC_LEN_0(tx_bd_desc, desc_size);
809 }
810 SET_TX_BUFF_DESC_PSB(tx_bd_desc, psblen);
811 SET_TX_BUFF_DESC_ADDR_LOW_0(tx_bd_desc,
812 rtlpci->tx_ring[queue_index].dma +
813 (current_bd_desc * TX_DESC_SIZE));
814
815 SET_TXBUFFER_DESC_LEN_WITH_OFFSET(tx_bd_desc, 1, pkt_len);
816 /* don't using extendsion mode. */
817 SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(tx_bd_desc, 1, 0);
818 SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(tx_bd_desc, 1, addr);
819
820 SET_TX_DESC_PKT_SIZE(desc, (u16)(pkt_len));
821 SET_TX_DESC_TX_BUFFER_SIZE(desc, (u16)(pkt_len));
822}
823
824void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
825 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
826 u8 *pbd_desc_tx,
827 struct ieee80211_tx_info *info,
828 struct ieee80211_sta *sta,
829 struct sk_buff *skb,
830 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
831{
832 struct rtl_priv *rtlpriv = rtl_priv(hw);
833 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
834 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
835 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
836 u8 *pdesc = (u8 *)pdesc_tx;
837 u16 seq_number;
838 __le16 fc = hdr->frame_control;
839 unsigned int buf_len = 0;
840 u8 fw_qsel = _rtl92ee_map_hwqueue_to_fwqueue(skb, hw_queue);
841 bool firstseg = ((hdr->seq_ctrl &
842 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
843 bool lastseg = ((hdr->frame_control &
844 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
845 dma_addr_t mapping;
846 u8 bw_40 = 0;
847 u8 short_gi = 0;
848
849 if (mac->opmode == NL80211_IFTYPE_STATION) {
850 bw_40 = mac->bw_40;
851 } else if (mac->opmode == NL80211_IFTYPE_AP ||
852 mac->opmode == NL80211_IFTYPE_ADHOC) {
853 if (sta)
854 bw_40 = sta->ht_cap.cap &
855 IEEE80211_HT_CAP_SUP_WIDTH_20_40;
856 }
857 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
858 rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
859 /* reserve 8 byte for AMPDU early mode */
860 if (rtlhal->earlymode_enable) {
861 skb_push(skb, EM_HDR_LEN);
862 memset(skb->data, 0, EM_HDR_LEN);
863 }
864 buf_len = skb->len;
865 mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
866 PCI_DMA_TODEVICE);
867 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
868 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
869 "DMA mapping error");
870 return;
871 }
872
873 if (pbd_desc_tx != NULL)
874 rtl92ee_pre_fill_tx_bd_desc(hw, pbd_desc_tx, pdesc, hw_queue,
875 skb, mapping);
876
877 if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
878 firstseg = true;
879 lastseg = true;
880 }
881 if (firstseg) {
882 if (rtlhal->earlymode_enable) {
883 SET_TX_DESC_PKT_OFFSET(pdesc, 1);
884 SET_TX_DESC_OFFSET(pdesc,
885 USB_HWDESC_HEADER_LEN + EM_HDR_LEN);
886 if (ptcb_desc->empkt_num) {
887 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
888 "Insert 8 byte.pTcb->EMPktNum:%d\n",
889 ptcb_desc->empkt_num);
890 _rtl92ee_insert_emcontent(ptcb_desc,
891 (u8 *)(skb->data));
892 }
893 } else {
894 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
895 }
896
897 SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
898
899 if (ieee80211_is_mgmt(fc)) {
900 ptcb_desc->use_driver_rate = true;
901 } else {
902 if (rtlpriv->ra.is_special_data) {
903 ptcb_desc->use_driver_rate = true;
904 SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE11M);
905 } else {
906 ptcb_desc->use_driver_rate = false;
907 }
908 }
909
910 if (ptcb_desc->hw_rate > DESC92C_RATEMCS0)
911 short_gi = (ptcb_desc->use_shortgi) ? 1 : 0;
912 else
913 short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0;
914
915 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
916 SET_TX_DESC_AGG_ENABLE(pdesc, 1);
917 SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x14);
918 }
919 SET_TX_DESC_SEQ(pdesc, seq_number);
920 SET_TX_DESC_RTS_ENABLE(pdesc,
921 ((ptcb_desc->rts_enable &&
922 !ptcb_desc->cts_enable) ? 1 : 0));
923 SET_TX_DESC_HW_RTS_ENABLE(pdesc, 0);
924 SET_TX_DESC_CTS2SELF(pdesc,
925 ((ptcb_desc->cts_enable) ? 1 : 0));
926
927 SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
928 SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
929 SET_TX_DESC_RTS_SHORT(pdesc,
930 ((ptcb_desc->rts_rate <= DESC92C_RATE54M) ?
931 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
932 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
933
934 if (ptcb_desc->tx_enable_sw_calc_duration)
935 SET_TX_DESC_NAV_USE_HDR(pdesc, 1);
936
937 if (bw_40) {
938 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
939 SET_TX_DESC_DATA_BW(pdesc, 1);
940 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
941 } else {
942 SET_TX_DESC_DATA_BW(pdesc, 0);
943 SET_TX_DESC_TX_SUB_CARRIER(pdesc,
944 mac->cur_40_prime_sc);
945 }
946 } else {
947 SET_TX_DESC_DATA_BW(pdesc, 0);
948 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 0);
949 }
950
951 SET_TX_DESC_LINIP(pdesc, 0);
952 if (sta) {
953 u8 ampdu_density = sta->ht_cap.ampdu_density;
954
955 SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
956 }
957 if (info->control.hw_key) {
958 struct ieee80211_key_conf *key = info->control.hw_key;
959
960 switch (key->cipher) {
961 case WLAN_CIPHER_SUITE_WEP40:
962 case WLAN_CIPHER_SUITE_WEP104:
963 case WLAN_CIPHER_SUITE_TKIP:
964 SET_TX_DESC_SEC_TYPE(pdesc, 0x1);
965 break;
966 case WLAN_CIPHER_SUITE_CCMP:
967 SET_TX_DESC_SEC_TYPE(pdesc, 0x3);
968 break;
969 default:
970 SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
971 break;
972 }
973 }
974
975 SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel);
976 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
977 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
978 SET_TX_DESC_DISABLE_FB(pdesc,
979 ptcb_desc->disable_ratefallback ? 1 : 0);
980 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
981
982 /*SET_TX_DESC_PWR_STATUS(pdesc, pwr_status);*/
983 /* Set TxRate and RTSRate in TxDesc */
984 /* This prevent Tx initial rate of new-coming packets */
985 /* from being overwritten by retried packet rate.*/
986 if (!ptcb_desc->use_driver_rate) {
987 /*SET_TX_DESC_RTS_RATE(pdesc, 0x08); */
988 /* SET_TX_DESC_TX_RATE(pdesc, 0x0b); */
989 }
990 if (ieee80211_is_data_qos(fc)) {
991 if (mac->rdg_en) {
992 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
993 "Enable RDG function.\n");
994 SET_TX_DESC_RDG_ENABLE(pdesc, 1);
995 SET_TX_DESC_HTC(pdesc, 1);
996 }
997 }
998 }
999
1000 SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
1001 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
1002 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
1003 if (rtlpriv->dm.useramask) {
1004 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
1005 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
1006 } else {
1007 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
1008 SET_TX_DESC_MACID(pdesc, ptcb_desc->ratr_index);
1009 }
1010
1011 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
1012 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
1013 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
1014 SET_TX_DESC_BMC(pdesc, 1);
1015 }
1016 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
1017}
1018
1019void rtl92ee_tx_fill_cmddesc(struct ieee80211_hw *hw,
1020 u8 *pdesc, bool firstseg,
1021 bool lastseg, struct sk_buff *skb)
1022{
1023 struct rtl_priv *rtlpriv = rtl_priv(hw);
1024 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1025 u8 fw_queue = QSLT_BEACON;
1026 dma_addr_t mapping = pci_map_single(rtlpci->pdev,
1027 skb->data, skb->len,
1028 PCI_DMA_TODEVICE);
1029 u8 txdesc_len = 40;
1030
1031 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
1032 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
1033 "DMA mapping error");
1034 return;
1035 }
1036 CLEAR_PCI_TX_DESC_CONTENT(pdesc, txdesc_len);
1037
1038 if (firstseg)
1039 SET_TX_DESC_OFFSET(pdesc, txdesc_len);
1040
1041 SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE1M);
1042
1043 SET_TX_DESC_SEQ(pdesc, 0);
1044
1045 SET_TX_DESC_LINIP(pdesc, 0);
1046
1047 SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue);
1048
1049 SET_TX_DESC_FIRST_SEG(pdesc, 1);
1050 SET_TX_DESC_LAST_SEG(pdesc, 1);
1051
1052 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)(skb->len));
1053
1054 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
1055
1056 SET_TX_DESC_RATE_ID(pdesc, 7);
1057 SET_TX_DESC_MACID(pdesc, 0);
1058
1059 SET_TX_DESC_OWN(pdesc, 1);
1060
1061 SET_TX_DESC_PKT_SIZE((u8 *)pdesc, (u16)(skb->len));
1062
1063 SET_TX_DESC_FIRST_SEG(pdesc, 1);
1064 SET_TX_DESC_LAST_SEG(pdesc, 1);
1065
1066 SET_TX_DESC_OFFSET(pdesc, 40);
1067
1068 SET_TX_DESC_USE_RATE(pdesc, 1);
1069
1070 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1071 "H2C Tx Cmd Content\n", pdesc, txdesc_len);
1072}
1073
1074void rtl92ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
1075 u8 desc_name, u8 *val)
1076{
1077 struct rtl_priv *rtlpriv = rtl_priv(hw);
1078 u16 cur_tx_rp = 0;
1079 u16 cur_tx_wp = 0;
1080 static u16 last_txw_point;
1081 static bool over_run;
1082 u32 tmp = 0;
1083 u8 q_idx = *val;
1084
1085 if (istx) {
1086 switch (desc_name) {
1087 case HW_DESC_TX_NEXTDESC_ADDR:
1088 SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *)val);
1089 break;
1090 case HW_DESC_OWN:{
1091 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1092 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[q_idx];
1093 u16 max_tx_desc = ring->entries;
1094
1095 if (q_idx == BEACON_QUEUE) {
1096 ring->cur_tx_wp = 0;
1097 ring->cur_tx_rp = 0;
1098 SET_TX_BUFF_DESC_OWN(pdesc, 1);
1099 return;
1100 }
1101
1102 ring->cur_tx_wp = ((ring->cur_tx_wp + 1) % max_tx_desc);
1103
1104 if (over_run) {
1105 ring->cur_tx_wp = 0;
1106 over_run = false;
1107 }
1108 if (ring->avl_desc > 1) {
1109 ring->avl_desc--;
1110
1111 rtl_write_word(rtlpriv,
1112 get_desc_addr_fr_q_idx(q_idx),
1113 ring->cur_tx_wp);
1114
1115 if (q_idx == 1)
1116 last_txw_point = cur_tx_wp;
1117 }
1118
1119 if (ring->avl_desc < (max_tx_desc - 15)) {
1120 u16 point_diff = 0;
1121
1122 tmp =
1123 rtl_read_dword(rtlpriv,
1124 get_desc_addr_fr_q_idx(q_idx));
1125 cur_tx_rp = (u16)((tmp >> 16) & 0x0fff);
1126 cur_tx_wp = (u16)(tmp & 0x0fff);
1127
1128 ring->cur_tx_wp = cur_tx_wp;
1129 ring->cur_tx_rp = cur_tx_rp;
1130 point_diff = ((cur_tx_rp > cur_tx_wp) ?
1131 (cur_tx_rp - cur_tx_wp) :
1132 (TX_DESC_NUM_92E - 1 -
1133 cur_tx_wp + cur_tx_rp));
1134
1135 ring->avl_desc = point_diff;
1136 }
1137 }
1138 break;
1139 }
1140 } else {
1141 switch (desc_name) {
1142 case HW_DESC_RX_PREPARE:
1143 SET_RX_BUFFER_DESC_LS(pdesc, 0);
1144 SET_RX_BUFFER_DESC_FS(pdesc, 0);
1145 SET_RX_BUFFER_DESC_TOTAL_LENGTH(pdesc, 0);
1146
1147 SET_RX_BUFFER_DESC_DATA_LENGTH(pdesc,
1148 MAX_RECEIVE_BUFFER_SIZE +
1149 RX_DESC_SIZE);
1150
1151 SET_RX_BUFFER_PHYSICAL_LOW(pdesc, *(u32 *)val);
1152 break;
1153 case HW_DESC_RXERO:
1154 SET_RX_DESC_EOR(pdesc, 1);
1155 break;
1156 default:
1157 RT_ASSERT(false,
1158 "ERR rxdesc :%d not process\n", desc_name);
1159 break;
1160 }
1161 }
1162}
1163
1164u32 rtl92ee_get_desc(u8 *pdesc, bool istx, u8 desc_name)
1165{
1166 u32 ret = 0;
1167
1168 if (istx) {
1169 switch (desc_name) {
1170 case HW_DESC_OWN:
1171 ret = GET_TX_DESC_OWN(pdesc);
1172 break;
1173 case HW_DESC_TXBUFF_ADDR:
1174 ret = GET_TXBUFFER_DESC_ADDR_LOW(pdesc, 1);
1175 break;
1176 default:
1177 RT_ASSERT(false,
1178 "ERR txdesc :%d not process\n", desc_name);
1179 break;
1180 }
1181 } else {
1182 switch (desc_name) {
1183 case HW_DESC_OWN:
1184 ret = GET_RX_DESC_OWN(pdesc);
1185 break;
1186 case HW_DESC_RXPKT_LEN:
1187 ret = GET_RX_DESC_PKT_LEN(pdesc);
1188 break;
1189 case HW_DESC_RXBUFF_ADDR:
1190 ret = GET_RX_DESC_BUFF_ADDR(pdesc);
1191 break;
1192 default:
1193 RT_ASSERT(false,
1194 "ERR rxdesc :%d not process\n", desc_name);
1195 break;
1196 }
1197 }
1198 return ret;
1199}
1200
1201bool rtl92ee_is_tx_desc_closed(struct ieee80211_hw *hw, u8 hw_queue, u16 index)
1202{
1203 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1204 struct rtl_priv *rtlpriv = rtl_priv(hw);
1205 u16 read_point, write_point, available_desc_num;
1206 bool ret = false;
1207 static u8 stop_report_cnt;
1208 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
1209
1210 /*checking Read/Write Point each interrupt wastes CPU */
1211 if (stop_report_cnt > 15 || !rtlpriv->link_info.busytraffic) {
1212 u16 point_diff = 0;
1213 u16 cur_tx_rp, cur_tx_wp;
1214 u32 tmpu32 = 0;
1215
1216 tmpu32 =
1217 rtl_read_dword(rtlpriv,
1218 get_desc_addr_fr_q_idx(hw_queue));
1219 cur_tx_rp = (u16)((tmpu32 >> 16) & 0x0fff);
1220 cur_tx_wp = (u16)(tmpu32 & 0x0fff);
1221
1222 ring->cur_tx_wp = cur_tx_wp;
1223 ring->cur_tx_rp = cur_tx_rp;
1224 point_diff = ((cur_tx_rp > cur_tx_wp) ?
1225 (cur_tx_rp - cur_tx_wp) :
1226 (TX_DESC_NUM_92E - cur_tx_wp + cur_tx_rp));
1227
1228 ring->avl_desc = point_diff;
1229 }
1230
1231 read_point = ring->cur_tx_rp;
1232 write_point = ring->cur_tx_wp;
1233 available_desc_num = ring->avl_desc;
1234
1235 if (write_point > read_point) {
1236 if (index < write_point && index >= read_point)
1237 ret = false;
1238 else
1239 ret = true;
1240 } else if (write_point < read_point) {
1241 if (index > write_point && index < read_point)
1242 ret = true;
1243 else
1244 ret = false;
1245 } else {
1246 if (index != read_point)
1247 ret = true;
1248 }
1249
1250 if (hw_queue == BEACON_QUEUE)
1251 ret = true;
1252
1253 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1254 rtlpriv->psc.rfoff_reason > RF_CHANGE_BY_PS)
1255 ret = true;
1256
1257 if (hw_queue < BEACON_QUEUE) {
1258 if (!ret)
1259 stop_report_cnt++;
1260 else
1261 stop_report_cnt = 0;
1262 }
1263
1264 return ret;
1265}
1266
1267void rtl92ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
1268{
1269}
1270
1271u32 rtl92ee_rx_command_packet(struct ieee80211_hw *hw,
1272 struct rtl_stats status,
1273 struct sk_buff *skb)
1274{
1275 u32 result = 0;
1276 struct rtl_priv *rtlpriv = rtl_priv(hw);
1277
1278 switch (status.packet_report_type) {
1279 case NORMAL_RX:
1280 result = 0;
1281 break;
1282 case C2H_PACKET:
1283 rtl92ee_c2h_packet_handler(hw, skb->data, (u8)skb->len);
1284 result = 1;
1285 break;
1286 default:
1287 RT_TRACE(rtlpriv, COMP_RECV, DBG_TRACE,
1288 "Unknown packet type %d\n", status.packet_report_type);
1289 break;
1290 }
1291
1292 return result;
1293}
diff --git a/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
new file mode 100644
index 000000000000..6f9be1c7515c
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8192ee/trx.h
@@ -0,0 +1,860 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL92E_TRX_H__
27#define __RTL92E_TRX_H__
28
29#if (DMA_IS_64BIT == 1)
30#if (RTL8192EE_SEG_NUM == 2)
31#define TX_BD_DESC_SIZE 128
32#elif (RTL8192EE_SEG_NUM == 1)
33#define TX_BD_DESC_SIZE 64
34#elif (RTL8192EE_SEG_NUM == 0)
35#define TX_BD_DESC_SIZE 32
36#endif
37#else
38#if (RTL8192EE_SEG_NUM == 2)
39#define TX_BD_DESC_SIZE 64
40#elif (RTL8192EE_SEG_NUM == 1)
41#define TX_BD_DESC_SIZE 32
42#elif (RTL8192EE_SEG_NUM == 0)
43#define TX_BD_DESC_SIZE 16
44#endif
45#endif
46
47#define TX_DESC_SIZE 64
48
49#define RX_DRV_INFO_SIZE_UNIT 8
50
51#define TX_DESC_NEXT_DESC_OFFSET 40
52#define USB_HWDESC_HEADER_LEN 40
53
54#define RX_DESC_SIZE 24
55#define MAX_RECEIVE_BUFFER_SIZE 8192
56
57#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \
58 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 16, __val)
59#define SET_TX_DESC_OFFSET(__pdesc, __val) \
60 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 8, __val)
61#define SET_TX_DESC_BMC(__pdesc, __val) \
62 SET_BITS_TO_LE_4BYTE(__pdesc, 24, 1, __val)
63#define SET_TX_DESC_HTC(__pdesc, __val) \
64 SET_BITS_TO_LE_4BYTE(__pdesc, 25, 1, __val)
65#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \
66 SET_BITS_TO_LE_4BYTE(__pdesc, 26, 1, __val)
67#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \
68 SET_BITS_TO_LE_4BYTE(__pdesc, 27, 1, __val)
69#define SET_TX_DESC_LINIP(__pdesc, __val) \
70 SET_BITS_TO_LE_4BYTE(__pdesc, 28, 1, __val)
71#define SET_TX_DESC_NO_ACM(__pdesc, __val) \
72 SET_BITS_TO_LE_4BYTE(__pdesc, 29, 1, __val)
73#define SET_TX_DESC_GF(__pdesc, __val) \
74 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
75#define SET_TX_DESC_OWN(__pdesc, __val) \
76 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
77
78#define GET_TX_DESC_PKT_SIZE(__pdesc) \
79 LE_BITS_TO_4BYTE(__pdesc, 0, 16)
80#define GET_TX_DESC_OFFSET(__pdesc) \
81 LE_BITS_TO_4BYTE(__pdesc, 16, 8)
82#define GET_TX_DESC_BMC(__pdesc) \
83 LE_BITS_TO_4BYTE(__pdesc, 24, 1)
84#define GET_TX_DESC_HTC(__pdesc) \
85 LE_BITS_TO_4BYTE(__pdesc, 25, 1)
86#define GET_TX_DESC_LAST_SEG(__pdesc) \
87 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
88#define GET_TX_DESC_FIRST_SEG(__pdesc) \
89 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
90#define GET_TX_DESC_LINIP(__pdesc) \
91 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
92#define GET_TX_DESC_NO_ACM(__pdesc) \
93 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
94#define GET_TX_DESC_GF(__pdesc) \
95 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
96#define GET_TX_DESC_OWN(__pdesc) \
97 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
98
99#define SET_TX_DESC_MACID(__pdesc, __val) \
100 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 7, __val)
101#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \
102 SET_BITS_TO_LE_4BYTE(__pdesc+4, 8, 5, __val)
103#define SET_TX_DESC_RDG_NAV_EXT(__pdesc, __val) \
104 SET_BITS_TO_LE_4BYTE(__pdesc+4, 13, 1, __val)
105#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \
106 SET_BITS_TO_LE_4BYTE(__pdesc+4, 14, 1, __val)
107#define SET_TX_DESC_PIFS(__pdesc, __val) \
108 SET_BITS_TO_LE_4BYTE(__pdesc+4, 15, 1, __val)
109#define SET_TX_DESC_RATE_ID(__pdesc, __val) \
110 SET_BITS_TO_LE_4BYTE(__pdesc+4, 16, 5, __val)
111#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \
112 SET_BITS_TO_LE_4BYTE(__pdesc+4, 21, 1, __val)
113#define SET_TX_DESC_SEC_TYPE(__pdesc, __val) \
114 SET_BITS_TO_LE_4BYTE(__pdesc+4, 22, 2, __val)
115#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \
116 SET_BITS_TO_LE_4BYTE(__pdesc+4, 24, 5, __val)
117#define SET_TX_DESC_MORE_DATA(__pdesc, __val) \
118 SET_BITS_TO_LE_4BYTE(__pdesc+4, 29, 1, __val)
119#define SET_TX_DESC_TXOP_PS_CAP(__pdesc, __val) \
120 SET_BITS_TO_LE_4BYTE(__pdesc+4, 30, 1, __val)
121#define SET_TX_DESC_TXOP_PS_MODE(__pdesc, __val) \
122 SET_BITS_TO_LE_4BYTE(__pdesc+4, 31, 1, __val)
123
124#define GET_TX_DESC_MACID(__pdesc) \
125 LE_BITS_TO_4BYTE(__pdesc+4, 0, 5)
126#define GET_TX_DESC_AGG_ENABLE(__pdesc) \
127 LE_BITS_TO_4BYTE(__pdesc+4, 5, 1)
128#define GET_TX_DESC_AGG_BREAK(__pdesc) \
129 LE_BITS_TO_4BYTE(__pdesc+4, 6, 1)
130#define GET_TX_DESC_RDG_ENABLE(__pdesc) \
131 LE_BITS_TO_4BYTE(__pdesc+4, 7, 1)
132#define GET_TX_DESC_QUEUE_SEL(__pdesc) \
133 LE_BITS_TO_4BYTE(__pdesc+4, 8, 5)
134#define GET_TX_DESC_RDG_NAV_EXT(__pdesc) \
135 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1)
136#define GET_TX_DESC_LSIG_TXOP_EN(__pdesc) \
137 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1)
138#define GET_TX_DESC_PIFS(__pdesc) \
139 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1)
140#define GET_TX_DESC_RATE_ID(__pdesc) \
141 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4)
142#define GET_TX_DESC_NAV_USE_HDR(__pdesc) \
143 LE_BITS_TO_4BYTE(__pdesc+4, 20, 1)
144#define GET_TX_DESC_EN_DESC_ID(__pdesc) \
145 LE_BITS_TO_4BYTE(__pdesc+4, 21, 1)
146#define GET_TX_DESC_SEC_TYPE(__pdesc) \
147 LE_BITS_TO_4BYTE(__pdesc+4, 22, 2)
148#define GET_TX_DESC_PKT_OFFSET(__pdesc) \
149 LE_BITS_TO_4BYTE(__pdesc+4, 24, 5)
150
151#define SET_TX_DESC_PAID(__pdesc, __val) \
152 SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 9, __val)
153#define SET_TX_DESC_CCA_RTS(__pdesc, __val) \
154 SET_BITS_TO_LE_4BYTE(__pdesc+8, 10, 2, __val)
155#define SET_TX_DESC_AGG_ENABLE(__pdesc, __val) \
156 SET_BITS_TO_LE_4BYTE(__pdesc+8, 12, 1, __val)
157#define SET_TX_DESC_RDG_ENABLE(__pdesc, __val) \
158 SET_BITS_TO_LE_4BYTE(__pdesc+8, 13, 1, __val)
159#define SET_TX_DESC_NULL_0(__pdesc, __val) \
160 SET_BITS_TO_LE_4BYTE(__pdesc+8, 14, 1, __val)
161#define SET_TX_DESC_NULL_1(__pdesc, __val) \
162 SET_BITS_TO_LE_4BYTE(__pdesc+8, 15, 1, __val)
163#define SET_TX_DESC_BK(__pdesc, __val) \
164 SET_BITS_TO_LE_4BYTE(__pdesc+8, 16, 1, __val)
165#define SET_TX_DESC_MORE_FRAG(__pdesc, __val) \
166 SET_BITS_TO_LE_4BYTE(__pdesc+8, 17, 1, __val)
167#define SET_TX_DESC_RAW(__pdesc, __val) \
168 SET_BITS_TO_LE_4BYTE(__pdesc+8, 18, 1, __val)
169#define SET_TX_DESC_SPE_RPT(__pdesc, __val) \
170 SET_BITS_TO_LE_4BYTE(__pdesc+8, 19, 1, __val)
171#define SET_TX_DESC_AMPDU_DENSITY(__pdesc, __val) \
172 SET_BITS_TO_LE_4BYTE(__pdesc+8, 20, 3, __val)
173#define SET_TX_DESC_BT_NULL(__pdesc, __val) \
174 SET_BITS_TO_LE_4BYTE(__pdesc+8, 23, 1, __val)
175#define SET_TX_DESC_GID(__pdesc, __val) \
176 SET_BITS_TO_LE_4BYTE(__pdesc+8, 24, 6, __val)
177
178#define SET_TX_DESC_WHEADER_LEN(__pdesc, __val) \
179 SET_BITS_TO_LE_4BYTE(__pdesc+12, 0, 4, __val)
180#define SET_TX_DESC_CHK_EN(__pdesc, __val) \
181 SET_BITS_TO_LE_4BYTE(__pdesc+12, 4, 1, __val)
182#define SET_TX_DESC_EARLY_RATE(__pdesc, __val) \
183 SET_BITS_TO_LE_4BYTE(__pdesc+12, 5, 1, __val)
184#define SET_TX_DESC_HWSEQ_SEL(__pdesc, __val) \
185 SET_BITS_TO_LE_4BYTE(__pdesc+12, 6, 2, __val)
186#define SET_TX_DESC_USE_RATE(__pdesc, __val) \
187 SET_BITS_TO_LE_4BYTE(__pdesc+12, 8, 1, __val)
188#define SET_TX_DESC_DISABLE_RTS_FB(__pdesc, __val) \
189 SET_BITS_TO_LE_4BYTE(__pdesc+12, 9, 1, __val)
190#define SET_TX_DESC_DISABLE_FB(__pdesc, __val) \
191 SET_BITS_TO_LE_4BYTE(__pdesc+12, 10, 1, __val)
192#define SET_TX_DESC_CTS2SELF(__pdesc, __val) \
193 SET_BITS_TO_LE_4BYTE(__pdesc+12, 11, 1, __val)
194#define SET_TX_DESC_RTS_ENABLE(__pdesc, __val) \
195 SET_BITS_TO_LE_4BYTE(__pdesc+12, 12, 1, __val)
196#define SET_TX_DESC_HW_RTS_ENABLE(__pdesc, __val) \
197 SET_BITS_TO_LE_4BYTE(__pdesc+12, 13, 1, __val)
198#define SET_TX_DESC_HW_PORT_ID(__pdesc, __val) \
199 SET_BITS_TO_LE_4BYTE(__pdesc+12, 14, 1, __val)
200#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \
201 SET_BITS_TO_LE_4BYTE(__pdesc+12, 15, 1, __val)
202#define SET_TX_DESC_USE_MAX_LEN(__pdesc, __val) \
203 SET_BITS_TO_LE_4BYTE(__pdesc+12, 16, 1, __val)
204#define SET_TX_DESC_MAX_AGG_NUM(__pdesc, __val) \
205 SET_BITS_TO_LE_4BYTE(__pdesc+12, 17, 5, __val)
206#define SET_TX_DESC_NDPA(__pdesc, __val) \
207 SET_BITS_TO_LE_4BYTE(__pdesc+12, 22, 2, __val)
208#define SET_TX_DESC_AMPDU_MAX_TIME(__pdesc, __val) \
209 SET_BITS_TO_LE_4BYTE(__pdesc+12, 24, 8, __val)
210
211/* Dword 4 */
212#define SET_TX_DESC_TX_RATE(__pdesc, __val) \
213 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 7, __val)
214#define SET_TX_DESC_TRY_RATE(__pdesc, __val) \
215 SET_BITS_TO_LE_4BYTE(__pdesc+16, 7, 1, __val)
216#define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc, __val) \
217 SET_BITS_TO_LE_4BYTE(__pdesc+16, 8, 5, __val)
218#define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc, __val) \
219 SET_BITS_TO_LE_4BYTE(__pdesc+16, 13, 4, __val)
220#define SET_TX_DESC_RETRY_LIMIT_ENABLE(__pdesc, __val) \
221 SET_BITS_TO_LE_4BYTE(__pdesc+16, 17, 1, __val)
222#define SET_TX_DESC_DATA_RETRY_LIMIT(__pdesc, __val) \
223 SET_BITS_TO_LE_4BYTE(__pdesc+16, 18, 6, __val)
224#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \
225 SET_BITS_TO_LE_4BYTE(__pdesc+16, 24, 5, __val)
226#define SET_TX_DESC_PCTS_ENABLE(__pdesc, __val) \
227 SET_BITS_TO_LE_4BYTE(__pdesc+16, 29, 1, __val)
228#define SET_TX_DESC_PCTS_MASK_IDX(__pdesc, __val) \
229 SET_BITS_TO_LE_4BYTE(__pdesc+16, 30, 2, __val)
230
231/* Dword 5 */
232#define SET_TX_DESC_TX_SUB_CARRIER(__pdesc, __val) \
233 SET_BITS_TO_LE_4BYTE(__pdesc+20, 0, 4, __val)
234#define SET_TX_DESC_DATA_SHORT(__pdesc, __val) \
235 SET_BITS_TO_LE_4BYTE(__pdesc+20, 4, 1, __val)
236#define SET_TX_DESC_DATA_BW(__pdesc, __val) \
237 SET_BITS_TO_LE_4BYTE(__pdesc+20, 5, 2, __val)
238#define SET_TX_DESC_DATA_LDPC(__pdesc, __val) \
239 SET_BITS_TO_LE_4BYTE(__pdesc+20, 7, 1, __val)
240#define SET_TX_DESC_DATA_STBC(__pdesc, __val) \
241 SET_BITS_TO_LE_4BYTE(__pdesc+20, 8, 2, __val)
242#define SET_TX_DESC_VCS_STBC(__pdesc, __val) \
243 SET_BITS_TO_LE_4BYTE(__pdesc+20, 10, 2, __val)
244#define SET_TX_DESC_RTS_SHORT(__pdesc, __val) \
245 SET_BITS_TO_LE_4BYTE(__pdesc+20, 12, 1, __val)
246#define SET_TX_DESC_RTS_SC(__pdesc, __val) \
247 SET_BITS_TO_LE_4BYTE(__pdesc+20, 13, 4, __val)
248#define SET_TX_DESC_TX_ANT(__pdesc, __val) \
249 SET_BITS_TO_LE_4BYTE(__pdesc+20, 24, 4, __val)
250#define SET_TX_DESC_TX_POWER_0_PSET(__pdesc, __val) \
251 SET_BITS_TO_LE_4BYTE(__pdesc+20, 28, 3, __val)
252
253/* Dword 6 */
254#define SET_TX_DESC_SW_DEFINE(__pdesc, __val) \
255 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 12, __val)
256#define SET_TX_DESC_ANTSEL_A(__pdesc, __val) \
257 SET_BITS_TO_LE_4BYTE(__pdesc+24, 16, 3, __val)
258#define SET_TX_DESC_ANTSEL_B(__pdesc, __val) \
259 SET_BITS_TO_LE_4BYTE(__pdesc+24, 19, 3, __val)
260#define SET_TX_DESC_ANTSEL_C(__pdesc, __val) \
261 SET_BITS_TO_LE_4BYTE(__pdesc+24, 22, 3, __val)
262#define SET_TX_DESC_ANTSEL_D(__pdesc, __val) \
263 SET_BITS_TO_LE_4BYTE(__pdesc+24, 25, 3, __val)
264
265/* Dword 7 */
266#define SET_TX_DESC_TX_BUFFER_SIZE(__pdesc, __val) \
267 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 16, __val)
268#define SET_TX_DESC_USB_TXAGG_NUM(__pdesc, __val) \
269 SET_BITS_TO_LE_4BYTE(__pdesc+28, 24, 8, __val)
270
271/* Dword 8 */
272#define SET_TX_DESC_RTS_RC(__pdesc, __val) \
273 SET_BITS_TO_LE_4BYTE(__pdesc+32, 0, 6, __val)
274#define SET_TX_DESC_BAR_RTY_TH(__pdesc, __val) \
275 SET_BITS_TO_LE_4BYTE(__pdesc+32, 6, 2, __val)
276#define SET_TX_DESC_DATA_RC(__pdesc, __val) \
277 SET_BITS_TO_LE_4BYTE(__pdesc+32, 8, 6, __val)
278#define SET_TX_DESC_ENABLE_HW_SELECT(__pdesc, __val) \
279 SET_BITS_TO_LE_4BYTE(__pdesc+32, 15, 1, __val)
280#define SET_TX_DESC_NEXT_HEAD_PAGE(__pdesc, __val) \
281 SET_BITS_TO_LE_4BYTE(__pdesc+32, 16, 8, __val)
282#define SET_TX_DESC_TAIL_PAGE(__pdesc, __val) \
283 SET_BITS_TO_LE_4BYTE(__pdesc+32, 24, 8, __val)
284
285/* Dword 9 */
286#define SET_TX_DESC_PADDING_LENGTH(__pdesc, __val) \
287 SET_BITS_TO_LE_4BYTE(__pdesc+36, 0, 11, __val)
288#define SET_TX_DESC_TXBF_PATH(__pdesc, __val) \
289 SET_BITS_TO_LE_4BYTE(__pdesc+36, 11, 1, __val)
290#define SET_TX_DESC_SEQ(__pdesc, __val) \
291 SET_BITS_TO_LE_4BYTE(__pdesc+36, 12, 12, __val)
292#define SET_TX_DESC_FINAL_DATA_RATE(__pdesc, __val) \
293 SET_BITS_TO_LE_4BYTE(__pdesc+36, 24, 8, __val)
294
295/* Dword 10 */
296#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc, __val) \
297 SET_BITS_TO_LE_4BYTE(__pdesc+40, 0, 32, __val)
298
299/* Dword 11*/
300#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc, __val) \
301 SET_BITS_TO_LE_4BYTE(__pdesc+48, 0, 32, __val)
302
303#define SET_EARLYMODE_PKTNUM(__paddr, __val) \
304 SET_BITS_TO_LE_4BYTE(__paddr, 0, 4, __val)
305#define SET_EARLYMODE_LEN0(__paddr, __val) \
306 SET_BITS_TO_LE_4BYTE(__paddr, 4, 15, __val)
307#define SET_EARLYMODE_LEN1(__paddr, __val) \
308 SET_BITS_TO_LE_4BYTE(__paddr, 16, 2, __val)
309#define SET_EARLYMODE_LEN1_1(__paddr, __val) \
310 SET_BITS_TO_LE_4BYTE(__paddr, 19, 13, __val)
311#define SET_EARLYMODE_LEN1_2(__paddr, __val) \
312 SET_BITS_TO_LE_4BYTE(__paddr+4, 0, 2, __val)
313#define SET_EARLYMODE_LEN2(__paddr, __val) \
314 SET_BITS_TO_LE_4BYTE(__paddr+4, 2, 15, __val)
315#define SET_EARLYMODE_LEN2_1(__paddr, __val) \
316 SET_BITS_TO_LE_4BYTE(__paddr, 2, 4, __val)
317#define SET_EARLYMODE_LEN2_2(__paddr, __val) \
318 SET_BITS_TO_LE_4BYTE(__paddr+4, 0, 8, __val)
319#define SET_EARLYMODE_LEN3(__paddr, __val) \
320 SET_BITS_TO_LE_4BYTE(__paddr+4, 17, 15, __val)
321#define SET_EARLYMODE_LEN4(__paddr, __val) \
322 SET_BITS_TO_LE_4BYTE(__paddr+4, 20, 12, __val)
323
324/* TX/RX buffer descriptor */
325
326#define SET_TX_EXTBUFF_DESC_LEN(__pdesc, __val, __set) \
327 SET_BITS_TO_LE_4BYTE(__pdesc+(__set*16), 0, 16, __val)
328#define SET_TX_EXTBUFF_DESC_ADDR_LOW(__pdesc, __val, __set)\
329 SET_BITS_TO_LE_4BYTE(__pdesc+(__set*16)+4, 0, 32, __val)
330#define SET_TX_EXTBUFF_DESC_ADDR_HIGH(__pdesc, __val, __set)\
331 SET_BITS_TO_LE_4BYTE(__pdesc+(__set*16)+8, 0, 32, __val)
332
333/* for Txfilldescroptor92ee, fill the desc content. */
334#if (DMA_IS_64BIT == 1)
335#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pdesc, __offset, __val) \
336 SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16), 0, 16, __val)
337#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pdesc, __offset, __val) \
338 SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16), 31, 1, __val)
339#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pdesc, __offset, __val) \
340 SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16)+4, 0, 32, __val)
341#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pdesc, __offset, __val)\
342 SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*16)+8, 0, 32, __val)
343#define GET_TXBUFFER_DESC_ADDR_LOW(__pdesc, __offset) \
344 LE_BITS_TO_4BYTE(__pdesc+(__offset*16)+4, 0, 32)
345#else
346#define SET_TXBUFFER_DESC_LEN_WITH_OFFSET(__pdesc, __offset, __val) \
347 SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*8), 0, 16, __val)
348#define SET_TXBUFFER_DESC_AMSDU_WITH_OFFSET(__pdesc, __offset, __val) \
349 SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*8), 31, 1, __val)
350#define SET_TXBUFFER_DESC_ADD_LOW_WITH_OFFSET(__pdesc, __offset, __val) \
351 SET_BITS_TO_LE_4BYTE(__pdesc+(__offset*8)+4, 0, 32, __val)
352#define SET_TXBUFFER_DESC_ADD_HIGT_WITH_OFFSET(__pdesc, __offset, __val)
353#define GET_TXBUFFER_DESC_ADDR_LOW(__pdesc, __offset) \
354 LE_BITS_TO_4BYTE(__pdesc+(__offset*8)+4, 0, 32)
355#endif
356
357/* Dword 0 */
358#define SET_TX_BUFF_DESC_LEN_0(__pdesc, __val) \
359 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 14, __val)
360#define SET_TX_BUFF_DESC_PSB(__pdesc, __val) \
361 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 15, __val)
362#define SET_TX_BUFF_DESC_OWN(__pdesc, __val) \
363 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
364
365/* Dword 1 */
366#define SET_TX_BUFF_DESC_ADDR_LOW_0(__pdesc, __val) \
367 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 32, __val)
368#if (DMA_IS_64BIT == 1)
369/* Dword 2 */
370#define SET_TX_BUFF_DESC_ADDR_HIGH_0(__pdesc, __val) \
371 SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 32, __val)
372/* Dword 3 / RESERVED 0 */
373/* Dword 4 */
374#define SET_TX_BUFF_DESC_LEN_1(__pdesc, __val) \
375 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 16, __val)
376#define SET_TX_BUFF_DESC_AMSDU_1(__pdesc, __val) \
377 SET_BITS_TO_LE_4BYTE(__pdesc+16, 31, 1, __val)
378/* Dword 5 */
379#define SET_TX_BUFF_DESC_ADDR_LOW_1(__pdesc, __val) \
380 SET_BITS_TO_LE_4BYTE(__pdesc+20, 0, 32, __val)
381/* Dword 6 */
382#define SET_TX_BUFF_DESC_ADDR_HIGH_1(__pdesc, __val) \
383 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 32, __val)
384/* Dword 7 / RESERVED 0 */
385/* Dword 8 */
386#define SET_TX_BUFF_DESC_LEN_2(__pdesc, __val) \
387 SET_BITS_TO_LE_4BYTE(__pdesc+32, 0, 16, __val)
388#define SET_TX_BUFF_DESC_AMSDU_2(__pdesc, __val) \
389 SET_BITS_TO_LE_4BYTE(__pdesc+32, 31, 1, __val)
390/* Dword 9 */
391#define SET_TX_BUFF_DESC_ADDR_LOW_2(__pdesc, __val) \
392 SET_BITS_TO_LE_4BYTE(__pdesc+36, 0, 32, __val)
393/* Dword 10 */
394#define SET_TX_BUFF_DESC_ADDR_HIGH_2(__pdesc, __val) \
395 SET_BITS_TO_LE_4BYTE(__pdesc+40, 0, 32, __val)
396/* Dword 11 / RESERVED 0 */
397/* Dword 12 */
398#define SET_TX_BUFF_DESC_LEN_3(__pdesc, __val) \
399 SET_BITS_TO_LE_4BYTE(__pdesc+48, 0, 16, __val)
400#define SET_TX_BUFF_DESC_AMSDU_3(__pdesc, __val) \
401 SET_BITS_TO_LE_4BYTE(__pdesc+48, 31, 1, __val)
402/* Dword 13 */
403#define SET_TX_BUFF_DESC_ADDR_LOW_3(__pdesc, __val) \
404 SET_BITS_TO_LE_4BYTE(__pdesc+52, 0, 32, __val)
405/* Dword 14 */
406#define SET_TX_BUFF_DESC_ADDR_HIGH_3(__pdesc, __val) \
407 SET_BITS_TO_LE_4BYTE(__pdesc+56, 0, 32, __val)
408/* Dword 15 / RESERVED 0 */
409#else
410#define SET_TX_BUFF_DESC_ADDR_HIGH_0(__pdesc, __val)
411/* Dword 2 */
412#define SET_TX_BUFF_DESC_LEN_1(__pdesc, __val) \
413 SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 16, __val)
414#define SET_TX_BUFF_DESC_AMSDU_1(__pdesc, __val) \
415 SET_BITS_TO_LE_4BYTE(__pdesc+8, 31, 1, __val)
416/* Dword 3 */
417#define SET_TX_BUFF_DESC_ADDR_LOW_1(__pdesc, __val) \
418 SET_BITS_TO_LE_4BYTE(__pdesc+12, 0, 32, __val)
419#define SET_TX_BUFF_DESC_ADDR_HIGH_1(__pdesc, __val)
420/* Dword 4 */
421#define SET_TX_BUFF_DESC_LEN_2(__pdesc, __val) \
422 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 16, __val)
423#define SET_TX_BUFF_DESC_AMSDU_2(__pdesc, __val) \
424 SET_BITS_TO_LE_4BYTE(__pdesc+16, 31, 1, __val)
425/* Dword 5 */
426#define SET_TX_BUFF_DESC_ADDR_LOW_2(__pdesc, __val) \
427 SET_BITS_TO_LE_4BYTE(__pdesc+20, 0, 32, __val)
428#define SET_TX_BUFF_DESC_ADDR_HIGH_2(__pdesc, __val)
429/* Dword 6 */
430#define SET_TX_BUFF_DESC_LEN_3(__pdesc, __val) \
431 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 16, __val)
432#define SET_TX_BUFF_DESC_AMSDU_3(__pdesc, __val) \
433 SET_BITS_TO_LE_4BYTE(__pdesc+24, 31, 1, __val)
434/* Dword 7 */
435#define SET_TX_BUFF_DESC_ADDR_LOW_3(__pdesc, __val) \
436 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 32, __val)
437#define SET_TX_BUFF_DESC_ADDR_HIGH_3(__pdesc, __val)
438#endif
439
440/* RX buffer */
441
442/* DWORD 0 */
443#define SET_RX_BUFFER_DESC_DATA_LENGTH(__status, __val) \
444 SET_BITS_TO_LE_4BYTE(__status, 0, 14, __val)
445#define SET_RX_BUFFER_DESC_LS(__status, __val) \
446 SET_BITS_TO_LE_4BYTE(__status, 15, 1, __val)
447#define SET_RX_BUFFER_DESC_FS(__status, __val) \
448 SET_BITS_TO_LE_4BYTE(__status, 16, 1, __val)
449#define SET_RX_BUFFER_DESC_TOTAL_LENGTH(__status, __val) \
450 SET_BITS_TO_LE_4BYTE(__status, 16, 15, __val)
451
452#define GET_RX_BUFFER_DESC_OWN(__status) \
453 LE_BITS_TO_4BYTE(__status, 31, 1)
454#define GET_RX_BUFFER_DESC_LS(__status) \
455 LE_BITS_TO_4BYTE(__status, 15, 1)
456#define GET_RX_BUFFER_DESC_FS(__status) \
457 LE_BITS_TO_4BYTE(__status, 16, 1)
458#define GET_RX_BUFFER_DESC_TOTAL_LENGTH(__status) \
459 LE_BITS_TO_4BYTE(__status, 16, 15)
460
461/* DWORD 1 */
462#define SET_RX_BUFFER_PHYSICAL_LOW(__status, __val) \
463 SET_BITS_TO_LE_4BYTE(__status+4, 0, 32, __val)
464
465/* DWORD 2 */
466#define SET_RX_BUFFER_PHYSICAL_HIGH(__status, __val) \
467 SET_BITS_TO_LE_4BYTE(__status+8, 0, 32, __val)
468
469#define GET_RX_DESC_PKT_LEN(__pdesc) \
470 LE_BITS_TO_4BYTE(__pdesc, 0, 14)
471#define GET_RX_DESC_CRC32(__pdesc) \
472 LE_BITS_TO_4BYTE(__pdesc, 14, 1)
473#define GET_RX_DESC_ICV(__pdesc) \
474 LE_BITS_TO_4BYTE(__pdesc, 15, 1)
475#define GET_RX_DESC_DRV_INFO_SIZE(__pdesc) \
476 LE_BITS_TO_4BYTE(__pdesc, 16, 4)
477#define GET_RX_DESC_SECURITY(__pdesc) \
478 LE_BITS_TO_4BYTE(__pdesc, 20, 3)
479#define GET_RX_DESC_QOS(__pdesc) \
480 LE_BITS_TO_4BYTE(__pdesc, 23, 1)
481#define GET_RX_DESC_SHIFT(__pdesc) \
482 LE_BITS_TO_4BYTE(__pdesc, 24, 2)
483#define GET_RX_DESC_PHYST(__pdesc) \
484 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
485#define GET_RX_DESC_SWDEC(__pdesc) \
486 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
487#define GET_RX_DESC_LS(__pdesc) \
488 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
489#define GET_RX_DESC_FS(__pdesc) \
490 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
491#define GET_RX_DESC_EOR(__pdesc) \
492 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
493#define GET_RX_DESC_OWN(__pdesc) \
494 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
495
496#define SET_RX_DESC_PKT_LEN(__pdesc, __val) \
497 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 14, __val)
498#define SET_RX_DESC_EOR(__pdesc, __val) \
499 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
500#define SET_RX_DESC_OWN(__pdesc, __val) \
501 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
502
503#define GET_RX_DESC_MACID(__pdesc) \
504 LE_BITS_TO_4BYTE(__pdesc+4, 0, 7)
505#define GET_RX_DESC_TID(__pdesc) \
506 LE_BITS_TO_4BYTE(__pdesc+4, 8, 4)
507#define GET_RX_DESC_MACID_VLD(__pdesc) \
508 LE_BITS_TO_4BYTE(__pdesc+4, 12, 1)
509#define GET_RX_DESC_AMSDU(__pdesc) \
510 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1)
511#define GET_RX_DESC_RXID_MATCH(__pdesc) \
512 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1)
513#define GET_RX_DESC_PAGGR(__pdesc) \
514 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1)
515#define GET_RX_DESC_A1_FIT(__pdesc) \
516 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4)
517#define GET_RX_DESC_TCPOFFLOAD_CHKERR(__pdesc) \
518 LE_BITS_TO_4BYTE(__pdesc+4, 20, 1)
519#define GET_RX_DESC_TCPOFFLOAD_IPVER(__pdesc) \
520 LE_BITS_TO_4BYTE(__pdesc+4, 21, 1)
521#define GET_RX_DESC_TCPOFFLOAD_IS_TCPUDP(__pdesc) \
522 LE_BITS_TO_4BYTE(__pdesc+4, 22, 1)
523#define GET_RX_DESC_TCPOFFLOAD_CHK_VLD(__pdesc) \
524 LE_BITS_TO_4BYTE(__pdesc+4, 23, 1)
525#define GET_RX_DESC_PAM(__pdesc) \
526 LE_BITS_TO_4BYTE(__pdesc+4, 24, 1)
527#define GET_RX_DESC_PWR(__pdesc) \
528 LE_BITS_TO_4BYTE(__pdesc+4, 25, 1)
529#define GET_RX_DESC_MD(__pdesc) \
530 LE_BITS_TO_4BYTE(__pdesc+4, 26, 1)
531#define GET_RX_DESC_MF(__pdesc) \
532 LE_BITS_TO_4BYTE(__pdesc+4, 27, 1)
533#define GET_RX_DESC_TYPE(__pdesc) \
534 LE_BITS_TO_4BYTE(__pdesc+4, 28, 2)
535#define GET_RX_DESC_MC(__pdesc) \
536 LE_BITS_TO_4BYTE(__pdesc+4, 30, 1)
537#define GET_RX_DESC_BC(__pdesc) \
538 LE_BITS_TO_4BYTE(__pdesc+4, 31, 1)
539#define GET_RX_DESC_SEQ(__pdesc) \
540 LE_BITS_TO_4BYTE(__pdesc+8, 0, 12)
541#define GET_RX_DESC_FRAG(__pdesc) \
542 LE_BITS_TO_4BYTE(__pdesc+8, 12, 4)
543#define GET_RX_DESC_RX_IS_QOS(__pdesc) \
544 LE_BITS_TO_4BYTE(__pdesc+8, 16, 1)
545
546#define GET_RX_DESC_RXMCS(__pdesc) \
547 LE_BITS_TO_4BYTE(__pdesc+12, 0, 7)
548#define GET_RX_DESC_HTC(__pdesc) \
549 LE_BITS_TO_4BYTE(__pdesc+12, 10, 1)
550#define GET_RX_STATUS_DESC_EOSP(__pdesc) \
551 LE_BITS_TO_4BYTE(__pdesc+12, 11, 1)
552#define GET_RX_STATUS_DESC_BSSID_FIT(__pdesc) \
553 LE_BITS_TO_4BYTE(__pdesc+12, 12, 2)
554#define GET_RX_STATUS_DESC_DMA_AGG_NUM(__pdesc) \
555 LE_BITS_TO_4BYTE(__pdesc+12, 16, 8)
556#define GET_RX_STATUS_DESC_PATTERN_MATCH(__pdesc) \
557 LE_BITS_TO_4BYTE(__pdesc+12, 29, 1)
558#define GET_RX_STATUS_DESC_UNICAST_MATCH(__pdesc) \
559 LE_BITS_TO_4BYTE(__pdesc+12, 30, 1)
560#define GET_RX_STATUS_DESC_MAGIC_MATCH(__pdesc) \
561 LE_BITS_TO_4BYTE(__pdesc+12, 31, 1)
562
563#define GET_RX_DESC_TSFL(__pdesc) \
564 LE_BITS_TO_4BYTE(__pdesc+20, 0, 32)
565
566#define GET_RX_DESC_BUFF_ADDR(__pdesc) \
567 LE_BITS_TO_4BYTE(__pdesc+24, 0, 32)
568#define GET_RX_DESC_BUFF_ADDR64(__pdesc) \
569 LE_BITS_TO_4BYTE(__pdesc+28, 0, 32)
570
571#define SET_RX_DESC_BUFF_ADDR(__pdesc, __val) \
572 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 32, __val)
573#define SET_RX_DESC_BUFF_ADDR64(__pdesc, __val) \
574 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 32, __val)
575
576/* TX report 2 format in Rx desc*/
577
578#define GET_RX_RPT2_DESC_PKT_LEN(__status) \
579 LE_BITS_TO_4BYTE(__status, 0, 9)
580#define GET_RX_RPT2_DESC_MACID_VALID_1(__status) \
581 LE_BITS_TO_4BYTE(__status+16, 0, 32)
582#define GET_RX_RPT2_DESC_MACID_VALID_2(__status) \
583 LE_BITS_TO_4BYTE(__status+20, 0, 32)
584
585#define CLEAR_PCI_TX_DESC_CONTENT(__pdesc, _size) \
586do { \
587 if (_size > TX_DESC_NEXT_DESC_OFFSET) \
588 memset(__pdesc, 0, TX_DESC_NEXT_DESC_OFFSET); \
589 else \
590 memset(__pdesc, 0, _size); \
591} while (0)
592
593#define RTL92EE_RX_HAL_IS_CCK_RATE(rxmcs)\
594 (rxmcs == DESC92C_RATE1M ||\
595 rxmcs == DESC92C_RATE2M ||\
596 rxmcs == DESC92C_RATE5_5M ||\
597 rxmcs == DESC92C_RATE11M)
598
599#define IS_LITTLE_ENDIAN 1
600
601struct phy_rx_agc_info_t {
602 #if IS_LITTLE_ENDIAN
603 u8 gain:7, trsw:1;
604 #else
605 u8 trsw:1, gain:7;
606 #endif
607};
608
609struct phy_status_rpt {
610 struct phy_rx_agc_info_t path_agc[2];
611 u8 ch_corr[2];
612 u8 cck_sig_qual_ofdm_pwdb_all;
613 u8 cck_agc_rpt_ofdm_cfosho_a;
614 u8 cck_rpt_b_ofdm_cfosho_b;
615 u8 rsvd_1;
616 u8 noise_power_db_msb;
617 u8 path_cfotail[2];
618 u8 pcts_mask[2];
619 u8 stream_rxevm[2];
620 u8 path_rxsnr[2];
621 u8 noise_power_db_lsb;
622 u8 rsvd_2[3];
623 u8 stream_csi[2];
624 u8 stream_target_csi[2];
625 u8 sig_evm;
626 u8 rsvd_3;
627#if IS_LITTLE_ENDIAN
628 u8 antsel_rx_keep_2:1; /*ex_intf_flg:1;*/
629 u8 sgi_en:1;
630 u8 rxsc:2;
631 u8 idle_long:1;
632 u8 r_ant_train_en:1;
633 u8 ant_sel_b:1;
634 u8 ant_sel:1;
635#else /* _BIG_ENDIAN_ */
636 u8 ant_sel:1;
637 u8 ant_sel_b:1;
638 u8 r_ant_train_en:1;
639 u8 idle_long:1;
640 u8 rxsc:2;
641 u8 sgi_en:1;
642 u8 antsel_rx_keep_2:1; /*ex_intf_flg:1;*/
643#endif
644} __packed;
645
646struct rx_fwinfo {
647 u8 gain_trsw[4];
648 u8 pwdb_all;
649 u8 cfosho[4];
650 u8 cfotail[4];
651 char rxevm[2];
652 char rxsnr[4];
653 u8 pdsnr[2];
654 u8 csi_current[2];
655 u8 csi_target[2];
656 u8 sigevm;
657 u8 max_ex_pwr;
658 u8 ex_intf_flag:1;
659 u8 sgi_en:1;
660 u8 rxsc:2;
661 u8 reserve:4;
662} __packed;
663
664struct tx_desc {
665 u32 pktsize:16;
666 u32 offset:8;
667 u32 bmc:1;
668 u32 htc:1;
669 u32 lastseg:1;
670 u32 firstseg:1;
671 u32 linip:1;
672 u32 noacm:1;
673 u32 gf:1;
674 u32 own:1;
675
676 u32 macid:6;
677 u32 rsvd0:2;
678 u32 queuesel:5;
679 u32 rd_nav_ext:1;
680 u32 lsig_txop_en:1;
681 u32 pifs:1;
682 u32 rateid:4;
683 u32 nav_usehdr:1;
684 u32 en_descid:1;
685 u32 sectype:2;
686 u32 pktoffset:8;
687
688 u32 rts_rc:6;
689 u32 data_rc:6;
690 u32 agg_en:1;
691 u32 rdg_en:1;
692 u32 bar_retryht:2;
693 u32 agg_break:1;
694 u32 morefrag:1;
695 u32 raw:1;
696 u32 ccx:1;
697 u32 ampdudensity:3;
698 u32 bt_int:1;
699 u32 ant_sela:1;
700 u32 ant_selb:1;
701 u32 txant_cck:2;
702 u32 txant_l:2;
703 u32 txant_ht:2;
704
705 u32 nextheadpage:8;
706 u32 tailpage:8;
707 u32 seq:12;
708 u32 cpu_handle:1;
709 u32 tag1:1;
710 u32 trigger_int:1;
711 u32 hwseq_en:1;
712
713 u32 rtsrate:5;
714 u32 apdcfe:1;
715 u32 qos:1;
716 u32 hwseq_ssn:1;
717 u32 userrate:1;
718 u32 dis_rtsfb:1;
719 u32 dis_datafb:1;
720 u32 cts2self:1;
721 u32 rts_en:1;
722 u32 hwrts_en:1;
723 u32 portid:1;
724 u32 pwr_status:3;
725 u32 waitdcts:1;
726 u32 cts2ap_en:1;
727 u32 txsc:2;
728 u32 stbc:2;
729 u32 txshort:1;
730 u32 txbw:1;
731 u32 rtsshort:1;
732 u32 rtsbw:1;
733 u32 rtssc:2;
734 u32 rtsstbc:2;
735
736 u32 txrate:6;
737 u32 shortgi:1;
738 u32 ccxt:1;
739 u32 txrate_fb_lmt:5;
740 u32 rtsrate_fb_lmt:4;
741 u32 retrylmt_en:1;
742 u32 txretrylmt:6;
743 u32 usb_txaggnum:8;
744
745 u32 txagca:5;
746 u32 txagcb:5;
747 u32 usemaxlen:1;
748 u32 maxaggnum:5;
749 u32 mcsg1maxlen:4;
750 u32 mcsg2maxlen:4;
751 u32 mcsg3maxlen:4;
752 u32 mcs7sgimaxlen:4;
753
754 u32 txbuffersize:16;
755 u32 sw_offset30:8;
756 u32 sw_offset31:4;
757 u32 rsvd1:1;
758 u32 antsel_c:1;
759 u32 null_0:1;
760 u32 null_1:1;
761
762 u32 txbuffaddr;
763 u32 txbufferaddr64;
764 u32 nextdescaddress;
765 u32 nextdescaddress64;
766
767 u32 reserve_pass_pcie_mm_limit[4];
768} __packed;
769
770struct rx_desc {
771 u32 length:14;
772 u32 crc32:1;
773 u32 icverror:1;
774 u32 drv_infosize:4;
775 u32 security:3;
776 u32 qos:1;
777 u32 shift:2;
778 u32 phystatus:1;
779 u32 swdec:1;
780 u32 lastseg:1;
781 u32 firstseg:1;
782 u32 eor:1;
783 u32 own:1;
784
785 u32 macid:6;
786 u32 tid:4;
787 u32 hwrsvd:5;
788 u32 paggr:1;
789 u32 faggr:1;
790 u32 a1_fit:4;
791 u32 a2_fit:4;
792 u32 pam:1;
793 u32 pwr:1;
794 u32 moredata:1;
795 u32 morefrag:1;
796 u32 type:2;
797 u32 mc:1;
798 u32 bc:1;
799
800 u32 seq:12;
801 u32 frag:4;
802 u32 nextpktlen:14;
803 u32 nextind:1;
804 u32 rsvd:1;
805
806 u32 rxmcs:6;
807 u32 rxht:1;
808 u32 amsdu:1;
809 u32 splcp:1;
810 u32 bandwidth:1;
811 u32 htc:1;
812 u32 tcpchk_rpt:1;
813 u32 ipcchk_rpt:1;
814 u32 tcpchk_valid:1;
815 u32 hwpcerr:1;
816 u32 hwpcind:1;
817 u32 iv0:16;
818
819 u32 iv1;
820
821 u32 tsfl;
822
823 u32 bufferaddress;
824 u32 bufferaddress64;
825
826} __packed;
827
828void rtl92ee_rx_check_dma_ok(struct ieee80211_hw *hw, u8 *header_desc,
829 u8 queue_index);
830u16 rtl92ee_rx_desc_buff_remained_cnt(struct ieee80211_hw *hw,
831 u8 queue_index);
832void rtl92ee_get_available_desc(struct ieee80211_hw *hw, u8 queue_index);
833void rtl92ee_pre_fill_tx_bd_desc(struct ieee80211_hw *hw,
834 u8 *tx_bd_desc, u8 *desc, u8 queue_index,
835 struct sk_buff *skb, dma_addr_t addr);
836
837void rtl92ee_tx_fill_desc(struct ieee80211_hw *hw,
838 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
839 u8 *pbd_desc_tx,
840 struct ieee80211_tx_info *info,
841 struct ieee80211_sta *sta,
842 struct sk_buff *skb,
843 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc);
844bool rtl92ee_rx_query_desc(struct ieee80211_hw *hw,
845 struct rtl_stats *status,
846 struct ieee80211_rx_status *rx_status,
847 u8 *pdesc, struct sk_buff *skb);
848void rtl92ee_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
849 u8 desc_name, u8 *val);
850
851u32 rtl92ee_get_desc(u8 *pdesc, bool istx, u8 desc_name);
852bool rtl92ee_is_tx_desc_closed(struct ieee80211_hw *hw, u8 hw_queue, u16 index);
853void rtl92ee_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
854void rtl92ee_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
855 bool firstseg, bool lastseg,
856 struct sk_buff *skb);
857u32 rtl92ee_rx_command_packet(struct ieee80211_hw *hw,
858 struct rtl_stats status,
859 struct sk_buff *skb);
860#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/fw.h b/drivers/net/wireless/rtlwifi/rtl8192se/fw.h
index d53f4332464d..b1e44b86e8ed 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/fw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/fw.h
@@ -336,7 +336,6 @@ enum fw_h2c_cmd {
336 H2C_TMP3, 336 H2C_TMP3,
337 H2C_WOWLAN_UPDATE_IV_CMD, /*50*/ 337 H2C_WOWLAN_UPDATE_IV_CMD, /*50*/
338 H2C_TMP4, 338 H2C_TMP4,
339 MAX_H2CCMD /*52*/
340}; 339};
341 340
342/* The following macros are used for FW 341/* The following macros are used for FW
diff --git a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
index 2b3c78baa9f8..b358ebce8942 100644
--- a/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8192se/trx.c
@@ -312,10 +312,6 @@ bool rtl92se_rx_query_desc(struct ieee80211_hw *hw, struct rtl_stats *stats,
312 hdr = (struct ieee80211_hdr *)(skb->data + 312 hdr = (struct ieee80211_hdr *)(skb->data +
313 stats->rx_drvinfo_size + stats->rx_bufshift); 313 stats->rx_drvinfo_size + stats->rx_bufshift);
314 314
315 if (!hdr) {
316 /* during testing, hdr was NULL here */
317 return false;
318 }
319 if ((_ieee80211_is_robust_mgmt_frame(hdr)) && 315 if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
320 (ieee80211_has_protected(hdr->frame_control))) 316 (ieee80211_has_protected(hdr->frame_control)))
321 rx_status->flag &= ~RX_FLAG_DECRYPTED; 317 rx_status->flag &= ~RX_FLAG_DECRYPTED;
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/btc.h b/drivers/net/wireless/rtlwifi/rtl8723ae/btc.h
index 417afeed36af..06c448c010fd 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/btc.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/btc.h
@@ -11,10 +11,6 @@
11 ** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 ** FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 ** more details. 12 ** more details.
13 ** 13 **
14 ** You should have received a copy of the GNU General Public License along with
15 ** this program; if not, write to the Free Software Foundation, Inc.,
16 ** 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 **
18 ** The full GNU General Public License is included in this distribution in the 14 ** The full GNU General Public License is included in this distribution in the
19 ** file called LICENSE. 15 ** file called LICENSE.
20 ** 16 **
@@ -24,8 +20,7 @@
24 ** Hsinchu 300, Taiwan. 20 ** Hsinchu 300, Taiwan.
25 ** Larry Finger <Larry.Finger@lwfinger.net> 21 ** Larry Finger <Larry.Finger@lwfinger.net>
26 ** 22 **
27 ***************************************************************************** 23 ******************************************************************************/
28 */
29 24
30#ifndef __RTL8723E_BTC_H__ 25#ifndef __RTL8723E_BTC_H__
31#define __RTL8723E_BTC_H__ 26#define __RTL8723E_BTC_H__
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/def.h b/drivers/net/wireless/rtlwifi/rtl8723ae/def.h
index debe261a7eeb..94bdd4bbca5d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/def.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -25,55 +21,145 @@
25 * 21 *
26 * Larry Finger <Larry.Finger@lwfinger.net> 22 * Larry Finger <Larry.Finger@lwfinger.net>
27 * 23 *
28 **************************************************************************** 24 *****************************************************************************/
29 */
30 25
31#ifndef __RTL8723E_DEF_H__ 26#ifndef __RTL8723E_DEF_H__
32#define __RTL8723E_DEF_H__ 27#define __RTL8723E_DEF_H__
33 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
34#define HAL_PRIME_CHNL_OFFSET_LOWER 1 67#define HAL_PRIME_CHNL_OFFSET_LOWER 1
68#define HAL_PRIME_CHNL_OFFSET_UPPER 2
35 69
36#define RX_MPDU_QUEUE 0 70#define MAX_H2C_QUEUE_NUM 10
37 71
38#define CHIP_8723 BIT(0) 72#define RX_MPDU_QUEUE 0
39#define NORMAL_CHIP BIT(3) 73#define RX_CMD_QUEUE 1
40#define RF_TYPE_1T2R BIT(4) 74#define RX_MAX_QUEUE 2
41#define RF_TYPE_2T2R BIT(5) 75#define AC2QUEUEID(_AC) (_AC)
42#define CHIP_VENDOR_UMC BIT(7)
43#define B_CUT_VERSION BIT(12)
44#define C_CUT_VERSION BIT(13)
45#define D_CUT_VERSION ((BIT(12)|BIT(13)))
46#define E_CUT_VERSION BIT(14)
47#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28))
48 76
77#define C2H_RX_CMD_HDR_LEN 8
78#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
79 LE_BITS_TO_4BYTE((__prxhdr), 0, 16)
80#define GET_C2H_CMD_ELEMENT_ID(__prxhdr) \
81 LE_BITS_TO_4BYTE((__prxhdr), 16, 8)
82#define GET_C2H_CMD_CMD_SEQ(__prxhdr) \
83 LE_BITS_TO_4BYTE((__prxhdr), 24, 7)
84#define GET_C2H_CMD_CONTINUE(__prxhdr) \
85 LE_BITS_TO_4BYTE((__prxhdr), 31, 1)
86#define GET_C2H_CMD_CONTENT(__prxhdr) \
87 ((u8 *)(__prxhdr) + C2H_RX_CMD_HDR_LEN)
88
89#define GET_C2H_CMD_FEEDBACK_ELEMENT_ID(__pcmdfbhdr) \
90 LE_BITS_TO_4BYTE((__pcmdfbhdr), 0, 8)
91#define GET_C2H_CMD_FEEDBACK_CCX_LEN(__pcmdfbhdr) \
92 LE_BITS_TO_4BYTE((__pcmdfbhdr), 8, 8)
93#define GET_C2H_CMD_FEEDBACK_CCX_CMD_CNT(__pcmdfbhdr) \
94 LE_BITS_TO_4BYTE((__pcmdfbhdr), 16, 16)
95#define GET_C2H_CMD_FEEDBACK_CCX_MAC_ID(__pcmdfbhdr) \
96 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 0, 5)
97#define GET_C2H_CMD_FEEDBACK_CCX_VALID(__pcmdfbhdr) \
98 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 7, 1)
99#define GET_C2H_CMD_FEEDBACK_CCX_RETRY_CNT(__pcmdfbhdr) \
100 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 8, 5)
101#define GET_C2H_CMD_FEEDBACK_CCX_TOK(__pcmdfbhdr) \
102 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 15, 1)
103#define GET_C2H_CMD_FEEDBACK_CCX_QSEL(__pcmdfbhdr) \
104 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
105#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
106 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
107
108#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
109#define CHIP_BONDING_92C_1T2R 0x1
110
111#define CHIP_8723 BIT(0)
112#define NORMAL_CHIP BIT(3)
113#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6)))
114#define RF_TYPE_1T2R BIT(4)
115#define RF_TYPE_2T2R BIT(5)
116#define CHIP_VENDOR_UMC BIT(7)
117#define B_CUT_VERSION BIT(12)
118#define C_CUT_VERSION BIT(13)
119#define D_CUT_VERSION ((BIT(12)|BIT(13)))
120#define E_CUT_VERSION BIT(14)
121#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28))
49 122
50/* MASK */ 123/* MASK */
51#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2)) 124#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2))
52#define CHIP_TYPE_MASK BIT(3) 125#define CHIP_TYPE_MASK BIT(3)
53#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6)) 126#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6))
54#define MANUFACTUER_MASK BIT(7) 127#define MANUFACTUER_MASK BIT(7)
55#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8)) 128#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8))
56#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12)) 129#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12))
57 130
58/* Get element */ 131/* Get element */
59#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK) 132#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
133#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
134#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
60#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK) 135#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
136#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
61#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK) 137#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
62 138
63#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0) ?\ 139#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0) ?\
64 true : false) 140 true : false)
65#define IS_8723_SERIES(version) \ 141#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723) ? \
66 ((GET_CVID_IC_TYPE(version) == CHIP_8723) ? true : false) 142 true : false)
67#define IS_CHIP_VENDOR_UMC(version) \ 143#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version)) ? false : true)
68 ((GET_CVID_MANUFACTUER(version)) ? true : false) 144#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)\
69 145 ? true : false)
70#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) ? \ 146#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)\
71 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false) 147 ? true : false)
72#define IS_VENDOR_8723_A_CUT(version) ((IS_8723_SERIES(version)) ? \ 148#define IS_CHIP_VENDOR_UMC(version) ((GET_CVID_MANUFACTUER(version)) ? \
73 ((GET_CVID_CUT_VERSION(version)) ? false : true) : false) 149 true : false)
74#define IS_81xxC_VENDOR_UMC_B_CUT(version) ((IS_CHIP_VENDOR_UMC(version)) \ 150
75 ? ((GET_CVID_CUT_VERSION(version) == B_CUT_VERSION) ? \ 151#define IS_VENDOR_UMC_A_CUT(version) ((IS_CHIP_VENDOR_UMC(version))\
76 true : false) : false) 152 ? ((GET_CVID_CUT_VERSION(version)) ? \
153 false : true) : false)
154#define IS_VENDOR_8723_A_CUT(version) ((IS_8723_SERIES(version))\
155 ? ((GET_CVID_CUT_VERSION(version)) ? \
156 false : true) : false)
157#define IS_VENDOR_8723A_B_CUT(version) ((IS_8723_SERIES(version))\
158 ? ((GET_CVID_CUT_VERSION(version) == \
159 B_CUT_VERSION) ? true : false) : false)
160#define IS_81xxC_VENDOR_UMC_B_CUT(version) ((IS_CHIP_VENDOR_UMC(version))\
161 ? ((GET_CVID_CUT_VERSION(version) == \
162 B_CUT_VERSION) ? true : false) : false)
77 163
78enum rf_optype { 164enum rf_optype {
79 RF_OP_BY_SW_3WIRE = 0, 165 RF_OP_BY_SW_3WIRE = 0,
@@ -93,7 +179,7 @@ enum power_save_mode {
93 POWER_SAVE_MODE_SAVE, 179 POWER_SAVE_MODE_SAVE,
94}; 180};
95 181
96enum power_polocy_config { 182enum power_policy_config {
97 POWERCFG_MAX_POWER_SAVINGS, 183 POWERCFG_MAX_POWER_SAVINGS,
98 POWERCFG_GLOBAL_POWER_SAVINGS, 184 POWERCFG_GLOBAL_POWER_SAVINGS,
99 POWERCFG_LOCAL_POWER_SAVINGS, 185 POWERCFG_LOCAL_POWER_SAVINGS,
@@ -143,6 +229,41 @@ enum rtl_desc_qsel {
143 QSLT_CMD = 0x13, 229 QSLT_CMD = 0x13,
144}; 230};
145 231
232enum rtl_desc8723e_rate {
233 DESC92C_RATE1M = 0x00,
234 DESC92C_RATE2M = 0x01,
235 DESC92C_RATE5_5M = 0x02,
236 DESC92C_RATE11M = 0x03,
237
238 DESC92C_RATE6M = 0x04,
239 DESC92C_RATE9M = 0x05,
240 DESC92C_RATE12M = 0x06,
241 DESC92C_RATE18M = 0x07,
242 DESC92C_RATE24M = 0x08,
243 DESC92C_RATE36M = 0x09,
244 DESC92C_RATE48M = 0x0a,
245 DESC92C_RATE54M = 0x0b,
246
247 DESC92C_RATEMCS0 = 0x0c,
248 DESC92C_RATEMCS1 = 0x0d,
249 DESC92C_RATEMCS2 = 0x0e,
250 DESC92C_RATEMCS3 = 0x0f,
251 DESC92C_RATEMCS4 = 0x10,
252 DESC92C_RATEMCS5 = 0x11,
253 DESC92C_RATEMCS6 = 0x12,
254 DESC92C_RATEMCS7 = 0x13,
255 DESC92C_RATEMCS8 = 0x14,
256 DESC92C_RATEMCS9 = 0x15,
257 DESC92C_RATEMCS10 = 0x16,
258 DESC92C_RATEMCS11 = 0x17,
259 DESC92C_RATEMCS12 = 0x18,
260 DESC92C_RATEMCS13 = 0x19,
261 DESC92C_RATEMCS14 = 0x1a,
262 DESC92C_RATEMCS15 = 0x1b,
263 DESC92C_RATEMCS15_SG = 0x1c,
264 DESC92C_RATEMCS32 = 0x20,
265};
266
146struct phy_sts_cck_8723e_t { 267struct phy_sts_cck_8723e_t {
147 u8 adc_pwdb_X[4]; 268 u8 adc_pwdb_X[4];
148 u8 sq_rpt; 269 u8 sq_rpt;
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
index 25cc83058b01..a0e86922780a 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -25,8 +21,7 @@
25 * 21 *
26 * Larry Finger <Larry.Finger@lwfinger.net> 22 * Larry Finger <Larry.Finger@lwfinger.net>
27 * 23 *
28 **************************************************************************** 24 *****************************************************************************/
29 */
30 25
31#include "../wifi.h" 26#include "../wifi.h"
32#include "../base.h" 27#include "../base.h"
@@ -151,7 +146,7 @@ static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
151 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00} 146 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
152}; 147};
153 148
154static void rtl8723ae_dm_diginit(struct ieee80211_hw *hw) 149static void rtl8723e_dm_diginit(struct ieee80211_hw *hw)
155{ 150{
156 struct rtl_priv *rtlpriv = rtl_priv(hw); 151 struct rtl_priv *rtlpriv = rtl_priv(hw);
157 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 152 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
@@ -176,7 +171,7 @@ static void rtl8723ae_dm_diginit(struct ieee80211_hw *hw)
176 dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX; 171 dm_digtable->cur_cck_pd_state = CCK_PD_STAGE_MAX;
177} 172}
178 173
179static u8 rtl_init_gain_min_pwdb(struct ieee80211_hw *hw) 174static u8 rtl8723e_dm_initial_gain_min_pwdb(struct ieee80211_hw *hw)
180{ 175{
181 struct rtl_priv *rtlpriv = rtl_priv(hw); 176 struct rtl_priv *rtlpriv = rtl_priv(hw);
182 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 177 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
@@ -195,14 +190,15 @@ static u8 rtl_init_gain_min_pwdb(struct ieee80211_hw *hw)
195 } else if (dm_digtable->cursta_cstate == DIG_STA_CONNECT || 190 } else if (dm_digtable->cursta_cstate == DIG_STA_CONNECT ||
196 dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT) { 191 dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT) {
197 rssi_val_min = rtlpriv->dm.undec_sm_pwdb; 192 rssi_val_min = rtlpriv->dm.undec_sm_pwdb;
198 } else if (dm_digtable->curmultista_cstate == DIG_MULTISTA_CONNECT) { 193 } else if (dm_digtable->curmultista_cstate ==
194 DIG_MULTISTA_CONNECT) {
199 rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb; 195 rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb;
200 } 196 }
201 197
202 return (u8) rssi_val_min; 198 return (u8) rssi_val_min;
203} 199}
204 200
205static void rtl8723ae_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw) 201static void rtl8723e_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
206{ 202{
207 u32 ret_value; 203 u32 ret_value;
208 struct rtl_priv *rtlpriv = rtl_priv(hw); 204 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -239,8 +235,7 @@ static void rtl8723ae_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
239 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 0x0000c000, 2); 235 rtl_set_bbreg(hw, RCCK0_FALSEALARMREPORT, 0x0000c000, 2);
240 236
241 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 237 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
242 "cnt_parity_fail = %d, cnt_rate_illegal = %d, " 238 "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
243 "cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
244 falsealm_cnt->cnt_parity_fail, 239 falsealm_cnt->cnt_parity_fail,
245 falsealm_cnt->cnt_rate_illegal, 240 falsealm_cnt->cnt_rate_illegal,
246 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail); 241 falsealm_cnt->cnt_crc8_fail, falsealm_cnt->cnt_mcs_fail);
@@ -263,52 +258,60 @@ static void rtl92c_dm_ctrl_initgain_by_fa(struct ieee80211_hw *hw)
263 value_igi += 0; 258 value_igi += 0;
264 else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH2) 259 else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH2)
265 value_igi++; 260 value_igi++;
266 else 261 else if (rtlpriv->falsealm_cnt.cnt_all >= DM_DIG_FA_TH2)
267 value_igi += 2; 262 value_igi += 2;
268 263 if (value_igi > DM_DIG_FA_UPPER)
269 value_igi = clamp(value_igi, (u8)DM_DIG_FA_LOWER, (u8)DM_DIG_FA_UPPER); 264 value_igi = DM_DIG_FA_UPPER;
265 else if (value_igi < DM_DIG_FA_LOWER)
266 value_igi = DM_DIG_FA_LOWER;
270 if (rtlpriv->falsealm_cnt.cnt_all > 10000) 267 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
271 value_igi = 0x32; 268 value_igi = 0x32;
272 269
273 dm_digtable->cur_igvalue = value_igi; 270 dm_digtable->cur_igvalue = value_igi;
274 rtl8723ae_dm_write_dig(hw); 271 rtl8723e_dm_write_dig(hw);
275} 272}
276 273
277static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw) 274static void rtl92c_dm_ctrl_initgain_by_rssi(struct ieee80211_hw *hw)
278{ 275{
279 struct rtl_priv *rtlpriv = rtl_priv(hw); 276 struct rtl_priv *rtlpriv = rtl_priv(hw);
280 struct dig_t *dgtbl = &rtlpriv->dm_digtable; 277 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
281 278
282 if (rtlpriv->falsealm_cnt.cnt_all > dgtbl->fa_highthresh) { 279 if (rtlpriv->falsealm_cnt.cnt_all > dm_digtable->fa_highthresh) {
283 if ((dgtbl->back_val - 2) < dgtbl->back_range_min) 280 if ((dm_digtable->back_val - 2) <
284 dgtbl->back_val = dgtbl->back_range_min; 281 dm_digtable->back_range_min)
282 dm_digtable->back_val =
283 dm_digtable->back_range_min;
285 else 284 else
286 dgtbl->back_val -= 2; 285 dm_digtable->back_val -= 2;
287 } else if (rtlpriv->falsealm_cnt.cnt_all < dgtbl->fa_lowthresh) { 286 } else if (rtlpriv->falsealm_cnt.cnt_all < dm_digtable->fa_lowthresh) {
288 if ((dgtbl->back_val + 2) > dgtbl->back_range_max) 287 if ((dm_digtable->back_val + 2) >
289 dgtbl->back_val = dgtbl->back_range_max; 288 dm_digtable->back_range_max)
289 dm_digtable->back_val =
290 dm_digtable->back_range_max;
290 else 291 else
291 dgtbl->back_val += 2; 292 dm_digtable->back_val += 2;
292 } 293 }
293 294
294 if ((dgtbl->rssi_val_min + 10 - dgtbl->back_val) > 295 if ((dm_digtable->rssi_val_min + 10 - dm_digtable->back_val) >
295 dgtbl->rx_gain_max) 296 dm_digtable->rx_gain_max)
296 dgtbl->cur_igvalue = dgtbl->rx_gain_max; 297 dm_digtable->cur_igvalue = dm_digtable->rx_gain_max;
297 else if ((dgtbl->rssi_val_min + 10 - 298 else if ((dm_digtable->rssi_val_min + 10 -
298 dgtbl->back_val) < dgtbl->rx_gain_min) 299 dm_digtable->back_val) < dm_digtable->rx_gain_min)
299 dgtbl->cur_igvalue = dgtbl->rx_gain_min; 300 dm_digtable->cur_igvalue = dm_digtable->rx_gain_min;
300 else 301 else
301 dgtbl->cur_igvalue = dgtbl->rssi_val_min + 10 - dgtbl->back_val; 302 dm_digtable->cur_igvalue = dm_digtable->rssi_val_min + 10 -
303 dm_digtable->back_val;
302 304
303 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 305 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
304 "rssi_val_min = %x back_val %x\n", 306 "rssi_val_min = %x back_val %x\n",
305 dgtbl->rssi_val_min, dgtbl->back_val); 307 dm_digtable->rssi_val_min, dm_digtable->back_val);
306 308
307 rtl8723ae_dm_write_dig(hw); 309 rtl8723e_dm_write_dig(hw);
308} 310}
309 311
310static void rtl8723ae_dm_initial_gain_multi_sta(struct ieee80211_hw *hw) 312static void rtl8723e_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
311{ 313{
314 static u8 binitialized;
312 struct rtl_priv *rtlpriv = rtl_priv(hw); 315 struct rtl_priv *rtlpriv = rtl_priv(hw);
313 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 316 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
314 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 317 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
@@ -318,16 +321,15 @@ static void rtl8723ae_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
318 if (mac->opmode == NL80211_IFTYPE_ADHOC) 321 if (mac->opmode == NL80211_IFTYPE_ADHOC)
319 multi_sta = true; 322 multi_sta = true;
320 323
321 if ((!multi_sta) || 324 if (!multi_sta || (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT)) {
322 (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT)) { 325 binitialized = false;
323 rtlpriv->initialized = false;
324 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX; 326 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_MAX;
325 return; 327 return;
326 } else if (!rtlpriv->initialized) { 328 } else if (!binitialized) {
327 rtlpriv->initialized = true; 329 binitialized = true;
328 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0; 330 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0;
329 dm_digtable->cur_igvalue = 0x20; 331 dm_digtable->cur_igvalue = 0x20;
330 rtl8723ae_dm_write_dig(hw); 332 rtl8723e_dm_write_dig(hw);
331 } 333 }
332 334
333 if (dm_digtable->curmultista_cstate == DIG_MULTISTA_CONNECT) { 335 if (dm_digtable->curmultista_cstate == DIG_MULTISTA_CONNECT) {
@@ -337,7 +339,7 @@ static void rtl8723ae_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
337 if (dm_digtable->dig_ext_port_stage == 339 if (dm_digtable->dig_ext_port_stage ==
338 DIG_EXT_PORT_STAGE_2) { 340 DIG_EXT_PORT_STAGE_2) {
339 dm_digtable->cur_igvalue = 0x20; 341 dm_digtable->cur_igvalue = 0x20;
340 rtl8723ae_dm_write_dig(hw); 342 rtl8723e_dm_write_dig(hw);
341 } 343 }
342 344
343 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_1; 345 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_1;
@@ -348,7 +350,7 @@ static void rtl8723ae_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
348 } else if (dm_digtable->dig_ext_port_stage != DIG_EXT_PORT_STAGE_0) { 350 } else if (dm_digtable->dig_ext_port_stage != DIG_EXT_PORT_STAGE_0) {
349 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0; 351 dm_digtable->dig_ext_port_stage = DIG_EXT_PORT_STAGE_0;
350 dm_digtable->cur_igvalue = 0x20; 352 dm_digtable->cur_igvalue = 0x20;
351 rtl8723ae_dm_write_dig(hw); 353 rtl8723e_dm_write_dig(hw);
352 } 354 }
353 355
354 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 356 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
@@ -357,22 +359,22 @@ static void rtl8723ae_dm_initial_gain_multi_sta(struct ieee80211_hw *hw)
357 dm_digtable->dig_ext_port_stage); 359 dm_digtable->dig_ext_port_stage);
358} 360}
359 361
360static void rtl8723ae_dm_initial_gain_sta(struct ieee80211_hw *hw) 362static void rtl8723e_dm_initial_gain_sta(struct ieee80211_hw *hw)
361{ 363{
362 struct rtl_priv *rtlpriv = rtl_priv(hw); 364 struct rtl_priv *rtlpriv = rtl_priv(hw);
363 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 365 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
364 366
365 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 367 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
366 "presta_cstate = %x, cursta_cstate = %x\n", 368 "presta_cstate = %x, cursta_cstate = %x\n",
367 dm_digtable->presta_cstate, 369 dm_digtable->presta_cstate,
368 dm_digtable->cursta_cstate); 370 dm_digtable->cursta_cstate);
369 371
370 if (dm_digtable->presta_cstate == dm_digtable->cursta_cstate || 372 if (dm_digtable->presta_cstate == dm_digtable->cursta_cstate ||
371 dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT || 373 dm_digtable->cursta_cstate == DIG_STA_BEFORE_CONNECT ||
372 dm_digtable->cursta_cstate == DIG_STA_CONNECT) { 374 dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
373
374 if (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) { 375 if (dm_digtable->cursta_cstate != DIG_STA_DISCONNECT) {
375 dm_digtable->rssi_val_min = rtl_init_gain_min_pwdb(hw); 376 dm_digtable->rssi_val_min =
377 rtl8723e_dm_initial_gain_min_pwdb(hw);
376 rtl92c_dm_ctrl_initgain_by_rssi(hw); 378 rtl92c_dm_ctrl_initgain_by_rssi(hw);
377 } 379 }
378 } else { 380 } else {
@@ -381,16 +383,17 @@ static void rtl8723ae_dm_initial_gain_sta(struct ieee80211_hw *hw)
381 dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT; 383 dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
382 dm_digtable->cur_igvalue = 0x20; 384 dm_digtable->cur_igvalue = 0x20;
383 dm_digtable->pre_igvalue = 0; 385 dm_digtable->pre_igvalue = 0;
384 rtl8723ae_dm_write_dig(hw); 386 rtl8723e_dm_write_dig(hw);
385 } 387 }
386} 388}
387static void rtl8723ae_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) 389
390static void rtl8723e_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
388{ 391{
389 struct rtl_priv *rtlpriv = rtl_priv(hw); 392 struct rtl_priv *rtlpriv = rtl_priv(hw);
390 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 393 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
391 394
392 if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) { 395 if (dm_digtable->cursta_cstate == DIG_STA_CONNECT) {
393 dm_digtable->rssi_val_min = rtl_init_gain_min_pwdb(hw); 396 dm_digtable->rssi_val_min = rtl8723e_dm_initial_gain_min_pwdb(hw);
394 397
395 if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) { 398 if (dm_digtable->pre_cck_pd_state == CCK_PD_STAGE_LowRssi) {
396 if (dm_digtable->rssi_val_min <= 25) 399 if (dm_digtable->rssi_val_min <= 25)
@@ -418,12 +421,11 @@ static void rtl8723ae_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
418 CCK_FA_STAGE_High; 421 CCK_FA_STAGE_High;
419 else 422 else
420 dm_digtable->cur_cck_fa_state = 423 dm_digtable->cur_cck_fa_state =
421 CCK_FA_STAGE_Low; 424 CCK_FA_STAGE_LOW;
422
423 if (dm_digtable->pre_cck_fa_state != 425 if (dm_digtable->pre_cck_fa_state !=
424 dm_digtable->cur_cck_fa_state) { 426 dm_digtable->cur_cck_fa_state) {
425 if (dm_digtable->cur_cck_fa_state == 427 if (dm_digtable->cur_cck_fa_state ==
426 CCK_FA_STAGE_Low) 428 CCK_FA_STAGE_LOW)
427 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, 429 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2,
428 0x83); 430 0x83);
429 else 431 else
@@ -449,13 +451,13 @@ static void rtl8723ae_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
449 451
450} 452}
451 453
452static void rtl8723ae_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw) 454static void rtl8723e_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
453{ 455{
454 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 456 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
455 struct rtl_priv *rtlpriv = rtl_priv(hw); 457 struct rtl_priv *rtlpriv = rtl_priv(hw);
456 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 458 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
457 459
458 if (mac->act_scanning == true) 460 if (mac->act_scanning)
459 return; 461 return;
460 462
461 if (mac->link_state >= MAC80211_LINKED) 463 if (mac->link_state >= MAC80211_LINKED)
@@ -463,28 +465,29 @@ static void rtl8723ae_dm_ctrl_initgain_by_twoport(struct ieee80211_hw *hw)
463 else 465 else
464 dm_digtable->cursta_cstate = DIG_STA_DISCONNECT; 466 dm_digtable->cursta_cstate = DIG_STA_DISCONNECT;
465 467
466 rtl8723ae_dm_initial_gain_sta(hw); 468 rtl8723e_dm_initial_gain_sta(hw);
467 rtl8723ae_dm_initial_gain_multi_sta(hw); 469 rtl8723e_dm_initial_gain_multi_sta(hw);
468 rtl8723ae_dm_cck_packet_detection_thresh(hw); 470 rtl8723e_dm_cck_packet_detection_thresh(hw);
469 471
470 dm_digtable->presta_cstate = dm_digtable->cursta_cstate; 472 dm_digtable->presta_cstate = dm_digtable->cursta_cstate;
471 473
472} 474}
473 475
474static void rtl8723ae_dm_dig(struct ieee80211_hw *hw) 476static void rtl8723e_dm_dig(struct ieee80211_hw *hw)
475{ 477{
476 struct rtl_priv *rtlpriv = rtl_priv(hw); 478 struct rtl_priv *rtlpriv = rtl_priv(hw);
477 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 479 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
478 480
479 if (rtlpriv->dm.dm_initialgain_enable == false) 481 if (!rtlpriv->dm.dm_initialgain_enable)
480 return; 482 return;
481 if (dm_digtable->dig_enable_flag == false) 483 if (!dm_digtable->dig_enable_flag)
482 return; 484 return;
483 485
484 rtl8723ae_dm_ctrl_initgain_by_twoport(hw); 486 rtl8723e_dm_ctrl_initgain_by_twoport(hw);
487
485} 488}
486 489
487static void rtl8723ae_dm_dynamic_txpower(struct ieee80211_hw *hw) 490static void rtl8723e_dm_dynamic_txpower(struct ieee80211_hw *hw)
488{ 491{
489 struct rtl_priv *rtlpriv = rtl_priv(hw); 492 struct rtl_priv *rtlpriv = rtl_priv(hw);
490 struct rtl_phy *rtlphy = &(rtlpriv->phy); 493 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -502,7 +505,7 @@ static void rtl8723ae_dm_dynamic_txpower(struct ieee80211_hw *hw)
502 if ((mac->link_state < MAC80211_LINKED) && 505 if ((mac->link_state < MAC80211_LINKED) &&
503 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) { 506 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
504 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 507 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
505 "Not connected\n"); 508 "Not connected to any\n");
506 509
507 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 510 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
508 511
@@ -512,18 +515,21 @@ static void rtl8723ae_dm_dynamic_txpower(struct ieee80211_hw *hw)
512 515
513 if (mac->link_state >= MAC80211_LINKED) { 516 if (mac->link_state >= MAC80211_LINKED) {
514 if (mac->opmode == NL80211_IFTYPE_ADHOC) { 517 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
515 undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb; 518 undec_sm_pwdb =
519 rtlpriv->dm.entry_min_undec_sm_pwdb;
516 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 520 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
517 "AP Client PWDB = 0x%lx\n", 521 "AP Client PWDB = 0x%lx\n",
518 undec_sm_pwdb); 522 undec_sm_pwdb);
519 } else { 523 } else {
520 undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb; 524 undec_sm_pwdb =
525 rtlpriv->dm.undec_sm_pwdb;
521 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 526 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
522 "STA Default Port PWDB = 0x%lx\n", 527 "STA Default Port PWDB = 0x%lx\n",
523 undec_sm_pwdb); 528 undec_sm_pwdb);
524 } 529 }
525 } else { 530 } else {
526 undec_sm_pwdb = rtlpriv->dm.entry_min_undec_sm_pwdb; 531 undec_sm_pwdb =
532 rtlpriv->dm.entry_min_undec_sm_pwdb;
527 533
528 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 534 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
529 "AP Ext Port PWDB = 0x%lx\n", 535 "AP Ext Port PWDB = 0x%lx\n",
@@ -534,37 +540,39 @@ static void rtl8723ae_dm_dynamic_txpower(struct ieee80211_hw *hw)
534 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; 540 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
535 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 541 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
536 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n"); 542 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x0)\n");
537 } else if ((undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) && 543 } else if ((undec_sm_pwdb <
538 (undec_sm_pwdb >= TX_POWER_NEAR_FIELD_THRESH_LVL1)) { 544 (TX_POWER_NEAR_FIELD_THRESH_LVL2 - 3)) &&
545 (undec_sm_pwdb >=
546 TX_POWER_NEAR_FIELD_THRESH_LVL1)) {
539 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1; 547 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_LEVEL1;
540 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 548 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
541 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n"); 549 "TXHIGHPWRLEVEL_LEVEL1 (TxPwr=0x10)\n");
542 } else if (undec_sm_pwdb < (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) { 550 } else if (undec_sm_pwdb <
551 (TX_POWER_NEAR_FIELD_THRESH_LVL1 - 5)) {
543 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL; 552 rtlpriv->dm.dynamic_txhighpower_lvl = TXHIGHPWRLEVEL_NORMAL;
544 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 553 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
545 "TXHIGHPWRLEVEL_NORMAL\n"); 554 "TXHIGHPWRLEVEL_NORMAL\n");
546 } 555 }
547 556
548 if ((rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl)) { 557 if (rtlpriv->dm.dynamic_txhighpower_lvl != rtlpriv->dm.last_dtp_lvl) {
549 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 558 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
550 "PHY_SetTxPowerLevel8192S() Channel = %d\n", 559 "PHY_SetTxPowerLevel8192S() Channel = %d\n",
551 rtlphy->current_channel); 560 rtlphy->current_channel);
552 rtl8723ae_phy_set_txpower_level(hw, rtlphy->current_channel); 561 rtl8723e_phy_set_txpower_level(hw, rtlphy->current_channel);
553 } 562 }
554 563
555 rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl; 564 rtlpriv->dm.last_dtp_lvl = rtlpriv->dm.dynamic_txhighpower_lvl;
556} 565}
557 566
558void rtl8723ae_dm_write_dig(struct ieee80211_hw *hw) 567void rtl8723e_dm_write_dig(struct ieee80211_hw *hw)
559{ 568{
560 struct rtl_priv *rtlpriv = rtl_priv(hw); 569 struct rtl_priv *rtlpriv = rtl_priv(hw);
561 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 570 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
562 571
563 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, 572 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
564 "cur_igvalue = 0x%x, " 573 "cur_igvalue = 0x%x, pre_igvalue = 0x%x, back_val = %d\n",
565 "pre_igvalue = 0x%x, back_val = %d\n", 574 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue,
566 dm_digtable->cur_igvalue, dm_digtable->pre_igvalue, 575 dm_digtable->back_val);
567 dm_digtable->back_val);
568 576
569 if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) { 577 if (dm_digtable->pre_igvalue != dm_digtable->cur_igvalue) {
570 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, 578 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f,
@@ -576,32 +584,39 @@ void rtl8723ae_dm_write_dig(struct ieee80211_hw *hw)
576 } 584 }
577} 585}
578 586
579static void rtl8723ae_dm_check_edca_turbo(struct ieee80211_hw *hw) 587static void rtl8723e_dm_pwdb_monitor(struct ieee80211_hw *hw)
588{
589}
590
591static void rtl8723e_dm_check_edca_turbo(struct ieee80211_hw *hw)
580{ 592{
581 struct rtl_priv *rtlpriv = rtl_priv(hw); 593 struct rtl_priv *rtlpriv = rtl_priv(hw);
582 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
583 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 594 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
584 595
596 static u64 last_txok_cnt;
597 static u64 last_rxok_cnt;
598 static u32 last_bt_edca_ul;
599 static u32 last_bt_edca_dl;
585 u64 cur_txok_cnt = 0; 600 u64 cur_txok_cnt = 0;
586 u64 cur_rxok_cnt = 0; 601 u64 cur_rxok_cnt = 0;
587 u32 edca_be_ul = 0x5ea42b; 602 u32 edca_be_ul = 0x5ea42b;
588 u32 edca_be_dl = 0x5ea42b; 603 u32 edca_be_dl = 0x5ea42b;
589 bool bt_change_edca = false; 604 bool bt_change_edca = false;
590 605
591 if ((mac->last_bt_edca_ul != rtlpcipriv->bt_coexist.bt_edca_ul) || 606 if ((last_bt_edca_ul != rtlpriv->btcoexist.bt_edca_ul) ||
592 (mac->last_bt_edca_dl != rtlpcipriv->bt_coexist.bt_edca_dl)) { 607 (last_bt_edca_dl != rtlpriv->btcoexist.bt_edca_dl)) {
593 rtlpriv->dm.current_turbo_edca = false; 608 rtlpriv->dm.current_turbo_edca = false;
594 mac->last_bt_edca_ul = rtlpcipriv->bt_coexist.bt_edca_ul; 609 last_bt_edca_ul = rtlpriv->btcoexist.bt_edca_ul;
595 mac->last_bt_edca_dl = rtlpcipriv->bt_coexist.bt_edca_dl; 610 last_bt_edca_dl = rtlpriv->btcoexist.bt_edca_dl;
596 } 611 }
597 612
598 if (rtlpcipriv->bt_coexist.bt_edca_ul != 0) { 613 if (rtlpriv->btcoexist.bt_edca_ul != 0) {
599 edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_ul; 614 edca_be_ul = rtlpriv->btcoexist.bt_edca_ul;
600 bt_change_edca = true; 615 bt_change_edca = true;
601 } 616 }
602 617
603 if (rtlpcipriv->bt_coexist.bt_edca_dl != 0) { 618 if (rtlpriv->btcoexist.bt_edca_dl != 0) {
604 edca_be_ul = rtlpcipriv->bt_coexist.bt_edca_dl; 619 edca_be_ul = rtlpriv->btcoexist.bt_edca_dl;
605 bt_change_edca = true; 620 bt_change_edca = true;
606 } 621 }
607 622
@@ -609,22 +624,11 @@ static void rtl8723ae_dm_check_edca_turbo(struct ieee80211_hw *hw)
609 rtlpriv->dm.current_turbo_edca = false; 624 rtlpriv->dm.current_turbo_edca = false;
610 return; 625 return;
611 } 626 }
612
613 if ((!mac->ht_enable) && (!rtlpcipriv->bt_coexist.bt_coexistence)) {
614 if (!(edca_be_ul & 0xffff0000))
615 edca_be_ul |= 0x005e0000;
616
617 if (!(edca_be_dl & 0xffff0000))
618 edca_be_dl |= 0x005e0000;
619 }
620
621 if ((bt_change_edca) || ((!rtlpriv->dm.is_any_nonbepkts) && 627 if ((bt_change_edca) || ((!rtlpriv->dm.is_any_nonbepkts) &&
622 (!rtlpriv->dm.disable_framebursting))) { 628 (!rtlpriv->dm.disable_framebursting))) {
623 629
624 cur_txok_cnt = rtlpriv->stats.txbytesunicast - 630 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
625 mac->last_txok_cnt; 631 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
626 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast -
627 mac->last_rxok_cnt;
628 632
629 if (cur_rxok_cnt > 4 * cur_txok_cnt) { 633 if (cur_rxok_cnt > 4 * cur_txok_cnt) {
630 if (!rtlpriv->dm.is_cur_rdlstate || 634 if (!rtlpriv->dm.is_cur_rdlstate ||
@@ -647,18 +651,20 @@ static void rtl8723ae_dm_check_edca_turbo(struct ieee80211_hw *hw)
647 } else { 651 } else {
648 if (rtlpriv->dm.current_turbo_edca) { 652 if (rtlpriv->dm.current_turbo_edca) {
649 u8 tmp = AC0_BE; 653 u8 tmp = AC0_BE;
650 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, 654 rtlpriv->cfg->ops->set_hw_reg(hw,
651 &tmp); 655 HW_VAR_AC_PARAM,
656 (u8 *)(&tmp));
652 rtlpriv->dm.current_turbo_edca = false; 657 rtlpriv->dm.current_turbo_edca = false;
653 } 658 }
654 } 659 }
655 660
656 rtlpriv->dm.is_any_nonbepkts = false; 661 rtlpriv->dm.is_any_nonbepkts = false;
657 mac->last_txok_cnt = rtlpriv->stats.txbytesunicast; 662 last_txok_cnt = rtlpriv->stats.txbytesunicast;
658 mac->last_rxok_cnt = rtlpriv->stats.rxbytesunicast; 663 last_rxok_cnt = rtlpriv->stats.rxbytesunicast;
659} 664}
660 665
661static void rtl8723ae_dm_initialize_txpower_tracking(struct ieee80211_hw *hw) 666static void rtl8723e_dm_initialize_txpower_tracking_thermalmeter(
667 struct ieee80211_hw *hw)
662{ 668{
663 struct rtl_priv *rtlpriv = rtl_priv(hw); 669 struct rtl_priv *rtlpriv = rtl_priv(hw);
664 670
@@ -667,10 +673,20 @@ static void rtl8723ae_dm_initialize_txpower_tracking(struct ieee80211_hw *hw)
667 673
668 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 674 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
669 "pMgntInfo->txpower_tracking = %d\n", 675 "pMgntInfo->txpower_tracking = %d\n",
670 rtlpriv->dm.txpower_tracking); 676 rtlpriv->dm.txpower_tracking);
671} 677}
672 678
673void rtl8723ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw) 679static void rtl8723e_dm_initialize_txpower_tracking(struct ieee80211_hw *hw)
680{
681 rtl8723e_dm_initialize_txpower_tracking_thermalmeter(hw);
682}
683
684void rtl8723e_dm_check_txpower_tracking(struct ieee80211_hw *hw)
685{
686 return;
687}
688
689void rtl8723e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
674{ 690{
675 struct rtl_priv *rtlpriv = rtl_priv(hw); 691 struct rtl_priv *rtlpriv = rtl_priv(hw);
676 struct rate_adaptive *p_ra = &(rtlpriv->ra); 692 struct rate_adaptive *p_ra = &(rtlpriv->ra);
@@ -682,101 +698,32 @@ void rtl8723ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
682 rtlpriv->dm.useramask = true; 698 rtlpriv->dm.useramask = true;
683 else 699 else
684 rtlpriv->dm.useramask = false; 700 rtlpriv->dm.useramask = false;
685}
686 701
687static void rtl8723ae_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
688{
689 struct rtl_priv *rtlpriv = rtl_priv(hw);
690 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
691 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
692 struct rate_adaptive *p_ra = &(rtlpriv->ra);
693 u32 low_rssithresh_for_ra, high_rssithresh_for_ra;
694 struct ieee80211_sta *sta = NULL;
695
696 if (is_hal_stop(rtlhal)) {
697 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
698 " driver is going to unload\n");
699 return;
700 }
701
702 if (!rtlpriv->dm.useramask) {
703 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
704 " driver does not control rate adaptive mask\n");
705 return;
706 }
707
708 if (mac->link_state == MAC80211_LINKED &&
709 mac->opmode == NL80211_IFTYPE_STATION) {
710 switch (p_ra->pre_ratr_state) {
711 case DM_RATR_STA_HIGH:
712 high_rssithresh_for_ra = 50;
713 low_rssithresh_for_ra = 20;
714 break;
715 case DM_RATR_STA_MIDDLE:
716 high_rssithresh_for_ra = 55;
717 low_rssithresh_for_ra = 20;
718 break;
719 case DM_RATR_STA_LOW:
720 high_rssithresh_for_ra = 50;
721 low_rssithresh_for_ra = 25;
722 break;
723 default:
724 high_rssithresh_for_ra = 50;
725 low_rssithresh_for_ra = 20;
726 break;
727 }
728
729 if (rtlpriv->dm.undec_sm_pwdb > high_rssithresh_for_ra)
730 p_ra->ratr_state = DM_RATR_STA_HIGH;
731 else if (rtlpriv->dm.undec_sm_pwdb > low_rssithresh_for_ra)
732 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
733 else
734 p_ra->ratr_state = DM_RATR_STA_LOW;
735
736 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
737 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
738 "RSSI = %ld\n",
739 rtlpriv->dm.undec_sm_pwdb);
740 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
741 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
742 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
743 "PreState = %d, CurState = %d\n",
744 p_ra->pre_ratr_state, p_ra->ratr_state);
745
746 rcu_read_lock();
747 sta = rtl_find_sta(hw, mac->bssid);
748 if (sta)
749 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
750 p_ra->ratr_state);
751 rcu_read_unlock();
752
753 p_ra->pre_ratr_state = p_ra->ratr_state;
754 }
755 }
756} 702}
757 703
758void rtl8723ae_dm_rf_saving(struct ieee80211_hw *hw, u8 force_in_normal) 704void rtl8723e_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal)
759{ 705{
760 struct rtl_priv *rtlpriv = rtl_priv(hw); 706 struct rtl_priv *rtlpriv = rtl_priv(hw);
761 struct ps_t *dm_pstable = &rtlpriv->dm_pstable; 707 struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
708 static u8 initialize;
709 static u32 reg_874, reg_c70, reg_85c, reg_a74;
762 710
763 if (!rtlpriv->reg_init) { 711 if (initialize == 0) {
764 rtlpriv->reg_874 = (rtl_get_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, 712 reg_874 = (rtl_get_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
765 MASKDWORD) & 0x1CC000) >> 14; 713 MASKDWORD) & 0x1CC000) >> 14;
766 714
767 rtlpriv->reg_c70 = (rtl_get_bbreg(hw, ROFDM0_AGCPARAMETER1, 715 reg_c70 = (rtl_get_bbreg(hw, ROFDM0_AGCPARAMETER1,
768 MASKDWORD) & BIT(3)) >> 3; 716 MASKDWORD) & BIT(3)) >> 3;
769 717
770 rtlpriv->reg_85c = (rtl_get_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 718 reg_85c = (rtl_get_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL,
771 MASKDWORD) & 0xFF000000) >> 24; 719 MASKDWORD) & 0xFF000000) >> 24;
772 720
773 rtlpriv->reg_a74 = (rtl_get_bbreg(hw, 0xa74, MASKDWORD) & 721 reg_a74 = (rtl_get_bbreg(hw, 0xa74, MASKDWORD) & 0xF000) >> 12;
774 0xF000) >> 12;
775 722
776 rtlpriv->reg_init = true; 723 initialize = 1;
777 } 724 }
778 725
779 if (!force_in_normal) { 726 if (!bforce_in_normal) {
780 if (dm_pstable->rssi_val_min != 0) { 727 if (dm_pstable->rssi_val_min != 0) {
781 if (dm_pstable->pre_rfstate == RF_NORMAL) { 728 if (dm_pstable->pre_rfstate == RF_NORMAL) {
782 if (dm_pstable->rssi_val_min >= 30) 729 if (dm_pstable->rssi_val_min >= 30)
@@ -798,7 +745,6 @@ void rtl8723ae_dm_rf_saving(struct ieee80211_hw *hw, u8 force_in_normal)
798 745
799 if (dm_pstable->pre_rfstate != dm_pstable->cur_rfstate) { 746 if (dm_pstable->pre_rfstate != dm_pstable->cur_rfstate) {
800 if (dm_pstable->cur_rfstate == RF_SAVE) { 747 if (dm_pstable->cur_rfstate == RF_SAVE) {
801
802 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, 748 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
803 BIT(5), 0x1); 749 BIT(5), 0x1);
804 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, 750 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
@@ -813,12 +759,12 @@ void rtl8723ae_dm_rf_saving(struct ieee80211_hw *hw, u8 force_in_normal)
813 rtl_set_bbreg(hw, 0x818, BIT(28), 0x1); 759 rtl_set_bbreg(hw, 0x818, BIT(28), 0x1);
814 } else { 760 } else {
815 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, 761 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
816 0x1CC000, rtlpriv->reg_874); 762 0x1CC000, reg_874);
817 rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3), 763 rtl_set_bbreg(hw, ROFDM0_AGCPARAMETER1, BIT(3),
818 rtlpriv->reg_c70); 764 reg_c70);
819 rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 0xFF000000, 765 rtl_set_bbreg(hw, RFPGA0_XCD_SWITCHCONTROL, 0xFF000000,
820 rtlpriv->reg_85c); 766 reg_85c);
821 rtl_set_bbreg(hw, 0xa74, 0xF000, rtlpriv->reg_a74); 767 rtl_set_bbreg(hw, 0xa74, 0xF000, reg_a74);
822 rtl_set_bbreg(hw, 0x818, BIT(28), 0x0); 768 rtl_set_bbreg(hw, 0x818, BIT(28), 0x0);
823 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, 769 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW,
824 BIT(5), 0x0); 770 BIT(5), 0x0);
@@ -828,7 +774,7 @@ void rtl8723ae_dm_rf_saving(struct ieee80211_hw *hw, u8 force_in_normal)
828 } 774 }
829} 775}
830 776
831static void rtl8723ae_dm_dynamic_bpowersaving(struct ieee80211_hw *hw) 777static void rtl8723e_dm_dynamic_bb_powersaving(struct ieee80211_hw *hw)
832{ 778{
833 struct rtl_priv *rtlpriv = rtl_priv(hw); 779 struct rtl_priv *rtlpriv = rtl_priv(hw);
834 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 780 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -847,48 +793,49 @@ static void rtl8723ae_dm_dynamic_bpowersaving(struct ieee80211_hw *hw)
847 rtlpriv->dm.entry_min_undec_sm_pwdb; 793 rtlpriv->dm.entry_min_undec_sm_pwdb;
848 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, 794 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
849 "AP Client PWDB = 0x%lx\n", 795 "AP Client PWDB = 0x%lx\n",
850 dm_pstable->rssi_val_min); 796 dm_pstable->rssi_val_min);
851 } else { 797 } else {
852 dm_pstable->rssi_val_min = rtlpriv->dm.undec_sm_pwdb; 798 dm_pstable->rssi_val_min =
799 rtlpriv->dm.undec_sm_pwdb;
853 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, 800 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
854 "STA Default Port PWDB = 0x%lx\n", 801 "STA Default Port PWDB = 0x%lx\n",
855 dm_pstable->rssi_val_min); 802 dm_pstable->rssi_val_min);
856 } 803 }
857 } else { 804 } else {
858 dm_pstable->rssi_val_min = rtlpriv->dm.entry_min_undec_sm_pwdb; 805 dm_pstable->rssi_val_min =
806 rtlpriv->dm.entry_min_undec_sm_pwdb;
859 807
860 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD, 808 RT_TRACE(rtlpriv, DBG_LOUD, DBG_LOUD,
861 "AP Ext Port PWDB = 0x%lx\n", 809 "AP Ext Port PWDB = 0x%lx\n",
862 dm_pstable->rssi_val_min); 810 dm_pstable->rssi_val_min);
863 } 811 }
864 812
865 rtl8723ae_dm_rf_saving(hw, false); 813 rtl8723e_dm_rf_saving(hw, false);
866} 814}
867 815
868void rtl8723ae_dm_init(struct ieee80211_hw *hw) 816void rtl8723e_dm_init(struct ieee80211_hw *hw)
869{ 817{
870 struct rtl_priv *rtlpriv = rtl_priv(hw); 818 struct rtl_priv *rtlpriv = rtl_priv(hw);
871 819
872 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER; 820 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
873 rtl8723ae_dm_diginit(hw); 821 rtl8723e_dm_diginit(hw);
874 rtl8723_dm_init_dynamic_txpower(hw); 822 rtl8723_dm_init_dynamic_txpower(hw);
875 rtl8723_dm_init_edca_turbo(hw); 823 rtl8723_dm_init_edca_turbo(hw);
876 rtl8723ae_dm_init_rate_adaptive_mask(hw); 824 rtl8723e_dm_init_rate_adaptive_mask(hw);
877 rtl8723ae_dm_initialize_txpower_tracking(hw); 825 rtl8723e_dm_initialize_txpower_tracking(hw);
878 rtl8723_dm_init_dynamic_bb_powersaving(hw); 826 rtl8723_dm_init_dynamic_bb_powersaving(hw);
879} 827}
880 828
881void rtl8723ae_dm_watchdog(struct ieee80211_hw *hw) 829void rtl8723e_dm_watchdog(struct ieee80211_hw *hw)
882{ 830{
883 struct rtl_priv *rtlpriv = rtl_priv(hw); 831 struct rtl_priv *rtlpriv = rtl_priv(hw);
884 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 832 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
885 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
886 bool fw_current_inpsmode = false; 833 bool fw_current_inpsmode = false;
887 bool fw_ps_awake = true; 834 bool fw_ps_awake = true;
888 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 835 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
889 (u8 *) (&fw_current_inpsmode)); 836 (u8 *)(&fw_current_inpsmode));
890 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON, 837 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
891 (u8 *) (&fw_ps_awake)); 838 (u8 *)(&fw_ps_awake));
892 839
893 if (ppsc->p2p_ps_info.p2p_ps_mode) 840 if (ppsc->p2p_ps_info.p2p_ps_mode)
894 fw_ps_awake = false; 841 fw_ps_awake = false;
@@ -896,58 +843,57 @@ void rtl8723ae_dm_watchdog(struct ieee80211_hw *hw)
896 if ((ppsc->rfpwr_state == ERFON) && 843 if ((ppsc->rfpwr_state == ERFON) &&
897 ((!fw_current_inpsmode) && fw_ps_awake) && 844 ((!fw_current_inpsmode) && fw_ps_awake) &&
898 (!ppsc->rfchange_inprogress)) { 845 (!ppsc->rfchange_inprogress)) {
899 rtl8723ae_dm_dig(hw); 846 rtl8723e_dm_pwdb_monitor(hw);
900 rtl8723ae_dm_false_alarm_counter_statistics(hw); 847 rtl8723e_dm_dig(hw);
901 rtl8723ae_dm_dynamic_bpowersaving(hw); 848 rtl8723e_dm_false_alarm_counter_statistics(hw);
902 rtl8723ae_dm_dynamic_txpower(hw); 849 rtl8723e_dm_dynamic_bb_powersaving(hw);
903 rtl8723ae_dm_refresh_rate_adaptive_mask(hw); 850 rtl8723e_dm_dynamic_txpower(hw);
904 rtl8723ae_dm_bt_coexist(hw); 851 rtl8723e_dm_check_txpower_tracking(hw);
905 rtl8723ae_dm_check_edca_turbo(hw); 852 /* rtl92c_dm_refresh_rate_adaptive_mask(hw); */
853 rtl8723e_dm_bt_coexist(hw);
854 rtl8723e_dm_check_edca_turbo(hw);
906 } 855 }
907 if (rtlpcipriv->bt_coexist.init_set) 856 if (rtlpriv->btcoexist.init_set)
908 rtl_write_byte(rtlpriv, 0x76e, 0xc); 857 rtl_write_byte(rtlpriv, 0x76e, 0xc);
909} 858}
910 859
911static void rtl8723ae_dm_init_bt_coexist(struct ieee80211_hw *hw) 860static void rtl8723e_dm_init_bt_coexist(struct ieee80211_hw *hw)
912{ 861{
913 struct rtl_priv *rtlpriv = rtl_priv(hw); 862 struct rtl_priv *rtlpriv = rtl_priv(hw);
914 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
915 863
916 rtlpcipriv->bt_coexist.bt_rfreg_origin_1e 864 rtlpriv->btcoexist.bt_rfreg_origin_1e
917 = rtl_get_rfreg(hw, (enum radio_path)0, RF_RCK1, 0xfffff); 865 = rtl_get_rfreg(hw, (enum radio_path)0, RF_RCK1, 0xfffff);
918 rtlpcipriv->bt_coexist.bt_rfreg_origin_1f 866 rtlpriv->btcoexist.bt_rfreg_origin_1f
919 = rtl_get_rfreg(hw, (enum radio_path)0, RF_RCK2, 0xf0); 867 = rtl_get_rfreg(hw, (enum radio_path)0, RF_RCK2, 0xf0);
920 868
921 rtlpcipriv->bt_coexist.cstate = 0; 869 rtlpriv->btcoexist.cstate = 0;
922 rtlpcipriv->bt_coexist.previous_state = 0; 870 rtlpriv->btcoexist.previous_state = 0;
923 rtlpcipriv->bt_coexist.cstate_h = 0; 871 rtlpriv->btcoexist.cstate_h = 0;
924 rtlpcipriv->bt_coexist.previous_state_h = 0; 872 rtlpriv->btcoexist.previous_state_h = 0;
925 rtlpcipriv->bt_coexist.lps_counter = 0; 873 rtlpriv->btcoexist.lps_counter = 0;
926 874
927 /* Enable counter statistics */ 875 /* Enable counter statistics */
928 rtl_write_byte(rtlpriv, 0x76e, 0x4); 876 rtl_write_byte(rtlpriv, 0x76e, 0x4);
929 rtl_write_byte(rtlpriv, 0x778, 0x3); 877 rtl_write_byte(rtlpriv, 0x778, 0x3);
930 rtl_write_byte(rtlpriv, 0x40, 0x20); 878 rtl_write_byte(rtlpriv, 0x40, 0x20);
931 879
932 rtlpcipriv->bt_coexist.init_set = true; 880 rtlpriv->btcoexist.init_set = true;
933} 881}
934 882
935void rtl8723ae_dm_bt_coexist(struct ieee80211_hw *hw) 883void rtl8723e_dm_bt_coexist(struct ieee80211_hw *hw)
936{ 884{
937 struct rtl_priv *rtlpriv = rtl_priv(hw); 885 struct rtl_priv *rtlpriv = rtl_priv(hw);
938 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
939 u8 tmp_byte = 0; 886 u8 tmp_byte = 0;
940 if (!rtlpcipriv->bt_coexist.bt_coexistence) { 887 if (!rtlpriv->btcoexist.bt_coexistence) {
941 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 888 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
942 "[DM]{BT], BT not exist!!\n"); 889 "[DM]{BT], BT not exist!!\n");
943 return; 890 return;
944 } 891 }
945 892
946 if (!rtlpcipriv->bt_coexist.init_set) { 893 if (!rtlpriv->btcoexist.init_set) {
947 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 894 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
948 "[DM][BT], rtl8723ae_dm_bt_coexist()\n"); 895 "[DM][BT], rtl8723e_dm_bt_coexist()\n");
949 896 rtl8723e_dm_init_bt_coexist(hw);
950 rtl8723ae_dm_init_bt_coexist(hw);
951 } 897 }
952 898
953 tmp_byte = rtl_read_byte(rtlpriv, 0x40); 899 tmp_byte = rtl_read_byte(rtlpriv, 0x40);
@@ -955,5 +901,5 @@ void rtl8723ae_dm_bt_coexist(struct ieee80211_hw *hw)
955 "[DM][BT], 0x40 is 0x%x", tmp_byte); 901 "[DM][BT], 0x40 is 0x%x", tmp_byte);
956 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 902 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
957 "[DM][BT], bt_dm_coexist start"); 903 "[DM][BT], bt_dm_coexist start");
958 rtl8723ae_dm_bt_coexist_8723(hw); 904 rtl8723e_dm_bt_coexist_8723(hw);
959} 905}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
index d253bb53d03e..6fa0feb05f6d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/dm.h
@@ -25,17 +25,23 @@
25 * 25 *
26 * Larry Finger <Larry.Finger@lwfinger.net> 26 * Larry Finger <Larry.Finger@lwfinger.net>
27 * 27 *
28 **************************************************************************** 28 *****************************************************************************/
29 */
30 29
31#ifndef __RTL8723E_DM_H__ 30#ifndef __RTL8723E_DM_H__
32#define __RTL8723E_DM_H__ 31#define __RTL8723E_DM_H__
33 32
33#define HAL_DM_DIG_DISABLE BIT(0)
34#define HAL_DM_HIPWR_DISABLE BIT(1) 34#define HAL_DM_HIPWR_DISABLE BIT(1)
35 35
36#define OFDM_TABLE_LENGTH 37
37#define CCK_TABLE_LENGTH 33
38
36#define OFDM_TABLE_SIZE 37 39#define OFDM_TABLE_SIZE 37
37#define CCK_TABLE_SIZE 33 40#define CCK_TABLE_SIZE 33
38 41
42#define BW_AUTO_SWITCH_HIGH_LOW 25
43#define BW_AUTO_SWITCH_LOW_HIGH 30
44
39#define DM_DIG_THRESH_HIGH 40 45#define DM_DIG_THRESH_HIGH 40
40#define DM_DIG_THRESH_LOW 35 46#define DM_DIG_THRESH_LOW 35
41 47
@@ -63,12 +69,18 @@
63#define DM_RATR_STA_MIDDLE 2 69#define DM_RATR_STA_MIDDLE 2
64#define DM_RATR_STA_LOW 3 70#define DM_RATR_STA_LOW 3
65 71
72#define CTS2SELF_THVAL 30
73#define REGC38_TH 20
74
75#define WAIOTTHVAL 25
76
66#define TXHIGHPWRLEVEL_NORMAL 0 77#define TXHIGHPWRLEVEL_NORMAL 0
67#define TXHIGHPWRLEVEL_LEVEL1 1 78#define TXHIGHPWRLEVEL_LEVEL1 1
68#define TXHIGHPWRLEVEL_LEVEL2 2 79#define TXHIGHPWRLEVEL_LEVEL2 2
69#define TXHIGHPWRLEVEL_BT1 3 80#define TXHIGHPWRLEVEL_BT1 3
70#define TXHIGHPWRLEVEL_BT2 4 81#define TXHIGHPWRLEVEL_BT2 4
71 82
83#define DM_TYPE_BYFW 0
72#define DM_TYPE_BYDRIVER 1 84#define DM_TYPE_BYDRIVER 1
73 85
74#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74 86#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
@@ -82,6 +94,7 @@ struct swat_t {
82 long trying_threshold; 94 long trying_threshold;
83 u8 cur_antenna; 95 u8 cur_antenna;
84 u8 pre_antenna; 96 u8 pre_antenna;
97
85}; 98};
86 99
87enum tag_dynamic_init_gain_operation_type_definition { 100enum tag_dynamic_init_gain_operation_type_definition {
@@ -98,7 +111,7 @@ enum tag_dynamic_init_gain_operation_type_definition {
98enum tag_cck_packet_detection_threshold_type_definition { 111enum tag_cck_packet_detection_threshold_type_definition {
99 CCK_PD_STAGE_LowRssi = 0, 112 CCK_PD_STAGE_LowRssi = 0,
100 CCK_PD_STAGE_HighRssi = 1, 113 CCK_PD_STAGE_HighRssi = 1,
101 CCK_FA_STAGE_Low = 2, 114 CCK_FA_STAGE_LOW = 2,
102 CCK_FA_STAGE_High = 3, 115 CCK_FA_STAGE_High = 3,
103 CCK_PD_STAGE_MAX = 4, 116 CCK_PD_STAGE_MAX = 4,
104}; 117};
@@ -138,17 +151,24 @@ enum dm_dig_connect_e {
138 DIG_CONNECT_MAX 151 DIG_CONNECT_MAX
139}; 152};
140 153
154#define BT_RSSI_STATE_NORMAL_POWER BIT_OFFSET_LEN_MASK_32(0, 1)
155#define BT_RSSI_STATE_AMDPU_OFF BIT_OFFSET_LEN_MASK_32(1, 1)
156#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1)
157#define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1)
158#define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1)
141#define GET_UNDECORATED_AVERAGE_RSSI(_priv) \ 159#define GET_UNDECORATED_AVERAGE_RSSI(_priv) \
142 ((((struct rtl_priv *)(_priv))->mac80211.opmode == \ 160 ( \
143 NL80211_IFTYPE_ADHOC) ? \ 161 (((struct rtl_priv *)(_priv))->mac80211.opmode == \
144 (((struct rtl_priv *)(_priv))->dm.entry_min_undec_sm_pwdb) \ 162 NL80211_IFTYPE_ADHOC) ? \
145 : (((struct rtl_priv *)(_priv))->dm.undec_sm_pwdb)) 163 (((struct rtl_priv *)(_priv))->dm.entry_min_undec_sm_pwdb) : \
146 164 (((struct rtl_priv *)(_priv))->dm.undec_sm_pwdb) \
147void rtl8723ae_dm_init(struct ieee80211_hw *hw); 165 )
148void rtl8723ae_dm_watchdog(struct ieee80211_hw *hw); 166
149void rtl8723ae_dm_write_dig(struct ieee80211_hw *hw); 167void rtl8723e_dm_init(struct ieee80211_hw *hw);
150void rtl8723ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw); 168void rtl8723e_dm_watchdog(struct ieee80211_hw *hw);
151void rtl8723ae_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal); 169void rtl8723e_dm_write_dig(struct ieee80211_hw *hw);
152void rtl8723ae_dm_bt_coexist(struct ieee80211_hw *hw); 170void rtl8723e_dm_check_txpower_tracking(struct ieee80211_hw *hw);
153 171void rtl8723e_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
172void rtl8723e_dm_rf_saving(struct ieee80211_hw *hw, u8 bforce_in_normal);
173void rtl8723e_dm_bt_coexist(struct ieee80211_hw *hw);
154#endif 174#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c
index 728b7563ad36..b7c0d38ee5b5 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -25,18 +21,19 @@
25 * 21 *
26 * Larry Finger <Larry.Finger@lwfinger.net> 22 * Larry Finger <Larry.Finger@lwfinger.net>
27 * 23 *
28 **************************************************************************** 24 *****************************************************************************/
29 */
30 25
31#include "../wifi.h" 26#include "../wifi.h"
32#include "../pci.h" 27#include "../pci.h"
33#include "../base.h" 28#include "../base.h"
29#include "../core.h"
34#include "reg.h" 30#include "reg.h"
35#include "def.h" 31#include "def.h"
36#include "fw.h" 32#include "fw.h"
37#include "../rtl8723com/fw_common.h" 33#include "../rtl8723com/fw_common.h"
38 34
39static bool rtl8723ae_check_fw_read_last_h2c(struct ieee80211_hw *hw, u8 boxnum) 35static bool _rtl8723e_check_fw_read_last_h2c(struct ieee80211_hw *hw,
36 u8 boxnum)
40{ 37{
41 struct rtl_priv *rtlpriv = rtl_priv(hw); 38 struct rtl_priv *rtlpriv = rtl_priv(hw);
42 u8 val_hmetfr, val_mcutst_1; 39 u8 val_hmetfr, val_mcutst_1;
@@ -50,17 +47,17 @@ static bool rtl8723ae_check_fw_read_last_h2c(struct ieee80211_hw *hw, u8 boxnum)
50 return result; 47 return result;
51} 48}
52 49
53static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw, 50static void _rtl8723e_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
54 u8 element_id, u32 cmd_len, 51 u32 cmd_len, u8 *cmdbuffer)
55 u8 *p_cmdbuffer)
56{ 52{
57 struct rtl_priv *rtlpriv = rtl_priv(hw); 53 struct rtl_priv *rtlpriv = rtl_priv(hw);
58 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 54 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
59 u8 boxnum; 55 u8 boxnum;
60 u16 box_reg = 0, box_extreg = 0; 56 u16 box_reg = 0, box_extreg = 0;
61 u8 u1tmp; 57 u8 u1b_tmp;
62 bool isfw_rd = false; 58 bool isfw_read = false;
63 bool bwrite_success = false; 59 u8 buf_index = 0;
60 bool bwrite_sucess = false;
64 u8 wait_h2c_limmit = 100; 61 u8 wait_h2c_limmit = 100;
65 u8 wait_writeh2c_limmit = 100; 62 u8 wait_writeh2c_limmit = 100;
66 u8 boxcontent[4], boxextcontent[2]; 63 u8 boxcontent[4], boxextcontent[2];
@@ -83,7 +80,7 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
83 h2c_waitcounter++; 80 h2c_waitcounter++;
84 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 81 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
85 "Wait 100 us (%d times)...\n", 82 "Wait 100 us (%d times)...\n",
86 h2c_waitcounter); 83 h2c_waitcounter);
87 udelay(100); 84 udelay(100);
88 85
89 if (h2c_waitcounter > 1000) 86 if (h2c_waitcounter > 1000)
@@ -99,12 +96,11 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
99 } 96 }
100 } 97 }
101 98
102 while (!bwrite_success) { 99 while (!bwrite_sucess) {
103 wait_writeh2c_limmit--; 100 wait_writeh2c_limmit--;
104 if (wait_writeh2c_limmit == 0) { 101 if (wait_writeh2c_limmit == 0) {
105 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 102 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
106 "Write H2C fail because no trigger " 103 "Write H2C fail because no trigger for FW INT!\n");
107 "for FW INT!\n");
108 break; 104 break;
109 } 105 }
110 106
@@ -128,34 +124,35 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
128 break; 124 break;
129 default: 125 default:
130 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 126 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
131 "switch case not processed\n"); 127 "switch case not process\n");
132 break; 128 break;
133 } 129 }
134 130
135 isfw_rd = rtl8723ae_check_fw_read_last_h2c(hw, boxnum); 131 isfw_read = _rtl8723e_check_fw_read_last_h2c(hw, boxnum);
136 while (!isfw_rd) { 132 while (!isfw_read) {
137 133
138 wait_h2c_limmit--; 134 wait_h2c_limmit--;
139 if (wait_h2c_limmit == 0) { 135 if (wait_h2c_limmit == 0) {
140 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 136 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
141 "Waiting too long for FW read clear HMEBox(%d)!\n", 137 "Wating too long for FW read clear HMEBox(%d)!\n",
142 boxnum); 138 boxnum);
143 break; 139 break;
144 } 140 }
145 141
146 udelay(10); 142 udelay(10);
147 143
148 isfw_rd = rtl8723ae_check_fw_read_last_h2c(hw, boxnum); 144 isfw_read = _rtl8723e_check_fw_read_last_h2c(hw,
149 u1tmp = rtl_read_byte(rtlpriv, 0x1BF); 145 boxnum);
146 u1b_tmp = rtl_read_byte(rtlpriv, 0x1BF);
150 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 147 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
151 "Waiting for FW read clear HMEBox(%d)!!! " 148 "Waiting for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n",
152 "0x1BF = %2x\n", boxnum, u1tmp); 149 boxnum, u1b_tmp);
153 } 150 }
154 151
155 if (!isfw_rd) { 152 if (!isfw_read) {
156 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 153 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
157 "Write H2C register BOX[%d] fail!!!!! " 154 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
158 "Fw do not read.\n", boxnum); 155 boxnum);
159 break; 156 break;
160 } 157 }
161 158
@@ -169,8 +166,8 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
169 switch (cmd_len) { 166 switch (cmd_len) {
170 case 1: 167 case 1:
171 boxcontent[0] &= ~(BIT(7)); 168 boxcontent[0] &= ~(BIT(7));
172 memcpy((u8 *) (boxcontent) + 1, 169 memcpy((u8 *)(boxcontent) + 1,
173 p_cmdbuffer, 1); 170 cmdbuffer + buf_index, 1);
174 171
175 for (idx = 0; idx < 4; idx++) { 172 for (idx = 0; idx < 4; idx++) {
176 rtl_write_byte(rtlpriv, box_reg + idx, 173 rtl_write_byte(rtlpriv, box_reg + idx,
@@ -179,8 +176,8 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
179 break; 176 break;
180 case 2: 177 case 2:
181 boxcontent[0] &= ~(BIT(7)); 178 boxcontent[0] &= ~(BIT(7));
182 memcpy((u8 *) (boxcontent) + 1, 179 memcpy((u8 *)(boxcontent) + 1,
183 p_cmdbuffer, 2); 180 cmdbuffer + buf_index, 2);
184 181
185 for (idx = 0; idx < 4; idx++) { 182 for (idx = 0; idx < 4; idx++) {
186 rtl_write_byte(rtlpriv, box_reg + idx, 183 rtl_write_byte(rtlpriv, box_reg + idx,
@@ -189,8 +186,8 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
189 break; 186 break;
190 case 3: 187 case 3:
191 boxcontent[0] &= ~(BIT(7)); 188 boxcontent[0] &= ~(BIT(7));
192 memcpy((u8 *) (boxcontent) + 1, 189 memcpy((u8 *)(boxcontent) + 1,
193 p_cmdbuffer, 3); 190 cmdbuffer + buf_index, 3);
194 191
195 for (idx = 0; idx < 4; idx++) { 192 for (idx = 0; idx < 4; idx++) {
196 rtl_write_byte(rtlpriv, box_reg + idx, 193 rtl_write_byte(rtlpriv, box_reg + idx,
@@ -199,10 +196,10 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
199 break; 196 break;
200 case 4: 197 case 4:
201 boxcontent[0] |= (BIT(7)); 198 boxcontent[0] |= (BIT(7));
202 memcpy((u8 *) (boxextcontent), 199 memcpy((u8 *)(boxextcontent),
203 p_cmdbuffer, 2); 200 cmdbuffer + buf_index, 2);
204 memcpy((u8 *) (boxcontent) + 1, 201 memcpy((u8 *)(boxcontent) + 1,
205 p_cmdbuffer + 2, 2); 202 cmdbuffer + buf_index + 2, 2);
206 203
207 for (idx = 0; idx < 2; idx++) { 204 for (idx = 0; idx < 2; idx++) {
208 rtl_write_byte(rtlpriv, box_extreg + idx, 205 rtl_write_byte(rtlpriv, box_extreg + idx,
@@ -216,10 +213,10 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
216 break; 213 break;
217 case 5: 214 case 5:
218 boxcontent[0] |= (BIT(7)); 215 boxcontent[0] |= (BIT(7));
219 memcpy((u8 *) (boxextcontent), 216 memcpy((u8 *)(boxextcontent),
220 p_cmdbuffer, 2); 217 cmdbuffer + buf_index, 2);
221 memcpy((u8 *) (boxcontent) + 1, 218 memcpy((u8 *)(boxcontent) + 1,
222 p_cmdbuffer + 2, 3); 219 cmdbuffer + buf_index + 2, 3);
223 220
224 for (idx = 0; idx < 2; idx++) { 221 for (idx = 0; idx < 2; idx++) {
225 rtl_write_byte(rtlpriv, box_extreg + idx, 222 rtl_write_byte(rtlpriv, box_extreg + idx,
@@ -237,7 +234,7 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
237 break; 234 break;
238 } 235 }
239 236
240 bwrite_success = true; 237 bwrite_sucess = true;
241 238
242 rtlhal->last_hmeboxnum = boxnum + 1; 239 rtlhal->last_hmeboxnum = boxnum + 1;
243 if (rtlhal->last_hmeboxnum == 4) 240 if (rtlhal->last_hmeboxnum == 4)
@@ -245,7 +242,7 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
245 242
246 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 243 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
247 "pHalData->last_hmeboxnum = %d\n", 244 "pHalData->last_hmeboxnum = %d\n",
248 rtlhal->last_hmeboxnum); 245 rtlhal->last_hmeboxnum);
249 } 246 }
250 247
251 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 248 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
@@ -255,52 +252,49 @@ static void _rtl8723ae_fill_h2c_command(struct ieee80211_hw *hw,
255 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n"); 252 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
256} 253}
257 254
258void rtl8723ae_fill_h2c_cmd(struct ieee80211_hw *hw, 255void rtl8723e_fill_h2c_cmd(struct ieee80211_hw *hw,
259 u8 element_id, u32 cmd_len, u8 *p_cmdbuffer) 256 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
260{ 257{
261 struct rtl_priv *rtlpriv = rtl_priv(hw); 258 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
262 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 259 u32 tmp_cmdbuf[2];
263 260
264 if (rtlhal->fw_ready == false) { 261 if (!rtlhal->fw_ready) {
265 RT_ASSERT(false, 262 RT_ASSERT(false,
266 "return H2C cmd because of Fw download fail!!!\n"); 263 "return H2C cmd because of Fw download fail!!!\n");
267 return; 264 return;
268 } 265 }
269 266 memset(tmp_cmdbuf, 0, 8);
270 _rtl8723ae_fill_h2c_command(hw, element_id, cmd_len, p_cmdbuffer); 267 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
271 return; 268 _rtl8723e_fill_h2c_command(hw, element_id, cmd_len,
269 (u8 *)&tmp_cmdbuf);
272} 270}
273 271
274static bool _rtl8723ae_cmd_send_packet(struct ieee80211_hw *hw, 272void rtl8723e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
275 struct sk_buff *skb)
276{ 273{
277 struct rtl_priv *rtlpriv = rtl_priv(hw); 274 struct rtl_priv *rtlpriv = rtl_priv(hw);
278 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 275 u8 u1_h2c_set_pwrmode[3] = { 0 };
279 struct rtl8192_tx_ring *ring; 276 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
280 struct rtl_tx_desc *pdesc;
281 unsigned long flags;
282 struct sk_buff *pskb = NULL;
283
284 ring = &rtlpci->tx_ring[BEACON_QUEUE];
285
286 pskb = __skb_dequeue(&ring->queue);
287 if (pskb)
288 kfree_skb(pskb);
289
290 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
291
292 pdesc = &ring->desc[0];
293 277
294 rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *) pdesc, 1, 1, skb); 278 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
295 279
296 __skb_queue_tail(&ring->queue, skb); 280 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode);
281 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
282 (rtlpriv->mac80211.p2p) ? ppsc->smart_ps : 1);
283 SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode,
284 ppsc->reg_max_lps_awakeintvl);
297 285
298 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 286 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
287 "rtl8723e_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode\n",
288 u1_h2c_set_pwrmode, 3);
289 rtl8723e_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
290}
299 291
300 rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE); 292#define BEACON_PG 0 /* ->1 */
293#define PSPOLL_PG 2
294#define NULL_PG 3
295#define PROBERSP_PG 4 /* ->5 */
301 296
302 return true; 297#define TOTAL_RESERVED_PKT_LEN 768
303}
304 298
305static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = { 299static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
306 /* page 0 beacon */ 300 /* page 0 beacon */
@@ -412,111 +406,111 @@ static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
413}; 407};
414 408
415void rtl8723ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished) 409void rtl8723e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished)
416{ 410{
417 struct rtl_priv *rtlpriv = rtl_priv(hw); 411 struct rtl_priv *rtlpriv = rtl_priv(hw);
418 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 412 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
419 struct sk_buff *skb = NULL; 413 struct sk_buff *skb = NULL;
420
421 u32 totalpacketlen; 414 u32 totalpacketlen;
422 bool rtstatus; 415 bool rtstatus;
423 u8 u1RsvdPageLoc[3] = { 0 }; 416 u8 u1rsvdpageloc[3] = { 0 };
424 bool dlok = false; 417 bool b_dlok = false;
425
426 u8 *beacon; 418 u8 *beacon;
427 u8 *p_pspoll; 419 u8 *p_pspoll;
428 u8 *nullfunc; 420 u8 *nullfunc;
429 u8 *p_probersp; 421 u8 *p_probersp;
422
430 /*--------------------------------------------------------- 423 /*---------------------------------------------------------
431 (1) beacon 424 * (1) beacon
432 --------------------------------------------------------- 425 *---------------------------------------------------------
433 */ 426 */
434 beacon = &reserved_page_packet[BEACON_PG * 128]; 427 beacon = &reserved_page_packet[BEACON_PG * 128];
435 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr); 428 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
436 SET_80211_HDR_ADDRESS3(beacon, mac->bssid); 429 SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
437 430
438 /*------------------------------------------------------- 431 /*-------------------------------------------------------
439 (2) ps-poll 432 * (2) ps-poll
440 -------------------------------------------------------- 433 *--------------------------------------------------------
441 */ 434 */
442 p_pspoll = &reserved_page_packet[PSPOLL_PG * 128]; 435 p_pspoll = &reserved_page_packet[PSPOLL_PG * 128];
443 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000)); 436 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
444 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid); 437 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
445 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr); 438 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
446 439
447 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG); 440 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1rsvdpageloc, PSPOLL_PG);
448 441
449 /*-------------------------------------------------------- 442 /*--------------------------------------------------------
450 (3) null data 443 * (3) null data
451 ---------------------------------------------------------i 444 *---------------------------------------------------------
452 */ 445 */
453 nullfunc = &reserved_page_packet[NULL_PG * 128]; 446 nullfunc = &reserved_page_packet[NULL_PG * 128];
454 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid); 447 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
455 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr); 448 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
456 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid); 449 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
457 450
458 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG); 451 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1rsvdpageloc, NULL_PG);
459 452
460 /*--------------------------------------------------------- 453 /*---------------------------------------------------------
461 (4) probe response 454 * (4) probe response
462 ---------------------------------------------------------- 455 *----------------------------------------------------------
463 */ 456 */
464 p_probersp = &reserved_page_packet[PROBERSP_PG * 128]; 457 p_probersp = &reserved_page_packet[PROBERSP_PG * 128];
465 SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid); 458 SET_80211_HDR_ADDRESS1(p_probersp, mac->bssid);
466 SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr); 459 SET_80211_HDR_ADDRESS2(p_probersp, mac->mac_addr);
467 SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid); 460 SET_80211_HDR_ADDRESS3(p_probersp, mac->bssid);
468 461
469 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1RsvdPageLoc, PROBERSP_PG); 462 SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(u1rsvdpageloc, PROBERSP_PG);
470 463
471 totalpacketlen = TOTAL_RESERVED_PKT_LEN; 464 totalpacketlen = TOTAL_RESERVED_PKT_LEN;
472 465
473 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, 466 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
474 "rtl8723ae_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n", 467 "rtl8723e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
475 &reserved_page_packet[0], totalpacketlen); 468 &reserved_page_packet[0], totalpacketlen);
476 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 469 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
477 "rtl8723ae_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n", 470 "rtl8723e_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
478 u1RsvdPageLoc, 3); 471 u1rsvdpageloc, 3);
479 472
480 skb = dev_alloc_skb(totalpacketlen); 473 skb = dev_alloc_skb(totalpacketlen);
481 memcpy((u8 *) skb_put(skb, totalpacketlen), 474 memcpy((u8 *)skb_put(skb, totalpacketlen),
482 &reserved_page_packet, totalpacketlen); 475 &reserved_page_packet, totalpacketlen);
483 476
484 rtstatus = _rtl8723ae_cmd_send_packet(hw, skb); 477 rtstatus = rtl_cmd_send_packet(hw, skb);
485 478
486 if (rtstatus) 479 if (rtstatus)
487 dlok = true; 480 b_dlok = true;
488 481
489 if (dlok) { 482 if (b_dlok) {
490 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 483 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
491 "Set RSVD page location to Fw.\n"); 484 "Set RSVD page location to Fw.\n");
492 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 485 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
493 "H2C_RSVDPAGE:\n", 486 "H2C_RSVDPAGE:\n",
494 u1RsvdPageLoc, 3); 487 u1rsvdpageloc, 3);
495 rtl8723ae_fill_h2c_cmd(hw, H2C_RSVDPAGE, 488 rtl8723e_fill_h2c_cmd(hw, H2C_RSVDPAGE,
496 sizeof(u1RsvdPageLoc), u1RsvdPageLoc); 489 sizeof(u1rsvdpageloc), u1rsvdpageloc);
497 } else 490 } else
498 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 491 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
499 "Set RSVD page location to Fw FAIL!!!!!!.\n"); 492 "Set RSVD page location to Fw FAIL!!!!!!.\n");
500} 493}
501 494
502void rtl8723ae_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus) 495void rtl8723e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus)
503{ 496{
504 u8 u1_joinbssrpt_parm[1] = { 0 }; 497 u8 u1_joinbssrpt_parm[1] = { 0 };
505 498
506 SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(u1_joinbssrpt_parm, mstatus); 499 SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(u1_joinbssrpt_parm, mstatus);
507 500
508 rtl8723ae_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm); 501 rtl8723e_fill_h2c_cmd(hw, H2C_JOINBSSRPT, 1, u1_joinbssrpt_parm);
509} 502}
510 503
511static void rtl8723e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, 504static void rtl8723e_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw,
512 u8 ctwindow) 505 u8 ctwindow)
513{ 506{
514 u8 u1_ctwindow_period[1] = {ctwindow}; 507 u8 u1_ctwindow_period[1] = { ctwindow};
508
509 rtl8723e_fill_h2c_cmd(hw, H2C_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);
515 510
516 rtl8723ae_fill_h2c_cmd(hw, H2C_P2P_PS_CTW_CMD, 1, u1_ctwindow_period);
517} 511}
518 512
519void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state) 513void rtl8723e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
520{ 514{
521 struct rtl_priv *rtlpriv = rtl_priv(hw); 515 struct rtl_priv *rtlpriv = rtl_priv(hw);
522 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw)); 516 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
@@ -530,7 +524,7 @@ void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
530 switch (p2p_ps_state) { 524 switch (p2p_ps_state) {
531 case P2P_PS_DISABLE: 525 case P2P_PS_DISABLE:
532 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); 526 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
533 memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t)); 527 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
534 break; 528 break;
535 case P2P_PS_ENABLE: 529 case P2P_PS_ENABLE:
536 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); 530 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
@@ -542,7 +536,7 @@ void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
542 } 536 }
543 537
544 /* hw only support 2 set of NoA */ 538 /* hw only support 2 set of NoA */
545 for (i = 0; i < p2pinfo->noa_num; i++) { 539 for (i = 0 ; i < p2pinfo->noa_num ; i++) {
546 /* To control the register setting for which NOA*/ 540 /* To control the register setting for which NOA*/
547 rtl_write_byte(rtlpriv, 0x5cf, (i << 4)); 541 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
548 if (i == 0) 542 if (i == 0)
@@ -561,27 +555,33 @@ void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
561 555
562 start_time = p2pinfo->noa_start_time[i]; 556 start_time = p2pinfo->noa_start_time[i];
563 if (p2pinfo->noa_count_type[i] != 1) { 557 if (p2pinfo->noa_count_type[i] != 1) {
564 while (start_time <= (tsf_low+(50*1024))) { 558 while (start_time <=
565 start_time += p2pinfo->noa_interval[i]; 559 (tsf_low+(50*1024))) {
560 start_time +=
561 p2pinfo->noa_interval[i];
566 if (p2pinfo->noa_count_type[i] != 255) 562 if (p2pinfo->noa_count_type[i] != 255)
567 p2pinfo->noa_count_type[i]--; 563 p2pinfo->noa_count_type[i]--;
568 } 564 }
569 } 565 }
570 rtl_write_dword(rtlpriv, 0x5E8, start_time); 566 rtl_write_dword(rtlpriv, 0x5E8, start_time);
571 rtl_write_dword(rtlpriv, 0x5EC, 567 rtl_write_dword(rtlpriv, 0x5EC,
572 p2pinfo->noa_count_type[i]); 568 p2pinfo->noa_count_type[i]);
569
573 } 570 }
571
574 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) { 572 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
575 /* rst p2p circuit */ 573 /* rst p2p circuit */
576 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4)); 574 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
577 575
578 p2p_ps_offload->offload_en = 1; 576 p2p_ps_offload->offload_en = 1;
577
579 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) { 578 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
580 p2p_ps_offload->role = 1; 579 p2p_ps_offload->role = 1;
581 p2p_ps_offload->allstasleep = 0; 580 p2p_ps_offload->allstasleep = 0;
582 } else { 581 } else {
583 p2p_ps_offload->role = 0; 582 p2p_ps_offload->role = 0;
584 } 583 }
584
585 p2p_ps_offload->discovery = 0; 585 p2p_ps_offload->discovery = 0;
586 } 586 }
587 break; 587 break;
@@ -597,26 +597,7 @@ void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
597 default: 597 default:
598 break; 598 break;
599 } 599 }
600 rtl8723ae_fill_h2c_cmd(hw, H2C_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
601}
602
603void rtl8723ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
604{
605 struct rtl_priv *rtlpriv = rtl_priv(hw);
606 u8 u1_h2c_set_pwrmode[3] = { 0 };
607 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
608
609 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
610 600
611 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode); 601 rtl8723e_fill_h2c_cmd(hw, H2C_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
612 SET_H2CCMD_PWRMODE_PARM_SMART_PS_23A(u1_h2c_set_pwrmode,
613 (rtlpriv->mac80211.p2p) ?
614 ppsc->smart_ps : 1);
615 SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(u1_h2c_set_pwrmode,
616 ppsc->reg_max_lps_awakeintvl);
617 602
618 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
619 "rtl8723ae_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode\n",
620 u1_h2c_set_pwrmode, 3);
621 rtl8723ae_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
622} 603}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h
index d355b85dd9fe..9d1fe25db953 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/fw.h
@@ -24,50 +24,27 @@
24 * Hsinchu 300, Taiwan. 24 * Hsinchu 300, Taiwan.
25 * Larry Finger <Larry.Finger@lwfinger.net> 25 * Larry Finger <Larry.Finger@lwfinger.net>
26 * 26 *
27 **************************************************************************** 27 *****************************************************************************/
28 */
29 28
30#ifndef __RTL92C__FW__H__ 29#ifndef __RTL92C__FW__H__
31#define __RTL92C__FW__H__ 30#define __RTL92C__FW__H__
32 31
32#define FW_8192C_SIZE 0x3000
33#define FW_8192C_START_ADDRESS 0x1000 33#define FW_8192C_START_ADDRESS 0x1000
34#define FW_8192C_END_ADDRESS 0x3FFF 34#define FW_8192C_END_ADDRESS 0x3FFF
35#define FW_8192C_PAGE_SIZE 4096 35#define FW_8192C_PAGE_SIZE 4096
36#define FW_8192C_POLLING_DELAY 5 36#define FW_8192C_POLLING_DELAY 5
37#define FW_8192C_POLLING_TIMEOUT_COUNT 6000
38 37
39#define BEACON_PG 0 38#define IS_FW_HEADER_EXIST(_pfwhdr) \
40#define PSPOLL_PG 2 39 ((_pfwhdr->signature&0xFFFF) == 0x2300 ||\
41#define NULL_PG 3 40 (_pfwhdr->signature&0xFFFF) == 0x2301 ||\
42#define PROBERSP_PG 4 /* ->5 */ 41 (_pfwhdr->signature&0xFFFF) == 0x2302)
43 42
44#define TOTAL_RESERVED_PKT_LEN 768 43#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))
45
46#define IS_FW_HEADER_EXIST(_pfwhdr) \
47 ((_pfwhdr->signature&0xFF00) == 0x2300)
48
49struct rtl8723ae_firmware_header {
50 u16 signature;
51 u8 category;
52 u8 function;
53 u16 version;
54 u8 subversion;
55 u8 rsvd1;
56 u8 month;
57 u8 date;
58 u8 hour;
59 u8 minute;
60 u16 ramcodeSize;
61 u16 rsvd2;
62 u32 svnindex;
63 u32 rsvd3;
64 u32 rsvd4;
65 u32 rsvd5;
66};
67 44
68#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \ 45#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
69 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val) 46 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
70#define SET_H2CCMD_PWRMODE_PARM_SMART_PS_23A(__ph2ccmd, __val) \ 47#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__ph2ccmd, __val) \
71 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val) 48 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
72#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__ph2ccmd, __val) \ 49#define SET_H2CCMD_PWRMODE_PARM_BCN_PASS_TIME(__ph2ccmd, __val) \
73 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val) 50 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
@@ -80,11 +57,10 @@ struct rtl8723ae_firmware_header {
80#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \ 57#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \
81 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val) 58 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
82 59
83void rtl8723ae_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, 60void rtl8723e_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
84 u32 cmd_len, u8 *p_cmdbuffer); 61 u32 cmd_len, u8 *p_cmdbuffer);
85void rtl8723ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode); 62void rtl8723e_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
86void rtl8723ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished); 63void rtl8723e_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
87void rtl8723ae_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); 64void rtl8723e_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus);
88void rtl8723ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state); 65void rtl8723e_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
89
90#endif 66#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.c
index 5b4a714f3c8c..5aac45d5a974 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -31,96 +27,102 @@
31#include "../pci.h" 27#include "../pci.h"
32#include "dm.h" 28#include "dm.h"
33#include "fw.h" 29#include "fw.h"
34#include "../rtl8723com/fw_common.h"
35#include "phy.h" 30#include "phy.h"
36#include "reg.h" 31#include "reg.h"
37#include "hal_btc.h" 32#include "hal_btc.h"
38 33
39void rtl8723ae_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw, 34static bool bt_operation_on;
40 bool reject) 35
36void rtl8723e_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,
37 bool b_reject)
41{ 38{
42} 39}
43 40
44void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw) 41void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw)
45{ 42{
46 struct rtl_priv *rtlpriv = rtl_priv(hw); 43 struct rtl_priv *rtlpriv = rtl_priv(hw);
47 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
48 struct rtl_phy *rtlphy = &(rtlpriv->phy); 44 struct rtl_phy *rtlphy = &(rtlpriv->phy);
49 45
50 if (rtlpriv->link_info.busytraffic) { 46 if (rtlpriv->link_info.busytraffic) {
51 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_IDLE; 47 rtlpriv->btcoexist.cstate &=
48 ~BT_COEX_STATE_WIFI_IDLE;
52 49
53 if (rtlpriv->link_info.tx_busy_traffic) 50 if (rtlpriv->link_info.tx_busy_traffic)
54 rtlpcipriv->bt_coexist.cstate |= 51 rtlpriv->btcoexist.cstate |=
55 BT_COEX_STATE_WIFI_UPLINK; 52 BT_COEX_STATE_WIFI_UPLINK;
56 else 53 else
57 rtlpcipriv->bt_coexist.cstate &= 54 rtlpriv->btcoexist.cstate &=
58 ~BT_COEX_STATE_WIFI_UPLINK; 55 ~BT_COEX_STATE_WIFI_UPLINK;
59 56
60 if (rtlpriv->link_info.rx_busy_traffic) 57 if (rtlpriv->link_info.rx_busy_traffic)
61 rtlpcipriv->bt_coexist.cstate |= 58 rtlpriv->btcoexist.cstate |=
62 BT_COEX_STATE_WIFI_DOWNLINK; 59 BT_COEX_STATE_WIFI_DOWNLINK;
63 else 60 else
64 rtlpcipriv->bt_coexist.cstate &= 61 rtlpriv->btcoexist.cstate &=
65 ~BT_COEX_STATE_WIFI_DOWNLINK; 62 ~BT_COEX_STATE_WIFI_DOWNLINK;
66 } else { 63 } else {
67 rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_WIFI_IDLE; 64 rtlpriv->btcoexist.cstate |= BT_COEX_STATE_WIFI_IDLE;
68 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_UPLINK; 65 rtlpriv->btcoexist.cstate &=
69 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_DOWNLINK; 66 ~BT_COEX_STATE_WIFI_UPLINK;
67 rtlpriv->btcoexist.cstate &=
68 ~BT_COEX_STATE_WIFI_DOWNLINK;
70 } 69 }
71 70
72 if (rtlpriv->mac80211.mode == WIRELESS_MODE_G || 71 if (rtlpriv->mac80211.mode == WIRELESS_MODE_G ||
73 rtlpriv->mac80211.mode == WIRELESS_MODE_B) { 72 rtlpriv->mac80211.mode == WIRELESS_MODE_B) {
74 rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_WIFI_LEGACY; 73 rtlpriv->btcoexist.cstate |=
75 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_HT20; 74 BT_COEX_STATE_WIFI_LEGACY;
76 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_HT40; 75 rtlpriv->btcoexist.cstate &=
76 ~BT_COEX_STATE_WIFI_HT20;
77 rtlpriv->btcoexist.cstate &=
78 ~BT_COEX_STATE_WIFI_HT40;
77 } else { 79 } else {
78 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_WIFI_LEGACY; 80 rtlpriv->btcoexist.cstate &=
81 ~BT_COEX_STATE_WIFI_LEGACY;
79 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 82 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
80 rtlpcipriv->bt_coexist.cstate |= 83 rtlpriv->btcoexist.cstate |=
81 BT_COEX_STATE_WIFI_HT40; 84 BT_COEX_STATE_WIFI_HT40;
82 rtlpcipriv->bt_coexist.cstate &= 85 rtlpriv->btcoexist.cstate &=
83 ~BT_COEX_STATE_WIFI_HT20; 86 ~BT_COEX_STATE_WIFI_HT20;
84 } else { 87 } else {
85 rtlpcipriv->bt_coexist.cstate |= 88 rtlpriv->btcoexist.cstate |=
86 BT_COEX_STATE_WIFI_HT20; 89 BT_COEX_STATE_WIFI_HT20;
87 rtlpcipriv->bt_coexist.cstate &= 90 rtlpriv->btcoexist.cstate &=
88 ~BT_COEX_STATE_WIFI_HT40; 91 ~BT_COEX_STATE_WIFI_HT40;
89 } 92 }
90 } 93 }
91 94
92 if (rtlpriv->bt_operation_on) 95 if (bt_operation_on)
93 rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_BT30; 96 rtlpriv->btcoexist.cstate |= BT_COEX_STATE_BT30;
94 else 97 else
95 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_BT30; 98 rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT30;
96} 99}
97 100
98u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw, 101u8 rtl8723e_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
99 u8 level_num, u8 rssi_thresh, 102 u8 level_num, u8 rssi_thresh,
100 u8 rssi_thresh1) 103 u8 rssi_thresh1)
101 104
102{ 105{
103 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
104 struct rtl_priv *rtlpriv = rtl_priv(hw); 106 struct rtl_priv *rtlpriv = rtl_priv(hw);
105 long smooth; 107 long undecoratedsmoothed_pwdb;
106 u8 bt_rssi_state = 0; 108 u8 bt_rssi_state = 0;
107 109
108 smooth = rtl8723ae_dm_bt_get_rx_ss(hw); 110 undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);
109 111
110 if (level_num == 2) { 112 if (level_num == 2) {
111 rtlpcipriv->bt_coexist.cstate &= 113 rtlpriv->btcoexist.cstate &=
112 ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM; 114 ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
113 115
114 if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state == 116 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
115 BT_RSSI_STATE_LOW) || 117 BT_RSSI_STATE_LOW) ||
116 (rtlpcipriv->bt_coexist.bt_pre_rssi_state == 118 (rtlpriv->btcoexist.bt_pre_rssi_state ==
117 BT_RSSI_STATE_STAY_LOW)) { 119 BT_RSSI_STATE_STAY_LOW)) {
118 if (smooth >= (rssi_thresh + 120 if (undecoratedsmoothed_pwdb >=
119 BT_FW_COEX_THRESH_TOL)) { 121 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
120 bt_rssi_state = BT_RSSI_STATE_HIGH; 122 bt_rssi_state = BT_RSSI_STATE_HIGH;
121 rtlpcipriv->bt_coexist.cstate |= 123 rtlpriv->btcoexist.cstate |=
122 BT_COEX_STATE_WIFI_RSSI_1_HIGH; 124 BT_COEX_STATE_WIFI_RSSI_1_HIGH;
123 rtlpcipriv->bt_coexist.cstate &= 125 rtlpriv->btcoexist.cstate &=
124 ~BT_COEX_STATE_WIFI_RSSI_1_LOW; 126 ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
125 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 127 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
126 "[DM][BT], RSSI_1 state switch to High\n"); 128 "[DM][BT], RSSI_1 state switch to High\n");
@@ -130,12 +132,12 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
130 "[DM][BT], RSSI_1 state stay at Low\n"); 132 "[DM][BT], RSSI_1 state stay at Low\n");
131 } 133 }
132 } else { 134 } else {
133 if (smooth < rssi_thresh) { 135 if (undecoratedsmoothed_pwdb < rssi_thresh) {
134 bt_rssi_state = BT_RSSI_STATE_LOW; 136 bt_rssi_state = BT_RSSI_STATE_LOW;
135 rtlpcipriv->bt_coexist.cstate |= 137 rtlpriv->btcoexist.cstate |=
136 BT_COEX_STATE_WIFI_RSSI_1_LOW; 138 BT_COEX_STATE_WIFI_RSSI_1_LOW;
137 rtlpcipriv->bt_coexist.cstate &= 139 rtlpriv->btcoexist.cstate &=
138 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH; 140 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
139 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 141 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
140 "[DM][BT], RSSI_1 state switch to Low\n"); 142 "[DM][BT], RSSI_1 state switch to Low\n");
141 } else { 143 } else {
@@ -148,22 +150,22 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
148 if (rssi_thresh > rssi_thresh1) { 150 if (rssi_thresh > rssi_thresh1) {
149 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 151 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
150 "[DM][BT], RSSI_1 thresh error!!\n"); 152 "[DM][BT], RSSI_1 thresh error!!\n");
151 return rtlpcipriv->bt_coexist.bt_pre_rssi_state; 153 return rtlpriv->btcoexist.bt_pre_rssi_state;
152 } 154 }
153 155
154 if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state == 156 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
155 BT_RSSI_STATE_LOW) || 157 BT_RSSI_STATE_LOW) ||
156 (rtlpcipriv->bt_coexist.bt_pre_rssi_state == 158 (rtlpriv->btcoexist.bt_pre_rssi_state ==
157 BT_RSSI_STATE_STAY_LOW)) { 159 BT_RSSI_STATE_STAY_LOW)) {
158 if (smooth >= 160 if (undecoratedsmoothed_pwdb >=
159 (rssi_thresh+BT_FW_COEX_THRESH_TOL)) { 161 (rssi_thresh+BT_FW_COEX_THRESH_TOL)) {
160 bt_rssi_state = BT_RSSI_STATE_MEDIUM; 162 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
161 rtlpcipriv->bt_coexist.cstate |= 163 rtlpriv->btcoexist.cstate |=
162 BT_COEX_STATE_WIFI_RSSI_1_MEDIUM; 164 BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
163 rtlpcipriv->bt_coexist.cstate &= 165 rtlpriv->btcoexist.cstate &=
164 ~BT_COEX_STATE_WIFI_RSSI_1_LOW; 166 ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
165 rtlpcipriv->bt_coexist.cstate &= 167 rtlpriv->btcoexist.cstate &=
166 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH; 168 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
167 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 169 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
168 "[DM][BT], RSSI_1 state switch to Medium\n"); 170 "[DM][BT], RSSI_1 state switch to Medium\n");
169 } else { 171 } else {
@@ -171,28 +173,28 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
171 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 173 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
172 "[DM][BT], RSSI_1 state stay at Low\n"); 174 "[DM][BT], RSSI_1 state stay at Low\n");
173 } 175 }
174 } else if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state == 176 } else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
175 BT_RSSI_STATE_MEDIUM) || 177 BT_RSSI_STATE_MEDIUM) ||
176 (rtlpcipriv->bt_coexist.bt_pre_rssi_state == 178 (rtlpriv->btcoexist.bt_pre_rssi_state ==
177 BT_RSSI_STATE_STAY_MEDIUM)) { 179 BT_RSSI_STATE_STAY_MEDIUM)) {
178 if (smooth >= (rssi_thresh1 + 180 if (undecoratedsmoothed_pwdb >=
179 BT_FW_COEX_THRESH_TOL)) { 181 (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
180 bt_rssi_state = BT_RSSI_STATE_HIGH; 182 bt_rssi_state = BT_RSSI_STATE_HIGH;
181 rtlpcipriv->bt_coexist.cstate |= 183 rtlpriv->btcoexist.cstate |=
182 BT_COEX_STATE_WIFI_RSSI_1_HIGH; 184 BT_COEX_STATE_WIFI_RSSI_1_HIGH;
183 rtlpcipriv->bt_coexist.cstate &= 185 rtlpriv->btcoexist.cstate &=
184 ~BT_COEX_STATE_WIFI_RSSI_1_LOW; 186 ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
185 rtlpcipriv->bt_coexist.cstate &= 187 rtlpriv->btcoexist.cstate &=
186 ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM; 188 ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
187 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 189 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
188 "[DM][BT], RSSI_1 state switch to High\n"); 190 "[DM][BT], RSSI_1 state switch to High\n");
189 } else if (smooth < rssi_thresh) { 191 } else if (undecoratedsmoothed_pwdb < rssi_thresh) {
190 bt_rssi_state = BT_RSSI_STATE_LOW; 192 bt_rssi_state = BT_RSSI_STATE_LOW;
191 rtlpcipriv->bt_coexist.cstate |= 193 rtlpriv->btcoexist.cstate |=
192 BT_COEX_STATE_WIFI_RSSI_1_LOW; 194 BT_COEX_STATE_WIFI_RSSI_1_LOW;
193 rtlpcipriv->bt_coexist.cstate &= 195 rtlpriv->btcoexist.cstate &=
194 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH; 196 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
195 rtlpcipriv->bt_coexist.cstate &= 197 rtlpriv->btcoexist.cstate &=
196 ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM; 198 ~BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
197 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 199 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
198 "[DM][BT], RSSI_1 state switch to Low\n"); 200 "[DM][BT], RSSI_1 state switch to Low\n");
@@ -202,13 +204,13 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
202 "[DM][BT], RSSI_1 state stay at Medium\n"); 204 "[DM][BT], RSSI_1 state stay at Medium\n");
203 } 205 }
204 } else { 206 } else {
205 if (smooth < rssi_thresh1) { 207 if (undecoratedsmoothed_pwdb < rssi_thresh1) {
206 bt_rssi_state = BT_RSSI_STATE_MEDIUM; 208 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
207 rtlpcipriv->bt_coexist.cstate |= 209 rtlpriv->btcoexist.cstate |=
208 BT_COEX_STATE_WIFI_RSSI_1_MEDIUM; 210 BT_COEX_STATE_WIFI_RSSI_1_MEDIUM;
209 rtlpcipriv->bt_coexist.cstate &= 211 rtlpriv->btcoexist.cstate &=
210 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH; 212 ~BT_COEX_STATE_WIFI_RSSI_1_HIGH;
211 rtlpcipriv->bt_coexist.cstate &= 213 rtlpriv->btcoexist.cstate &=
212 ~BT_COEX_STATE_WIFI_RSSI_1_LOW; 214 ~BT_COEX_STATE_WIFI_RSSI_1_LOW;
213 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 215 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
214 "[DM][BT], RSSI_1 state switch to Medium\n"); 216 "[DM][BT], RSSI_1 state switch to Medium\n");
@@ -219,38 +221,37 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
219 } 221 }
220 } 222 }
221 } 223 }
222 224 rtlpriv->btcoexist.bt_pre_rssi_state1 = bt_rssi_state;
223 rtlpcipriv->bt_coexist.bt_pre_rssi_state1 = bt_rssi_state;
224 225
225 return bt_rssi_state; 226 return bt_rssi_state;
226} 227}
227 228
228u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw, 229u8 rtl8723e_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
229 u8 level_num, u8 rssi_thresh, 230 u8 level_num,
230 u8 rssi_thresh1) 231 u8 rssi_thresh,
232 u8 rssi_thresh1)
231{ 233{
232 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
233 struct rtl_priv *rtlpriv = rtl_priv(hw); 234 struct rtl_priv *rtlpriv = rtl_priv(hw);
234 long smooth; 235 long undecoratedsmoothed_pwdb = 0;
235 u8 bt_rssi_state = 0; 236 u8 bt_rssi_state = 0;
236 237
237 smooth = rtl8723ae_dm_bt_get_rx_ss(hw); 238 undecoratedsmoothed_pwdb = rtl8723e_dm_bt_get_rx_ss(hw);
238 239
239 if (level_num == 2) { 240 if (level_num == 2) {
240 rtlpcipriv->bt_coexist.cstate &= 241 rtlpriv->btcoexist.cstate &=
241 ~BT_COEX_STATE_WIFI_RSSI_MEDIUM; 242 ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
242 243
243 if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state == 244 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
244 BT_RSSI_STATE_LOW) || 245 BT_RSSI_STATE_LOW) ||
245 (rtlpcipriv->bt_coexist.bt_pre_rssi_state == 246 (rtlpriv->btcoexist.bt_pre_rssi_state ==
246 BT_RSSI_STATE_STAY_LOW)){ 247 BT_RSSI_STATE_STAY_LOW)) {
247 if (smooth >= 248 if (undecoratedsmoothed_pwdb >=
248 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) { 249 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
249 bt_rssi_state = BT_RSSI_STATE_HIGH; 250 bt_rssi_state = BT_RSSI_STATE_HIGH;
250 rtlpcipriv->bt_coexist.cstate |= 251 rtlpriv->btcoexist.cstate
251 BT_COEX_STATE_WIFI_RSSI_HIGH; 252 |= BT_COEX_STATE_WIFI_RSSI_HIGH;
252 rtlpcipriv->bt_coexist.cstate &= 253 rtlpriv->btcoexist.cstate
253 ~BT_COEX_STATE_WIFI_RSSI_LOW; 254 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
254 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 255 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
255 "[DM][BT], RSSI state switch to High\n"); 256 "[DM][BT], RSSI state switch to High\n");
256 } else { 257 } else {
@@ -259,12 +260,12 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
259 "[DM][BT], RSSI state stay at Low\n"); 260 "[DM][BT], RSSI state stay at Low\n");
260 } 261 }
261 } else { 262 } else {
262 if (smooth < rssi_thresh) { 263 if (undecoratedsmoothed_pwdb < rssi_thresh) {
263 bt_rssi_state = BT_RSSI_STATE_LOW; 264 bt_rssi_state = BT_RSSI_STATE_LOW;
264 rtlpcipriv->bt_coexist.cstate |= 265 rtlpriv->btcoexist.cstate
265 BT_COEX_STATE_WIFI_RSSI_LOW; 266 |= BT_COEX_STATE_WIFI_RSSI_LOW;
266 rtlpcipriv->bt_coexist.cstate &= 267 rtlpriv->btcoexist.cstate
267 ~BT_COEX_STATE_WIFI_RSSI_HIGH; 268 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
268 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 269 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
269 "[DM][BT], RSSI state switch to Low\n"); 270 "[DM][BT], RSSI state switch to Low\n");
270 } else { 271 } else {
@@ -277,20 +278,20 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
277 if (rssi_thresh > rssi_thresh1) { 278 if (rssi_thresh > rssi_thresh1) {
278 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 279 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
279 "[DM][BT], RSSI thresh error!!\n"); 280 "[DM][BT], RSSI thresh error!!\n");
280 return rtlpcipriv->bt_coexist.bt_pre_rssi_state; 281 return rtlpriv->btcoexist.bt_pre_rssi_state;
281 } 282 }
282 if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state == 283 if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
283 BT_RSSI_STATE_LOW) || 284 BT_RSSI_STATE_LOW) ||
284 (rtlpcipriv->bt_coexist.bt_pre_rssi_state == 285 (rtlpriv->btcoexist.bt_pre_rssi_state ==
285 BT_RSSI_STATE_STAY_LOW)) { 286 BT_RSSI_STATE_STAY_LOW)) {
286 if (smooth >= 287 if (undecoratedsmoothed_pwdb >=
287 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) { 288 (rssi_thresh + BT_FW_COEX_THRESH_TOL)) {
288 bt_rssi_state = BT_RSSI_STATE_MEDIUM; 289 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
289 rtlpcipriv->bt_coexist.cstate 290 rtlpriv->btcoexist.cstate
290 |= BT_COEX_STATE_WIFI_RSSI_MEDIUM; 291 |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
291 rtlpcipriv->bt_coexist.cstate 292 rtlpriv->btcoexist.cstate
292 &= ~BT_COEX_STATE_WIFI_RSSI_LOW; 293 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
293 rtlpcipriv->bt_coexist.cstate 294 rtlpriv->btcoexist.cstate
294 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH; 295 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
295 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 296 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
296 "[DM][BT], RSSI state switch to Medium\n"); 297 "[DM][BT], RSSI state switch to Medium\n");
@@ -299,28 +300,28 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
299 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 300 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
300 "[DM][BT], RSSI state stay at Low\n"); 301 "[DM][BT], RSSI state stay at Low\n");
301 } 302 }
302 } else if ((rtlpcipriv->bt_coexist.bt_pre_rssi_state == 303 } else if ((rtlpriv->btcoexist.bt_pre_rssi_state ==
303 BT_RSSI_STATE_MEDIUM) || 304 BT_RSSI_STATE_MEDIUM) ||
304 (rtlpcipriv->bt_coexist.bt_pre_rssi_state == 305 (rtlpriv->btcoexist.bt_pre_rssi_state ==
305 BT_RSSI_STATE_STAY_MEDIUM)) { 306 BT_RSSI_STATE_STAY_MEDIUM)) {
306 if (smooth >= 307 if (undecoratedsmoothed_pwdb >=
307 (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) { 308 (rssi_thresh1 + BT_FW_COEX_THRESH_TOL)) {
308 bt_rssi_state = BT_RSSI_STATE_HIGH; 309 bt_rssi_state = BT_RSSI_STATE_HIGH;
309 rtlpcipriv->bt_coexist.cstate 310 rtlpriv->btcoexist.cstate
310 |= BT_COEX_STATE_WIFI_RSSI_HIGH; 311 |= BT_COEX_STATE_WIFI_RSSI_HIGH;
311 rtlpcipriv->bt_coexist.cstate 312 rtlpriv->btcoexist.cstate
312 &= ~BT_COEX_STATE_WIFI_RSSI_LOW; 313 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
313 rtlpcipriv->bt_coexist.cstate 314 rtlpriv->btcoexist.cstate
314 &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM; 315 &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
315 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 316 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
316 "[DM][BT], RSSI state switch to High\n"); 317 "[DM][BT], RSSI state switch to High\n");
317 } else if (smooth < rssi_thresh) { 318 } else if (undecoratedsmoothed_pwdb < rssi_thresh) {
318 bt_rssi_state = BT_RSSI_STATE_LOW; 319 bt_rssi_state = BT_RSSI_STATE_LOW;
319 rtlpcipriv->bt_coexist.cstate 320 rtlpriv->btcoexist.cstate
320 |= BT_COEX_STATE_WIFI_RSSI_LOW; 321 |= BT_COEX_STATE_WIFI_RSSI_LOW;
321 rtlpcipriv->bt_coexist.cstate 322 rtlpriv->btcoexist.cstate
322 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH; 323 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
323 rtlpcipriv->bt_coexist.cstate 324 rtlpriv->btcoexist.cstate
324 &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM; 325 &= ~BT_COEX_STATE_WIFI_RSSI_MEDIUM;
325 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 326 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
326 "[DM][BT], RSSI state switch to Low\n"); 327 "[DM][BT], RSSI state switch to Low\n");
@@ -330,13 +331,13 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
330 "[DM][BT], RSSI state stay at Medium\n"); 331 "[DM][BT], RSSI state stay at Medium\n");
331 } 332 }
332 } else { 333 } else {
333 if (smooth < rssi_thresh1) { 334 if (undecoratedsmoothed_pwdb < rssi_thresh1) {
334 bt_rssi_state = BT_RSSI_STATE_MEDIUM; 335 bt_rssi_state = BT_RSSI_STATE_MEDIUM;
335 rtlpcipriv->bt_coexist.cstate 336 rtlpriv->btcoexist.cstate
336 |= BT_COEX_STATE_WIFI_RSSI_MEDIUM; 337 |= BT_COEX_STATE_WIFI_RSSI_MEDIUM;
337 rtlpcipriv->bt_coexist.cstate 338 rtlpriv->btcoexist.cstate
338 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH; 339 &= ~BT_COEX_STATE_WIFI_RSSI_HIGH;
339 rtlpcipriv->bt_coexist.cstate 340 rtlpriv->btcoexist.cstate
340 &= ~BT_COEX_STATE_WIFI_RSSI_LOW; 341 &= ~BT_COEX_STATE_WIFI_RSSI_LOW;
341 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 342 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
342 "[DM][BT], RSSI state switch to Medium\n"); 343 "[DM][BT], RSSI state switch to Medium\n");
@@ -347,31 +348,32 @@ u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
347 } 348 }
348 } 349 }
349 } 350 }
350 351 rtlpriv->btcoexist.bt_pre_rssi_state = bt_rssi_state;
351 rtlpcipriv->bt_coexist.bt_pre_rssi_state = bt_rssi_state;
352 return bt_rssi_state; 352 return bt_rssi_state;
353} 353}
354 354
355long rtl8723ae_dm_bt_get_rx_ss(struct ieee80211_hw *hw) 355long rtl8723e_dm_bt_get_rx_ss(struct ieee80211_hw *hw)
356{ 356{
357 struct rtl_priv *rtlpriv = rtl_priv(hw); 357 struct rtl_priv *rtlpriv = rtl_priv(hw);
358 long smooth = 0; 358 long undecoratedsmoothed_pwdb = 0;
359
360 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED)
361 smooth = GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
362 else
363 smooth = rtlpriv->dm.entry_min_undec_sm_pwdb;
364 359
360 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
361 undecoratedsmoothed_pwdb =
362 GET_UNDECORATED_AVERAGE_RSSI(rtlpriv);
363 } else {
364 undecoratedsmoothed_pwdb
365 = rtlpriv->dm.entry_min_undec_sm_pwdb;
366 }
365 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 367 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
366 "rtl8723ae_dm_bt_get_rx_ss() = %ld\n", smooth); 368 "rtl8723e_dm_bt_get_rx_ss() = %ld\n",
369 undecoratedsmoothed_pwdb);
367 370
368 return smooth; 371 return undecoratedsmoothed_pwdb;
369} 372}
370 373
371void rtl8723ae_dm_bt_balance(struct ieee80211_hw *hw, 374void rtl8723e_dm_bt_balance(struct ieee80211_hw *hw,
372 bool balance_on, u8 ms0, u8 ms1) 375 bool balance_on, u8 ms0, u8 ms1)
373{ 376{
374 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
375 struct rtl_priv *rtlpriv = rtl_priv(hw); 377 struct rtl_priv *rtlpriv = rtl_priv(hw);
376 u8 h2c_parameter[3] = {0}; 378 u8 h2c_parameter[3] = {0};
377 379
@@ -379,27 +381,26 @@ void rtl8723ae_dm_bt_balance(struct ieee80211_hw *hw,
379 h2c_parameter[2] = 1; 381 h2c_parameter[2] = 1;
380 h2c_parameter[1] = ms1; 382 h2c_parameter[1] = ms1;
381 h2c_parameter[0] = ms0; 383 h2c_parameter[0] = ms0;
382 rtlpcipriv->bt_coexist.fw_coexist_all_off = false; 384 rtlpriv->btcoexist.fw_coexist_all_off = false;
383 } else { 385 } else {
384 h2c_parameter[2] = 0; 386 h2c_parameter[2] = 0;
385 h2c_parameter[1] = 0; 387 h2c_parameter[1] = 0;
386 h2c_parameter[0] = 0; 388 h2c_parameter[0] = 0;
387 } 389 }
388 rtlpcipriv->bt_coexist.balance_on = balance_on; 390 rtlpriv->btcoexist.balance_on = balance_on;
389 391
390 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 392 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
391 "[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n", 393 "[DM][BT], Balance=[%s:%dms:%dms], write 0xc=0x%x\n",
392 balance_on ? "ON" : "OFF", ms0, ms1, 394 balance_on ? "ON" : "OFF", ms0, ms1, h2c_parameter[0]<<16 |
393 h2c_parameter[0]<<16 | h2c_parameter[1]<<8 | h2c_parameter[2]); 395 h2c_parameter[1]<<8 | h2c_parameter[2]);
394 396
395 rtl8723ae_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter); 397 rtl8723e_fill_h2c_cmd(hw, 0xc, 3, h2c_parameter);
396} 398}
397 399
398 400
399void rtl8723ae_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type) 401void rtl8723e_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
400{ 402{
401 struct rtl_priv *rtlpriv = rtl_priv(hw); 403 struct rtl_priv *rtlpriv = rtl_priv(hw);
402 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
403 404
404 if (type == BT_AGCTABLE_OFF) { 405 if (type == BT_AGCTABLE_OFF) {
405 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 406 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
@@ -410,15 +411,15 @@ void rtl8723ae_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
410 rtl_write_dword(rtlpriv, 0xc78, 0x611f0001); 411 rtl_write_dword(rtlpriv, 0xc78, 0x611f0001);
411 rtl_write_dword(rtlpriv, 0xc78, 0x60200001); 412 rtl_write_dword(rtlpriv, 0xc78, 0x60200001);
412 413
413 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 414 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
414 RF_RX_AGC_HP, 0xfffff, 0x32000); 415 RF_RX_AGC_HP, 0xfffff, 0x32000);
415 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 416 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
416 RF_RX_AGC_HP, 0xfffff, 0x71000); 417 RF_RX_AGC_HP, 0xfffff, 0x71000);
417 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 418 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
418 RF_RX_AGC_HP, 0xfffff, 0xb0000); 419 RF_RX_AGC_HP, 0xfffff, 0xb0000);
419 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 420 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
420 RF_RX_AGC_HP, 0xfffff, 0xfc000); 421 RF_RX_AGC_HP, 0xfffff, 0xfc000);
421 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 422 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
422 RF_RX_G1, 0xfffff, 0x30355); 423 RF_RX_G1, 0xfffff, 0x30355);
423 } else if (type == BT_AGCTABLE_ON) { 424 } else if (type == BT_AGCTABLE_ON) {
424 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 425 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
@@ -429,25 +430,24 @@ void rtl8723ae_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type)
429 rtl_write_dword(rtlpriv, 0xc78, 0x4b1f0001); 430 rtl_write_dword(rtlpriv, 0xc78, 0x4b1f0001);
430 rtl_write_dword(rtlpriv, 0xc78, 0x4a200001); 431 rtl_write_dword(rtlpriv, 0xc78, 0x4a200001);
431 432
432 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 433 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
433 RF_RX_AGC_HP, 0xfffff, 0xdc000); 434 RF_RX_AGC_HP, 0xfffff, 0xdc000);
434 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 435 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
435 RF_RX_AGC_HP, 0xfffff, 0x90000); 436 RF_RX_AGC_HP, 0xfffff, 0x90000);
436 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 437 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
437 RF_RX_AGC_HP, 0xfffff, 0x51000); 438 RF_RX_AGC_HP, 0xfffff, 0x51000);
438 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 439 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
439 RF_RX_AGC_HP, 0xfffff, 0x12000); 440 RF_RX_AGC_HP, 0xfffff, 0x12000);
440 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 441 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A,
441 RF_RX_G1, 0xfffff, 0x00355); 442 RF_RX_G1, 0xfffff, 0x00355);
442 443
443 rtlpcipriv->bt_coexist.sw_coexist_all_off = false; 444 rtlpriv->btcoexist.sw_coexist_all_off = false;
444 } 445 }
445} 446}
446 447
447void rtl8723ae_dm_bt_bback_off_level(struct ieee80211_hw *hw, u8 type) 448void rtl8723e_dm_bt_bb_back_off_level(struct ieee80211_hw *hw, u8 type)
448{ 449{
449 struct rtl_priv *rtlpriv = rtl_priv(hw); 450 struct rtl_priv *rtlpriv = rtl_priv(hw);
450 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
451 451
452 if (type == BT_BB_BACKOFF_OFF) { 452 if (type == BT_BB_BACKOFF_OFF) {
453 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 453 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
@@ -457,87 +457,81 @@ void rtl8723ae_dm_bt_bback_off_level(struct ieee80211_hw *hw, u8 type)
457 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 457 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
458 "[BT]BBBackOffLevel On!\n"); 458 "[BT]BBBackOffLevel On!\n");
459 rtl_write_dword(rtlpriv, 0xc04, 0x3a07611); 459 rtl_write_dword(rtlpriv, 0xc04, 0x3a07611);
460 rtlpcipriv->bt_coexist.sw_coexist_all_off = false; 460 rtlpriv->btcoexist.sw_coexist_all_off = false;
461 } 461 }
462} 462}
463 463
464void rtl8723ae_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw) 464void rtl8723e_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw)
465{ 465{
466 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
467 struct rtl_priv *rtlpriv = rtl_priv(hw); 466 struct rtl_priv *rtlpriv = rtl_priv(hw);
468 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 467 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
469 "rtl8723ae_dm_bt_fw_coex_all_off()\n"); 468 "rtl8723e_dm_bt_fw_coex_all_off()\n");
470 469
471 if (rtlpcipriv->bt_coexist.fw_coexist_all_off) 470 if (rtlpriv->btcoexist.fw_coexist_all_off)
472 return; 471 return;
473 472
474 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 473 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
475 "rtl8723ae_dm_bt_fw_coex_all_off(), real Do\n"); 474 "rtl8723e_dm_bt_fw_coex_all_off(), real Do\n");
476 rtl8723ae_dm_bt_fw_coex_all_off_8723a(hw); 475 rtl8723e_dm_bt_fw_coex_all_off_8723a(hw);
477 rtlpcipriv->bt_coexist.fw_coexist_all_off = true; 476 rtlpriv->btcoexist.fw_coexist_all_off = true;
478} 477}
479 478
480void rtl8723ae_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw) 479void rtl8723e_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw)
481{ 480{
482 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
483 struct rtl_priv *rtlpriv = rtl_priv(hw); 481 struct rtl_priv *rtlpriv = rtl_priv(hw);
484 482
485 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 483 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
486 "rtl8723ae_dm_bt_sw_coex_all_off()\n"); 484 "rtl8723e_dm_bt_sw_coex_all_off()\n");
487 485
488 if (rtlpcipriv->bt_coexist.sw_coexist_all_off) 486 if (rtlpriv->btcoexist.sw_coexist_all_off)
489 return; 487 return;
490 488
491 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 489 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
492 "rtl8723ae_dm_bt_sw_coex_all_off(), real Do\n"); 490 "rtl8723e_dm_bt_sw_coex_all_off(), real Do\n");
493 rtl8723ae_dm_bt_sw_coex_all_off_8723a(hw); 491 rtl8723e_dm_bt_sw_coex_all_off_8723a(hw);
494 rtlpcipriv->bt_coexist.sw_coexist_all_off = true; 492 rtlpriv->btcoexist.sw_coexist_all_off = true;
495} 493}
496 494
497void rtl8723ae_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw) 495void rtl8723e_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw)
498{ 496{
499 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
500 struct rtl_priv *rtlpriv = rtl_priv(hw); 497 struct rtl_priv *rtlpriv = rtl_priv(hw);
501 498
502 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 499 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
503 "rtl8723ae_dm_bt_hw_coex_all_off()\n"); 500 "rtl8723e_dm_bt_hw_coex_all_off()\n");
504 501
505 if (rtlpcipriv->bt_coexist.hw_coexist_all_off) 502 if (rtlpriv->btcoexist.hw_coexist_all_off)
506 return; 503 return;
507 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 504 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
508 "rtl8723ae_dm_bt_hw_coex_all_off(), real Do\n"); 505 "rtl8723e_dm_bt_hw_coex_all_off(), real Do\n");
509 506
510 rtl8723ae_dm_bt_hw_coex_all_off_8723a(hw); 507 rtl8723e_dm_bt_hw_coex_all_off_8723a(hw);
511 508
512 rtlpcipriv->bt_coexist.hw_coexist_all_off = true; 509 rtlpriv->btcoexist.hw_coexist_all_off = true;
513} 510}
514 511
515void rtl8723ae_btdm_coex_all_off(struct ieee80211_hw *hw) 512void rtl8723e_btdm_coex_all_off(struct ieee80211_hw *hw)
516{ 513{
517 rtl8723ae_dm_bt_fw_coex_all_off(hw); 514 rtl8723e_dm_bt_fw_coex_all_off(hw);
518 rtl8723ae_dm_bt_sw_coex_all_off(hw); 515 rtl8723e_dm_bt_sw_coex_all_off(hw);
519 rtl8723ae_dm_bt_hw_coex_all_off(hw); 516 rtl8723e_dm_bt_hw_coex_all_off(hw);
520} 517}
521 518
522bool rtl8723ae_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw) 519bool rtl8723e_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw)
523{ 520{
524 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); 521 struct rtl_priv *rtlpriv = rtl_priv(hw);
525 522
526 if ((rtlpcipriv->bt_coexist.previous_state == 523 if ((rtlpriv->btcoexist.previous_state == rtlpriv->btcoexist.cstate) &&
527 rtlpcipriv->bt_coexist.cstate) && 524 (rtlpriv->btcoexist.previous_state_h ==
528 (rtlpcipriv->bt_coexist.previous_state_h == 525 rtlpriv->btcoexist.cstate_h))
529 rtlpcipriv->bt_coexist.cstate_h))
530 return false; 526 return false;
531 else 527 return true;
532 return true;
533} 528}
534 529
535bool rtl8723ae_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw) 530bool rtl8723e_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw)
536{ 531{
537 struct rtl_priv *rtlpriv = rtl_priv(hw); 532 struct rtl_priv *rtlpriv = rtl_priv(hw);
538 533
539 if (rtlpriv->link_info.tx_busy_traffic) 534 if (rtlpriv->link_info.tx_busy_traffic)
540 return true; 535 return true;
541 else 536 return false;
542 return false;
543} 537}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.h b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.h
index 76f4d122dbc1..bcd64a22acc0 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_bt_coexist.h
@@ -53,8 +53,8 @@
53#define BT_COEX_STATE_WIFI_LEGACY BIT(3) 53#define BT_COEX_STATE_WIFI_LEGACY BIT(3)
54 54
55#define BT_COEX_STATE_WIFI_RSSI_LOW BIT(4) 55#define BT_COEX_STATE_WIFI_RSSI_LOW BIT(4)
56#define BT_COEX_STATE_WIFI_RSSI_MEDIUM BIT(5) 56#define BT_COEX_STATE_WIFI_RSSI_MEDIUM BIT(5)
57#define BT_COEX_STATE_WIFI_RSSI_HIGH BIT(6) 57#define BT_COEX_STATE_WIFI_RSSI_HIGH BIT(6)
58#define BT_COEX_STATE_DEC_BT_POWER BIT(7) 58#define BT_COEX_STATE_DEC_BT_POWER BIT(7)
59 59
60#define BT_COEX_STATE_WIFI_IDLE BIT(8) 60#define BT_COEX_STATE_WIFI_IDLE BIT(8)
@@ -78,7 +78,7 @@
78#define BT_COEX_STATE_WIFI_RSSI_1_MEDIUM BIT(25) 78#define BT_COEX_STATE_WIFI_RSSI_1_MEDIUM BIT(25)
79#define BT_COEX_STATE_WIFI_RSSI_1_HIGH BIT(26) 79#define BT_COEX_STATE_WIFI_RSSI_1_HIGH BIT(26)
80 80
81#define BT_COEX_STATE_BTINFO_COMMON BIT(30) 81#define BT_COEX_STATE_BTINFO_COMMON BIT(30)
82#define BT_COEX_STATE_BTINFO_B_HID_SCOESCO BIT(31) 82#define BT_COEX_STATE_BTINFO_B_HID_SCOESCO BIT(31)
83#define BT_COEX_STATE_BTINFO_B_FTP_A2DP BIT(29) 83#define BT_COEX_STATE_BTINFO_B_FTP_A2DP BIT(29)
84 84
@@ -133,28 +133,26 @@
133#define BTINFO_B_SCO_ESCO BIT(1) 133#define BTINFO_B_SCO_ESCO BIT(1)
134#define BTINFO_B_CONNECTION BIT(0) 134#define BTINFO_B_CONNECTION BIT(0)
135 135
136void rtl8723e_btdm_coex_all_off(struct ieee80211_hw *hw);
137void rtl8723e_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw);
136 138
137void rtl8723ae_btdm_coex_all_off(struct ieee80211_hw *hw); 139void rtl8723e_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw);
138void rtl8723ae_dm_bt_fw_coex_all_off(struct ieee80211_hw *hw); 140void rtl8723e_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw);
139 141long rtl8723e_dm_bt_get_rx_ss(struct ieee80211_hw *hw);
140void rtl8723ae_dm_bt_sw_coex_all_off(struct ieee80211_hw *hw); 142void rtl8723e_dm_bt_balance(struct ieee80211_hw *hw,
141void rtl8723ae_dm_bt_hw_coex_all_off(struct ieee80211_hw *hw);
142long rtl8723ae_dm_bt_get_rx_ss(struct ieee80211_hw *hw);
143void rtl8723ae_dm_bt_balance(struct ieee80211_hw *hw,
144 bool balance_on, u8 ms0, u8 ms1); 143 bool balance_on, u8 ms0, u8 ms1);
145void rtl8723ae_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type); 144void rtl8723e_dm_bt_agc_table(struct ieee80211_hw *hw, u8 tyep);
146void rtl8723ae_dm_bt_bback_off_level(struct ieee80211_hw *hw, u8 type); 145void rtl8723e_dm_bt_bb_back_off_level(struct ieee80211_hw *hw, u8 type);
147u8 rtl8723ae_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw, 146u8 rtl8723e_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw,
148 u8 level_num, u8 rssi_thresh, 147 u8 level_num, u8 rssi_thresh,
149 u8 rssi_thresh1); 148 u8 rssi_thresh1);
150u8 rtl8723ae_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw, 149u8 rtl8723e_dm_bt_check_coex_rssi_state1(struct ieee80211_hw *hw,
151 u8 level_num, u8 rssi_thresh, 150 u8 level_num, u8 rssi_thresh,
152 u8 rssi_thresh1); 151 u8 rssi_thresh1);
153void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw); 152void _rtl8723_dm_bt_check_wifi_state(struct ieee80211_hw *hw);
154void rtl8723ae_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw, 153void rtl8723e_dm_bt_reject_ap_aggregated_packet(struct ieee80211_hw *hw,
155 bool reject); 154 bool b_reject);
156 155bool rtl8723e_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw);
157bool rtl8723ae_dm_bt_is_coexist_state_changed(struct ieee80211_hw *hw); 156bool rtl8723e_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw);
158bool rtl8723ae_dm_bt_is_wifi_up_link(struct ieee80211_hw *hw);
159 157
160#endif 158#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.c
index f76c50f5ab80..00a0531cc5f4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -25,34 +21,33 @@
25 * 21 *
26 * Larry Finger <Larry.Finger@lwfinger.net> 22 * Larry Finger <Larry.Finger@lwfinger.net>
27 * 23 *
28 **************************************************************************** 24 *****************************************************************************/
29 */
30#include "hal_btc.h" 25#include "hal_btc.h"
31#include "../pci.h" 26#include "../pci.h"
32#include "phy.h" 27#include "phy.h"
33#include "../rtl8723com/phy_common.h"
34#include "fw.h" 28#include "fw.h"
35#include "../rtl8723com/fw_common.h"
36#include "reg.h" 29#include "reg.h"
37#include "def.h" 30#include "def.h"
31#include "../rtl8723com/phy_common.h"
32
33static struct bt_coexist_8723 hal_coex_8723;
38 34
39void rtl8723ae_bt_coex_off_before_lps(struct ieee80211_hw *hw) 35void rtl8723e_dm_bt_turn_off_bt_coexist_before_enter_lps(struct ieee80211_hw *hw)
40{ 36{
41 struct rtl_priv *rtlpriv = rtl_priv(hw); 37 struct rtl_priv *rtlpriv = rtl_priv(hw);
42 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
43 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 38 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
44 39
45 if (!rtlpcipriv->bt_coexist.bt_coexistence) 40 if (!rtlpriv->btcoexist.bt_coexistence)
46 return; 41 return;
47 42
48 if (ppsc->inactiveps) { 43 if (ppsc->inactiveps) {
49 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 44 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
50 "[BT][DM], Before enter IPS, turn off all Coexist DM\n"); 45 "[BT][DM], Before enter IPS, turn off all Coexist DM\n");
51 rtlpcipriv->bt_coexist.cstate = 0; 46 rtlpriv->btcoexist.cstate = 0;
52 rtlpcipriv->bt_coexist.previous_state = 0; 47 rtlpriv->btcoexist.previous_state = 0;
53 rtlpcipriv->bt_coexist.cstate_h = 0; 48 rtlpriv->btcoexist.cstate_h = 0;
54 rtlpcipriv->bt_coexist.previous_state_h = 0; 49 rtlpriv->btcoexist.previous_state_h = 0;
55 rtl8723ae_btdm_coex_all_off(hw); 50 rtl8723e_btdm_coex_all_off(hw);
56 } 51 }
57} 52}
58 53
@@ -60,10 +55,8 @@ static enum rt_media_status mgnt_link_status_query(struct ieee80211_hw *hw)
60{ 55{
61 struct rtl_priv *rtlpriv = rtl_priv(hw); 56 struct rtl_priv *rtlpriv = rtl_priv(hw);
62 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 57 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
63 enum rt_media_status m_status = RT_MEDIA_DISCONNECT; 58 enum rt_media_status m_status = RT_MEDIA_DISCONNECT;
64
65 u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0; 59 u8 bibss = (mac->opmode == NL80211_IFTYPE_ADHOC) ? 1 : 0;
66
67 if (bibss || rtlpriv->mac80211.link_state >= MAC80211_LINKED) 60 if (bibss || rtlpriv->mac80211.link_state >= MAC80211_LINKED)
68 m_status = RT_MEDIA_CONNECT; 61 m_status = RT_MEDIA_CONNECT;
69 62
@@ -71,15 +64,14 @@ static enum rt_media_status mgnt_link_status_query(struct ieee80211_hw *hw)
71} 64}
72 65
73void rtl_8723e_bt_wifi_media_status_notify(struct ieee80211_hw *hw, 66void rtl_8723e_bt_wifi_media_status_notify(struct ieee80211_hw *hw,
74 bool mstatus) 67 bool mstatus)
75{ 68{
76 struct rtl_priv *rtlpriv = rtl_priv(hw); 69 struct rtl_priv *rtlpriv = rtl_priv(hw);
77 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
78 struct rtl_phy *rtlphy = &(rtlpriv->phy); 70 struct rtl_phy *rtlphy = &(rtlpriv->phy);
79 u8 h2c_parameter[3] = {0}; 71 u8 h2c_parameter[3] = {0};
80 u8 chnl; 72 u8 chnl;
81 73
82 if (!rtlpcipriv->bt_coexist.bt_coexistence) 74 if (!rtlpriv->btcoexist.bt_coexistence)
83 return; 75 return;
84 76
85 if (RT_MEDIA_CONNECT == mstatus) 77 if (RT_MEDIA_CONNECT == mstatus)
@@ -98,14 +90,13 @@ void rtl_8723e_bt_wifi_media_status_notify(struct ieee80211_hw *hw,
98 h2c_parameter[2] = 0x20; 90 h2c_parameter[2] = 0x20;
99 91
100 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 92 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
101 "[BTCoex], FW write 0x19 = 0x%x\n", 93 "[BTCoex], FW write 0x19=0x%x\n",
102 h2c_parameter[0]<<16|h2c_parameter[1]<<8|h2c_parameter[2]); 94 h2c_parameter[0]<<16|h2c_parameter[1]<<8|h2c_parameter[2]);
103 95
104 rtl8723ae_fill_h2c_cmd(hw, 0x19, 3, h2c_parameter); 96 rtl8723e_fill_h2c_cmd(hw, 0x19, 3, h2c_parameter);
105
106} 97}
107 98
108static bool rtl8723ae_dm_bt_is_wifi_busy(struct ieee80211_hw *hw) 99static bool rtl8723e_dm_bt_is_wifi_busy(struct ieee80211_hw *hw)
109{ 100{
110 struct rtl_priv *rtlpriv = rtl_priv(hw); 101 struct rtl_priv *rtlpriv = rtl_priv(hw);
111 if (rtlpriv->link_info.busytraffic || 102 if (rtlpriv->link_info.busytraffic ||
@@ -116,12 +107,12 @@ static bool rtl8723ae_dm_bt_is_wifi_busy(struct ieee80211_hw *hw)
116 return false; 107 return false;
117} 108}
118 109
119static void rtl8723ae_dm_bt_set_fw_3a(struct ieee80211_hw *hw, 110static void rtl8723e_dm_bt_set_fw_3a(struct ieee80211_hw *hw,
120 u8 byte1, u8 byte2, u8 byte3, 111 u8 byte1, u8 byte2, u8 byte3, u8 byte4,
121 u8 byte4, u8 byte5) 112 u8 byte5)
122{ 113{
123 struct rtl_priv *rtlpriv = rtl_priv(hw); 114 struct rtl_priv *rtlpriv = rtl_priv(hw);
124 u8 h2c_parameter[5] = {0}; 115 u8 h2c_parameter[5];
125 116
126 h2c_parameter[0] = byte1; 117 h2c_parameter[0] = byte1;
127 h2c_parameter[1] = byte2; 118 h2c_parameter[1] = byte2;
@@ -129,37 +120,37 @@ static void rtl8723ae_dm_bt_set_fw_3a(struct ieee80211_hw *hw,
129 h2c_parameter[3] = byte4; 120 h2c_parameter[3] = byte4;
130 h2c_parameter[4] = byte5; 121 h2c_parameter[4] = byte5;
131 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 122 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
132 "[BTCoex], FW write 0x3a(4bytes) = 0x%x%8x\n", 123 "[BTCoex], FW write 0x3a(4bytes)=0x%x%8x\n",
133 h2c_parameter[0], h2c_parameter[1]<<24 | h2c_parameter[2]<<16 | 124 h2c_parameter[0], h2c_parameter[1]<<24 |
134 h2c_parameter[3]<<8 | h2c_parameter[4]); 125 h2c_parameter[2]<<16 | h2c_parameter[3]<<8 |
135 rtl8723ae_fill_h2c_cmd(hw, 0x3a, 5, h2c_parameter); 126 h2c_parameter[4]);
127 rtl8723e_fill_h2c_cmd(hw, 0x3a, 5, h2c_parameter);
136} 128}
137 129
138static bool rtl8723ae_dm_bt_need_to_dec_bt_pwr(struct ieee80211_hw *hw) 130static bool rtl8723e_dm_bt_need_to_dec_bt_pwr(struct ieee80211_hw *hw)
139{ 131{
140 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
141 struct rtl_priv *rtlpriv = rtl_priv(hw); 132 struct rtl_priv *rtlpriv = rtl_priv(hw);
142 133
143 if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) { 134 if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) {
144 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 135 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
145 "Need to decrease bt power\n"); 136 "Need to decrease bt power\n");
146 rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_DEC_BT_POWER; 137 rtlpriv->btcoexist.cstate |=
147 return true; 138 BT_COEX_STATE_DEC_BT_POWER;
139 return true;
148 } 140 }
149 141
150 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_DEC_BT_POWER; 142 rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_DEC_BT_POWER;
151 return false; 143 return false;
152} 144}
153 145
154static bool rtl8723ae_dm_bt_is_same_coexist_state(struct ieee80211_hw *hw) 146static bool rtl8723e_dm_bt_is_same_coexist_state(struct ieee80211_hw *hw)
155{ 147{
156 struct rtl_priv *rtlpriv = rtl_priv(hw); 148 struct rtl_priv *rtlpriv = rtl_priv(hw);
157 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
158 149
159 if ((rtlpcipriv->bt_coexist.previous_state == 150 if ((rtlpriv->btcoexist.previous_state ==
160 rtlpcipriv->bt_coexist.cstate) && 151 rtlpriv->btcoexist.cstate) &&
161 (rtlpcipriv->bt_coexist.previous_state_h == 152 (rtlpriv->btcoexist.previous_state_h ==
162 rtlpcipriv->bt_coexist.cstate_h)) { 153 rtlpriv->btcoexist.cstate_h)) {
163 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 154 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
164 "[DM][BT], Coexist state do not chang!!\n"); 155 "[DM][BT], Coexist state do not chang!!\n");
165 return true; 156 return true;
@@ -170,86 +161,84 @@ static bool rtl8723ae_dm_bt_is_same_coexist_state(struct ieee80211_hw *hw)
170 } 161 }
171} 162}
172 163
173static void rtl8723ae_dm_bt_set_coex_table(struct ieee80211_hw *hw, 164static void rtl8723e_dm_bt_set_coex_table(struct ieee80211_hw *hw,
174 u32 val_0x6c0, u32 val_0x6c8, 165 u32 val_0x6c0, u32 val_0x6c8,
175 u32 val_0x6cc) 166 u32 val_0x6cc)
176{ 167{
177 struct rtl_priv *rtlpriv = rtl_priv(hw); 168 struct rtl_priv *rtlpriv = rtl_priv(hw);
178 169
179 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 170 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
180 "set coex table, set 0x6c0 = 0x%x\n", val_0x6c0); 171 "set coex table, set 0x6c0=0x%x\n", val_0x6c0);
181 rtl_write_dword(rtlpriv, 0x6c0, val_0x6c0); 172 rtl_write_dword(rtlpriv, 0x6c0, val_0x6c0);
182 173
183 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 174 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
184 "set coex table, set 0x6c8 = 0x%x\n", val_0x6c8); 175 "set coex table, set 0x6c8=0x%x\n", val_0x6c8);
185 rtl_write_dword(rtlpriv, 0x6c8, val_0x6c8); 176 rtl_write_dword(rtlpriv, 0x6c8, val_0x6c8);
186 177
187 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 178 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
188 "set coex table, set 0x6cc = 0x%x\n", val_0x6cc); 179 "set coex table, set 0x6cc=0x%x\n", val_0x6cc);
189 rtl_write_byte(rtlpriv, 0x6cc, val_0x6cc); 180 rtl_write_byte(rtlpriv, 0x6cc, val_0x6cc);
190} 181}
191 182
192static void rtl8723ae_dm_bt_set_hw_pta_mode(struct ieee80211_hw *hw, bool mode) 183static void rtl8723e_dm_bt_set_hw_pta_mode(struct ieee80211_hw *hw, bool b_mode)
193{ 184{
194 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
195 struct rtl_priv *rtlpriv = rtl_priv(hw); 185 struct rtl_priv *rtlpriv = rtl_priv(hw);
196 186
197 if (BT_PTA_MODE_ON == mode) { 187 if (BT_PTA_MODE_ON == b_mode) {
198 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode on, "); 188 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode on, ");
199 /* Enable GPIO 0/1/2/3/8 pins for bt */ 189 /* Enable GPIO 0/1/2/3/8 pins for bt */
200 rtl_write_byte(rtlpriv, 0x40, 0x20); 190 rtl_write_byte(rtlpriv, 0x40, 0x20);
201 rtlpcipriv->bt_coexist.hw_coexist_all_off = false; 191 rtlpriv->btcoexist.hw_coexist_all_off = false;
202 } else { 192 } else {
203 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode off\n"); 193 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, "PTA mode off\n");
204 rtl_write_byte(rtlpriv, 0x40, 0x0); 194 rtl_write_byte(rtlpriv, 0x40, 0x0);
205 } 195 }
206} 196}
207 197
208static void rtl8723ae_dm_bt_set_sw_rf_rx_lpf_corner(struct ieee80211_hw *hw, 198static void rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(struct ieee80211_hw *hw,
209 u8 type) 199 u8 type)
210{ 200{
211 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
212 struct rtl_priv *rtlpriv = rtl_priv(hw); 201 struct rtl_priv *rtlpriv = rtl_priv(hw);
213 202
214 if (BT_RF_RX_LPF_CORNER_SHRINK == type) { 203 if (BT_RF_RX_LPF_CORNER_SHRINK == type) {
215 /* Shrink RF Rx LPF corner, 0x1e[7:4]=1111 ==> [11:4] by Jenyu*/ 204 /* Shrink RF Rx LPF corner, 0x1e[7:4]=1111 ==> [11:4] */
216 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 205 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
217 "Shrink RF Rx LPF corner!!\n"); 206 "Shrink RF Rx LPF corner!!\n");
218 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e, 0xfffff, 207 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e,
219 0xf0ff7); 208 0xfffff, 0xf0ff7);
220 rtlpcipriv->bt_coexist.sw_coexist_all_off = false; 209 rtlpriv->btcoexist.sw_coexist_all_off = false;
221 } else if (BT_RF_RX_LPF_CORNER_RESUME == type) { 210 } else if (BT_RF_RX_LPF_CORNER_RESUME == type) {
222 /*Resume RF Rx LPF corner*/ 211 /*Resume RF Rx LPF corner*/
223 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 212 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
224 "Resume RF Rx LPF corner!!\n"); 213 "Resume RF Rx LPF corner!!\n");
225 rtl8723ae_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e, 0xfffff, 214 rtl8723e_phy_set_rf_reg(hw, RF90_PATH_A, 0x1e, 0xfffff,
226 rtlpcipriv->bt_coexist.bt_rfreg_origin_1e); 215 rtlpriv->btcoexist.bt_rfreg_origin_1e);
227 } 216 }
228} 217}
229 218
230static void rtl8723ae_bt_set_penalty_tx_rate_adap(struct ieee80211_hw *hw, 219static void dm_bt_set_sw_penalty_tx_rate_adapt(struct ieee80211_hw *hw,
231 u8 ra_type) 220 u8 ra_type)
232{ 221{
233 struct rtl_priv *rtlpriv = rtl_priv(hw); 222 struct rtl_priv *rtlpriv = rtl_priv(hw);
234 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); 223 u8 tmp_u1;
235 u8 tmu1;
236 224
237 tmu1 = rtl_read_byte(rtlpriv, 0x4fd); 225 tmp_u1 = rtl_read_byte(rtlpriv, 0x4fd);
238 tmu1 |= BIT(0); 226 tmp_u1 |= BIT(0);
239 if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == ra_type) { 227 if (BT_TX_RATE_ADAPTIVE_LOW_PENALTY == ra_type) {
240 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 228 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
241 "Tx rate adaptive, set low penalty!!\n"); 229 "Tx rate adaptive, set low penalty!!\n");
242 tmu1 &= ~BIT(2); 230 tmp_u1 &= ~BIT(2);
243 rtlpcipriv->bt_coexist.sw_coexist_all_off = false; 231 rtlpriv->btcoexist.sw_coexist_all_off = false;
244 } else if (BT_TX_RATE_ADAPTIVE_NORMAL == ra_type) { 232 } else if (BT_TX_RATE_ADAPTIVE_NORMAL == ra_type) {
245 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 233 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
246 "Tx rate adaptive, set normal!!\n"); 234 "Tx rate adaptive, set normal!!\n");
247 tmu1 |= BIT(2); 235 tmp_u1 |= BIT(2);
248 } 236 }
249 rtl_write_byte(rtlpriv, 0x4fd, tmu1); 237
238 rtl_write_byte(rtlpriv, 0x4fd, tmp_u1);
250} 239}
251 240
252static void rtl8723ae_dm_bt_btdm_structure_reload(struct ieee80211_hw *hw, 241static void rtl8723e_dm_bt_btdm_structure_reload(struct ieee80211_hw *hw,
253 struct btdm_8723 *btdm) 242 struct btdm_8723 *btdm)
254{ 243{
255 btdm->all_off = false; 244 btdm->all_off = false;
@@ -292,32 +281,31 @@ static void rtl8723ae_dm_bt_btdm_structure_reload(struct ieee80211_hw *hw,
292 btdm->dec_bt_pwr = false; 281 btdm->dec_bt_pwr = false;
293} 282}
294 283
295static void dm_bt_btdm_structure_reload_all_off(struct ieee80211_hw *hw, 284static void rtl8723e_dm_bt_btdm_structure_reload_all_off(struct ieee80211_hw *hw,
296 struct btdm_8723 *btdm) 285 struct btdm_8723 *btdm)
297{ 286{
298 rtl8723ae_dm_bt_btdm_structure_reload(hw, btdm); 287 rtl8723e_dm_bt_btdm_structure_reload(hw, btdm);
299 btdm->all_off = true; 288 btdm->all_off = true;
300 btdm->pta_on = false; 289 btdm->pta_on = false;
301 btdm->wlan_act_hi = 0x10; 290 btdm->wlan_act_hi = 0x10;
302} 291}
303 292
304static bool rtl8723ae_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw) 293static bool rtl8723e_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw)
305{ 294{
306 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
307 struct rtl_priv *rtlpriv = rtl_priv(hw); 295 struct rtl_priv *rtlpriv = rtl_priv(hw);
308 struct btdm_8723 btdm8723; 296 struct btdm_8723 btdm8723;
309 bool common = false; 297 bool b_common = false;
310 298
311 rtl8723ae_dm_bt_btdm_structure_reload(hw, &btdm8723); 299 rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);
312 300
313 if (!rtl8723ae_dm_bt_is_wifi_busy(hw) 301 if (!rtl8723e_dm_bt_is_wifi_busy(hw) &&
314 && !rtlpcipriv->bt_coexist.bt_busy) { 302 !rtlpriv->btcoexist.bt_busy) {
315 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 303 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
316 "Wifi idle + Bt idle, bt coex mechanism always off!!\n"); 304 "Wifi idle + Bt idle, bt coex mechanism always off!!\n");
317 dm_bt_btdm_structure_reload_all_off(hw, &btdm8723); 305 rtl8723e_dm_bt_btdm_structure_reload_all_off(hw, &btdm8723);
318 common = true; 306 b_common = true;
319 } else if (rtl8723ae_dm_bt_is_wifi_busy(hw) 307 } else if (rtl8723e_dm_bt_is_wifi_busy(hw) &&
320 && !rtlpcipriv->bt_coexist.bt_busy) { 308 !rtlpriv->btcoexist.bt_busy) {
321 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 309 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
322 "Wifi non-idle + Bt disabled/idle!!\n"); 310 "Wifi non-idle + Bt disabled/idle!!\n");
323 btdm8723.low_penalty_rate_adaptive = true; 311 btdm8723.low_penalty_rate_adaptive = true;
@@ -338,17 +326,17 @@ static bool rtl8723ae_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw)
338 btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF; 326 btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF;
339 btdm8723.b2_ant_hid_en = false; 327 btdm8723.b2_ant_hid_en = false;
340 328
341 common = true; 329 b_common = true;
342 } else if (rtlpcipriv->bt_coexist.bt_busy) { 330 } else if (rtlpriv->btcoexist.bt_busy) {
343 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 331 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
344 "Bt non-idle!\n"); 332 "Bt non-idle!\n");
345 if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) { 333 if (mgnt_link_status_query(hw) == RT_MEDIA_CONNECT) {
346 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 334 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
347 "Wifi connection exist\n"); 335 "Wifi connection exist\n");
348 common = false; 336 b_common = false;
349 } else { 337 } else {
350 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 338 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
351 "No Wifi connection!\n"); 339 "No Wifi connection!\n");
352 btdm8723.rf_rx_lpf_shrink = true; 340 btdm8723.rf_rx_lpf_shrink = true;
353 btdm8723.low_penalty_rate_adaptive = false; 341 btdm8723.low_penalty_rate_adaptive = false;
354 btdm8723.reject_aggre_pkt = false; 342 btdm8723.reject_aggre_pkt = false;
@@ -367,27 +355,28 @@ static bool rtl8723ae_dm_bt_is_2_ant_common_action(struct ieee80211_hw *hw)
367 btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF; 355 btdm8723.tdma_dac_swing = TDMA_DAC_SWING_OFF;
368 btdm8723.b2_ant_hid_en = false; 356 btdm8723.b2_ant_hid_en = false;
369 357
370 common = true; 358 b_common = true;
371 } 359 }
372 } 360 }
373 361
374 if (rtl8723ae_dm_bt_need_to_dec_bt_pwr(hw)) 362 if (rtl8723e_dm_bt_need_to_dec_bt_pwr(hw))
375 btdm8723.dec_bt_pwr = true; 363 btdm8723.dec_bt_pwr = true;
376 364
377 if (common) 365 if (b_common)
378 rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_BTINFO_COMMON; 366 rtlpriv->btcoexist.cstate |=
367 BT_COEX_STATE_BTINFO_COMMON;
379 368
380 if (common && rtl8723ae_dm_bt_is_coexist_state_changed(hw)) 369 if (b_common && rtl8723e_dm_bt_is_coexist_state_changed(hw))
381 rtl8723ae_dm_bt_set_bt_dm(hw, &btdm8723); 370 rtl8723e_dm_bt_set_bt_dm(hw, &btdm8723);
382 371
383 return common; 372 return b_common;
384} 373}
385 374
386static void rtl8723ae_dm_bt_set_sw_full_time_dac_swing(struct ieee80211_hw *hw, 375static void rtl8723e_dm_bt_set_sw_full_time_dac_swing(
387 bool sw_dac_swing_on, 376 struct ieee80211_hw *hw,
388 u32 sw_dac_swing_lvl) 377 bool sw_dac_swing_on,
378 u32 sw_dac_swing_lvl)
389{ 379{
390 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
391 struct rtl_priv *rtlpriv = rtl_priv(hw); 380 struct rtl_priv *rtlpriv = rtl_priv(hw);
392 381
393 if (sw_dac_swing_on) { 382 if (sw_dac_swing_on) {
@@ -395,7 +384,7 @@ static void rtl8723ae_dm_bt_set_sw_full_time_dac_swing(struct ieee80211_hw *hw,
395 "[BTCoex], SwDacSwing = 0x%x\n", sw_dac_swing_lvl); 384 "[BTCoex], SwDacSwing = 0x%x\n", sw_dac_swing_lvl);
396 rtl8723_phy_set_bb_reg(hw, 0x880, 0xff000000, 385 rtl8723_phy_set_bb_reg(hw, 0x880, 0xff000000,
397 sw_dac_swing_lvl); 386 sw_dac_swing_lvl);
398 rtlpcipriv->bt_coexist.sw_coexist_all_off = false; 387 rtlpriv->btcoexist.sw_coexist_all_off = false;
399 } else { 388 } else {
400 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 389 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
401 "[BTCoex], SwDacSwing Off!\n"); 390 "[BTCoex], SwDacSwing Off!\n");
@@ -403,10 +392,9 @@ static void rtl8723ae_dm_bt_set_sw_full_time_dac_swing(struct ieee80211_hw *hw,
403 } 392 }
404} 393}
405 394
406static void rtl8723ae_dm_bt_set_fw_dec_bt_pwr(struct ieee80211_hw *hw, 395static void rtl8723e_dm_bt_set_fw_dec_bt_pwr(
407 bool dec_bt_pwr) 396 struct ieee80211_hw *hw, bool dec_bt_pwr)
408{ 397{
409 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
410 struct rtl_priv *rtlpriv = rtl_priv(hw); 398 struct rtl_priv *rtlpriv = rtl_priv(hw);
411 u8 h2c_parameter[1] = {0}; 399 u8 h2c_parameter[1] = {0};
412 400
@@ -414,87 +402,86 @@ static void rtl8723ae_dm_bt_set_fw_dec_bt_pwr(struct ieee80211_hw *hw,
414 402
415 if (dec_bt_pwr) { 403 if (dec_bt_pwr) {
416 h2c_parameter[0] |= BIT(1); 404 h2c_parameter[0] |= BIT(1);
417 rtlpcipriv->bt_coexist.fw_coexist_all_off = false; 405 rtlpriv->btcoexist.fw_coexist_all_off = false;
418 } 406 }
419 407
420 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 408 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
421 "[BTCoex], decrease Bt Power : %s, write 0x21 = 0x%x\n", 409 "[BTCoex], decrease Bt Power : %s, write 0x21=0x%x\n",
422 (dec_bt_pwr ? "Yes!!" : "No!!"), h2c_parameter[0]); 410 (dec_bt_pwr ? "Yes!!" : "No!!"), h2c_parameter[0]);
423 411
424 rtl8723ae_fill_h2c_cmd(hw, 0x21, 1, h2c_parameter); 412 rtl8723e_fill_h2c_cmd(hw, 0x21, 1, h2c_parameter);
425} 413}
426 414
427static void rtl8723ae_dm_bt_set_fw_2_ant_hid(struct ieee80211_hw *hw, 415static void rtl8723e_dm_bt_set_fw_2_ant_hid(struct ieee80211_hw *hw,
428 bool enable, bool dac_swing_on) 416 bool b_enable, bool b_dac_swing_on)
429{ 417{
430 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
431 struct rtl_priv *rtlpriv = rtl_priv(hw); 418 struct rtl_priv *rtlpriv = rtl_priv(hw);
432 u8 h2c_parameter[1] = {0}; 419 u8 h2c_parameter[1] = {0};
433 420
434 if (enable) { 421 if (b_enable) {
435 h2c_parameter[0] |= BIT(0); 422 h2c_parameter[0] |= BIT(0);
436 rtlpcipriv->bt_coexist.fw_coexist_all_off = false; 423 rtlpriv->btcoexist.fw_coexist_all_off = false;
437 } 424 }
438 if (dac_swing_on) 425 if (b_dac_swing_on)
439 h2c_parameter[0] |= BIT(1); /* Dac Swing default enable */ 426 h2c_parameter[0] |= BIT(1); /* Dac Swing default enable */
427
440 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 428 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
441 "[BTCoex], turn 2-Ant+HID mode %s, DACSwing:%s, write 0x15 = 0x%x\n", 429 "[BTCoex], turn 2-Ant+HID mode %s, DACSwing:%s, write 0x15=0x%x\n",
442 (enable ? "ON!!" : "OFF!!"), (dac_swing_on ? "ON" : "OFF"), 430 (b_enable ? "ON!!" : "OFF!!"), (b_dac_swing_on ? "ON" : "OFF"),
443 h2c_parameter[0]); 431 h2c_parameter[0]);
444 432
445 rtl8723ae_fill_h2c_cmd(hw, 0x15, 1, h2c_parameter); 433 rtl8723e_fill_h2c_cmd(hw, 0x15, 1, h2c_parameter);
446} 434}
447 435
448static void rtl8723ae_dm_bt_set_fw_tdma_ctrl(struct ieee80211_hw *hw, 436static void rtl8723e_dm_bt_set_fw_tdma_ctrl(struct ieee80211_hw *hw,
449 bool enable, u8 ant_num, u8 nav_en, 437 bool b_enable, u8 ant_num,
450 u8 dac_swing_en) 438 u8 nav_en, u8 dac_swing_en)
451{ 439{
452 struct rtl_priv *rtlpriv = rtl_priv(hw); 440 struct rtl_priv *rtlpriv = rtl_priv(hw);
453 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
454 u8 h2c_parameter[1] = {0}; 441 u8 h2c_parameter[1] = {0};
455 u8 h2c_parameter1[1] = {0}; 442 u8 h2c_parameter1[1] = {0};
456 443
457 h2c_parameter[0] = 0; 444 h2c_parameter[0] = 0;
458 h2c_parameter1[0] = 0; 445 h2c_parameter1[0] = 0;
459 446
460 if (enable) { 447 if (b_enable) {
461 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 448 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
462 "[BTCoex], set BT PTA update manager to trigger update!!\n"); 449 "[BTCoex], set BT PTA update manager to trigger update!!\n");
463 h2c_parameter1[0] |= BIT(0); 450 h2c_parameter1[0] |= BIT(0);
464 451
465 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 452 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
466 "[BTCoex], turn TDMA mode ON!!\n"); 453 "[BTCoex], turn TDMA mode ON!!\n");
467 h2c_parameter[0] |= BIT(0); /* function enable */ 454 h2c_parameter[0] |= BIT(0); /* function enable */
468 if (TDMA_1ANT == ant_num) { 455 if (TDMA_1ANT == ant_num) {
469 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 456 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
470 "[BTCoex], TDMA_1ANT\n"); 457 "[BTCoex], TDMA_1ANT\n");
471 h2c_parameter[0] |= BIT(1); 458 h2c_parameter[0] |= BIT(1);
472 } else if (TDMA_2ANT == ant_num) { 459 } else if (TDMA_2ANT == ant_num) {
473 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 460 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
474 "[BTCoex], TDMA_2ANT\n"); 461 "[BTCoex], TDMA_2ANT\n");
475 } else { 462 } else {
476 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 463 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
477 "[BTCoex], Unknown Ant\n"); 464 "[BTCoex], Unknown Ant\n");
478 } 465 }
479 466
480 if (TDMA_NAV_OFF == nav_en) { 467 if (TDMA_NAV_OFF == nav_en) {
481 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 468 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
482 "[BTCoex], TDMA_NAV_OFF\n"); 469 "[BTCoex], TDMA_NAV_OFF\n");
483 } else if (TDMA_NAV_ON == nav_en) { 470 } else if (TDMA_NAV_ON == nav_en) {
484 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 471 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
485 "[BTCoex], TDMA_NAV_ON\n"); 472 "[BTCoex], TDMA_NAV_ON\n");
486 h2c_parameter[0] |= BIT(2); 473 h2c_parameter[0] |= BIT(2);
487 } 474 }
488 475
489 if (TDMA_DAC_SWING_OFF == dac_swing_en) { 476 if (TDMA_DAC_SWING_OFF == dac_swing_en) {
490 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 477 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
491 "[BTCoex], TDMA_DAC_SWING_OFF\n"); 478 "[BTCoex], TDMA_DAC_SWING_OFF\n");
492 } else if (TDMA_DAC_SWING_ON == dac_swing_en) { 479 } else if (TDMA_DAC_SWING_ON == dac_swing_en) {
493 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 480 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
494 "[BTCoex], TDMA_DAC_SWING_ON\n"); 481 "[BTCoex], TDMA_DAC_SWING_ON\n");
495 h2c_parameter[0] |= BIT(4); 482 h2c_parameter[0] |= BIT(4);
496 } 483 }
497 rtlpcipriv->bt_coexist.fw_coexist_all_off = false; 484 rtlpriv->btcoexist.fw_coexist_all_off = false;
498 } else { 485 } else {
499 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 486 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
500 "[BTCoex], set BT PTA update manager to no update!!\n"); 487 "[BTCoex], set BT PTA update manager to no update!!\n");
@@ -503,46 +490,46 @@ static void rtl8723ae_dm_bt_set_fw_tdma_ctrl(struct ieee80211_hw *hw,
503 } 490 }
504 491
505 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 492 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
506 "[BTCoex], FW2AntTDMA, write 0x26 = 0x%x\n", 493 "[BTCoex], FW2AntTDMA, write 0x26=0x%x\n",
507 h2c_parameter1[0]); 494 h2c_parameter1[0]);
508 rtl8723ae_fill_h2c_cmd(hw, 0x26, 1, h2c_parameter1); 495 rtl8723e_fill_h2c_cmd(hw, 0x26, 1, h2c_parameter1);
509 496
510 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 497 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
511 "[BTCoex], FW2AntTDMA, write 0x14 = 0x%x\n", h2c_parameter[0]); 498 "[BTCoex], FW2AntTDMA, write 0x14=0x%x\n",
512 rtl8723ae_fill_h2c_cmd(hw, 0x14, 1, h2c_parameter); 499 h2c_parameter[0]);
500 rtl8723e_fill_h2c_cmd(hw, 0x14, 1, h2c_parameter);
513} 501}
514 502
515static void rtl8723ae_dm_bt_set_fw_ignore_wlan_act(struct ieee80211_hw *hw, 503static void rtl8723e_dm_bt_set_fw_ignore_wlan_act(struct ieee80211_hw *hw,
516 bool enable) 504 bool b_enable)
517{ 505{
518 struct rtl_priv *rtlpriv = rtl_priv(hw); 506 struct rtl_priv *rtlpriv = rtl_priv(hw);
519 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
520 u8 h2c_parameter[1] = {0}; 507 u8 h2c_parameter[1] = {0};
521 508
522 if (enable) { 509 if (b_enable) {
523 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 510 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
524 "[BTCoex], BT Ignore Wlan_Act !!\n"); 511 "[BTCoex], BT Ignore Wlan_Act !!\n");
525 h2c_parameter[0] |= BIT(0); /* function enable */ 512 h2c_parameter[0] |= BIT(0); /* function enable */
526 rtlpcipriv->bt_coexist.fw_coexist_all_off = false; 513 rtlpriv->btcoexist.fw_coexist_all_off = false;
527 } else { 514 } else {
528 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 515 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
529 "[BTCoex], BT don't ignore Wlan_Act !!\n"); 516 "[BTCoex], BT don't ignore Wlan_Act !!\n");
530 } 517 }
531 518
532 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 519 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
533 "[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25 = 0x%x\n", 520 "[BTCoex], set FW for BT Ignore Wlan_Act, write 0x25=0x%x\n",
534 h2c_parameter[0]); 521 h2c_parameter[0]);
535 522
536 rtl8723ae_fill_h2c_cmd(hw, 0x25, 1, h2c_parameter); 523 rtl8723e_fill_h2c_cmd(hw, 0x25, 1, h2c_parameter);
537} 524}
538 525
539static void rtl8723ae_dm_bt_set_fw_tra_tdma_ctrl(struct ieee80211_hw *hw, 526static void rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(struct ieee80211_hw *hw,
540 bool enable, u8 ant_num, 527 bool b_enable, u8 ant_num,
541 u8 nav_en) 528 u8 nav_en)
542{ 529{
543 struct rtl_priv *rtlpriv = rtl_priv(hw); 530 struct rtl_priv *rtlpriv = rtl_priv(hw);
544 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
545 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 531 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
532
546 u8 h2c_parameter[2] = {0}; 533 u8 h2c_parameter[2] = {0};
547 534
548 /* Only 8723 B cut should do this */ 535 /* Only 8723 B cut should do this */
@@ -552,460 +539,467 @@ static void rtl8723ae_dm_bt_set_fw_tra_tdma_ctrl(struct ieee80211_hw *hw,
552 return; 539 return;
553 } 540 }
554 541
555 if (enable) { 542 if (b_enable) {
556 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 543 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
557 "[BTCoex], turn TTDMA mode ON!!\n"); 544 "[BTCoex], turn TTDMA mode ON!!\n");
558 h2c_parameter[0] |= BIT(0); /* function enable */ 545 h2c_parameter[0] |= BIT(0); /* function enable */
559 if (TDMA_1ANT == ant_num) { 546 if (TDMA_1ANT == ant_num) {
560 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 547 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
561 "[BTCoex], TTDMA_1ANT\n"); 548 "[BTCoex], TTDMA_1ANT\n");
562 h2c_parameter[0] |= BIT(1); 549 h2c_parameter[0] |= BIT(1);
563 } else if (TDMA_2ANT == ant_num) { 550 } else if (TDMA_2ANT == ant_num) {
564 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 551 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
565 "[BTCoex], TTDMA_2ANT\n"); 552 "[BTCoex], TTDMA_2ANT\n");
566 } else { 553 } else {
567 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 554 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
568 "[BTCoex], Unknown Ant\n"); 555 "[BTCoex], Unknown Ant\n");
569 } 556 }
570 557
571 if (TDMA_NAV_OFF == nav_en) { 558 if (TDMA_NAV_OFF == nav_en) {
572 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 559 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
573 "[BTCoex], TTDMA_NAV_OFF\n"); 560 "[BTCoex], TTDMA_NAV_OFF\n");
574 } else if (TDMA_NAV_ON == nav_en) { 561 } else if (TDMA_NAV_ON == nav_en) {
575 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 562 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
576 "[BTCoex], TTDMA_NAV_ON\n"); 563 "[BTCoex], TTDMA_NAV_ON\n");
577 h2c_parameter[1] |= BIT(0); 564 h2c_parameter[1] |= BIT(0);
578 } 565 }
579 566
580 rtlpcipriv->bt_coexist.fw_coexist_all_off = false; 567 rtlpriv->btcoexist.fw_coexist_all_off = false;
581 } else { 568 } else {
582 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 569 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
583 "[BTCoex], turn TTDMA mode OFF!!\n"); 570 "[BTCoex], turn TTDMA mode OFF!!\n");
584 } 571 }
585 572
586 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 573 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
587 "[BTCoex], FW Traditional TDMA, write 0x33 = 0x%x\n", 574 "[BTCoex], FW Traditional TDMA, write 0x33=0x%x\n",
588 h2c_parameter[0] << 8 | h2c_parameter[1]); 575 h2c_parameter[0] << 8 | h2c_parameter[1]);
589 576
590 rtl8723ae_fill_h2c_cmd(hw, 0x33, 2, h2c_parameter); 577 rtl8723e_fill_h2c_cmd(hw, 0x33, 2, h2c_parameter);
591} 578}
592 579
593static void rtl8723ae_dm_bt_set_fw_dac_swing_level(struct ieee80211_hw *hw, 580static void rtl8723e_dm_bt_set_fw_dac_swing_level(struct ieee80211_hw *hw,
594 u8 dac_swing_lvl) 581 u8 dac_swing_lvl)
595{ 582{
596 struct rtl_priv *rtlpriv = rtl_priv(hw); 583 struct rtl_priv *rtlpriv = rtl_priv(hw);
597 u8 h2c_parameter[1] = {0}; 584 u8 h2c_parameter[1] = {0};
598
599 h2c_parameter[0] = dac_swing_lvl; 585 h2c_parameter[0] = dac_swing_lvl;
600 586
601 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 587 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
602 "[BTCoex], Set Dac Swing Level = 0x%x\n", dac_swing_lvl); 588 "[BTCoex], Set Dac Swing Level=0x%x\n", dac_swing_lvl);
603 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 589 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
604 "[BTCoex], write 0x29 = 0x%x\n", h2c_parameter[0]); 590 "[BTCoex], write 0x29=0x%x\n", h2c_parameter[0]);
605 591
606 rtl8723ae_fill_h2c_cmd(hw, 0x29, 1, h2c_parameter); 592 rtl8723e_fill_h2c_cmd(hw, 0x29, 1, h2c_parameter);
607} 593}
608 594
609static void rtl8723ae_dm_bt_set_fw_bt_hid_info(struct ieee80211_hw *hw, 595static void rtl8723e_dm_bt_set_fw_bt_hid_info(struct ieee80211_hw *hw,
610 bool enable) 596 bool b_enable)
611{ 597{
612 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
613 struct rtl_priv *rtlpriv = rtl_priv(hw); 598 struct rtl_priv *rtlpriv = rtl_priv(hw);
614 u8 h2c_parameter[1] = {0}; 599 u8 h2c_parameter[1] = {0};
615
616 h2c_parameter[0] = 0; 600 h2c_parameter[0] = 0;
617 601
618 if (enable) { 602 if (b_enable) {
619 h2c_parameter[0] |= BIT(0); 603 h2c_parameter[0] |= BIT(0);
620 rtlpcipriv->bt_coexist.fw_coexist_all_off = false; 604 rtlpriv->btcoexist.fw_coexist_all_off = false;
621 } 605 }
622 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 606 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
623 "[BTCoex], Set BT HID information = 0x%x\n", enable); 607 "[BTCoex], Set BT HID information=0x%x\n", b_enable);
624 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 608 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
625 "[BTCoex], write 0x24 = 0x%x\n", h2c_parameter[0]); 609 "[BTCoex], write 0x24=0x%x\n", h2c_parameter[0]);
626 610
627 rtl8723ae_fill_h2c_cmd(hw, 0x24, 1, h2c_parameter); 611 rtl8723e_fill_h2c_cmd(hw, 0x24, 1, h2c_parameter);
628} 612}
629 613
630static void rtl8723ae_dm_bt_set_fw_bt_retry_index(struct ieee80211_hw *hw, 614static void rtl8723e_dm_bt_set_fw_bt_retry_index(struct ieee80211_hw *hw,
631 u8 retry_index) 615 u8 retry_index)
632{ 616{
633 struct rtl_priv *rtlpriv = rtl_priv(hw); 617 struct rtl_priv *rtlpriv = rtl_priv(hw);
634 u8 h2c_parameter[1] = {0}; 618 u8 h2c_parameter[1] = {0};
635
636 h2c_parameter[0] = retry_index; 619 h2c_parameter[0] = retry_index;
637 620
638 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 621 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
639 "[BTCoex], Set BT Retry Index=%d\n", retry_index); 622 "[BTCoex], Set BT Retry Index=%d\n", retry_index);
640 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 623 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
641 "[BTCoex], write 0x23 = 0x%x\n", h2c_parameter[0]); 624 "[BTCoex], write 0x23=0x%x\n", h2c_parameter[0]);
642 625
643 rtl8723ae_fill_h2c_cmd(hw, 0x23, 1, h2c_parameter); 626 rtl8723e_fill_h2c_cmd(hw, 0x23, 1, h2c_parameter);
644} 627}
645 628
646static void rtl8723ae_dm_bt_set_fw_wlan_act(struct ieee80211_hw *hw, 629static void rtl8723e_dm_bt_set_fw_wlan_act(struct ieee80211_hw *hw,
647 u8 wlan_act_hi, u8 wlan_act_lo) 630 u8 wlan_act_hi, u8 wlan_act_lo)
648{ 631{
649 struct rtl_priv *rtlpriv = rtl_priv(hw); 632 struct rtl_priv *rtlpriv = rtl_priv(hw);
650 u8 h2c_parameter_hi[1] = {0}; 633 u8 h2c_parameter_hi[1] = {0};
651 u8 h2c_parameter_lo[1] = {0}; 634 u8 h2c_parameter_lo[1] = {0};
652
653 h2c_parameter_hi[0] = wlan_act_hi; 635 h2c_parameter_hi[0] = wlan_act_hi;
654 h2c_parameter_lo[0] = wlan_act_lo; 636 h2c_parameter_lo[0] = wlan_act_lo;
655 637
656 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 638 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
657 "[BTCoex], Set WLAN_ACT Hi:Lo = 0x%x/0x%x\n", wlan_act_hi, 639 "[BTCoex], Set WLAN_ACT Hi:Lo=0x%x/0x%x\n",
658 wlan_act_lo); 640 wlan_act_hi, wlan_act_lo);
659 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 641 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
660 "[BTCoex], write 0x22 = 0x%x\n", h2c_parameter_hi[0]); 642 "[BTCoex], write 0x22=0x%x\n", h2c_parameter_hi[0]);
661 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 643 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
662 "[BTCoex], write 0x11 = 0x%x\n", h2c_parameter_lo[0]); 644 "[BTCoex], write 0x11=0x%x\n", h2c_parameter_lo[0]);
663 645
664 /* WLAN_ACT = High duration, unit:ms */ 646 /* WLAN_ACT = High duration, unit:ms */
665 rtl8723ae_fill_h2c_cmd(hw, 0x22, 1, h2c_parameter_hi); 647 rtl8723e_fill_h2c_cmd(hw, 0x22, 1, h2c_parameter_hi);
666 /* WLAN_ACT = Low duration, unit:3*625us */ 648 /* WLAN_ACT = Low duration, unit:3*625us */
667 rtl8723ae_fill_h2c_cmd(hw, 0x11, 1, h2c_parameter_lo); 649 rtl8723e_fill_h2c_cmd(hw, 0x11, 1, h2c_parameter_lo);
668} 650}
669 651
670void rtl8723ae_dm_bt_set_bt_dm(struct ieee80211_hw *hw, struct btdm_8723 *btdm) 652void rtl8723e_dm_bt_set_bt_dm(struct ieee80211_hw *hw,
653 struct btdm_8723 *btdm)
671{ 654{
672 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
673 struct rtl_priv *rtlpriv = rtl_priv(hw); 655 struct rtl_priv *rtlpriv = rtl_priv(hw);
674 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 656 struct btdm_8723 *btdm_8723 = &hal_coex_8723.btdm;
675 struct btdm_8723 *btdm_8723 = &rtlhal->hal_coex_8723.btdm;
676 u8 i; 657 u8 i;
658
677 bool fw_current_inpsmode = false; 659 bool fw_current_inpsmode = false;
678 bool fw_ps_awake = true; 660 bool fw_ps_awake = true;
679 661
680 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 662 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
681 (u8 *)(&fw_current_inpsmode)); 663 (u8 *)(&fw_current_inpsmode));
682 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON, 664 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
683 (u8 *)(&fw_ps_awake)); 665 (u8 *)(&fw_ps_awake));
684 666
685 /* check new setting is different than the old one, 667 /* check new setting is different with the old one, */
686 * if all the same, don't do the setting again. 668 /* if all the same, don't do the setting again. */
687 */
688 if (memcmp(btdm_8723, btdm, sizeof(struct btdm_8723)) == 0) { 669 if (memcmp(btdm_8723, btdm, sizeof(struct btdm_8723)) == 0) {
689 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 670 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
690 "[BTCoex], the same coexist setting, return!!\n"); 671 "[BTCoex], the same coexist setting, return!!\n");
691 return; 672 return;
692 } else { /* save the new coexist setting */ 673 } else { /* save the new coexist setting */
693 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 674 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
694 "[BTCoex], UPDATE TO NEW COEX SETTING!!\n"); 675 "[BTCoex], UPDATE TO NEW COEX SETTING!!\n");
695 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 676 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
696 "[BTCoex], original/new bAllOff = 0x%x/ 0x%x\n", 677 "[BTCoex], original/new bAllOff=0x%x/ 0x%x\n",
697 btdm_8723->all_off, btdm->all_off); 678 btdm_8723->all_off, btdm->all_off);
698 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 679 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
699 "[BTCoex], original/new agc_table_en = 0x%x/ 0x%x\n", 680 "[BTCoex], original/new agc_table_en=0x%x/ 0x%x\n",
700 btdm_8723->agc_table_en, btdm->agc_table_en); 681 btdm_8723->agc_table_en, btdm->agc_table_en);
701 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 682 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
702 "[BTCoex], original/new adc_back_off_on = 0x%x/ 0x%x\n", 683 "[BTCoex], original/new adc_back_off_on=0x%x/ 0x%x\n",
703 btdm_8723->adc_back_off_on, btdm->adc_back_off_on); 684 btdm_8723->adc_back_off_on,
685 btdm->adc_back_off_on);
704 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 686 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
705 "[BTCoex], original/new b2_ant_hid_en = 0x%x/ 0x%x\n", 687 "[BTCoex], original/new b2_ant_hid_en=0x%x/ 0x%x\n",
706 btdm_8723->b2_ant_hid_en, btdm->b2_ant_hid_en); 688 btdm_8723->b2_ant_hid_en, btdm->b2_ant_hid_en);
707 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 689 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
708 "[BTCoex], original/new bLowPenaltyRateAdaptive = 0x%x/ 0x%x\n", 690 "[BTCoex], original/new bLowPenaltyRateAdaptive=0x%x/ 0x%x\n",
709 btdm_8723->low_penalty_rate_adaptive, 691 btdm_8723->low_penalty_rate_adaptive,
710 btdm->low_penalty_rate_adaptive); 692 btdm->low_penalty_rate_adaptive);
711 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 693 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
712 "[BTCoex], original/new bRfRxLpfShrink = 0x%x/ 0x%x\n", 694 "[BTCoex], original/new bRfRxLpfShrink=0x%x/ 0x%x\n",
713 btdm_8723->rf_rx_lpf_shrink, btdm->rf_rx_lpf_shrink); 695 btdm_8723->rf_rx_lpf_shrink,
696 btdm->rf_rx_lpf_shrink);
714 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 697 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
715 "[BTCoex], original/new bRejectAggrePkt = 0x%x/ 0x%x\n", 698 "[BTCoex], original/new bRejectAggrePkt=0x%x/ 0x%x\n",
716 btdm_8723->reject_aggre_pkt, btdm->reject_aggre_pkt); 699 btdm_8723->reject_aggre_pkt,
700 btdm->reject_aggre_pkt);
717 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 701 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
718 "[BTCoex], original/new tdma_on = 0x%x/ 0x%x\n", 702 "[BTCoex], original/new tdma_on=0x%x/ 0x%x\n",
719 btdm_8723->tdma_on, btdm->tdma_on); 703 btdm_8723->tdma_on, btdm->tdma_on);
720 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 704 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
721 "[BTCoex], original/new tdmaAnt = 0x%x/ 0x%x\n", 705 "[BTCoex], original/new tdmaAnt=0x%x/ 0x%x\n",
722 btdm_8723->tdma_ant, btdm->tdma_ant); 706 btdm_8723->tdma_ant, btdm->tdma_ant);
723 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 707 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
724 "[BTCoex], original/new tdmaNav = 0x%x/ 0x%x\n", 708 "[BTCoex], original/new tdmaNav=0x%x/ 0x%x\n",
725 btdm_8723->tdma_nav, btdm->tdma_nav); 709 btdm_8723->tdma_nav, btdm->tdma_nav);
726 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 710 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
727 "[BTCoex], original/new tdma_dac_swing = 0x%x/ 0x%x\n", 711 "[BTCoex], original/new tdma_dac_swing=0x%x/ 0x%x\n",
728 btdm_8723->tdma_dac_swing, btdm->tdma_dac_swing); 712 btdm_8723->tdma_dac_swing, btdm->tdma_dac_swing);
729 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 713 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
730 "[BTCoex], original/new fwDacSwingLvl = 0x%x/ 0x%x\n", 714 "[BTCoex], original/new fw_dac_swing_lvl=0x%x/ 0x%x\n",
731 btdm_8723->fw_dac_swing_lvl, btdm->fw_dac_swing_lvl); 715 btdm_8723->fw_dac_swing_lvl,
716 btdm->fw_dac_swing_lvl);
732 717
733 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 718 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
734 "[BTCoex], original/new bTraTdmaOn = 0x%x/ 0x%x\n", 719 "[BTCoex], original/new bTraTdmaOn=0x%x/ 0x%x\n",
735 btdm_8723->tra_tdma_on, btdm->tra_tdma_on); 720 btdm_8723->tra_tdma_on, btdm->tra_tdma_on);
736 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 721 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
737 "[BTCoex], original/new traTdmaAnt = 0x%x/ 0x%x\n", 722 "[BTCoex], original/new traTdmaAnt=0x%x/ 0x%x\n",
738 btdm_8723->tra_tdma_ant, btdm->tra_tdma_ant); 723 btdm_8723->tra_tdma_ant, btdm->tra_tdma_ant);
739 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 724 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
740 "[BTCoex], original/new traTdmaNav = 0x%x/ 0x%x\n", 725 "[BTCoex], original/new traTdmaNav=0x%x/ 0x%x\n",
741 btdm_8723->tra_tdma_nav, btdm->tra_tdma_nav); 726 btdm_8723->tra_tdma_nav, btdm->tra_tdma_nav);
742 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 727 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
743 "[BTCoex], original/new bPsTdmaOn = 0x%x/ 0x%x\n", 728 "[BTCoex], original/new bPsTdmaOn=0x%x/ 0x%x\n",
744 btdm_8723->ps_tdma_on, btdm->ps_tdma_on); 729 btdm_8723->ps_tdma_on, btdm->ps_tdma_on);
745 for (i = 0; i < 5; i++) { 730 for (i = 0; i < 5; i++) {
746 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 731 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
747 "[BTCoex], original/new psTdmaByte[i] = 0x%x/ 0x%x\n", 732 "[BTCoex], original/new psTdmaByte[i]=0x%x/ 0x%x\n",
748 btdm_8723->ps_tdma_byte[i], 733 btdm_8723->ps_tdma_byte[i],
749 btdm->ps_tdma_byte[i]); 734 btdm->ps_tdma_byte[i]);
750 } 735 }
751 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 736 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
752 "[BTCoex], original/new bIgnoreWlanAct = 0x%x/ 0x%x\n", 737 "[BTCoex], original/new bIgnoreWlanAct=0x%x/ 0x%x\n",
753 btdm_8723->ignore_wlan_act, btdm->ignore_wlan_act); 738 btdm_8723->ignore_wlan_act,
739 btdm->ignore_wlan_act);
740
754 741
755 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 742 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
756 "[BTCoex], original/new bPtaOn = 0x%x/ 0x%x\n", 743 "[BTCoex], original/new bPtaOn=0x%x/ 0x%x\n",
757 btdm_8723->pta_on, btdm->pta_on); 744 btdm_8723->pta_on, btdm->pta_on);
758 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 745 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
759 "[BTCoex], original/new val_0x6c0 = 0x%x/ 0x%x\n", 746 "[BTCoex], original/new val_0x6c0=0x%x/ 0x%x\n",
760 btdm_8723->val_0x6c0, btdm->val_0x6c0); 747 btdm_8723->val_0x6c0, btdm->val_0x6c0);
761 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 748 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
762 "[BTCoex], original/new val_0x6c8 = 0x%x/ 0x%x\n", 749 "[BTCoex], original/new val_0x6c8=0x%x/ 0x%x\n",
763 btdm_8723->val_0x6c8, btdm->val_0x6c8); 750 btdm_8723->val_0x6c8, btdm->val_0x6c8);
764 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 751 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
765 "[BTCoex], original/new val_0x6cc = 0x%x/ 0x%x\n", 752 "[BTCoex], original/new val_0x6cc=0x%x/ 0x%x\n",
766 btdm_8723->val_0x6cc, btdm->val_0x6cc); 753 btdm_8723->val_0x6cc, btdm->val_0x6cc);
767 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 754 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
768 "[BTCoex], original/new sw_dac_swing_on = 0x%x/ 0x%x\n", 755 "[BTCoex], original/new sw_dac_swing_on=0x%x/ 0x%x\n",
769 btdm_8723->sw_dac_swing_on, btdm->sw_dac_swing_on); 756 btdm_8723->sw_dac_swing_on,
757 btdm->sw_dac_swing_on);
770 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 758 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
771 "[BTCoex], original/new sw_dac_swing_lvl = 0x%x/ 0x%x\n", 759 "[BTCoex], original/new sw_dac_swing_lvl=0x%x/ 0x%x\n",
772 btdm_8723->sw_dac_swing_lvl, 760 btdm_8723->sw_dac_swing_lvl,
773 btdm->sw_dac_swing_lvl); 761 btdm->sw_dac_swing_lvl);
774 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 762 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
775 "[BTCoex], original/new wlanActHi = 0x%x/ 0x%x\n", 763 "[BTCoex], original/new wlanActHi=0x%x/ 0x%x\n",
776 btdm_8723->wlan_act_hi, btdm->wlan_act_hi); 764 btdm_8723->wlan_act_hi, btdm->wlan_act_hi);
777 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 765 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
778 "[BTCoex], original/new wlanActLo = 0x%x/ 0x%x\n", 766 "[BTCoex], original/new wlanActLo=0x%x/ 0x%x\n",
779 btdm_8723->wlan_act_lo, btdm->wlan_act_lo); 767 btdm_8723->wlan_act_lo, btdm->wlan_act_lo);
780 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 768 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
781 "[BTCoex], original/new btRetryIndex = 0x%x/ 0x%x\n", 769 "[BTCoex], original/new btRetryIndex=0x%x/ 0x%x\n",
782 btdm_8723->bt_retry_index, btdm->bt_retry_index); 770 btdm_8723->bt_retry_index, btdm->bt_retry_index);
783 771
784 memcpy(btdm_8723, btdm, sizeof(struct btdm_8723)); 772 memcpy(btdm_8723, btdm, sizeof(struct btdm_8723));
785 } 773 }
786 /* 774 /* Here we only consider when Bt Operation
787 * Here we only consider when Bt Operation
788 * inquiry/paging/pairing is ON 775 * inquiry/paging/pairing is ON
789 * we only need to turn off TDMA 776 * we only need to turn off TDMA
790 */ 777 */
791 778
792 if (rtlpcipriv->bt_coexist.hold_for_bt_operation) { 779 if (rtlpriv->btcoexist.hold_for_bt_operation) {
793 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 780 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
794 "[BTCoex], set to ignore wlanAct for BT OP!!\n"); 781 "[BTCoex], set to ignore wlanAct for BT OP!!\n");
795 rtl8723ae_dm_bt_set_fw_ignore_wlan_act(hw, true); 782 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw, true);
796 return; 783 return;
797 } 784 }
798 785
799 if (btdm->all_off) { 786 if (btdm->all_off) {
800 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 787 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
801 "[BTCoex], disable all coexist mechanism !!\n"); 788 "[BTCoex], disable all coexist mechanism !!\n");
802 rtl8723ae_btdm_coex_all_off(hw); 789 rtl8723e_btdm_coex_all_off(hw);
803 return; 790 return;
804 } 791 }
805 792
806 rtl8723ae_dm_bt_reject_ap_aggregated_packet(hw, btdm->reject_aggre_pkt); 793 rtl8723e_dm_bt_reject_ap_aggregated_packet(hw, btdm->reject_aggre_pkt);
807 794
808 if (btdm->low_penalty_rate_adaptive) 795 if (btdm->low_penalty_rate_adaptive)
809 rtl8723ae_bt_set_penalty_tx_rate_adap(hw, 796 dm_bt_set_sw_penalty_tx_rate_adapt(hw, BT_TX_RATE_ADAPTIVE_LOW_PENALTY);
810 BT_TX_RATE_ADAPTIVE_LOW_PENALTY);
811 else 797 else
812 rtl8723ae_bt_set_penalty_tx_rate_adap(hw, 798 dm_bt_set_sw_penalty_tx_rate_adapt(hw,
813 BT_TX_RATE_ADAPTIVE_NORMAL); 799 BT_TX_RATE_ADAPTIVE_NORMAL);
814 800
815 if (btdm->rf_rx_lpf_shrink) 801 if (btdm->rf_rx_lpf_shrink)
816 rtl8723ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, 802 rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw,
817 BT_RF_RX_LPF_CORNER_SHRINK); 803 BT_RF_RX_LPF_CORNER_SHRINK);
818 else 804 else
819 rtl8723ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, 805 rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw,
820 BT_RF_RX_LPF_CORNER_RESUME); 806 BT_RF_RX_LPF_CORNER_RESUME);
821 807
822 if (btdm->agc_table_en) 808 if (btdm->agc_table_en)
823 rtl8723ae_dm_bt_agc_table(hw, BT_AGCTABLE_ON); 809 rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_ON);
824 else 810 else
825 rtl8723ae_dm_bt_agc_table(hw, BT_AGCTABLE_OFF); 811 rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
826 812
827 if (btdm->adc_back_off_on) 813 if (btdm->adc_back_off_on)
828 rtl8723ae_dm_bt_bback_off_level(hw, BT_BB_BACKOFF_ON); 814 rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_ON);
829 else 815 else
830 rtl8723ae_dm_bt_bback_off_level(hw, BT_BB_BACKOFF_OFF); 816 rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
831 817
832 rtl8723ae_dm_bt_set_fw_bt_retry_index(hw, btdm->bt_retry_index); 818 rtl8723e_dm_bt_set_fw_bt_retry_index(hw, btdm->bt_retry_index);
833 819
834 rtl8723ae_dm_bt_set_fw_dac_swing_level(hw, btdm->fw_dac_swing_lvl); 820 rtl8723e_dm_bt_set_fw_dac_swing_level(hw, btdm->fw_dac_swing_lvl);
835 rtl8723ae_dm_bt_set_fw_wlan_act(hw, btdm->wlan_act_hi, 821 rtl8723e_dm_bt_set_fw_wlan_act(hw, btdm->wlan_act_hi,
836 btdm->wlan_act_lo); 822 btdm->wlan_act_lo);
837 823
838 rtl8723ae_dm_bt_set_coex_table(hw, btdm->val_0x6c0, 824 rtl8723e_dm_bt_set_coex_table(hw, btdm->val_0x6c0,
839 btdm->val_0x6c8, btdm->val_0x6cc); 825 btdm->val_0x6c8, btdm->val_0x6cc);
840 rtl8723ae_dm_bt_set_hw_pta_mode(hw, btdm->pta_on); 826 rtl8723e_dm_bt_set_hw_pta_mode(hw, btdm->pta_on);
841 827
842 /* Note: There is a constraint between TDMA and 2AntHID 828 /* Note: There is a constraint between TDMA and 2AntHID
843 * Only one of 2AntHid and tdma can be turned on 829 * Only one of 2AntHid and tdma can be turn on
844 * We should turn off those mechanisms first 830 * We should turn off those mechanisms should be turned off first
845 * and then turn on them on. 831 * and then turn on those mechanisms should be turned on.
846 */ 832 */
847 if (btdm->b2_ant_hid_en) { 833 if (btdm->b2_ant_hid_en) {
848 /* turn off tdma */ 834 /* turn off tdma */
849 rtl8723ae_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on, 835 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
850 btdm->tra_tdma_ant, 836 btdm->tra_tdma_ant,
851 btdm->tra_tdma_nav); 837 btdm->tra_tdma_nav);
852 rtl8723ae_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant, 838 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,
853 btdm->tdma_nav, 839 btdm->tdma_nav,
854 btdm->tdma_dac_swing); 840 btdm->tdma_dac_swing);
855 841
856 /* turn off Pstdma */ 842 /* turn off Pstdma */
857 rtl8723ae_dm_bt_set_fw_ignore_wlan_act(hw, 843 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
858 btdm->ignore_wlan_act); 844 btdm->ignore_wlan_act);
859 /* Antenna control by PTA, 0x870 = 0x300. */ 845 /* Antenna control by PTA, 0x870 = 0x300. */
860 rtl8723ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0); 846 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
861 847
862 /* turn on 2AntHid */ 848 /* turn on 2AntHid */
863 rtl8723ae_dm_bt_set_fw_bt_hid_info(hw, true); 849 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, true);
864 rtl8723ae_dm_bt_set_fw_2_ant_hid(hw, true, true); 850 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, true, true);
865 } else if (btdm->tdma_on) { 851 } else if (btdm->tdma_on) {
866 /* turn off 2AntHid */ 852 /* turn off 2AntHid */
867 rtl8723ae_dm_bt_set_fw_bt_hid_info(hw, false); 853 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
868 rtl8723ae_dm_bt_set_fw_2_ant_hid(hw, false, false); 854 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
869 855
870 /* turn off pstdma */ 856 /* turn off pstdma */
871 rtl8723ae_dm_bt_set_fw_ignore_wlan_act(hw, 857 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
872 btdm->ignore_wlan_act); 858 btdm->ignore_wlan_act);
873 /* Antenna control by PTA, 0x870 = 0x300. */ 859 /* Antenna control by PTA, 0x870 = 0x300. */
874 rtl8723ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0); 860 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
875 861
876 /* turn on tdma */ 862 /* turn on tdma */
877 rtl8723ae_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on, 863 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
878 btdm->tra_tdma_ant, btdm->tra_tdma_nav); 864 btdm->tra_tdma_ant,
879 rtl8723ae_dm_bt_set_fw_tdma_ctrl(hw, true, btdm->tdma_ant, 865 btdm->tra_tdma_nav);
880 btdm->tdma_nav, btdm->tdma_dac_swing); 866 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, true, btdm->tdma_ant,
867 btdm->tdma_nav,
868 btdm->tdma_dac_swing);
881 } else if (btdm->ps_tdma_on) { 869 } else if (btdm->ps_tdma_on) {
882 /* turn off 2AntHid */ 870 /* turn off 2AntHid */
883 rtl8723ae_dm_bt_set_fw_bt_hid_info(hw, false); 871 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
884 rtl8723ae_dm_bt_set_fw_2_ant_hid(hw, false, false); 872 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
885 873
886 /* turn off tdma */ 874 /* turn off tdma */
887 rtl8723ae_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on, 875 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
888 btdm->tra_tdma_ant, btdm->tra_tdma_nav); 876 btdm->tra_tdma_ant,
889 rtl8723ae_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant, 877 btdm->tra_tdma_nav);
890 btdm->tdma_nav, btdm->tdma_dac_swing); 878 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,
879 btdm->tdma_nav,
880 btdm->tdma_dac_swing);
891 881
892 /* turn on pstdma */ 882 /* turn on pstdma */
893 rtl8723ae_dm_bt_set_fw_ignore_wlan_act(hw, 883 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
894 btdm->ignore_wlan_act); 884 btdm->ignore_wlan_act);
895 rtl8723ae_dm_bt_set_fw_3a(hw, 885 rtl8723e_dm_bt_set_fw_3a(hw, btdm->ps_tdma_byte[0],
896 btdm->ps_tdma_byte[0], 886 btdm->ps_tdma_byte[1],
897 btdm->ps_tdma_byte[1], 887 btdm->ps_tdma_byte[2],
898 btdm->ps_tdma_byte[2], 888 btdm->ps_tdma_byte[3],
899 btdm->ps_tdma_byte[3], 889 btdm->ps_tdma_byte[4]);
900 btdm->ps_tdma_byte[4]);
901 } else { 890 } else {
902 /* turn off 2AntHid */ 891 /* turn off 2AntHid */
903 rtl8723ae_dm_bt_set_fw_bt_hid_info(hw, false); 892 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
904 rtl8723ae_dm_bt_set_fw_2_ant_hid(hw, false, false); 893 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
905 894
906 /* turn off tdma */ 895 /* turn off tdma */
907 rtl8723ae_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on, 896 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, btdm->tra_tdma_on,
908 btdm->tra_tdma_ant, btdm->tra_tdma_nav); 897 btdm->tra_tdma_ant,
909 rtl8723ae_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant, 898 btdm->tra_tdma_nav);
910 btdm->tdma_nav, btdm->tdma_dac_swing); 899 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, btdm->tdma_ant,
900 btdm->tdma_nav,
901 btdm->tdma_dac_swing);
911 902
912 /* turn off pstdma */ 903 /* turn off pstdma */
913 rtl8723ae_dm_bt_set_fw_ignore_wlan_act(hw, 904 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw,
914 btdm->ignore_wlan_act); 905 btdm->ignore_wlan_act);
915 /* Antenna control by PTA, 0x870 = 0x300. */ 906 /* Antenna control by PTA, 0x870 = 0x300. */
916 rtl8723ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0); 907 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
917 } 908 }
918 909
919 /* Note: 910 /* Note:
920 * We should add delay for making sure sw DacSwing can be set 911 * We should add delay for making sure
921 * sucessfully. Because of that rtl8723ae_dm_bt_set_fw_2_ant_hid() 912 * sw DacSwing can be set sucessfully.
922 * and rtl8723ae_dm_bt_set_fw_tdma_ctrl() 913 * because of that rtl8723e_dm_bt_set_fw_2_ant_hid()
914 * and rtl8723e_dm_bt_set_fw_tdma_ctrl()
923 * will overwrite the reg 0x880. 915 * will overwrite the reg 0x880.
924 */ 916 */
925 mdelay(30); 917 mdelay(30);
926 rtl8723ae_dm_bt_set_sw_full_time_dac_swing(hw, 918 rtl8723e_dm_bt_set_sw_full_time_dac_swing(hw, btdm->sw_dac_swing_on,
927 btdm->sw_dac_swing_on, btdm->sw_dac_swing_lvl); 919 btdm->sw_dac_swing_lvl);
928 rtl8723ae_dm_bt_set_fw_dec_bt_pwr(hw, btdm->dec_bt_pwr); 920 rtl8723e_dm_bt_set_fw_dec_bt_pwr(hw, btdm->dec_bt_pwr);
929} 921}
930 922
931/*============================================================ 923/* ============================================================ */
932 * extern function start with BTDM_ 924/* extern function start with BTDM_ */
933 *============================================================ 925/* ============================================================i
934 */ 926 */
935static u32 rtl8723ae_dm_bt_tx_rx_couter_h(struct ieee80211_hw *hw) 927static u32 rtl8723e_dm_bt_tx_rx_couter_h(struct ieee80211_hw *hw)
936{ 928{
937 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 929 u32 counters = 0;
938 u32 counters = 0;
939 930
940 counters = rtlhal->hal_coex_8723.high_priority_tx + 931 counters = hal_coex_8723.high_priority_tx +
941 rtlhal->hal_coex_8723.high_priority_rx; 932 hal_coex_8723.high_priority_rx;
942 return counters; 933 return counters;
943} 934}
944 935
945static u32 rtl8723ae_dm_bt_tx_rx_couter_l(struct ieee80211_hw *hw) 936static u32 rtl8723e_dm_bt_tx_rx_couter_l(struct ieee80211_hw *hw)
946{ 937{
947 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 938 u32 counters = 0;
948 939
949 return rtlhal->hal_coex_8723.low_priority_tx + 940 counters = hal_coex_8723.low_priority_tx +
950 rtlhal->hal_coex_8723.low_priority_rx; 941 hal_coex_8723.low_priority_rx;
942 return counters;
951} 943}
952 944
953static u8 rtl8723ae_dm_bt_bt_tx_rx_counter_level(struct ieee80211_hw *hw) 945static u8 rtl8723e_dm_bt_bt_tx_rx_counter_level(struct ieee80211_hw *hw)
954{ 946{
955 struct rtl_priv *rtlpriv = rtl_priv(hw); 947 struct rtl_priv *rtlpriv = rtl_priv(hw);
956 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); 948 u32 bt_tx_rx_cnt = 0;
957 u32 bt_tx_rx_cnt = 0; 949 u8 bt_tx_rx_cnt_lvl = 0;
958 u8 bt_tx_rx_cnt_lvl = 0;
959 950
960 bt_tx_rx_cnt = rtl8723ae_dm_bt_tx_rx_couter_h(hw) + 951 bt_tx_rx_cnt = rtl8723e_dm_bt_tx_rx_couter_h(hw)
961 rtl8723ae_dm_bt_tx_rx_couter_l(hw); 952 + rtl8723e_dm_bt_tx_rx_couter_l(hw);
962 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 953 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
963 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt); 954 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt);
964 955
965 rtlpcipriv->bt_coexist.cstate_h &= 956 rtlpriv->btcoexist.cstate_h &= ~
966 ~(BT_COEX_STATE_BT_CNT_LEVEL_0 | BT_COEX_STATE_BT_CNT_LEVEL_1 | 957 (BT_COEX_STATE_BT_CNT_LEVEL_0 | BT_COEX_STATE_BT_CNT_LEVEL_1|
967 BT_COEX_STATE_BT_CNT_LEVEL_2); 958 BT_COEX_STATE_BT_CNT_LEVEL_2);
968 959
969 if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_3) { 960 if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_3) {
970 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 961 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
971 "[BTCoex], BT TxRx Counters at level 3\n"); 962 "[BTCoex], BT TxRx Counters at level 3\n");
972 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_3; 963 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_3;
973 rtlpcipriv->bt_coexist.cstate_h |= BT_COEX_STATE_BT_CNT_LEVEL_3; 964 rtlpriv->btcoexist.cstate_h |=
965 BT_COEX_STATE_BT_CNT_LEVEL_3;
974 } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_2) { 966 } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_2) {
975 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 967 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
976 "[BTCoex], BT TxRx Counters at level 2\n"); 968 "[BTCoex], BT TxRx Counters at level 2\n");
977 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_2; 969 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_2;
978 rtlpcipriv->bt_coexist.cstate_h |= BT_COEX_STATE_BT_CNT_LEVEL_2; 970 rtlpriv->btcoexist.cstate_h |=
971 BT_COEX_STATE_BT_CNT_LEVEL_2;
979 } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_1) { 972 } else if (bt_tx_rx_cnt >= BT_TXRX_CNT_THRES_1) {
980 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 973 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
981 "[BTCoex], BT TxRx Counters at level 1\n"); 974 "[BTCoex], BT TxRx Counters at level 1\n");
982 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_1; 975 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_1;
983 rtlpcipriv->bt_coexist.cstate_h |= BT_COEX_STATE_BT_CNT_LEVEL_1; 976 rtlpriv->btcoexist.cstate_h |=
977 BT_COEX_STATE_BT_CNT_LEVEL_1;
984 } else { 978 } else {
985 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 979 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
986 "[BTCoex], BT TxRx Counters at level 0\n"); 980 "[BTCoex], BT TxRx Counters at level 0\n");
987 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_0; 981 bt_tx_rx_cnt_lvl = BT_TXRX_CNT_LEVEL_0;
988 rtlpcipriv->bt_coexist.cstate_h |= BT_COEX_STATE_BT_CNT_LEVEL_0; 982 rtlpriv->btcoexist.cstate_h |=
983 BT_COEX_STATE_BT_CNT_LEVEL_0;
989 } 984 }
990 return bt_tx_rx_cnt_lvl; 985 return bt_tx_rx_cnt_lvl;
991} 986}
992 987
993static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw) 988static void rtl8723e_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
994{ 989{
995 struct rtl_priv *rtlpriv = rtl_priv(hw); 990 struct rtl_priv *rtlpriv = rtl_priv(hw);
996 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
997 struct rtl_phy *rtlphy = &(rtlpriv->phy); 991 struct rtl_phy *rtlphy = &(rtlpriv->phy);
998 struct btdm_8723 btdm8723; 992 struct btdm_8723 btdm8723;
999 u8 bt_rssi_state, bt_rssi_state1; 993 u8 bt_rssi_state, bt_rssi_state1;
1000 u8 bt_tx_rx_cnt_lvl; 994 u8 bt_tx_rx_cnt_lvl = 0;
1001 995
1002 rtl8723ae_dm_bt_btdm_structure_reload(hw, &btdm8723); 996 rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);
1003 997
1004 btdm8723.rf_rx_lpf_shrink = true; 998 btdm8723.rf_rx_lpf_shrink = true;
1005 btdm8723.low_penalty_rate_adaptive = true; 999 btdm8723.low_penalty_rate_adaptive = true;
1006 btdm8723.reject_aggre_pkt = false; 1000 btdm8723.reject_aggre_pkt = false;
1007 1001
1008 bt_tx_rx_cnt_lvl = rtl8723ae_dm_bt_bt_tx_rx_counter_level(hw); 1002 bt_tx_rx_cnt_lvl = rtl8723e_dm_bt_bt_tx_rx_counter_level(hw);
1009 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1003 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1010 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl); 1004 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl);
1011 1005
@@ -1051,10 +1045,10 @@ static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1051 } else { 1045 } else {
1052 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1046 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1053 "HT20 or Legacy\n"); 1047 "HT20 or Legacy\n");
1054 bt_rssi_state = rtl8723ae_dm_bt_check_coex_rssi_state(hw, 2, 1048 bt_rssi_state =
1055 47, 0); 1049 rtl8723e_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);
1056 bt_rssi_state1 = rtl8723ae_dm_bt_check_coex_rssi_state1(hw, 2, 1050 bt_rssi_state1 =
1057 27, 0); 1051 rtl8723e_dm_bt_check_coex_rssi_state1(hw, 2, 27, 0);
1058 1052
1059 /* coex table */ 1053 /* coex table */
1060 btdm8723.val_0x6c0 = 0x55555555; 1054 btdm8723.val_0x6c0 = 0x55555555;
@@ -1063,15 +1057,15 @@ static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1063 1057
1064 /* sw mechanism */ 1058 /* sw mechanism */
1065 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) || 1059 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1066 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) { 1060 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) {
1067 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1061 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1068 "Wifi rssi high\n"); 1062 "Wifi rssi high\n");
1069 btdm8723.agc_table_en = true; 1063 btdm8723.agc_table_en = true;
1070 btdm8723.adc_back_off_on = true; 1064 btdm8723.adc_back_off_on = true;
1071 btdm8723.sw_dac_swing_on = false; 1065 btdm8723.sw_dac_swing_on = false;
1072 } else { 1066 } else {
1073 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1067 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1074 "Wifi rssi low\n"); 1068 "Wifi rssi low\n");
1075 btdm8723.agc_table_en = false; 1069 btdm8723.agc_table_en = false;
1076 btdm8723.adc_back_off_on = false; 1070 btdm8723.adc_back_off_on = false;
1077 btdm8723.sw_dac_swing_on = false; 1071 btdm8723.sw_dac_swing_on = false;
@@ -1080,16 +1074,15 @@ static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1080 /* fw mechanism */ 1074 /* fw mechanism */
1081 btdm8723.ps_tdma_on = true; 1075 btdm8723.ps_tdma_on = true;
1082 if ((bt_rssi_state1 == BT_RSSI_STATE_HIGH) || 1076 if ((bt_rssi_state1 == BT_RSSI_STATE_HIGH) ||
1083 (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH)) { 1077 (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH)) {
1084 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1078 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1085 "Wifi rssi-1 high\n"); 1079 "Wifi rssi-1 high\n");
1086 /* only rssi high we need to do this, 1080 /* only rssi high we need to do this, */
1087 * when rssi low, the value will modified by fw 1081 /* when rssi low, the value will modified by fw */
1088 */
1089 rtl_write_byte(rtlpriv, 0x883, 0x40); 1082 rtl_write_byte(rtlpriv, 0x883, 0x40);
1090 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) { 1083 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1091 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1084 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1092 "[BTCoex], BT TxRx Counters >= 1400\n"); 1085 "[BTCoex], BT TxRx Counters >= 1400\n");
1093 btdm8723.ps_tdma_byte[0] = 0xa3; 1086 btdm8723.ps_tdma_byte[0] = 0xa3;
1094 btdm8723.ps_tdma_byte[1] = 0x5; 1087 btdm8723.ps_tdma_byte[1] = 0x5;
1095 btdm8723.ps_tdma_byte[2] = 0x5; 1088 btdm8723.ps_tdma_byte[2] = 0x5;
@@ -1097,7 +1090,7 @@ static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1097 btdm8723.ps_tdma_byte[4] = 0x80; 1090 btdm8723.ps_tdma_byte[4] = 0x80;
1098 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) { 1091 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) {
1099 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1092 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1100 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"); 1093 "[BTCoex], BT TxRx Counters>= 1200 && < 1400\n");
1101 btdm8723.ps_tdma_byte[0] = 0xa3; 1094 btdm8723.ps_tdma_byte[0] = 0xa3;
1102 btdm8723.ps_tdma_byte[1] = 0xa; 1095 btdm8723.ps_tdma_byte[1] = 0xa;
1103 btdm8723.ps_tdma_byte[2] = 0xa; 1096 btdm8723.ps_tdma_byte[2] = 0xa;
@@ -1114,7 +1107,7 @@ static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1114 } 1107 }
1115 } else { 1108 } else {
1116 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1109 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1117 "Wifi rssi-1 low\n"); 1110 "Wifi rssi-1 low\n");
1118 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) { 1111 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1119 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1112 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1120 "[BTCoex], BT TxRx Counters >= 1400\n"); 1113 "[BTCoex], BT TxRx Counters >= 1400\n");
@@ -1143,16 +1136,15 @@ static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1143 } 1136 }
1144 } 1137 }
1145 1138
1146 if (rtl8723ae_dm_bt_need_to_dec_bt_pwr(hw)) 1139 if (rtl8723e_dm_bt_need_to_dec_bt_pwr(hw))
1147 btdm8723.dec_bt_pwr = true; 1140 btdm8723.dec_bt_pwr = true;
1148 1141
1149 /* Always ignore WlanAct if bHid|bSCOBusy|bSCOeSCO */ 1142 /* Always ignore WlanAct if bHid|bSCOBusy|bSCOeSCO */
1150 1143
1151 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1144 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1152 "[BTCoex], BT btInqPageStartTime = 0x%x, btTxRxCntLvl = %d\n", 1145 "[BTCoex], BT btInqPageStartTime = 0x%x, btTxRxCntLvl = %d\n",
1153 rtlhal->hal_coex_8723.bt_inq_page_start_time, 1146 hal_coex_8723.bt_inq_page_start_time, bt_tx_rx_cnt_lvl);
1154 bt_tx_rx_cnt_lvl); 1147 if ((hal_coex_8723.bt_inq_page_start_time) ||
1155 if ((rtlhal->hal_coex_8723.bt_inq_page_start_time) ||
1156 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl)) { 1148 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl)) {
1157 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1149 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1158 "[BTCoex], Set BT inquiry / page scan 0x3a setting\n"); 1150 "[BTCoex], Set BT inquiry / page scan 0x3a setting\n");
@@ -1164,33 +1156,35 @@ static void rtl8723ae_dm_bt_2_ant_hid_sco_esco(struct ieee80211_hw *hw)
1164 btdm8723.ps_tdma_byte[4] = 0x80; 1156 btdm8723.ps_tdma_byte[4] = 0x80;
1165 } 1157 }
1166 1158
1167 if (rtl8723ae_dm_bt_is_coexist_state_changed(hw)) 1159 if (rtl8723e_dm_bt_is_coexist_state_changed(hw))
1168 rtl8723ae_dm_bt_set_bt_dm(hw, &btdm8723); 1160 rtl8723e_dm_bt_set_bt_dm(hw, &btdm8723);
1161
1169} 1162}
1170 1163
1171static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw) 1164static void rtl8723e_dm_bt_2_ant_ftp_a2dp(struct ieee80211_hw *hw)
1172{ 1165{
1173 struct rtl_priv *rtlpriv = rtl_priv(hw); 1166 struct rtl_priv *rtlpriv = rtl_priv(hw);
1174 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1175 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1167 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1176 struct btdm_8723 btdm8723; 1168 struct btdm_8723 btdm8723;
1169
1177 u8 bt_rssi_state, bt_rssi_state1; 1170 u8 bt_rssi_state, bt_rssi_state1;
1178 u32 bt_tx_rx_cnt_lvl; 1171 u32 bt_tx_rx_cnt_lvl = 0;
1172
1173 rtl8723e_dm_bt_btdm_structure_reload(hw, &btdm8723);
1179 1174
1180 rtl8723ae_dm_bt_btdm_structure_reload(hw, &btdm8723);
1181 btdm8723.rf_rx_lpf_shrink = true; 1175 btdm8723.rf_rx_lpf_shrink = true;
1182 btdm8723.low_penalty_rate_adaptive = true; 1176 btdm8723.low_penalty_rate_adaptive = true;
1183 btdm8723.reject_aggre_pkt = false; 1177 btdm8723.reject_aggre_pkt = false;
1184 1178
1185 bt_tx_rx_cnt_lvl = rtl8723ae_dm_bt_bt_tx_rx_counter_level(hw); 1179 bt_tx_rx_cnt_lvl = rtl8723e_dm_bt_bt_tx_rx_counter_level(hw);
1186 1180
1187 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1181 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1188 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl); 1182 "[BTCoex], BT TxRx Counters = %d\n", bt_tx_rx_cnt_lvl);
1189 1183
1190 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 1184 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
1191 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, "HT40\n"); 1185 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, "HT40\n");
1192 bt_rssi_state = rtl8723ae_dm_bt_check_coex_rssi_state(hw, 2, 1186 bt_rssi_state =
1193 37, 0); 1187 rtl8723e_dm_bt_check_coex_rssi_state(hw, 2, 37, 0);
1194 1188
1195 /* coex table */ 1189 /* coex table */
1196 btdm8723.val_0x6c0 = 0x55555555; 1190 btdm8723.val_0x6c0 = 0x55555555;
@@ -1205,12 +1199,12 @@ static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw)
1205 /* fw mechanism */ 1199 /* fw mechanism */
1206 btdm8723.ps_tdma_on = true; 1200 btdm8723.ps_tdma_on = true;
1207 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) || 1201 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1208 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) { 1202 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) {
1209 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1203 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1210 "Wifi rssi high\n"); 1204 "Wifi rssi high\n");
1211 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) { 1205 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1212 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1206 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1213 "[BTCoex], BT TxRx Counters >= 1400\n"); 1207 "[BTCoex], BT TxRx Counters >= 1400\n");
1214 btdm8723.ps_tdma_byte[0] = 0xa3; 1208 btdm8723.ps_tdma_byte[0] = 0xa3;
1215 btdm8723.ps_tdma_byte[1] = 0x5; 1209 btdm8723.ps_tdma_byte[1] = 0x5;
1216 btdm8723.ps_tdma_byte[2] = 0x5; 1210 btdm8723.ps_tdma_byte[2] = 0x5;
@@ -1244,7 +1238,8 @@ static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw)
1244 btdm8723.ps_tdma_byte[2] = 0x5; 1238 btdm8723.ps_tdma_byte[2] = 0x5;
1245 btdm8723.ps_tdma_byte[3] = 0x0; 1239 btdm8723.ps_tdma_byte[3] = 0x0;
1246 btdm8723.ps_tdma_byte[4] = 0x80; 1240 btdm8723.ps_tdma_byte[4] = 0x80;
1247 } else if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_1) { 1241 } else if (bt_tx_rx_cnt_lvl ==
1242 BT_TXRX_CNT_LEVEL_1) {
1248 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1243 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1249 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n"); 1244 "[BTCoex], BT TxRx Counters >= 1200 && < 1400\n");
1250 btdm8723.ps_tdma_byte[0] = 0xa3; 1245 btdm8723.ps_tdma_byte[0] = 0xa3;
@@ -1265,10 +1260,10 @@ static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw)
1265 } else { 1260 } else {
1266 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1261 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1267 "HT20 or Legacy\n"); 1262 "HT20 or Legacy\n");
1268 bt_rssi_state = rtl8723ae_dm_bt_check_coex_rssi_state(hw, 2, 1263 bt_rssi_state =
1269 47, 0); 1264 rtl8723e_dm_bt_check_coex_rssi_state(hw, 2, 47, 0);
1270 bt_rssi_state1 = rtl8723ae_dm_bt_check_coex_rssi_state1(hw, 2, 1265 bt_rssi_state1 =
1271 27, 0); 1266 rtl8723e_dm_bt_check_coex_rssi_state1(hw, 2, 27, 0);
1272 1267
1273 /* coex table */ 1268 /* coex table */
1274 btdm8723.val_0x6c0 = 0x55555555; 1269 btdm8723.val_0x6c0 = 0x55555555;
@@ -1277,7 +1272,7 @@ static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw)
1277 1272
1278 /* sw mechanism */ 1273 /* sw mechanism */
1279 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) || 1274 if ((bt_rssi_state == BT_RSSI_STATE_HIGH) ||
1280 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) { 1275 (bt_rssi_state == BT_RSSI_STATE_STAY_HIGH)) {
1281 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1276 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1282 "Wifi rssi high\n"); 1277 "Wifi rssi high\n");
1283 btdm8723.agc_table_en = true; 1278 btdm8723.agc_table_en = true;
@@ -1294,12 +1289,11 @@ static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw)
1294 /* fw mechanism */ 1289 /* fw mechanism */
1295 btdm8723.ps_tdma_on = true; 1290 btdm8723.ps_tdma_on = true;
1296 if ((bt_rssi_state1 == BT_RSSI_STATE_HIGH) || 1291 if ((bt_rssi_state1 == BT_RSSI_STATE_HIGH) ||
1297 (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH)) { 1292 (bt_rssi_state1 == BT_RSSI_STATE_STAY_HIGH)) {
1298 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1293 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1299 "Wifi rssi-1 high\n"); 1294 "Wifi rssi-1 high\n");
1300 /* only rssi high we need to do this, 1295 /* only rssi high we need to do this, */
1301 * when rssi low, the value will modified by fw 1296 /* when rssi low, the value will modified by fw */
1302 */
1303 rtl_write_byte(rtlpriv, 0x883, 0x40); 1297 rtl_write_byte(rtlpriv, 0x883, 0x40);
1304 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) { 1298 if (bt_tx_rx_cnt_lvl == BT_TXRX_CNT_LEVEL_2) {
1305 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1299 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
@@ -1357,15 +1351,14 @@ static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw)
1357 } 1351 }
1358 } 1352 }
1359 1353
1360 if (rtl8723ae_dm_bt_need_to_dec_bt_pwr(hw)) 1354 if (rtl8723e_dm_bt_need_to_dec_bt_pwr(hw))
1361 btdm8723.dec_bt_pwr = true; 1355 btdm8723.dec_bt_pwr = true;
1362 1356
1363 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1357 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1364 "[BTCoex], BT btInqPageStartTime = 0x%x, btTxRxCntLvl = %d\n", 1358 "[BTCoex], BT btInqPageStartTime = 0x%x, btTxRxCntLvl = %d\n",
1365 rtlhal->hal_coex_8723.bt_inq_page_start_time, 1359 hal_coex_8723.bt_inq_page_start_time, bt_tx_rx_cnt_lvl);
1366 bt_tx_rx_cnt_lvl);
1367 1360
1368 if ((rtlhal->hal_coex_8723.bt_inq_page_start_time) || 1361 if ((hal_coex_8723.bt_inq_page_start_time) ||
1369 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl)) { 1362 (BT_TXRX_CNT_LEVEL_3 == bt_tx_rx_cnt_lvl)) {
1370 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1363 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1371 "[BTCoex], Set BT inquiry / page scan 0x3a setting\n"); 1364 "[BTCoex], Set BT inquiry / page scan 0x3a setting\n");
@@ -1377,379 +1370,373 @@ static void rtl8723ae_dm_bt_2_ant_fta2dp(struct ieee80211_hw *hw)
1377 btdm8723.ps_tdma_byte[4] = 0x80; 1370 btdm8723.ps_tdma_byte[4] = 0x80;
1378 } 1371 }
1379 1372
1380 if (rtl8723ae_dm_bt_is_coexist_state_changed(hw)) 1373 if (rtl8723e_dm_bt_is_coexist_state_changed(hw))
1381 rtl8723ae_dm_bt_set_bt_dm(hw, &btdm8723); 1374 rtl8723e_dm_bt_set_bt_dm(hw, &btdm8723);
1375
1382} 1376}
1383 1377
1384static void rtl8723ae_dm_bt_inq_page_monitor(struct ieee80211_hw *hw) 1378static void rtl8723e_dm_bt_inq_page_monitor(struct ieee80211_hw *hw)
1385{ 1379{
1386 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1387 struct rtl_priv *rtlpriv = rtl_priv(hw); 1380 struct rtl_priv *rtlpriv = rtl_priv(hw);
1388 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1381 u32 cur_time;
1389 u32 cur_time = jiffies;
1390 1382
1391 if (rtlhal->hal_coex_8723.c2h_bt_inquiry_page) { 1383 cur_time = jiffies;
1384 if (hal_coex_8723.c2h_bt_inquiry_page) {
1392 /* bt inquiry or page is started. */ 1385 /* bt inquiry or page is started. */
1393 if (rtlhal->hal_coex_8723.bt_inq_page_start_time == 0) { 1386 if (hal_coex_8723.bt_inq_page_start_time == 0) {
1394 rtlpcipriv->bt_coexist.cstate |= 1387 rtlpriv->btcoexist.cstate |=
1395 BT_COEX_STATE_BT_INQ_PAGE; 1388 BT_COEX_STATE_BT_INQ_PAGE;
1396 rtlhal->hal_coex_8723.bt_inq_page_start_time = cur_time; 1389 hal_coex_8723.bt_inq_page_start_time = cur_time;
1397 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1390 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1398 "[BTCoex], BT Inquiry/page is started at time : 0x%x\n", 1391 "[BTCoex], BT Inquiry/page is started at time : 0x%x\n",
1399 rtlhal->hal_coex_8723.bt_inq_page_start_time); 1392 hal_coex_8723.bt_inq_page_start_time);
1400 } 1393 }
1401 } 1394 }
1402 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1395 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1403 "[BTCoex], BT Inquiry/page started time : 0x%x, cur_time : 0x%x\n", 1396 "[BTCoex], BT Inquiry/page started time : 0x%x, cur_time : 0x%x\n",
1404 rtlhal->hal_coex_8723.bt_inq_page_start_time, cur_time); 1397 hal_coex_8723.bt_inq_page_start_time, cur_time);
1405 1398
1406 if (rtlhal->hal_coex_8723.bt_inq_page_start_time) { 1399 if (hal_coex_8723.bt_inq_page_start_time) {
1407 if ((((long)cur_time - 1400 if ((((long)cur_time -
1408 (long)rtlhal->hal_coex_8723.bt_inq_page_start_time) / HZ) >= 1401 (long)hal_coex_8723.bt_inq_page_start_time) / HZ)
1409 10) { 1402 >= 10) {
1410 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1403 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1411 "[BTCoex], BT Inquiry/page >= 10sec!!!"); 1404 "[BTCoex], BT Inquiry/page >= 10sec!!!");
1412 rtlhal->hal_coex_8723.bt_inq_page_start_time = 0; 1405 hal_coex_8723.bt_inq_page_start_time = 0;
1413 rtlpcipriv->bt_coexist.cstate &= 1406 rtlpriv->btcoexist.cstate &=
1414 ~BT_COEX_STATE_BT_INQ_PAGE; 1407 ~BT_COEX_STATE_BT_INQ_PAGE;
1415 } 1408 }
1416 } 1409 }
1417} 1410}
1418 1411
1419static void rtl8723ae_dm_bt_reset_action_profile_state(struct ieee80211_hw *hw) 1412static void rtl8723e_dm_bt_reset_action_profile_state(struct ieee80211_hw *hw)
1420{ 1413{
1421 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); 1414 struct rtl_priv *rtlpriv = rtl_priv(hw);
1422 1415
1423 rtlpcipriv->bt_coexist.cstate &= 1416 rtlpriv->btcoexist.cstate &= ~
1424 ~(BT_COEX_STATE_PROFILE_HID | BT_COEX_STATE_PROFILE_A2DP | 1417 (BT_COEX_STATE_PROFILE_HID | BT_COEX_STATE_PROFILE_A2DP|
1425 BT_COEX_STATE_PROFILE_PAN | BT_COEX_STATE_PROFILE_SCO); 1418 BT_COEX_STATE_PROFILE_PAN | BT_COEX_STATE_PROFILE_SCO);
1426 1419
1427 rtlpcipriv->bt_coexist.cstate &= 1420 rtlpriv->btcoexist.cstate &= ~
1428 ~(BT_COEX_STATE_BTINFO_COMMON | 1421 (BT_COEX_STATE_BTINFO_COMMON |
1429 BT_COEX_STATE_BTINFO_B_HID_SCOESCO | 1422 BT_COEX_STATE_BTINFO_B_HID_SCOESCO|
1430 BT_COEX_STATE_BTINFO_B_FTP_A2DP); 1423 BT_COEX_STATE_BTINFO_B_FTP_A2DP);
1431} 1424}
1432 1425
1433static void _rtl8723ae_dm_bt_coexist_2_ant(struct ieee80211_hw *hw) 1426static void _rtl8723e_dm_bt_coexist_2_ant(struct ieee80211_hw *hw)
1434{ 1427{
1435 struct rtl_priv *rtlpriv = rtl_priv(hw); 1428 struct rtl_priv *rtlpriv = rtl_priv(hw);
1436 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1429 u8 bt_retry_cnt;
1437 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1438 u8 bt_info_original; 1430 u8 bt_info_original;
1439 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1431 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1440 "[BTCoex] Get bt info by fw!!\n"); 1432 "[BTCoex] Get bt info by fw!!\n");
1441 1433
1442 _rtl8723_dm_bt_check_wifi_state(hw); 1434 _rtl8723_dm_bt_check_wifi_state(hw);
1443 1435
1444 if (rtlhal->hal_coex_8723.c2h_bt_info_req_sent) { 1436 if (hal_coex_8723.c2h_bt_info_req_sent) {
1445 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1437 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1446 "[BTCoex] c2h for btInfo not rcvd yet!!\n"); 1438 "[BTCoex] c2h for bt_info not rcvd yet!!\n");
1447 } 1439 }
1448 1440
1449 bt_info_original = rtlhal->hal_coex_8723.c2h_bt_info_original; 1441 bt_retry_cnt = hal_coex_8723.bt_retry_cnt;
1442 bt_info_original = hal_coex_8723.c2h_bt_info_original;
1450 1443
1451 /* when bt inquiry or page scan, we have to set h2c 0x25 1444 /* when bt inquiry or page scan, we have to set h2c 0x25 */
1452 * ignore wlanact for continuous 4x2secs 1445 /* ignore wlanact for continuous 4x2secs */
1453 */ 1446 rtl8723e_dm_bt_inq_page_monitor(hw);
1454 rtl8723ae_dm_bt_inq_page_monitor(hw); 1447 rtl8723e_dm_bt_reset_action_profile_state(hw);
1455 rtl8723ae_dm_bt_reset_action_profile_state(hw);
1456
1457 if (rtl8723ae_dm_bt_is_2_ant_common_action(hw)) {
1458 rtlpcipriv->bt_coexist.bt_profile_case = BT_COEX_MECH_COMMON;
1459 rtlpcipriv->bt_coexist.bt_profile_action = BT_COEX_MECH_COMMON;
1460 1448
1449 if (rtl8723e_dm_bt_is_2_ant_common_action(hw)) {
1450 rtlpriv->btcoexist.bt_profile_case = BT_COEX_MECH_COMMON;
1451 rtlpriv->btcoexist.bt_profile_action = BT_COEX_MECH_COMMON;
1461 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1452 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1462 "Action 2-Ant common.\n"); 1453 "Action 2-Ant common.\n");
1463 } else { 1454 } else {
1464 if ((bt_info_original & BTINFO_B_HID) || 1455 if ((bt_info_original & BTINFO_B_HID) ||
1465 (bt_info_original & BTINFO_B_SCO_BUSY) || 1456 (bt_info_original & BTINFO_B_SCO_BUSY) ||
1466 (bt_info_original & BTINFO_B_SCO_ESCO)) { 1457 (bt_info_original & BTINFO_B_SCO_ESCO)) {
1467 rtlpcipriv->bt_coexist.cstate |= 1458 rtlpriv->btcoexist.cstate |=
1468 BT_COEX_STATE_BTINFO_B_HID_SCOESCO; 1459 BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1469 rtlpcipriv->bt_coexist.bt_profile_case = 1460 rtlpriv->btcoexist.bt_profile_case =
1470 BT_COEX_MECH_HID_SCO_ESCO; 1461 BT_COEX_MECH_HID_SCO_ESCO;
1471 rtlpcipriv->bt_coexist.bt_profile_action = 1462 rtlpriv->btcoexist.bt_profile_action =
1472 BT_COEX_MECH_HID_SCO_ESCO; 1463 BT_COEX_MECH_HID_SCO_ESCO;
1473 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1464 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1474 "[BTCoex], BTInfo: bHid|bSCOBusy|bSCOeSCO\n"); 1465 "[BTCoex], BTInfo: bHid|bSCOBusy|bSCOeSCO\n");
1475 rtl8723ae_dm_bt_2_ant_hid_sco_esco(hw); 1466 rtl8723e_dm_bt_2_ant_hid_sco_esco(hw);
1476 } else if ((bt_info_original & BTINFO_B_FTP) || 1467 } else if ((bt_info_original & BTINFO_B_FTP) ||
1477 (bt_info_original & BTINFO_B_A2DP)) { 1468 (bt_info_original & BTINFO_B_A2DP)) {
1478 rtlpcipriv->bt_coexist.cstate |= 1469 rtlpriv->btcoexist.cstate |=
1479 BT_COEX_STATE_BTINFO_B_FTP_A2DP; 1470 BT_COEX_STATE_BTINFO_B_FTP_A2DP;
1480 rtlpcipriv->bt_coexist.bt_profile_case = 1471 rtlpriv->btcoexist.bt_profile_case =
1481 BT_COEX_MECH_FTP_A2DP; 1472 BT_COEX_MECH_FTP_A2DP;
1482 rtlpcipriv->bt_coexist.bt_profile_action = 1473 rtlpriv->btcoexist.bt_profile_action =
1483 BT_COEX_MECH_FTP_A2DP; 1474 BT_COEX_MECH_FTP_A2DP;
1484 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1475 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1485 "BTInfo: bFTP|bA2DP\n"); 1476 "BTInfo: bFTP|bA2DP\n");
1486 rtl8723ae_dm_bt_2_ant_fta2dp(hw); 1477 rtl8723e_dm_bt_2_ant_ftp_a2dp(hw);
1487 } else { 1478 } else {
1488 rtlpcipriv->bt_coexist.cstate |= 1479 rtlpriv->btcoexist.cstate |=
1489 BT_COEX_STATE_BTINFO_B_HID_SCOESCO; 1480 BT_COEX_STATE_BTINFO_B_HID_SCOESCO;
1490 rtlpcipriv->bt_coexist.bt_profile_case = 1481 rtlpriv->btcoexist.bt_profile_case =
1491 BT_COEX_MECH_NONE; 1482 BT_COEX_MECH_NONE;
1492 rtlpcipriv->bt_coexist.bt_profile_action = 1483 rtlpriv->btcoexist.bt_profile_action =
1493 BT_COEX_MECH_NONE; 1484 BT_COEX_MECH_NONE;
1494 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1485 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1495 "[BTCoex], BTInfo: undefined case!!!!\n"); 1486 "[BTCoex], BTInfo: undefined case!!!!\n");
1496 rtl8723ae_dm_bt_2_ant_hid_sco_esco(hw); 1487 rtl8723e_dm_bt_2_ant_hid_sco_esco(hw);
1497 } 1488 }
1498 } 1489 }
1499} 1490}
1500 1491
1501static void _rtl8723ae_dm_bt_coexist_1_ant(struct ieee80211_hw *hw) 1492static void _rtl8723e_dm_bt_coexist_1_ant(struct ieee80211_hw *hw)
1502{ 1493{
1494 return;
1503} 1495}
1504 1496
1505void rtl8723ae_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw) 1497void rtl8723e_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw)
1506{ 1498{
1507 rtl8723ae_dm_bt_set_coex_table(hw, 0x5a5aaaaa, 0xcc, 0x3); 1499 rtl8723e_dm_bt_set_coex_table(hw, 0x5a5aaaaa, 0xcc, 0x3);
1508 rtl8723ae_dm_bt_set_hw_pta_mode(hw, true); 1500 rtl8723e_dm_bt_set_hw_pta_mode(hw, true);
1509} 1501}
1510 1502
1511void rtl8723ae_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw) 1503void rtl8723e_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw)
1512{ 1504{
1513 rtl8723ae_dm_bt_set_fw_ignore_wlan_act(hw, false); 1505 rtl8723e_dm_bt_set_fw_ignore_wlan_act(hw, false);
1514 rtl8723ae_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0); 1506 rtl8723e_dm_bt_set_fw_3a(hw, 0x0, 0x0, 0x0, 0x8, 0x0);
1515 rtl8723ae_dm_bt_set_fw_2_ant_hid(hw, false, false); 1507 rtl8723e_dm_bt_set_fw_2_ant_hid(hw, false, false);
1516 rtl8723ae_dm_bt_set_fw_tra_tdma_ctrl(hw, false, 1508 rtl8723e_dm_bt_set_fw_tra_tdma_ctrl(hw, false, TDMA_2ANT,
1517 TDMA_2ANT, TDMA_NAV_OFF); 1509 TDMA_NAV_OFF);
1518 rtl8723ae_dm_bt_set_fw_tdma_ctrl(hw, false, TDMA_2ANT, 1510 rtl8723e_dm_bt_set_fw_tdma_ctrl(hw, false, TDMA_2ANT, TDMA_NAV_OFF,
1519 TDMA_NAV_OFF, TDMA_DAC_SWING_OFF); 1511 TDMA_DAC_SWING_OFF);
1520 rtl8723ae_dm_bt_set_fw_dac_swing_level(hw, 0); 1512 rtl8723e_dm_bt_set_fw_dac_swing_level(hw, 0);
1521 rtl8723ae_dm_bt_set_fw_bt_hid_info(hw, false); 1513 rtl8723e_dm_bt_set_fw_bt_hid_info(hw, false);
1522 rtl8723ae_dm_bt_set_fw_bt_retry_index(hw, 2); 1514 rtl8723e_dm_bt_set_fw_bt_retry_index(hw, 2);
1523 rtl8723ae_dm_bt_set_fw_wlan_act(hw, 0x10, 0x10); 1515 rtl8723e_dm_bt_set_fw_wlan_act(hw, 0x10, 0x10);
1524 rtl8723ae_dm_bt_set_fw_dec_bt_pwr(hw, false); 1516 rtl8723e_dm_bt_set_fw_dec_bt_pwr(hw, false);
1525} 1517}
1526 1518
1527void rtl8723ae_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw) 1519void rtl8723e_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw)
1528{ 1520{
1529 rtl8723ae_dm_bt_agc_table(hw, BT_AGCTABLE_OFF); 1521 rtl8723e_dm_bt_agc_table(hw, BT_AGCTABLE_OFF);
1530 rtl8723ae_dm_bt_bback_off_level(hw, BT_BB_BACKOFF_OFF); 1522 rtl8723e_dm_bt_bb_back_off_level(hw, BT_BB_BACKOFF_OFF);
1531 rtl8723ae_dm_bt_reject_ap_aggregated_packet(hw, false); 1523 rtl8723e_dm_bt_reject_ap_aggregated_packet(hw, false);
1532 1524
1533 rtl8723ae_bt_set_penalty_tx_rate_adap(hw, BT_TX_RATE_ADAPTIVE_NORMAL); 1525 dm_bt_set_sw_penalty_tx_rate_adapt(hw, BT_TX_RATE_ADAPTIVE_NORMAL);
1534 rtl8723ae_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME); 1526 rtl8723e_dm_bt_set_sw_rf_rx_lpf_corner(hw, BT_RF_RX_LPF_CORNER_RESUME);
1535 rtl8723ae_dm_bt_set_sw_full_time_dac_swing(hw, false, 0xc0); 1527 rtl8723e_dm_bt_set_sw_full_time_dac_swing(hw, false, 0xc0);
1536} 1528}
1537 1529
1538static void rtl8723ae_dm_bt_query_bt_information(struct ieee80211_hw *hw) 1530static void rtl8723e_dm_bt_query_bt_information(struct ieee80211_hw *hw)
1539{ 1531{
1540 struct rtl_priv *rtlpriv = rtl_priv(hw); 1532 struct rtl_priv *rtlpriv = rtl_priv(hw);
1541 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1542 u8 h2c_parameter[1] = {0}; 1533 u8 h2c_parameter[1] = {0};
1543 1534
1544 rtlhal->hal_coex_8723.c2h_bt_info_req_sent = true; 1535 hal_coex_8723.c2h_bt_info_req_sent = true;
1545 1536
1546 h2c_parameter[0] |= BIT(0); 1537 h2c_parameter[0] |= BIT(0);
1547 1538
1548 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1539 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1549 "Query Bt information, write 0x38 = 0x%x\n", 1540 "Query Bt information, write 0x38=0x%x\n", h2c_parameter[0]);
1550 h2c_parameter[0]);
1551 1541
1552 rtl8723ae_fill_h2c_cmd(hw, 0x38, 1, h2c_parameter); 1542 rtl8723e_fill_h2c_cmd(hw, 0x38, 1, h2c_parameter);
1553} 1543}
1554 1544
1555static void rtl8723ae_dm_bt_bt_hw_counters_monitor(struct ieee80211_hw *hw) 1545static void rtl8723e_dm_bt_bt_hw_counters_monitor(struct ieee80211_hw *hw)
1556{ 1546{
1557 struct rtl_priv *rtlpriv = rtl_priv(hw); 1547 struct rtl_priv *rtlpriv = rtl_priv(hw);
1558 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1548 u32 reg_hp_tx_rx, reg_lp_tx_rx, u32_tmp;
1559 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw); 1549 u32 reg_hp_tx = 0, reg_hp_rx = 0, reg_lp_tx = 0, reg_lp_rx = 0;
1560 u32 reg_htx_rx, reg_ltx_rx, u32_tmp; 1550
1561 u32 reg_htx, reg_hrx, reg_ltx, reg_lrx; 1551 reg_hp_tx_rx = REG_HIGH_PRIORITY_TXRX;
1562 1552 reg_lp_tx_rx = REG_LOW_PRIORITY_TXRX;
1563 reg_htx_rx = REG_HIGH_PRIORITY_TXRX; 1553
1564 reg_ltx_rx = REG_LOW_PRIORITY_TXRX; 1554 u32_tmp = rtl_read_dword(rtlpriv, reg_hp_tx_rx);
1565 1555 reg_hp_tx = u32_tmp & MASKLWORD;
1566 u32_tmp = rtl_read_dword(rtlpriv, reg_htx_rx); 1556 reg_hp_rx = (u32_tmp & MASKHWORD)>>16;
1567 reg_htx = u32_tmp & MASKLWORD; 1557
1568 reg_hrx = (u32_tmp & MASKHWORD)>>16; 1558 u32_tmp = rtl_read_dword(rtlpriv, reg_lp_tx_rx);
1569 1559 reg_lp_tx = u32_tmp & MASKLWORD;
1570 u32_tmp = rtl_read_dword(rtlpriv, reg_ltx_rx); 1560 reg_lp_rx = (u32_tmp & MASKHWORD)>>16;
1571 reg_ltx = u32_tmp & MASKLWORD; 1561
1572 reg_lrx = (u32_tmp & MASKHWORD)>>16; 1562 if (rtlpriv->btcoexist.lps_counter > 1) {
1573 1563 reg_hp_tx %= rtlpriv->btcoexist.lps_counter;
1574 if (rtlpcipriv->bt_coexist.lps_counter > 1) { 1564 reg_hp_rx %= rtlpriv->btcoexist.lps_counter;
1575 reg_htx %= rtlpcipriv->bt_coexist.lps_counter; 1565 reg_lp_tx %= rtlpriv->btcoexist.lps_counter;
1576 reg_hrx %= rtlpcipriv->bt_coexist.lps_counter; 1566 reg_lp_rx %= rtlpriv->btcoexist.lps_counter;
1577 reg_ltx %= rtlpcipriv->bt_coexist.lps_counter;
1578 reg_lrx %= rtlpcipriv->bt_coexist.lps_counter;
1579 } 1567 }
1580 1568
1581 rtlhal->hal_coex_8723.high_priority_tx = reg_htx; 1569 hal_coex_8723.high_priority_tx = reg_hp_tx;
1582 rtlhal->hal_coex_8723.high_priority_rx = reg_hrx; 1570 hal_coex_8723.high_priority_rx = reg_hp_rx;
1583 rtlhal->hal_coex_8723.low_priority_tx = reg_ltx; 1571 hal_coex_8723.low_priority_tx = reg_lp_tx;
1584 rtlhal->hal_coex_8723.low_priority_rx = reg_lrx; 1572 hal_coex_8723.low_priority_rx = reg_lp_rx;
1585 1573
1586 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1574 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1587 "High Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n", 1575 "High Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1588 reg_htx_rx, reg_htx, reg_htx, reg_hrx, reg_hrx); 1576 reg_hp_tx_rx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
1589 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1577 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1590 "Low Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n", 1578 "Low Priority Tx/Rx (reg 0x%x)=%x(%d)/%x(%d)\n",
1591 reg_ltx_rx, reg_ltx, reg_ltx, reg_lrx, reg_lrx); 1579 reg_lp_tx_rx, reg_lp_tx, reg_lp_tx, reg_lp_rx, reg_lp_rx);
1592 rtlpcipriv->bt_coexist.lps_counter = 0; 1580 rtlpriv->btcoexist.lps_counter = 0;
1581 /* rtl_write_byte(rtlpriv, 0x76e, 0xc); */
1593} 1582}
1594 1583
1595static void rtl8723ae_dm_bt_bt_enable_disable_check(struct ieee80211_hw *hw) 1584static void rtl8723e_dm_bt_bt_enable_disable_check(struct ieee80211_hw *hw)
1596{ 1585{
1597 struct rtl_priv *rtlpriv = rtl_priv(hw); 1586 struct rtl_priv *rtlpriv = rtl_priv(hw);
1598 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1599 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1600 bool bt_alife = true; 1587 bool bt_alife = true;
1601 1588
1602 if (rtlhal->hal_coex_8723.high_priority_tx == 0 && 1589 if (hal_coex_8723.high_priority_tx == 0 &&
1603 rtlhal->hal_coex_8723.high_priority_rx == 0 && 1590 hal_coex_8723.high_priority_rx == 0 &&
1604 rtlhal->hal_coex_8723.low_priority_tx == 0 && 1591 hal_coex_8723.low_priority_tx == 0 &&
1605 rtlhal->hal_coex_8723.low_priority_rx == 0) 1592 hal_coex_8723.low_priority_rx == 0) {
1606 bt_alife = false; 1593 bt_alife = false;
1607 if (rtlhal->hal_coex_8723.high_priority_tx == 0xeaea && 1594 }
1608 rtlhal->hal_coex_8723.high_priority_rx == 0xeaea && 1595 if (hal_coex_8723.high_priority_tx == 0xeaea &&
1609 rtlhal->hal_coex_8723.low_priority_tx == 0xeaea && 1596 hal_coex_8723.high_priority_rx == 0xeaea &&
1610 rtlhal->hal_coex_8723.low_priority_rx == 0xeaea) 1597 hal_coex_8723.low_priority_tx == 0xeaea &&
1598 hal_coex_8723.low_priority_rx == 0xeaea) {
1611 bt_alife = false; 1599 bt_alife = false;
1612 if (rtlhal->hal_coex_8723.high_priority_tx == 0xffff && 1600 }
1613 rtlhal->hal_coex_8723.high_priority_rx == 0xffff && 1601 if (hal_coex_8723.high_priority_tx == 0xffff &&
1614 rtlhal->hal_coex_8723.low_priority_tx == 0xffff && 1602 hal_coex_8723.high_priority_rx == 0xffff &&
1615 rtlhal->hal_coex_8723.low_priority_rx == 0xffff) 1603 hal_coex_8723.low_priority_tx == 0xffff &&
1604 hal_coex_8723.low_priority_rx == 0xffff) {
1616 bt_alife = false; 1605 bt_alife = false;
1606 }
1617 if (bt_alife) { 1607 if (bt_alife) {
1618 rtlpcipriv->bt_coexist.bt_active_zero_cnt = 0; 1608 rtlpriv->btcoexist.bt_active_zero_cnt = 0;
1619 rtlpcipriv->bt_coexist.cur_bt_disabled = false; 1609 rtlpriv->btcoexist.cur_bt_disabled = false;
1620 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1610 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1621 "8723A BT is enabled !!\n"); 1611 "8723A BT is enabled !!\n");
1622 } else { 1612 } else {
1623 rtlpcipriv->bt_coexist.bt_active_zero_cnt++; 1613 rtlpriv->btcoexist.bt_active_zero_cnt++;
1624 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1614 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1625 "8723A bt all counters = 0, %d times!!\n", 1615 "8723A bt all counters=0, %d times!!\n",
1626 rtlpcipriv->bt_coexist.bt_active_zero_cnt); 1616 rtlpriv->btcoexist.bt_active_zero_cnt);
1627 if (rtlpcipriv->bt_coexist.bt_active_zero_cnt >= 2) { 1617 if (rtlpriv->btcoexist.bt_active_zero_cnt >= 2) {
1628 rtlpcipriv->bt_coexist.cur_bt_disabled = true; 1618 rtlpriv->btcoexist.cur_bt_disabled = true;
1629 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1619 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1630 "8723A BT is disabled !!\n"); 1620 "8723A BT is disabled !!\n");
1631 } 1621 }
1632 } 1622 }
1633 if (rtlpcipriv->bt_coexist.pre_bt_disabled != 1623 if (rtlpriv->btcoexist.pre_bt_disabled !=
1634 rtlpcipriv->bt_coexist.cur_bt_disabled) { 1624 rtlpriv->btcoexist.cur_bt_disabled) {
1635 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1625 RT_TRACE(rtlpriv, COMP_BT_COEXIST,
1636 "8723A BT is from %s to %s!!\n", 1626 DBG_TRACE, "8723A BT is from %s to %s!!\n",
1637 (rtlpcipriv->bt_coexist.pre_bt_disabled ? 1627 (rtlpriv->btcoexist.pre_bt_disabled ?
1638 "disabled" : "enabled"), 1628 "disabled" : "enabled"),
1639 (rtlpcipriv->bt_coexist.cur_bt_disabled ? 1629 (rtlpriv->btcoexist.cur_bt_disabled ?
1640 "disabled" : "enabled")); 1630 "disabled" : "enabled"));
1641 rtlpcipriv->bt_coexist.pre_bt_disabled 1631 rtlpriv->btcoexist.pre_bt_disabled
1642 = rtlpcipriv->bt_coexist.cur_bt_disabled; 1632 = rtlpriv->btcoexist.cur_bt_disabled;
1643 } 1633 }
1644} 1634}
1645 1635
1646 1636
1647void rtl8723ae_dm_bt_coexist_8723(struct ieee80211_hw *hw) 1637void rtl8723e_dm_bt_coexist_8723(struct ieee80211_hw *hw)
1648{ 1638{
1649 struct rtl_priv *rtlpriv = rtl_priv(hw); 1639 struct rtl_priv *rtlpriv = rtl_priv(hw);
1650 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1651 1640
1652 rtl8723ae_dm_bt_query_bt_information(hw); 1641 rtl8723e_dm_bt_query_bt_information(hw);
1653 rtl8723ae_dm_bt_bt_hw_counters_monitor(hw); 1642 rtl8723e_dm_bt_bt_hw_counters_monitor(hw);
1654 rtl8723ae_dm_bt_bt_enable_disable_check(hw); 1643 rtl8723e_dm_bt_bt_enable_disable_check(hw);
1655 1644
1656 if (rtlpcipriv->bt_coexist.bt_ant_num == ANT_X2) { 1645 if (rtlpriv->btcoexist.bt_ant_num == ANT_X2) {
1657 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1646 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1658 "[BTCoex], 2 Ant mechanism\n"); 1647 "[BTCoex], 2 Ant mechanism\n");
1659 _rtl8723ae_dm_bt_coexist_2_ant(hw); 1648 _rtl8723e_dm_bt_coexist_2_ant(hw);
1660 } else { 1649 } else {
1661 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1650 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1662 "[BTCoex], 1 Ant mechanism\n"); 1651 "[BTCoex], 1 Ant mechanism\n");
1663 _rtl8723ae_dm_bt_coexist_1_ant(hw); 1652 _rtl8723e_dm_bt_coexist_1_ant(hw);
1664 } 1653 }
1665 1654
1666 if (!rtl8723ae_dm_bt_is_same_coexist_state(hw)) { 1655 if (!rtl8723e_dm_bt_is_same_coexist_state(hw)) {
1667 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1656 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1668 "[BTCoex], Coexist State[bitMap] change from 0x%x%8x to 0x%x%8x\n", 1657 "[BTCoex], Coexist State[bitMap] change from 0x%x%8x to 0x%x%8x\n",
1669 rtlpcipriv->bt_coexist.previous_state_h, 1658 rtlpriv->btcoexist.previous_state_h,
1670 rtlpcipriv->bt_coexist.previous_state, 1659 rtlpriv->btcoexist.previous_state,
1671 rtlpcipriv->bt_coexist.cstate_h, 1660 rtlpriv->btcoexist.cstate_h,
1672 rtlpcipriv->bt_coexist.cstate); 1661 rtlpriv->btcoexist.cstate);
1673 rtlpcipriv->bt_coexist.previous_state 1662 rtlpriv->btcoexist.previous_state
1674 = rtlpcipriv->bt_coexist.cstate; 1663 = rtlpriv->btcoexist.cstate;
1675 rtlpcipriv->bt_coexist.previous_state_h 1664 rtlpriv->btcoexist.previous_state_h
1676 = rtlpcipriv->bt_coexist.cstate_h; 1665 = rtlpriv->btcoexist.cstate_h;
1677 } 1666 }
1678} 1667}
1679 1668
1680static void rtl8723ae_dm_bt_parse_bt_info(struct ieee80211_hw *hw, 1669static void rtl8723e_dm_bt_parse_bt_info(struct ieee80211_hw *hw,
1681 u8 *tmbuf, u8 len) 1670 u8 *tmp_buf, u8 len)
1682{ 1671{
1683 struct rtl_priv *rtlpriv = rtl_priv(hw); 1672 struct rtl_priv *rtlpriv = rtl_priv(hw);
1684 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1685 struct rtl_pci_priv *rtlpcipriv = rtl_pcipriv(hw);
1686 u8 bt_info; 1673 u8 bt_info;
1687 u8 i; 1674 u8 i;
1688 1675
1689 rtlhal->hal_coex_8723.c2h_bt_info_req_sent = false; 1676 hal_coex_8723.c2h_bt_info_req_sent = false;
1690 rtlhal->hal_coex_8723.bt_retry_cnt = 0; 1677 hal_coex_8723.bt_retry_cnt = 0;
1691 for (i = 0; i < len; i++) { 1678 for (i = 0; i < len; i++) {
1692 if (i == 0) 1679 if (i == 0)
1693 rtlhal->hal_coex_8723.c2h_bt_info_original = tmbuf[i]; 1680 hal_coex_8723.c2h_bt_info_original = tmp_buf[i];
1694 else if (i == 1) 1681 else if (i == 1)
1695 rtlhal->hal_coex_8723.bt_retry_cnt = tmbuf[i]; 1682 hal_coex_8723.bt_retry_cnt = tmp_buf[i];
1696 if (i == len-1) { 1683 if (i == len-1)
1697 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1684 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1698 "0x%2x]", tmbuf[i]); 1685 "0x%2x]", tmp_buf[i]);
1699 } else { 1686 else
1700 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 1687 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
1701 "0x%2x, ", tmbuf[i]); 1688 "0x%2x, ", tmp_buf[i]);
1702 } 1689
1703 } 1690 }
1704 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1691 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1705 "BT info bt_info (Data)= 0x%x\n", 1692 "BT info bt_info (Data)= 0x%x\n",
1706 rtlhal->hal_coex_8723.c2h_bt_info_original); 1693 hal_coex_8723.c2h_bt_info_original);
1707 bt_info = rtlhal->hal_coex_8723.c2h_bt_info_original; 1694 bt_info = hal_coex_8723.c2h_bt_info_original;
1708 1695
1709 if (bt_info & BIT(2)) 1696 if (bt_info & BIT(2))
1710 rtlhal->hal_coex_8723.c2h_bt_inquiry_page = true; 1697 hal_coex_8723.c2h_bt_inquiry_page = true;
1711 else 1698 else
1712 rtlhal->hal_coex_8723.c2h_bt_inquiry_page = false; 1699 hal_coex_8723.c2h_bt_inquiry_page = false;
1700
1713 1701
1714 if (bt_info & BTINFO_B_CONNECTION) { 1702 if (bt_info & BTINFO_B_CONNECTION) {
1715 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1703 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1716 "[BTC2H], BTInfo: bConnect=true\n"); 1704 "[BTC2H], BTInfo: bConnect=true\n");
1717 rtlpcipriv->bt_coexist.bt_busy = true; 1705 rtlpriv->btcoexist.bt_busy = true;
1718 rtlpcipriv->bt_coexist.cstate &= ~BT_COEX_STATE_BT_IDLE; 1706 rtlpriv->btcoexist.cstate &= ~BT_COEX_STATE_BT_IDLE;
1719 } else { 1707 } else {
1720 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 1708 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_DMESG,
1721 "[BTC2H], BTInfo: bConnect=false\n"); 1709 "[BTC2H], BTInfo: bConnect=false\n");
1722 rtlpcipriv->bt_coexist.bt_busy = false; 1710 rtlpriv->btcoexist.bt_busy = false;
1723 rtlpcipriv->bt_coexist.cstate |= BT_COEX_STATE_BT_IDLE; 1711 rtlpriv->btcoexist.cstate |= BT_COEX_STATE_BT_IDLE;
1724 } 1712 }
1725} 1713}
1726void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw) 1714void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw)
1727{ 1715{
1728 struct rtl_priv *rtlpriv = rtl_priv(hw); 1716 struct rtl_priv *rtlpriv = rtl_priv(hw);
1729 struct c2h_evt_hdr c2h_event; 1717 struct c2h_evt_hdr c2h_event;
1730 u8 *ptmbuf; 1718 u8 *ptmp_buf = NULL;
1731 u8 index; 1719 u8 index = 0;
1732 u8 u1tmp; 1720 u8 u1b_tmp = 0;
1733
1734 memset(&c2h_event, 0, sizeof(c2h_event)); 1721 memset(&c2h_event, 0, sizeof(c2h_event));
1735 u1tmp = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL); 1722 u1b_tmp = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL);
1736 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 1723 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
1737 "&&&&&&: REG_C2HEVT_MSG_NORMAL is 0x%x\n", u1tmp); 1724 "&&&&&&: REG_C2HEVT_MSG_NORMAL is 0x%x\n", u1b_tmp);
1738 c2h_event.cmd_id = u1tmp & 0xF; 1725 c2h_event.cmd_id = u1b_tmp & 0xF;
1739 c2h_event.cmd_len = (u1tmp & 0xF0) >> 4; 1726 c2h_event.cmd_len = (u1b_tmp & 0xF0) >> 4;
1740 c2h_event.cmd_seq = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 1); 1727 c2h_event.cmd_seq = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 1);
1741 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG, 1728 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
1742 "cmd_id: %d, cmd_len: %d, cmd_seq: %d\n", 1729 "cmd_id: %d, cmd_len: %d, cmd_seq: %d\n",
1743 c2h_event.cmd_id , c2h_event.cmd_len, c2h_event.cmd_seq); 1730 c2h_event.cmd_id , c2h_event.cmd_len, c2h_event.cmd_seq);
1744 u1tmp = rtl_read_byte(rtlpriv, 0x01AF); 1731 u1b_tmp = rtl_read_byte(rtlpriv, 0x01AF);
1745 if (u1tmp == C2H_EVT_HOST_CLOSE) { 1732 if (u1b_tmp == C2H_EVT_HOST_CLOSE) {
1746 return; 1733 return;
1747 } else if (u1tmp != C2H_EVT_FW_CLOSE) { 1734 } else if (u1b_tmp != C2H_EVT_FW_CLOSE) {
1748 rtl_write_byte(rtlpriv, 0x1AF, 0x00); 1735 rtl_write_byte(rtlpriv, 0x1AF, 0x00);
1749 return; 1736 return;
1750 } 1737 }
1751 ptmbuf = kmalloc(c2h_event.cmd_len, GFP_KERNEL); 1738 ptmp_buf = kzalloc(c2h_event.cmd_len, GFP_KERNEL);
1752 if (ptmbuf == NULL) { 1739 if (ptmp_buf == NULL) {
1753 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, 1740 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
1754 "malloc cmd buf failed\n"); 1741 "malloc cmd buf failed\n");
1755 return; 1742 return;
@@ -1757,30 +1744,37 @@ void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw)
1757 1744
1758 /* Read the content */ 1745 /* Read the content */
1759 for (index = 0; index < c2h_event.cmd_len; index++) 1746 for (index = 0; index < c2h_event.cmd_len; index++)
1760 ptmbuf[index] = rtl_read_byte(rtlpriv, REG_C2HEVT_MSG_NORMAL + 1747 ptmp_buf[index] = rtl_read_byte(rtlpriv,
1761 2 + index); 1748 REG_C2HEVT_MSG_NORMAL + 2 + index);
1749
1762 1750
1763 switch (c2h_event.cmd_id) { 1751 switch (c2h_event.cmd_id) {
1764 case C2H_BT_RSSI: 1752 case C2H_BT_RSSI:
1765 break; 1753 break;
1766 1754
1767 case C2H_BT_OP_MODE: 1755 case C2H_BT_OP_MODE:
1768 break; 1756 break;
1769 1757
1770 case BT_INFO: 1758 case BT_INFO:
1771 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, 1759 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
1772 "BT info Byte[0] (ID) is 0x%x\n", c2h_event.cmd_id); 1760 "BT info Byte[0] (ID) is 0x%x\n",
1761 c2h_event.cmd_id);
1773 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, 1762 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
1774 "BT info Byte[1] (Seq) is 0x%x\n", c2h_event.cmd_seq); 1763 "BT info Byte[1] (Seq) is 0x%x\n",
1764 c2h_event.cmd_seq);
1775 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, 1765 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
1776 "BT info Byte[2] (Data)= 0x%x\n", ptmbuf[0]); 1766 "BT info Byte[2] (Data)= 0x%x\n", ptmp_buf[0]);
1767
1768 rtl8723e_dm_bt_parse_bt_info(hw, ptmp_buf, c2h_event.cmd_len);
1769
1770 if (rtlpriv->cfg->ops->get_btc_status())
1771 rtlpriv->btcoexist.btc_ops->btc_periodical(rtlpriv);
1777 1772
1778 rtl8723ae_dm_bt_parse_bt_info(hw, ptmbuf, c2h_event.cmd_len);
1779 break; 1773 break;
1780 default: 1774 default:
1781 break; 1775 break;
1782 } 1776 }
1783 kfree(ptmbuf); 1777 kfree(ptmp_buf);
1784 1778
1785 rtl_write_byte(rtlpriv, 0x01AF, C2H_EVT_HOST_CLOSE); 1779 rtl_write_byte(rtlpriv, 0x01AF, C2H_EVT_HOST_CLOSE);
1786} 1780}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.h b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.h
index 4325ecd58f0c..3723d7476717 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hal_btc.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -24,8 +20,7 @@
24 * Hsinchu 300, Taiwan. 20 * Hsinchu 300, Taiwan.
25 * Larry Finger <Larry.Finger@lwfinger.net> 21 * Larry Finger <Larry.Finger@lwfinger.net>
26 * 22 *
27 **************************************************************************** 23 *****************************************************************************/
28 */
29 24
30#ifndef __RTL8723E_HAL_BTC_H__ 25#ifndef __RTL8723E_HAL_BTC_H__
31#define __RTL8723E_HAL_BTC_H__ 26#define __RTL8723E_HAL_BTC_H__
@@ -34,21 +29,31 @@
34#include "btc.h" 29#include "btc.h"
35#include "hal_bt_coexist.h" 30#include "hal_bt_coexist.h"
36 31
37#define BT_TXRX_CNT_THRES_1 1200 32#define BT_TXRX_CNT_THRES_1 1200
38#define BT_TXRX_CNT_THRES_2 1400 33#define BT_TXRX_CNT_THRES_2 1400
39#define BT_TXRX_CNT_THRES_3 3000 34#define BT_TXRX_CNT_THRES_3 3000
40#define BT_TXRX_CNT_LEVEL_0 0 /* < 1200 */ 35/* < 1200 */
41#define BT_TXRX_CNT_LEVEL_1 1 /* >= 1200 && < 1400 */ 36#define BT_TXRX_CNT_LEVEL_0 0
42#define BT_TXRX_CNT_LEVEL_2 2 /* >= 1400 */ 37/* >= 1200 && < 1400 */
43#define BT_TXRX_CNT_LEVEL_3 3 38#define BT_TXRX_CNT_LEVEL_1 1
39/* >= 1400 */
40#define BT_TXRX_CNT_LEVEL_2 2
41#define BT_TXRX_CNT_LEVEL_3 3
42
43#define BT_COEX_DISABLE 0
44#define BT_Q_PKT_OFF 0
45#define BT_Q_PKT_ON 1
46
47#define BT_TX_PWR_OFF 0
48#define BT_TX_PWR_ON 1
44 49
45/* TDMA mode definition */ 50/* TDMA mode definition */
46#define TDMA_2ANT 0 51#define TDMA_2ANT 0
47#define TDMA_1ANT 1 52#define TDMA_1ANT 1
48#define TDMA_NAV_OFF 0 53#define TDMA_NAV_OFF 0
49#define TDMA_NAV_ON 1 54#define TDMA_NAV_ON 1
50#define TDMA_DAC_SWING_OFF 0 55#define TDMA_DAC_SWING_OFF 0
51#define TDMA_DAC_SWING_ON 1 56#define TDMA_DAC_SWING_ON 1
52 57
53/* PTA mode related definition */ 58/* PTA mode related definition */
54#define BT_PTA_MODE_OFF 0 59#define BT_PTA_MODE_OFF 0
@@ -80,6 +85,7 @@ enum bt_traffic_mode_profile {
80 BT_PROFILE_SCO 85 BT_PROFILE_SCO
81}; 86};
82 87
88/*
83enum hci_ext_bt_operation { 89enum hci_ext_bt_operation {
84 HCI_BT_OP_NONE = 0x0, 90 HCI_BT_OP_NONE = 0x0,
85 HCI_BT_OP_INQUIRE_START = 0x1, 91 HCI_BT_OP_INQUIRE_START = 0x1,
@@ -93,6 +99,7 @@ enum hci_ext_bt_operation {
93 HCI_BT_OP_BT_DEV_DISABLE = 0x9, 99 HCI_BT_OP_BT_DEV_DISABLE = 0x9,
94 HCI_BT_OP_MAX, 100 HCI_BT_OP_MAX,
95}; 101};
102*/
96 103
97enum bt_spec { 104enum bt_spec {
98 BT_SPEC_1_0_b = 0x00, 105 BT_SPEC_1_0_b = 0x00,
@@ -123,12 +130,12 @@ enum bt_state {
123 BT_INFO_STATE_MAX = 7 130 BT_INFO_STATE_MAX = 7
124}; 131};
125 132
126enum rtl8723ae_c2h_evt { 133enum rtl8723e_c2h_evt {
127 C2H_DBG = 0, 134 C2H_DBG = 0,
128 C2H_TSF = 1, 135 C2H_TSF = 1,
129 C2H_AP_RPT_RSP = 2, 136 C2H_AP_RPT_RSP = 2,
130 C2H_CCX_TX_RPT = 3, /* The FW notify the report of the specific */ 137 /* The FW notify the report of the specific tx packet. */
131 /* tx packet. */ 138 C2H_CCX_TX_RPT = 3,
132 C2H_BT_RSSI = 4, 139 C2H_BT_RSSI = 4,
133 C2H_BT_OP_MODE = 5, 140 C2H_BT_OP_MODE = 5,
134 C2H_HW_INFO_EXCH = 10, 141 C2H_HW_INFO_EXCH = 10,
@@ -137,15 +144,16 @@ enum rtl8723ae_c2h_evt {
137 MAX_C2HEVENT 144 MAX_C2HEVENT
138}; 145};
139 146
140void rtl8723ae_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw); 147void rtl8723e_dm_bt_fw_coex_all_off_8723a(struct ieee80211_hw *hw);
141void rtl8723ae_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw); 148void rtl8723e_dm_bt_sw_coex_all_off_8723a(struct ieee80211_hw *hw);
142void rtl8723ae_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw); 149void rtl8723e_dm_bt_hw_coex_all_off_8723a(struct ieee80211_hw *hw);
143void rtl8723ae_dm_bt_coexist_8723(struct ieee80211_hw *hw); 150void rtl8723e_dm_bt_coexist_8723(struct ieee80211_hw *hw);
144void rtl8723ae_dm_bt_set_bt_dm(struct ieee80211_hw *hw, 151void rtl8723e_dm_bt_set_bt_dm(struct ieee80211_hw *hw,
145 struct btdm_8723 *p_btdm); 152 struct btdm_8723 *p_btdm);
146void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw); 153void rtl_8723e_c2h_command_handle(struct ieee80211_hw *hw);
147void rtl_8723e_bt_wifi_media_status_notify(struct ieee80211_hw *hw, 154void rtl_8723e_bt_wifi_media_status_notify(struct ieee80211_hw *hw,
148 bool mstatus); 155 bool mstatus);
149void rtl8723ae_bt_coex_off_before_lps(struct ieee80211_hw *hw); 156void rtl8723e_dm_bt_turn_off_bt_coexist_before_enter_lps(
157 struct ieee80211_hw *hw);
150 158
151#endif 159#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
index 662a079f76f3..aa085462d0e9 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -37,17 +33,21 @@
37#include "reg.h" 33#include "reg.h"
38#include "def.h" 34#include "def.h"
39#include "phy.h" 35#include "phy.h"
36#include "../rtl8723com/phy_common.h"
40#include "dm.h" 37#include "dm.h"
41#include "../rtl8723com/dm_common.h" 38#include "../rtl8723com/dm_common.h"
42#include "fw.h" 39#include "fw.h"
43#include "../rtl8723com/fw_common.h" 40#include "../rtl8723com/fw_common.h"
44#include "led.h" 41#include "led.h"
45#include "hw.h" 42#include "hw.h"
43#include "../pwrseqcmd.h"
46#include "pwrseq.h" 44#include "pwrseq.h"
47#include "btc.h" 45#include "btc.h"
48 46
49static void _rtl8723ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw, 47#define LLT_CONFIG 5
50 u8 set_bits, u8 clear_bits) 48
49static void _rtl8723e_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
50 u8 set_bits, u8 clear_bits)
51{ 51{
52 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 52 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
53 struct rtl_priv *rtlpriv = rtl_priv(hw); 53 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -58,7 +58,7 @@ static void _rtl8723ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
58 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val); 58 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val);
59} 59}
60 60
61static void _rtl8723ae_stop_tx_beacon(struct ieee80211_hw *hw) 61static void _rtl8723e_stop_tx_beacon(struct ieee80211_hw *hw)
62{ 62{
63 struct rtl_priv *rtlpriv = rtl_priv(hw); 63 struct rtl_priv *rtlpriv = rtl_priv(hw);
64 u8 tmp1byte; 64 u8 tmp1byte;
@@ -71,7 +71,7 @@ static void _rtl8723ae_stop_tx_beacon(struct ieee80211_hw *hw)
71 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte); 71 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
72} 72}
73 73
74static void _rtl8723ae_resume_tx_beacon(struct ieee80211_hw *hw) 74static void _rtl8723e_resume_tx_beacon(struct ieee80211_hw *hw)
75{ 75{
76 struct rtl_priv *rtlpriv = rtl_priv(hw); 76 struct rtl_priv *rtlpriv = rtl_priv(hw);
77 u8 tmp1byte; 77 u8 tmp1byte;
@@ -84,17 +84,17 @@ static void _rtl8723ae_resume_tx_beacon(struct ieee80211_hw *hw)
84 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte); 84 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
85} 85}
86 86
87static void _rtl8723ae_enable_bcn_sufunc(struct ieee80211_hw *hw) 87static void _rtl8723e_enable_bcn_sub_func(struct ieee80211_hw *hw)
88{ 88{
89 _rtl8723ae_set_bcn_ctrl_reg(hw, 0, BIT(1)); 89 _rtl8723e_set_bcn_ctrl_reg(hw, 0, BIT(1));
90} 90}
91 91
92static void _rtl8723ae_disable_bcn_sufunc(struct ieee80211_hw *hw) 92static void _rtl8723e_disable_bcn_sub_func(struct ieee80211_hw *hw)
93{ 93{
94 _rtl8723ae_set_bcn_ctrl_reg(hw, BIT(1), 0); 94 _rtl8723e_set_bcn_ctrl_reg(hw, BIT(1), 0);
95} 95}
96 96
97void rtl8723ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 97void rtl8723e_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
98{ 98{
99 struct rtl_priv *rtlpriv = rtl_priv(hw); 99 struct rtl_priv *rtlpriv = rtl_priv(hw);
100 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 100 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
@@ -102,54 +102,55 @@ void rtl8723ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
102 102
103 switch (variable) { 103 switch (variable) {
104 case HW_VAR_RCR: 104 case HW_VAR_RCR:
105 *((u32 *) (val)) = rtlpci->receive_config; 105 *((u32 *)(val)) = rtlpci->receive_config;
106 break; 106 break;
107 case HW_VAR_RF_STATE: 107 case HW_VAR_RF_STATE:
108 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state; 108 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
109 break; 109 break;
110 case HW_VAR_FWLPS_RF_ON:{ 110 case HW_VAR_FWLPS_RF_ON:{
111 enum rf_pwrstate rfState; 111 enum rf_pwrstate rfstate;
112 u32 val_rcr; 112 u32 val_rcr;
113 113
114 rtlpriv->cfg->ops->get_hw_reg(hw, 114 rtlpriv->cfg->ops->get_hw_reg(hw,
115 HW_VAR_RF_STATE, 115 HW_VAR_RF_STATE,
116 (u8 *) (&rfState)); 116 (u8 *)(&rfstate));
117 if (rfState == ERFOFF) { 117 if (rfstate == ERFOFF) {
118 *((bool *) (val)) = true; 118 *((bool *)(val)) = true;
119 } else { 119 } else {
120 val_rcr = rtl_read_dword(rtlpriv, REG_RCR); 120 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
121 val_rcr &= 0x00070000; 121 val_rcr &= 0x00070000;
122 if (val_rcr) 122 if (val_rcr)
123 *((bool *) (val)) = false; 123 *((bool *)(val)) = false;
124 else 124 else
125 *((bool *) (val)) = true; 125 *((bool *)(val)) = true;
126 }
127 break;
126 } 128 }
127 break; }
128 case HW_VAR_FW_PSMODE_STATUS: 129 case HW_VAR_FW_PSMODE_STATUS:
129 *((bool *) (val)) = ppsc->fw_current_inpsmode; 130 *((bool *)(val)) = ppsc->fw_current_inpsmode;
130 break; 131 break;
131 case HW_VAR_CORRECT_TSF:{ 132 case HW_VAR_CORRECT_TSF:{
132 u64 tsf; 133 u64 tsf;
133 u32 *ptsf_low = (u32 *)&tsf; 134 u32 *ptsf_low = (u32 *)&tsf;
134 u32 *ptsf_high = ((u32 *)&tsf) + 1; 135 u32 *ptsf_high = ((u32 *)&tsf) + 1;
135 136
136 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4)); 137 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
137 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); 138 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
138 139
139 *((u64 *) (val)) = tsf; 140 *((u64 *)(val)) = tsf;
140 141
141 break; } 142 break;
143 }
142 default: 144 default:
143 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 145 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
144 "switch case not process\n"); 146 "switch case not process\n");
145 break; 147 break;
146 } 148 }
147} 149}
148 150
149void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 151void rtl8723e_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
150{ 152{
151 struct rtl_priv *rtlpriv = rtl_priv(hw); 153 struct rtl_priv *rtlpriv = rtl_priv(hw);
152 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
153 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 154 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
154 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 155 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
155 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 156 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
@@ -157,362 +158,400 @@ void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
157 u8 idx; 158 u8 idx;
158 159
159 switch (variable) { 160 switch (variable) {
160 case HW_VAR_ETHER_ADDR: 161 case HW_VAR_ETHER_ADDR:{
161 for (idx = 0; idx < ETH_ALEN; idx++) { 162 for (idx = 0; idx < ETH_ALEN; idx++) {
162 rtl_write_byte(rtlpriv, (REG_MACID + idx), 163 rtl_write_byte(rtlpriv, (REG_MACID + idx),
163 val[idx]); 164 val[idx]);
165 }
166 break;
164 } 167 }
165 break;
166 case HW_VAR_BASIC_RATE:{ 168 case HW_VAR_BASIC_RATE:{
167 u16 rate_cfg = ((u16 *) val)[0]; 169 u16 b_rate_cfg = ((u16 *)val)[0];
168 u8 rate_index = 0; 170 u8 rate_index = 0;
169 rate_cfg = rate_cfg & 0x15f; 171
170 rate_cfg |= 0x01; 172 b_rate_cfg = b_rate_cfg & 0x15f;
171 rtl_write_byte(rtlpriv, REG_RRSR, rate_cfg & 0xff); 173 b_rate_cfg |= 0x01;
172 rtl_write_byte(rtlpriv, REG_RRSR + 1, 174 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
173 (rate_cfg >> 8) & 0xff); 175 rtl_write_byte(rtlpriv, REG_RRSR + 1,
174 while (rate_cfg > 0x1) { 176 (b_rate_cfg >> 8) & 0xff);
175 rate_cfg = (rate_cfg >> 1); 177 while (b_rate_cfg > 0x1) {
176 rate_index++; 178 b_rate_cfg = (b_rate_cfg >> 1);
179 rate_index++;
180 }
181 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL,
182 rate_index);
183 break;
177 } 184 }
178 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, 185 case HW_VAR_BSSID:{
179 rate_index); 186 for (idx = 0; idx < ETH_ALEN; idx++) {
180 break; } 187 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
181 case HW_VAR_BSSID: 188 val[idx]);
182 for (idx = 0; idx < ETH_ALEN; idx++) { 189 }
183 rtl_write_byte(rtlpriv, (REG_BSSID + idx), 190 break;
184 val[idx]);
185 } 191 }
186 break; 192 case HW_VAR_SIFS:{
187 case HW_VAR_SIFS: 193 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
188 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]); 194 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
189 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[1]);
190 195
191 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]); 196 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
192 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]); 197 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
193 198
194 if (!mac->ht_enable) 199 if (!mac->ht_enable)
195 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 200 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
196 0x0e0e); 201 0x0e0e);
197 else 202 else
198 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 203 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
199 *((u16 *) val)); 204 *((u16 *)val));
200 break; 205 break;
206 }
201 case HW_VAR_SLOT_TIME:{ 207 case HW_VAR_SLOT_TIME:{
202 u8 e_aci; 208 u8 e_aci;
203 209
204 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 210 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
205 "HW_VAR_SLOT_TIME %x\n", val[0]); 211 "HW_VAR_SLOT_TIME %x\n", val[0]);
206 212
207 rtl_write_byte(rtlpriv, REG_SLOT, val[0]); 213 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
208 214
209 for (e_aci = 0; e_aci < AC_MAX; e_aci++) { 215 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
210 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, 216 rtlpriv->cfg->ops->set_hw_reg(hw,
211 &e_aci); 217 HW_VAR_AC_PARAM,
218 (u8 *)(&e_aci));
219 }
220 break;
212 } 221 }
213 break; }
214 case HW_VAR_ACK_PREAMBLE:{ 222 case HW_VAR_ACK_PREAMBLE:{
215 u8 reg_tmp; 223 u8 reg_tmp;
216 u8 short_preamble = (bool)*val; 224 u8 short_preamble = (bool)(*(u8 *)val);
217 reg_tmp = (mac->cur_40_prime_sc) << 5; 225
218 if (short_preamble) 226 reg_tmp = (mac->cur_40_prime_sc) << 5;
219 reg_tmp |= 0x80; 227 if (short_preamble)
220 228 reg_tmp |= 0x80;
221 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_tmp); 229
222 break; } 230 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_tmp);
231 break;
232 }
223 case HW_VAR_AMPDU_MIN_SPACE:{ 233 case HW_VAR_AMPDU_MIN_SPACE:{
224 u8 min_spacing_to_set; 234 u8 min_spacing_to_set;
225 u8 sec_min_space; 235 u8 sec_min_space;
226 236
227 min_spacing_to_set = *val; 237 min_spacing_to_set = *((u8 *)val);
228 if (min_spacing_to_set <= 7) { 238 if (min_spacing_to_set <= 7) {
229 sec_min_space = 0; 239 sec_min_space = 0;
230 240
231 if (min_spacing_to_set < sec_min_space) 241 if (min_spacing_to_set < sec_min_space)
232 min_spacing_to_set = sec_min_space; 242 min_spacing_to_set = sec_min_space;
233 243
234 mac->min_space_cfg = ((mac->min_space_cfg & 244 mac->min_space_cfg = ((mac->min_space_cfg &
235 0xf8) | 245 0xf8) |
236 min_spacing_to_set); 246 min_spacing_to_set);
237 247
238 *val = min_spacing_to_set; 248 *val = min_spacing_to_set;
239 249
240 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 250 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
241 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", 251 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
242 mac->min_space_cfg); 252 mac->min_space_cfg);
243 253
244 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 254 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
245 mac->min_space_cfg); 255 mac->min_space_cfg);
256 }
257 break;
246 } 258 }
247 break; }
248 case HW_VAR_SHORTGI_DENSITY:{ 259 case HW_VAR_SHORTGI_DENSITY:{
249 u8 density_to_set; 260 u8 density_to_set;
250 261
251 density_to_set = *val; 262 density_to_set = *((u8 *)val);
252 mac->min_space_cfg |= (density_to_set << 3); 263 mac->min_space_cfg |= (density_to_set << 3);
253 264
254 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 265 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
255 "Set HW_VAR_SHORTGI_DENSITY: %#x\n", 266 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
256 mac->min_space_cfg); 267 mac->min_space_cfg);
257 268
258 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 269 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
259 mac->min_space_cfg); 270 mac->min_space_cfg);
260 271
261 break; } 272 break;
273 }
262 case HW_VAR_AMPDU_FACTOR:{ 274 case HW_VAR_AMPDU_FACTOR:{
263 u8 regtoset_normal[4] = {0x41, 0xa8, 0x72, 0xb9}; 275 u8 regtoset_normal[4] = { 0x41, 0xa8, 0x72, 0xb9 };
264 u8 regtoset_bt[4] = {0x31, 0x74, 0x42, 0x97}; 276 u8 regtoset_bt[4] = {0x31, 0x74, 0x42, 0x97};
265 u8 factor_toset; 277 u8 factor_toset;
266 u8 *p_regtoset = NULL; 278 u8 *p_regtoset = NULL;
267 u8 index; 279 u8 index = 0;
268 280
269 if ((pcipriv->bt_coexist.bt_coexistence) && 281 if ((rtlpriv->btcoexist.bt_coexistence) &&
270 (pcipriv->bt_coexist.bt_coexist_type == BT_CSR_BC4)) 282 (rtlpriv->btcoexist.bt_coexist_type ==
271 p_regtoset = regtoset_bt; 283 BT_CSR_BC4))
272 else 284 p_regtoset = regtoset_bt;
273 p_regtoset = regtoset_normal; 285 else
274 286 p_regtoset = regtoset_normal;
275 factor_toset = *val; 287
276 if (factor_toset <= 3) { 288 factor_toset = *((u8 *)val);
277 factor_toset = (1 << (factor_toset + 2)); 289 if (factor_toset <= 3) {
278 if (factor_toset > 0xf) 290 factor_toset = (1 << (factor_toset + 2));
279 factor_toset = 0xf; 291 if (factor_toset > 0xf)
280 292 factor_toset = 0xf;
281 for (index = 0; index < 4; index++) { 293
282 if ((p_regtoset[index] & 0xf0) > 294 for (index = 0; index < 4; index++) {
283 (factor_toset << 4)) 295 if ((p_regtoset[index] & 0xf0) >
284 p_regtoset[index] = 296 (factor_toset << 4))
285 (p_regtoset[index] & 0x0f) | 297 p_regtoset[index] =
286 (factor_toset << 4); 298 (p_regtoset[index] & 0x0f) |
287 299 (factor_toset << 4);
288 if ((p_regtoset[index] & 0x0f) > 300
289 factor_toset) 301 if ((p_regtoset[index] & 0x0f) >
290 p_regtoset[index] = 302 factor_toset)
291 (p_regtoset[index] & 0xf0) | 303 p_regtoset[index] =
292 (factor_toset); 304 (p_regtoset[index] & 0xf0) |
293 305 (factor_toset);
294 rtl_write_byte(rtlpriv, 306
295 (REG_AGGLEN_LMT + index), 307 rtl_write_byte(rtlpriv,
296 p_regtoset[index]); 308 (REG_AGGLEN_LMT + index),
309 p_regtoset[index]);
310 }
297 311
312 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
313 "Set HW_VAR_AMPDU_FACTOR: %#x\n",
314 factor_toset);
298 } 315 }
299 316 break;
300 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
301 "Set HW_VAR_AMPDU_FACTOR: %#x\n",
302 factor_toset);
303 } 317 }
304 break; }
305 case HW_VAR_AC_PARAM:{ 318 case HW_VAR_AC_PARAM:{
306 u8 e_aci = *val; 319 u8 e_aci = *((u8 *)val);
307 rtl8723_dm_init_edca_turbo(hw);
308 320
309 if (rtlpci->acm_method != EACMWAY2_SW) 321 rtl8723_dm_init_edca_turbo(hw);
310 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL, 322
311 &e_aci); 323 if (rtlpci->acm_method != EACMWAY2_SW)
312 break; } 324 rtlpriv->cfg->ops->set_hw_reg(hw,
325 HW_VAR_ACM_CTRL,
326 (u8 *)(&e_aci));
327 break;
328 }
313 case HW_VAR_ACM_CTRL:{ 329 case HW_VAR_ACM_CTRL:{
314 u8 e_aci = *val; 330 u8 e_aci = *((u8 *)val);
315 union aci_aifsn *p_aci_aifsn = 331 union aci_aifsn *p_aci_aifsn =
316 (union aci_aifsn *)(&(mac->ac[0].aifs)); 332 (union aci_aifsn *)(&mac->ac[0].aifs);
317 u8 acm = p_aci_aifsn->f.acm; 333 u8 acm = p_aci_aifsn->f.acm;
318 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL); 334 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
319 335
320 acm_ctrl |= ((rtlpci->acm_method == 2) ? 0x0 : 0x1); 336 acm_ctrl =
321 337 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
322 if (acm) { 338
323 switch (e_aci) { 339 if (acm) {
324 case AC0_BE: 340 switch (e_aci) {
325 acm_ctrl |= AcmHw_BeqEn; 341 case AC0_BE:
326 break; 342 acm_ctrl |= ACMHW_BEQEN;
327 case AC2_VI: 343 break;
328 acm_ctrl |= AcmHw_ViqEn; 344 case AC2_VI:
329 break; 345 acm_ctrl |= ACMHW_VIQEN;
330 case AC3_VO: 346 break;
331 acm_ctrl |= AcmHw_VoqEn; 347 case AC3_VO:
332 break; 348 acm_ctrl |= ACMHW_VOQEN;
333 default: 349 break;
334 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 350 default:
335 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n", 351 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
336 acm); 352 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
337 break; 353 acm);
338 } 354 break;
339 } else { 355 }
340 switch (e_aci) { 356 } else {
341 case AC0_BE: 357 switch (e_aci) {
342 acm_ctrl &= (~AcmHw_BeqEn); 358 case AC0_BE:
343 break; 359 acm_ctrl &= (~ACMHW_BEQEN);
344 case AC2_VI: 360 break;
345 acm_ctrl &= (~AcmHw_ViqEn); 361 case AC2_VI:
346 break; 362 acm_ctrl &= (~ACMHW_VIQEN);
347 case AC3_VO: 363 break;
348 acm_ctrl &= (~AcmHw_BeqEn); 364 case AC3_VO:
349 break; 365 acm_ctrl &= (~ACMHW_BEQEN);
350 default: 366 break;
351 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 367 default:
352 "switch case not processed\n"); 368 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
353 break; 369 "switch case not process\n");
370 break;
371 }
354 } 372 }
355 }
356 373
357 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE, 374 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
358 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n", 375 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
359 acm_ctrl); 376 acm_ctrl);
360 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl); 377 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
361 break; } 378 break;
362 case HW_VAR_RCR: 379 }
363 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *) (val))[0]); 380 case HW_VAR_RCR:{
364 rtlpci->receive_config = ((u32 *) (val))[0]; 381 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
365 break; 382 rtlpci->receive_config = ((u32 *)(val))[0];
383 break;
384 }
366 case HW_VAR_RETRY_LIMIT:{ 385 case HW_VAR_RETRY_LIMIT:{
367 u8 retry_limit = *val; 386 u8 retry_limit = ((u8 *)(val))[0];
368 387
369 rtl_write_word(rtlpriv, REG_RL, 388 rtl_write_word(rtlpriv, REG_RL,
370 retry_limit << RETRY_LIMIT_SHORT_SHIFT | 389 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
371 retry_limit << RETRY_LIMIT_LONG_SHIFT); 390 retry_limit << RETRY_LIMIT_LONG_SHIFT);
372 break; } 391 break;
392 }
373 case HW_VAR_DUAL_TSF_RST: 393 case HW_VAR_DUAL_TSF_RST:
374 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); 394 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
375 break; 395 break;
376 case HW_VAR_EFUSE_BYTES: 396 case HW_VAR_EFUSE_BYTES:
377 rtlefuse->efuse_usedbytes = *((u16 *) val); 397 rtlefuse->efuse_usedbytes = *((u16 *)val);
378 break; 398 break;
379 case HW_VAR_EFUSE_USAGE: 399 case HW_VAR_EFUSE_USAGE:
380 rtlefuse->efuse_usedpercentage = *val; 400 rtlefuse->efuse_usedpercentage = *((u8 *)val);
381 break; 401 break;
382 case HW_VAR_IO_CMD: 402 case HW_VAR_IO_CMD:
383 rtl8723ae_phy_set_io_cmd(hw, (*(enum io_type *)val)); 403 rtl8723e_phy_set_io_cmd(hw, (*(enum io_type *)val));
384 break; 404 break;
385 case HW_VAR_WPA_CONFIG: 405 case HW_VAR_WPA_CONFIG:
386 rtl_write_byte(rtlpriv, REG_SECCFG, *val); 406 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
387 break; 407 break;
388 case HW_VAR_SET_RPWM:{ 408 case HW_VAR_SET_RPWM:{
389 u8 rpwm_val; 409 u8 rpwm_val;
390 410
391 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM); 411 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
392 udelay(1); 412 udelay(1);
393 413
394 if (rpwm_val & BIT(7)) { 414 if (rpwm_val & BIT(7)) {
395 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val); 415 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
396 } else { 416 (*(u8 *)val));
397 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val | BIT(7)); 417 } else {
398 } 418 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
419 ((*(u8 *)val) | BIT(7)));
420 }
399 421
400 break; } 422 break;
423 }
401 case HW_VAR_H2C_FW_PWRMODE:{ 424 case HW_VAR_H2C_FW_PWRMODE:{
402 u8 psmode = *val; 425 u8 psmode = (*(u8 *)val);
403 426
404 if (psmode != FW_PS_ACTIVE_MODE) 427 if (psmode != FW_PS_ACTIVE_MODE)
405 rtl8723ae_dm_rf_saving(hw, true); 428 rtl8723e_dm_rf_saving(hw, true);
406 429
407 rtl8723ae_set_fw_pwrmode_cmd(hw, *val); 430 rtl8723e_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
408 break; } 431 break;
432 }
409 case HW_VAR_FW_PSMODE_STATUS: 433 case HW_VAR_FW_PSMODE_STATUS:
410 ppsc->fw_current_inpsmode = *((bool *) val); 434 ppsc->fw_current_inpsmode = *((bool *)val);
411 break; 435 break;
412 case HW_VAR_H2C_FW_JOINBSSRPT:{ 436 case HW_VAR_H2C_FW_JOINBSSRPT:{
413 u8 mstatus = *val; 437 u8 mstatus = (*(u8 *)val);
414 u8 tmp_regcr, tmp_reg422; 438 u8 tmp_regcr, tmp_reg422;
415 bool recover = false; 439 bool b_recover = false;
416 440
417 if (mstatus == RT_MEDIA_CONNECT) { 441 if (mstatus == RT_MEDIA_CONNECT) {
418 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL); 442 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
419 443 NULL);
420 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1); 444
421 rtl_write_byte(rtlpriv, REG_CR + 1, 445 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
422 (tmp_regcr | BIT(0))); 446 rtl_write_byte(rtlpriv, REG_CR + 1,
423 447 (tmp_regcr | BIT(0)));
424 _rtl8723ae_set_bcn_ctrl_reg(hw, 0, BIT(3)); 448
425 _rtl8723ae_set_bcn_ctrl_reg(hw, BIT(4), 0); 449 _rtl8723e_set_bcn_ctrl_reg(hw, 0, BIT(3));
450 _rtl8723e_set_bcn_ctrl_reg(hw, BIT(4), 0);
451
452 tmp_reg422 =
453 rtl_read_byte(rtlpriv,
454 REG_FWHW_TXQ_CTRL + 2);
455 if (tmp_reg422 & BIT(6))
456 b_recover = true;
457 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
458 tmp_reg422 & (~BIT(6)));
426 459
427 tmp_reg422 = rtl_read_byte(rtlpriv, 460 rtl8723e_set_fw_rsvdpagepkt(hw, 0);
428 REG_FWHW_TXQ_CTRL + 2);
429 if (tmp_reg422 & BIT(6))
430 recover = true;
431 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
432 tmp_reg422 & (~BIT(6)));
433 461
434 rtl8723ae_set_fw_rsvdpagepkt(hw, 0); 462 _rtl8723e_set_bcn_ctrl_reg(hw, BIT(3), 0);
463 _rtl8723e_set_bcn_ctrl_reg(hw, 0, BIT(4));
435 464
436 _rtl8723ae_set_bcn_ctrl_reg(hw, BIT(3), 0); 465 if (b_recover) {
437 _rtl8723ae_set_bcn_ctrl_reg(hw, 0, BIT(4)); 466 rtl_write_byte(rtlpriv,
467 REG_FWHW_TXQ_CTRL + 2,
468 tmp_reg422);
469 }
438 470
439 if (recover) 471 rtl_write_byte(rtlpriv, REG_CR + 1,
440 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, 472 (tmp_regcr & ~(BIT(0))));
441 tmp_reg422); 473 }
474 rtl8723e_set_fw_joinbss_report_cmd(hw, (*(u8 *)val));
442 475
443 rtl_write_byte(rtlpriv, REG_CR + 1, 476 break;
444 (tmp_regcr & ~(BIT(0))));
445 } 477 }
446 rtl8723ae_set_fw_joinbss_report_cmd(hw, *val); 478 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:{
447 479 rtl8723e_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
448 break; }
449 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
450 rtl8723ae_set_p2p_ps_offload_cmd(hw, *val);
451 break; 480 break;
481 }
452 case HW_VAR_AID:{ 482 case HW_VAR_AID:{
453 u16 u2btmp; 483 u16 u2btmp;
454 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT); 484
455 u2btmp &= 0xC000; 485 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
456 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp | 486 u2btmp &= 0xC000;
457 mac->assoc_id)); 487 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT,
458 break; } 488 (u2btmp | mac->assoc_id));
489
490 break;
491 }
459 case HW_VAR_CORRECT_TSF:{ 492 case HW_VAR_CORRECT_TSF:{
460 u8 btype_ibss = *val; 493 u8 btype_ibss = ((u8 *)(val))[0];
461 494
462 if (btype_ibss == true) 495 if (btype_ibss)
463 _rtl8723ae_stop_tx_beacon(hw); 496 _rtl8723e_stop_tx_beacon(hw);
464 497
465 _rtl8723ae_set_bcn_ctrl_reg(hw, 0, BIT(3)); 498 _rtl8723e_set_bcn_ctrl_reg(hw, 0, BIT(3));
466 499
467 rtl_write_dword(rtlpriv, REG_TSFTR, 500 rtl_write_dword(rtlpriv, REG_TSFTR,
468 (u32) (mac->tsf & 0xffffffff)); 501 (u32)(mac->tsf & 0xffffffff));
469 rtl_write_dword(rtlpriv, REG_TSFTR + 4, 502 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
470 (u32) ((mac->tsf >> 32) & 0xffffffff)); 503 (u32)((mac->tsf >> 32) & 0xffffffff));
471 504
472 _rtl8723ae_set_bcn_ctrl_reg(hw, BIT(3), 0); 505 _rtl8723e_set_bcn_ctrl_reg(hw, BIT(3), 0);
473 506
474 if (btype_ibss == true) 507 if (btype_ibss)
475 _rtl8723ae_resume_tx_beacon(hw); 508 _rtl8723e_resume_tx_beacon(hw);
476 break; } 509
477 case HW_VAR_FW_LPS_ACTION: { 510 break;
478 bool enter_fwlps = *((bool *)val); 511 }
479 u8 rpwm_val, fw_pwrmode; 512 case HW_VAR_FW_LPS_ACTION:{
480 bool fw_current_inps; 513 bool b_enter_fwlps = *((bool *)val);
481 514 u8 rpwm_val, fw_pwrmode;
482 if (enter_fwlps) { 515 bool fw_current_inps;
483 rpwm_val = 0x02; /* RF off */ 516
484 fw_current_inps = true; 517 if (b_enter_fwlps) {
485 rtlpriv->cfg->ops->set_hw_reg(hw, 518 rpwm_val = 0x02; /* RF off */
486 HW_VAR_FW_PSMODE_STATUS, 519 fw_current_inps = true;
487 (u8 *)(&fw_current_inps)); 520 rtlpriv->cfg->ops->set_hw_reg(hw,
488 rtlpriv->cfg->ops->set_hw_reg(hw, 521 HW_VAR_FW_PSMODE_STATUS,
489 HW_VAR_H2C_FW_PWRMODE, 522 (u8 *)(&fw_current_inps));
490 &ppsc->fwctrl_psmode); 523 rtlpriv->cfg->ops->set_hw_reg(hw,
491 524 HW_VAR_H2C_FW_PWRMODE,
492 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 525 (u8 *)(&ppsc->fwctrl_psmode));
493 &rpwm_val); 526
494 } else { 527 rtlpriv->cfg->ops->set_hw_reg(hw,
495 rpwm_val = 0x0C; /* RF on */ 528 HW_VAR_SET_RPWM,
496 fw_pwrmode = FW_PS_ACTIVE_MODE; 529 (u8 *)(&rpwm_val));
497 fw_current_inps = false; 530 } else {
498 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 531 rpwm_val = 0x0C; /* RF on */
499 &rpwm_val); 532 fw_pwrmode = FW_PS_ACTIVE_MODE;
500 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 533 fw_current_inps = false;
501 &fw_pwrmode); 534 rtlpriv->cfg->ops->set_hw_reg(hw,
502 535 HW_VAR_SET_RPWM,
503 rtlpriv->cfg->ops->set_hw_reg(hw, 536 (u8 *)(&rpwm_val));
504 HW_VAR_FW_PSMODE_STATUS, 537 rtlpriv->cfg->ops->set_hw_reg(hw,
505 (u8 *)(&fw_current_inps)); 538 HW_VAR_H2C_FW_PWRMODE,
539 (u8 *)(&fw_pwrmode));
540
541 rtlpriv->cfg->ops->set_hw_reg(hw,
542 HW_VAR_FW_PSMODE_STATUS,
543 (u8 *)(&fw_current_inps));
544 }
545 break;
506 } 546 }
507 break; }
508 default: 547 default:
509 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 548 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
510 "switch case not processed\n"); 549 "switch case not process\n");
511 break; 550 break;
512 } 551 }
513} 552}
514 553
515static bool _rtl8723ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data) 554static bool _rtl8723e_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
516{ 555{
517 struct rtl_priv *rtlpriv = rtl_priv(hw); 556 struct rtl_priv *rtlpriv = rtl_priv(hw);
518 bool status = true; 557 bool status = true;
@@ -539,24 +578,49 @@ static bool _rtl8723ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
539 return status; 578 return status;
540} 579}
541 580
542static bool _rtl8723ae_llt_table_init(struct ieee80211_hw *hw) 581static bool _rtl8723e_llt_table_init(struct ieee80211_hw *hw)
543{ 582{
544 struct rtl_priv *rtlpriv = rtl_priv(hw); 583 struct rtl_priv *rtlpriv = rtl_priv(hw);
545 unsigned short i; 584 unsigned short i;
546 u8 txpktbuf_bndy; 585 u8 txpktbuf_bndy;
547 u8 maxPage; 586 u8 maxpage;
548 bool status; 587 bool status;
549 u8 ubyte; 588 u8 ubyte;
550 589
551 maxPage = 255; 590#if LLT_CONFIG == 1
591 maxpage = 255;
592 txpktbuf_bndy = 252;
593#elif LLT_CONFIG == 2
594 maxpage = 127;
595 txpktbuf_bndy = 124;
596#elif LLT_CONFIG == 3
597 maxpage = 255;
598 txpktbuf_bndy = 174;
599#elif LLT_CONFIG == 4
600 maxpage = 255;
552 txpktbuf_bndy = 246; 601 txpktbuf_bndy = 246;
602#elif LLT_CONFIG == 5
603 maxpage = 255;
604 txpktbuf_bndy = 246;
605#endif
553 606
554 rtl_write_byte(rtlpriv, REG_CR, 0x8B); 607 rtl_write_byte(rtlpriv, REG_CR, 0x8B);
555 608
609#if LLT_CONFIG == 1
610 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x1c);
611 rtl_write_dword(rtlpriv, REG_RQPN, 0x80a71c1c);
612#elif LLT_CONFIG == 2
613 rtl_write_dword(rtlpriv, REG_RQPN, 0x845B1010);
614#elif LLT_CONFIG == 3
615 rtl_write_dword(rtlpriv, REG_RQPN, 0x84838484);
616#elif LLT_CONFIG == 4
617 rtl_write_dword(rtlpriv, REG_RQPN, 0x80bd1c1c);
618#elif LLT_CONFIG == 5
556 rtl_write_word(rtlpriv, REG_RQPN_NPQ, 0x0000); 619 rtl_write_word(rtlpriv, REG_RQPN_NPQ, 0x0000);
557 620
558 rtl_write_dword(rtlpriv, REG_RQPN, 0x80ac1c29); 621 rtl_write_dword(rtlpriv, REG_RQPN, 0x80ac1c29);
559 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x03); 622 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x03);
623#endif
560 624
561 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, (0x27FF0000 | txpktbuf_bndy)); 625 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, (0x27FF0000 | txpktbuf_bndy));
562 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy); 626 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
@@ -569,22 +633,22 @@ static bool _rtl8723ae_llt_table_init(struct ieee80211_hw *hw)
569 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4); 633 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
570 634
571 for (i = 0; i < (txpktbuf_bndy - 1); i++) { 635 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
572 status = _rtl8723ae_llt_write(hw, i, i + 1); 636 status = _rtl8723e_llt_write(hw, i, i + 1);
573 if (true != status) 637 if (true != status)
574 return status; 638 return status;
575 } 639 }
576 640
577 status = _rtl8723ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF); 641 status = _rtl8723e_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
578 if (true != status) 642 if (true != status)
579 return status; 643 return status;
580 644
581 for (i = txpktbuf_bndy; i < maxPage; i++) { 645 for (i = txpktbuf_bndy; i < maxpage; i++) {
582 status = _rtl8723ae_llt_write(hw, i, (i + 1)); 646 status = _rtl8723e_llt_write(hw, i, (i + 1));
583 if (true != status) 647 if (true != status)
584 return status; 648 return status;
585 } 649 }
586 650
587 status = _rtl8723ae_llt_write(hw, maxPage, txpktbuf_bndy); 651 status = _rtl8723e_llt_write(hw, maxpage, txpktbuf_bndy);
588 if (true != status) 652 if (true != status)
589 return status; 653 return status;
590 654
@@ -595,28 +659,29 @@ static bool _rtl8723ae_llt_table_init(struct ieee80211_hw *hw)
595 return true; 659 return true;
596} 660}
597 661
598static void _rtl8723ae_gen_refresh_led_state(struct ieee80211_hw *hw) 662static void _rtl8723e_gen_refresh_led_state(struct ieee80211_hw *hw)
599{ 663{
600 struct rtl_priv *rtlpriv = rtl_priv(hw); 664 struct rtl_priv *rtlpriv = rtl_priv(hw);
601 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 665 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
602 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 666 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
603 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0); 667 struct rtl_led *pled0 = &pcipriv->ledctl.sw_led0;
604 668
605 if (rtlpriv->rtlhal.up_first_time) 669 if (rtlpriv->rtlhal.up_first_time)
606 return; 670 return;
607 671
608 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) 672 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
609 rtl8723ae_sw_led_on(hw, pLed0); 673 rtl8723e_sw_led_on(hw, pled0);
610 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT) 674 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
611 rtl8723ae_sw_led_on(hw, pLed0); 675 rtl8723e_sw_led_on(hw, pled0);
612 else 676 else
613 rtl8723ae_sw_led_off(hw, pLed0); 677 rtl8723e_sw_led_off(hw, pled0);
614} 678}
615 679
616static bool _rtl8712e_init_mac(struct ieee80211_hw *hw) 680static bool _rtl8712e_init_mac(struct ieee80211_hw *hw)
617{ 681{
618 struct rtl_priv *rtlpriv = rtl_priv(hw); 682 struct rtl_priv *rtlpriv = rtl_priv(hw);
619 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 683 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
684
620 unsigned char bytetmp; 685 unsigned char bytetmp;
621 unsigned short wordtmp; 686 unsigned short wordtmp;
622 u16 retry = 0; 687 u16 retry = 0;
@@ -630,7 +695,6 @@ static bool _rtl8712e_init_mac(struct ieee80211_hw *hw)
630 else 695 else
631 mac_func_enable = false; 696 mac_func_enable = false;
632 697
633
634 /* HW Power on sequence */ 698 /* HW Power on sequence */
635 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 699 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
636 PWR_INTF_PCI_MSK, Rtl8723_NIC_ENABLE_FLOW)) 700 PWR_INTF_PCI_MSK, Rtl8723_NIC_ENABLE_FLOW))
@@ -669,7 +733,7 @@ static bool _rtl8712e_init_mac(struct ieee80211_hw *hw)
669 rtl_write_word(rtlpriv, REG_CR + 1, 0x06); 733 rtl_write_word(rtlpriv, REG_CR + 1, 0x06);
670 734
671 if (!mac_func_enable) { 735 if (!mac_func_enable) {
672 if (_rtl8723ae_llt_table_init(hw) == false) 736 if (!_rtl8723e_llt_table_init(hw))
673 return false; 737 return false;
674 } 738 }
675 739
@@ -678,7 +742,8 @@ static bool _rtl8712e_init_mac(struct ieee80211_hw *hw)
678 742
679 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x27ff); 743 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x27ff);
680 744
681 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL) & 0xf; 745 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
746 wordtmp &= 0xf;
682 wordtmp |= 0xF771; 747 wordtmp |= 0xF771;
683 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp); 748 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
684 749
@@ -721,22 +786,23 @@ static bool _rtl8712e_init_mac(struct ieee80211_hw *hw)
721 bytetmp = rtl_read_byte(rtlpriv, REG_APSD_CTRL); 786 bytetmp = rtl_read_byte(rtlpriv, REG_APSD_CTRL);
722 } while ((retry < 200) && (bytetmp & BIT(7))); 787 } while ((retry < 200) && (bytetmp & BIT(7)));
723 788
724 _rtl8723ae_gen_refresh_led_state(hw); 789 _rtl8723e_gen_refresh_led_state(hw);
725 790
726 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0); 791 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
727 792
728 return true; 793 return true;
729} 794}
730 795
731static void _rtl8723ae_hw_configure(struct ieee80211_hw *hw) 796static void _rtl8723e_hw_configure(struct ieee80211_hw *hw)
732{ 797{
733 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 798 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
734 struct rtl_priv *rtlpriv = rtl_priv(hw); 799 struct rtl_priv *rtlpriv = rtl_priv(hw);
735 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
736 u8 reg_bw_opmode; 800 u8 reg_bw_opmode;
737 u32 reg_prsr; 801 u32 reg_ratr, reg_prsr;
738 802
739 reg_bw_opmode = BW_OPMODE_20MHZ; 803 reg_bw_opmode = BW_OPMODE_20MHZ;
804 reg_ratr = RATE_ALL_CCK | RATE_ALL_OFDM_AG |
805 RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
740 reg_prsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG; 806 reg_prsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
741 807
742 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, 0x8); 808 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, 0x8);
@@ -762,8 +828,8 @@ static void _rtl8723ae_hw_configure(struct ieee80211_hw *hw)
762 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000); 828 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
763 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504); 829 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
764 830
765 if ((pcipriv->bt_coexist.bt_coexistence) && 831 if ((rtlpriv->btcoexist.bt_coexistence) &&
766 (pcipriv->bt_coexist.bt_coexist_type == BT_CSR_BC4)) 832 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4))
767 rtl_write_dword(rtlpriv, REG_AGGLEN_LMT, 0x97427431); 833 rtl_write_dword(rtlpriv, REG_AGGLEN_LMT, 0x97427431);
768 else 834 else
769 rtl_write_dword(rtlpriv, REG_AGGLEN_LMT, 0xb972a841); 835 rtl_write_dword(rtlpriv, REG_AGGLEN_LMT, 0xb972a841);
@@ -782,8 +848,8 @@ static void _rtl8723ae_hw_configure(struct ieee80211_hw *hw)
782 rtl_write_byte(rtlpriv, REG_PIFS, 0x1C); 848 rtl_write_byte(rtlpriv, REG_PIFS, 0x1C);
783 rtl_write_byte(rtlpriv, REG_AGGR_BREAK_TIME, 0x16); 849 rtl_write_byte(rtlpriv, REG_AGGR_BREAK_TIME, 0x16);
784 850
785 if ((pcipriv->bt_coexist.bt_coexistence) && 851 if ((rtlpriv->btcoexist.bt_coexistence) &&
786 (pcipriv->bt_coexist.bt_coexist_type == BT_CSR_BC4)) { 852 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4)) {
787 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0020); 853 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0020);
788 rtl_write_word(rtlpriv, REG_PROT_MODE_CTRL, 0x0402); 854 rtl_write_word(rtlpriv, REG_PROT_MODE_CTRL, 0x0402);
789 } else { 855 } else {
@@ -791,8 +857,8 @@ static void _rtl8723ae_hw_configure(struct ieee80211_hw *hw)
791 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0020); 857 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0020);
792 } 858 }
793 859
794 if ((pcipriv->bt_coexist.bt_coexistence) && 860 if ((rtlpriv->btcoexist.bt_coexistence) &&
795 (pcipriv->bt_coexist.bt_coexist_type == BT_CSR_BC4)) 861 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4))
796 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666); 862 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
797 else 863 else
798 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x086666); 864 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x086666);
@@ -812,7 +878,7 @@ static void _rtl8723ae_hw_configure(struct ieee80211_hw *hw)
812 rtl_write_dword(rtlpriv, 0x394, 0x1); 878 rtl_write_dword(rtlpriv, 0x394, 0x1);
813} 879}
814 880
815static void _rtl8723ae_enable_aspm_back_door(struct ieee80211_hw *hw) 881static void _rtl8723e_enable_aspm_back_door(struct ieee80211_hw *hw)
816{ 882{
817 struct rtl_priv *rtlpriv = rtl_priv(hw); 883 struct rtl_priv *rtlpriv = rtl_priv(hw);
818 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 884 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
@@ -830,15 +896,15 @@ static void _rtl8723ae_enable_aspm_back_door(struct ieee80211_hw *hw)
830 rtl_write_byte(rtlpriv, 0x352, 0x1); 896 rtl_write_byte(rtlpriv, 0x352, 0x1);
831} 897}
832 898
833void rtl8723ae_enable_hw_security_config(struct ieee80211_hw *hw) 899void rtl8723e_enable_hw_security_config(struct ieee80211_hw *hw)
834{ 900{
835 struct rtl_priv *rtlpriv = rtl_priv(hw); 901 struct rtl_priv *rtlpriv = rtl_priv(hw);
836 u8 sec_reg_value; 902 u8 sec_reg_value;
837 903
838 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 904 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
839 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n", 905 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
840 rtlpriv->sec.pairwise_enc_algorithm, 906 rtlpriv->sec.pairwise_enc_algorithm,
841 rtlpriv->sec.group_enc_algorithm); 907 rtlpriv->sec.group_enc_algorithm);
842 908
843 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) { 909 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
844 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 910 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
@@ -846,11 +912,11 @@ void rtl8723ae_enable_hw_security_config(struct ieee80211_hw *hw)
846 return; 912 return;
847 } 913 }
848 914
849 sec_reg_value = SCR_TxEncEnable | SCR_RxDecEnable; 915 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
850 916
851 if (rtlpriv->sec.use_defaultkey) { 917 if (rtlpriv->sec.use_defaultkey) {
852 sec_reg_value |= SCR_TxUseDK; 918 sec_reg_value |= SCR_TXUSEDK;
853 sec_reg_value |= SCR_RxUseDK; 919 sec_reg_value |= SCR_RXUSEDK;
854 } 920 }
855 921
856 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK); 922 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
@@ -864,7 +930,7 @@ void rtl8723ae_enable_hw_security_config(struct ieee80211_hw *hw)
864 930
865} 931}
866 932
867int rtl8723ae_hw_init(struct ieee80211_hw *hw) 933int rtl8723e_hw_init(struct ieee80211_hw *hw)
868{ 934{
869 struct rtl_priv *rtlpriv = rtl_priv(hw); 935 struct rtl_priv *rtlpriv = rtl_priv(hw);
870 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 936 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
@@ -887,6 +953,7 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
887 */ 953 */
888 local_save_flags(flags); 954 local_save_flags(flags);
889 local_irq_enable(); 955 local_irq_enable();
956 rtlhal->fw_ready = false;
890 957
891 rtlpriv->intf_ops->disable_aspm(hw); 958 rtlpriv->intf_ops->disable_aspm(hw);
892 rtstatus = _rtl8712e_init_mac(hw); 959 rtstatus = _rtl8712e_init_mac(hw);
@@ -896,20 +963,19 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
896 goto exit; 963 goto exit;
897 } 964 }
898 965
899 err = rtl8723_download_fw(hw, false); 966 err = rtl8723_download_fw(hw, false, FW_8723A_POLLING_TIMEOUT_COUNT);
900 if (err) { 967 if (err) {
901 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 968 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
902 "Failed to download FW. Init HW without FW now..\n"); 969 "Failed to download FW. Init HW without FW now..\n");
903 err = 1; 970 err = 1;
904 goto exit; 971 goto exit;
905 } else {
906 rtlhal->fw_ready = true;
907 } 972 }
973 rtlhal->fw_ready = true;
908 974
909 rtlhal->last_hmeboxnum = 0; 975 rtlhal->last_hmeboxnum = 0;
910 rtl8723ae_phy_mac_config(hw); 976 rtl8723e_phy_mac_config(hw);
911 /* because the last function modifies RCR, we update 977 /* because last function modify RCR, so we update
912 * rcr var here, or TP will be unstable as ther receive_config 978 * rcr var here, or TP will unstable for receive_config
913 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx 979 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx
914 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252 980 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
915 */ 981 */
@@ -917,9 +983,9 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
917 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV); 983 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
918 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config); 984 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
919 985
920 rtl8723ae_phy_bb_config(hw); 986 rtl8723e_phy_bb_config(hw);
921 rtlphy->rf_mode = RF_OP_BY_SW_3WIRE; 987 rtlphy->rf_mode = RF_OP_BY_SW_3WIRE;
922 rtl8723ae_phy_rf_config(hw); 988 rtl8723e_phy_rf_config(hw);
923 if (IS_VENDOR_UMC_A_CUT(rtlhal->version)) { 989 if (IS_VENDOR_UMC_A_CUT(rtlhal->version)) {
924 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 0x30255); 990 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 0x30255);
925 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G2, MASKDWORD, 0x50a00); 991 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G2, MASKDWORD, 0x50a00);
@@ -938,28 +1004,29 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
938 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1); 1004 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
939 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1); 1005 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
940 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); 1006 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);
941 _rtl8723ae_hw_configure(hw); 1007 _rtl8723e_hw_configure(hw);
942 rtl_cam_reset_all_entry(hw); 1008 rtl_cam_reset_all_entry(hw);
943 rtl8723ae_enable_hw_security_config(hw); 1009 rtl8723e_enable_hw_security_config(hw);
944 1010
945 ppsc->rfpwr_state = ERFON; 1011 ppsc->rfpwr_state = ERFON;
946 1012
947 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr); 1013 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
948 _rtl8723ae_enable_aspm_back_door(hw); 1014 _rtl8723e_enable_aspm_back_door(hw);
949 rtlpriv->intf_ops->enable_aspm(hw); 1015 rtlpriv->intf_ops->enable_aspm(hw);
950 1016
951 rtl8723ae_bt_hw_init(hw); 1017 rtl8723e_bt_hw_init(hw);
952 1018
953 if (ppsc->rfpwr_state == ERFON) { 1019 if (ppsc->rfpwr_state == ERFON) {
954 rtl8723ae_phy_set_rfpath_switch(hw, 1); 1020 rtl8723e_phy_set_rfpath_switch(hw, 1);
955 if (rtlphy->iqk_initialized) { 1021 if (rtlphy->iqk_initialized) {
956 rtl8723ae_phy_iq_calibrate(hw, true); 1022 rtl8723e_phy_iq_calibrate(hw, true);
957 } else { 1023 } else {
958 rtl8723ae_phy_iq_calibrate(hw, false); 1024 rtl8723e_phy_iq_calibrate(hw, false);
959 rtlphy->iqk_initialized = true; 1025 rtlphy->iqk_initialized = true;
960 } 1026 }
961 1027
962 rtl8723ae_phy_lc_calibrate(hw); 1028 rtl8723e_dm_check_txpower_tracking(hw);
1029 rtl8723e_phy_lc_calibrate(hw);
963 } 1030 }
964 1031
965 tmp_u1b = efuse_read_1byte(hw, 0x1FA); 1032 tmp_u1b = efuse_read_1byte(hw, 0x1FA);
@@ -969,20 +1036,21 @@ int rtl8723ae_hw_init(struct ieee80211_hw *hw)
969 } 1036 }
970 1037
971 if (!(tmp_u1b & BIT(4))) { 1038 if (!(tmp_u1b & BIT(4))) {
972 tmp_u1b = rtl_read_byte(rtlpriv, 0x16) & 0x0F; 1039 tmp_u1b = rtl_read_byte(rtlpriv, 0x16);
1040 tmp_u1b &= 0x0F;
973 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x80); 1041 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x80);
974 udelay(10); 1042 udelay(10);
975 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x90); 1043 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x90);
976 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n"); 1044 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n");
977 } 1045 }
978 rtl8723ae_dm_init(hw); 1046 rtl8723e_dm_init(hw);
979exit: 1047exit:
980 local_irq_restore(flags); 1048 local_irq_restore(flags);
981 rtlpriv->rtlhal.being_init_adapter = false; 1049 rtlpriv->rtlhal.being_init_adapter = false;
982 return err; 1050 return err;
983} 1051}
984 1052
985static enum version_8723e _rtl8723ae_read_chip_version(struct ieee80211_hw *hw) 1053static enum version_8723e _rtl8723e_read_chip_version(struct ieee80211_hw *hw)
986{ 1054{
987 struct rtl_priv *rtlpriv = rtl_priv(hw); 1055 struct rtl_priv *rtlpriv = rtl_priv(hw);
988 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1056 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -992,41 +1060,41 @@ static enum version_8723e _rtl8723ae_read_chip_version(struct ieee80211_hw *hw)
992 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG); 1060 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
993 if (value32 & TRP_VAUX_EN) { 1061 if (value32 & TRP_VAUX_EN) {
994 version = (enum version_8723e)(version | 1062 version = (enum version_8723e)(version |
995 ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0)); 1063 ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0));
996 /* RTL8723 with BT function. */ 1064 /* RTL8723 with BT function. */
997 version = (enum version_8723e)(version | 1065 version = (enum version_8723e)(version |
998 ((value32 & BT_FUNC) ? CHIP_8723 : 0)); 1066 ((value32 & BT_FUNC) ? CHIP_8723 : 0));
999 1067
1000 } else { 1068 } else {
1001 /* Normal mass production chip. */ 1069 /* Normal mass production chip. */
1002 version = (enum version_8723e) NORMAL_CHIP; 1070 version = (enum version_8723e) NORMAL_CHIP;
1003 version = (enum version_8723e)(version | 1071 version = (enum version_8723e)(version |
1004 ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0)); 1072 ((value32 & VENDOR_ID) ? CHIP_VENDOR_UMC : 0));
1005 /* RTL8723 with BT function. */ 1073 /* RTL8723 with BT function. */
1006 version = (enum version_8723e)(version | 1074 version = (enum version_8723e)(version |
1007 ((value32 & BT_FUNC) ? CHIP_8723 : 0)); 1075 ((value32 & BT_FUNC) ? CHIP_8723 : 0));
1008 if (IS_CHIP_VENDOR_UMC(version)) 1076 if (IS_CHIP_VENDOR_UMC(version))
1009 version = (enum version_8723e)(version | 1077 version = (enum version_8723e)(version |
1010 ((value32 & CHIP_VER_RTL_MASK)));/* IC version (CUT) */ 1078 ((value32 & CHIP_VER_RTL_MASK)));/* IC version (CUT) */
1011 if (IS_8723_SERIES(version)) { 1079 if (IS_8723_SERIES(version)) {
1012 value32 = rtl_read_dword(rtlpriv, REG_GPIO_OUTSTS); 1080 value32 = rtl_read_dword(rtlpriv, REG_GPIO_OUTSTS);
1013 /* ROM code version */ 1081 /* ROM code version. */
1014 version = (enum version_8723e)(version | 1082 version = (enum version_8723e)(version |
1015 ((value32 & RF_RL_ID)>>20)); 1083 ((value32 & RF_RL_ID)>>20));
1016 } 1084 }
1017 } 1085 }
1018 1086
1019 if (IS_8723_SERIES(version)) { 1087 if (IS_8723_SERIES(version)) {
1020 value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL); 1088 value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
1021 rtlphy->polarity_ctl = ((value32 & WL_HWPDN_SL) ? 1089 rtlphy->polarity_ctl = ((value32 & WL_HWPDN_SL) ?
1022 RT_POLARITY_HIGH_ACT : 1090 RT_POLARITY_HIGH_ACT :
1023 RT_POLARITY_LOW_ACT); 1091 RT_POLARITY_LOW_ACT);
1024 } 1092 }
1025 switch (version) { 1093 switch (version) {
1026 case VERSION_TEST_UMC_CHIP_8723: 1094 case VERSION_TEST_UMC_CHIP_8723:
1027 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1095 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1028 "Chip Version ID: VERSION_TEST_UMC_CHIP_8723.\n"); 1096 "Chip Version ID: VERSION_TEST_UMC_CHIP_8723.\n");
1029 break; 1097 break;
1030 case VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT: 1098 case VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT:
1031 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1099 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1032 "Chip Version ID: VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT.\n"); 1100 "Chip Version ID: VERSION_NORMAL_UMC_CHIP_8723_1T1R_A_CUT.\n");
@@ -1050,113 +1118,124 @@ static enum version_8723e _rtl8723ae_read_chip_version(struct ieee80211_hw *hw)
1050 return version; 1118 return version;
1051} 1119}
1052 1120
1053static int _rtl8723ae_set_media_status(struct ieee80211_hw *hw, 1121static int _rtl8723e_set_media_status(struct ieee80211_hw *hw,
1054 enum nl80211_iftype type) 1122 enum nl80211_iftype type)
1055{ 1123{
1056 struct rtl_priv *rtlpriv = rtl_priv(hw); 1124 struct rtl_priv *rtlpriv = rtl_priv(hw);
1057 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc; 1125 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1058 enum led_ctl_mode ledaction = LED_CTL_NO_LINK; 1126 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1127 u8 mode = MSR_NOLINK;
1059 1128
1060 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0); 1129 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0);
1061 RT_TRACE(rtlpriv, COMP_BEACON, DBG_LOUD, 1130 RT_TRACE(rtlpriv, COMP_BEACON, DBG_LOUD,
1062 "clear 0x550 when set HW_VAR_MEDIA_STATUS\n"); 1131 "clear 0x550 when set HW_VAR_MEDIA_STATUS\n");
1063
1064 if (type == NL80211_IFTYPE_UNSPECIFIED ||
1065 type == NL80211_IFTYPE_STATION) {
1066 _rtl8723ae_stop_tx_beacon(hw);
1067 _rtl8723ae_enable_bcn_sufunc(hw);
1068 } else if (type == NL80211_IFTYPE_ADHOC ||
1069 type == NL80211_IFTYPE_AP) {
1070 _rtl8723ae_resume_tx_beacon(hw);
1071 _rtl8723ae_disable_bcn_sufunc(hw);
1072 } else {
1073 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1074 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1075 type);
1076 }
1077 1132
1078 switch (type) { 1133 switch (type) {
1079 case NL80211_IFTYPE_UNSPECIFIED: 1134 case NL80211_IFTYPE_UNSPECIFIED:
1080 bt_msr |= MSR_NOLINK; 1135 mode = MSR_NOLINK;
1081 ledaction = LED_CTL_LINK;
1082 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1136 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1083 "Set Network type to NO LINK!\n"); 1137 "Set Network type to NO LINK!\n");
1084 break; 1138 break;
1085 case NL80211_IFTYPE_ADHOC: 1139 case NL80211_IFTYPE_ADHOC:
1086 bt_msr |= MSR_ADHOC; 1140 mode = MSR_ADHOC;
1087 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1141 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1088 "Set Network type to Ad Hoc!\n"); 1142 "Set Network type to Ad Hoc!\n");
1089 break; 1143 break;
1090 case NL80211_IFTYPE_STATION: 1144 case NL80211_IFTYPE_STATION:
1091 bt_msr |= MSR_INFRA; 1145 mode = MSR_INFRA;
1092 ledaction = LED_CTL_LINK; 1146 ledaction = LED_CTL_LINK;
1093 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1147 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1094 "Set Network type to STA!\n"); 1148 "Set Network type to STA!\n");
1095 break; 1149 break;
1096 case NL80211_IFTYPE_AP: 1150 case NL80211_IFTYPE_AP:
1097 bt_msr |= MSR_AP; 1151 mode = MSR_AP;
1152 ledaction = LED_CTL_LINK;
1098 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1153 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1099 "Set Network type to AP!\n"); 1154 "Set Network type to AP!\n");
1100 break; 1155 break;
1101 default: 1156 default:
1102 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1157 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1103 "Network type %d not supported!\n", 1158 "Network type %d not support!\n", type);
1104 type);
1105 return 1; 1159 return 1;
1160 break;
1161 }
1106 1162
1163 /* MSR_INFRA == Link in infrastructure network;
1164 * MSR_ADHOC == Link in ad hoc network;
1165 * Therefore, check link state is necessary.
1166 *
1167 * MSR_AP == AP mode; link state is not cared here.
1168 */
1169 if (mode != MSR_AP &&
1170 rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1171 mode = MSR_NOLINK;
1172 ledaction = LED_CTL_NO_LINK;
1173 }
1174 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1175 _rtl8723e_stop_tx_beacon(hw);
1176 _rtl8723e_enable_bcn_sub_func(hw);
1177 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1178 _rtl8723e_resume_tx_beacon(hw);
1179 _rtl8723e_disable_bcn_sub_func(hw);
1180 } else {
1181 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1182 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1183 mode);
1107 } 1184 }
1108 1185
1109 rtl_write_byte(rtlpriv, (MSR), bt_msr); 1186 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
1110 rtlpriv->cfg->ops->led_control(hw, ledaction); 1187 rtlpriv->cfg->ops->led_control(hw, ledaction);
1111 if ((bt_msr & MSR_MASK) == MSR_AP) 1188 if (mode == MSR_AP)
1112 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1189 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1113 else 1190 else
1114 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66); 1191 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
1115 return 0; 1192 return 0;
1116} 1193}
1117 1194
1118void rtl8723ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid) 1195void rtl8723e_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1119{ 1196{
1120 struct rtl_priv *rtlpriv = rtl_priv(hw); 1197 struct rtl_priv *rtlpriv = rtl_priv(hw);
1121 u32 reg_rcr; 1198 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1199 u32 reg_rcr = rtlpci->receive_config;
1122 1200
1123 if (rtlpriv->psc.rfpwr_state != ERFON) 1201 if (rtlpriv->psc.rfpwr_state != ERFON)
1124 return; 1202 return;
1125 1203
1126 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RCR, (u8 *)(&reg_rcr)); 1204 if (check_bssid) {
1127
1128 if (check_bssid == true) {
1129 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN); 1205 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
1130 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, 1206 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1131 (u8 *)(&reg_rcr)); 1207 (u8 *)(&reg_rcr));
1132 _rtl8723ae_set_bcn_ctrl_reg(hw, 0, BIT(4)); 1208 _rtl8723e_set_bcn_ctrl_reg(hw, 0, BIT(4));
1133 } else if (check_bssid == false) { 1209 } else if (!check_bssid) {
1134 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN)); 1210 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
1135 _rtl8723ae_set_bcn_ctrl_reg(hw, BIT(4), 0); 1211 _rtl8723e_set_bcn_ctrl_reg(hw, BIT(4), 0);
1136 rtlpriv->cfg->ops->set_hw_reg(hw, 1212 rtlpriv->cfg->ops->set_hw_reg(hw,
1137 HW_VAR_RCR, (u8 *) (&reg_rcr)); 1213 HW_VAR_RCR, (u8 *)(&reg_rcr));
1138 } 1214 }
1139} 1215}
1140 1216
1141int rtl8723ae_set_network_type(struct ieee80211_hw *hw, 1217int rtl8723e_set_network_type(struct ieee80211_hw *hw,
1142 enum nl80211_iftype type) 1218 enum nl80211_iftype type)
1143{ 1219{
1144 struct rtl_priv *rtlpriv = rtl_priv(hw); 1220 struct rtl_priv *rtlpriv = rtl_priv(hw);
1145 1221
1146 if (_rtl8723ae_set_media_status(hw, type)) 1222 if (_rtl8723e_set_media_status(hw, type))
1147 return -EOPNOTSUPP; 1223 return -EOPNOTSUPP;
1148 1224
1149 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) { 1225 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
1150 if (type != NL80211_IFTYPE_AP) 1226 if (type != NL80211_IFTYPE_AP)
1151 rtl8723ae_set_check_bssid(hw, true); 1227 rtl8723e_set_check_bssid(hw, true);
1152 } else { 1228 } else {
1153 rtl8723ae_set_check_bssid(hw, false); 1229 rtl8723e_set_check_bssid(hw, false);
1154 } 1230 }
1231
1155 return 0; 1232 return 0;
1156} 1233}
1157 1234
1158/* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */ 1235/* don't set REG_EDCA_BE_PARAM here
1159void rtl8723ae_set_qos(struct ieee80211_hw *hw, int aci) 1236 * because mac80211 will send pkt when scan
1237 */
1238void rtl8723e_set_qos(struct ieee80211_hw *hw, int aci)
1160{ 1239{
1161 struct rtl_priv *rtlpriv = rtl_priv(hw); 1240 struct rtl_priv *rtlpriv = rtl_priv(hw);
1162 1241
@@ -1166,7 +1245,6 @@ void rtl8723ae_set_qos(struct ieee80211_hw *hw, int aci)
1166 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f); 1245 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
1167 break; 1246 break;
1168 case AC0_BE: 1247 case AC0_BE:
1169 /* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4ac_param); */
1170 break; 1248 break;
1171 case AC2_VI: 1249 case AC2_VI:
1172 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322); 1250 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
@@ -1180,7 +1258,19 @@ void rtl8723ae_set_qos(struct ieee80211_hw *hw, int aci)
1180 } 1258 }
1181} 1259}
1182 1260
1183void rtl8723ae_enable_interrupt(struct ieee80211_hw *hw) 1261static void rtl8723e_clear_interrupt(struct ieee80211_hw *hw)
1262{
1263 struct rtl_priv *rtlpriv = rtl_priv(hw);
1264 u32 tmp;
1265
1266 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1267 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1268
1269 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1270 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1271}
1272
1273void rtl8723e_enable_interrupt(struct ieee80211_hw *hw)
1184{ 1274{
1185 struct rtl_priv *rtlpriv = rtl_priv(hw); 1275 struct rtl_priv *rtlpriv = rtl_priv(hw);
1186 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1276 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -1190,37 +1280,39 @@ void rtl8723ae_enable_interrupt(struct ieee80211_hw *hw)
1190 rtlpci->irq_enabled = true; 1280 rtlpci->irq_enabled = true;
1191} 1281}
1192 1282
1193void rtl8723ae_disable_interrupt(struct ieee80211_hw *hw) 1283void rtl8723e_disable_interrupt(struct ieee80211_hw *hw)
1194{ 1284{
1195 struct rtl_priv *rtlpriv = rtl_priv(hw); 1285 struct rtl_priv *rtlpriv = rtl_priv(hw);
1196 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1286 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1197 1287 rtl8723e_clear_interrupt(hw);/*clear it here first*/
1198 rtl_write_dword(rtlpriv, 0x3a8, IMR8190_DISABLED); 1288 rtl_write_dword(rtlpriv, 0x3a8, IMR8190_DISABLED);
1199 rtl_write_dword(rtlpriv, 0x3ac, IMR8190_DISABLED); 1289 rtl_write_dword(rtlpriv, 0x3ac, IMR8190_DISABLED);
1200 rtlpci->irq_enabled = false; 1290 rtlpci->irq_enabled = false;
1201 synchronize_irq(rtlpci->pdev->irq); 1291 /*synchronize_irq(rtlpci->pdev->irq);*/
1202} 1292}
1203 1293
1204static void _rtl8723ae_poweroff_adapter(struct ieee80211_hw *hw) 1294static void _rtl8723e_poweroff_adapter(struct ieee80211_hw *hw)
1205{ 1295{
1206 struct rtl_priv *rtlpriv = rtl_priv(hw); 1296 struct rtl_priv *rtlpriv = rtl_priv(hw);
1207 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1297 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1208 u8 u1tmp; 1298 u8 u1b_tmp;
1209 1299
1210 /* Combo (PCIe + USB) Card and PCIe-MF Card */ 1300 /* Combo (PCIe + USB) Card and PCIe-MF Card */
1211 /* 1. Run LPS WL RFOFF flow */ 1301 /* 1. Run LPS WL RFOFF flow */
1212 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, 1302 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1213 PWR_INTF_PCI_MSK, Rtl8723_NIC_LPS_ENTER_FLOW); 1303 PWR_INTF_PCI_MSK, Rtl8723_NIC_LPS_ENTER_FLOW);
1214 1304
1215 /* 2. 0x1F[7:0] = 0 */ 1305 /* 2. 0x1F[7:0] = 0 */
1216 /* turn off RF */ 1306 /* turn off RF */
1217 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); 1307 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1218 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) && rtlhal->fw_ready) 1308 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1309 rtlhal->fw_ready) {
1219 rtl8723ae_firmware_selfreset(hw); 1310 rtl8723ae_firmware_selfreset(hw);
1311 }
1220 1312
1221 /* Reset MCU. Suggested by Filen. */ 1313 /* Reset MCU. Suggested by Filen. */
1222 u1tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1); 1314 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1223 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1tmp & (~BIT(2)))); 1315 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
1224 1316
1225 /* g. MCUFWDL 0x80[1:0]=0 */ 1317 /* g. MCUFWDL 0x80[1:0]=0 */
1226 /* reset MCU ready status */ 1318 /* reset MCU ready status */
@@ -1231,39 +1323,38 @@ static void _rtl8723ae_poweroff_adapter(struct ieee80211_hw *hw)
1231 PWR_INTF_PCI_MSK, Rtl8723_NIC_DISABLE_FLOW); 1323 PWR_INTF_PCI_MSK, Rtl8723_NIC_DISABLE_FLOW);
1232 1324
1233 /* Reset MCU IO Wrapper */ 1325 /* Reset MCU IO Wrapper */
1234 u1tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); 1326 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1235 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1tmp & (~BIT(0)))); 1327 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1236 u1tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1); 1328 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1237 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1tmp | BIT(0)); 1329 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1238 1330
1239 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */ 1331 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1240 /* lock ISO/CLK/Power control register */ 1332 /* lock ISO/CLK/Power control register */
1241 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e); 1333 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1242} 1334}
1243 1335
1244void rtl8723ae_card_disable(struct ieee80211_hw *hw) 1336void rtl8723e_card_disable(struct ieee80211_hw *hw)
1245{ 1337{
1246 struct rtl_priv *rtlpriv = rtl_priv(hw); 1338 struct rtl_priv *rtlpriv = rtl_priv(hw);
1247 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1339 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1248 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1340 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1249 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1250 enum nl80211_iftype opmode; 1341 enum nl80211_iftype opmode;
1251 1342
1252 mac->link_state = MAC80211_NOLINK; 1343 mac->link_state = MAC80211_NOLINK;
1253 opmode = NL80211_IFTYPE_UNSPECIFIED; 1344 opmode = NL80211_IFTYPE_UNSPECIFIED;
1254 _rtl8723ae_set_media_status(hw, opmode); 1345 _rtl8723e_set_media_status(hw, opmode);
1255 if (rtlpci->driver_is_goingto_unload || 1346 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
1256 ppsc->rfoff_reason > RF_CHANGE_BY_PS) 1347 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
1257 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF); 1348 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
1258 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 1349 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
1259 _rtl8723ae_poweroff_adapter(hw); 1350 _rtl8723e_poweroff_adapter(hw);
1260 1351
1261 /* after power off we should do iqk again */ 1352 /* after power off we should do iqk again */
1262 rtlpriv->phy.iqk_initialized = false; 1353 rtlpriv->phy.iqk_initialized = false;
1263} 1354}
1264 1355
1265void rtl8723ae_interrupt_recognized(struct ieee80211_hw *hw, 1356void rtl8723e_interrupt_recognized(struct ieee80211_hw *hw,
1266 u32 *p_inta, u32 *p_intb) 1357 u32 *p_inta, u32 *p_intb)
1267{ 1358{
1268 struct rtl_priv *rtlpriv = rtl_priv(hw); 1359 struct rtl_priv *rtlpriv = rtl_priv(hw);
1269 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1360 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -1272,7 +1363,7 @@ void rtl8723ae_interrupt_recognized(struct ieee80211_hw *hw,
1272 rtl_write_dword(rtlpriv, 0x3a0, *p_inta); 1363 rtl_write_dword(rtlpriv, 0x3a0, *p_inta);
1273} 1364}
1274 1365
1275void rtl8723ae_set_beacon_related_registers(struct ieee80211_hw *hw) 1366void rtl8723e_set_beacon_related_registers(struct ieee80211_hw *hw)
1276{ 1367{
1277 1368
1278 struct rtl_priv *rtlpriv = rtl_priv(hw); 1369 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1281,17 +1372,17 @@ void rtl8723ae_set_beacon_related_registers(struct ieee80211_hw *hw)
1281 1372
1282 bcn_interval = mac->beacon_interval; 1373 bcn_interval = mac->beacon_interval;
1283 atim_window = 2; /*FIX MERGE */ 1374 atim_window = 2; /*FIX MERGE */
1284 rtl8723ae_disable_interrupt(hw); 1375 rtl8723e_disable_interrupt(hw);
1285 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window); 1376 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
1286 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); 1377 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1287 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f); 1378 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
1288 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18); 1379 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
1289 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18); 1380 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
1290 rtl_write_byte(rtlpriv, 0x606, 0x30); 1381 rtl_write_byte(rtlpriv, 0x606, 0x30);
1291 rtl8723ae_enable_interrupt(hw); 1382 rtl8723e_enable_interrupt(hw);
1292} 1383}
1293 1384
1294void rtl8723ae_set_beacon_interval(struct ieee80211_hw *hw) 1385void rtl8723e_set_beacon_interval(struct ieee80211_hw *hw)
1295{ 1386{
1296 struct rtl_priv *rtlpriv = rtl_priv(hw); 1387 struct rtl_priv *rtlpriv = rtl_priv(hw);
1297 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1388 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -1299,13 +1390,13 @@ void rtl8723ae_set_beacon_interval(struct ieee80211_hw *hw)
1299 1390
1300 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG, 1391 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
1301 "beacon_interval:%d\n", bcn_interval); 1392 "beacon_interval:%d\n", bcn_interval);
1302 rtl8723ae_disable_interrupt(hw); 1393 rtl8723e_disable_interrupt(hw);
1303 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval); 1394 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
1304 rtl8723ae_enable_interrupt(hw); 1395 rtl8723e_enable_interrupt(hw);
1305} 1396}
1306 1397
1307void rtl8723ae_update_interrupt_mask(struct ieee80211_hw *hw, 1398void rtl8723e_update_interrupt_mask(struct ieee80211_hw *hw,
1308 u32 add_msr, u32 rm_msr) 1399 u32 add_msr, u32 rm_msr)
1309{ 1400{
1310 struct rtl_priv *rtlpriv = rtl_priv(hw); 1401 struct rtl_priv *rtlpriv = rtl_priv(hw);
1311 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1402 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
@@ -1317,11 +1408,11 @@ void rtl8723ae_update_interrupt_mask(struct ieee80211_hw *hw,
1317 rtlpci->irq_mask[0] |= add_msr; 1408 rtlpci->irq_mask[0] |= add_msr;
1318 if (rm_msr) 1409 if (rm_msr)
1319 rtlpci->irq_mask[0] &= (~rm_msr); 1410 rtlpci->irq_mask[0] &= (~rm_msr);
1320 rtl8723ae_disable_interrupt(hw); 1411 rtl8723e_disable_interrupt(hw);
1321 rtl8723ae_enable_interrupt(hw); 1412 rtl8723e_enable_interrupt(hw);
1322} 1413}
1323 1414
1324static u8 _rtl8723ae_get_chnl_group(u8 chnl) 1415static u8 _rtl8723e_get_chnl_group(u8 chnl)
1325{ 1416{
1326 u8 group; 1417 u8 group;
1327 1418
@@ -1334,9 +1425,9 @@ static u8 _rtl8723ae_get_chnl_group(u8 chnl)
1334 return group; 1425 return group;
1335} 1426}
1336 1427
1337static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw, 1428static void _rtl8723e_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1338 bool autoload_fail, 1429 bool autoload_fail,
1339 u8 *hwinfo) 1430 u8 *hwinfo)
1340{ 1431{
1341 struct rtl_priv *rtlpriv = rtl_priv(hw); 1432 struct rtl_priv *rtlpriv = rtl_priv(hw);
1342 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1433 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
@@ -1346,19 +1437,14 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1346 for (rf_path = 0; rf_path < 1; rf_path++) { 1437 for (rf_path = 0; rf_path < 1; rf_path++) {
1347 for (i = 0; i < 3; i++) { 1438 for (i = 0; i < 3; i++) {
1348 if (!autoload_fail) { 1439 if (!autoload_fail) {
1349 rtlefuse->eeprom_chnlarea_txpwr_cck 1440 rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][i] =
1350 [rf_path][i] =
1351 hwinfo[EEPROM_TXPOWERCCK + rf_path * 3 + i]; 1441 hwinfo[EEPROM_TXPOWERCCK + rf_path * 3 + i];
1352 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s 1442 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s[rf_path][i] =
1353 [rf_path][i] = 1443 hwinfo[EEPROM_TXPOWERHT40_1S + rf_path * 3 + i];
1354 hwinfo[EEPROM_TXPOWERHT40_1S + rf_path *
1355 3 + i];
1356 } else { 1444 } else {
1357 rtlefuse->eeprom_chnlarea_txpwr_cck 1445 rtlefuse->eeprom_chnlarea_txpwr_cck[rf_path][i] =
1358 [rf_path][i] =
1359 EEPROM_DEFAULT_TXPOWERLEVEL; 1446 EEPROM_DEFAULT_TXPOWERLEVEL;
1360 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s 1447 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s[rf_path][i] =
1361 [rf_path][i] =
1362 EEPROM_DEFAULT_TXPOWERLEVEL; 1448 EEPROM_DEFAULT_TXPOWERLEVEL;
1363 } 1449 }
1364 } 1450 }
@@ -1379,43 +1465,43 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1379 for (i = 0; i < 3; i++) 1465 for (i = 0; i < 3; i++)
1380 RTPRINT(rtlpriv, FINIT, INIT_EEPROM, 1466 RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
1381 "RF(%d) EEPROM CCK Area(%d) = 0x%x\n", rf_path, 1467 "RF(%d) EEPROM CCK Area(%d) = 0x%x\n", rf_path,
1382 i, rtlefuse->eeprom_chnlarea_txpwr_cck 1468 i, rtlefuse->eeprom_chnlarea_txpwr_cck
1383 [rf_path][i]); 1469 [rf_path][i]);
1384 for (rf_path = 0; rf_path < 2; rf_path++) 1470 for (rf_path = 0; rf_path < 2; rf_path++)
1385 for (i = 0; i < 3; i++) 1471 for (i = 0; i < 3; i++)
1386 RTPRINT(rtlpriv, FINIT, INIT_EEPROM, 1472 RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
1387 "RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n", 1473 "RF(%d) EEPROM HT40 1S Area(%d) = 0x%x\n",
1388 rf_path, i, 1474 rf_path, i,
1389 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s 1475 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
1390 [rf_path][i]); 1476 [rf_path][i]);
1391 for (rf_path = 0; rf_path < 2; rf_path++) 1477 for (rf_path = 0; rf_path < 2; rf_path++)
1392 for (i = 0; i < 3; i++) 1478 for (i = 0; i < 3; i++)
1393 RTPRINT(rtlpriv, FINIT, INIT_EEPROM, 1479 RTPRINT(rtlpriv, FINIT, INIT_EEPROM,
1394 "RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n", 1480 "RF(%d) EEPROM HT40 2S Diff Area(%d) = 0x%x\n",
1395 rf_path, i, 1481 rf_path, i,
1396 rtlefuse->eprom_chnl_txpwr_ht40_2sdf 1482 rtlefuse->eprom_chnl_txpwr_ht40_2sdf
1397 [rf_path][i]); 1483 [rf_path][i]);
1398 1484
1399 for (rf_path = 0; rf_path < 2; rf_path++) { 1485 for (rf_path = 0; rf_path < 2; rf_path++) {
1400 for (i = 0; i < 14; i++) { 1486 for (i = 0; i < 14; i++) {
1401 index = _rtl8723ae_get_chnl_group((u8) i); 1487 index = _rtl8723e_get_chnl_group((u8)i);
1402 1488
1403 rtlefuse->txpwrlevel_cck[rf_path][i] = 1489 rtlefuse->txpwrlevel_cck[rf_path][i] =
1404 rtlefuse->eeprom_chnlarea_txpwr_cck 1490 rtlefuse->eeprom_chnlarea_txpwr_cck
1405 [rf_path][index]; 1491 [rf_path][index];
1406 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] = 1492 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
1407 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s 1493 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
1408 [rf_path][index]; 1494 [rf_path][index];
1409 1495
1410 if ((rtlefuse->eeprom_chnlarea_txpwr_ht40_1s 1496 if ((rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
1411 [rf_path][index] -
1412 rtlefuse->eprom_chnl_txpwr_ht40_2sdf[rf_path]
1413 [index]) > 0) {
1414 rtlefuse->txpwrlevel_ht40_2s[rf_path][i] =
1415 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
1416 [rf_path][index] - 1497 [rf_path][index] -
1417 rtlefuse->eprom_chnl_txpwr_ht40_2sdf 1498 rtlefuse->eprom_chnl_txpwr_ht40_2sdf
1418 [rf_path][index]; 1499 [rf_path][index]) > 0) {
1500 rtlefuse->txpwrlevel_ht40_2s[rf_path][i] =
1501 rtlefuse->eeprom_chnlarea_txpwr_ht40_1s
1502 [rf_path][index] -
1503 rtlefuse->eprom_chnl_txpwr_ht40_2sdf
1504 [rf_path][index];
1419 } else { 1505 } else {
1420 rtlefuse->txpwrlevel_ht40_2s[rf_path][i] = 0; 1506 rtlefuse->txpwrlevel_ht40_2s[rf_path][i] = 0;
1421 } 1507 }
@@ -1423,8 +1509,8 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1423 1509
1424 for (i = 0; i < 14; i++) { 1510 for (i = 0; i < 14; i++) {
1425 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1511 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1426 "RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = " 1512 "RF(%d)-Ch(%d) [CCK / HT40_1S / HT40_2S] = [0x%x / 0x%x / 0x%x]\n",
1427 "[0x%x / 0x%x / 0x%x]\n", rf_path, i, 1513 rf_path, i,
1428 rtlefuse->txpwrlevel_cck[rf_path][i], 1514 rtlefuse->txpwrlevel_cck[rf_path][i],
1429 rtlefuse->txpwrlevel_ht40_1s[rf_path][i], 1515 rtlefuse->txpwrlevel_ht40_1s[rf_path][i],
1430 rtlefuse->txpwrlevel_ht40_2s[rf_path][i]); 1516 rtlefuse->txpwrlevel_ht40_2s[rf_path][i]);
@@ -1445,22 +1531,20 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1445 1531
1446 for (rf_path = 0; rf_path < 2; rf_path++) { 1532 for (rf_path = 0; rf_path < 2; rf_path++) {
1447 for (i = 0; i < 14; i++) { 1533 for (i = 0; i < 14; i++) {
1448 index = _rtl8723ae_get_chnl_group((u8) i); 1534 index = _rtl8723e_get_chnl_group((u8)i);
1449 1535
1450 if (rf_path == RF90_PATH_A) { 1536 if (rf_path == RF90_PATH_A) {
1451 rtlefuse->pwrgroup_ht20[rf_path][i] = 1537 rtlefuse->pwrgroup_ht20[rf_path][i] =
1452 (rtlefuse->eeprom_pwrlimit_ht20[index] & 1538 (rtlefuse->eeprom_pwrlimit_ht20[index] & 0xf);
1453 0xf);
1454 rtlefuse->pwrgroup_ht40[rf_path][i] = 1539 rtlefuse->pwrgroup_ht40[rf_path][i] =
1455 (rtlefuse->eeprom_pwrlimit_ht40[index] & 1540 (rtlefuse->eeprom_pwrlimit_ht40[index] & 0xf);
1456 0xf);
1457 } else if (rf_path == RF90_PATH_B) { 1541 } else if (rf_path == RF90_PATH_B) {
1458 rtlefuse->pwrgroup_ht20[rf_path][i] = 1542 rtlefuse->pwrgroup_ht20[rf_path][i] =
1459 ((rtlefuse->eeprom_pwrlimit_ht20[index] & 1543 ((rtlefuse->eeprom_pwrlimit_ht20[index] &
1460 0xf0) >> 4); 1544 0xf0) >> 4);
1461 rtlefuse->pwrgroup_ht40[rf_path][i] = 1545 rtlefuse->pwrgroup_ht40[rf_path][i] =
1462 ((rtlefuse->eeprom_pwrlimit_ht40[index] & 1546 ((rtlefuse->eeprom_pwrlimit_ht40[index] &
1463 0xf0) >> 4); 1547 0xf0) >> 4);
1464 } 1548 }
1465 1549
1466 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1550 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
@@ -1473,7 +1557,7 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1473 } 1557 }
1474 1558
1475 for (i = 0; i < 14; i++) { 1559 for (i = 0; i < 14; i++) {
1476 index = _rtl8723ae_get_chnl_group((u8) i); 1560 index = _rtl8723e_get_chnl_group((u8)i);
1477 1561
1478 if (!autoload_fail) 1562 if (!autoload_fail)
1479 tempval = hwinfo[EEPROM_TXPOWERHT20DIFF + index]; 1563 tempval = hwinfo[EEPROM_TXPOWERHT20DIFF + index];
@@ -1490,7 +1574,7 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1490 if (rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] & BIT(3)) 1574 if (rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] & BIT(3))
1491 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] |= 0xF0; 1575 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i] |= 0xF0;
1492 1576
1493 index = _rtl8723ae_get_chnl_group((u8) i); 1577 index = _rtl8723e_get_chnl_group((u8)i);
1494 1578
1495 if (!autoload_fail) 1579 if (!autoload_fail)
1496 tempval = hwinfo[EEPROM_TXPOWER_OFDMDIFF + index]; 1580 tempval = hwinfo[EEPROM_TXPOWER_OFDMDIFF + index];
@@ -1508,19 +1592,19 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1508 for (i = 0; i < 14; i++) 1592 for (i = 0; i < 14; i++)
1509 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1593 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1510 "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i, 1594 "RF-A Ht20 to HT40 Diff[%d] = 0x%x\n", i,
1511 rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]); 1595 rtlefuse->txpwr_ht20diff[RF90_PATH_A][i]);
1512 for (i = 0; i < 14; i++) 1596 for (i = 0; i < 14; i++)
1513 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1597 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1514 "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i, 1598 "RF-A Legacy to Ht40 Diff[%d] = 0x%x\n", i,
1515 rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]); 1599 rtlefuse->txpwr_legacyhtdiff[RF90_PATH_A][i]);
1516 for (i = 0; i < 14; i++) 1600 for (i = 0; i < 14; i++)
1517 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1601 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1518 "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i, 1602 "RF-B Ht20 to HT40 Diff[%d] = 0x%x\n", i,
1519 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]); 1603 rtlefuse->txpwr_ht20diff[RF90_PATH_B][i]);
1520 for (i = 0; i < 14; i++) 1604 for (i = 0; i < 14; i++)
1521 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1605 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1522 "RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i, 1606 "RF-B Legacy to HT40 Diff[%d] = 0x%x\n", i,
1523 rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]); 1607 rtlefuse->txpwr_legacyhtdiff[RF90_PATH_B][i]);
1524 1608
1525 if (!autoload_fail) 1609 if (!autoload_fail)
1526 rtlefuse->eeprom_regulatory = (hwinfo[RF_OPTION1] & 0x7); 1610 rtlefuse->eeprom_regulatory = (hwinfo[RF_OPTION1] & 0x7);
@@ -1533,10 +1617,11 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1533 rtlefuse->eeprom_tssi[RF90_PATH_A] = hwinfo[EEPROM_TSSI_A]; 1617 rtlefuse->eeprom_tssi[RF90_PATH_A] = hwinfo[EEPROM_TSSI_A];
1534 else 1618 else
1535 rtlefuse->eeprom_tssi[RF90_PATH_A] = EEPROM_DEFAULT_TSSI; 1619 rtlefuse->eeprom_tssi[RF90_PATH_A] = EEPROM_DEFAULT_TSSI;
1620
1536 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER, 1621 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1537 "TSSI_A = 0x%x, TSSI_B = 0x%x\n", 1622 "TSSI_A = 0x%x, TSSI_B = 0x%x\n",
1538 rtlefuse->eeprom_tssi[RF90_PATH_A], 1623 rtlefuse->eeprom_tssi[RF90_PATH_A],
1539 rtlefuse->eeprom_tssi[RF90_PATH_B]); 1624 rtlefuse->eeprom_tssi[RF90_PATH_B]);
1540 1625
1541 if (!autoload_fail) 1626 if (!autoload_fail)
1542 tempval = hwinfo[EEPROM_THERMAL_METER]; 1627 tempval = hwinfo[EEPROM_THERMAL_METER];
@@ -1552,8 +1637,8 @@ static void _rtl8723ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1552 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter); 1637 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
1553} 1638}
1554 1639
1555static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw, 1640static void _rtl8723e_read_adapter_info(struct ieee80211_hw *hw,
1556 bool pseudo_test) 1641 bool b_pseudo_test)
1557{ 1642{
1558 struct rtl_priv *rtlpriv = rtl_priv(hw); 1643 struct rtl_priv *rtlpriv = rtl_priv(hw);
1559 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1644 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
@@ -1562,7 +1647,7 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1562 u8 hwinfo[HWSET_MAX_SIZE]; 1647 u8 hwinfo[HWSET_MAX_SIZE];
1563 u16 eeprom_id; 1648 u16 eeprom_id;
1564 1649
1565 if (pseudo_test) { 1650 if (b_pseudo_test) {
1566 /* need add */ 1651 /* need add */
1567 return; 1652 return;
1568 } 1653 }
@@ -1576,7 +1661,7 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1576 "RTL819X Not boot from eeprom, check it !!"); 1661 "RTL819X Not boot from eeprom, check it !!");
1577 } 1662 }
1578 1663
1579 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, ("MAP\n"), 1664 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
1580 hwinfo, HWSET_MAX_SIZE); 1665 hwinfo, HWSET_MAX_SIZE);
1581 1666
1582 eeprom_id = *((u16 *)&hwinfo[0]); 1667 eeprom_id = *((u16 *)&hwinfo[0]);
@@ -1589,13 +1674,13 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1589 rtlefuse->autoload_failflag = false; 1674 rtlefuse->autoload_failflag = false;
1590 } 1675 }
1591 1676
1592 if (rtlefuse->autoload_failflag == true) 1677 if (rtlefuse->autoload_failflag)
1593 return; 1678 return;
1594 1679
1595 rtlefuse->eeprom_vid = *(u16 *) &hwinfo[EEPROM_VID]; 1680 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
1596 rtlefuse->eeprom_did = *(u16 *) &hwinfo[EEPROM_DID]; 1681 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
1597 rtlefuse->eeprom_svid = *(u16 *) &hwinfo[EEPROM_SVID]; 1682 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
1598 rtlefuse->eeprom_smid = *(u16 *) &hwinfo[EEPROM_SMID]; 1683 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
1599 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1684 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1600 "EEPROMId = 0x%4x\n", eeprom_id); 1685 "EEPROMId = 0x%4x\n", eeprom_id);
1601 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1686 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
@@ -1609,16 +1694,16 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1609 1694
1610 for (i = 0; i < 6; i += 2) { 1695 for (i = 0; i < 6; i += 2) {
1611 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i]; 1696 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
1612 *((u16 *) (&rtlefuse->dev_addr[i])) = usvalue; 1697 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
1613 } 1698 }
1614 1699
1615 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 1700 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1616 "dev_addr: %pM\n", rtlefuse->dev_addr); 1701 "dev_addr: %pM\n", rtlefuse->dev_addr);
1617 1702
1618 _rtl8723ae_read_txpower_info_from_hwpg(hw, 1703 _rtl8723e_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
1619 rtlefuse->autoload_failflag, hwinfo); 1704 hwinfo);
1620 1705
1621 rtl8723ae_read_bt_coexist_info_from_hwpg(hw, 1706 rtl8723e_read_bt_coexist_info_from_hwpg(hw,
1622 rtlefuse->autoload_failflag, hwinfo); 1707 rtlefuse->autoload_failflag, hwinfo);
1623 1708
1624 rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN]; 1709 rtlefuse->eeprom_channelplan = hwinfo[EEPROM_CHANNELPLAN];
@@ -1644,6 +1729,14 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1644 CHK_SVID_SMID(0x10EC, 0x6178) || 1729 CHK_SVID_SMID(0x10EC, 0x6178) ||
1645 CHK_SVID_SMID(0x10EC, 0x6179) || 1730 CHK_SVID_SMID(0x10EC, 0x6179) ||
1646 CHK_SVID_SMID(0x10EC, 0x6180) || 1731 CHK_SVID_SMID(0x10EC, 0x6180) ||
1732 CHK_SVID_SMID(0x10EC, 0x7151) ||
1733 CHK_SVID_SMID(0x10EC, 0x7152) ||
1734 CHK_SVID_SMID(0x10EC, 0x7154) ||
1735 CHK_SVID_SMID(0x10EC, 0x7155) ||
1736 CHK_SVID_SMID(0x10EC, 0x7177) ||
1737 CHK_SVID_SMID(0x10EC, 0x7178) ||
1738 CHK_SVID_SMID(0x10EC, 0x7179) ||
1739 CHK_SVID_SMID(0x10EC, 0x7180) ||
1647 CHK_SVID_SMID(0x10EC, 0x8151) || 1740 CHK_SVID_SMID(0x10EC, 0x8151) ||
1648 CHK_SVID_SMID(0x10EC, 0x8152) || 1741 CHK_SVID_SMID(0x10EC, 0x8152) ||
1649 CHK_SVID_SMID(0x10EC, 0x8154) || 1742 CHK_SVID_SMID(0x10EC, 0x8154) ||
@@ -1671,7 +1764,10 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1671 CHK_SVID_SMID(0x10EC, 0x7193) || 1764 CHK_SVID_SMID(0x10EC, 0x7193) ||
1672 CHK_SVID_SMID(0x10EC, 0x8191) || 1765 CHK_SVID_SMID(0x10EC, 0x8191) ||
1673 CHK_SVID_SMID(0x10EC, 0x8192) || 1766 CHK_SVID_SMID(0x10EC, 0x8192) ||
1674 CHK_SVID_SMID(0x10EC, 0x8193)) 1767 CHK_SVID_SMID(0x10EC, 0x8193) ||
1768 CHK_SVID_SMID(0x10EC, 0x9191) ||
1769 CHK_SVID_SMID(0x10EC, 0x9192) ||
1770 CHK_SVID_SMID(0x10EC, 0x9193))
1675 rtlhal->oem_id = RT_CID_819X_SAMSUNG; 1771 rtlhal->oem_id = RT_CID_819X_SAMSUNG;
1676 else if (CHK_SVID_SMID(0x10EC, 0x8195) || 1772 else if (CHK_SVID_SMID(0x10EC, 0x8195) ||
1677 CHK_SVID_SMID(0x10EC, 0x9195) || 1773 CHK_SVID_SMID(0x10EC, 0x9195) ||
@@ -1728,7 +1824,7 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1728 else 1824 else
1729 rtlhal->oem_id = RT_CID_DEFAULT; 1825 rtlhal->oem_id = RT_CID_DEFAULT;
1730 } else { 1826 } else {
1731 rtlhal->oem_id = RT_CID_DEFAULT; 1827 rtlhal->oem_id = RT_CID_DEFAULT;
1732 } 1828 }
1733 break; 1829 break;
1734 case EEPROM_CID_TOSHIBA: 1830 case EEPROM_CID_TOSHIBA:
@@ -1750,18 +1846,31 @@ static void _rtl8723ae_read_adapter_info(struct ieee80211_hw *hw,
1750 } 1846 }
1751} 1847}
1752 1848
1753static void _rtl8723ae_hal_customized_behavior(struct ieee80211_hw *hw) 1849static void _rtl8723e_hal_customized_behavior(struct ieee80211_hw *hw)
1754{ 1850{
1755 struct rtl_priv *rtlpriv = rtl_priv(hw); 1851 struct rtl_priv *rtlpriv = rtl_priv(hw);
1756 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 1852 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
1757 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1853 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1758 1854
1759 pcipriv->ledctl.led_opendrain = true; 1855 pcipriv->ledctl.led_opendrain = true;
1856 switch (rtlhal->oem_id) {
1857 case RT_CID_819X_HP:
1858 pcipriv->ledctl.led_opendrain = true;
1859 break;
1860 case RT_CID_819X_LENOVO:
1861 case RT_CID_DEFAULT:
1862 case RT_CID_TOSHIBA:
1863 case RT_CID_CCX:
1864 case RT_CID_819X_ACER:
1865 case RT_CID_WHQL:
1866 default:
1867 break;
1868 }
1760 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 1869 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1761 "RT Customized ID: 0x%02X\n", rtlhal->oem_id); 1870 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
1762} 1871}
1763 1872
1764void rtl8723ae_read_eeprom_info(struct ieee80211_hw *hw) 1873void rtl8723e_read_eeprom_info(struct ieee80211_hw *hw)
1765{ 1874{
1766 struct rtl_priv *rtlpriv = rtl_priv(hw); 1875 struct rtl_priv *rtlpriv = rtl_priv(hw);
1767 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1876 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
@@ -1774,7 +1883,7 @@ void rtl8723ae_read_eeprom_info(struct ieee80211_hw *hw)
1774 value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0); 1883 value32 = (value32 & ~EFUSE_SEL_MASK) | EFUSE_SEL(EFUSE_WIFI_SEL_0);
1775 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[EFUSE_TEST], value32); 1884 rtl_write_dword(rtlpriv, rtlpriv->cfg->maps[EFUSE_TEST], value32);
1776 1885
1777 rtlhal->version = _rtl8723ae_read_chip_version(hw); 1886 rtlhal->version = _rtl8723e_read_chip_version(hw);
1778 1887
1779 if (get_rf_type(rtlphy) == RF_1T1R) 1888 if (get_rf_type(rtlphy) == RF_1T1R)
1780 rtlpriv->dm.rfpath_rxenable[0] = true; 1889 rtlpriv->dm.rfpath_rxenable[0] = true;
@@ -1782,7 +1891,7 @@ void rtl8723ae_read_eeprom_info(struct ieee80211_hw *hw)
1782 rtlpriv->dm.rfpath_rxenable[0] = 1891 rtlpriv->dm.rfpath_rxenable[0] =
1783 rtlpriv->dm.rfpath_rxenable[1] = true; 1892 rtlpriv->dm.rfpath_rxenable[1] = true;
1784 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n", 1893 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
1785 rtlhal->version); 1894 rtlhal->version);
1786 1895
1787 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR); 1896 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
1788 if (tmp_u1b & BIT(4)) { 1897 if (tmp_u1b & BIT(4)) {
@@ -1795,33 +1904,34 @@ void rtl8723ae_read_eeprom_info(struct ieee80211_hw *hw)
1795 if (tmp_u1b & BIT(5)) { 1904 if (tmp_u1b & BIT(5)) {
1796 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n"); 1905 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
1797 rtlefuse->autoload_failflag = false; 1906 rtlefuse->autoload_failflag = false;
1798 _rtl8723ae_read_adapter_info(hw, false); 1907 _rtl8723e_read_adapter_info(hw, false);
1799 } else { 1908 } else {
1800 rtlefuse->autoload_failflag = true; 1909 rtlefuse->autoload_failflag = true;
1801 _rtl8723ae_read_adapter_info(hw, false); 1910 _rtl8723e_read_adapter_info(hw, false);
1802 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n"); 1911 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
1803 } 1912 }
1804 _rtl8723ae_hal_customized_behavior(hw); 1913 _rtl8723e_hal_customized_behavior(hw);
1805} 1914}
1806 1915
1807static void rtl8723ae_update_hal_rate_table(struct ieee80211_hw *hw, 1916static void rtl8723e_update_hal_rate_table(struct ieee80211_hw *hw,
1808 struct ieee80211_sta *sta) 1917 struct ieee80211_sta *sta)
1809{ 1918{
1810 struct rtl_priv *rtlpriv = rtl_priv(hw); 1919 struct rtl_priv *rtlpriv = rtl_priv(hw);
1811 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
1812 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1920 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1813 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1921 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1814 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1922 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1815 u32 ratr_value; 1923 u32 ratr_value;
1816 u8 ratr_index = 0; 1924 u8 ratr_index = 0;
1817 u8 nmode = mac->ht_enable; 1925 u8 b_nmode = mac->ht_enable;
1818 u8 mimo_ps = IEEE80211_SMPS_OFF; 1926 u16 shortgi_rate;
1927 u32 tmp_ratr_value;
1819 u8 curtxbw_40mhz = mac->bw_40; 1928 u8 curtxbw_40mhz = mac->bw_40;
1820 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? 1929 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
1821 1 : 0; 1930 1 : 0;
1822 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 1931 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
1823 1 : 0; 1932 1 : 0;
1824 enum wireless_mode wirelessmode = mac->mode; 1933 enum wireless_mode wirelessmode = mac->mode;
1934 u32 ratr_mask;
1825 1935
1826 if (rtlhal->current_bandtype == BAND_ON_5G) 1936 if (rtlhal->current_bandtype == BAND_ON_5G)
1827 ratr_value = sta->supp_rates[1] << 4; 1937 ratr_value = sta->supp_rates[1] << 4;
@@ -1830,7 +1940,7 @@ static void rtl8723ae_update_hal_rate_table(struct ieee80211_hw *hw,
1830 if (mac->opmode == NL80211_IFTYPE_ADHOC) 1940 if (mac->opmode == NL80211_IFTYPE_ADHOC)
1831 ratr_value = 0xfff; 1941 ratr_value = 0xfff;
1832 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 | 1942 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
1833 sta->ht_cap.mcs.rx_mask[0] << 12); 1943 sta->ht_cap.mcs.rx_mask[0] << 12);
1834 switch (wirelessmode) { 1944 switch (wirelessmode) {
1835 case WIRELESS_MODE_B: 1945 case WIRELESS_MODE_B:
1836 if (ratr_value & 0x0000000c) 1946 if (ratr_value & 0x0000000c)
@@ -1843,20 +1953,14 @@ static void rtl8723ae_update_hal_rate_table(struct ieee80211_hw *hw,
1843 break; 1953 break;
1844 case WIRELESS_MODE_N_24G: 1954 case WIRELESS_MODE_N_24G:
1845 case WIRELESS_MODE_N_5G: 1955 case WIRELESS_MODE_N_5G:
1846 nmode = 1; 1956 b_nmode = 1;
1847 if (mimo_ps == IEEE80211_SMPS_STATIC) { 1957 if (get_rf_type(rtlphy) == RF_1T2R ||
1848 ratr_value &= 0x0007F005; 1958 get_rf_type(rtlphy) == RF_1T1R)
1849 } else { 1959 ratr_mask = 0x000ff005;
1850 u32 ratr_mask; 1960 else
1851 1961 ratr_mask = 0x0f0ff005;
1852 if (get_rf_type(rtlphy) == RF_1T2R ||
1853 get_rf_type(rtlphy) == RF_1T1R)
1854 ratr_mask = 0x000ff005;
1855 else
1856 ratr_mask = 0x0f0ff005;
1857 1962
1858 ratr_value &= ratr_mask; 1963 ratr_value &= ratr_mask;
1859 }
1860 break; 1964 break;
1861 default: 1965 default:
1862 if (rtlphy->rf_type == RF_1T2R) 1966 if (rtlphy->rf_type == RF_1T2R)
@@ -1867,19 +1971,30 @@ static void rtl8723ae_update_hal_rate_table(struct ieee80211_hw *hw,
1867 break; 1971 break;
1868 } 1972 }
1869 1973
1870 if ((pcipriv->bt_coexist.bt_coexistence) && 1974 if ((rtlpriv->btcoexist.bt_coexistence) &&
1871 (pcipriv->bt_coexist.bt_coexist_type == BT_CSR_BC4) && 1975 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
1872 (pcipriv->bt_coexist.bt_cur_state) && 1976 (rtlpriv->btcoexist.bt_cur_state) &&
1873 (pcipriv->bt_coexist.bt_ant_isolation) && 1977 (rtlpriv->btcoexist.bt_ant_isolation) &&
1874 ((pcipriv->bt_coexist.bt_service == BT_SCO) || 1978 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
1875 (pcipriv->bt_coexist.bt_service == BT_BUSY))) 1979 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
1876 ratr_value &= 0x0fffcfc0; 1980 ratr_value &= 0x0fffcfc0;
1877 else 1981 else
1878 ratr_value &= 0x0FFFFFFF; 1982 ratr_value &= 0x0FFFFFFF;
1879 1983
1880 if (nmode && ((curtxbw_40mhz && curshortgi_40mhz) || 1984 if (b_nmode &&
1881 (!curtxbw_40mhz && curshortgi_20mhz))) 1985 ((curtxbw_40mhz && curshortgi_40mhz) ||
1986 (!curtxbw_40mhz && curshortgi_20mhz))) {
1882 ratr_value |= 0x10000000; 1987 ratr_value |= 0x10000000;
1988 tmp_ratr_value = (ratr_value >> 12);
1989
1990 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
1991 if ((1 << shortgi_rate) & tmp_ratr_value)
1992 break;
1993 }
1994
1995 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
1996 (shortgi_rate << 4) | (shortgi_rate);
1997 }
1883 1998
1884 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value); 1999 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
1885 2000
@@ -1887,8 +2002,9 @@ static void rtl8723ae_update_hal_rate_table(struct ieee80211_hw *hw,
1887 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0)); 2002 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
1888} 2003}
1889 2004
1890static void rtl8723ae_update_hal_rate_mask(struct ieee80211_hw *hw, 2005static void rtl8723e_update_hal_rate_mask(struct ieee80211_hw *hw,
1891 struct ieee80211_sta *sta, u8 rssi_level) 2006 struct ieee80211_sta *sta,
2007 u8 rssi_level)
1892{ 2008{
1893 struct rtl_priv *rtlpriv = rtl_priv(hw); 2009 struct rtl_priv *rtlpriv = rtl_priv(hw);
1894 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2010 struct rtl_phy *rtlphy = &(rtlpriv->phy);
@@ -1897,7 +2013,8 @@ static void rtl8723ae_update_hal_rate_mask(struct ieee80211_hw *hw,
1897 struct rtl_sta_info *sta_entry = NULL; 2013 struct rtl_sta_info *sta_entry = NULL;
1898 u32 ratr_bitmap; 2014 u32 ratr_bitmap;
1899 u8 ratr_index; 2015 u8 ratr_index;
1900 u8 curtxbw_40mhz = (sta->bandwidth >= IEEE80211_STA_RX_BW_40) ? 1 : 0; 2016 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
2017 ? 1 : 0;
1901 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? 2018 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
1902 1 : 0; 2019 1 : 0;
1903 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 2020 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
@@ -1906,9 +2023,9 @@ static void rtl8723ae_update_hal_rate_mask(struct ieee80211_hw *hw,
1906 bool shortgi = false; 2023 bool shortgi = false;
1907 u8 rate_mask[5]; 2024 u8 rate_mask[5];
1908 u8 macid = 0; 2025 u8 macid = 0;
1909 u8 mimo_ps = IEEE80211_SMPS_OFF; 2026 /*u8 mimo_ps = IEEE80211_SMPS_OFF;*/
1910 2027
1911 sta_entry = (struct rtl_sta_info *) sta->drv_priv; 2028 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
1912 wirelessmode = sta_entry->wireless_mode; 2029 wirelessmode = sta_entry->wireless_mode;
1913 if (mac->opmode == NL80211_IFTYPE_STATION) 2030 if (mac->opmode == NL80211_IFTYPE_STATION)
1914 curtxbw_40mhz = mac->bw_40; 2031 curtxbw_40mhz = mac->bw_40;
@@ -1943,54 +2060,44 @@ static void rtl8723ae_update_hal_rate_mask(struct ieee80211_hw *hw,
1943 ratr_bitmap &= 0x00000ff5; 2060 ratr_bitmap &= 0x00000ff5;
1944 break; 2061 break;
1945 case WIRELESS_MODE_A: 2062 case WIRELESS_MODE_A:
1946 ratr_index = RATR_INX_WIRELESS_A; 2063 ratr_index = RATR_INX_WIRELESS_G;
1947 ratr_bitmap &= 0x00000ff0; 2064 ratr_bitmap &= 0x00000ff0;
1948 break; 2065 break;
1949 case WIRELESS_MODE_N_24G: 2066 case WIRELESS_MODE_N_24G:
1950 case WIRELESS_MODE_N_5G: 2067 case WIRELESS_MODE_N_5G:
1951 ratr_index = RATR_INX_WIRELESS_NGB; 2068 ratr_index = RATR_INX_WIRELESS_NGB;
1952 2069 if (rtlphy->rf_type == RF_1T2R ||
1953 if (mimo_ps == IEEE80211_SMPS_STATIC) { 2070 rtlphy->rf_type == RF_1T1R) {
1954 if (rssi_level == 1) 2071 if (curtxbw_40mhz) {
1955 ratr_bitmap &= 0x00070000; 2072 if (rssi_level == 1)
1956 else if (rssi_level == 2) 2073 ratr_bitmap &= 0x000f0000;
1957 ratr_bitmap &= 0x0007f000; 2074 else if (rssi_level == 2)
1958 else 2075 ratr_bitmap &= 0x000ff000;
1959 ratr_bitmap &= 0x0007f005; 2076 else
2077 ratr_bitmap &= 0x000ff015;
2078 } else {
2079 if (rssi_level == 1)
2080 ratr_bitmap &= 0x000f0000;
2081 else if (rssi_level == 2)
2082 ratr_bitmap &= 0x000ff000;
2083 else
2084 ratr_bitmap &= 0x000ff005;
2085 }
1960 } else { 2086 } else {
1961 if (rtlphy->rf_type == RF_1T2R || 2087 if (curtxbw_40mhz) {
1962 rtlphy->rf_type == RF_1T1R) { 2088 if (rssi_level == 1)
1963 if (curtxbw_40mhz) { 2089 ratr_bitmap &= 0x0f0f0000;
1964 if (rssi_level == 1) 2090 else if (rssi_level == 2)
1965 ratr_bitmap &= 0x000f0000; 2091 ratr_bitmap &= 0x0f0ff000;
1966 else if (rssi_level == 2) 2092 else
1967 ratr_bitmap &= 0x000ff000; 2093 ratr_bitmap &= 0x0f0ff015;
1968 else
1969 ratr_bitmap &= 0x000ff015;
1970 } else {
1971 if (rssi_level == 1)
1972 ratr_bitmap &= 0x000f0000;
1973 else if (rssi_level == 2)
1974 ratr_bitmap &= 0x000ff000;
1975 else
1976 ratr_bitmap &= 0x000ff005;
1977 }
1978 } else { 2094 } else {
1979 if (curtxbw_40mhz) { 2095 if (rssi_level == 1)
1980 if (rssi_level == 1) 2096 ratr_bitmap &= 0x0f0f0000;
1981 ratr_bitmap &= 0x0f0f0000; 2097 else if (rssi_level == 2)
1982 else if (rssi_level == 2) 2098 ratr_bitmap &= 0x0f0ff000;
1983 ratr_bitmap &= 0x0f0ff000; 2099 else
1984 else 2100 ratr_bitmap &= 0x0f0ff005;
1985 ratr_bitmap &= 0x0f0ff015;
1986 } else {
1987 if (rssi_level == 1)
1988 ratr_bitmap &= 0x0f0f0000;
1989 else if (rssi_level == 2)
1990 ratr_bitmap &= 0x0f0ff000;
1991 else
1992 ratr_bitmap &= 0x0f0ff005;
1993 }
1994 } 2101 }
1995 } 2102 }
1996 2103
@@ -2015,30 +2122,30 @@ static void rtl8723ae_update_hal_rate_mask(struct ieee80211_hw *hw,
2015 2122
2016 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, 2123 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2017 "ratr_bitmap :%x\n", ratr_bitmap); 2124 "ratr_bitmap :%x\n", ratr_bitmap);
2018 /* convert ratr_bitmap to le byte array */ 2125 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2019 rate_mask[0] = ratr_bitmap; 2126 (ratr_index << 28);
2020 rate_mask[1] = (ratr_bitmap >>= 8);
2021 rate_mask[2] = (ratr_bitmap >>= 8);
2022 rate_mask[3] = ((ratr_bitmap >> 8) & 0x0f) | (ratr_index << 4);
2023 rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80; 2127 rate_mask[4] = macid | (shortgi ? 0x20 : 0x00) | 0x80;
2024 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, 2128 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2025 "Rate_index:%x, ratr_bitmap: %*phC\n", 2129 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x\n",
2026 ratr_index, 5, rate_mask); 2130 ratr_index, ratr_bitmap,
2027 rtl8723ae_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask); 2131 rate_mask[0], rate_mask[1],
2132 rate_mask[2], rate_mask[3],
2133 rate_mask[4]);
2134 rtl8723e_fill_h2c_cmd(hw, H2C_RA_MASK, 5, rate_mask);
2028} 2135}
2029 2136
2030void rtl8723ae_update_hal_rate_tbl(struct ieee80211_hw *hw, 2137void rtl8723e_update_hal_rate_tbl(struct ieee80211_hw *hw,
2031 struct ieee80211_sta *sta, u8 rssi_level) 2138 struct ieee80211_sta *sta, u8 rssi_level)
2032{ 2139{
2033 struct rtl_priv *rtlpriv = rtl_priv(hw); 2140 struct rtl_priv *rtlpriv = rtl_priv(hw);
2034 2141
2035 if (rtlpriv->dm.useramask) 2142 if (rtlpriv->dm.useramask)
2036 rtl8723ae_update_hal_rate_mask(hw, sta, rssi_level); 2143 rtl8723e_update_hal_rate_mask(hw, sta, rssi_level);
2037 else 2144 else
2038 rtl8723ae_update_hal_rate_table(hw, sta); 2145 rtl8723e_update_hal_rate_table(hw, sta);
2039} 2146}
2040 2147
2041void rtl8723ae_update_channel_access_setting(struct ieee80211_hw *hw) 2148void rtl8723e_update_channel_access_setting(struct ieee80211_hw *hw)
2042{ 2149{
2043 struct rtl_priv *rtlpriv = rtl_priv(hw); 2150 struct rtl_priv *rtlpriv = rtl_priv(hw);
2044 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2151 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -2052,14 +2159,14 @@ void rtl8723ae_update_channel_access_setting(struct ieee80211_hw *hw)
2052 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer); 2159 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
2053} 2160}
2054 2161
2055bool rtl8723ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid) 2162bool rtl8723e_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2056{ 2163{
2057 struct rtl_priv *rtlpriv = rtl_priv(hw); 2164 struct rtl_priv *rtlpriv = rtl_priv(hw);
2058 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 2165 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2059 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2166 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2060 enum rf_pwrstate e_rfpowerstate_toset; 2167 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
2061 u8 u1tmp; 2168 u8 u1tmp;
2062 bool actuallyset = false; 2169 bool b_actuallyset = false;
2063 2170
2064 if (rtlpriv->rtlhal.being_init_adapter) 2171 if (rtlpriv->rtlhal.being_init_adapter)
2065 return false; 2172 return false;
@@ -2076,6 +2183,8 @@ bool rtl8723ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2076 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2183 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2077 } 2184 }
2078 2185
2186 cur_rfstate = ppsc->rfpwr_state;
2187
2079 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2, 2188 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
2080 rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2)&~(BIT(1))); 2189 rtl_read_byte(rtlpriv, REG_GPIO_IO_SEL_2)&~(BIT(1)));
2081 2190
@@ -2086,24 +2195,23 @@ bool rtl8723ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2086 else 2195 else
2087 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF; 2196 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
2088 2197
2089 if ((ppsc->hwradiooff == true) && (e_rfpowerstate_toset == ERFON)) { 2198 if (ppsc->hwradiooff && (e_rfpowerstate_toset == ERFON)) {
2090 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2199 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2091 "GPIOChangeRF - HW Radio ON, RF ON\n"); 2200 "GPIOChangeRF - HW Radio ON, RF ON\n");
2092 2201
2093 e_rfpowerstate_toset = ERFON; 2202 e_rfpowerstate_toset = ERFON;
2094 ppsc->hwradiooff = false; 2203 ppsc->hwradiooff = false;
2095 actuallyset = true; 2204 b_actuallyset = true;
2096 } else if ((ppsc->hwradiooff == false) 2205 } else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
2097 && (e_rfpowerstate_toset == ERFOFF)) {
2098 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2206 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2099 "GPIOChangeRF - HW Radio OFF, RF OFF\n"); 2207 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
2100 2208
2101 e_rfpowerstate_toset = ERFOFF; 2209 e_rfpowerstate_toset = ERFOFF;
2102 ppsc->hwradiooff = true; 2210 ppsc->hwradiooff = true;
2103 actuallyset = true; 2211 b_actuallyset = true;
2104 } 2212 }
2105 2213
2106 if (actuallyset) { 2214 if (b_actuallyset) {
2107 spin_lock(&rtlpriv->locks.rf_ps_lock); 2215 spin_lock(&rtlpriv->locks.rf_ps_lock);
2108 ppsc->rfchange_inprogress = false; 2216 ppsc->rfchange_inprogress = false;
2109 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2217 spin_unlock(&rtlpriv->locks.rf_ps_lock);
@@ -2118,11 +2226,12 @@ bool rtl8723ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2118 2226
2119 *valid = 1; 2227 *valid = 1;
2120 return !ppsc->hwradiooff; 2228 return !ppsc->hwradiooff;
2229
2121} 2230}
2122 2231
2123void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index, 2232void rtl8723e_set_key(struct ieee80211_hw *hw, u32 key_index,
2124 u8 *p_macaddr, bool is_group, u8 enc_algo, 2233 u8 *p_macaddr, bool is_group, u8 enc_algo,
2125 bool is_wepkey, bool clear_all) 2234 bool is_wepkey, bool clear_all)
2126{ 2235{
2127 struct rtl_priv *rtlpriv = rtl_priv(hw); 2236 struct rtl_priv *rtlpriv = rtl_priv(hw);
2128 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 2237 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -2130,6 +2239,7 @@ void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index,
2130 u8 *macaddr = p_macaddr; 2239 u8 *macaddr = p_macaddr;
2131 u32 entry_id = 0; 2240 u32 entry_id = 0;
2132 bool is_pairwise = false; 2241 bool is_pairwise = false;
2242
2133 static u8 cam_const_addr[4][6] = { 2243 static u8 cam_const_addr[4][6] = {
2134 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, 2244 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
2135 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01}, 2245 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
@@ -2157,6 +2267,7 @@ void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index,
2157 rtlpriv->sec.key_len[idx] = 0; 2267 rtlpriv->sec.key_len[idx] = 0;
2158 } 2268 }
2159 } 2269 }
2270
2160 } else { 2271 } else {
2161 switch (enc_algo) { 2272 switch (enc_algo) {
2162 case WEP40_ENCRYPTION: 2273 case WEP40_ENCRYPTION:
@@ -2172,8 +2283,8 @@ void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index,
2172 enc_algo = CAM_AES; 2283 enc_algo = CAM_AES;
2173 break; 2284 break;
2174 default: 2285 default:
2175 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2286 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2176 "switch case not processed\n"); 2287 "switch case not process\n");
2177 enc_algo = CAM_TKIP; 2288 enc_algo = CAM_TKIP;
2178 break; 2289 break;
2179 } 2290 }
@@ -2187,8 +2298,8 @@ void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index,
2187 entry_id = key_index; 2298 entry_id = key_index;
2188 } else { 2299 } else {
2189 if (mac->opmode == NL80211_IFTYPE_AP) { 2300 if (mac->opmode == NL80211_IFTYPE_AP) {
2190 entry_id = rtl_cam_get_free_entry(hw, 2301 entry_id =
2191 macaddr); 2302 rtl_cam_get_free_entry(hw, p_macaddr);
2192 if (entry_id >= TOTAL_CAM_ENTRY) { 2303 if (entry_id >= TOTAL_CAM_ENTRY) {
2193 RT_TRACE(rtlpriv, COMP_SEC, 2304 RT_TRACE(rtlpriv, COMP_SEC,
2194 DBG_EMERG, 2305 DBG_EMERG,
@@ -2219,22 +2330,22 @@ void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index,
2219 "set Pairwiase key\n"); 2330 "set Pairwiase key\n");
2220 2331
2221 rtl_cam_add_one_entry(hw, macaddr, key_index, 2332 rtl_cam_add_one_entry(hw, macaddr, key_index,
2222 entry_id, enc_algo, 2333 entry_id, enc_algo,
2223 CAM_CONFIG_NO_USEDK, 2334 CAM_CONFIG_NO_USEDK,
2224 rtlpriv->sec.key_buf[key_index]); 2335 rtlpriv->sec.key_buf[key_index]);
2225 } else { 2336 } else {
2226 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 2337 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2227 "set group key\n"); 2338 "set group key\n");
2228 2339
2229 if (mac->opmode == NL80211_IFTYPE_ADHOC) { 2340 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
2230 rtl_cam_add_one_entry(hw, 2341 rtl_cam_add_one_entry(hw,
2231 rtlefuse->dev_addr, 2342 rtlefuse->dev_addr,
2232 PAIRWISE_KEYIDX, 2343 PAIRWISE_KEYIDX,
2233 CAM_PAIRWISE_KEY_POSITION, 2344 CAM_PAIRWISE_KEY_POSITION,
2234 enc_algo, 2345 enc_algo,
2235 CAM_CONFIG_NO_USEDK, 2346 CAM_CONFIG_NO_USEDK,
2236 rtlpriv->sec.key_buf 2347 rtlpriv->sec.key_buf
2237 [entry_id]); 2348 [entry_id]);
2238 } 2349 }
2239 2350
2240 rtl_cam_add_one_entry(hw, macaddr, key_index, 2351 rtl_cam_add_one_entry(hw, macaddr, key_index,
@@ -2247,45 +2358,43 @@ void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index,
2247 } 2358 }
2248} 2359}
2249 2360
2250static void rtl8723ae_bt_var_init(struct ieee80211_hw *hw) 2361static void rtl8723e_bt_var_init(struct ieee80211_hw *hw)
2251{ 2362{
2252 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2253 struct rtl_priv *rtlpriv = rtl_priv(hw); 2363 struct rtl_priv *rtlpriv = rtl_priv(hw);
2254 2364
2255 pcipriv->bt_coexist.bt_coexistence = 2365 rtlpriv->btcoexist.bt_coexistence =
2256 pcipriv->bt_coexist.eeprom_bt_coexist; 2366 rtlpriv->btcoexist.eeprom_bt_coexist;
2257 pcipriv->bt_coexist.bt_ant_num = 2367 rtlpriv->btcoexist.bt_ant_num =
2258 pcipriv->bt_coexist.eeprom_bt_ant_num; 2368 rtlpriv->btcoexist.eeprom_bt_ant_num;
2259 pcipriv->bt_coexist.bt_coexist_type = 2369 rtlpriv->btcoexist.bt_coexist_type =
2260 pcipriv->bt_coexist.eeprom_bt_type; 2370 rtlpriv->btcoexist.eeprom_bt_type;
2261 2371
2262 pcipriv->bt_coexist.bt_ant_isolation = 2372 rtlpriv->btcoexist.bt_ant_isolation =
2263 pcipriv->bt_coexist.eeprom_bt_ant_isol; 2373 rtlpriv->btcoexist.eeprom_bt_ant_isol;
2264 2374
2265 pcipriv->bt_coexist.bt_radio_shared_type = 2375 rtlpriv->btcoexist.bt_radio_shared_type =
2266 pcipriv->bt_coexist.eeprom_bt_radio_shared; 2376 rtlpriv->btcoexist.eeprom_bt_radio_shared;
2267 2377
2268 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 2378 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
2269 "BT Coexistance = 0x%x\n", 2379 "BT Coexistance = 0x%x\n",
2270 pcipriv->bt_coexist.bt_coexistence); 2380 rtlpriv->btcoexist.bt_coexistence);
2271 2381
2272 if (pcipriv->bt_coexist.bt_coexistence) { 2382 if (rtlpriv->btcoexist.bt_coexistence) {
2273 pcipriv->bt_coexist.bt_busy_traffic = false; 2383 rtlpriv->btcoexist.bt_busy_traffic = false;
2274 pcipriv->bt_coexist.bt_traffic_mode_set = false; 2384 rtlpriv->btcoexist.bt_traffic_mode_set = false;
2275 pcipriv->bt_coexist.bt_non_traffic_mode_set = false; 2385 rtlpriv->btcoexist.bt_non_traffic_mode_set = false;
2276 2386
2277 pcipriv->bt_coexist.cstate = 0; 2387 rtlpriv->btcoexist.cstate = 0;
2278 pcipriv->bt_coexist.previous_state = 0; 2388 rtlpriv->btcoexist.previous_state = 0;
2279 2389
2280 if (pcipriv->bt_coexist.bt_ant_num == ANT_X2) { 2390 if (rtlpriv->btcoexist.bt_ant_num == ANT_X2) {
2281 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 2391 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
2282 "BlueTooth BT_Ant_Num = Antx2\n"); 2392 "BlueTooth BT_Ant_Num = Antx2\n");
2283 } else if (pcipriv->bt_coexist.bt_ant_num == ANT_X1) { 2393 } else if (rtlpriv->btcoexist.bt_ant_num == ANT_X1) {
2284 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 2394 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
2285 "BlueTooth BT_Ant_Num = Antx1\n"); 2395 "BlueTooth BT_Ant_Num = Antx1\n");
2286 } 2396 }
2287 2397 switch (rtlpriv->btcoexist.bt_coexist_type) {
2288 switch (pcipriv->bt_coexist.bt_coexist_type) {
2289 case BT_2WIRE: 2398 case BT_2WIRE:
2290 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 2399 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
2291 "BlueTooth BT_CoexistType = BT_2Wire\n"); 2400 "BlueTooth BT_CoexistType = BT_2Wire\n");
@@ -2317,20 +2426,19 @@ static void rtl8723ae_bt_var_init(struct ieee80211_hw *hw)
2317 } 2426 }
2318 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 2427 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
2319 "BlueTooth BT_Ant_isolation = %d\n", 2428 "BlueTooth BT_Ant_isolation = %d\n",
2320 pcipriv->bt_coexist.bt_ant_isolation); 2429 rtlpriv->btcoexist.bt_ant_isolation);
2321 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE, 2430 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_TRACE,
2322 "BT_RadioSharedType = 0x%x\n", 2431 "BT_RadioSharedType = 0x%x\n",
2323 pcipriv->bt_coexist.bt_radio_shared_type); 2432 rtlpriv->btcoexist.bt_radio_shared_type);
2324 pcipriv->bt_coexist.bt_active_zero_cnt = 0; 2433 rtlpriv->btcoexist.bt_active_zero_cnt = 0;
2325 pcipriv->bt_coexist.cur_bt_disabled = false; 2434 rtlpriv->btcoexist.cur_bt_disabled = false;
2326 pcipriv->bt_coexist.pre_bt_disabled = false; 2435 rtlpriv->btcoexist.pre_bt_disabled = false;
2327 } 2436 }
2328} 2437}
2329 2438
2330void rtl8723ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw, 2439void rtl8723e_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2331 bool auto_load_fail, u8 *hwinfo) 2440 bool auto_load_fail, u8 *hwinfo)
2332{ 2441{
2333 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
2334 struct rtl_priv *rtlpriv = rtl_priv(hw); 2442 struct rtl_priv *rtlpriv = rtl_priv(hw);
2335 u8 value; 2443 u8 value;
2336 u32 tmpu_32; 2444 u32 tmpu_32;
@@ -2338,47 +2446,50 @@ void rtl8723ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2338 if (!auto_load_fail) { 2446 if (!auto_load_fail) {
2339 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL); 2447 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2340 if (tmpu_32 & BIT(18)) 2448 if (tmpu_32 & BIT(18))
2341 pcipriv->bt_coexist.eeprom_bt_coexist = 1; 2449 rtlpriv->btcoexist.eeprom_bt_coexist = 1;
2342 else 2450 else
2343 pcipriv->bt_coexist.eeprom_bt_coexist = 0; 2451 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2344 value = hwinfo[RF_OPTION4]; 2452 value = hwinfo[RF_OPTION4];
2345 pcipriv->bt_coexist.eeprom_bt_type = BT_RTL8723A; 2453 rtlpriv->btcoexist.eeprom_bt_type = BT_RTL8723A;
2346 pcipriv->bt_coexist.eeprom_bt_ant_num = (value & 0x1); 2454 rtlpriv->btcoexist.eeprom_bt_ant_num = (value & 0x1);
2347 pcipriv->bt_coexist.eeprom_bt_ant_isol = ((value & 0x10) >> 4); 2455 rtlpriv->btcoexist.eeprom_bt_ant_isol = ((value & 0x10) >> 4);
2348 pcipriv->bt_coexist.eeprom_bt_radio_shared = 2456 rtlpriv->btcoexist.eeprom_bt_radio_shared =
2349 ((value & 0x20) >> 5); 2457 ((value & 0x20) >> 5);
2350 } else { 2458 } else {
2351 pcipriv->bt_coexist.eeprom_bt_coexist = 0; 2459 rtlpriv->btcoexist.eeprom_bt_coexist = 0;
2352 pcipriv->bt_coexist.eeprom_bt_type = BT_RTL8723A; 2460 rtlpriv->btcoexist.eeprom_bt_type = BT_RTL8723A;
2353 pcipriv->bt_coexist.eeprom_bt_ant_num = ANT_X2; 2461 rtlpriv->btcoexist.eeprom_bt_ant_num = ANT_X2;
2354 pcipriv->bt_coexist.eeprom_bt_ant_isol = 0; 2462 rtlpriv->btcoexist.eeprom_bt_ant_isol = 0;
2355 pcipriv->bt_coexist.eeprom_bt_radio_shared = BT_RADIO_SHARED; 2463 rtlpriv->btcoexist.eeprom_bt_radio_shared = BT_RADIO_SHARED;
2356 } 2464 }
2357 2465
2358 rtl8723ae_bt_var_init(hw); 2466 rtl8723e_bt_var_init(hw);
2359} 2467}
2360 2468
2361void rtl8723ae_bt_reg_init(struct ieee80211_hw *hw) 2469void rtl8723e_bt_reg_init(struct ieee80211_hw *hw)
2362{ 2470{
2363 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 2471 struct rtl_priv *rtlpriv = rtl_priv(hw);
2364 2472
2365 /* 0:Low, 1:High, 2:From Efuse. */ 2473 /* 0:Low, 1:High, 2:From Efuse. */
2366 pcipriv->bt_coexist.reg_bt_iso = 2; 2474 rtlpriv->btcoexist.reg_bt_iso = 2;
2367 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */ 2475 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
2368 pcipriv->bt_coexist.reg_bt_sco = 3; 2476 rtlpriv->btcoexist.reg_bt_sco = 3;
2369 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */ 2477 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
2370 pcipriv->bt_coexist.reg_bt_sco = 0; 2478 rtlpriv->btcoexist.reg_bt_sco = 0;
2371} 2479}
2372 2480
2373 2481void rtl8723e_bt_hw_init(struct ieee80211_hw *hw)
2374void rtl8723ae_bt_hw_init(struct ieee80211_hw *hw)
2375{ 2482{
2483 struct rtl_priv *rtlpriv = rtl_priv(hw);
2484
2485 if (rtlpriv->cfg->ops->get_btc_status())
2486 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
2376} 2487}
2377 2488
2378void rtl8723ae_suspend(struct ieee80211_hw *hw) 2489void rtl8723e_suspend(struct ieee80211_hw *hw)
2379{ 2490{
2380} 2491}
2381 2492
2382void rtl8723ae_resume(struct ieee80211_hw *hw) 2493void rtl8723e_resume(struct ieee80211_hw *hw)
2383{ 2494{
2384} 2495}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.h b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.h
index d3bc39fb27a5..32c1ace97c3f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/hw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/hw.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -34,38 +30,38 @@
34 ((rtlefuse->eeprom_svid == (_val1)) && \ 30 ((rtlefuse->eeprom_svid == (_val1)) && \
35 (rtlefuse->eeprom_smid == (_val2))) 31 (rtlefuse->eeprom_smid == (_val2)))
36 32
37void rtl8723ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val); 33void rtl8723e_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
38void rtl8723ae_read_eeprom_info(struct ieee80211_hw *hw); 34void rtl8723e_read_eeprom_info(struct ieee80211_hw *hw);
39 35
40void rtl8723ae_interrupt_recognized(struct ieee80211_hw *hw, 36void rtl8723e_interrupt_recognized(struct ieee80211_hw *hw,
41 u32 *p_inta, u32 *p_intb); 37 u32 *p_inta, u32 *p_intb);
42int rtl8723ae_hw_init(struct ieee80211_hw *hw); 38int rtl8723e_hw_init(struct ieee80211_hw *hw);
43void rtl8723ae_card_disable(struct ieee80211_hw *hw); 39void rtl8723e_card_disable(struct ieee80211_hw *hw);
44void rtl8723ae_enable_interrupt(struct ieee80211_hw *hw); 40void rtl8723e_enable_interrupt(struct ieee80211_hw *hw);
45void rtl8723ae_disable_interrupt(struct ieee80211_hw *hw); 41void rtl8723e_disable_interrupt(struct ieee80211_hw *hw);
46int rtl8723ae_set_network_type(struct ieee80211_hw *hw, 42int rtl8723e_set_network_type(struct ieee80211_hw *hw,
47 enum nl80211_iftype type); 43 enum nl80211_iftype type);
48void rtl8723ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid); 44void rtl8723e_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid);
49void rtl8723ae_set_qos(struct ieee80211_hw *hw, int aci); 45void rtl8723e_set_qos(struct ieee80211_hw *hw, int aci);
50void rtl8723ae_set_beacon_related_registers(struct ieee80211_hw *hw); 46void rtl8723e_set_beacon_related_registers(struct ieee80211_hw *hw);
51void rtl8723ae_set_beacon_interval(struct ieee80211_hw *hw); 47void rtl8723e_set_beacon_interval(struct ieee80211_hw *hw);
52void rtl8723ae_update_interrupt_mask(struct ieee80211_hw *hw, 48void rtl8723e_update_interrupt_mask(struct ieee80211_hw *hw,
53 u32 add_msr, u32 rm_msr); 49 u32 add_msr, u32 rm_msr);
54void rtl8723ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val); 50void rtl8723e_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
55void rtl8723ae_update_hal_rate_tbl(struct ieee80211_hw *hw, 51void rtl8723e_update_hal_rate_tbl(struct ieee80211_hw *hw,
56 struct ieee80211_sta *sta, u8 rssi_level); 52 struct ieee80211_sta *sta, u8 rssi_level);
57void rtl8723ae_update_channel_access_setting(struct ieee80211_hw *hw); 53void rtl8723e_update_channel_access_setting(struct ieee80211_hw *hw);
58bool rtl8723ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid); 54bool rtl8723e_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
59void rtl8723ae_enable_hw_security_config(struct ieee80211_hw *hw); 55void rtl8723e_enable_hw_security_config(struct ieee80211_hw *hw);
60void rtl8723ae_set_key(struct ieee80211_hw *hw, u32 key_index, 56void rtl8723e_set_key(struct ieee80211_hw *hw, u32 key_index,
61 u8 *p_macaddr, bool is_group, u8 enc_algo, 57 u8 *p_macaddr, bool is_group, u8 enc_algo,
62 bool is_wepkey, bool clear_all); 58 bool is_wepkey, bool clear_all);
63 59
64void rtl8723ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw, 60void rtl8723e_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
65 bool autoload_fail, u8 *hwinfo); 61 bool autoload_fail, u8 *hwinfo);
66void rtl8723ae_bt_reg_init(struct ieee80211_hw *hw); 62void rtl8723e_bt_reg_init(struct ieee80211_hw *hw);
67void rtl8723ae_bt_hw_init(struct ieee80211_hw *hw); 63void rtl8723e_bt_hw_init(struct ieee80211_hw *hw);
68void rtl8723ae_suspend(struct ieee80211_hw *hw); 64void rtl8723e_suspend(struct ieee80211_hw *hw);
69void rtl8723ae_resume(struct ieee80211_hw *hw); 65void rtl8723e_resume(struct ieee80211_hw *hw);
70 66
71#endif 67#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/led.c b/drivers/net/wireless/rtlwifi/rtl8723ae/led.c
index 061526fe6e2d..13173351cbfd 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/led.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/led.c
@@ -32,44 +32,44 @@
32#include "reg.h" 32#include "reg.h"
33#include "led.h" 33#include "led.h"
34 34
35static void _rtl8723ae_init_led(struct ieee80211_hw *hw, 35static void _rtl8723e_init_led(struct ieee80211_hw *hw,
36 struct rtl_led *pled, enum rtl_led_pin ledpin) 36 struct rtl_led *pled, enum rtl_led_pin ledpin)
37{ 37{
38 pled->hw = hw; 38 pled->hw = hw;
39 pled->ledpin = ledpin; 39 pled->ledpin = ledpin;
40 pled->ledon = false; 40 pled->ledon = false;
41} 41}
42 42
43void rtl8723ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled) 43void rtl8723e_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
44{ 44{
45 struct rtl_priv *rtlpriv = rtl_priv(hw);
46 u8 ledcfg; 45 u8 ledcfg;
46 struct rtl_priv *rtlpriv = rtl_priv(hw);
47 47
48 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, 48 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
49 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin); 49 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
50 50
51 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
52
53 switch (pled->ledpin) { 51 switch (pled->ledpin) {
54 case LED_PIN_GPIO0: 52 case LED_PIN_GPIO0:
55 break; 53 break;
56 case LED_PIN_LED0: 54 case LED_PIN_LED0:
55 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
57 ledcfg &= ~BIT(6); 56 ledcfg &= ~BIT(6);
58 rtl_write_byte(rtlpriv, 57 rtl_write_byte(rtlpriv,
59 REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5)); 58 REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5));
60 break; 59 break;
61 case LED_PIN_LED1: 60 case LED_PIN_LED1:
62 rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg & 0x0f) | BIT(5)); 61 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
62 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10);
63 break; 63 break;
64 default: 64 default:
65 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 65 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
66 "switch case not processed\n"); 66 "switch case not process\n");
67 break; 67 break;
68 } 68 }
69 pled->ledon = true; 69 pled->ledon = true;
70} 70}
71 71
72void rtl8723ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled) 72void rtl8723e_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
73{ 73{
74 struct rtl_priv *rtlpriv = rtl_priv(hw); 74 struct rtl_priv *rtlpriv = rtl_priv(hw);
75 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 75 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
@@ -86,7 +86,7 @@ void rtl8723ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
86 case LED_PIN_LED0: 86 case LED_PIN_LED0:
87 ledcfg &= 0xf0; 87 ledcfg &= 0xf0;
88 if (pcipriv->ledctl.led_opendrain) { 88 if (pcipriv->ledctl.led_opendrain) {
89 ledcfg &= 0x90; 89 ledcfg &= 0x90; /* Set to software control. */
90 rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg|BIT(3))); 90 rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg|BIT(3)));
91 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG); 91 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG);
92 ledcfg &= 0xFE; 92 ledcfg &= 0xFE;
@@ -94,50 +94,51 @@ void rtl8723ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
94 } else { 94 } else {
95 ledcfg &= ~BIT(6); 95 ledcfg &= ~BIT(6);
96 rtl_write_byte(rtlpriv, REG_LEDCFG2, 96 rtl_write_byte(rtlpriv, REG_LEDCFG2,
97 (ledcfg | BIT(3) | BIT(5))); 97 (ledcfg | BIT(3) | BIT(5)));
98 } 98 }
99 break; 99 break;
100 case LED_PIN_LED1: 100 case LED_PIN_LED1:
101 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1) & 0x10; 101 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
102 rtl_write_byte(rtlpriv, REG_LEDCFG1, (ledcfg | BIT(3))); 102 ledcfg &= 0x10; /* Set to software control. */
103 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg|BIT(3));
104
103 break; 105 break;
104 default: 106 default:
105 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 107 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
106 "switch case not processed\n"); 108 "switch case not process\n");
107 break; 109 break;
108 } 110 }
109 pled->ledon = false; 111 pled->ledon = false;
110} 112}
111 113
112void rtl8723ae_init_sw_leds(struct ieee80211_hw *hw) 114void rtl8723e_init_sw_leds(struct ieee80211_hw *hw)
113{ 115{
114 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 116 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
115 117 _rtl8723e_init_led(hw, &pcipriv->ledctl.sw_led0, LED_PIN_LED0);
116 _rtl8723ae_init_led(hw, &(pcipriv->ledctl.sw_led0), LED_PIN_LED0); 118 _rtl8723e_init_led(hw, &pcipriv->ledctl.sw_led1, LED_PIN_LED1);
117 _rtl8723ae_init_led(hw, &(pcipriv->ledctl.sw_led1), LED_PIN_LED1);
118} 119}
119 120
120static void _rtl8723ae_sw_led_control(struct ieee80211_hw *hw, 121static void _rtl8723e_sw_led_control(struct ieee80211_hw *hw,
121 enum led_ctl_mode ledaction) 122 enum led_ctl_mode ledaction)
122{ 123{
123 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 124 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
124 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0); 125 struct rtl_led *pLed0 = &(pcipriv->ledctl.sw_led0);
125
126 switch (ledaction) { 126 switch (ledaction) {
127 case LED_CTL_POWER_ON: 127 case LED_CTL_POWER_ON:
128 case LED_CTL_LINK: 128 case LED_CTL_LINK:
129 case LED_CTL_NO_LINK: 129 case LED_CTL_NO_LINK:
130 rtl8723ae_sw_led_on(hw, pLed0); 130 rtl8723e_sw_led_on(hw, pLed0);
131 break; 131 break;
132 case LED_CTL_POWER_OFF: 132 case LED_CTL_POWER_OFF:
133 rtl8723ae_sw_led_off(hw, pLed0); 133 rtl8723e_sw_led_off(hw, pLed0);
134 break; 134 break;
135 default: 135 default:
136 break; 136 break;
137 } 137 }
138} 138}
139 139
140void rtl8723ae_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction) 140void rtl8723e_led_control(struct ieee80211_hw *hw,
141 enum led_ctl_mode ledaction)
141{ 142{
142 struct rtl_priv *rtlpriv = rtl_priv(hw); 143 struct rtl_priv *rtlpriv = rtl_priv(hw);
143 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 144 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
@@ -152,6 +153,7 @@ void rtl8723ae_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction)
152 ledaction == LED_CTL_POWER_ON)) { 153 ledaction == LED_CTL_POWER_ON)) {
153 return; 154 return;
154 } 155 }
155 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d,\n", ledaction); 156 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d,\n",
156 _rtl8723ae_sw_led_control(hw, ledaction); 157 ledaction);
158 _rtl8723e_sw_led_control(hw, ledaction);
157} 159}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/led.h b/drivers/net/wireless/rtlwifi/rtl8723ae/led.h
index 2cb88e78f62a..c22b19f542a6 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/led.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/led.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,10 +26,9 @@
30#ifndef __RTL92CE_LED_H__ 26#ifndef __RTL92CE_LED_H__
31#define __RTL92CE_LED_H__ 27#define __RTL92CE_LED_H__
32 28
33void rtl8723ae_init_sw_leds(struct ieee80211_hw *hw); 29void rtl8723e_init_sw_leds(struct ieee80211_hw *hw);
34void rtl8723ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled); 30void rtl8723e_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled);
35void rtl8723ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled); 31void rtl8723e_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled);
36void rtl8723ae_led_control(struct ieee80211_hw *hw, 32void rtl8723e_led_control(struct ieee80211_hw *hw, enum led_ctl_mode ledaction);
37 enum led_ctl_mode ledaction);
38 33
39#endif 34#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c
index 3ea78afdec73..d367097f490b 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,7 +26,6 @@
30#include "../wifi.h" 26#include "../wifi.h"
31#include "../pci.h" 27#include "../pci.h"
32#include "../ps.h" 28#include "../ps.h"
33#include "../core.h"
34#include "reg.h" 29#include "reg.h"
35#include "def.h" 30#include "def.h"
36#include "phy.h" 31#include "phy.h"
@@ -39,29 +34,31 @@
39#include "table.h" 34#include "table.h"
40#include "../rtl8723com/phy_common.h" 35#include "../rtl8723com/phy_common.h"
41 36
42/* static forward definitions */ 37static void _rtl8723e_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
43static u32 _phy_fw_rf_serial_read(struct ieee80211_hw *hw, 38 enum radio_path rfpath, u32 offset,
44 enum radio_path rfpath, u32 offset); 39 u32 data);
45static void _phy_fw_rf_serial_write(struct ieee80211_hw *hw, 40static bool _rtl8723e_phy_bb8192c_config_parafile(struct ieee80211_hw *hw);
46 enum radio_path rfpath, 41static bool _rtl8723e_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
47 u32 offset, u32 data); 42static bool _rtl8723e_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
48static bool _phy_bb8192c_config_parafile(struct ieee80211_hw *hw); 43 u8 configtype);
49static bool _phy_cfg_mac_w_header(struct ieee80211_hw *hw); 44static bool _rtl8723e_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
50static bool _phy_cfg_bb_w_header(struct ieee80211_hw *hw, u8 configtype); 45 u8 configtype);
51static bool _phy_cfg_bb_w_pgheader(struct ieee80211_hw *hw, u8 configtype); 46static bool _rtl8723e_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
52static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel, 47 u8 channel, u8 *stage, u8 *step,
53 u8 *stage, u8 *step, u32 *delay); 48 u32 *delay);
54static u8 _phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw, 49static u8 _rtl8723e_phy_dbm_to_txpwr_idx(struct ieee80211_hw *hw,
55 enum wireless_mode wirelessmode, 50 enum wireless_mode wirelessmode,
56 long power_indbm); 51 long power_indbm);
57static void rtl8723ae_phy_set_io(struct ieee80211_hw *hw); 52static void rtl8723e_phy_set_rf_on(struct ieee80211_hw *hw);
58 53static void rtl8723e_phy_set_io(struct ieee80211_hw *hw);
59u32 rtl8723ae_phy_query_rf_reg(struct ieee80211_hw *hw, 54
60 enum radio_path rfpath, u32 regaddr, u32 bitmask) 55u32 rtl8723e_phy_query_rf_reg(struct ieee80211_hw *hw,
56 enum radio_path rfpath,
57 u32 regaddr, u32 bitmask)
61{ 58{
62 struct rtl_priv *rtlpriv = rtl_priv(hw); 59 struct rtl_priv *rtlpriv = rtl_priv(hw);
63 u32 original_value, readback_value, bitshift; 60 u32 original_value = 0, readback_value, bitshift;
64 struct rtl_phy *rtlphy = &(rtlpriv->phy); 61 struct rtl_phy *rtlphy = &rtlpriv->phy;
65 unsigned long flags; 62 unsigned long flags;
66 63
67 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 64 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
@@ -70,10 +67,10 @@ u32 rtl8723ae_phy_query_rf_reg(struct ieee80211_hw *hw,
70 67
71 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 68 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
72 69
73 if (rtlphy->rf_mode != RF_OP_BY_FW) 70 if (rtlphy->rf_mode != RF_OP_BY_FW) {
74 original_value = rtl8723_phy_rf_serial_read(hw, rfpath, regaddr); 71 original_value = rtl8723_phy_rf_serial_read(hw,
75 else 72 rfpath, regaddr);
76 original_value = _phy_fw_rf_serial_read(hw, rfpath, regaddr); 73 }
77 74
78 bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 75 bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
79 readback_value = (original_value & bitmask) >> bitshift; 76 readback_value = (original_value & bitmask) >> bitshift;
@@ -82,45 +79,46 @@ u32 rtl8723ae_phy_query_rf_reg(struct ieee80211_hw *hw,
82 79
83 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 80 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
84 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n", 81 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
85 regaddr, rfpath, bitmask, original_value); 82 regaddr, rfpath, bitmask, original_value);
86 83
87 return readback_value; 84 return readback_value;
88} 85}
89 86
90void rtl8723ae_phy_set_rf_reg(struct ieee80211_hw *hw, 87void rtl8723e_phy_set_rf_reg(struct ieee80211_hw *hw,
91 enum radio_path rfpath, 88 enum radio_path rfpath,
92 u32 regaddr, u32 bitmask, u32 data) 89 u32 regaddr, u32 bitmask, u32 data)
93{ 90{
94 struct rtl_priv *rtlpriv = rtl_priv(hw); 91 struct rtl_priv *rtlpriv = rtl_priv(hw);
95 struct rtl_phy *rtlphy = &(rtlpriv->phy); 92 struct rtl_phy *rtlphy = &rtlpriv->phy;
96 u32 original_value, bitshift; 93 u32 original_value = 0, bitshift;
97 unsigned long flags; 94 unsigned long flags;
98 95
99 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 96 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
100 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 97 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
101 regaddr, bitmask, data, rfpath); 98 regaddr, bitmask, data, rfpath);
102 99
103 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags); 100 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
104 101
105 if (rtlphy->rf_mode != RF_OP_BY_FW) { 102 if (rtlphy->rf_mode != RF_OP_BY_FW) {
106 if (bitmask != RFREG_OFFSET_MASK) { 103 if (bitmask != RFREG_OFFSET_MASK) {
107 original_value = rtl8723_phy_rf_serial_read(hw, rfpath, 104 original_value = rtl8723_phy_rf_serial_read(hw,
105 rfpath,
108 regaddr); 106 regaddr);
109 bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 107 bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
110 data = ((original_value & (~bitmask)) | 108 data =
111 (data << bitshift)); 109 ((original_value & (~bitmask)) |
110 (data << bitshift));
112 } 111 }
113 112
114 rtl8723_phy_rf_serial_write(hw, rfpath, regaddr, data); 113 rtl8723_phy_rf_serial_write(hw, rfpath, regaddr, data);
115 } else { 114 } else {
116 if (bitmask != RFREG_OFFSET_MASK) { 115 if (bitmask != RFREG_OFFSET_MASK) {
117 original_value = _phy_fw_rf_serial_read(hw, rfpath,
118 regaddr);
119 bitshift = rtl8723_phy_calculate_bit_shift(bitmask); 116 bitshift = rtl8723_phy_calculate_bit_shift(bitmask);
120 data = ((original_value & (~bitmask)) | 117 data =
121 (data << bitshift)); 118 ((original_value & (~bitmask)) |
119 (data << bitshift));
122 } 120 }
123 _phy_fw_rf_serial_write(hw, rfpath, regaddr, data); 121 _rtl8723e_phy_fw_rf_serial_write(hw, rfpath, regaddr, data);
124 } 122 }
125 123
126 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 124 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
@@ -128,23 +126,17 @@ void rtl8723ae_phy_set_rf_reg(struct ieee80211_hw *hw,
128 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 126 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
129 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 127 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
130 regaddr, bitmask, data, rfpath); 128 regaddr, bitmask, data, rfpath);
131}
132 129
133static u32 _phy_fw_rf_serial_read(struct ieee80211_hw *hw,
134 enum radio_path rfpath, u32 offset)
135{
136 RT_ASSERT(false, "deprecated!\n");
137 return 0;
138} 130}
139 131
140static void _phy_fw_rf_serial_write(struct ieee80211_hw *hw, 132static void _rtl8723e_phy_fw_rf_serial_write(struct ieee80211_hw *hw,
141 enum radio_path rfpath, 133 enum radio_path rfpath, u32 offset,
142 u32 offset, u32 data) 134 u32 data)
143{ 135{
144 RT_ASSERT(false, "deprecated!\n"); 136 RT_ASSERT(false, "deprecated!\n");
145} 137}
146 138
147static void _rtl8723ae_phy_bb_config_1t(struct ieee80211_hw *hw) 139static void _rtl8723e_phy_bb_config_1t(struct ieee80211_hw *hw)
148{ 140{
149 rtl_set_bbreg(hw, RFPGA0_TXINFO, 0x3, 0x2); 141 rtl_set_bbreg(hw, RFPGA0_TXINFO, 0x3, 0x2);
150 rtl_set_bbreg(hw, RFPGA1_TXINFO, 0x300033, 0x200022); 142 rtl_set_bbreg(hw, RFPGA1_TXINFO, 0x300033, 0x200022);
@@ -158,20 +150,20 @@ static void _rtl8723ae_phy_bb_config_1t(struct ieee80211_hw *hw)
158 rtl_set_bbreg(hw, 0xe88, 0x0c000000, 0x2); 150 rtl_set_bbreg(hw, 0xe88, 0x0c000000, 0x2);
159} 151}
160 152
161bool rtl8723ae_phy_mac_config(struct ieee80211_hw *hw) 153bool rtl8723e_phy_mac_config(struct ieee80211_hw *hw)
162{ 154{
163 struct rtl_priv *rtlpriv = rtl_priv(hw); 155 struct rtl_priv *rtlpriv = rtl_priv(hw);
164 bool rtstatus = _phy_cfg_mac_w_header(hw); 156 bool rtstatus = _rtl8723e_phy_config_mac_with_headerfile(hw);
165 rtl_write_byte(rtlpriv, 0x04CA, 0x0A); 157 rtl_write_byte(rtlpriv, 0x04CA, 0x0A);
166 return rtstatus; 158 return rtstatus;
167} 159}
168 160
169bool rtl8723ae_phy_bb_config(struct ieee80211_hw *hw) 161bool rtl8723e_phy_bb_config(struct ieee80211_hw *hw)
170{ 162{
171 bool rtstatus = true; 163 bool rtstatus = true;
172 struct rtl_priv *rtlpriv = rtl_priv(hw); 164 struct rtl_priv *rtlpriv = rtl_priv(hw);
173 u8 tmpu1b; 165 u8 tmpu1b;
174 u8 reg_hwparafile = 1; 166 u8 b_reg_hwparafile = 1;
175 167
176 rtl8723_phy_init_bb_rf_reg_def(hw); 168 rtl8723_phy_init_bb_rf_reg_def(hw);
177 169
@@ -186,67 +178,72 @@ bool rtl8723ae_phy_bb_config(struct ieee80211_hw *hw)
186 178
187 /* 3. 0x02[1:0] = 2b'11 */ 179 /* 3. 0x02[1:0] = 2b'11 */
188 tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN); 180 tmpu1b = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
189 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, (tmpu1b | 181 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
190 FEN_BB_GLB_RSTn | FEN_BBRSTB)); 182 (tmpu1b | FEN_BB_GLB_RSTN | FEN_BBRSTB));
191 183
192 /* 4. 0x25[6] = 0 */ 184 /* 4. 0x25[6] = 0 */
193 tmpu1b = rtl_read_byte(rtlpriv, REG_AFE_XTAL_CTRL+1); 185 tmpu1b = rtl_read_byte(rtlpriv, REG_AFE_XTAL_CTRL+1);
194 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL+1, (tmpu1b&(~BIT(6)))); 186 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL+1, (tmpu1b & (~BIT(6))));
195 187
196 /* 5. 0x24[20] = 0 Advised by SD3 Alex Wang. 2011.02.09. */ 188 /* 5. 0x24[20] = 0 //Advised by SD3 Alex Wang. 2011.02.09. */
197 tmpu1b = rtl_read_byte(rtlpriv, REG_AFE_XTAL_CTRL+2); 189 tmpu1b = rtl_read_byte(rtlpriv, REG_AFE_XTAL_CTRL+2);
198 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL+2, (tmpu1b&(~BIT(4)))); 190 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL+2, (tmpu1b & (~BIT(4))));
199 191
200 /* 6. 0x1f[7:0] = 0x07 */ 192 /* 6. 0x1f[7:0] = 0x07 */
201 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x07); 193 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x07);
202 194
203 if (reg_hwparafile == 1) 195 if (b_reg_hwparafile == 1)
204 rtstatus = _phy_bb8192c_config_parafile(hw); 196 rtstatus = _rtl8723e_phy_bb8192c_config_parafile(hw);
205 return rtstatus; 197 return rtstatus;
206} 198}
207 199
208bool rtl8723ae_phy_rf_config(struct ieee80211_hw *hw) 200bool rtl8723e_phy_rf_config(struct ieee80211_hw *hw)
209{ 201{
210 return rtl8723ae_phy_rf6052_config(hw); 202 return rtl8723e_phy_rf6052_config(hw);
211} 203}
212 204
213static bool _phy_bb8192c_config_parafile(struct ieee80211_hw *hw) 205static bool _rtl8723e_phy_bb8192c_config_parafile(struct ieee80211_hw *hw)
214{ 206{
215 struct rtl_priv *rtlpriv = rtl_priv(hw); 207 struct rtl_priv *rtlpriv = rtl_priv(hw);
216 struct rtl_phy *rtlphy = &(rtlpriv->phy); 208 struct rtl_phy *rtlphy = &rtlpriv->phy;
217 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 209 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
218 bool rtstatus; 210 bool rtstatus;
219 211
220 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n"); 212 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
221 rtstatus = _phy_cfg_bb_w_header(hw, BASEBAND_CONFIG_PHY_REG); 213 rtstatus = _rtl8723e_phy_config_bb_with_headerfile(hw,
214 BASEBAND_CONFIG_PHY_REG);
222 if (rtstatus != true) { 215 if (rtstatus != true) {
223 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!"); 216 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
224 return false; 217 return false;
225 } 218 }
226 219
227 if (rtlphy->rf_type == RF_1T2R) { 220 if (rtlphy->rf_type == RF_1T2R) {
228 _rtl8723ae_phy_bb_config_1t(hw); 221 _rtl8723e_phy_bb_config_1t(hw);
229 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n"); 222 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n");
230 } 223 }
231 if (rtlefuse->autoload_failflag == false) { 224 if (rtlefuse->autoload_failflag == false) {
232 rtlphy->pwrgroup_cnt = 0; 225 rtlphy->pwrgroup_cnt = 0;
233 rtstatus = _phy_cfg_bb_w_pgheader(hw, BASEBAND_CONFIG_PHY_REG); 226 rtstatus = _rtl8723e_phy_config_bb_with_pgheaderfile(hw,
227 BASEBAND_CONFIG_PHY_REG);
234 } 228 }
235 if (rtstatus != true) { 229 if (rtstatus != true) {
236 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!"); 230 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
237 return false; 231 return false;
238 } 232 }
239 rtstatus = _phy_cfg_bb_w_header(hw, BASEBAND_CONFIG_AGC_TAB); 233 rtstatus =
234 _rtl8723e_phy_config_bb_with_headerfile(hw, BASEBAND_CONFIG_AGC_TAB);
240 if (rtstatus != true) { 235 if (rtstatus != true) {
241 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n"); 236 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
242 return false; 237 return false;
243 } 238 }
244 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw, 239 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
245 RFPGA0_XA_HSSIPARAMETER2, 0x200)); 240 RFPGA0_XA_HSSIPARAMETER2,
241 0x200));
242
246 return true; 243 return true;
247} 244}
248 245
249static bool _phy_cfg_mac_w_header(struct ieee80211_hw *hw) 246static bool _rtl8723e_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
250{ 247{
251 struct rtl_priv *rtlpriv = rtl_priv(hw); 248 struct rtl_priv *rtlpriv = rtl_priv(hw);
252 u32 i; 249 u32 i;
@@ -264,7 +261,8 @@ static bool _phy_cfg_mac_w_header(struct ieee80211_hw *hw)
264 return true; 261 return true;
265} 262}
266 263
267static bool _phy_cfg_bb_w_header(struct ieee80211_hw *hw, u8 configtype) 264static bool _rtl8723e_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
265 u8 configtype)
268{ 266{
269 int i; 267 int i;
270 u32 *phy_regarray_table; 268 u32 *phy_regarray_table;
@@ -278,13 +276,23 @@ static bool _phy_cfg_bb_w_header(struct ieee80211_hw *hw, u8 configtype)
278 phy_regarray_table = RTL8723EPHY_REG_1TARRAY; 276 phy_regarray_table = RTL8723EPHY_REG_1TARRAY;
279 if (configtype == BASEBAND_CONFIG_PHY_REG) { 277 if (configtype == BASEBAND_CONFIG_PHY_REG) {
280 for (i = 0; i < phy_reg_arraylen; i = i + 2) { 278 for (i = 0; i < phy_reg_arraylen; i = i + 2) {
281 rtl_addr_delay(phy_regarray_table[i]); 279 if (phy_regarray_table[i] == 0xfe)
280 mdelay(50);
281 else if (phy_regarray_table[i] == 0xfd)
282 mdelay(5);
283 else if (phy_regarray_table[i] == 0xfc)
284 mdelay(1);
285 else if (phy_regarray_table[i] == 0xfb)
286 udelay(50);
287 else if (phy_regarray_table[i] == 0xfa)
288 udelay(5);
289 else if (phy_regarray_table[i] == 0xf9)
290 udelay(1);
282 rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD, 291 rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,
283 phy_regarray_table[i + 1]); 292 phy_regarray_table[i + 1]);
284 udelay(1); 293 udelay(1);
285 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 294 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
286 "The phy_regarray_table[0] is %x" 295 "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
287 " Rtl819XPHY_REGArray[1] is %x\n",
288 phy_regarray_table[i], 296 phy_regarray_table[i],
289 phy_regarray_table[i + 1]); 297 phy_regarray_table[i + 1]);
290 } 298 }
@@ -294,8 +302,7 @@ static bool _phy_cfg_bb_w_header(struct ieee80211_hw *hw, u8 configtype)
294 agctab_array_table[i + 1]); 302 agctab_array_table[i + 1]);
295 udelay(1); 303 udelay(1);
296 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 304 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
297 "The agctab_array_table[0] is " 305 "The agctab_array_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
298 "%x Rtl819XPHY_REGArray[1] is %x\n",
299 agctab_array_table[i], 306 agctab_array_table[i],
300 agctab_array_table[i + 1]); 307 agctab_array_table[i + 1]);
301 } 308 }
@@ -303,132 +310,163 @@ static bool _phy_cfg_bb_w_header(struct ieee80211_hw *hw, u8 configtype)
303 return true; 310 return true;
304} 311}
305 312
306static void _st_pwrIdx_dfrate_off(struct ieee80211_hw *hw, u32 regaddr, 313static void store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
307 u32 bitmask, u32 data) 314 u32 regaddr, u32 bitmask,
315 u32 data)
308{ 316{
309 struct rtl_priv *rtlpriv = rtl_priv(hw); 317 struct rtl_priv *rtlpriv = rtl_priv(hw);
310 struct rtl_phy *rtlphy = &(rtlpriv->phy); 318 struct rtl_phy *rtlphy = &rtlpriv->phy;
311 319
312 switch (regaddr) { 320 if (regaddr == RTXAGC_A_RATE18_06) {
313 case RTXAGC_A_RATE18_06: 321 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][0] =
314 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][0] = data; 322 data;
315 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 323 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
316 "MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n", 324 "MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n",
317 rtlphy->pwrgroup_cnt, 325 rtlphy->pwrgroup_cnt,
318 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][0]); 326 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
319 break; 327 pwrgroup_cnt][0]);
320 case RTXAGC_A_RATE54_24: 328 }
321 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][1] = data; 329 if (regaddr == RTXAGC_A_RATE54_24) {
330 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][1] =
331 data;
322 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 332 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
323 "MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n", 333 "MCSTxPowerLevelOriginalOffset[%d][1] = 0x%x\n",
324 rtlphy->pwrgroup_cnt, 334 rtlphy->pwrgroup_cnt,
325 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][1]); 335 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
326 break; 336 pwrgroup_cnt][1]);
327 case RTXAGC_A_CCK1_MCS32: 337 }
328 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][6] = data; 338 if (regaddr == RTXAGC_A_CCK1_MCS32) {
339 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][6] =
340 data;
329 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 341 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
330 "MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n", 342 "MCSTxPowerLevelOriginalOffset[%d][6] = 0x%x\n",
331 rtlphy->pwrgroup_cnt, 343 rtlphy->pwrgroup_cnt,
332 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][6]); 344 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
333 break; 345 pwrgroup_cnt][6]);
334 case RTXAGC_B_CCK11_A_CCK2_11: 346 }
335 if (bitmask == 0xffffff00) { 347 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00) {
336 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][7] = data; 348 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][7] =
337 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 349 data;
338 "MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n", 350 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
339 rtlphy->pwrgroup_cnt, 351 "MCSTxPowerLevelOriginalOffset[%d][7] = 0x%x\n",
340 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][7]); 352 rtlphy->pwrgroup_cnt,
341 } 353 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
342 if (bitmask == 0x000000ff) { 354 pwrgroup_cnt][7]);
343 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][15] = data; 355 }
344 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 356 if (regaddr == RTXAGC_A_MCS03_MCS00) {
345 "MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n", 357 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][2] =
346 rtlphy->pwrgroup_cnt, 358 data;
347 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][15]);
348 }
349 break;
350 case RTXAGC_A_MCS03_MCS00:
351 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][2] = data;
352 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 359 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
353 "MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n", 360 "MCSTxPowerLevelOriginalOffset[%d][2] = 0x%x\n",
354 rtlphy->pwrgroup_cnt, 361 rtlphy->pwrgroup_cnt,
355 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][2]); 362 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
356 break; 363 pwrgroup_cnt][2]);
357 case RTXAGC_A_MCS07_MCS04: 364 }
358 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][3] = data; 365 if (regaddr == RTXAGC_A_MCS07_MCS04) {
366 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][3] =
367 data;
359 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 368 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
360 "MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n", 369 "MCSTxPowerLevelOriginalOffset[%d][3] = 0x%x\n",
361 rtlphy->pwrgroup_cnt, 370 rtlphy->pwrgroup_cnt,
362 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][3]); 371 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
363 break; 372 pwrgroup_cnt][3]);
364 case RTXAGC_A_MCS11_MCS08: 373 }
365 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][4] = data; 374 if (regaddr == RTXAGC_A_MCS11_MCS08) {
375 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][4] =
376 data;
366 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 377 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
367 "MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n", 378 "MCSTxPowerLevelOriginalOffset[%d][4] = 0x%x\n",
368 rtlphy->pwrgroup_cnt, 379 rtlphy->pwrgroup_cnt,
369 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][4]); 380 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
370 break; 381 pwrgroup_cnt][4]);
371 case RTXAGC_A_MCS15_MCS12: 382 }
372 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][5] = data; 383 if (regaddr == RTXAGC_A_MCS15_MCS12) {
384 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][5] =
385 data;
373 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 386 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
374 "MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n", 387 "MCSTxPowerLevelOriginalOffset[%d][5] = 0x%x\n",
375 rtlphy->pwrgroup_cnt, 388 rtlphy->pwrgroup_cnt,
376 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][5]); 389 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
377 break; 390 pwrgroup_cnt][5]);
378 case RTXAGC_B_RATE18_06: 391 }
379 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][8] = data; 392 if (regaddr == RTXAGC_B_RATE18_06) {
393 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][8] =
394 data;
380 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 395 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
381 "MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n", 396 "MCSTxPowerLevelOriginalOffset[%d][8] = 0x%x\n",
382 rtlphy->pwrgroup_cnt, 397 rtlphy->pwrgroup_cnt,
383 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][8]); 398 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
384 break; 399 pwrgroup_cnt][8]);
385 case RTXAGC_B_RATE54_24: 400 }
386 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][9] = data; 401 if (regaddr == RTXAGC_B_RATE54_24) {
402 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][9] =
403 data;
387 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 404 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
388 "MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n", 405 "MCSTxPowerLevelOriginalOffset[%d][9] = 0x%x\n",
389 rtlphy->pwrgroup_cnt, 406 rtlphy->pwrgroup_cnt,
390 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][9]); 407 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
391 break; 408 pwrgroup_cnt][9]);
392 case RTXAGC_B_CCK1_55_MCS32: 409 }
393 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][14] = data; 410 if (regaddr == RTXAGC_B_CCK1_55_MCS32) {
411 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][14] =
412 data;
394 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 413 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
395 "MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n", 414 "MCSTxPowerLevelOriginalOffset[%d][14] = 0x%x\n",
396 rtlphy->pwrgroup_cnt, 415 rtlphy->pwrgroup_cnt,
397 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][14]); 416 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
398 break; 417 pwrgroup_cnt][14]);
399 case RTXAGC_B_MCS03_MCS00: 418 }
400 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][10] = data; 419 if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff) {
420 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][15] =
421 data;
422 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
423 "MCSTxPowerLevelOriginalOffset[%d][15] = 0x%x\n",
424 rtlphy->pwrgroup_cnt,
425 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
426 pwrgroup_cnt][15]);
427 }
428 if (regaddr == RTXAGC_B_MCS03_MCS00) {
429 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][10] =
430 data;
401 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 431 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
402 "MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n", 432 "MCSTxPowerLevelOriginalOffset[%d][10] = 0x%x\n",
403 rtlphy->pwrgroup_cnt, 433 rtlphy->pwrgroup_cnt,
404 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][10]); 434 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
405 break; 435 pwrgroup_cnt][10]);
406 case RTXAGC_B_MCS07_MCS04: 436 }
407 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][11] = data; 437 if (regaddr == RTXAGC_B_MCS07_MCS04) {
438 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][11] =
439 data;
408 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 440 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
409 "MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n", 441 "MCSTxPowerLevelOriginalOffset[%d][11] = 0x%x\n",
410 rtlphy->pwrgroup_cnt, 442 rtlphy->pwrgroup_cnt,
411 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][11]); 443 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
412 break; 444 pwrgroup_cnt][11]);
413 case RTXAGC_B_MCS11_MCS08: 445 }
414 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][12] = data; 446 if (regaddr == RTXAGC_B_MCS11_MCS08) {
447 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][12] =
448 data;
415 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 449 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
416 "MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n", 450 "MCSTxPowerLevelOriginalOffset[%d][12] = 0x%x\n",
417 rtlphy->pwrgroup_cnt, 451 rtlphy->pwrgroup_cnt,
418 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][12]); 452 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
419 break; 453 pwrgroup_cnt][12]);
420 case RTXAGC_B_MCS15_MCS12: 454 }
421 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][13] = data; 455 if (regaddr == RTXAGC_B_MCS15_MCS12) {
456 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->pwrgroup_cnt][13] =
457 data;
422 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 458 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
423 "MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n", 459 "MCSTxPowerLevelOriginalOffset[%d][13] = 0x%x\n",
424 rtlphy->pwrgroup_cnt, 460 rtlphy->pwrgroup_cnt,
425 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][13]); 461 rtlphy->mcs_txpwrlevel_origoffset[rtlphy->
462 pwrgroup_cnt][13]);
463
426 rtlphy->pwrgroup_cnt++; 464 rtlphy->pwrgroup_cnt++;
427 break;
428 } 465 }
429} 466}
430 467
431static bool _phy_cfg_bb_w_pgheader(struct ieee80211_hw *hw, u8 configtype) 468static bool _rtl8723e_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
469 u8 configtype)
432{ 470{
433 struct rtl_priv *rtlpriv = rtl_priv(hw); 471 struct rtl_priv *rtlpriv = rtl_priv(hw);
434 int i; 472 int i;
@@ -440,11 +478,23 @@ static bool _phy_cfg_bb_w_pgheader(struct ieee80211_hw *hw, u8 configtype)
440 478
441 if (configtype == BASEBAND_CONFIG_PHY_REG) { 479 if (configtype == BASEBAND_CONFIG_PHY_REG) {
442 for (i = 0; i < phy_regarray_pg_len; i = i + 3) { 480 for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
443 rtl_addr_delay(phy_regarray_table_pg[i]); 481 if (phy_regarray_table_pg[i] == 0xfe)
444 482 mdelay(50);
445 _st_pwrIdx_dfrate_off(hw, phy_regarray_table_pg[i], 483 else if (phy_regarray_table_pg[i] == 0xfd)
446 phy_regarray_table_pg[i + 1], 484 mdelay(5);
447 phy_regarray_table_pg[i + 2]); 485 else if (phy_regarray_table_pg[i] == 0xfc)
486 mdelay(1);
487 else if (phy_regarray_table_pg[i] == 0xfb)
488 udelay(50);
489 else if (phy_regarray_table_pg[i] == 0xfa)
490 udelay(5);
491 else if (phy_regarray_table_pg[i] == 0xf9)
492 udelay(1);
493
494 store_pwrindex_diffrate_offset(hw,
495 phy_regarray_table_pg[i],
496 phy_regarray_table_pg[i + 1],
497 phy_regarray_table_pg[i + 2]);
448 } 498 }
449 } else { 499 } else {
450 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, 500 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
@@ -453,45 +503,57 @@ static bool _phy_cfg_bb_w_pgheader(struct ieee80211_hw *hw, u8 configtype)
453 return true; 503 return true;
454} 504}
455 505
456bool rtl8723ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 506bool rtl8723e_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
457 enum radio_path rfpath) 507 enum radio_path rfpath)
458{ 508{
459 struct rtl_priv *rtlpriv = rtl_priv(hw);
460 int i; 509 int i;
510 bool rtstatus = true;
461 u32 *radioa_array_table; 511 u32 *radioa_array_table;
462 u16 radioa_arraylen; 512 u32 *radiob_array_table;
513 u16 radioa_arraylen, radiob_arraylen;
463 514
464 radioa_arraylen = Rtl8723ERADIOA_1TARRAYLENGTH; 515 radioa_arraylen = RTL8723ERADIOA_1TARRAYLENGTH;
465 radioa_array_table = RTL8723E_RADIOA_1TARRAY; 516 radioa_array_table = RTL8723E_RADIOA_1TARRAY;
517 radiob_arraylen = RTL8723E_RADIOB_1TARRAYLENGTH;
518 radiob_array_table = RTL8723E_RADIOB_1TARRAY;
519
520 rtstatus = true;
466 521
467 switch (rfpath) { 522 switch (rfpath) {
468 case RF90_PATH_A: 523 case RF90_PATH_A:
469 for (i = 0; i < radioa_arraylen; i = i + 2) { 524 for (i = 0; i < radioa_arraylen; i = i + 2) {
470 rtl_rfreg_delay(hw, rfpath, radioa_array_table[i], 525 if (radioa_array_table[i] == 0xfe) {
471 RFREG_OFFSET_MASK, 526 mdelay(50);
472 radioa_array_table[i + 1]); 527 } else if (radioa_array_table[i] == 0xfd) {
528 mdelay(5);
529 } else if (radioa_array_table[i] == 0xfc) {
530 mdelay(1);
531 } else if (radioa_array_table[i] == 0xfb) {
532 udelay(50);
533 } else if (radioa_array_table[i] == 0xfa) {
534 udelay(5);
535 } else if (radioa_array_table[i] == 0xf9) {
536 udelay(1);
537 } else {
538 rtl_set_rfreg(hw, rfpath, radioa_array_table[i],
539 RFREG_OFFSET_MASK,
540 radioa_array_table[i + 1]);
541 udelay(1);
542 }
473 } 543 }
474 break; 544 break;
475 case RF90_PATH_B: 545 case RF90_PATH_B:
476 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
477 "switch case not process\n");
478 break;
479 case RF90_PATH_C: 546 case RF90_PATH_C:
480 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
481 "switch case not process\n");
482 break;
483 case RF90_PATH_D: 547 case RF90_PATH_D:
484 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
485 "switch case not process\n");
486 break; 548 break;
487 } 549 }
488 return true; 550 return true;
489} 551}
490 552
491void rtl8723ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw) 553void rtl8723e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
492{ 554{
493 struct rtl_priv *rtlpriv = rtl_priv(hw); 555 struct rtl_priv *rtlpriv = rtl_priv(hw);
494 struct rtl_phy *rtlphy = &(rtlpriv->phy); 556 struct rtl_phy *rtlphy = &rtlpriv->phy;
495 557
496 rtlphy->default_initialgain[0] = 558 rtlphy->default_initialgain[0] =
497 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0); 559 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
@@ -504,10 +566,10 @@ void rtl8723ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
504 566
505 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 567 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
506 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n", 568 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
507 rtlphy->default_initialgain[0], 569 rtlphy->default_initialgain[0],
508 rtlphy->default_initialgain[1], 570 rtlphy->default_initialgain[1],
509 rtlphy->default_initialgain[2], 571 rtlphy->default_initialgain[2],
510 rtlphy->default_initialgain[3]); 572 rtlphy->default_initialgain[3]);
511 573
512 rtlphy->framesync = (u8) rtl_get_bbreg(hw, 574 rtlphy->framesync = (u8) rtl_get_bbreg(hw,
513 ROFDM0_RXDETECTOR3, MASKBYTE0); 575 ROFDM0_RXDETECTOR3, MASKBYTE0);
@@ -516,37 +578,43 @@ void rtl8723ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
516 578
517 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 579 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
518 "Default framesync (0x%x) = 0x%x\n", 580 "Default framesync (0x%x) = 0x%x\n",
519 ROFDM0_RXDETECTOR3, rtlphy->framesync); 581 ROFDM0_RXDETECTOR3, rtlphy->framesync);
520} 582}
521 583
522void rtl8723ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel) 584void rtl8723e_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
523{ 585{
524 struct rtl_priv *rtlpriv = rtl_priv(hw); 586 struct rtl_priv *rtlpriv = rtl_priv(hw);
525 struct rtl_phy *rtlphy = &(rtlpriv->phy); 587 struct rtl_phy *rtlphy = &rtlpriv->phy;
526 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 588 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
527 u8 txpwr_level; 589 u8 txpwr_level;
528 long txpwr_dbm; 590 long txpwr_dbm;
529 591
530 txpwr_level = rtlphy->cur_cck_txpwridx; 592 txpwr_level = rtlphy->cur_cck_txpwridx;
531 txpwr_dbm = rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B, txpwr_level); 593 txpwr_dbm = rtl8723_phy_txpwr_idx_to_dbm(hw,
594 WIRELESS_MODE_B, txpwr_level);
532 txpwr_level = rtlphy->cur_ofdm24g_txpwridx + 595 txpwr_level = rtlphy->cur_ofdm24g_txpwridx +
533 rtlefuse->legacy_ht_txpowerdiff; 596 rtlefuse->legacy_ht_txpowerdiff;
534 if (rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) > txpwr_dbm) 597 if (rtl8723_phy_txpwr_idx_to_dbm(hw,
535 txpwr_dbm = rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, 598 WIRELESS_MODE_G,
536 txpwr_level); 599 txpwr_level) > txpwr_dbm)
600 txpwr_dbm =
601 rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
602 txpwr_level);
537 txpwr_level = rtlphy->cur_ofdm24g_txpwridx; 603 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
538 if (rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G, txpwr_level) > 604 if (rtl8723_phy_txpwr_idx_to_dbm(hw,
539 txpwr_dbm) 605 WIRELESS_MODE_N_24G,
540 txpwr_dbm = rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G, 606 txpwr_level) > txpwr_dbm)
541 txpwr_level); 607 txpwr_dbm =
608 rtl8723_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
609 txpwr_level);
542 *powerlevel = txpwr_dbm; 610 *powerlevel = txpwr_dbm;
543} 611}
544 612
545static void _rtl8723ae_get_txpower_index(struct ieee80211_hw *hw, u8 channel, 613static void _rtl8723e_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
546 u8 *cckpowerlevel, u8 *ofdmpowerlevel) 614 u8 *cckpowerlevel, u8 *ofdmpowerlevel)
547{ 615{
548 struct rtl_priv *rtlpriv = rtl_priv(hw); 616 struct rtl_priv *rtlpriv = rtl_priv(hw);
549 struct rtl_phy *rtlphy = &(rtlpriv->phy); 617 struct rtl_phy *rtlphy = &rtlpriv->phy;
550 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 618 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
551 u8 index = (channel - 1); 619 u8 index = (channel - 1);
552 620
@@ -567,66 +635,70 @@ static void _rtl8723ae_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
567 } 635 }
568} 636}
569 637
570static void _rtl8723ae_ccxpower_index_check(struct ieee80211_hw *hw, 638static void _rtl8723e_ccxpower_index_check(struct ieee80211_hw *hw,
571 u8 channel, u8 *cckpowerlevel, 639 u8 channel, u8 *cckpowerlevel,
572 u8 *ofdmpowerlevel) 640 u8 *ofdmpowerlevel)
573{ 641{
574 struct rtl_priv *rtlpriv = rtl_priv(hw); 642 struct rtl_priv *rtlpriv = rtl_priv(hw);
575 struct rtl_phy *rtlphy = &(rtlpriv->phy); 643 struct rtl_phy *rtlphy = &rtlpriv->phy;
576 644
577 rtlphy->cur_cck_txpwridx = cckpowerlevel[0]; 645 rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
578 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0]; 646 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
647
579} 648}
580 649
581void rtl8723ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel) 650void rtl8723e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
582{ 651{
583 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 652 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
584 u8 cckpowerlevel[2], ofdmpowerlevel[2]; 653 u8 cckpowerlevel[2], ofdmpowerlevel[2];
585 654
586 if (rtlefuse->txpwr_fromeprom == false) 655 if (rtlefuse->txpwr_fromeprom == false)
587 return; 656 return;
588 _rtl8723ae_get_txpower_index(hw, channel, &cckpowerlevel[0], 657 _rtl8723e_get_txpower_index(hw, channel,
589 &ofdmpowerlevel[0]); 658 &cckpowerlevel[0], &ofdmpowerlevel[0]);
590 _rtl8723ae_ccxpower_index_check(hw, channel, &cckpowerlevel[0], 659 _rtl8723e_ccxpower_index_check(hw,
591 &ofdmpowerlevel[0]); 660 channel, &cckpowerlevel[0],
592 rtl8723ae_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]); 661 &ofdmpowerlevel[0]);
593 rtl8723ae_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel); 662 rtl8723e_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
663 rtl8723e_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
594} 664}
595 665
596bool rtl8723ae_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm) 666bool rtl8723e_phy_update_txpower_dbm(struct ieee80211_hw *hw, long power_indbm)
597{ 667{
598 struct rtl_priv *rtlpriv = rtl_priv(hw); 668 struct rtl_priv *rtlpriv = rtl_priv(hw);
599 struct rtl_phy *rtlphy = &(rtlpriv->phy); 669 struct rtl_phy *rtlphy = &rtlpriv->phy;
600 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 670 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
601 u8 idx; 671 u8 idx;
602 u8 rf_path; 672 u8 rf_path;
603 u8 ccktxpwridx = _phy_dbm_to_txpwr_Idx(hw, WIRELESS_MODE_B, 673 u8 ccktxpwridx = _rtl8723e_phy_dbm_to_txpwr_idx(hw,
604 power_indbm); 674 WIRELESS_MODE_B,
605 u8 ofdmtxpwridx = _phy_dbm_to_txpwr_Idx(hw, WIRELESS_MODE_N_24G, 675 power_indbm);
606 power_indbm); 676 u8 ofdmtxpwridx = _rtl8723e_phy_dbm_to_txpwr_idx(hw,
677 WIRELESS_MODE_N_24G,
678 power_indbm);
607 if (ofdmtxpwridx - rtlefuse->legacy_ht_txpowerdiff > 0) 679 if (ofdmtxpwridx - rtlefuse->legacy_ht_txpowerdiff > 0)
608 ofdmtxpwridx -= rtlefuse->legacy_ht_txpowerdiff; 680 ofdmtxpwridx -= rtlefuse->legacy_ht_txpowerdiff;
609 else 681 else
610 ofdmtxpwridx = 0; 682 ofdmtxpwridx = 0;
611 RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE, 683 RT_TRACE(rtlpriv, COMP_TXAGC, DBG_TRACE,
612 "%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n", 684 "%lx dBm, ccktxpwridx = %d, ofdmtxpwridx = %d\n",
613 power_indbm, ccktxpwridx, ofdmtxpwridx); 685 power_indbm, ccktxpwridx, ofdmtxpwridx);
614 for (idx = 0; idx < 14; idx++) { 686 for (idx = 0; idx < 14; idx++) {
615 for (rf_path = 0; rf_path < 2; rf_path++) { 687 for (rf_path = 0; rf_path < 2; rf_path++) {
616 rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx; 688 rtlefuse->txpwrlevel_cck[rf_path][idx] = ccktxpwridx;
617 rtlefuse->txpwrlevel_ht40_1s[rf_path][idx] = 689 rtlefuse->txpwrlevel_ht40_1s[rf_path][idx] =
618 ofdmtxpwridx; 690 ofdmtxpwridx;
619 rtlefuse->txpwrlevel_ht40_2s[rf_path][idx] = 691 rtlefuse->txpwrlevel_ht40_2s[rf_path][idx] =
620 ofdmtxpwridx; 692 ofdmtxpwridx;
621 } 693 }
622 } 694 }
623 rtl8723ae_phy_set_txpower_level(hw, rtlphy->current_channel); 695 rtl8723e_phy_set_txpower_level(hw, rtlphy->current_channel);
624 return true; 696 return true;
625} 697}
626 698
627static u8 _phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw, 699static u8 _rtl8723e_phy_dbm_to_txpwr_idx(struct ieee80211_hw *hw,
628 enum wireless_mode wirelessmode, 700 enum wireless_mode wirelessmode,
629 long power_indbm) 701 long power_indbm)
630{ 702{
631 u8 txpwridx; 703 u8 txpwridx;
632 long offset; 704 long offset;
@@ -645,7 +717,7 @@ static u8 _phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
645 } 717 }
646 718
647 if ((power_indbm - offset) > 0) 719 if ((power_indbm - offset) > 0)
648 txpwridx = (u8) ((power_indbm - offset) * 2); 720 txpwridx = (u8)((power_indbm - offset) * 2);
649 else 721 else
650 txpwridx = 0; 722 txpwridx = 0;
651 723
@@ -655,19 +727,48 @@ static u8 _phy_dbm_to_txpwr_Idx(struct ieee80211_hw *hw,
655 return txpwridx; 727 return txpwridx;
656} 728}
657 729
658void rtl8723ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw) 730void rtl8723e_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
659{ 731{
660 struct rtl_priv *rtlpriv = rtl_priv(hw); 732 struct rtl_priv *rtlpriv = rtl_priv(hw);
661 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 733 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
662 struct rtl_phy *rtlphy = &(rtlpriv->phy); 734 enum io_type iotype;
735
736 if (!is_hal_stop(rtlhal)) {
737 switch (operation) {
738 case SCAN_OPT_BACKUP_BAND0:
739 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
740 rtlpriv->cfg->ops->set_hw_reg(hw,
741 HW_VAR_IO_CMD,
742 (u8 *)&iotype);
743
744 break;
745 case SCAN_OPT_RESTORE:
746 iotype = IO_CMD_RESUME_DM_BY_SCAN;
747 rtlpriv->cfg->ops->set_hw_reg(hw,
748 HW_VAR_IO_CMD,
749 (u8 *)&iotype);
750 break;
751 default:
752 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
753 "Unknown Scan Backup operation.\n");
754 break;
755 }
756 }
757}
758
759void rtl8723e_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
760{
761 struct rtl_priv *rtlpriv = rtl_priv(hw);
762 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
763 struct rtl_phy *rtlphy = &rtlpriv->phy;
663 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 764 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
664 u8 reg_bw_opmode; 765 u8 reg_bw_opmode;
665 u8 reg_prsr_rsc; 766 u8 reg_prsr_rsc;
666 767
667 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 768 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
668 "Switch to %s bandwidth\n", 769 "Switch to %s bandwidth\n",
669 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? 770 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
670 "20MHz" : "40MHz"); 771 "20MHz" : "40MHz");
671 772
672 if (is_hal_stop(rtlhal)) { 773 if (is_hal_stop(rtlhal)) {
673 rtlphy->set_bwmode_inprogress = false; 774 rtlphy->set_bwmode_inprogress = false;
@@ -719,16 +820,16 @@ void rtl8723ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
719 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw); 820 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
720 break; 821 break;
721 } 822 }
722 rtl8723ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw); 823 rtl8723e_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
723 rtlphy->set_bwmode_inprogress = false; 824 rtlphy->set_bwmode_inprogress = false;
724 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n"); 825 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
725} 826}
726 827
727void rtl8723ae_phy_set_bw_mode(struct ieee80211_hw *hw, 828void rtl8723e_phy_set_bw_mode(struct ieee80211_hw *hw,
728 enum nl80211_channel_type ch_type) 829 enum nl80211_channel_type ch_type)
729{ 830{
730 struct rtl_priv *rtlpriv = rtl_priv(hw); 831 struct rtl_priv *rtlpriv = rtl_priv(hw);
731 struct rtl_phy *rtlphy = &(rtlpriv->phy); 832 struct rtl_phy *rtlphy = &rtlpriv->phy;
732 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 833 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
733 u8 tmp_bw = rtlphy->current_chan_bw; 834 u8 tmp_bw = rtlphy->current_chan_bw;
734 835
@@ -736,20 +837,20 @@ void rtl8723ae_phy_set_bw_mode(struct ieee80211_hw *hw,
736 return; 837 return;
737 rtlphy->set_bwmode_inprogress = true; 838 rtlphy->set_bwmode_inprogress = true;
738 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { 839 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
739 rtl8723ae_phy_set_bw_mode_callback(hw); 840 rtl8723e_phy_set_bw_mode_callback(hw);
740 } else { 841 } else {
741 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 842 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
742 "FALSE driver sleep or unload\n"); 843 "false driver sleep or unload\n");
743 rtlphy->set_bwmode_inprogress = false; 844 rtlphy->set_bwmode_inprogress = false;
744 rtlphy->current_chan_bw = tmp_bw; 845 rtlphy->current_chan_bw = tmp_bw;
745 } 846 }
746} 847}
747 848
748void rtl8723ae_phy_sw_chnl_callback(struct ieee80211_hw *hw) 849void rtl8723e_phy_sw_chnl_callback(struct ieee80211_hw *hw)
749{ 850{
750 struct rtl_priv *rtlpriv = rtl_priv(hw); 851 struct rtl_priv *rtlpriv = rtl_priv(hw);
751 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 852 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
752 struct rtl_phy *rtlphy = &(rtlpriv->phy); 853 struct rtl_phy *rtlphy = &rtlpriv->phy;
753 u32 delay; 854 u32 delay;
754 855
755 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 856 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
@@ -759,7 +860,7 @@ void rtl8723ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
759 do { 860 do {
760 if (!rtlphy->sw_chnl_inprogress) 861 if (!rtlphy->sw_chnl_inprogress)
761 break; 862 break;
762 if (!_phy_sw_chnl_step_by_step 863 if (!_rtl8723e_phy_sw_chnl_step_by_step
763 (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage, 864 (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
764 &rtlphy->sw_chnl_step, &delay)) { 865 &rtlphy->sw_chnl_step, &delay)) {
765 if (delay > 0) 866 if (delay > 0)
@@ -771,13 +872,13 @@ void rtl8723ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
771 } 872 }
772 break; 873 break;
773 } while (true); 874 } while (true);
774 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n"); 875 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
775} 876}
776 877
777u8 rtl8723ae_phy_sw_chnl(struct ieee80211_hw *hw) 878u8 rtl8723e_phy_sw_chnl(struct ieee80211_hw *hw)
778{ 879{
779 struct rtl_priv *rtlpriv = rtl_priv(hw); 880 struct rtl_priv *rtlpriv = rtl_priv(hw);
780 struct rtl_phy *rtlphy = &(rtlpriv->phy); 881 struct rtl_phy *rtlphy = &rtlpriv->phy;
781 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 882 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
782 883
783 if (rtlphy->sw_chnl_inprogress) 884 if (rtlphy->sw_chnl_inprogress)
@@ -790,9 +891,9 @@ u8 rtl8723ae_phy_sw_chnl(struct ieee80211_hw *hw)
790 rtlphy->sw_chnl_stage = 0; 891 rtlphy->sw_chnl_stage = 0;
791 rtlphy->sw_chnl_step = 0; 892 rtlphy->sw_chnl_step = 0;
792 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { 893 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
793 rtl8723ae_phy_sw_chnl_callback(hw); 894 rtl8723e_phy_sw_chnl_callback(hw);
794 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD, 895 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
795 "sw_chnl_inprogress false schedule workitem\n"); 896 "sw_chnl_inprogress false schdule workitem\n");
796 rtlphy->sw_chnl_inprogress = false; 897 rtlphy->sw_chnl_inprogress = false;
797 } else { 898 } else {
798 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD, 899 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
@@ -802,31 +903,33 @@ u8 rtl8723ae_phy_sw_chnl(struct ieee80211_hw *hw)
802 return 1; 903 return 1;
803} 904}
804 905
805static void _rtl8723ae_phy_sw_rf_seting(struct ieee80211_hw *hw, u8 channel) 906static void _rtl8723e_phy_sw_rf_seting(struct ieee80211_hw *hw, u8 channel)
806{ 907{
807 struct rtl_priv *rtlpriv = rtl_priv(hw); 908 struct rtl_priv *rtlpriv = rtl_priv(hw);
808 struct rtl_phy *rtlphy = &(rtlpriv->phy); 909 struct rtl_phy *rtlphy = &rtlpriv->phy;
809 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 910 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
810 911
811 if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) { 912 if (IS_81xxC_VENDOR_UMC_B_CUT(rtlhal->version)) {
812 if (channel == 6 && rtlphy->current_chan_bw == 913 if (channel == 6 && rtlphy->current_chan_bw ==
813 HT_CHANNEL_WIDTH_20) 914 HT_CHANNEL_WIDTH_20)
814 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 915 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1,
815 0x00255); 916 MASKDWORD, 0x00255);
816 else{ 917 else{
817 u32 backupRF0x1A = (u32)rtl_get_rfreg(hw, RF90_PATH_A, 918 u32 backuprf0x1a = (u32)rtl_get_rfreg(hw,
818 RF_RX_G1, RFREG_OFFSET_MASK); 919 RF90_PATH_A, RF_RX_G1,
819 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1, MASKDWORD, 920 RFREG_OFFSET_MASK);
820 backupRF0x1A); 921 rtl_set_rfreg(hw, RF90_PATH_A, RF_RX_G1,
922 MASKDWORD, backuprf0x1a);
821 } 923 }
822 } 924 }
823} 925}
824 926
825static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel, 927static bool _rtl8723e_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
826 u8 *stage, u8 *step, u32 *delay) 928 u8 channel, u8 *stage, u8 *step,
929 u32 *delay)
827{ 930{
828 struct rtl_priv *rtlpriv = rtl_priv(hw); 931 struct rtl_priv *rtlpriv = rtl_priv(hw);
829 struct rtl_phy *rtlphy = &(rtlpriv->phy); 932 struct rtl_phy *rtlphy = &rtlpriv->phy;
830 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT]; 933 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
831 u32 precommoncmdcnt; 934 u32 precommoncmdcnt;
832 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT]; 935 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
@@ -839,14 +942,16 @@ static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel,
839 942
840 precommoncmdcnt = 0; 943 precommoncmdcnt = 0;
841 rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++, 944 rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
842 MAX_PRECMD_CNT, CMDID_SET_TXPOWEROWER_LEVEL, 945 MAX_PRECMD_CNT,
843 0, 0, 0); 946 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
844 rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++, 947 rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
845 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0); 948 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
949
846 postcommoncmdcnt = 0; 950 postcommoncmdcnt = 0;
847 951
848 rtl8723_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++, 952 rtl8723_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
849 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0); 953 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
954
850 rfdependcmdcnt = 0; 955 rfdependcmdcnt = 0;
851 956
852 RT_ASSERT((channel >= 1 && channel <= 14), 957 RT_ASSERT((channel >= 1 && channel <= 14),
@@ -854,10 +959,11 @@ static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel,
854 959
855 rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++, 960 rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
856 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG, 961 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
857 RF_CHNLBW, channel, 10); 962 RF_CHNLBW, channel, 10);
858 963
859 rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++, 964 rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
860 MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0, 0); 965 MAX_RFDEPENDCMD_CNT, CMDID_END, 0, 0,
966 0);
861 967
862 do { 968 do {
863 switch (*stage) { 969 switch (*stage) {
@@ -870,6 +976,10 @@ static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel,
870 case 2: 976 case 2:
871 currentcmd = &postcommoncmd[*step]; 977 currentcmd = &postcommoncmd[*step];
872 break; 978 break;
979 default:
980 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
981 "Invalid 'stage' = %d, Check it!\n", *stage);
982 return true;
873 } 983 }
874 984
875 if (currentcmd->cmdid == CMDID_END) { 985 if (currentcmd->cmdid == CMDID_END) {
@@ -884,7 +994,7 @@ static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel,
884 994
885 switch (currentcmd->cmdid) { 995 switch (currentcmd->cmdid) {
886 case CMDID_SET_TXPOWEROWER_LEVEL: 996 case CMDID_SET_TXPOWEROWER_LEVEL:
887 rtl8723ae_phy_set_txpower_level(hw, channel); 997 rtl8723e_phy_set_txpower_level(hw, channel);
888 break; 998 break;
889 case CMDID_WRITEPORT_ULONG: 999 case CMDID_WRITEPORT_ULONG:
890 rtl_write_dword(rtlpriv, currentcmd->para1, 1000 rtl_write_dword(rtlpriv, currentcmd->para1,
@@ -909,10 +1019,10 @@ static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel,
909 RFREG_OFFSET_MASK, 1019 RFREG_OFFSET_MASK,
910 rtlphy->rfreg_chnlval[rfpath]); 1020 rtlphy->rfreg_chnlval[rfpath]);
911 } 1021 }
912 _rtl8723ae_phy_sw_rf_seting(hw, channel); 1022 _rtl8723e_phy_sw_rf_seting(hw, channel);
913 break; 1023 break;
914 default: 1024 default:
915 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1025 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
916 "switch case not process\n"); 1026 "switch case not process\n");
917 break; 1027 break;
918 } 1028 }
@@ -925,7 +1035,7 @@ static bool _phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, u8 channel,
925 return false; 1035 return false;
926} 1036}
927 1037
928static u8 _rtl8723ae_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb) 1038static u8 _rtl8723e_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
929{ 1039{
930 u32 reg_eac, reg_e94, reg_e9c, reg_ea4; 1040 u32 reg_eac, reg_e94, reg_e9c, reg_ea4;
931 u8 result = 0x00; 1041 u8 result = 0x00;
@@ -968,7 +1078,7 @@ static u8 _rtl8723ae_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
968 return result; 1078 return result;
969} 1079}
970 1080
971static u8 _rtl8723ae_phy_path_b_iqk(struct ieee80211_hw *hw) 1081static u8 _rtl8723e_phy_path_b_iqk(struct ieee80211_hw *hw)
972{ 1082{
973 u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc; 1083 u32 reg_eac, reg_eb4, reg_ebc, reg_ec4, reg_ecc;
974 u8 result = 0x00; 1084 u8 result = 0x00;
@@ -995,8 +1105,8 @@ static u8 _rtl8723ae_phy_path_b_iqk(struct ieee80211_hw *hw)
995 return result; 1105 return result;
996} 1106}
997 1107
998static bool phy_simularity_comp(struct ieee80211_hw *hw, long result[][8], 1108static bool _rtl8723e_phy_simularity_compare(struct ieee80211_hw *hw,
999 u8 c1, u8 c2) 1109 long result[][8], u8 c1, u8 c2)
1000{ 1110{
1001 u32 i, j, diff, simularity_bitmap, bound; 1111 u32 i, j, diff, simularity_bitmap, bound;
1002 1112
@@ -1047,11 +1157,11 @@ static bool phy_simularity_comp(struct ieee80211_hw *hw, long result[][8],
1047 1157
1048} 1158}
1049 1159
1050static void _rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw, 1160static void _rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw,
1051 long result[][8], u8 t, bool is2t) 1161 long result[][8], u8 t, bool is2t)
1052{ 1162{
1053 struct rtl_priv *rtlpriv = rtl_priv(hw); 1163 struct rtl_priv *rtlpriv = rtl_priv(hw);
1054 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1164 struct rtl_phy *rtlphy = &rtlpriv->phy;
1055 u32 i; 1165 u32 i;
1056 u8 patha_ok, pathb_ok; 1166 u8 patha_ok, pathb_ok;
1057 u32 adda_reg[IQK_ADDA_REG_NUM] = { 1167 u32 adda_reg[IQK_ADDA_REG_NUM] = {
@@ -1060,22 +1170,28 @@ static void _rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw,
1060 0xe88, 0xe8c, 0xed0, 0xed4, 1170 0xe88, 0xe8c, 0xed0, 0xed4,
1061 0xed8, 0xedc, 0xee0, 0xeec 1171 0xed8, 0xedc, 0xee0, 0xeec
1062 }; 1172 };
1173
1063 u32 iqk_mac_reg[IQK_MAC_REG_NUM] = { 1174 u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1064 0x522, 0x550, 0x551, 0x040 1175 0x522, 0x550, 0x551, 0x040
1065 }; 1176 };
1177
1066 const u32 retrycount = 2; 1178 const u32 retrycount = 2;
1067 1179
1180 u32 bbvalue;
1181
1068 if (t == 0) { 1182 if (t == 0) {
1069 rtl8723_save_adda_registers(hw, adda_reg, rtlphy->adda_backup, 1183 bbvalue = rtl_get_bbreg(hw, 0x800, MASKDWORD);
1070 16); 1184
1185 rtl8723_save_adda_registers(hw, adda_reg,
1186 rtlphy->adda_backup, 16);
1071 rtl8723_phy_save_mac_registers(hw, iqk_mac_reg, 1187 rtl8723_phy_save_mac_registers(hw, iqk_mac_reg,
1072 rtlphy->iqk_mac_backup); 1188 rtlphy->iqk_mac_backup);
1073 } 1189 }
1074 rtl8723_phy_path_adda_on(hw, adda_reg, true, is2t); 1190 rtl8723_phy_path_adda_on(hw, adda_reg, true, is2t);
1075 if (t == 0) { 1191 if (t == 0) {
1076 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw, 1192 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1077 RFPGA0_XA_HSSIPARAMETER1, 1193 RFPGA0_XA_HSSIPARAMETER1,
1078 BIT(8)); 1194 BIT(8));
1079 } 1195 }
1080 1196
1081 if (!rtlphy->rfpi_enable) 1197 if (!rtlphy->rfpi_enable)
@@ -1101,7 +1217,7 @@ static void _rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw,
1101 rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00); 1217 rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
1102 rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800); 1218 rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1103 for (i = 0; i < retrycount; i++) { 1219 for (i = 0; i < retrycount; i++) {
1104 patha_ok = _rtl8723ae_phy_path_a_iqk(hw, is2t); 1220 patha_ok = _rtl8723e_phy_path_a_iqk(hw, is2t);
1105 if (patha_ok == 0x03) { 1221 if (patha_ok == 0x03) {
1106 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) & 1222 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1107 0x3FF0000) >> 16; 1223 0x3FF0000) >> 16;
@@ -1115,7 +1231,8 @@ static void _rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw,
1115 } else if (i == (retrycount - 1) && patha_ok == 0x01) 1231 } else if (i == (retrycount - 1) && patha_ok == 0x01)
1116 1232
1117 result[t][0] = (rtl_get_bbreg(hw, 0xe94, 1233 result[t][0] = (rtl_get_bbreg(hw, 0xe94,
1118 MASKDWORD) & 0x3FF0000) >> 16; 1234 MASKDWORD) & 0x3FF0000) >>
1235 16;
1119 result[t][1] = 1236 result[t][1] =
1120 (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16; 1237 (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 0x3FF0000) >> 16;
1121 1238
@@ -1125,11 +1242,12 @@ static void _rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw,
1125 rtl8723_phy_path_a_standby(hw); 1242 rtl8723_phy_path_a_standby(hw);
1126 rtl8723_phy_path_adda_on(hw, adda_reg, false, is2t); 1243 rtl8723_phy_path_adda_on(hw, adda_reg, false, is2t);
1127 for (i = 0; i < retrycount; i++) { 1244 for (i = 0; i < retrycount; i++) {
1128 pathb_ok = _rtl8723ae_phy_path_b_iqk(hw); 1245 pathb_ok = _rtl8723e_phy_path_b_iqk(hw);
1129 if (pathb_ok == 0x03) { 1246 if (pathb_ok == 0x03) {
1130 result[t][4] = 1247 result[t][4] = (rtl_get_bbreg(hw,
1131 (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) & 1248 0xeb4,
1132 0x3FF0000) >> 16; 1249 MASKDWORD) &
1250 0x3FF0000) >> 16;
1133 result[t][5] = 1251 result[t][5] =
1134 (rtl_get_bbreg(hw, 0xebc, MASKDWORD) & 1252 (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
1135 0x3FF0000) >> 16; 1253 0x3FF0000) >> 16;
@@ -1141,9 +1259,10 @@ static void _rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw,
1141 0x3FF0000) >> 16; 1259 0x3FF0000) >> 16;
1142 break; 1260 break;
1143 } else if (i == (retrycount - 1) && pathb_ok == 0x01) { 1261 } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1144 result[t][4] = 1262 result[t][4] = (rtl_get_bbreg(hw,
1145 (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) & 1263 0xeb4,
1146 0x3FF0000) >> 16; 1264 MASKDWORD) &
1265 0x3FF0000) >> 16;
1147 } 1266 }
1148 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) & 1267 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
1149 0x3FF0000) >> 16; 1268 0x3FF0000) >> 16;
@@ -1166,11 +1285,11 @@ static void _rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw,
1166 } 1285 }
1167} 1286}
1168 1287
1169static void _rtl8723ae_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) 1288static void _rtl8723e_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
1170{ 1289{
1171 struct rtl_priv *rtlpriv = rtl_priv(hw);
1172 u8 tmpreg; 1290 u8 tmpreg;
1173 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal; 1291 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
1292 struct rtl_priv *rtlpriv = rtl_priv(hw);
1174 1293
1175 tmpreg = rtl_read_byte(rtlpriv, 0xd03); 1294 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
1176 1295
@@ -1211,14 +1330,14 @@ static void _rtl8723ae_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
1211 } 1330 }
1212} 1331}
1213 1332
1214static void _rtl8723ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, 1333static void _rtl8723e_phy_set_rfpath_switch(struct ieee80211_hw *hw,
1215 bool bmain, bool is2t) 1334 bool bmain, bool is2t)
1216{ 1335{
1217 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1336 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1218 1337
1219 if (is_hal_stop(rtlhal)) { 1338 if (is_hal_stop(rtlhal)) {
1220 rtl_set_bbreg(hw, REG_LEDCFG0, BIT(23), 0x01); 1339 rtl_set_bbreg(hw, REG_LEDCFG0, BIT(23), 0x01);
1221 rtl_set_bbreg(hw, rFPGA0_XAB_RFPARAMETER, BIT(13), 0x01); 1340 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
1222 } 1341 }
1223 if (is2t) { 1342 if (is2t) {
1224 if (bmain) 1343 if (bmain)
@@ -1234,21 +1353,23 @@ static void _rtl8723ae_phy_set_rfpath_switch(struct ieee80211_hw *hw,
1234 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1); 1353 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 0x300, 0x1);
1235 1354
1236 } 1355 }
1356
1237} 1357}
1238 1358
1239#undef IQK_ADDA_REG_NUM 1359#undef IQK_ADDA_REG_NUM
1240#undef IQK_DELAY_TIME 1360#undef IQK_DELAY_TIME
1241 1361
1242void rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery) 1362void rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
1243{ 1363{
1244 struct rtl_priv *rtlpriv = rtl_priv(hw); 1364 struct rtl_priv *rtlpriv = rtl_priv(hw);
1245 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1365 struct rtl_phy *rtlphy = &rtlpriv->phy;
1366
1246 long result[4][8]; 1367 long result[4][8];
1247 u8 i, final_candidate; 1368 u8 i, final_candidate;
1248 bool patha_ok, pathb_ok; 1369 bool b_patha_ok, b_pathb_ok;
1249 long reg_e94, reg_e9c, reg_ea4, reg_eb4, reg_ebc, reg_tmp = 0; 1370 long reg_e94, reg_e9c, reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4,
1371 reg_ecc, reg_tmp = 0;
1250 bool is12simular, is13simular, is23simular; 1372 bool is12simular, is13simular, is23simular;
1251 bool start_conttx = false, singletone = false;
1252 u32 iqk_bb_reg[10] = { 1373 u32 iqk_bb_reg[10] = {
1253 ROFDM0_XARXIQIMBALANCE, 1374 ROFDM0_XARXIQIMBALANCE,
1254 ROFDM0_XBRXIQIMBALANCE, 1375 ROFDM0_XBRXIQIMBALANCE,
@@ -1262,13 +1383,12 @@ void rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1262 ROFDM0_RXIQEXTANTA 1383 ROFDM0_RXIQEXTANTA
1263 }; 1384 };
1264 1385
1265 if (recovery) { 1386 if (b_recovery) {
1266 rtl8723_phy_reload_adda_registers(hw, iqk_bb_reg, 1387 rtl8723_phy_reload_adda_registers(hw,
1388 iqk_bb_reg,
1267 rtlphy->iqk_bb_backup, 10); 1389 rtlphy->iqk_bb_backup, 10);
1268 return; 1390 return;
1269 } 1391 }
1270 if (start_conttx || singletone)
1271 return;
1272 for (i = 0; i < 8; i++) { 1392 for (i = 0; i < 8; i++) {
1273 result[0][i] = 0; 1393 result[0][i] = 0;
1274 result[1][i] = 0; 1394 result[1][i] = 0;
@@ -1276,30 +1396,33 @@ void rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1276 result[3][i] = 0; 1396 result[3][i] = 0;
1277 } 1397 }
1278 final_candidate = 0xff; 1398 final_candidate = 0xff;
1279 patha_ok = false; 1399 b_patha_ok = false;
1280 pathb_ok = false; 1400 b_pathb_ok = false;
1281 is12simular = false; 1401 is12simular = false;
1282 is23simular = false; 1402 is23simular = false;
1283 is13simular = false; 1403 is13simular = false;
1284 for (i = 0; i < 3; i++) { 1404 for (i = 0; i < 3; i++) {
1285 _rtl8723ae_phy_iq_calibrate(hw, result, i, false); 1405 _rtl8723e_phy_iq_calibrate(hw, result, i, false);
1286 if (i == 1) { 1406 if (i == 1) {
1287 is12simular = phy_simularity_comp(hw, result, 0, 1); 1407 is12simular =
1408 _rtl8723e_phy_simularity_compare(hw, result, 0, 1);
1288 if (is12simular) { 1409 if (is12simular) {
1289 final_candidate = 0; 1410 final_candidate = 0;
1290 break; 1411 break;
1291 } 1412 }
1292 } 1413 }
1293 if (i == 2) { 1414 if (i == 2) {
1294 is13simular = phy_simularity_comp(hw, result, 0, 2); 1415 is13simular =
1416 _rtl8723e_phy_simularity_compare(hw, result, 0, 2);
1295 if (is13simular) { 1417 if (is13simular) {
1296 final_candidate = 0; 1418 final_candidate = 0;
1297 break; 1419 break;
1298 } 1420 }
1299 is23simular = phy_simularity_comp(hw, result, 1, 2); 1421 is23simular =
1300 if (is23simular) { 1422 _rtl8723e_phy_simularity_compare(hw, result, 1, 2);
1423 if (is23simular)
1301 final_candidate = 1; 1424 final_candidate = 1;
1302 } else { 1425 else {
1303 for (i = 0; i < 8; i++) 1426 for (i = 0; i < 8; i++)
1304 reg_tmp += result[3][i]; 1427 reg_tmp += result[3][i];
1305 1428
@@ -1314,50 +1437,54 @@ void rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1314 reg_e94 = result[i][0]; 1437 reg_e94 = result[i][0];
1315 reg_e9c = result[i][1]; 1438 reg_e9c = result[i][1];
1316 reg_ea4 = result[i][2]; 1439 reg_ea4 = result[i][2];
1440 reg_eac = result[i][3];
1317 reg_eb4 = result[i][4]; 1441 reg_eb4 = result[i][4];
1318 reg_ebc = result[i][5]; 1442 reg_ebc = result[i][5];
1443 reg_ec4 = result[i][6];
1444 reg_ecc = result[i][7];
1319 } 1445 }
1320 if (final_candidate != 0xff) { 1446 if (final_candidate != 0xff) {
1321 rtlphy->reg_e94 = reg_e94 = result[final_candidate][0]; 1447 rtlphy->reg_e94 = reg_e94 = result[final_candidate][0];
1322 rtlphy->reg_e9c = reg_e9c = result[final_candidate][1]; 1448 rtlphy->reg_e9c = reg_e9c = result[final_candidate][1];
1323 reg_ea4 = result[final_candidate][2]; 1449 reg_ea4 = result[final_candidate][2];
1450 reg_eac = result[final_candidate][3];
1324 rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4]; 1451 rtlphy->reg_eb4 = reg_eb4 = result[final_candidate][4];
1325 rtlphy->reg_ebc = reg_ebc = result[final_candidate][5]; 1452 rtlphy->reg_ebc = reg_ebc = result[final_candidate][5];
1326 patha_ok = pathb_ok = true; 1453 reg_ec4 = result[final_candidate][6];
1454 reg_ecc = result[final_candidate][7];
1455 b_patha_ok = true;
1456 b_pathb_ok = true;
1327 } else { 1457 } else {
1328 rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; 1458 rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100;
1329 rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0; 1459 rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;
1330 } 1460 }
1331 if (reg_e94 != 0) /*&&(reg_ea4 != 0) */ 1461 if (reg_e94 != 0)
1332 rtl8723_phy_path_a_fill_iqk_matrix(hw, patha_ok, result, 1462 rtl8723_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
1333 final_candidate, 1463 final_candidate,
1334 (reg_ea4 == 0)); 1464 (reg_ea4 == 0));
1335 rtl8723_save_adda_registers(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 10); 1465 rtl8723_save_adda_registers(hw, iqk_bb_reg,
1466 rtlphy->iqk_bb_backup, 10);
1336} 1467}
1337 1468
1338void rtl8723ae_phy_lc_calibrate(struct ieee80211_hw *hw) 1469void rtl8723e_phy_lc_calibrate(struct ieee80211_hw *hw)
1339{ 1470{
1340 bool start_conttx = false, singletone = false; 1471 _rtl8723e_phy_lc_calibrate(hw, false);
1341
1342 if (start_conttx || singletone)
1343 return;
1344 _rtl8723ae_phy_lc_calibrate(hw, false);
1345} 1472}
1346 1473
1347void rtl8723ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain) 1474void rtl8723e_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
1348{ 1475{
1349 _rtl8723ae_phy_set_rfpath_switch(hw, bmain, false); 1476 _rtl8723e_phy_set_rfpath_switch(hw, bmain, false);
1350} 1477}
1351 1478
1352bool rtl8723ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype) 1479bool rtl8723e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1353{ 1480{
1354 struct rtl_priv *rtlpriv = rtl_priv(hw); 1481 struct rtl_priv *rtlpriv = rtl_priv(hw);
1355 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1482 struct rtl_phy *rtlphy = &rtlpriv->phy;
1356 bool postprocessing = false; 1483 bool postprocessing = false;
1357 1484
1358 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1485 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1359 "-->IO Cmd(%#x), set_io_inprogress(%d)\n", 1486 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
1360 iotype, rtlphy->set_io_inprogress); 1487 iotype, rtlphy->set_io_inprogress);
1361 do { 1488 do {
1362 switch (iotype) { 1489 switch (iotype) {
1363 case IO_CMD_RESUME_DM_BY_SCAN: 1490 case IO_CMD_RESUME_DM_BY_SCAN:
@@ -1365,13 +1492,13 @@ bool rtl8723ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1365 "[IO CMD] Resume DM after scan.\n"); 1492 "[IO CMD] Resume DM after scan.\n");
1366 postprocessing = true; 1493 postprocessing = true;
1367 break; 1494 break;
1368 case IO_CMD_PAUSE_DM_BY_SCAN: 1495 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
1369 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1496 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1370 "[IO CMD] Pause DM before scan.\n"); 1497 "[IO CMD] Pause DM before scan.\n");
1371 postprocessing = true; 1498 postprocessing = true;
1372 break; 1499 break;
1373 default: 1500 default:
1374 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1501 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1375 "switch case not process\n"); 1502 "switch case not process\n");
1376 break; 1503 break;
1377 } 1504 }
@@ -1382,42 +1509,42 @@ bool rtl8723ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1382 } else { 1509 } else {
1383 return false; 1510 return false;
1384 } 1511 }
1385 rtl8723ae_phy_set_io(hw); 1512 rtl8723e_phy_set_io(hw);
1386 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype); 1513 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
1387 return true; 1514 return true;
1388} 1515}
1389 1516
1390static void rtl8723ae_phy_set_io(struct ieee80211_hw *hw) 1517static void rtl8723e_phy_set_io(struct ieee80211_hw *hw)
1391{ 1518{
1392 struct rtl_priv *rtlpriv = rtl_priv(hw); 1519 struct rtl_priv *rtlpriv = rtl_priv(hw);
1393 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1520 struct rtl_phy *rtlphy = &rtlpriv->phy;
1394 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 1521 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
1395 1522
1396 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1523 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1397 "--->Cmd(%#x), set_io_inprogress(%d)\n", 1524 "--->Cmd(%#x), set_io_inprogress(%d)\n",
1398 rtlphy->current_io_type, rtlphy->set_io_inprogress); 1525 rtlphy->current_io_type, rtlphy->set_io_inprogress);
1399 switch (rtlphy->current_io_type) { 1526 switch (rtlphy->current_io_type) {
1400 case IO_CMD_RESUME_DM_BY_SCAN: 1527 case IO_CMD_RESUME_DM_BY_SCAN:
1401 dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1; 1528 dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
1402 rtl8723ae_dm_write_dig(hw); 1529 rtl8723e_dm_write_dig(hw);
1403 rtl8723ae_phy_set_txpower_level(hw, rtlphy->current_channel); 1530 rtl8723e_phy_set_txpower_level(hw, rtlphy->current_channel);
1404 break; 1531 break;
1405 case IO_CMD_PAUSE_DM_BY_SCAN: 1532 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
1406 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue; 1533 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
1407 dm_digtable->cur_igvalue = 0x17; 1534 dm_digtable->cur_igvalue = 0x17;
1408 rtl8723ae_dm_write_dig(hw); 1535 rtl8723e_dm_write_dig(hw);
1409 break; 1536 break;
1410 default: 1537 default:
1411 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1538 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1412 "switch case not process\n"); 1539 "switch case not process\n");
1413 break; 1540 break;
1414 } 1541 }
1415 rtlphy->set_io_inprogress = false; 1542 rtlphy->set_io_inprogress = false;
1416 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 1543 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1417 "<---(%#x)\n", rtlphy->current_io_type); 1544 "(%#x)\n", rtlphy->current_io_type);
1418} 1545}
1419 1546
1420static void rtl8723ae_phy_set_rf_on(struct ieee80211_hw *hw) 1547static void rtl8723e_phy_set_rf_on(struct ieee80211_hw *hw)
1421{ 1548{
1422 struct rtl_priv *rtlpriv = rtl_priv(hw); 1549 struct rtl_priv *rtlpriv = rtl_priv(hw);
1423 1550
@@ -1429,11 +1556,11 @@ static void rtl8723ae_phy_set_rf_on(struct ieee80211_hw *hw)
1429 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 1556 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1430} 1557}
1431 1558
1432static void _rtl8723ae_phy_set_rf_sleep(struct ieee80211_hw *hw) 1559static void _rtl8723e_phy_set_rf_sleep(struct ieee80211_hw *hw)
1433{ 1560{
1434 struct rtl_priv *rtlpriv = rtl_priv(hw);
1435 u32 u4b_tmp; 1561 u32 u4b_tmp;
1436 u8 delay = 5; 1562 u8 delay = 5;
1563 struct rtl_priv *rtlpriv = rtl_priv(hw);
1437 1564
1438 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 1565 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
1439 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00); 1566 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
@@ -1459,45 +1586,47 @@ static void _rtl8723ae_phy_set_rf_sleep(struct ieee80211_hw *hw)
1459 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22); 1586 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
1460} 1587}
1461 1588
1462static bool _rtl8723ae_phy_set_rf_power_state(struct ieee80211_hw *hw, 1589static bool _rtl8723e_phy_set_rf_power_state(struct ieee80211_hw *hw,
1463 enum rf_pwrstate rfpwr_state) 1590 enum rf_pwrstate rfpwr_state)
1464{ 1591{
1465 struct rtl_priv *rtlpriv = rtl_priv(hw); 1592 struct rtl_priv *rtlpriv = rtl_priv(hw);
1466 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 1593 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
1467 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1594 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1468 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1595 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1469 struct rtl8192_tx_ring *ring = NULL;
1470 bool bresult = true; 1596 bool bresult = true;
1471 u8 i, queue_id; 1597 u8 i, queue_id;
1598 struct rtl8192_tx_ring *ring = NULL;
1472 1599
1473 switch (rfpwr_state) { 1600 switch (rfpwr_state) {
1474 case ERFON: 1601 case ERFON:
1475 if ((ppsc->rfpwr_state == ERFOFF) && 1602 if ((ppsc->rfpwr_state == ERFOFF) &&
1476 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) { 1603 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
1477 bool rtstatus; 1604 bool rtstatus;
1478 u32 InitializeCount = 0; 1605 u32 initializecount = 0;
1606
1479 do { 1607 do {
1480 InitializeCount++; 1608 initializecount++;
1481 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 1609 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
1482 "IPS Set eRf nic enable\n"); 1610 "IPS Set eRf nic enable\n");
1483 rtstatus = rtl_ps_enable_nic(hw); 1611 rtstatus = rtl_ps_enable_nic(hw);
1484 } while ((rtstatus != true) && (InitializeCount < 10)); 1612 } while (!rtstatus && (initializecount < 10));
1485 RT_CLEAR_PS_LEVEL(ppsc, 1613 RT_CLEAR_PS_LEVEL(ppsc,
1486 RT_RF_OFF_LEVL_HALT_NIC); 1614 RT_RF_OFF_LEVL_HALT_NIC);
1487 } else { 1615 } else {
1488 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 1616 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
1489 "Set ERFON sleeped:%d ms\n", 1617 "Set ERFON sleeped:%d ms\n",
1490 jiffies_to_msecs(jiffies - 1618 jiffies_to_msecs(jiffies -
1491 ppsc->last_sleep_jiffies)); 1619 ppsc->
1620 last_sleep_jiffies));
1492 ppsc->last_awake_jiffies = jiffies; 1621 ppsc->last_awake_jiffies = jiffies;
1493 rtl8723ae_phy_set_rf_on(hw); 1622 rtl8723e_phy_set_rf_on(hw);
1494 } 1623 }
1495 if (mac->link_state == MAC80211_LINKED) { 1624 if (mac->link_state == MAC80211_LINKED) {
1496 rtlpriv->cfg->ops->led_control(hw, 1625 rtlpriv->cfg->ops->led_control(hw,
1497 LED_CTL_LINK); 1626 LED_CTL_LINK);
1498 } else { 1627 } else {
1499 rtlpriv->cfg->ops->led_control(hw, 1628 rtlpriv->cfg->ops->led_control(hw,
1500 LED_CTL_NO_LINK); 1629 LED_CTL_NO_LINK);
1501 } 1630 }
1502 break; 1631 break;
1503 case ERFOFF: 1632 case ERFOFF:
@@ -1509,10 +1638,10 @@ static bool _rtl8723ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
1509 } else { 1638 } else {
1510 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) { 1639 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
1511 rtlpriv->cfg->ops->led_control(hw, 1640 rtlpriv->cfg->ops->led_control(hw,
1512 LED_CTL_NO_LINK); 1641 LED_CTL_NO_LINK);
1513 } else { 1642 } else {
1514 rtlpriv->cfg->ops->led_control(hw, 1643 rtlpriv->cfg->ops->led_control(hw,
1515 LED_CTL_POWER_OFF); 1644 LED_CTL_POWER_OFF);
1516 } 1645 }
1517 } 1646 }
1518 break; 1647 break;
@@ -1522,7 +1651,8 @@ static bool _rtl8723ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
1522 for (queue_id = 0, i = 0; 1651 for (queue_id = 0, i = 0;
1523 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 1652 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
1524 ring = &pcipriv->dev.tx_ring[queue_id]; 1653 ring = &pcipriv->dev.tx_ring[queue_id];
1525 if (skb_queue_len(&ring->queue) == 0) { 1654 if (queue_id == BEACON_QUEUE ||
1655 skb_queue_len(&ring->queue) == 0) {
1526 queue_id++; 1656 queue_id++;
1527 continue; 1657 continue;
1528 } else { 1658 } else {
@@ -1536,22 +1666,23 @@ static bool _rtl8723ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
1536 } 1666 }
1537 if (i >= MAX_DOZE_WAITING_TIMES_9x) { 1667 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
1538 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1668 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1539 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n", 1669 "ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
1540 MAX_DOZE_WAITING_TIMES_9x, 1670 MAX_DOZE_WAITING_TIMES_9x,
1541 queue_id, 1671 queue_id,
1542 skb_queue_len(&ring->queue)); 1672 skb_queue_len(&ring->queue));
1543 break; 1673 break;
1544 } 1674 }
1545 } 1675 }
1546 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 1676 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
1547 "Set ERFSLEEP awaked:%d ms\n", 1677 "Set ERFSLEEP awaked:%d ms\n",
1548 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies)); 1678 jiffies_to_msecs(jiffies -
1679 ppsc->last_awake_jiffies));
1549 ppsc->last_sleep_jiffies = jiffies; 1680 ppsc->last_sleep_jiffies = jiffies;
1550 _rtl8723ae_phy_set_rf_sleep(hw); 1681 _rtl8723e_phy_set_rf_sleep(hw);
1551 break; 1682 break;
1552 default: 1683 default:
1553 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1684 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1554 "switch case not processed\n"); 1685 "switch case not process\n");
1555 bresult = false; 1686 bresult = false;
1556 break; 1687 break;
1557 } 1688 }
@@ -1560,14 +1691,15 @@ static bool _rtl8723ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
1560 return bresult; 1691 return bresult;
1561} 1692}
1562 1693
1563bool rtl8723ae_phy_set_rf_power_state(struct ieee80211_hw *hw, 1694bool rtl8723e_phy_set_rf_power_state(struct ieee80211_hw *hw,
1564 enum rf_pwrstate rfpwr_state) 1695 enum rf_pwrstate rfpwr_state)
1565{ 1696{
1566 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1697 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1698
1567 bool bresult = false; 1699 bool bresult = false;
1568 1700
1569 if (rfpwr_state == ppsc->rfpwr_state) 1701 if (rfpwr_state == ppsc->rfpwr_state)
1570 return bresult; 1702 return bresult;
1571 bresult = _rtl8723ae_phy_set_rf_power_state(hw, rfpwr_state); 1703 bresult = _rtl8723e_phy_set_rf_power_state(hw, rfpwr_state);
1572 return bresult; 1704 return bresult;
1573} 1705}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h
index cd43139ed332..b85f5c7c5c01 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/phy.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -39,6 +35,7 @@
39#define RT_CANNOT_IO(hw) false 35#define RT_CANNOT_IO(hw) false
40#define HIGHPOWER_RADIOA_ARRAYLEN 22 36#define HIGHPOWER_RADIOA_ARRAYLEN 22
41 37
38#define IQK_ADDA_REG_NUM 16
42#define MAX_TOLERANCE 5 39#define MAX_TOLERANCE 5
43#define IQK_DELAY_TIME 1 40#define IQK_DELAY_TIME 1
44 41
@@ -49,12 +46,15 @@
49 46
50#define LOOP_LIMIT 5 47#define LOOP_LIMIT 5
51#define MAX_STALL_TIME 50 48#define MAX_STALL_TIME 50
52#define AntennaDiversityValue 0x80 49#define ANTENNADIVERSITYVALUE 0x80
53#define MAX_TXPWR_IDX_NMODE_92S 63 50#define MAX_TXPWR_IDX_NMODE_92S 63
54#define Reset_Cnt_Limit 3 51#define Reset_Cnt_Limit 3
55 52
53#define IQK_ADDA_REG_NUM 16
56#define IQK_MAC_REG_NUM 4 54#define IQK_MAC_REG_NUM 4
57 55
56#define IQK_DELAY_TIME 1
57
58#define RF6052_MAX_PATH 2 58#define RF6052_MAX_PATH 2
59 59
60#define CT_OFFSET_MAC_ADDR 0X16 60#define CT_OFFSET_MAC_ADDR 0X16
@@ -166,36 +166,37 @@ struct tx_power_struct {
166 u32 mcs_original_offset[4][16]; 166 u32 mcs_original_offset[4][16];
167}; 167};
168 168
169u32 rtl8723ae_phy_query_rf_reg(struct ieee80211_hw *hw, 169u32 rtl8723e_phy_query_rf_reg(struct ieee80211_hw *hw,
170 enum radio_path rfpath, u32 regaddr,
171 u32 bitmask);
172void rtl8723ae_phy_set_rf_reg(struct ieee80211_hw *hw,
173 enum radio_path rfpath, u32 regaddr, 170 enum radio_path rfpath, u32 regaddr,
174 u32 bitmask, u32 data); 171 u32 bitmask);
175bool rtl8723ae_phy_mac_config(struct ieee80211_hw *hw); 172void rtl8723e_phy_set_rf_reg(struct ieee80211_hw *hw,
176bool rtl8723ae_phy_bb_config(struct ieee80211_hw *hw); 173 enum radio_path rfpath, u32 regaddr,
177bool rtl8723ae_phy_rf_config(struct ieee80211_hw *hw); 174 u32 bitmask, u32 data);
175bool rtl8723e_phy_mac_config(struct ieee80211_hw *hw);
176bool rtl8723e_phy_bb_config(struct ieee80211_hw *hw);
177bool rtl8723e_phy_rf_config(struct ieee80211_hw *hw);
178bool rtl92c_phy_config_rf_with_feaderfile(struct ieee80211_hw *hw, 178bool rtl92c_phy_config_rf_with_feaderfile(struct ieee80211_hw *hw,
179 enum radio_path rfpath); 179 enum radio_path rfpath);
180void rtl8723ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw); 180void rtl8723e_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
181void rtl8723ae_phy_get_txpower_level(struct ieee80211_hw *hw, 181void rtl8723e_phy_get_txpower_level(struct ieee80211_hw *hw,
182 long *powerlevel); 182 long *powerlevel);
183void rtl8723ae_phy_set_txpower_level(struct ieee80211_hw *hw, 183void rtl8723e_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel);
184 u8 channel); 184bool rtl8723e_phy_update_txpower_dbm(struct ieee80211_hw *hw,
185bool rtl8723ae_phy_update_txpower_dbm(struct ieee80211_hw *hw, 185 long power_indbm);
186 long power_indbm); 186void rtl8723e_phy_scan_operation_backup(struct ieee80211_hw *hw,
187void rtl8723ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw); 187 u8 operation);
188void rtl8723ae_phy_set_bw_mode(struct ieee80211_hw *hw, 188void rtl8723e_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
189 enum nl80211_channel_type ch_type); 189void rtl8723e_phy_set_bw_mode(struct ieee80211_hw *hw,
190void rtl8723ae_phy_sw_chnl_callback(struct ieee80211_hw *hw); 190 enum nl80211_channel_type ch_type);
191u8 rtl8723ae_phy_sw_chnl(struct ieee80211_hw *hw); 191void rtl8723e_phy_sw_chnl_callback(struct ieee80211_hw *hw);
192void rtl8723ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery); 192u8 rtl8723e_phy_sw_chnl(struct ieee80211_hw *hw);
193void rtl8723ae_phy_lc_calibrate(struct ieee80211_hw *hw); 193void rtl8723e_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery);
194void rtl8723ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain); 194void rtl8723e_phy_lc_calibrate(struct ieee80211_hw *hw);
195bool rtl8723ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 195void rtl8723e_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
196 enum radio_path rfpath); 196bool rtl8723e_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
197bool rtl8723ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype); 197 enum radio_path rfpath);
198bool rtl8723ae_phy_set_rf_power_state(struct ieee80211_hw *hw, 198bool rtl8723e_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
199 enum rf_pwrstate rfpwr_state); 199bool rtl8723e_phy_set_rf_power_state(struct ieee80211_hw *hw,
200 enum rf_pwrstate rfpwr_state);
200 201
201#endif 202#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.c b/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.c
index df6ca9a57f7f..2f7f81af8a55 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -27,83 +23,90 @@
27 * 23 *
28 *****************************************************************************/ 24 *****************************************************************************/
29 25
30#include "pwrseqcmd.h" 26#include "../pwrseqcmd.h"
31#include "pwrseq.h" 27#include "pwrseq.h"
32 28
33/* drivers should parse arrays below and do the corresponding actions */ 29/* drivers should parse below arrays and do the corresponding actions */
34
35/*3 Power on Array*/ 30/*3 Power on Array*/
36struct wlan_pwr_cfg rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STPS 31struct wlan_pwr_cfg rtl8723A_power_on_flow
37 + RTL8723A_TRANS_END_STPS] = { 32 [RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS +
38 RTL8723A_TRANS_CARDEMU_TO_ACT, 33 RTL8723A_TRANS_END_STEPS] = {
34 RTL8723A_TRANS_CARDEMU_TO_ACT
39 RTL8723A_TRANS_END 35 RTL8723A_TRANS_END
40}; 36};
41 37
42/*3Radio off GPIO Array */ 38/*3Radio off GPIO Array */
43struct wlan_pwr_cfg rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 39struct wlan_pwr_cfg rtl8723A_radio_off_flow
44 + RTL8723A_TRANS_END_STPS] = { 40 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
45 RTL8723A_TRANS_ACT_TO_CARDEMU, 41 RTL8723A_TRANS_END_STEPS] = {
42 RTL8723A_TRANS_ACT_TO_CARDEMU
46 RTL8723A_TRANS_END 43 RTL8723A_TRANS_END
47}; 44};
48 45
49/*3Card Disable Array*/ 46/*3Card Disable Array*/
50struct wlan_pwr_cfg 47struct wlan_pwr_cfg rtl8723A_card_disable_flow
51rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 48 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
52 + RTL8723A_TRANS_CARDEMU_TO_PDN_STPS 49 RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS +
53 + RTL8723A_TRANS_END_STPS] = { 50 RTL8723A_TRANS_END_STEPS] = {
54 RTL8723A_TRANS_ACT_TO_CARDEMU, 51 RTL8723A_TRANS_ACT_TO_CARDEMU
55 RTL8723A_TRANS_CARDEMU_TO_CARDDIS, 52 RTL8723A_TRANS_CARDEMU_TO_CARDDIS
56 RTL8723A_TRANS_END 53 RTL8723A_TRANS_END
57}; 54};
58 55
59/*3 Card Enable Array*/ 56/*3 Card Enable Array*/
60struct wlan_pwr_cfg rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 57struct wlan_pwr_cfg rtl8723A_card_enable_flow
61 + RTL8723A_TRANS_CARDEMU_TO_PDN_STPS 58 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
62 + RTL8723A_TRANS_END_STPS] = { 59 RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS +
63 RTL8723A_TRANS_CARDDIS_TO_CARDEMU, 60 RTL8723A_TRANS_END_STEPS] = {
64 RTL8723A_TRANS_CARDEMU_TO_ACT, 61 RTL8723A_TRANS_CARDDIS_TO_CARDEMU
62 RTL8723A_TRANS_CARDEMU_TO_ACT
65 RTL8723A_TRANS_END 63 RTL8723A_TRANS_END
66}; 64};
67 65
68/*3Suspend Array*/ 66/*3Suspend Array*/
69struct wlan_pwr_cfg rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 67struct wlan_pwr_cfg rtl8723A_suspend_flow
70 + RTL8723A_TRANS_CARDEMU_TO_SUS_STPS 68 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
71 + RTL8723A_TRANS_END_STPS] = { 69 RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS +
72 RTL8723A_TRANS_ACT_TO_CARDEMU, 70 RTL8723A_TRANS_END_STEPS] = {
73 RTL8723A_TRANS_CARDEMU_TO_SUS, 71 RTL8723A_TRANS_ACT_TO_CARDEMU
72 RTL8723A_TRANS_CARDEMU_TO_SUS
74 RTL8723A_TRANS_END 73 RTL8723A_TRANS_END
75}; 74};
76 75
77/*3 Resume Array*/ 76/*3 Resume Array*/
78struct wlan_pwr_cfg rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 77struct wlan_pwr_cfg rtl8723A_resume_flow
79 + RTL8723A_TRANS_CARDEMU_TO_SUS_STPS 78 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
80 + RTL8723A_TRANS_END_STPS] = { 79 RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS +
81 RTL8723A_TRANS_SUS_TO_CARDEMU, 80 RTL8723A_TRANS_END_STEPS] = {
82 RTL8723A_TRANS_CARDEMU_TO_ACT, 81 RTL8723A_TRANS_SUS_TO_CARDEMU
82 RTL8723A_TRANS_CARDEMU_TO_ACT
83 RTL8723A_TRANS_END 83 RTL8723A_TRANS_END
84}; 84};
85 85
86/*3HWPDN Array*/ 86/*3HWPDN Array*/
87struct wlan_pwr_cfg rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 87struct wlan_pwr_cfg rtl8723A_hwpdn_flow
88 + RTL8723A_TRANS_CARDEMU_TO_PDN_STPS 88 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
89 + RTL8723A_TRANS_END_STPS] = { 89 RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS +
90 RTL8723A_TRANS_ACT_TO_CARDEMU, 90 RTL8723A_TRANS_END_STEPS] = {
91 RTL8723A_TRANS_CARDEMU_TO_PDN, 91 RTL8723A_TRANS_ACT_TO_CARDEMU
92 RTL8723A_TRANS_CARDEMU_TO_PDN
92 RTL8723A_TRANS_END 93 RTL8723A_TRANS_END
93}; 94};
94 95
95/*3 Enter LPS */ 96/*3 Enter LPS */
96struct wlan_pwr_cfg rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STPS 97struct wlan_pwr_cfg rtl8723A_enter_lps_flow
97 + RTL8723A_TRANS_END_STPS] = { 98 [RTL8723A_TRANS_ACT_TO_LPS_STEPS +
99 RTL8723A_TRANS_END_STEPS] = {
98 /*FW behavior*/ 100 /*FW behavior*/
99 RTL8723A_TRANS_ACT_TO_LPS, 101 RTL8723A_TRANS_ACT_TO_LPS
100 RTL8723A_TRANS_END 102 RTL8723A_TRANS_END
101}; 103};
102 104
103/*3 Leave LPS */ 105/*3 Leave LPS */
104struct wlan_pwr_cfg rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STPS 106struct wlan_pwr_cfg rtl8723A_leave_lps_flow
105 + RTL8723A_TRANS_END_STPS] = { 107 [RTL8723A_TRANS_LPS_TO_ACT_STEPS +
108 RTL8723A_TRANS_END_STEPS] = {
106 /*FW behavior*/ 109 /*FW behavior*/
107 RTL8723A_TRANS_LPS_TO_ACT, 110 RTL8723A_TRANS_LPS_TO_ACT
108 RTL8723A_TRANS_END 111 RTL8723A_TRANS_END
109}; 112};
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.h b/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.h
index a418acb4d0ca..4ac7db526f15 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseq.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,282 +26,305 @@
30#ifndef __RTL8723E_PWRSEQ_H__ 26#ifndef __RTL8723E_PWRSEQ_H__
31#define __RTL8723E_PWRSEQ_H__ 27#define __RTL8723E_PWRSEQ_H__
32 28
29#include "../pwrseqcmd.h"
33/* 30/*
34 Check document WM-20110607-Paul-RTL8723A_Power_Architecture-R02.vsd 31 * Check document WM-20110607-Paul-RTL8723A_Power_Architecture-R02.vsd
35 There are 6 HW Power States: 32 * There are 6 HW Power States:
36 0: POFF--Power Off 33 * 0: POFF--Power Off
37 1: PDN--Power Down 34 * 1: PDN--Power Down
38 2: CARDEMU--Card Emulation 35 * 2: CARDEMU--Card Emulation
39 3: ACT--Active Mode 36 * 3: ACT--Active Mode
40 4: LPS--Low Power State 37 * 4: LPS--Low Power State
41 5: SUS--Suspend 38 * 5: SUS--Suspend
42 39 *
43 The transision from different states are defined below 40 * The transision from different states are defined below
44 TRANS_CARDEMU_TO_ACT 41 * TRANS_CARDEMU_TO_ACT
45 TRANS_ACT_TO_CARDEMU 42 * TRANS_ACT_TO_CARDEMU
46 TRANS_CARDEMU_TO_SUS 43 * TRANS_CARDEMU_TO_SUS
47 TRANS_SUS_TO_CARDEMU 44 * TRANS_SUS_TO_CARDEMU
48 TRANS_CARDEMU_TO_PDN 45 * TRANS_CARDEMU_TO_PDN
49 TRANS_ACT_TO_LPS 46 * TRANS_ACT_TO_LPS
50 TRANS_LPS_TO_ACT 47 * TRANS_LPS_TO_ACT
48 *
49 * TRANS_END
50 */
51 51
52 TRANS_END 52#define RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS 10
53*/ 53#define RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS 10
54#define RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS 10
55#define RTL8723A_TRANS_SUS_TO_CARDEMU_STEPS 10
56#define RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS 10
57#define RTL8723A_TRANS_PDN_TO_CARDEMU_STEPS 10
58#define RTL8723A_TRANS_ACT_TO_LPS_STEPS 15
59#define RTL8723A_TRANS_LPS_TO_ACT_STEPS 15
60#define RTL8723A_TRANS_END_STEPS 1
54 61
55#define RTL8723A_TRANS_CARDEMU_TO_ACT_STPS 10 62/* format */
56#define RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 10 63/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }*/
57#define RTL8723A_TRANS_CARDEMU_TO_SUS_STPS 10
58#define RTL8723A_TRANS_SUS_TO_CARDEMU_STPS 10
59#define RTL8723A_TRANS_CARDEMU_TO_PDN_STPS 10
60#define RTL8723A_TRANS_PDN_TO_CARDEMU_STPS 10
61#define RTL8723A_TRANS_ACT_TO_LPS_STPS 15
62#define RTL8723A_TRANS_LPS_TO_ACT_STPS 15
63#define RTL8723A_TRANS_END_STPS 1
64 64
65#define RTL8723A_TRANS_CARDEMU_TO_ACT \
66 /* disable SW LPS 0x04[10]=0*/ \
67 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
68 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(2), 0},\
69 /* wait till 0x04[17] = 1 power ready*/ \
70 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
71 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1)},\
72 /* release WLON reset 0x04[16]=1*/ \
73 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
74 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)},\
75 /* disable HWPDN 0x04[15]=0*/ \
76 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
77 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0},\
78 /* disable WL suspend*/ \
79 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
80 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT(4)|BIT(3)), 0},\
81 /* polling until return 0*/ \
82 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
83 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)},\
84 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
85 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0},
65 86
66#define RTL8723A_TRANS_CARDEMU_TO_ACT \ 87/* format */
67 /* format */ \ 88/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
68 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, \
69 * comments here*/ \
70 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
71 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(2), 0}, \
72 /* disable SW LPS 0x04[10]=0*/ \
73 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
74 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1)}, \
75 /* wait till 0x04[17] = 1 power ready*/ \
76 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
77 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
78 /* release WLON reset 0x04[16]=1*/ \
79 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
80 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, \
81 /* disable HWPDN 0x04[15]=0*/ \
82 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
83 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT(4)|BIT(3)), 0}, \
84 /* disable WL suspend*/ \
85 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
86 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
87 /* polling until return 0*/ \
88 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
89 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0}
90 89
91#define RTL8723A_TRANS_ACT_TO_CARDEMU \ 90#define RTL8723A_TRANS_ACT_TO_CARDEMU \
92 /* format */ \ 91 /*0x1F[7:0] = 0 turn off RF*/ \
93 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, \ 92 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
94 * comments here*/ \ 93 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, \
95 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 94 {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
96 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, \ 95 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0},\
97 /*0x1F[7:0] = 0 turn off RF*/ \ 96 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
98 {0x004E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 97 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
99 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, \ 98 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
100 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 99 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0},
101 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
102 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
103 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0}
104 100
105#define RTL8723A_TRANS_CARDEMU_TO_SUS \ 101/* format */
106 /* format */ \ 102/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/
107 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, \ 103#define RTL8723A_TRANS_CARDEMU_TO_SUS \
108 * comments here*/ \
109 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
110 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4)|BIT(3), \
111 (BIT(4)|BIT(3))}, \
112 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ 104 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \
113 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK | \ 105 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
114 PWR_INTF_SDIO_MSK, \ 106 PWR_BASEADDR_MAC, PWR_CMD_WRITE, \
115 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)},\ 107 BIT(4)|BIT(3), (BIT(4)|BIT(3))},\
116 /*0x04[12:11] = 2b'01 enable WL suspend*/ \ 108/*0x04[12:11] = 2b'01 enable WL suspend*/ \
117 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 109 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK| \
118 PWR_BASEADDR_MAC, \ 110 PWR_INTF_SDIO_MSK,\
119 PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)|BIT(4)}, \ 111 PWR_BASEADDR_MAC, \
120 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \ 112 PWR_CMD_WRITE, \
121 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 113 BIT(3)|BIT(4), BIT(3)}, \
122 PWR_BASEADDR_SDIO, \ 114/*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \
123 PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 115 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
124 /*Set SDIO suspend local register*/ \ 116 PWR_INTF_PCI_MSK, PWR_BASEADDR_MAC, \
125 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 117 PWR_CMD_WRITE, BIT(3)|BIT(4), \
126 PWR_BASEADDR_SDIO, \ 118 BIT(3)|BIT(4)}, \
127 PWR_CMD_POLLING, BIT(1), 0} \ 119/*Set SDIO suspend local register*/ \
128 /*wait power state to suspend*/ 120 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
121 PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO,\
122 PWR_CMD_WRITE, BIT(0), BIT(0)}, \
123/*wait power state to suspend*/ \
124 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
125 PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO,\
126 PWR_CMD_POLLING, BIT(1), 0},
127
128/* format */
129/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
130
131#define RTL8723A_TRANS_SUS_TO_CARDEMU \
132 /*Set SDIO suspend local register*/ \
133 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
134 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0},\
135 /*wait power state to suspend*/ \
136 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
137 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)},\
138 /*0x04[12:11] = 2b'01enable WL suspend*/ \
139 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
140 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0},
141
142/* format */
143/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
144
145#define RTL8723A_TRANS_CARDEMU_TO_CARDDIS \
146 /*0x04[12:11] = 2b'01 enable WL suspend*/ \
147 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
148 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \
149 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, \
150/*0x04[10] = 1, enable SW LPS*/ \
151 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
152 PWR_INTF_PCI_MSK, PWR_BASEADDR_MAC,\
153 PWR_CMD_WRITE, BIT(2), BIT(2)}, \
154/*Set SDIO suspend local register*/ \
155 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
156 PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO,\
157 PWR_CMD_WRITE, BIT(0), BIT(0)}, \
158 /*wait power state to suspend*/ \
159 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
160 PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO,\
161 PWR_CMD_POLLING, BIT(1), 0},
162
163/* format */
164/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
129 165
130#define RTL8723A_TRANS_SUS_TO_CARDEMU \ 166#define RTL8723A_TRANS_CARDDIS_TO_CARDEMU\
131 /* format */ \ 167/*Set SDIO suspend local register*/ \
132 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\ 168 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
133 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 169 PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO,\
134 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, \ 170 PWR_CMD_WRITE, BIT(0), 0}, \
135 /*Set SDIO suspend local register*/ \ 171 /*wait power state to suspend*/ \
136 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 172 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
137 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, \ 173 PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO,\
138 /*wait power state to suspend*/ \ 174 PWR_CMD_POLLING, BIT(1), BIT(1)},\
139 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 175 /*0x04[12:11] = 2b'00enable WL suspend*/ \
140 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0} \ 176 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
141 /*0x04[12:11] = 2b'01enable WL suspend*/ 177 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
178 PWR_CMD_WRITE, BIT(3)|BIT(4), 0},\
179/*PCIe DMA start*/ \
180 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
181 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
182 PWR_CMD_WRITE, 0xFF, 0},
142 183
143#define RTL8723A_TRANS_CARDEMU_TO_CARDDIS \ 184/* format */
144 /* format */ \ 185/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
145 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\ 186#define RTL8723A_TRANS_CARDEMU_TO_PDN \
146 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 187 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
147 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK, \ 188 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
148 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)},\ 189 PWR_CMD_WRITE, BIT(0), 0},/* 0x04[16] = 0*/\
149 /*0x04[12:11] = 2b'01 enable WL suspend*/ \ 190 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
150 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 191 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
151 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(2), BIT(2)}, \ 192 PWR_CMD_WRITE, BIT(7), BIT(7)},/* 0x04[15] = 1*/
152 /*0x04[10] = 1, enable SW LPS*/ \
153 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
154 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
155 /*Set SDIO suspend local register*/ \
156 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
157 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0} \
158 /*wait power state to suspend*/
159 193
160#define RTL8723A_TRANS_CARDDIS_TO_CARDEMU \ 194/* format */
161 /* format */ \ 195/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
162 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\ 196#define RTL8723A_TRANS_PDN_TO_CARDEMU \
163 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 197 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
164 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, \ 198 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
165 /*Set SDIO suspend local register*/ \ 199 PWR_CMD_WRITE, BIT(7), 0},/* 0x04[15] = 0*/
166 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
167 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, \
168 /*wait power state to suspend*/ \
169 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
170 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, \
171 /*0x04[12:11] = 2b'00enable WL suspend*/ \
172 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
173 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0} \
174 /*PCIe DMA start*/
175 200
176#define RTL8723A_TRANS_CARDEMU_TO_PDN \ 201/* format */
177 /* format */ \ 202/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
178 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
179 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
180 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \
181 /* 0x04[16] = 0*/\
182 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
183 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)} \
184 /* 0x04[15] = 1*/
185 203
186#define RTL8723A_TRANS_PDN_TO_CARDEMU \ 204#define RTL8723A_TRANS_ACT_TO_LPS \
187 /* format */ \ 205 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
188 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\ 206 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
189 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 207 PWR_CMD_WRITE, 0xFF, 0xFF},/*PCIe DMA stop*/ \
190 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0} \ 208 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
191 /* 0x04[15] = 0*/ 209 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
210 PWR_CMD_WRITE, 0xFF, 0x7F},/*Tx Pause*/ \
211 /*Should be zero if no packet is transmitting*/ \
212 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
213 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
214 PWR_CMD_POLLING, 0xFF, 0},\
215 /*Should be zero if no packet is transmitting*/ \
216 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
217 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
218 PWR_CMD_POLLING, 0xFF, 0},\
219 /*Should be zero if no packet is transmitting*/ \
220 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
221 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
222 PWR_CMD_POLLING, 0xFF, 0},\
223 /*Should be zero if no packet is transmitting*/ \
224 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
225 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
226 PWR_CMD_POLLING, 0xFF, 0},\
227 /*CCK and OFDM are disabled,and clock are gated*/ \
228 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
229 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
230 PWR_CMD_WRITE, BIT(0), 0},\
231 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
232 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
233 PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US},/*Delay 1us*/\
234 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
235 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
236 PWR_CMD_WRITE, BIT(1), 0},/*Whole BB is reset*/ \
237 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
238 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
239 PWR_CMD_WRITE, 0xFF, 0x3F},/*Reset MAC TRX*/ \
240 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
241 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
242 PWR_CMD_WRITE, BIT(1), 0},/*check if removed later*/ \
243 /*Respond TxOK to scheduler*/ \
244 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
245 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
246 PWR_CMD_WRITE, BIT(5), BIT(5)},\
192 247
193#define RTL8723A_TRANS_ACT_TO_LPS \ 248#define RTL8723A_TRANS_LPS_TO_ACT\
194 /* format */ \ 249/* format */ \
195 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\ 250/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */ \
196 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 251 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
197 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \ 252 PWR_INTF_SDIO_MSK, PWR_BASEADDR_SDIO,\
198 /*PCIe DMA stop*/ \ 253 PWR_CMD_WRITE, 0xFF, 0x84}, /*SDIO RPWM*/\
199 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 254 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
200 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x7F}, \ 255 PWR_INTF_USB_MSK, PWR_BASEADDR_MAC,\
201 /*Tx Pause*/ \ 256 PWR_CMD_WRITE, 0xFF, 0x84}, /*USB RPWM*/\
202 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 257 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
203 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 258 PWR_INTF_PCI_MSK, PWR_BASEADDR_MAC,\
204 /*Should be zero if no packet is transmitting*/ \ 259 PWR_CMD_WRITE, 0xFF, 0x84}, /*PCIe RPWM*/\
205 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 260 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
206 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 261 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
207 /*Should be zero if no packet is transmitting*/ \ 262 PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, /*Delay*/\
208 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 263 /*. 0x08[4] = 0 switch TSF to 40M*/\
209 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 264 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
210 /*Should be zero if no packet is transmitting*/ \ 265 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
211 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 266 PWR_CMD_WRITE, BIT(4), 0}, \
212 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 267 /*Polling 0x109[7]=0 TSF in 40M*/\
213 /*Should be zero if no packet is transmitting*/ \ 268 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
214 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 269 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
215 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \ 270 PWR_CMD_POLLING, BIT(7), 0}, \
216 /*CCK and OFDM are disabled,and clock are gated*/ \ 271 /*. 0x29[7:6] = 2b'00 enable BB clock*/\
217 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 272 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
218 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US}, \ 273 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
219 /*Delay 1us*/ \ 274 PWR_CMD_WRITE, BIT(6)|BIT(7), 0},\
220 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 275 /*. 0x101[1] = 1*/\
221 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \ 276 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
222 /*Whole BB is reset*/ \ 277 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
223 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 278 PWR_CMD_WRITE, BIT(1), BIT(1)},\
224 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3F}, \ 279 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/\
225 /*Reset MAC TRX*/ \ 280 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
226 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 281 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
227 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \ 282 PWR_CMD_WRITE, 0xFF, 0xFF},\
228 /*check if removed later*/ \ 283 /*. 0x02[1:0] = 2b'11 enable BB macro*/\
229 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 284 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
230 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), BIT(5)} \ 285 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
231 /*Respond TxOK to scheduler*/ 286 PWR_CMD_WRITE, BIT(1)|BIT(0), BIT(1)|BIT(0)},\
287 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
288 PWR_INTF_ALL_MSK, PWR_BASEADDR_MAC,\
289 PWR_CMD_WRITE, 0xFF, 0}, /*. 0x522 = 0*/
232 290
233#define RTL8723A_TRANS_LPS_TO_ACT \ 291/* format */
234 /* format */ \ 292/* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */
235 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
236 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
237 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84}, \
238 /*SDIO RPWM*/ \
239 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \
240 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, \
241 /*USB RPWM*/ \
242 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
243 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, \
244 /*PCIe RPWM*/ \
245 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
246 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, \
247 /*Delay*/ \
248 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
249 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \
250 /* 0x08[4] = 0 switch TSF to 40M*/ \
251 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
252 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(7), 0}, \
253 /*Polling 0x109[7]=0 TSF in 40M*/ \
254 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
255 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6)|BIT(7), 0}, \
256 /*. 0x29[7:6] = 2b'00 enable BB clock*/ \
257 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
258 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
259 /*. 0x101[1] = 1*/ \
260 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
261 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \
262 /* 0x100[7:0] = 0xFF enable WMAC TRX*/ \
263 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
264 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1)|BIT(0), \
265 BIT(1)|BIT(0)}, \
266 /* 0x02[1:0] = 2b'11 enable BB macro*/ \
267 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
268 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0} \
269 /*. 0x522 = 0*/
270 293
271#define RTL8723A_TRANS_END \ 294#define RTL8723A_TRANS_END \
272 /* format */ \ 295 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
273 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
274 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
275 0, PWR_CMD_END, 0, 0} 296 0, PWR_CMD_END, 0, 0}
276 297
277extern struct 298extern struct wlan_pwr_cfg rtl8723A_power_on_flow
278wlan_pwr_cfg rtl8723A_power_on_flow[RTL8723A_TRANS_CARDEMU_TO_ACT_STPS 299 [RTL8723A_TRANS_CARDEMU_TO_ACT_STEPS +
279 + RTL8723A_TRANS_END_STPS]; 300 RTL8723A_TRANS_END_STEPS];
280extern struct 301extern struct wlan_pwr_cfg rtl8723A_radio_off_flow
281wlan_pwr_cfg rtl8723A_radio_off_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 302 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
282 + RTL8723A_TRANS_END_STPS]; 303 RTL8723A_TRANS_END_STEPS];
283extern struct 304extern struct wlan_pwr_cfg rtl8723A_card_disable_flow
284wlan_pwr_cfg rtl8723A_card_disable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 305 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
285 + RTL8723A_TRANS_CARDEMU_TO_PDN_STPS 306 RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS +
286 + RTL8723A_TRANS_END_STPS]; 307 RTL8723A_TRANS_END_STEPS];
287extern struct 308extern struct wlan_pwr_cfg rtl8723A_card_enable_flow
288wlan_pwr_cfg rtl8723A_card_enable_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 309 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
289 + RTL8723A_TRANS_CARDEMU_TO_PDN_STPS 310 RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS +
290 + RTL8723A_TRANS_END_STPS]; 311 RTL8723A_TRANS_END_STEPS];
291extern struct 312extern struct wlan_pwr_cfg rtl8723A_suspend_flow
292wlan_pwr_cfg rtl8723A_suspend_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 313 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
293 + RTL8723A_TRANS_CARDEMU_TO_SUS_STPS 314 RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS +
294 + RTL8723A_TRANS_END_STPS]; 315 RTL8723A_TRANS_END_STEPS];
295extern struct 316extern struct wlan_pwr_cfg rtl8723A_resume_flow
296wlan_pwr_cfg rtl8723A_resume_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 317 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
297 + RTL8723A_TRANS_CARDEMU_TO_SUS_STPS 318 RTL8723A_TRANS_CARDEMU_TO_SUS_STEPS +
298 + RTL8723A_TRANS_END_STPS]; 319 RTL8723A_TRANS_END_STEPS];
299extern struct 320extern struct wlan_pwr_cfg rtl8723A_hwpdn_flow
300wlan_pwr_cfg rtl8723A_hwpdn_flow[RTL8723A_TRANS_ACT_TO_CARDEMU_STPS 321 [RTL8723A_TRANS_ACT_TO_CARDEMU_STEPS +
301 + RTL8723A_TRANS_CARDEMU_TO_PDN_STPS 322 RTL8723A_TRANS_CARDEMU_TO_PDN_STEPS +
302 + RTL8723A_TRANS_END_STPS]; 323 RTL8723A_TRANS_END_STEPS];
303extern struct 324extern struct wlan_pwr_cfg rtl8723A_enter_lps_flow
304wlan_pwr_cfg rtl8723A_enter_lps_flow[RTL8723A_TRANS_ACT_TO_LPS_STPS 325 [RTL8723A_TRANS_ACT_TO_LPS_STEPS + RTL8723A_TRANS_END_STEPS];
305 + RTL8723A_TRANS_END_STPS]; 326extern struct wlan_pwr_cfg rtl8723A_leave_lps_flow
306extern struct 327 [RTL8723A_TRANS_LPS_TO_ACT_STEPS + RTL8723A_TRANS_END_STEPS];
307wlan_pwr_cfg rtl8723A_leave_lps_flow[RTL8723A_TRANS_LPS_TO_ACT_STPS
308 + RTL8723A_TRANS_END_STPS];
309 328
310/* RTL8723 Power Configuration CMDs for PCIe interface */ 329/* RTL8723 Power Configuration CMDs for PCIe interface */
311#define Rtl8723_NIC_PWR_ON_FLOW rtl8723A_power_on_flow 330#define Rtl8723_NIC_PWR_ON_FLOW rtl8723A_power_on_flow
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseqcmd.c b/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseqcmd.c
deleted file mode 100644
index 2044b5936b7f..000000000000
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/pwrseqcmd.c
+++ /dev/null
@@ -1,129 +0,0 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2012 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE.
20 *
21 * Contact Information:
22 * wlanfae <wlanfae@realtek.com>
23 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
24 * Hsinchu 300, Taiwan.
25 *
26 * Larry Finger <Larry.Finger@lwfinger.net>
27 *
28 *****************************************************************************/
29
30#include "pwrseq.h"
31
32/* Description:
33 * This routine deals with the Power Configuration CMD
34 * parsing for RTL8723/RTL8188E Series IC.
35 * Assumption:
36 * We should follow specific format that was released from HW SD.
37 */
38bool rtl_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
39 u8 faversion, u8 interface_type,
40 struct wlan_pwr_cfg pwrcfgcmd[])
41{
42 struct wlan_pwr_cfg cfg_cmd = {0};
43 bool polling_bit = false;
44 u32 ary_idx = 0;
45 u8 value = 0;
46 u32 offset = 0;
47 u32 polling_count = 0;
48 u32 max_polling_cnt = 5000;
49
50 do {
51 cfg_cmd = pwrcfgcmd[ary_idx];
52 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
53 "rtl_hal_pwrseqcmdparsing(): offset(%#x),cut_msk(%#x), famsk(%#x),"
54 "interface_msk(%#x), base(%#x), cmd(%#x), msk(%#x), value(%#x)\n",
55 GET_PWR_CFG_OFFSET(cfg_cmd),
56 GET_PWR_CFG_CUT_MASK(cfg_cmd),
57 GET_PWR_CFG_FAB_MASK(cfg_cmd),
58 GET_PWR_CFG_INTF_MASK(cfg_cmd),
59 GET_PWR_CFG_BASE(cfg_cmd), GET_PWR_CFG_CMD(cfg_cmd),
60 GET_PWR_CFG_MASK(cfg_cmd), GET_PWR_CFG_VALUE(cfg_cmd));
61
62 if ((GET_PWR_CFG_FAB_MASK(cfg_cmd)&faversion) &&
63 (GET_PWR_CFG_CUT_MASK(cfg_cmd)&cut_version) &&
64 (GET_PWR_CFG_INTF_MASK(cfg_cmd)&interface_type)) {
65 switch (GET_PWR_CFG_CMD(cfg_cmd)) {
66 case PWR_CMD_READ:
67 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
68 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_READ\n");
69 break;
70 case PWR_CMD_WRITE:
71 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
72 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_WRITE\n");
73 offset = GET_PWR_CFG_OFFSET(cfg_cmd);
74
75 /*Read the value from system register*/
76 value = rtl_read_byte(rtlpriv, offset);
77 value &= (~(GET_PWR_CFG_MASK(cfg_cmd)));
78 value |= (GET_PWR_CFG_VALUE(cfg_cmd) &
79 GET_PWR_CFG_MASK(cfg_cmd));
80
81 /*Write the value back to sytem register*/
82 rtl_write_byte(rtlpriv, offset, value);
83 break;
84 case PWR_CMD_POLLING:
85 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
86 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_POLLING\n");
87 polling_bit = false;
88 offset = GET_PWR_CFG_OFFSET(cfg_cmd);
89
90 do {
91 value = rtl_read_byte(rtlpriv, offset);
92
93 value &= GET_PWR_CFG_MASK(cfg_cmd);
94 if (value ==
95 (GET_PWR_CFG_VALUE(cfg_cmd)
96 & GET_PWR_CFG_MASK(cfg_cmd)))
97 polling_bit = true;
98 else
99 udelay(10);
100
101 if (polling_count++ > max_polling_cnt)
102 return false;
103 } while (!polling_bit);
104 break;
105 case PWR_CMD_DELAY:
106 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
107 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_DELAY\n");
108 if (GET_PWR_CFG_VALUE(cfg_cmd) ==
109 PWRSEQ_DELAY_US)
110 udelay(GET_PWR_CFG_OFFSET(cfg_cmd));
111 else
112 mdelay(GET_PWR_CFG_OFFSET(cfg_cmd));
113 break;
114 case PWR_CMD_END:
115 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
116 "rtl_hal_pwrseqcmdparsing(): PWR_CMD_END\n");
117 return true;
118 default:
119 RT_ASSERT(false,
120 "rtl_hal_pwrseqcmdparsing(): Unknown CMD!!\n");
121 break;
122 }
123
124 }
125 ary_idx++;
126 } while (1);
127
128 return true;
129}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/reg.h b/drivers/net/wireless/rtlwifi/rtl8723ae/reg.h
index ce2c66fd9eee..306059f9b9cc 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/reg.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/reg.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -34,13 +30,13 @@
34#define REG_SYS_FUNC_EN 0x0002 30#define REG_SYS_FUNC_EN 0x0002
35#define REG_APS_FSMCO 0x0004 31#define REG_APS_FSMCO 0x0004
36#define REG_SYS_CLKR 0x0008 32#define REG_SYS_CLKR 0x0008
37#define REG_9346CR 0x000A 33#define REG_9346CR 0x000A
38#define REG_EE_VPD 0x000C 34#define REG_EE_VPD 0x000C
39#define REG_AFE_MISC 0x0010 35#define REG_AFE_MISC 0x0010
40#define REG_SPS0_CTRL 0x0011 36#define REG_SPS0_CTRL 0x0011
41#define REG_SPS_OCP_CFG 0x0018 37#define REG_SPS_OCP_CFG 0x0018
42#define REG_RSV_CTRL 0x001C 38#define REG_RSV_CTRL 0x001C
43#define REG_RF_CTRL 0x001F 39#define REG_RF_CTRL 0x001F
44#define REG_LDOA15_CTRL 0x0020 40#define REG_LDOA15_CTRL 0x0020
45#define REG_LDOV12D_CTRL 0x0021 41#define REG_LDOV12D_CTRL 0x0021
46#define REG_LDOHCI12_CTRL 0x0022 42#define REG_LDOHCI12_CTRL 0x0022
@@ -57,12 +53,12 @@
57#define REG_MAC_PINMUX_CFG 0x0043 53#define REG_MAC_PINMUX_CFG 0x0043
58#define REG_GPIO_PIN_CTRL 0x0044 54#define REG_GPIO_PIN_CTRL 0x0044
59#define REG_GPIO_INTM 0x0048 55#define REG_GPIO_INTM 0x0048
60#define REG_LEDCFG0 0x004C 56#define REG_LEDCFG0 0x004C
61#define REG_LEDCFG1 0x004D 57#define REG_LEDCFG1 0x004D
62#define REG_LEDCFG2 0x004E 58#define REG_LEDCFG2 0x004E
63#define REG_LEDCFG3 0x004F 59#define REG_LEDCFG3 0x004F
64#define REG_FSIMR 0x0050 60#define REG_FSIMR 0x0050
65#define REG_FSISR 0x0054 61#define REG_FSISR 0x0054
66#define REG_GPIO_PIN_CTRL_2 0x0060 62#define REG_GPIO_PIN_CTRL_2 0x0060
67#define REG_GPIO_IO_SEL_2 0x0062 63#define REG_GPIO_IO_SEL_2 0x0062
68#define REG_MULTI_FUNC_CTRL 0x0068 64#define REG_MULTI_FUNC_CTRL 0x0068
@@ -80,25 +76,25 @@
80#define REG_USB_SIE_INTF 0x00E0 76#define REG_USB_SIE_INTF 0x00E0
81#define REG_PCIE_MIO_INTF 0x00E4 77#define REG_PCIE_MIO_INTF 0x00E4
82#define REG_PCIE_MIO_INTD 0x00E8 78#define REG_PCIE_MIO_INTD 0x00E8
83#define REG_SYS_CFG 0x00F0 79#define REG_SYS_CFG 0x00F0
84#define REG_GPIO_OUTSTS 0x00F4 80#define REG_GPIO_OUTSTS 0x00F4
85 81
86#define REG_CR 0x0100 82#define REG_CR 0x0100
87#define REG_PBP 0x0104 83#define REG_PBP 0x0104
88#define REG_TRXDMA_CTRL 0x010C 84#define REG_TRXDMA_CTRL 0x010C
89#define REG_TRXFF_BNDY 0x0114 85#define REG_TRXFF_BNDY 0x0114
90#define REG_TRXFF_STATUS 0x0118 86#define REG_TRXFF_STATUS 0x0118
91#define REG_RXFF_PTR 0x011C 87#define REG_RXFF_PTR 0x011C
92#define REG_HIMR 0x0120 88#define REG_HIMR 0x0120
93#define REG_HISR 0x0124 89#define REG_HISR 0x0124
94#define REG_HIMRE 0x0128 90#define REG_HIMRE 0x0128
95#define REG_HISRE 0x012C 91#define REG_HISRE 0x012C
96#define REG_CPWM 0x012F 92#define REG_CPWM 0x012F
97#define REG_FWIMR 0x0130 93#define REG_FWIMR 0x0130
98#define REG_FWISR 0x0134 94#define REG_FWISR 0x0134
99#define REG_PKTBUF_DBG_CTRL 0x0140 95#define REG_PKTBUF_DBG_CTRL 0x0140
100#define REG_PKTBUF_DBG_DATA_L 0x0144 96#define REG_PKTBUF_DBG_DATA_L 0x0144
101#define REG_PKTBUF_DBG_DATA_H 0x0148 97#define REG_PKTBUF_DBG_DATA_H 0x0148
102 98
103#define REG_TC0_CTRL 0x0150 99#define REG_TC0_CTRL 0x0150
104#define REG_TC1_CTRL 0x0154 100#define REG_TC1_CTRL 0x0154
@@ -109,11 +105,11 @@
109#define REG_MBIST_START 0x0174 105#define REG_MBIST_START 0x0174
110#define REG_MBIST_DONE 0x0178 106#define REG_MBIST_DONE 0x0178
111#define REG_MBIST_FAIL 0x017C 107#define REG_MBIST_FAIL 0x017C
112#define REG_C2HEVT_MSG_NORMAL 0x01A0 108#define REG_C2HEVT_MSG_NORMAL 0x01A0
113#define REG_C2HEVT_MSG_TEST 0x01B8 109#define REG_C2HEVT_MSG_TEST 0x01B8
114#define REG_MCUTST_1 0x01c0 110#define REG_MCUTST_1 0x01c0
115#define REG_FMETHR 0x01C8 111#define REG_FMETHR 0x01C8
116#define REG_HMETFR 0x01CC 112#define REG_HMETFR 0x01CC
117#define REG_HMEBOX_0 0x01D0 113#define REG_HMEBOX_0 0x01D0
118#define REG_HMEBOX_1 0x01D4 114#define REG_HMEBOX_1 0x01D4
119#define REG_HMEBOX_2 0x01D8 115#define REG_HMEBOX_2 0x01D8
@@ -123,10 +119,10 @@
123#define REG_BB_ACCEESS_CTRL 0x01E8 119#define REG_BB_ACCEESS_CTRL 0x01E8
124#define REG_BB_ACCESS_DATA 0x01EC 120#define REG_BB_ACCESS_DATA 0x01EC
125 121
126#define REG_RQPN 0x0200 122#define REG_RQPN 0x0200
127#define REG_FIFOPAGE 0x0204 123#define REG_FIFOPAGE 0x0204
128#define REG_TDECTRL 0x0208 124#define REG_TDECTRL 0x0208
129#define REG_TXDMA_OFFSET_CHK 0x020C 125#define REG_TXDMA_OFFSET_CHK 0x020C
130#define REG_TXDMA_STATUS 0x0210 126#define REG_TXDMA_STATUS 0x0210
131#define REG_RQPN_NPQ 0x0214 127#define REG_RQPN_NPQ 0x0214
132 128
@@ -135,18 +131,18 @@
135#define REG_RXDMA_STATUS 0x0288 131#define REG_RXDMA_STATUS 0x0288
136 132
137#define REG_PCIE_CTRL_REG 0x0300 133#define REG_PCIE_CTRL_REG 0x0300
138#define REG_INT_MIG 0x0304 134#define REG_INT_MIG 0x0304
139#define REG_BCNQ_DESA 0x0308 135#define REG_BCNQ_DESA 0x0308
140#define REG_HQ_DESA 0x0310 136#define REG_HQ_DESA 0x0310
141#define REG_MGQ_DESA 0x0318 137#define REG_MGQ_DESA 0x0318
142#define REG_VOQ_DESA 0x0320 138#define REG_VOQ_DESA 0x0320
143#define REG_VIQ_DESA 0x0328 139#define REG_VIQ_DESA 0x0328
144#define REG_BEQ_DESA 0x0330 140#define REG_BEQ_DESA 0x0330
145#define REG_BKQ_DESA 0x0338 141#define REG_BKQ_DESA 0x0338
146#define REG_RX_DESA 0x0340 142#define REG_RX_DESA 0x0340
147#define REG_DBI 0x0348 143#define REG_DBI 0x0348
148#define REG_MDIO 0x0354 144#define REG_MDIO 0x0354
149#define REG_DBG_SEL 0x0360 145#define REG_DBG_SEL 0x0360
150#define REG_PCIE_HRPWM 0x0361 146#define REG_PCIE_HRPWM 0x0361
151#define REG_PCIE_HCPWM 0x0363 147#define REG_PCIE_HCPWM 0x0363
152#define REG_UART_CTRL 0x0364 148#define REG_UART_CTRL 0x0364
@@ -162,31 +158,31 @@
162#define REG_BKQ_INFORMATION 0x040C 158#define REG_BKQ_INFORMATION 0x040C
163#define REG_MGQ_INFORMATION 0x0410 159#define REG_MGQ_INFORMATION 0x0410
164#define REG_HGQ_INFORMATION 0x0414 160#define REG_HGQ_INFORMATION 0x0414
165#define REG_BCNQ_INFORMATION 0x0418 161#define REG_BCNQ_INFORMATION 0x0418
166 162
167#define REG_CPU_MGQ_INFORMATION 0x041C 163#define REG_CPU_MGQ_INFORMATION 0x041C
168#define REG_FWHW_TXQ_CTRL 0x0420 164#define REG_FWHW_TXQ_CTRL 0x0420
169#define REG_HWSEQ_CTRL 0x0423 165#define REG_HWSEQ_CTRL 0x0423
170#define REG_TXPKTBUF_BCNQ_BDNY 0x0424 166#define REG_TXPKTBUF_BCNQ_BDNY 0x0424
171#define REG_TXPKTBUF_MGQ_BDNY 0x0425 167#define REG_TXPKTBUF_MGQ_BDNY 0x0425
172#define REG_MULTI_BCNQ_EN 0x0426 168#define REG_MULTI_BCNQ_EN 0x0426
173#define REG_MULTI_BCNQ_OFFSET 0x0427 169#define REG_MULTI_BCNQ_OFFSET 0x0427
174#define REG_SPEC_SIFS 0x0428 170#define REG_SPEC_SIFS 0x0428
175#define REG_RL 0x042A 171#define REG_RL 0x042A
176#define REG_DARFRC 0x0430 172#define REG_DARFRC 0x0430
177#define REG_RARFRC 0x0438 173#define REG_RARFRC 0x0438
178#define REG_RRSR 0x0440 174#define REG_RRSR 0x0440
179#define REG_ARFR0 0x0444 175#define REG_ARFR0 0x0444
180#define REG_ARFR1 0x0448 176#define REG_ARFR1 0x0448
181#define REG_ARFR2 0x044C 177#define REG_ARFR2 0x044C
182#define REG_ARFR3 0x0450 178#define REG_ARFR3 0x0450
183#define REG_AGGLEN_LMT 0x0458 179#define REG_AGGLEN_LMT 0x0458
184#define REG_AMPDU_MIN_SPACE 0x045C 180#define REG_AMPDU_MIN_SPACE 0x045C
185#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D 181#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D
186#define REG_FAST_EDCA_CTRL 0x0460 182#define REG_FAST_EDCA_CTRL 0x0460
187#define REG_RD_RESP_PKT_TH 0x0463 183#define REG_RD_RESP_PKT_TH 0x0463
188#define REG_INIRTS_RATE_SEL 0x0480 184#define REG_INIRTS_RATE_SEL 0x0480
189#define REG_INIDATA_RATE_SEL 0x0484 185#define REG_INIDATA_RATE_SEL 0x0484
190#define REG_POWER_STATUS 0x04A4 186#define REG_POWER_STATUS 0x04A4
191#define REG_POWER_STAGE1 0x04B4 187#define REG_POWER_STAGE1 0x04B4
192#define REG_POWER_STAGE2 0x04B8 188#define REG_POWER_STAGE2 0x04B8
@@ -194,29 +190,29 @@
194#define REG_STBC_SETTING 0x04C4 190#define REG_STBC_SETTING 0x04C4
195#define REG_PROT_MODE_CTRL 0x04C8 191#define REG_PROT_MODE_CTRL 0x04C8
196#define REG_BAR_MODE_CTRL 0x04CC 192#define REG_BAR_MODE_CTRL 0x04CC
197#define REG_RA_TRY_RATE_AGG_LMT 0x04CF 193#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
198#define REG_NQOS_SEQ 0x04DC 194#define REG_NQOS_SEQ 0x04DC
199#define REG_QOS_SEQ 0x04DE 195#define REG_QOS_SEQ 0x04DE
200#define REG_NEED_CPU_HANDLE 0x04E0 196#define REG_NEED_CPU_HANDLE 0x04E0
201#define REG_PKT_LOSE_RPT 0x04E1 197#define REG_PKT_LOSE_RPT 0x04E1
202#define REG_PTCL_ERR_STATUS 0x04E2 198#define REG_PTCL_ERR_STATUS 0x04E2
203#define REG_DUMMY 0x04FC 199#define REG_DUMMY 0x04FC
204 200
205#define REG_EDCA_VO_PARAM 0x0500 201#define REG_EDCA_VO_PARAM 0x0500
206#define REG_EDCA_VI_PARAM 0x0504 202#define REG_EDCA_VI_PARAM 0x0504
207#define REG_EDCA_BE_PARAM 0x0508 203#define REG_EDCA_BE_PARAM 0x0508
208#define REG_EDCA_BK_PARAM 0x050C 204#define REG_EDCA_BK_PARAM 0x050C
209#define REG_BCNTCFG 0x0510 205#define REG_BCNTCFG 0x0510
210#define REG_PIFS 0x0512 206#define REG_PIFS 0x0512
211#define REG_RDG_PIFS 0x0513 207#define REG_RDG_PIFS 0x0513
212#define REG_SIFS_CTX 0x0514 208#define REG_SIFS_CTX 0x0514
213#define REG_SIFS_TRX 0x0516 209#define REG_SIFS_TRX 0x0516
214#define REG_AGGR_BREAK_TIME 0x051A 210#define REG_AGGR_BREAK_TIME 0x051A
215#define REG_SLOT 0x051B 211#define REG_SLOT 0x051B
216#define REG_TX_PTCL_CTRL 0x0520 212#define REG_TX_PTCL_CTRL 0x0520
217#define REG_TXPAUSE 0x0522 213#define REG_TXPAUSE 0x0522
218#define REG_DIS_TXREQ_CLR 0x0523 214#define REG_DIS_TXREQ_CLR 0x0523
219#define REG_RD_CTRL 0x0524 215#define REG_RD_CTRL 0x0524
220#define REG_TBTT_PROHIBIT 0x0540 216#define REG_TBTT_PROHIBIT 0x0540
221#define REG_RD_NAV_NXT 0x0544 217#define REG_RD_NAV_NXT 0x0544
222#define REG_NAV_PROT_LEN 0x0546 218#define REG_NAV_PROT_LEN 0x0546
@@ -225,21 +221,21 @@
225#define REG_MBID_NUM 0x0552 221#define REG_MBID_NUM 0x0552
226#define REG_DUAL_TSF_RST 0x0553 222#define REG_DUAL_TSF_RST 0x0553
227#define REG_BCN_INTERVAL 0x0554 223#define REG_BCN_INTERVAL 0x0554
228#define REG_MBSSID_BCN_SPACE 0x0554 224#define REG_MBSSID_BCN_SPACE 0x0554
229#define REG_DRVERLYINT 0x0558 225#define REG_DRVERLYINT 0x0558
230#define REG_BCNDMATIM 0x0559 226#define REG_BCNDMATIM 0x0559
231#define REG_ATIMWND 0x055A 227#define REG_ATIMWND 0x055A
232#define REG_BCN_MAX_ERR 0x055D 228#define REG_BCN_MAX_ERR 0x055D
233#define REG_RXTSF_OFFSET_CCK 0x055E 229#define REG_RXTSF_OFFSET_CCK 0x055E
234#define REG_RXTSF_OFFSET_OFDM 0x055F 230#define REG_RXTSF_OFFSET_OFDM 0x055F
235#define REG_TSFTR 0x0560 231#define REG_TSFTR 0x0560
236#define REG_INIT_TSFTR 0x0564 232#define REG_INIT_TSFTR 0x0564
237#define REG_PSTIMER 0x0580 233#define REG_PSTIMER 0x0580
238#define REG_TIMER0 0x0584 234#define REG_TIMER0 0x0584
239#define REG_TIMER1 0x0588 235#define REG_TIMER1 0x0588
240#define REG_ACMHWCTRL 0x05C0 236#define REG_ACMHWCTRL 0x05C0
241#define REG_ACMRSTCTRL 0x05C1 237#define REG_ACMRSTCTRL 0x05C1
242#define REG_ACMAVG 0x05C2 238#define REG_ACMAVG 0x05C2
243#define REG_VO_ADMTIME 0x05C4 239#define REG_VO_ADMTIME 0x05C4
244#define REG_VI_ADMTIME 0x05C6 240#define REG_VI_ADMTIME 0x05C6
245#define REG_BE_ADMTIME 0x05C8 241#define REG_BE_ADMTIME 0x05C8
@@ -248,38 +244,38 @@
248 244
249#define REG_APSD_CTRL 0x0600 245#define REG_APSD_CTRL 0x0600
250#define REG_BWOPMODE 0x0603 246#define REG_BWOPMODE 0x0603
251#define REG_TCR 0x0604 247#define REG_TCR 0x0604
252#define REG_RCR 0x0608 248#define REG_RCR 0x0608
253#define REG_RX_PKT_LIMIT 0x060C 249#define REG_RX_PKT_LIMIT 0x060C
254#define REG_RX_DLK_TIME 0x060D 250#define REG_RX_DLK_TIME 0x060D
255#define REG_RX_DRVINFO_SZ 0x060F 251#define REG_RX_DRVINFO_SZ 0x060F
256 252
257#define REG_MACID 0x0610 253#define REG_MACID 0x0610
258#define REG_BSSID 0x0618 254#define REG_BSSID 0x0618
259#define REG_MAR 0x0620 255#define REG_MAR 0x0620
260#define REG_MBIDCAMCFG 0x0628 256#define REG_MBIDCAMCFG 0x0628
261 257
262#define REG_USTIME_EDCA 0x0638 258#define REG_USTIME_EDCA 0x0638
263#define REG_MAC_SPEC_SIFS 0x063A 259#define REG_MAC_SPEC_SIFS 0x063A
264#define REG_RESP_SIFS_CCK 0x063C 260#define REG_RESP_SIFS_CCK 0x063C
265#define REG_RESP_SIFS_OFDM 0x063E 261#define REG_RESP_SIFS_OFDM 0x063E
266#define REG_ACKTO 0x0640 262#define REG_ACKTO 0x0640
267#define REG_CTS2TO 0x0641 263#define REG_CTS2TO 0x0641
268#define REG_EIFS 0x0642 264#define REG_EIFS 0x0642
269 265
270#define REG_NAV_CTRL 0x0650 266#define REG_NAV_CTRL 0x0650
271#define REG_BACAMCMD 0x0654 267#define REG_BACAMCMD 0x0654
272#define REG_BACAMCONTENT 0x0658 268#define REG_BACAMCONTENT 0x0658
273#define REG_LBDLY 0x0660 269#define REG_LBDLY 0x0660
274#define REG_FWDLY 0x0661 270#define REG_FWDLY 0x0661
275#define REG_RXERR_RPT 0x0664 271#define REG_RXERR_RPT 0x0664
276#define REG_WMAC_TRXPTCL_CTL 0x0668 272#define REG_WMAC_TRXPTCL_CTL 0x0668
277 273
278#define REG_CAMCMD 0x0670 274#define REG_CAMCMD 0x0670
279#define REG_CAMWRITE 0x0674 275#define REG_CAMWRITE 0x0674
280#define REG_CAMREAD 0x0678 276#define REG_CAMREAD 0x0678
281#define REG_CAMDBG 0x067C 277#define REG_CAMDBG 0x067C
282#define REG_SECCFG 0x0680 278#define REG_SECCFG 0x0680
283 279
284#define REG_WOW_CTRL 0x0690 280#define REG_WOW_CTRL 0x0690
285#define REG_PSSTATUS 0x0691 281#define REG_PSSTATUS 0x0691
@@ -294,10 +290,10 @@
294#define REG_CALB32K_CTRL 0x06AC 290#define REG_CALB32K_CTRL 0x06AC
295#define REG_PKT_MON_CTRL 0x06B4 291#define REG_PKT_MON_CTRL 0x06B4
296#define REG_BT_COEX_TABLE 0x06C0 292#define REG_BT_COEX_TABLE 0x06C0
297#define REG_WMAC_RESP_TXINFO 0x06D8 293#define REG_WMAC_RESP_TXINFO 0x06D8
298 294
299#define REG_USB_INFO 0xFE17 295#define REG_USB_INFO 0xFE17
300#define REG_USB_SPECIAL_OPTION 0xFE55 296#define REG_USB_SPECIAL_OPTION 0xFE55
301#define REG_USB_DMA_AGG_TO 0xFE5B 297#define REG_USB_DMA_AGG_TO 0xFE5B
302#define REG_USB_AGG_TO 0xFE5C 298#define REG_USB_AGG_TO 0xFE5C
303#define REG_USB_AGG_TH 0xFE5D 299#define REG_USB_AGG_TH 0xFE5D
@@ -305,120 +301,148 @@
305#define REG_TEST_USB_TXQS 0xFE48 301#define REG_TEST_USB_TXQS 0xFE48
306#define REG_TEST_SIE_VID 0xFE60 302#define REG_TEST_SIE_VID 0xFE60
307#define REG_TEST_SIE_PID 0xFE62 303#define REG_TEST_SIE_PID 0xFE62
308#define REG_TEST_SIE_OPTIONAL 0xFE64 304#define REG_TEST_SIE_OPTIONAL 0xFE64
309#define REG_TEST_SIE_CHIRP_K 0xFE65 305#define REG_TEST_SIE_CHIRP_K 0xFE65
310#define REG_TEST_SIE_PHY 0xFE66 306#define REG_TEST_SIE_PHY 0xFE66
311#define REG_TEST_SIE_MAC_ADDR 0xFE70 307#define REG_TEST_SIE_MAC_ADDR 0xFE70
312#define REG_TEST_SIE_STRING 0xFE80 308#define REG_TEST_SIE_STRING 0xFE80
313 309
314#define REG_NORMAL_SIE_VID 0xFE60 310#define REG_NORMAL_SIE_VID 0xFE60
315#define REG_NORMAL_SIE_PID 0xFE62 311#define REG_NORMAL_SIE_PID 0xFE62
316#define REG_NORMAL_SIE_OPTIONAL 0xFE64 312#define REG_NORMAL_SIE_OPTIONAL 0xFE64
317#define REG_NORMAL_SIE_EP 0xFE65 313#define REG_NORMAL_SIE_EP 0xFE65
318#define REG_NORMAL_SIE_PHY 0xFE68 314#define REG_NORMAL_SIE_PHY 0xFE68
319#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 315#define REG_NORMAL_SIE_MAC_ADDR 0xFE70
320#define REG_NORMAL_SIE_STRING 0xFE80 316#define REG_NORMAL_SIE_STRING 0xFE80
321 317
322#define CR9346 REG_9346CR 318#define CR9346 REG_9346CR
323#define MSR (REG_CR + 2) 319#define MSR (REG_CR + 2)
324#define ISR REG_HISR 320#define ISR REG_HISR
325#define TSFR REG_TSFTR 321#define TSFR REG_TSFTR
326 322
327#define MACIDR0 REG_MACID 323#define MACIDR0 REG_MACID
328#define MACIDR4 (REG_MACID + 4) 324#define MACIDR4 (REG_MACID + 4)
329 325
330#define PBP REG_PBP 326#define PBP REG_PBP
331 327
332#define IDR0 MACIDR0 328#define IDR0 MACIDR0
333#define IDR4 MACIDR4 329#define IDR4 MACIDR4
334 330
335#define UNUSED_REGISTER 0x1BF 331#define UNUSED_REGISTER 0x1BF
336#define DCAM UNUSED_REGISTER 332#define DCAM UNUSED_REGISTER
337#define PSR UNUSED_REGISTER 333#define PSR UNUSED_REGISTER
338#define BBADDR UNUSED_REGISTER 334#define BBADDR UNUSED_REGISTER
339#define PHYDATAR UNUSED_REGISTER 335#define PHYDATAR UNUSED_REGISTER
340 336
341#define INVALID_BBRF_VALUE 0x12345678 337#define INVALID_BBRF_VALUE 0x12345678
342 338
343#define MAX_MSS_DENSITY_2T 0x13 339#define MAX_MSS_DENSITY_2T 0x13
344#define MAX_MSS_DENSITY_1T 0x0A 340#define MAX_MSS_DENSITY_1T 0x0A
345 341
346#define CMDEEPROM_EN BIT(5) 342#define CMDEEPROM_EN BIT(5)
347#define CMDEEPROM_SEL BIT(4) 343#define CMDEEPROM_SEL BIT(4)
348#define CMD9346CR_9356SEL BIT(4) 344#define CMD9346CR_9356SEL BIT(4)
349#define AUTOLOAD_EEPROM (CMDEEPROM_EN|CMDEEPROM_SEL) 345#define AUTOLOAD_EEPROM (CMDEEPROM_EN|CMDEEPROM_SEL)
350#define AUTOLOAD_EFUSE CMDEEPROM_EN 346#define AUTOLOAD_EFUSE CMDEEPROM_EN
351 347
352#define GPIOSEL_GPIO 0 348#define GPIOSEL_GPIO 0
353#define GPIOSEL_ENBT BIT(5) 349#define GPIOSEL_ENBT BIT(5)
354 350
355#define GPIO_IN REG_GPIO_PIN_CTRL 351#define GPIO_IN REG_GPIO_PIN_CTRL
356#define GPIO_OUT (REG_GPIO_PIN_CTRL+1) 352#define GPIO_OUT (REG_GPIO_PIN_CTRL+1)
357#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2) 353#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2)
358#define GPIO_MOD (REG_GPIO_PIN_CTRL+3) 354#define GPIO_MOD (REG_GPIO_PIN_CTRL+3)
359 355
360#define MSR_NOLINK 0x00 356#define MSR_NOLINK 0x00
361#define MSR_ADHOC 0x01 357#define MSR_ADHOC 0x01
362#define MSR_INFRA 0x02 358#define MSR_INFRA 0x02
363#define MSR_AP 0x03 359#define MSR_AP 0x03
364#define MSR_MASK 0x03
365 360
366#define RRSR_RSC_OFFSET 21 361#define RRSR_RSC_OFFSET 21
367#define RRSR_SHORT_OFFSET 23 362#define RRSR_SHORT_OFFSET 23
368#define RRSR_RSC_BW_40M 0x600000 363#define RRSR_RSC_BW_40M 0x600000
369#define RRSR_RSC_UPSUBCHNL 0x400000 364#define RRSR_RSC_UPSUBCHNL 0x400000
370#define RRSR_RSC_LOWSUBCHNL 0x200000 365#define RRSR_RSC_LOWSUBCHNL 0x200000
371#define RRSR_SHORT 0x800000 366#define RRSR_SHORT 0x800000
372#define RRSR_1M BIT(0) 367#define RRSR_1M BIT(0)
373#define RRSR_2M BIT(1) 368#define RRSR_2M BIT(1)
374#define RRSR_5_5M BIT(2) 369#define RRSR_5_5M BIT(2)
375#define RRSR_11M BIT(3) 370#define RRSR_11M BIT(3)
376#define RRSR_6M BIT(4) 371#define RRSR_6M BIT(4)
377#define RRSR_9M BIT(5) 372#define RRSR_9M BIT(5)
378#define RRSR_12M BIT(6) 373#define RRSR_12M BIT(6)
379#define RRSR_18M BIT(7) 374#define RRSR_18M BIT(7)
380#define RRSR_24M BIT(8) 375#define RRSR_24M BIT(8)
381#define RRSR_36M BIT(9) 376#define RRSR_36M BIT(9)
382#define RRSR_48M BIT(10) 377#define RRSR_48M BIT(10)
383#define RRSR_54M BIT(11) 378#define RRSR_54M BIT(11)
384#define RRSR_MCS0 BIT(12) 379#define RRSR_MCS0 BIT(12)
385#define RRSR_MCS1 BIT(13) 380#define RRSR_MCS1 BIT(13)
386#define RRSR_MCS2 BIT(14) 381#define RRSR_MCS2 BIT(14)
387#define RRSR_MCS3 BIT(15) 382#define RRSR_MCS3 BIT(15)
388#define RRSR_MCS4 BIT(16) 383#define RRSR_MCS4 BIT(16)
389#define RRSR_MCS5 BIT(17) 384#define RRSR_MCS5 BIT(17)
390#define RRSR_MCS6 BIT(18) 385#define RRSR_MCS6 BIT(18)
391#define RRSR_MCS7 BIT(19) 386#define RRSR_MCS7 BIT(19)
392#define BRSR_ACKSHORTPMB BIT(23) 387#define BRSR_ACKSHORTPMB BIT(23)
393 388
394#define RATR_1M 0x00000001 389#define RATR_1M 0x00000001
395#define RATR_2M 0x00000002 390#define RATR_2M 0x00000002
396#define RATR_55M 0x00000004 391#define RATR_55M 0x00000004
397#define RATR_11M 0x00000008 392#define RATR_11M 0x00000008
398#define RATR_6M 0x00000010 393#define RATR_6M 0x00000010
399#define RATR_9M 0x00000020 394#define RATR_9M 0x00000020
400#define RATR_12M 0x00000040 395#define RATR_12M 0x00000040
401#define RATR_18M 0x00000080 396#define RATR_18M 0x00000080
402#define RATR_24M 0x00000100 397#define RATR_24M 0x00000100
403#define RATR_36M 0x00000200 398#define RATR_36M 0x00000200
404#define RATR_48M 0x00000400 399#define RATR_48M 0x00000400
405#define RATR_54M 0x00000800 400#define RATR_54M 0x00000800
406#define RATR_MCS0 0x00001000 401#define RATR_MCS0 0x00001000
407#define RATR_MCS1 0x00002000 402#define RATR_MCS1 0x00002000
408#define RATR_MCS2 0x00004000 403#define RATR_MCS2 0x00004000
409#define RATR_MCS3 0x00008000 404#define RATR_MCS3 0x00008000
410#define RATR_MCS4 0x00010000 405#define RATR_MCS4 0x00010000
411#define RATR_MCS5 0x00020000 406#define RATR_MCS5 0x00020000
412#define RATR_MCS6 0x00040000 407#define RATR_MCS6 0x00040000
413#define RATR_MCS7 0x00080000 408#define RATR_MCS7 0x00080000
414#define RATR_MCS8 0x00100000 409#define RATR_MCS8 0x00100000
415#define RATR_MCS9 0x00200000 410#define RATR_MCS9 0x00200000
416#define RATR_MCS10 0x00400000 411#define RATR_MCS10 0x00400000
417#define RATR_MCS11 0x00800000 412#define RATR_MCS11 0x00800000
418#define RATR_MCS12 0x01000000 413#define RATR_MCS12 0x01000000
419#define RATR_MCS13 0x02000000 414#define RATR_MCS13 0x02000000
420#define RATR_MCS14 0x04000000 415#define RATR_MCS14 0x04000000
421#define RATR_MCS15 0x08000000 416#define RATR_MCS15 0x08000000
417
418#define RATE_1M BIT(0)
419#define RATE_2M BIT(1)
420#define RATE_5_5M BIT(2)
421#define RATE_11M BIT(3)
422#define RATE_6M BIT(4)
423#define RATE_9M BIT(5)
424#define RATE_12M BIT(6)
425#define RATE_18M BIT(7)
426#define RATE_24M BIT(8)
427#define RATE_36M BIT(9)
428#define RATE_48M BIT(10)
429#define RATE_54M BIT(11)
430#define RATE_MCS0 BIT(12)
431#define RATE_MCS1 BIT(13)
432#define RATE_MCS2 BIT(14)
433#define RATE_MCS3 BIT(15)
434#define RATE_MCS4 BIT(16)
435#define RATE_MCS5 BIT(17)
436#define RATE_MCS6 BIT(18)
437#define RATE_MCS7 BIT(19)
438#define RATE_MCS8 BIT(20)
439#define RATE_MCS9 BIT(21)
440#define RATE_MCS10 BIT(22)
441#define RATE_MCS11 BIT(23)
442#define RATE_MCS12 BIT(24)
443#define RATE_MCS13 BIT(25)
444#define RATE_MCS14 BIT(26)
445#define RATE_MCS15 BIT(27)
422 446
423#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M) 447#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M)
424#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M |\ 448#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M |\
@@ -434,31 +458,31 @@
434#define BW_OPMODE_5G BIT(1) 458#define BW_OPMODE_5G BIT(1)
435#define BW_OPMODE_11J BIT(0) 459#define BW_OPMODE_11J BIT(0)
436 460
437#define CAM_VALID BIT(15) 461#define CAM_VALID BIT(15)
438#define CAM_NOTVALID 0x0000 462#define CAM_NOTVALID 0x0000
439#define CAM_USEDK BIT(5) 463#define CAM_USEDK BIT(5)
440 464
441#define CAM_NONE 0x0 465#define CAM_NONE 0x0
442#define CAM_WEP40 0x01 466#define CAM_WEP40 0x01
443#define CAM_TKIP 0x02 467#define CAM_TKIP 0x02
444#define CAM_AES 0x04 468#define CAM_AES 0x04
445#define CAM_WEP104 0x05 469#define CAM_WEP104 0x05
446 470
447#define TOTAL_CAM_ENTRY 32 471#define TOTAL_CAM_ENTRY 32
448#define HALF_CAM_ENTRY 16 472#define HALF_CAM_ENTRY 16
449 473
450#define CAM_WRITE BIT(16) 474#define CAM_WRITE BIT(16)
451#define CAM_READ 0x00000000 475#define CAM_READ 0x00000000
452#define CAM_POLLINIG BIT(31) 476#define CAM_POLLINIG BIT(31)
453 477
454#define SCR_USEDK 0x01 478#define SCR_USEDK 0x01
455#define SCR_TXSEC_ENABLE 0x02 479#define SCR_TXSEC_ENABLE 0x02
456#define SCR_RXSEC_ENABLE 0x04 480#define SCR_RXSEC_ENABLE 0x04
457 481
458#define WOW_PMEN BIT(0) 482#define WOW_PMEN BIT(0)
459#define WOW_WOMEN BIT(1) 483#define WOW_WOMEN BIT(1)
460#define WOW_MAGIC BIT(2) 484#define WOW_MAGIC BIT(2)
461#define WOW_UWF BIT(3) 485#define WOW_UWF BIT(3)
462 486
463#define IMR8190_DISABLED 0x0 487#define IMR8190_DISABLED 0x0
464#define IMR_BCNDMAINT6 BIT(31) 488#define IMR_BCNDMAINT6 BIT(31)
@@ -467,180 +491,179 @@
467#define IMR_BCNDMAINT3 BIT(28) 491#define IMR_BCNDMAINT3 BIT(28)
468#define IMR_BCNDMAINT2 BIT(27) 492#define IMR_BCNDMAINT2 BIT(27)
469#define IMR_BCNDMAINT1 BIT(26) 493#define IMR_BCNDMAINT1 BIT(26)
470#define IMR_BCNDOK8 BIT(25) 494#define IMR_BCNDOK8 BIT(25)
471#define IMR_BCNDOK7 BIT(24) 495#define IMR_BCNDOK7 BIT(24)
472#define IMR_BCNDOK6 BIT(23) 496#define IMR_BCNDOK6 BIT(23)
473#define IMR_BCNDOK5 BIT(22) 497#define IMR_BCNDOK5 BIT(22)
474#define IMR_BCNDOK4 BIT(21) 498#define IMR_BCNDOK4 BIT(21)
475#define IMR_BCNDOK3 BIT(20) 499#define IMR_BCNDOK3 BIT(20)
476#define IMR_BCNDOK2 BIT(19) 500#define IMR_BCNDOK2 BIT(19)
477#define IMR_BCNDOK1 BIT(18) 501#define IMR_BCNDOK1 BIT(18)
478#define IMR_TIMEOUT2 BIT(17) 502#define IMR_TIMEOUT2 BIT(17)
479#define IMR_TIMEOUT1 BIT(16) 503#define IMR_TIMEOUT1 BIT(16)
480#define IMR_TXFOVW BIT(15) 504#define IMR_TXFOVW BIT(15)
481#define IMR_PSTIMEOUT BIT(14) 505#define IMR_PSTIMEOUT BIT(14)
482#define IMR_BCNINT BIT(13) 506#define IMR_BCNINT BIT(13)
483#define IMR_RXFOVW BIT(12) 507#define IMR_RXFOVW BIT(12)
484#define IMR_RDU BIT(11) 508#define IMR_RDU BIT(11)
485#define IMR_ATIMEND BIT(10) 509#define IMR_ATIMEND BIT(10)
486#define IMR_BDOK BIT(9) 510#define IMR_BDOK BIT(9)
487#define IMR_HIGHDOK BIT(8) 511#define IMR_HIGHDOK BIT(8)
488#define IMR_TBDOK BIT(7) 512#define IMR_TBDOK BIT(7)
489#define IMR_MGNTDOK BIT(6) 513#define IMR_MGNTDOK BIT(6)
490#define IMR_TBDER BIT(5) 514#define IMR_TBDER BIT(5)
491#define IMR_BKDOK BIT(4) 515#define IMR_BKDOK BIT(4)
492#define IMR_BEDOK BIT(3) 516#define IMR_BEDOK BIT(3)
493#define IMR_VIDOK BIT(2) 517#define IMR_VIDOK BIT(2)
494#define IMR_VODOK BIT(1) 518#define IMR_VODOK BIT(1)
495#define IMR_ROK BIT(0) 519#define IMR_ROK BIT(0)
496 520
497#define IMR_TXERR BIT(11) 521#define IMR_TXERR BIT(11)
498#define IMR_RXERR BIT(10) 522#define IMR_RXERR BIT(10)
499#define IMR_CPWM BIT(8) 523#define IMR_CPWM BIT(8)
500#define IMR_OCPINT BIT(1) 524#define IMR_OCPINT BIT(1)
501#define IMR_WLANOFF BIT(0) 525#define IMR_WLANOFF BIT(0)
502 526
503/* 8723E series PCIE Host IMR/ISR bit */ 527/* 8723E series PCIE Host IMR/ISR bit */
504/* IMR DW0 Bit 0-31 */ 528/* IMR DW0 Bit 0-31 */
505#define PHIMR_TIMEOUT2 BIT(31) 529#define PHIMR_TIMEOUT2 BIT(31)
506#define PHIMR_TIMEOUT1 BIT(30) 530#define PHIMR_TIMEOUT1 BIT(30)
507#define PHIMR_PSTIMEOUT BIT(29) 531#define PHIMR_PSTIMEOUT BIT(29)
508#define PHIMR_GTINT4 BIT(28) 532#define PHIMR_GTINT4 BIT(28)
509#define PHIMR_GTINT3 BIT(27) 533#define PHIMR_GTINT3 BIT(27)
510#define PHIMR_TXBCNERR BIT(26) 534#define PHIMR_TXBCNERR BIT(26)
511#define PHIMR_TXBCNOK BIT(25) 535#define PHIMR_TXBCNOK BIT(25)
512#define PHIMR_TSF_BIT32_TOGGLE BIT(24) 536#define PHIMR_TSF_BIT32_TOGGLE BIT(24)
513#define PHIMR_BCNDMAINT3 BIT(23) 537#define PHIMR_BCNDMAINT3 BIT(23)
514#define PHIMR_BCNDMAINT2 BIT(22) 538#define PHIMR_BCNDMAINT2 BIT(22)
515#define PHIMR_BCNDMAINT1 BIT(21) 539#define PHIMR_BCNDMAINT1 BIT(21)
516#define PHIMR_BCNDMAINT0 BIT(20) 540#define PHIMR_BCNDMAINT0 BIT(20)
517#define PHIMR_BCNDOK3 BIT(19) 541#define PHIMR_BCNDOK3 BIT(19)
518#define PHIMR_BCNDOK2 BIT(18) 542#define PHIMR_BCNDOK2 BIT(18)
519#define PHIMR_BCNDOK1 BIT(17) 543#define PHIMR_BCNDOK1 BIT(17)
520#define PHIMR_BCNDOK0 BIT(16) 544#define PHIMR_BCNDOK0 BIT(16)
521#define PHIMR_HSISR_IND_ON BIT(15) 545#define PHIMR_HSISR_IND_ON BIT(15)
522#define PHIMR_BCNDMAINT_E BIT(14) 546#define PHIMR_BCNDMAINT_E BIT(14)
523#define PHIMR_ATIMEND_E BIT(13) 547#define PHIMR_ATIMEND_E BIT(13)
524#define PHIMR_ATIM_CTW_END BIT(12) 548#define PHIMR_ATIM_CTW_END BIT(12)
525#define PHIMR_HISRE_IND BIT(11) 549#define PHIMR_HISRE_IND BIT(11)
526#define PHIMR_C2HCMD BIT(10) 550#define PHIMR_C2HCMD BIT(10)
527#define PHIMR_CPWM2 BIT(9) 551#define PHIMR_CPWM2 BIT(9)
528#define PHIMR_CPWM BIT(8) 552#define PHIMR_CPWM BIT(8)
529#define PHIMR_HIGHDOK BIT(7) 553#define PHIMR_HIGHDOK BIT(7)
530#define PHIMR_MGNTDOK BIT(6) 554#define PHIMR_MGNTDOK BIT(6)
531#define PHIMR_BKDOK BIT(5) 555#define PHIMR_BKDOK BIT(5)
532#define PHIMR_BEDOK BIT(4) 556#define PHIMR_BEDOK BIT(4)
533#define PHIMR_VIDOK BIT(3) 557#define PHIMR_VIDOK BIT(3)
534#define PHIMR_VODOK BIT(2) 558#define PHIMR_VODOK BIT(2)
535#define PHIMR_RDU BIT(1) 559#define PHIMR_RDU BIT(1)
536#define PHIMR_ROK BIT(0) 560#define PHIMR_ROK BIT(0)
537 561
538/* PCIE Host Interrupt Status Extension bit */ 562/* PCIE Host Interrupt Status Extension bit */
539#define PHIMR_BCNDMAINT7 BIT(23) 563#define PHIMR_BCNDMAINT7 BIT(23)
540#define PHIMR_BCNDMAINT6 BIT(22) 564#define PHIMR_BCNDMAINT6 BIT(22)
541#define PHIMR_BCNDMAINT5 BIT(21) 565#define PHIMR_BCNDMAINT5 BIT(21)
542#define PHIMR_BCNDMAINT4 BIT(20) 566#define PHIMR_BCNDMAINT4 BIT(20)
543#define PHIMR_BCNDOK7 BIT(19) 567#define PHIMR_BCNDOK7 BIT(19)
544#define PHIMR_BCNDOK6 BIT(18) 568#define PHIMR_BCNDOK6 BIT(18)
545#define PHIMR_BCNDOK5 BIT(17) 569#define PHIMR_BCNDOK5 BIT(17)
546#define PHIMR_BCNDOK4 BIT(16) 570#define PHIMR_BCNDOK4 BIT(16)
547/* bit12-15: RSVD */ 571/* bit12-15: RSVD */
548#define PHIMR_TXERR BIT(11) 572#define PHIMR_TXERR BIT(11)
549#define PHIMR_RXERR BIT(10) 573#define PHIMR_RXERR BIT(10)
550#define PHIMR_TXFOVW BIT(9) 574#define PHIMR_TXFOVW BIT(9)
551#define PHIMR_RXFOVW BIT(8) 575#define PHIMR_RXFOVW BIT(8)
552/* bit2-7: RSV */ 576/* bit2-7: RSVD */
553#define PHIMR_OCPINT BIT(1) 577#define PHIMR_OCPINT BIT(1)
554 578
555#define HWSET_MAX_SIZE 256 579#define HWSET_MAX_SIZE 256
556#define EFUSE_MAX_SECTION 32 580#define EFUSE_MAX_SECTION 32
557#define EFUSE_REAL_CONTENT_LEN 512 581#define EFUSE_REAL_CONTENT_LEN 512
558#define EFUSE_OOB_PROTECT_BYTES 15 582#define EFUSE_OOB_PROTECT_BYTES 15
559 583
560#define EEPROM_DEFAULT_TSSI 0x0 584#define EEPROM_DEFAULT_TSSI 0x0
561#define EEPROM_DEFAULT_TXPOWERDIFF 0x0 585#define EEPROM_DEFAULT_TXPOWERDIFF 0x0
562#define EEPROM_DEFAULT_CRYSTALCAP 0x5 586#define EEPROM_DEFAULT_CRYSTALCAP 0x5
563#define EEPROM_DEFAULT_BOARDTYPE 0x02 587#define EEPROM_DEFAULT_BOARDTYPE 0x02
564#define EEPROM_DEFAULT_TXPOWER 0x1010 588#define EEPROM_DEFAULT_TXPOWER 0x1010
565#define EEPROM_DEFAULT_HT2T_TXPWR 0x10 589#define EEPROM_DEFAULT_HT2T_TXPWR 0x10
566 590
567#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3 591#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
568#define EEPROM_DEFAULT_THERMALMETER 0x12 592#define EEPROM_DEFAULT_THERMALMETER 0x12
569#define EEPROM_DEFAULT_ANTTXPOWERDIFF 0x0 593#define EEPROM_DEFAULT_ANTTXPOWERDIFF 0x0
570#define EEPROM_DEFAULT_TXPWDIFF_CRYSTALCAP 0x5 594#define EEPROM_DEFAULT_TXPWDIFF_CRYSTALCAP 0x5
571#define EEPROM_DEFAULT_TXPOWERLEVEL 0x22 595#define EEPROM_DEFAULT_TXPOWERLEVEL 0x22
572#define EEPROM_DEFAULT_HT40_2SDIFF 0x0 596#define EEPROM_DEFAULT_HT40_2SDIFF 0x0
573#define EEPROM_DEFAULT_HT20_DIFF 2 597#define EEPROM_DEFAULT_HT20_DIFF 2
574#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3 598#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
575#define EEPROM_DEFAULT_HT40_PWRMAXOFFSET 0 599#define EEPROM_DEFAULT_HT40_PWRMAXOFFSET 0
576#define EEPROM_DEFAULT_HT20_PWRMAXOFFSET 0 600#define EEPROM_DEFAULT_HT20_PWRMAXOFFSET 0
577 601
578 602#define EEPROM_DEFAULT_PID 0x1234
579#define EEPROM_DEFAULT_PID 0x1234 603#define EEPROM_DEFAULT_VID 0x5678
580#define EEPROM_DEFAULT_VID 0x5678 604#define EEPROM_DEFAULT_CUSTOMERID 0xAB
581#define EEPROM_DEFAULT_CUSTOMERID 0xAB
582#define EEPROM_DEFAULT_SUBCUSTOMERID 0xCD 605#define EEPROM_DEFAULT_SUBCUSTOMERID 0xCD
583#define EEPROM_DEFAULT_VERSION 0 606#define EEPROM_DEFAULT_VERSION 0
584 607
585#define EEPROM_CHANNEL_PLAN_FCC 0x0 608#define EEPROM_CHANNEL_PLAN_FCC 0x0
586#define EEPROM_CHANNEL_PLAN_IC 0x1 609#define EEPROM_CHANNEL_PLAN_IC 0x1
587#define EEPROM_CHANNEL_PLAN_ETSI 0x2 610#define EEPROM_CHANNEL_PLAN_ETSI 0x2
588#define EEPROM_CHANNEL_PLAN_SPAIN 0x3 611#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
589#define EEPROM_CHANNEL_PLAN_FRANCE 0x4 612#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
590#define EEPROM_CHANNEL_PLAN_MKK 0x5 613#define EEPROM_CHANNEL_PLAN_MKK 0x5
591#define EEPROM_CHANNEL_PLAN_MKK1 0x6 614#define EEPROM_CHANNEL_PLAN_MKK1 0x6
592#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7 615#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
593#define EEPROM_CHANNEL_PLAN_TELEC 0x8 616#define EEPROM_CHANNEL_PLAN_TELEC 0x8
594#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9 617#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
595#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA 618#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
596#define EEPROM_CHANNEL_PLAN_NCC 0xB 619#define EEPROM_CHANNEL_PLAN_NCC 0xB
597#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80 620#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
598 621
599#define EEPROM_CID_DEFAULT 0x0 622#define EEPROM_CID_DEFAULT 0x0
600#define EEPROM_CID_TOSHIBA 0x4 623#define EEPROM_CID_TOSHIBA 0x4
601#define EEPROM_CID_CCX 0x10 624#define EEPROM_CID_CCX 0x10
602#define EEPROM_CID_QMI 0x0D 625#define EEPROM_CID_QMI 0x0D
603#define EEPROM_CID_WHQL 0xFE 626#define EEPROM_CID_WHQL 0xFE
604 627
605#define RTL8192_EEPROM_ID 0x8129 628#define RTL8192_EEPROM_ID 0x8129
606 629
607#define RTL8190_EEPROM_ID 0x8129 630#define RTL8190_EEPROM_ID 0x8129
608#define EEPROM_HPON 0x02 631#define EEPROM_HPON 0x02
609#define EEPROM_CLK 0x06 632#define EEPROM_CLK 0x06
610#define EEPROM_TESTR 0x08 633#define EEPROM_TESTR 0x08
611 634
612#define EEPROM_VID 0x49 635#define EEPROM_VID 0x49
613#define EEPROM_DID 0x4B 636#define EEPROM_DID 0x4B
614#define EEPROM_SVID 0x4D 637#define EEPROM_SVID 0x4D
615#define EEPROM_SMID 0x4F 638#define EEPROM_SMID 0x4F
616 639
617#define EEPROM_MAC_ADDR 0x67 640#define EEPROM_MAC_ADDR 0x67
618 641
619#define EEPROM_CCK_TX_PWR_INX 0x5A 642#define EEPROM_CCK_TX_PWR_INX 0x5A
620#define EEPROM_HT40_1S_TX_PWR_INX 0x60 643#define EEPROM_HT40_1S_TX_PWR_INX 0x60
621#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66 644#define EEPROM_HT40_2S_TX_PWR_INX_DIFF 0x66
622#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69 645#define EEPROM_HT20_TX_PWR_INX_DIFF 0x69
623#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C 646#define EEPROM_OFDM_TX_PWR_INX_DIFF 0x6C
624#define EEPROM_HT40_MAX_PWR_OFFSET 0x25 647#define EEPROM_HT40_MAX_PWR_OFFSET 0x25
625#define EEPROM_HT20_MAX_PWR_OFFSET 0x22 648#define EEPROM_HT20_MAX_PWR_OFFSET 0x22
626 649
627#define EEPROM_THERMAL_METER 0x2a 650#define EEPROM_THERMAL_METER 0x2a
628#define EEPROM_XTAL_K 0x78 651#define EEPROM_XTAL_K 0x78
629#define EEPROM_RF_OPT1 0x79 652#define EEPROM_RF_OPT1 0x79
630#define EEPROM_RF_OPT2 0x7A 653#define EEPROM_RF_OPT2 0x7A
631#define EEPROM_RF_OPT3 0x7B 654#define EEPROM_RF_OPT3 0x7B
632#define EEPROM_RF_OPT4 0x7C 655#define EEPROM_RF_OPT4 0x7C
633#define EEPROM_CHANNEL_PLAN 0x28 656#define EEPROM_CHANNEL_PLAN 0x28
634#define EEPROM_VERSION 0x30 657#define EEPROM_VERSION 0x30
635#define EEPROM_CUSTOMER_ID 0x31 658#define EEPROM_CUSTOMER_ID 0x31
636 659
637#define EEPROM_PWRDIFF 0x54 660#define EEPROM_PWRDIFF 0x54
638 661
639#define EEPROM_TXPOWERCCK 0x10 662#define EEPROM_TXPOWERCCK 0x10
640#define EEPROM_TXPOWERHT40_1S 0x16 663#define EEPROM_TXPOWERHT40_1S 0x16
641#define EEPROM_TXPOWERHT40_2SDIFF 0x66 664#define EEPROM_TXPOWERHT40_2SDIFF 0x66
642#define EEPROM_TXPOWERHT20DIFF 0x1C 665#define EEPROM_TXPOWERHT20DIFF 0x1C
643#define EEPROM_TXPOWER_OFDMDIFF 0x1F 666#define EEPROM_TXPOWER_OFDMDIFF 0x1F
644 667
645#define EEPROM_TXPWR_GROUP 0x22 668#define EEPROM_TXPWR_GROUP 0x22
646 669
@@ -649,169 +672,169 @@
649 672
650#define EEPROM_CHANNELPLAN 0x28 673#define EEPROM_CHANNELPLAN 0x28
651 674
652#define RF_OPTION1 0x2B 675#define RF_OPTION1 0x2B
653#define RF_OPTION2 0x2C 676#define RF_OPTION2 0x2C
654#define RF_OPTION3 0x2D 677#define RF_OPTION3 0x2D
655#define RF_OPTION4 0x2E 678#define RF_OPTION4 0x2E
656 679
657#define STOPBECON BIT(6) 680#define STOPBECON BIT(6)
658#define STOPHIGHT BIT(5) 681#define STOPHIGHT BIT(5)
659#define STOPMGT BIT(4) 682#define STOPMGT BIT(4)
660#define STOPVO BIT(3) 683#define STOPVO BIT(3)
661#define STOPVI BIT(2) 684#define STOPVI BIT(2)
662#define STOPBE BIT(1) 685#define STOPBE BIT(1)
663#define STOPBK BIT(0) 686#define STOPBK BIT(0)
664 687
665#define RCR_APPFCS BIT(31) 688#define RCR_APPFCS BIT(31)
666#define RCR_APP_MIC BIT(30) 689#define RCR_APP_MIC BIT(30)
667#define RCR_APP_ICV BIT(29) 690#define RCR_APP_ICV BIT(29)
668#define RCR_APP_PHYST_RXFF BIT(28) 691#define RCR_APP_PHYST_RXFF BIT(28)
669#define RCR_APP_BA_SSN BIT(27) 692#define RCR_APP_BA_SSN BIT(27)
670#define RCR_ENMBID BIT(24) 693#define RCR_ENMBID BIT(24)
671#define RCR_LSIGEN BIT(23) 694#define RCR_LSIGEN BIT(23)
672#define RCR_MFBEN BIT(22) 695#define RCR_MFBEN BIT(22)
673#define RCR_HTC_LOC_CTRL BIT(14) 696#define RCR_HTC_LOC_CTRL BIT(14)
674#define RCR_AMF BIT(13) 697#define RCR_AMF BIT(13)
675#define RCR_ACF BIT(12) 698#define RCR_ACF BIT(12)
676#define RCR_ADF BIT(11) 699#define RCR_ADF BIT(11)
677#define RCR_AICV BIT(9) 700#define RCR_AICV BIT(9)
678#define RCR_ACRC32 BIT(8) 701#define RCR_ACRC32 BIT(8)
679#define RCR_CBSSID_BCN BIT(7) 702#define RCR_CBSSID_BCN BIT(7)
680#define RCR_CBSSID_DATA BIT(6) 703#define RCR_CBSSID_DATA BIT(6)
681#define RCR_CBSSID RCR_CBSSID_DATA 704#define RCR_CBSSID RCR_CBSSID_DATA
682#define RCR_APWRMGT BIT(5) 705#define RCR_APWRMGT BIT(5)
683#define RCR_ADD3 BIT(4) 706#define RCR_ADD3 BIT(4)
684#define RCR_AB BIT(3) 707#define RCR_AB BIT(3)
685#define RCR_AM BIT(2) 708#define RCR_AM BIT(2)
686#define RCR_APM BIT(1) 709#define RCR_APM BIT(1)
687#define RCR_AAP BIT(0) 710#define RCR_AAP BIT(0)
688#define RCR_MXDMA_OFFSET 8 711#define RCR_MXDMA_OFFSET 8
689#define RCR_FIFO_OFFSET 13 712#define RCR_FIFO_OFFSET 13
690 713
691#define RSV_CTRL 0x001C 714#define RSV_CTRL 0x001C
692#define RD_CTRL 0x0524 715#define RD_CTRL 0x0524
693 716
694#define REG_USB_INFO 0xFE17 717#define REG_USB_INFO 0xFE17
695#define REG_USB_SPECIAL_OPTION 0xFE55 718#define REG_USB_SPECIAL_OPTION 0xFE55
696#define REG_USB_DMA_AGG_TO 0xFE5B 719#define REG_USB_DMA_AGG_TO 0xFE5B
697#define REG_USB_AGG_TO 0xFE5C 720#define REG_USB_AGG_TO 0xFE5C
698#define REG_USB_AGG_TH 0xFE5D 721#define REG_USB_AGG_TH 0xFE5D
699 722
700#define REG_USB_VID 0xFE60 723#define REG_USB_VID 0xFE60
701#define REG_USB_PID 0xFE62 724#define REG_USB_PID 0xFE62
702#define REG_USB_OPTIONAL 0xFE64 725#define REG_USB_OPTIONAL 0xFE64
703#define REG_USB_CHIRP_K 0xFE65 726#define REG_USB_CHIRP_K 0xFE65
704#define REG_USB_PHY 0xFE66 727#define REG_USB_PHY 0xFE66
705#define REG_USB_MAC_ADDR 0xFE70 728#define REG_USB_MAC_ADDR 0xFE70
706#define REG_USB_HRPWM 0xFE58 729#define REG_USB_HRPWM 0xFE58
707#define REG_USB_HCPWM 0xFE57 730#define REG_USB_HCPWM 0xFE57
708 731
709#define SW18_FPWM BIT(3) 732#define SW18_FPWM BIT(3)
710 733
711#define ISO_MD2PP BIT(0) 734#define ISO_MD2PP BIT(0)
712#define ISO_UA2USB BIT(1) 735#define ISO_UA2USB BIT(1)
713#define ISO_UD2CORE BIT(2) 736#define ISO_UD2CORE BIT(2)
714#define ISO_PA2PCIE BIT(3) 737#define ISO_PA2PCIE BIT(3)
715#define ISO_PD2CORE BIT(4) 738#define ISO_PD2CORE BIT(4)
716#define ISO_IP2MAC BIT(5) 739#define ISO_IP2MAC BIT(5)
717#define ISO_DIOP BIT(6) 740#define ISO_DIOP BIT(6)
718#define ISO_DIOE BIT(7) 741#define ISO_DIOE BIT(7)
719#define ISO_EB2CORE BIT(8) 742#define ISO_EB2CORE BIT(8)
720#define ISO_DIOR BIT(9) 743#define ISO_DIOR BIT(9)
721 744
722#define PWC_EV25V BIT(14) 745#define PWC_EV25V BIT(14)
723#define PWC_EV12V BIT(15) 746#define PWC_EV12V BIT(15)
724 747
725#define FEN_BBRSTB BIT(0) 748#define FEN_BBRSTB BIT(0)
726#define FEN_BB_GLB_RSTn BIT(1) 749#define FEN_BB_GLB_RSTN BIT(1)
727#define FEN_USBA BIT(2) 750#define FEN_USBA BIT(2)
728#define FEN_UPLL BIT(3) 751#define FEN_UPLL BIT(3)
729#define FEN_USBD BIT(4) 752#define FEN_USBD BIT(4)
730#define FEN_DIO_PCIE BIT(5) 753#define FEN_DIO_PCIE BIT(5)
731#define FEN_PCIEA BIT(6) 754#define FEN_PCIEA BIT(6)
732#define FEN_PPLL BIT(7) 755#define FEN_PPLL BIT(7)
733#define FEN_PCIED BIT(8) 756#define FEN_PCIED BIT(8)
734#define FEN_DIOE BIT(9) 757#define FEN_DIOE BIT(9)
735#define FEN_CPUEN BIT(10) 758#define FEN_CPUEN BIT(10)
736#define FEN_DCORE BIT(11) 759#define FEN_DCORE BIT(11)
737#define FEN_ELDR BIT(12) 760#define FEN_ELDR BIT(12)
738#define FEN_DIO_RF BIT(13) 761#define FEN_DIO_RF BIT(13)
739#define FEN_HWPDN BIT(14) 762#define FEN_HWPDN BIT(14)
740#define FEN_MREGEN BIT(15) 763#define FEN_MREGEN BIT(15)
741 764
742#define PFM_LDALL BIT(0) 765#define PFM_LDALL BIT(0)
743#define PFM_ALDN BIT(1) 766#define PFM_ALDN BIT(1)
744#define PFM_LDKP BIT(2) 767#define PFM_LDKP BIT(2)
745#define PFM_WOWL BIT(3) 768#define PFM_WOWL BIT(3)
746#define EnPDN BIT(4) 769#define ENPDN BIT(4)
747#define PDN_PL BIT(5) 770#define PDN_PL BIT(5)
748#define APFM_ONMAC BIT(8) 771#define APFM_ONMAC BIT(8)
749#define APFM_OFF BIT(9) 772#define APFM_OFF BIT(9)
750#define APFM_RSM BIT(10) 773#define APFM_RSM BIT(10)
751#define AFSM_HSUS BIT(11) 774#define AFSM_HSUS BIT(11)
752#define AFSM_PCIE BIT(12) 775#define AFSM_PCIE BIT(12)
753#define APDM_MAC BIT(13) 776#define APDM_MAC BIT(13)
754#define APDM_HOST BIT(14) 777#define APDM_HOST BIT(14)
755#define APDM_HPDN BIT(15) 778#define APDM_HPDN BIT(15)
756#define RDY_MACON BIT(16) 779#define RDY_MACON BIT(16)
757#define SUS_HOST BIT(17) 780#define SUS_HOST BIT(17)
758#define ROP_ALD BIT(20) 781#define ROP_ALD BIT(20)
759#define ROP_PWR BIT(21) 782#define ROP_PWR BIT(21)
760#define ROP_SPS BIT(22) 783#define ROP_SPS BIT(22)
761#define SOP_MRST BIT(25) 784#define SOP_MRST BIT(25)
762#define SOP_FUSE BIT(26) 785#define SOP_FUSE BIT(26)
763#define SOP_ABG BIT(27) 786#define SOP_ABG BIT(27)
764#define SOP_AMB BIT(28) 787#define SOP_AMB BIT(28)
765#define SOP_RCK BIT(29) 788#define SOP_RCK BIT(29)
766#define SOP_A8M BIT(30) 789#define SOP_A8M BIT(30)
767#define XOP_BTCK BIT(31) 790#define XOP_BTCK BIT(31)
768 791
769#define ANAD16V_EN BIT(0) 792#define ANAD16V_EN BIT(0)
770#define ANA8M BIT(1) 793#define ANA8M BIT(1)
771#define MACSLP BIT(4) 794#define MACSLP BIT(4)
772#define LOADER_CLK_EN BIT(5) 795#define LOADER_CLK_EN BIT(5)
773#define _80M_SSC_DIS BIT(7) 796#define _80M_SSC_DIS BIT(7)
774#define _80M_SSC_EN_HO BIT(8) 797#define _80M_SSC_EN_HO BIT(8)
775#define PHY_SSC_RSTB BIT(9) 798#define PHY_SSC_RSTB BIT(9)
776#define SEC_CLK_EN BIT(10) 799#define SEC_CLK_EN BIT(10)
777#define MAC_CLK_EN BIT(11) 800#define MAC_CLK_EN BIT(11)
778#define SYS_CLK_EN BIT(12) 801#define SYS_CLK_EN BIT(12)
779#define RING_CLK_EN BIT(13) 802#define RING_CLK_EN BIT(13)
780 803
781#define BOOT_FROM_EEPROM BIT(4) 804#define BOOT_FROM_EEPROM BIT(4)
782#define EEPROM_EN BIT(5) 805#define EEPROM_EN BIT(5)
783 806
784#define AFE_BGEN BIT(0) 807#define AFE_BGEN BIT(0)
785#define AFE_MBEN BIT(1) 808#define AFE_MBEN BIT(1)
786#define MAC_ID_EN BIT(7) 809#define MAC_ID_EN BIT(7)
787 810
788#define WLOCK_ALL BIT(0) 811#define WLOCK_ALL BIT(0)
789#define WLOCK_00 BIT(1) 812#define WLOCK_00 BIT(1)
790#define WLOCK_04 BIT(2) 813#define WLOCK_04 BIT(2)
791#define WLOCK_08 BIT(3) 814#define WLOCK_08 BIT(3)
792#define WLOCK_40 BIT(4) 815#define WLOCK_40 BIT(4)
793#define R_DIS_PRST_0 BIT(5) 816#define R_DIS_PRST_0 BIT(5)
794#define R_DIS_PRST_1 BIT(6) 817#define R_DIS_PRST_1 BIT(6)
795#define LOCK_ALL_EN BIT(7) 818#define LOCK_ALL_EN BIT(7)
796 819
797#define RF_EN BIT(0) 820#define RF_EN BIT(0)
798#define RF_RSTB BIT(1) 821#define RF_RSTB BIT(1)
799#define RF_SDMRSTB BIT(2) 822#define RF_SDMRSTB BIT(2)
800 823
801#define LDA15_EN BIT(0) 824#define LDA15_EN BIT(0)
802#define LDA15_STBY BIT(1) 825#define LDA15_STBY BIT(1)
803#define LDA15_OBUF BIT(2) 826#define LDA15_OBUF BIT(2)
804#define LDA15_REG_VOS BIT(3) 827#define LDA15_REG_VOS BIT(3)
805#define _LDA15_VOADJ(x) (((x) & 0x7) << 4) 828#define _LDA15_VOADJ(x) (((x) & 0x7) << 4)
806 829
807#define LDV12_EN BIT(0) 830#define LDV12_EN BIT(0)
808#define LDV12_SDBY BIT(1) 831#define LDV12_SDBY BIT(1)
809#define LPLDO_HSM BIT(2) 832#define LPLDO_HSM BIT(2)
810#define LPLDO_LSM_DIS BIT(3) 833#define LPLDO_LSM_DIS BIT(3)
811#define _LDV12_VADJ(x) (((x) & 0xF) << 4) 834#define _LDV12_VADJ(x) (((x) & 0xF) << 4)
812 835
813#define XTAL_EN BIT(0) 836#define XTAL_EN BIT(0)
814#define XTAL_BSEL BIT(1) 837#define XTAL_BSEL BIT(1)
815#define _XTAL_BOSC(x) (((x) & 0x3) << 2) 838#define _XTAL_BOSC(x) (((x) & 0x3) << 2)
816#define _XTAL_CADJ(x) (((x) & 0xF) << 4) 839#define _XTAL_CADJ(x) (((x) & 0xF) << 4)
817#define XTAL_GATE_USB BIT(8) 840#define XTAL_GATE_USB BIT(8)
@@ -826,146 +849,146 @@
826#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21) 849#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21)
827#define _XTAL_GPIO(x) (((x) & 0x7) << 23) 850#define _XTAL_GPIO(x) (((x) & 0x7) << 23)
828 851
829#define CKDLY_AFE BIT(26) 852#define CKDLY_AFE BIT(26)
830#define CKDLY_USB BIT(27) 853#define CKDLY_USB BIT(27)
831#define CKDLY_DIG BIT(28) 854#define CKDLY_DIG BIT(28)
832#define CKDLY_BT BIT(29) 855#define CKDLY_BT BIT(29)
833 856
834#define APLL_EN BIT(0) 857#define APLL_EN BIT(0)
835#define APLL_320_EN BIT(1) 858#define APLL_320_EN BIT(1)
836#define APLL_FREF_SEL BIT(2) 859#define APLL_FREF_SEL BIT(2)
837#define APLL_EDGE_SEL BIT(3) 860#define APLL_EDGE_SEL BIT(3)
838#define APLL_WDOGB BIT(4) 861#define APLL_WDOGB BIT(4)
839#define APLL_LPFEN BIT(5) 862#define APLL_LPFEN BIT(5)
840 863
841#define APLL_REF_CLK_13MHZ 0x1 864#define APLL_REF_CLK_13MHZ 0x1
842#define APLL_REF_CLK_19_2MHZ 0x2 865#define APLL_REF_CLK_19_2MHZ 0x2
843#define APLL_REF_CLK_20MHZ 0x3 866#define APLL_REF_CLK_20MHZ 0x3
844#define APLL_REF_CLK_25MHZ 0x4 867#define APLL_REF_CLK_25MHZ 0x4
845#define APLL_REF_CLK_26MHZ 0x5 868#define APLL_REF_CLK_26MHZ 0x5
846#define APLL_REF_CLK_38_4MHZ 0x6 869#define APLL_REF_CLK_38_4MHZ 0x6
847#define APLL_REF_CLK_40MHZ 0x7 870#define APLL_REF_CLK_40MHZ 0x7
848 871
849#define APLL_320EN BIT(14) 872#define APLL_320EN BIT(14)
850#define APLL_80EN BIT(15) 873#define APLL_80EN BIT(15)
851#define APLL_1MEN BIT(24) 874#define APLL_1MEN BIT(24)
852 875
853#define ALD_EN BIT(18) 876#define ALD_EN BIT(18)
854#define EF_PD BIT(19) 877#define EF_PD BIT(19)
855#define EF_FLAG BIT(31) 878#define EF_FLAG BIT(31)
856 879
857#define EF_TRPT BIT(7) 880#define EF_TRPT BIT(7)
858#define LDOE25_EN BIT(31) 881#define LDOE25_EN BIT(31)
859 882
860#define RSM_EN BIT(0) 883#define RSM_EN BIT(0)
861#define Timer_EN BIT(4) 884#define TIMER_EN BIT(4)
862 885
863#define TRSW0EN BIT(2) 886#define TRSW0EN BIT(2)
864#define TRSW1EN BIT(3) 887#define TRSW1EN BIT(3)
865#define EROM_EN BIT(4) 888#define EROM_EN BIT(4)
866#define EnBT BIT(5) 889#define ENBT BIT(5)
867#define EnUart BIT(8) 890#define ENUART BIT(8)
868#define Uart_910 BIT(9) 891#define UART_910 BIT(9)
869#define EnPMAC BIT(10) 892#define ENPMAC BIT(10)
870#define SIC_SWRST BIT(11) 893#define SIC_SWRST BIT(11)
871#define EnSIC BIT(12) 894#define ENSIC BIT(12)
872#define SIC_23 BIT(13) 895#define SIC_23 BIT(13)
873#define EnHDP BIT(14) 896#define ENHDP BIT(14)
874#define SIC_LBK BIT(15) 897#define SIC_LBK BIT(15)
875 898
876#define LED0PL BIT(4) 899#define LED0PL BIT(4)
877#define LED1PL BIT(12) 900#define LED1PL BIT(12)
878#define LED0DIS BIT(7) 901#define LED0DIS BIT(7)
879 902
880#define MCUFWDL_EN BIT(0) 903#define MCUFWDL_EN BIT(0)
881#define MCUFWDL_RDY BIT(1) 904#define MCUFWDL_RDY BIT(1)
882#define FWDL_ChkSum_rpt BIT(2) 905#define FWDL_CHKSUM_RPT BIT(2)
883#define MACINI_RDY BIT(3) 906#define MACINI_RDY BIT(3)
884#define BBINI_RDY BIT(4) 907#define BBINI_RDY BIT(4)
885#define RFINI_RDY BIT(5) 908#define RFINI_RDY BIT(5)
886#define WINTINI_RDY BIT(6) 909#define WINTINI_RDY BIT(6)
887#define CPRST BIT(23) 910#define CPRST BIT(23)
888 911
889#define XCLK_VLD BIT(0) 912#define XCLK_VLD BIT(0)
890#define ACLK_VLD BIT(1) 913#define ACLK_VLD BIT(1)
891#define UCLK_VLD BIT(2) 914#define UCLK_VLD BIT(2)
892#define PCLK_VLD BIT(3) 915#define PCLK_VLD BIT(3)
893#define PCIRSTB BIT(4) 916#define PCIRSTB BIT(4)
894#define V15_VLD BIT(5) 917#define V15_VLD BIT(5)
895#define TRP_B15V_EN BIT(7) 918#define TRP_B15V_EN BIT(7)
896#define SIC_IDLE BIT(8) 919#define SIC_IDLE BIT(8)
897#define BD_MAC2 BIT(9) 920#define BD_MAC2 BIT(9)
898#define BD_MAC1 BIT(10) 921#define BD_MAC1 BIT(10)
899#define IC_MACPHY_MODE BIT(11) 922#define IC_MACPHY_MODE BIT(11)
900#define BT_FUNC BIT(16) 923#define BT_FUNC BIT(16)
901#define VENDOR_ID BIT(19) 924#define VENDOR_ID BIT(19)
902#define PAD_HWPD_IDN BIT(22) 925#define PAD_HWPD_IDN BIT(22)
903#define TRP_VAUX_EN BIT(23) 926#define TRP_VAUX_EN BIT(23)
904#define TRP_BT_EN BIT(24) 927#define TRP_BT_EN BIT(24)
905#define BD_PKG_SEL BIT(25) 928#define BD_PKG_SEL BIT(25)
906#define BD_HCI_SEL BIT(26) 929#define BD_HCI_SEL BIT(26)
907#define TYPE_ID BIT(27) 930#define TYPE_ID BIT(27)
908 931
909#define CHIP_VER_RTL_MASK 0xF000 932#define CHIP_VER_RTL_MASK 0xF000
910#define CHIP_VER_RTL_SHIFT 12 933#define CHIP_VER_RTL_SHIFT 12
911 934
912#define REG_LBMODE (REG_CR + 3) 935#define REG_LBMODE (REG_CR + 3)
913 936
914#define HCI_TXDMA_EN BIT(0) 937#define HCI_TXDMA_EN BIT(0)
915#define HCI_RXDMA_EN BIT(1) 938#define HCI_RXDMA_EN BIT(1)
916#define TXDMA_EN BIT(2) 939#define TXDMA_EN BIT(2)
917#define RXDMA_EN BIT(3) 940#define RXDMA_EN BIT(3)
918#define PROTOCOL_EN BIT(4) 941#define PROTOCOL_EN BIT(4)
919#define SCHEDULE_EN BIT(5) 942#define SCHEDULE_EN BIT(5)
920#define MACTXEN BIT(6) 943#define MACTXEN BIT(6)
921#define MACRXEN BIT(7) 944#define MACRXEN BIT(7)
922#define ENSWBCN BIT(8) 945#define ENSWBCN BIT(8)
923#define ENSEC BIT(9) 946#define ENSEC BIT(9)
924 947
925#define _NETTYPE(x) (((x) & 0x3) << 16) 948#define _NETTYPE(x) (((x) & 0x3) << 16)
926#define MASK_NETTYPE 0x30000 949#define MASK_NETTYPE 0x30000
927#define NT_NO_LINK 0x0 950#define NT_NO_LINK 0x0
928#define NT_LINK_AD_HOC 0x1 951#define NT_LINK_AD_HOC 0x1
929#define NT_LINK_AP 0x2 952#define NT_LINK_AP 0x2
930#define NT_AS_AP 0x3 953#define NT_AS_AP 0x3
931 954
932#define _LBMODE(x) (((x) & 0xF) << 24) 955#define _LBMODE(x) (((x) & 0xF) << 24)
933#define MASK_LBMODE 0xF000000 956#define MASK_LBMODE 0xF000000
934#define LOOPBACK_NORMAL 0x0 957#define LOOPBACK_NORMAL 0x0
935#define LOOPBACK_IMMEDIATELY 0xB 958#define LOOPBACK_IMMEDIATELY 0xB
936#define LOOPBACK_MAC_DELAY 0x3 959#define LOOPBACK_MAC_DELAY 0x3
937#define LOOPBACK_PHY 0x1 960#define LOOPBACK_PHY 0x1
938#define LOOPBACK_DMA 0x7 961#define LOOPBACK_DMA 0x7
939 962
940#define GET_RX_PAGE_SIZE(value) ((value) & 0xF) 963#define GET_RX_PAGE_SIZE(value) ((value) & 0xF)
941#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4) 964#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4)
942#define _PSRX_MASK 0xF 965#define _PSRX_MASK 0xF
943#define _PSTX_MASK 0xF0 966#define _PSTX_MASK 0xF0
944#define _PSRX(x) (x) 967#define _PSRX(x) (x)
945#define _PSTX(x) ((x) << 4) 968#define _PSTX(x) ((x) << 4)
946 969
947#define PBP_64 0x0 970#define PBP_64 0x0
948#define PBP_128 0x1 971#define PBP_128 0x1
949#define PBP_256 0x2 972#define PBP_256 0x2
950#define PBP_512 0x3 973#define PBP_512 0x3
951#define PBP_1024 0x4 974#define PBP_1024 0x4
952 975
953#define RXDMA_ARBBW_EN BIT(0) 976#define RXDMA_ARBBW_EN BIT(0)
954#define RXSHFT_EN BIT(1) 977#define RXSHFT_EN BIT(1)
955#define RXDMA_AGG_EN BIT(2) 978#define RXDMA_AGG_EN BIT(2)
956#define QS_VO_QUEUE BIT(8) 979#define QS_VO_QUEUE BIT(8)
957#define QS_VI_QUEUE BIT(9) 980#define QS_VI_QUEUE BIT(9)
958#define QS_BE_QUEUE BIT(10) 981#define QS_BE_QUEUE BIT(10)
959#define QS_BK_QUEUE BIT(11) 982#define QS_BK_QUEUE BIT(11)
960#define QS_MANAGER_QUEUE BIT(12) 983#define QS_MANAGER_QUEUE BIT(12)
961#define QS_HIGH_QUEUE BIT(13) 984#define QS_HIGH_QUEUE BIT(13)
962 985
963#define HQSEL_VOQ BIT(0) 986#define HQSEL_VOQ BIT(0)
964#define HQSEL_VIQ BIT(1) 987#define HQSEL_VIQ BIT(1)
965#define HQSEL_BEQ BIT(2) 988#define HQSEL_BEQ BIT(2)
966#define HQSEL_BKQ BIT(3) 989#define HQSEL_BKQ BIT(3)
967#define HQSEL_MGTQ BIT(4) 990#define HQSEL_MGTQ BIT(4)
968#define HQSEL_HIQ BIT(5) 991#define HQSEL_HIQ BIT(5)
969 992
970#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14) 993#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14)
971#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12) 994#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12)
@@ -974,9 +997,9 @@
974#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6) 997#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6)
975#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4) 998#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4)
976 999
977#define QUEUE_LOW 1 1000#define QUEUE_LOW 1
978#define QUEUE_NORMAL 2 1001#define QUEUE_NORMAL 2
979#define QUEUE_HIGH 3 1002#define QUEUE_HIGH 3
980 1003
981#define _LLT_NO_ACTIVE 0x0 1004#define _LLT_NO_ACTIVE 0x0
982#define _LLT_WRITE_ACCESS 0x1 1005#define _LLT_WRITE_ACCESS 0x1
@@ -984,25 +1007,25 @@
984 1007
985#define _LLT_INIT_DATA(x) ((x) & 0xFF) 1008#define _LLT_INIT_DATA(x) ((x) & 0xFF)
986#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8) 1009#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8)
987#define _LLT_OP(x) (((x) & 0x3) << 30) 1010#define _LLT_OP(x) (((x) & 0x3) << 30)
988#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3) 1011#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3)
989 1012
990#define BB_WRITE_READ_MASK (BIT(31) | BIT(30)) 1013#define BB_WRITE_READ_MASK (BIT(31) | BIT(30))
991#define BB_WRITE_EN BIT(30) 1014#define BB_WRITE_EN BIT(30)
992#define BB_READ_EN BIT(31) 1015#define BB_READ_EN BIT(31)
993 1016
994#define _HPQ(x) ((x) & 0xFF) 1017#define _HPQ(x) ((x) & 0xFF)
995#define _LPQ(x) (((x) & 0xFF) << 8) 1018#define _LPQ(x) (((x) & 0xFF) << 8)
996#define _PUBQ(x) (((x) & 0xFF) << 16) 1019#define _PUBQ(x) (((x) & 0xFF) << 16)
997#define _NPQ(x) ((x) & 0xFF) 1020#define _NPQ(x) ((x) & 0xFF)
998 1021
999#define HPQ_PUBLIC_DIS BIT(24) 1022#define HPQ_PUBLIC_DIS BIT(24)
1000#define LPQ_PUBLIC_DIS BIT(25) 1023#define LPQ_PUBLIC_DIS BIT(25)
1001#define LD_RQPN BIT(31) 1024#define LD_RQPN BIT(31)
1002 1025
1003#define BCN_VALID BIT(16) 1026#define BCN_VALID BIT(16)
1004#define BCN_HEAD(x) (((x) & 0xFF) << 8) 1027#define BCN_HEAD(x) (((x) & 0xFF) << 8)
1005#define BCN_HEAD_MASK 0xFF00 1028#define BCN_HEAD_MASK 0xFF00
1006 1029
1007#define BLK_DESC_NUM_SHIFT 4 1030#define BLK_DESC_NUM_SHIFT 4
1008#define BLK_DESC_NUM_MASK 0xF 1031#define BLK_DESC_NUM_MASK 0xF
@@ -1022,9 +1045,9 @@
1022 1045
1023#define _RRSR_RSC(x) (((x) & 0x3) << 21) 1046#define _RRSR_RSC(x) (((x) & 0x3) << 21)
1024#define RRSR_RSC_RESERVED 0x0 1047#define RRSR_RSC_RESERVED 0x0
1025#define RRSR_RSC_UPPER_SUBCHANNEL 0x1 1048#define RRSR_RSC_UPPER_SUBCHANNEL 0x1
1026#define RRSR_RSC_LOWER_SUBCHANNEL 0x2 1049#define RRSR_RSC_LOWER_SUBCHANNEL 0x2
1027#define RRSR_RSC_DUPLICATE_MODE 0x3 1050#define RRSR_RSC_DUPLICATE_MODE 0x3
1028 1051
1029#define USE_SHORT_G1 BIT(20) 1052#define USE_SHORT_G1 BIT(20)
1030 1053
@@ -1037,8 +1060,8 @@
1037#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24) 1060#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24)
1038#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28) 1061#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28)
1039 1062
1040#define RETRY_LIMIT_SHORT_SHIFT 8 1063#define RETRY_LIMIT_SHORT_SHIFT 8
1041#define RETRY_LIMIT_LONG_SHIFT 0 1064#define RETRY_LIMIT_LONG_SHIFT 0
1042 1065
1043#define _DARF_RC1(x) ((x) & 0x1F) 1066#define _DARF_RC1(x) ((x) & 0x1F)
1044#define _DARF_RC2(x) (((x) & 0x1F) << 8) 1067#define _DARF_RC2(x) (((x) & 0x1F) << 8)
@@ -1058,123 +1081,123 @@
1058#define _RARF_RC7(x) (((x) & 0x1F) << 16) 1081#define _RARF_RC7(x) (((x) & 0x1F) << 16)
1059#define _RARF_RC8(x) (((x) & 0x1F) << 24) 1082#define _RARF_RC8(x) (((x) & 0x1F) << 24)
1060 1083
1061#define AC_PARAM_TXOP_LIMIT_OFFSET 16 1084#define AC_PARAM_TXOP_LIMIT_OFFSET 16
1062#define AC_PARAM_ECW_MAX_OFFSET 12 1085#define AC_PARAM_ECW_MAX_OFFSET 12
1063#define AC_PARAM_ECW_MIN_OFFSET 8 1086#define AC_PARAM_ECW_MIN_OFFSET 8
1064#define AC_PARAM_AIFS_OFFSET 0 1087#define AC_PARAM_AIFS_OFFSET 0
1065 1088
1066#define _AIFS(x) (x) 1089#define _AIFS(x) (x)
1067#define _ECW_MAX_MIN(x) ((x) << 8) 1090#define _ECW_MAX_MIN(x) ((x) << 8)
1068#define _TXOP_LIMIT(x) ((x) << 16) 1091#define _TXOP_LIMIT(x) ((x) << 16)
1069 1092
1070#define _BCNIFS(x) ((x) & 0xFF) 1093#define _BCNIFS(x) ((x) & 0xFF)
1071#define _BCNECW(x) ((((x) & 0xF)) << 8) 1094#define _BCNECW(x) ((((x) & 0xF)) << 8)
1072 1095
1073#define _LRL(x) ((x) & 0x3F) 1096#define _LRL(x) ((x) & 0x3F)
1074#define _SRL(x) (((x) & 0x3F) << 8) 1097#define _SRL(x) (((x) & 0x3F) << 8)
1075 1098
1076#define _SIFS_CCK_CTX(x) ((x) & 0xFF) 1099#define _SIFS_CCK_CTX(x) ((x) & 0xFF)
1077#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8); 1100#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8)
1078 1101
1079#define _SIFS_OFDM_CTX(x) ((x) & 0xFF) 1102#define _SIFS_OFDM_CTX(x) ((x) & 0xFF)
1080#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8); 1103#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8)
1081 1104
1082#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8) 1105#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8)
1083 1106
1084#define DIS_EDCA_CNT_DWN BIT(11) 1107#define DIS_EDCA_CNT_DWN BIT(11)
1085 1108
1086#define EN_MBSSID BIT(1) 1109#define EN_MBSSID BIT(1)
1087#define EN_TXBCN_RPT BIT(2) 1110#define EN_TXBCN_RPT BIT(2)
1088#define EN_BCN_FUNCTION BIT(3) 1111#define EN_BCN_FUNCTION BIT(3)
1089 1112
1090#define TSFTR_RST BIT(0) 1113#define TSFTR_RST BIT(0)
1091#define TSFTR1_RST BIT(1) 1114#define TSFTR1_RST BIT(1)
1092 1115
1093#define STOP_BCNQ BIT(6) 1116#define STOP_BCNQ BIT(6)
1094 1117
1095#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4) 1118#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4)
1096#define DIS_TSF_UDT0_TEST_CHIP BIT(5) 1119#define DIS_TSF_UDT0_TEST_CHIP BIT(5)
1097 1120
1098#define AcmHw_HwEn BIT(0) 1121#define ACMHW_HWEN BIT(0)
1099#define AcmHw_BeqEn BIT(1) 1122#define ACMHW_BEQEN BIT(1)
1100#define AcmHw_ViqEn BIT(2) 1123#define ACMHW_VIQEN BIT(2)
1101#define AcmHw_VoqEn BIT(3) 1124#define ACMHW_VOQEN BIT(3)
1102#define AcmHw_BeqStatus BIT(4) 1125#define ACMHW_BEQSTATUS BIT(4)
1103#define AcmHw_ViqStatus BIT(5) 1126#define ACMHW_VIQSTATUS BIT(5)
1104#define AcmHw_VoqStatus BIT(6) 1127#define ACMHW_VOQSTATUS BIT(6)
1105 1128
1106#define APSDOFF BIT(6) 1129#define APSDOFF BIT(6)
1107#define APSDOFF_STATUS BIT(7) 1130#define APSDOFF_STATUS BIT(7)
1108 1131
1109#define BW_20MHZ BIT(2) 1132#define BW_20MHZ BIT(2)
1110 1133
1111#define RATE_BITMAP_ALL 0xFFFFF 1134#define RATE_BITMAP_ALL 0xFFFFF
1112 1135
1113#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1 1136#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1
1114 1137
1115#define TSFRST BIT(0) 1138#define TSFRST BIT(0)
1116#define DIS_GCLK BIT(1) 1139#define DIS_GCLK BIT(1)
1117#define PAD_SEL BIT(2) 1140#define PAD_SEL BIT(2)
1118#define PWR_ST BIT(6) 1141#define PWR_ST BIT(6)
1119#define PWRBIT_OW_EN BIT(7) 1142#define PWRBIT_OW_EN BIT(7)
1120#define ACRC BIT(8) 1143#define ACRC BIT(8)
1121#define CFENDFORM BIT(9) 1144#define CFENDFORM BIT(9)
1122#define ICV BIT(10) 1145#define ICV BIT(10)
1123 1146
1124#define AAP BIT(0) 1147#define AAP BIT(0)
1125#define APM BIT(1) 1148#define APM BIT(1)
1126#define AM BIT(2) 1149#define AM BIT(2)
1127#define AB BIT(3) 1150#define AB BIT(3)
1128#define ADD3 BIT(4) 1151#define ADD3 BIT(4)
1129#define APWRMGT BIT(5) 1152#define APWRMGT BIT(5)
1130#define CBSSID BIT(6) 1153#define CBSSID BIT(6)
1131#define CBSSID_DATA BIT(6) 1154#define CBSSID_DATA BIT(6)
1132#define CBSSID_BCN BIT(7) 1155#define CBSSID_BCN BIT(7)
1133#define ACRC32 BIT(8) 1156#define ACRC32 BIT(8)
1134#define AICV BIT(9) 1157#define AICV BIT(9)
1135#define ADF BIT(11) 1158#define ADF BIT(11)
1136#define ACF BIT(12) 1159#define ACF BIT(12)
1137#define AMF BIT(13) 1160#define AMF BIT(13)
1138#define HTC_LOC_CTRL BIT(14) 1161#define HTC_LOC_CTRL BIT(14)
1139#define UC_DATA_EN BIT(16) 1162#define UC_DATA_EN BIT(16)
1140#define BM_DATA_EN BIT(17) 1163#define BM_DATA_EN BIT(17)
1141#define MFBEN BIT(22) 1164#define MFBEN BIT(22)
1142#define LSIGEN BIT(23) 1165#define LSIGEN BIT(23)
1143#define EnMBID BIT(24) 1166#define ENMBID BIT(24)
1144#define APP_BASSN BIT(27) 1167#define APP_BASSN BIT(27)
1145#define APP_PHYSTS BIT(28) 1168#define APP_PHYSTS BIT(28)
1146#define APP_ICV BIT(29) 1169#define APP_ICV BIT(29)
1147#define APP_MIC BIT(30) 1170#define APP_MIC BIT(30)
1148#define APP_FCS BIT(31) 1171#define APP_FCS BIT(31)
1149 1172
1150#define _MIN_SPACE(x) ((x) & 0x7) 1173#define _MIN_SPACE(x) ((x) & 0x7)
1151#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) 1174#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
1152 1175
1153#define RXERR_TYPE_OFDM_PPDU 0 1176#define RXERR_TYPE_OFDM_PPDU 0
1154#define RXERR_TYPE_OFDM_FALSE_ALARM 1 1177#define RXERR_TYPE_OFDM_FALSE_ALARM 1
1155#define RXERR_TYPE_OFDM_MPDU_OK 2 1178#define RXERR_TYPE_OFDM_MPDU_OK 2
1156#define RXERR_TYPE_OFDM_MPDU_FAIL 3 1179#define RXERR_TYPE_OFDM_MPDU_FAIL 3
1157#define RXERR_TYPE_CCK_PPDU 4 1180#define RXERR_TYPE_CCK_PPDU 4
1158#define RXERR_TYPE_CCK_FALSE_ALARM 5 1181#define RXERR_TYPE_CCK_FALSE_ALARM 5
1159#define RXERR_TYPE_CCK_MPDU_OK 6 1182#define RXERR_TYPE_CCK_MPDU_OK 6
1160#define RXERR_TYPE_CCK_MPDU_FAIL 7 1183#define RXERR_TYPE_CCK_MPDU_FAIL 7
1161#define RXERR_TYPE_HT_PPDU 8 1184#define RXERR_TYPE_HT_PPDU 8
1162#define RXERR_TYPE_HT_FALSE_ALARM 9 1185#define RXERR_TYPE_HT_FALSE_ALARM 9
1163#define RXERR_TYPE_HT_MPDU_TOTAL 10 1186#define RXERR_TYPE_HT_MPDU_TOTAL 10
1164#define RXERR_TYPE_HT_MPDU_OK 11 1187#define RXERR_TYPE_HT_MPDU_OK 11
1165#define RXERR_TYPE_HT_MPDU_FAIL 12 1188#define RXERR_TYPE_HT_MPDU_FAIL 12
1166#define RXERR_TYPE_RX_FULL_DROP 15 1189#define RXERR_TYPE_RX_FULL_DROP 15
1167 1190
1168#define RXERR_COUNTER_MASK 0xFFFFF 1191#define RXERR_COUNTER_MASK 0xFFFFF
1169#define RXERR_RPT_RST BIT(27) 1192#define RXERR_RPT_RST BIT(27)
1170#define _RXERR_RPT_SEL(type) ((type) << 28) 1193#define _RXERR_RPT_SEL(type) ((type) << 28)
1171 1194
1172#define SCR_TxUseDK BIT(0) 1195#define SCR_TXUSEDK BIT(0)
1173#define SCR_RxUseDK BIT(1) 1196#define SCR_RXUSEDK BIT(1)
1174#define SCR_TxEncEnable BIT(2) 1197#define SCR_TXENCENABLE BIT(2)
1175#define SCR_RxDecEnable BIT(3) 1198#define SCR_RXDECENABLE BIT(3)
1176#define SCR_SKByA2 BIT(4) 1199#define SCR_SKBYA2 BIT(4)
1177#define SCR_NoSKMC BIT(5) 1200#define SCR_NOSKMC BIT(5)
1178#define SCR_TXBCUSEDK BIT(6) 1201#define SCR_TXBCUSEDK BIT(6)
1179#define SCR_RXBCUSEDK BIT(7) 1202#define SCR_RXBCUSEDK BIT(7)
1180 1203
@@ -1182,32 +1205,32 @@
1182#define USB_IS_FULL_SPEED 1 1205#define USB_IS_FULL_SPEED 1
1183#define USB_SPEED_MASK BIT(5) 1206#define USB_SPEED_MASK BIT(5)
1184 1207
1185#define USB_NORMAL_SIE_EP_MASK 0xF 1208#define USB_NORMAL_SIE_EP_MASK 0xF
1186#define USB_NORMAL_SIE_EP_SHIFT 4 1209#define USB_NORMAL_SIE_EP_SHIFT 4
1187 1210
1188#define USB_TEST_EP_MASK 0x30 1211#define USB_TEST_EP_MASK 0x30
1189#define USB_TEST_EP_SHIFT 4 1212#define USB_TEST_EP_SHIFT 4
1190 1213
1191#define USB_AGG_EN BIT(3) 1214#define USB_AGG_EN BIT(3)
1192 1215
1193#define MAC_ADDR_LEN 6 1216#define MAC_ADDR_LEN 6
1194#define LAST_ENTRY_OF_TX_PKT_BUFFER 255 1217#define LAST_ENTRY_OF_TX_PKT_BUFFER 255
1195 1218
1196#define POLLING_LLT_THRESHOLD 20 1219#define POLLING_LLT_THRESHOLD 20
1197#define POLLING_READY_TIMEOUT_COUNT 1000 1220#define POLLING_READY_TIMEOUT_COUNT 1000
1198 1221
1199#define MAX_MSS_DENSITY_2T 0x13 1222#define MAX_MSS_DENSITY_2T 0x13
1200#define MAX_MSS_DENSITY_1T 0x0A 1223#define MAX_MSS_DENSITY_1T 0x0A
1201 1224
1202#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6)) 1225#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6))
1203#define EPROM_CMD_CONFIG 0x3 1226#define EPROM_CMD_CONFIG 0x3
1204#define EPROM_CMD_LOAD 1 1227#define EPROM_CMD_LOAD 1
1205 1228
1206#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE 1229#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE
1207 1230
1208#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2) 1231#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2)
1209 1232
1210#define RPMAC_RESET 0x100 1233#define RPMAC_RESET 0x100
1211#define RPMAC_TXSTART 0x104 1234#define RPMAC_TXSTART 0x104
1212#define RPMAC_TXLEGACYSIG 0x108 1235#define RPMAC_TXLEGACYSIG 0x108
1213#define RPMAC_TXHTSIG1 0x10c 1236#define RPMAC_TXHTSIG1 0x10c
@@ -1223,12 +1246,12 @@
1223#define RPMAC_TXMACHEADER5 0x134 1246#define RPMAC_TXMACHEADER5 0x134
1224#define RPMAC_TXDADATYPE 0x138 1247#define RPMAC_TXDADATYPE 0x138
1225#define RPMAC_TXRANDOMSEED 0x13c 1248#define RPMAC_TXRANDOMSEED 0x13c
1226#define RPMAC_CCKPLCPPREAMBLE 0x140 1249#define RPMAC_CCKPLCPPREAMBLE 0x140
1227#define RPMAC_CCKPLCPHEADER 0x144 1250#define RPMAC_CCKPLCPHEADER 0x144
1228#define RPMAC_CCKCRC16 0x148 1251#define RPMAC_CCKCRC16 0x148
1229#define RPMAC_OFDMRXCRC32OK 0x170 1252#define RPMAC_OFDMRXCRC32OK 0x170
1230#define RPMAC_OFDMRXCRC32Er 0x174 1253#define RPMAC_OFDMRXCRC32ER 0x174
1231#define RPMAC_OFDMRXPARITYER 0x178 1254#define RPMAC_OFDMRXPARITYER 0x178
1232#define RPMAC_OFDMRXCRC8ER 0x17c 1255#define RPMAC_OFDMRXCRC8ER 0x17c
1233#define RPMAC_CCKCRXRC16ER 0x180 1256#define RPMAC_CCKCRXRC16ER 0x180
1234#define RPMAC_CCKCRXRC32ER 0x184 1257#define RPMAC_CCKCRXRC32ER 0x184
@@ -1245,44 +1268,44 @@
1245#define RFPGA0_RFTIMING1 0x810 1268#define RFPGA0_RFTIMING1 0x810
1246#define RFPGA0_RFTIMING2 0x814 1269#define RFPGA0_RFTIMING2 0x814
1247 1270
1248#define RFPGA0_XA_HSSIPARAMETER1 0x820 1271#define RFPGA0_XA_HSSIPARAMETER1 0x820
1249#define RFPGA0_XA_HSSIPARAMETER2 0x824 1272#define RFPGA0_XA_HSSIPARAMETER2 0x824
1250#define RFPGA0_XB_HSSIPARAMETER1 0x828 1273#define RFPGA0_XB_HSSIPARAMETER1 0x828
1251#define RFPGA0_XB_HSSIPARAMETER2 0x82c 1274#define RFPGA0_XB_HSSIPARAMETER2 0x82c
1252 1275
1253#define RFPGA0_XA_LSSIPARAMETER 0x840 1276#define RFPGA0_XA_LSSIPARAMETER 0x840
1254#define RFPGA0_XB_LSSIPARAMETER 0x844 1277#define RFPGA0_XB_LSSIPARAMETER 0x844
1255 1278
1256#define RFPGA0_RFWAKEUPPARAMETER 0x850 1279#define RFPGA0_RFWAKEUPPARAMETER 0x850
1257#define RFPGA0_RFSLEEPUPPARAMETER 0x854 1280#define RFPGA0_RFSLEEPUPPARAMETER 0x854
1258 1281
1259#define RFPGA0_XAB_SWITCHCONTROL 0x858 1282#define RFPGA0_XAB_SWITCHCONTROL 0x858
1260#define RFPGA0_XCD_SWITCHCONTROL 0x85c 1283#define RFPGA0_XCD_SWITCHCONTROL 0x85c
1261 1284
1262#define RFPGA0_XA_RFINTERFACEOE 0x860 1285#define RFPGA0_XA_RFINTERFACEOE 0x860
1263#define RFPGA0_XB_RFINTERFACEOE 0x864 1286#define RFPGA0_XB_RFINTERFACEOE 0x864
1264 1287
1265#define RFPGA0_XAB_RFINTERFACESW 0x870 1288#define RFPGA0_XAB_RFINTERFACESW 0x870
1266#define RFPGA0_XCD_RFINTERFACESW 0x874 1289#define RFPGA0_XCD_RFINTERFACESW 0x874
1267 1290
1268#define rFPGA0_XAB_RFPARAMETER 0x878 1291#define RFPGA0_XAB_RFPARAMETER 0x878
1269#define rFPGA0_XCD_RFPARAMETER 0x87c 1292#define RFPGA0_XCD_RFPARAMETER 0x87c
1270 1293
1271#define RFPGA0_ANALOGPARAMETER1 0x880 1294#define RFPGA0_ANALOGPARAMETER1 0x880
1272#define RFPGA0_ANALOGPARAMETER2 0x884 1295#define RFPGA0_ANALOGPARAMETER2 0x884
1273#define RFPGA0_ANALOGPARAMETER3 0x888 1296#define RFPGA0_ANALOGPARAMETER3 0x888
1274#define RFPGA0_ANALOGPARAMETER4 0x88c 1297#define RFPGA0_ANALOGPARAMETER4 0x88c
1275 1298
1276#define RFPGA0_XA_LSSIREADBACK 0x8a0 1299#define RFPGA0_XA_LSSIREADBACK 0x8a0
1277#define RFPGA0_XB_LSSIREADBACK 0x8a4 1300#define RFPGA0_XB_LSSIREADBACK 0x8a4
1278#define RFPGA0_XC_LSSIREADBACK 0x8a8 1301#define RFPGA0_XC_LSSIREADBACK 0x8a8
1279#define RFPGA0_XD_LSSIREADBACK 0x8ac 1302#define RFPGA0_XD_LSSIREADBACK 0x8ac
1280 1303
1281#define RFPGA0_PSDREPORT 0x8b4 1304#define RFPGA0_PSDREPORT 0x8b4
1282#define TRANSCEIVEA_HSPI_READBACK 0x8b8 1305#define TRANSCEIVEA_HSPI_READBACK 0x8b8
1283#define TRANSCEIVEB_HSPI_READBACK 0x8bc 1306#define TRANSCEIVEB_HSPI_READBACK 0x8bc
1284#define RFPGA0_XAB_RFINTERFACERB 0x8e0 1307#define RFPGA0_XAB_RFINTERFACERB 0x8e0
1285#define RFPGA0_XCD_RFINTERFACERB 0x8e4 1308#define RFPGA0_XCD_RFINTERFACERB 0x8e4
1286 1309
1287#define RFPGA1_RFMOD 0x900 1310#define RFPGA1_RFMOD 0x900
1288 1311
@@ -1293,12 +1316,12 @@
1293#define RCCK0_SYSTEM 0xa00 1316#define RCCK0_SYSTEM 0xa00
1294 1317
1295#define RCCK0_AFESETTING 0xa04 1318#define RCCK0_AFESETTING 0xa04
1296#define RCCK0_CCA 0xa08 1319#define RCCK0_CCA 0xa08
1297 1320
1298#define RCCK0_RXAGC1 0xa0c 1321#define RCCK0_RXAGC1 0xa0c
1299#define RCCK0_RXAGC2 0xa10 1322#define RCCK0_RXAGC2 0xa10
1300 1323
1301#define RCCK0_RXHP 0xa14 1324#define RCCK0_RXHP 0xa14
1302 1325
1303#define RCCK0_DSPPARAMETER1 0xa18 1326#define RCCK0_DSPPARAMETER1 0xa18
1304#define RCCK0_DSPPARAMETER2 0xa1c 1327#define RCCK0_DSPPARAMETER2 0xa1c
@@ -1306,26 +1329,26 @@
1306#define RCCK0_TXFILTER1 0xa20 1329#define RCCK0_TXFILTER1 0xa20
1307#define RCCK0_TXFILTER2 0xa24 1330#define RCCK0_TXFILTER2 0xa24
1308#define RCCK0_DEBUGPORT 0xa28 1331#define RCCK0_DEBUGPORT 0xa28
1309#define RCCK0_FALSEALARMREPORT 0xa2c 1332#define RCCK0_FALSEALARMREPORT 0xa2c
1310#define RCCK0_TRSSIREPORT 0xa50 1333#define RCCK0_TRSSIREPORT 0xa50
1311#define RCCK0_RXREPORT 0xa54 1334#define RCCK0_RXREPORT 0xa54
1312#define RCCK0_FACOUNTERLOWER 0xa5c 1335#define RCCK0_FACOUNTERLOWER 0xa5c
1313#define RCCK0_FACOUNTERUPPER 0xa58 1336#define RCCK0_FACOUNTERUPPER 0xa58
1314 1337
1315#define ROFDM0_LSTF 0xc00 1338#define ROFDM0_LSTF 0xc00
1316 1339
1317#define ROFDM0_TRXPATHENABLE 0xc04 1340#define ROFDM0_TRXPATHENABLE 0xc04
1318#define ROFDM0_TRMUXPAR 0xc08 1341#define ROFDM0_TRMUXPAR 0xc08
1319#define ROFDM0_TRSWISOLATION 0xc0c 1342#define ROFDM0_TRSWISOLATION 0xc0c
1320 1343
1321#define ROFDM0_XARXAFE 0xc10 1344#define ROFDM0_XARXAFE 0xc10
1322#define ROFDM0_XARXIQIMBALANCE 0xc14 1345#define ROFDM0_XARXIQIMBALANCE 0xc14
1323#define ROFDM0_XBRXAFE 0xc18 1346#define ROFDM0_XBRXAFE 0xc18
1324#define ROFDM0_XBRXIQIMBALANCE 0xc1c 1347#define ROFDM0_XBRXIQIMBALANCE 0xc1c
1325#define ROFDM0_XCRXAFE 0xc20 1348#define ROFDM0_XCRXAFE 0xc20
1326#define ROFDM0_XCRXIQIMBANLANCE 0xc24 1349#define ROFDM0_XCRXIQIMBANLANCE 0xc24
1327#define ROFDM0_XDRXAFE 0xc28 1350#define ROFDM0_XDRXAFE 0xc28
1328#define ROFDM0_XDRXIQIMBALANCE 0xc2c 1351#define ROFDM0_XDRXIQIMBALANCE 0xc2c
1329 1352
1330#define ROFDM0_RXDETECTOR1 0xc30 1353#define ROFDM0_RXDETECTOR1 0xc30
1331#define ROFDM0_RXDETECTOR2 0xc34 1354#define ROFDM0_RXDETECTOR2 0xc34
@@ -1334,8 +1357,8 @@
1334 1357
1335#define ROFDM0_RXDSP 0xc40 1358#define ROFDM0_RXDSP 0xc40
1336#define ROFDM0_CFOANDDAGC 0xc44 1359#define ROFDM0_CFOANDDAGC 0xc44
1337#define ROFDM0_CCADROPTHRESHOLD 0xc48 1360#define ROFDM0_CCADROPTHRESHOLD 0xc48
1338#define ROFDM0_ECCATHRESHOLD 0xc4c 1361#define ROFDM0_ECCATHRESHOLD 0xc4c
1339 1362
1340#define ROFDM0_XAAGCCORE1 0xc50 1363#define ROFDM0_XAAGCCORE1 0xc50
1341#define ROFDM0_XAAGCCORE2 0xc54 1364#define ROFDM0_XAAGCCORE2 0xc54
@@ -1346,24 +1369,24 @@
1346#define ROFDM0_XDAGCCORE1 0xc68 1369#define ROFDM0_XDAGCCORE1 0xc68
1347#define ROFDM0_XDAGCCORE2 0xc6c 1370#define ROFDM0_XDAGCCORE2 0xc6c
1348 1371
1349#define ROFDM0_AGCPARAMETER1 0xc70 1372#define ROFDM0_AGCPARAMETER1 0xc70
1350#define ROFDM0_AGCPARAMETER2 0xc74 1373#define ROFDM0_AGCPARAMETER2 0xc74
1351#define ROFDM0_AGCRSSITABLE 0xc78 1374#define ROFDM0_AGCRSSITABLE 0xc78
1352#define ROFDM0_HTSTFAGC 0xc7c 1375#define ROFDM0_HTSTFAGC 0xc7c
1353 1376
1354#define ROFDM0_XATXIQIMBALANCE 0xc80 1377#define ROFDM0_XATXIQIMBALANCE 0xc80
1355#define ROFDM0_XATXAFE 0xc84 1378#define ROFDM0_XATXAFE 0xc84
1356#define ROFDM0_XBTXIQIMBALANCE 0xc88 1379#define ROFDM0_XBTXIQIMBALANCE 0xc88
1357#define ROFDM0_XBTXAFE 0xc8c 1380#define ROFDM0_XBTXAFE 0xc8c
1358#define ROFDM0_XCTXIQIMBALANCE 0xc90 1381#define ROFDM0_XCTXIQIMBALANCE 0xc90
1359#define ROFDM0_XCTXAFE 0xc94 1382#define ROFDM0_XCTXAFE 0xc94
1360#define ROFDM0_XDTXIQIMBALANCE 0xc98 1383#define ROFDM0_XDTXIQIMBALANCE 0xc98
1361#define ROFDM0_XDTXAFE 0xc9c 1384#define ROFDM0_XDTXAFE 0xc9c
1362 1385
1363#define ROFDM0_RXIQEXTANTA 0xca0 1386#define ROFDM0_RXIQEXTANTA 0xca0
1364 1387
1365#define ROFDM0_RXHPPARAMETER 0xce0 1388#define ROFDM0_RXHPPARAMETER 0xce0
1366#define ROFDM0_TXPSEUDONOISEWGT 0xce4 1389#define ROFDM0_TXPSEUDONOISEWGT 0xce4
1367#define ROFDM0_FRAMESYNC 0xcf0 1390#define ROFDM0_FRAMESYNC 0xcf0
1368#define ROFDM0_DFSREPORT 0xcf4 1391#define ROFDM0_DFSREPORT 0xcf4
1369#define ROFDM0_TXCOEFF1 0xca4 1392#define ROFDM0_TXCOEFF1 0xca4
@@ -1373,19 +1396,19 @@
1373#define ROFDM0_TXCOEFF5 0xcb4 1396#define ROFDM0_TXCOEFF5 0xcb4
1374#define ROFDM0_TXCOEFF6 0xcb8 1397#define ROFDM0_TXCOEFF6 0xcb8
1375 1398
1376#define ROFDM1_LSTF 0xd00 1399#define ROFDM1_LSTF 0xd00
1377#define ROFDM1_TRXPATHENABLE 0xd04 1400#define ROFDM1_TRXPATHENABLE 0xd04
1378 1401
1379#define ROFDM1_CF0 0xd08 1402#define ROFDM1_CF0 0xd08
1380#define ROFDM1_CSI1 0xd10 1403#define ROFDM1_CSI1 0xd10
1381#define ROFDM1_SBD 0xd14 1404#define ROFDM1_SBD 0xd14
1382#define ROFDM1_CSI2 0xd18 1405#define ROFDM1_CSI2 0xd18
1383#define ROFDM1_CFOTRACKING 0xd2c 1406#define ROFDM1_CFOTRACKING 0xd2c
1384#define ROFDM1_TRXMESAURE1 0xd34 1407#define ROFDM1_TRXMESAURE1 0xd34
1385#define ROFDM1_INTFDET 0xd3c 1408#define ROFDM1_INTFDET 0xd3c
1386#define ROFDM1_PSEUDONOISESTATEAB 0xd50 1409#define ROFDM1_PSEUDONOISESTATEAB 0xd50
1387#define ROFDM1_PSEUDONOISESTATECD 0xd54 1410#define ROFDM1_PSEUDONOISESTATECD 0xd54
1388#define ROFDM1_RXPSEUDONOISEWGT 0xd58 1411#define ROFDM1_RXPSEUDONOISEWGT 0xd58
1389 1412
1390#define ROFDM_PHYCOUNTER1 0xda0 1413#define ROFDM_PHYCOUNTER1 0xda0
1391#define ROFDM_PHYCOUNTER2 0xda4 1414#define ROFDM_PHYCOUNTER2 0xda4
@@ -1397,35 +1420,35 @@
1397#define ROFDM_LONGCFOCD 0xdb8 1420#define ROFDM_LONGCFOCD 0xdb8
1398#define ROFDM_TAILCF0AB 0xdbc 1421#define ROFDM_TAILCF0AB 0xdbc
1399#define ROFDM_TAILCF0CD 0xdc0 1422#define ROFDM_TAILCF0CD 0xdc0
1400#define ROFDM_PWMEASURE1 0xdc4 1423#define ROFDM_PWMEASURE1 0xdc4
1401#define ROFDM_PWMEASURE2 0xdc8 1424#define ROFDM_PWMEASURE2 0xdc8
1402#define ROFDM_BWREPORT 0xdcc 1425#define ROFDM_BWREPORT 0xdcc
1403#define ROFDM_AGCREPORT 0xdd0 1426#define ROFDM_AGCREPORT 0xdd0
1404#define ROFDM_RXSNR 0xdd4 1427#define ROFDM_RXSNR 0xdd4
1405#define ROFDM_RXEVMCSI 0xdd8 1428#define ROFDM_RXEVMCSI 0xdd8
1406#define ROFDM_SIGREPORT 0xddc 1429#define ROFDM_SIGREPORT 0xddc
1407 1430
1408#define RTXAGC_A_RATE18_06 0xe00 1431#define RTXAGC_A_RATE18_06 0xe00
1409#define RTXAGC_A_RATE54_24 0xe04 1432#define RTXAGC_A_RATE54_24 0xe04
1410#define RTXAGC_A_CCK1_MCS32 0xe08 1433#define RTXAGC_A_CCK1_MCS32 0xe08
1411#define RTXAGC_A_MCS03_MCS00 0xe10 1434#define RTXAGC_A_MCS03_MCS00 0xe10
1412#define RTXAGC_A_MCS07_MCS04 0xe14 1435#define RTXAGC_A_MCS07_MCS04 0xe14
1413#define RTXAGC_A_MCS11_MCS08 0xe18 1436#define RTXAGC_A_MCS11_MCS08 0xe18
1414#define RTXAGC_A_MCS15_MCS12 0xe1c 1437#define RTXAGC_A_MCS15_MCS12 0xe1c
1415 1438
1416#define RTXAGC_B_RATE18_06 0x830 1439#define RTXAGC_B_RATE18_06 0x830
1417#define RTXAGC_B_RATE54_24 0x834 1440#define RTXAGC_B_RATE54_24 0x834
1418#define RTXAGC_B_CCK1_55_MCS32 0x838 1441#define RTXAGC_B_CCK1_55_MCS32 0x838
1419#define RTXAGC_B_MCS03_MCS00 0x83c 1442#define RTXAGC_B_MCS03_MCS00 0x83c
1420#define RTXAGC_B_MCS07_MCS04 0x848 1443#define RTXAGC_B_MCS07_MCS04 0x848
1421#define RTXAGC_B_MCS11_MCS08 0x84c 1444#define RTXAGC_B_MCS11_MCS08 0x84c
1422#define RTXAGC_B_MCS15_MCS12 0x868 1445#define RTXAGC_B_MCS15_MCS12 0x868
1423#define RTXAGC_B_CCK11_A_CCK2_11 0x86c 1446#define RTXAGC_B_CCK11_A_CCK2_11 0x86c
1424 1447
1425#define RZEBRA1_HSSIENABLE 0x0 1448#define RZEBRA1_HSSIENABLE 0x0
1426#define RZEBRA1_TRXENABLE1 0x1 1449#define RZEBRA1_TRXENABLE1 0x1
1427#define RZEBRA1_TRXENABLE2 0x2 1450#define RZEBRA1_TRXENABLE2 0x2
1428#define RZEBRA1_AGC 0x4 1451#define RZEBRA1_AGC 0x4
1429#define RZEBRA1_CHARGEPUMP 0x5 1452#define RZEBRA1_CHARGEPUMP 0x5
1430#define RZEBRA1_CHANNEL 0x7 1453#define RZEBRA1_CHANNEL 0x7
1431 1454
@@ -1434,649 +1457,664 @@
1434#define RZEBRA1_RXLPF 0xb 1457#define RZEBRA1_RXLPF 0xb
1435#define RZEBRA1_RXHPFCORNER 0xc 1458#define RZEBRA1_RXHPFCORNER 0xc
1436 1459
1437#define RGLOBALCTRL 0 1460#define RGLOBALCTRL 0
1438#define RRTL8256_TXLPF 19 1461#define RRTL8256_TXLPF 19
1439#define RRTL8256_RXLPF 11 1462#define RRTL8256_RXLPF 11
1440#define RRTL8258_TXLPF 0x11 1463#define RRTL8258_TXLPF 0x11
1441#define RRTL8258_RXLPF 0x13 1464#define RRTL8258_RXLPF 0x13
1442#define RRTL8258_RSSILPF 0xa 1465#define RRTL8258_RSSILPF 0xa
1443 1466
1444#define RF_AC 0x00 1467#define RF_AC 0x00
1445 1468
1446#define RF_IQADJ_G1 0x01 1469#define RF_IQADJ_G1 0x01
1447#define RF_IQADJ_G2 0x02 1470#define RF_IQADJ_G2 0x02
1448#define RF_POW_TRSW 0x05 1471#define RF_POW_TRSW 0x05
1449 1472
1450#define RF_GAIN_RX 0x06 1473#define RF_GAIN_RX 0x06
1451#define RF_GAIN_TX 0x07 1474#define RF_GAIN_TX 0x07
1452 1475
1453#define RF_TXM_IDAC 0x08 1476#define RF_TXM_IDAC 0x08
1454#define RF_BS_IQGEN 0x0F 1477#define RF_BS_IQGEN 0x0F
1455 1478
1456#define RF_MODE1 0x10 1479#define RF_MODE1 0x10
1457#define RF_MODE2 0x11 1480#define RF_MODE2 0x11
1458 1481
1459#define RF_RX_AGC_HP 0x12 1482#define RF_RX_AGC_HP 0x12
1460#define RF_TX_AGC 0x13 1483#define RF_TX_AGC 0x13
1461#define RF_BIAS 0x14 1484#define RF_BIAS 0x14
1462#define RF_IPA 0x15 1485#define RF_IPA 0x15
1463#define RF_POW_ABILITY 0x17 1486#define RF_POW_ABILITY 0x17
1464#define RF_MODE_AG 0x18 1487#define RF_MODE_AG 0x18
1465#define RRFCHANNEL 0x18 1488#define RRFCHANNEL 0x18
1466#define RF_CHNLBW 0x18 1489#define RF_CHNLBW 0x18
1467#define RF_TOP 0x19 1490#define RF_TOP 0x19
1468 1491
1469#define RF_RX_G1 0x1A 1492#define RF_RX_G1 0x1A
1470#define RF_RX_G2 0x1B 1493#define RF_RX_G2 0x1B
1471 1494
1472#define RF_RX_BB2 0x1C 1495#define RF_RX_BB2 0x1C
1473#define RF_RX_BB1 0x1D 1496#define RF_RX_BB1 0x1D
1474 1497
1475#define RF_RCK1 0x1E 1498#define RF_RCK1 0x1E
1476#define RF_RCK2 0x1F 1499#define RF_RCK2 0x1F
1477 1500
1478#define RF_TX_G1 0x20 1501#define RF_TX_G1 0x20
1479#define RF_TX_G2 0x21 1502#define RF_TX_G2 0x21
1480#define RF_TX_G3 0x22 1503#define RF_TX_G3 0x22
1481 1504
1482#define RF_TX_BB1 0x23 1505#define RF_TX_BB1 0x23
1483#define RF_T_METER 0x24 1506#define RF_T_METER 0x24
1484 1507
1485#define RF_SYN_G1 0x25 1508#define RF_SYN_G1 0x25
1486#define RF_SYN_G2 0x26 1509#define RF_SYN_G2 0x26
1487#define RF_SYN_G3 0x27 1510#define RF_SYN_G3 0x27
1488#define RF_SYN_G4 0x28 1511#define RF_SYN_G4 0x28
1489#define RF_SYN_G5 0x29 1512#define RF_SYN_G5 0x29
1490#define RF_SYN_G6 0x2A 1513#define RF_SYN_G6 0x2A
1491#define RF_SYN_G7 0x2B 1514#define RF_SYN_G7 0x2B
1492#define RF_SYN_G8 0x2C 1515#define RF_SYN_G8 0x2C
1493 1516
1494#define RF_RCK_OS 0x30 1517#define RF_RCK_OS 0x30
1495#define RF_TXPA_G1 0x31 1518#define RF_TXPA_G1 0x31
1496#define RF_TXPA_G2 0x32 1519#define RF_TXPA_G2 0x32
1497#define RF_TXPA_G3 0x33 1520#define RF_TXPA_G3 0x33
1498 1521
1499#define BBBRESETB 0x100 1522#define BBBRESETB 0x100
1500#define BGLOBALRESETB 0x200 1523#define BGLOBALRESETB 0x200
1501#define BOFDMTXSTART 0x4 1524#define BOFDMTXSTART 0x4
1502#define BCCKTXSTART 0x8 1525#define BCCKTXSTART 0x8
1503#define BCRC32DEBUG 0x100 1526#define BCRC32DEBUG 0x100
1504#define BPMACLOOPBACK 0x10 1527#define BPMACLOOPBACK 0x10
1505#define BTXLSIG 0xffffff 1528#define BTXLSIG 0xffffff
1506#define BOFDMTXRATE 0xf 1529#define BOFDMTXRATE 0xf
1507#define BOFDMTXRESERVED 0x10 1530#define BOFDMTXRESERVED 0x10
1508#define BOFDMTXLENGTH 0x1ffe0 1531#define BOFDMTXLENGTH 0x1ffe0
1509#define BOFDMTXPARITY 0x20000 1532#define BOFDMTXPARITY 0x20000
1510#define BTXHTSIG1 0xffffff 1533#define BTXHTSIG1 0xffffff
1511#define BTXHTMCSRATE 0x7f 1534#define BTXHTMCSRATE 0x7f
1512#define BTXHTBW 0x80 1535#define BTXHTBW 0x80
1513#define BTXHTLENGTH 0xffff00 1536#define BTXHTLENGTH 0xffff00
1514#define BTXHTSIG2 0xffffff 1537#define BTXHTSIG2 0xffffff
1515#define BTXHTSMOOTHING 0x1 1538#define BTXHTSMOOTHING 0x1
1516#define BTXHTSOUNDING 0x2 1539#define BTXHTSOUNDING 0x2
1517#define BTXHTRESERVED 0x4 1540#define BTXHTRESERVED 0x4
1518#define BTXHTAGGREATION 0x8 1541#define BTXHTAGGREATION 0x8
1519#define BTXHTSTBC 0x30 1542#define BTXHTSTBC 0x30
1520#define BTXHTADVANCECODING 0x40 1543#define BTXHTADVANCECODING 0x40
1521#define BTXHTSHORTGI 0x80 1544#define BTXHTSHORTGI 0x80
1522#define BTXHTNUMBERHT_LTF 0x300 1545#define BTXHTNUMBERHT_LTF 0x300
1523#define BTXHTCRC8 0x3fc00 1546#define BTXHTCRC8 0x3fc00
1524#define BCOUNTERRESET 0x10000 1547#define BCOUNTERRESET 0x10000
1525#define BNUMOFOFDMTX 0xffff 1548#define BNUMOFOFDMTX 0xffff
1526#define BNUMOFCCKTX 0xffff0000 1549#define BNUMOFCCKTX 0xffff0000
1527#define BTXIDLEINTERVAL 0xffff 1550#define BTXIDLEINTERVAL 0xffff
1528#define BOFDMSERVICE 0xffff0000 1551#define BOFDMSERVICE 0xffff0000
1529#define BTXMACHEADER 0xffffffff 1552#define BTXMACHEADER 0xffffffff
1530#define BTXDATAINIT 0xff 1553#define BTXDATAINIT 0xff
1531#define BTXHTMODE 0x100 1554#define BTXHTMODE 0x100
1532#define BTXDATATYPE 0x30000 1555#define BTXDATATYPE 0x30000
1533#define BTXRANDOMSEED 0xffffffff 1556#define BTXRANDOMSEED 0xffffffff
1534#define BCCKTXPREAMBLE 0x1 1557#define BCCKTXPREAMBLE 0x1
1535#define BCCKTXSFD 0xffff0000 1558#define BCCKTXSFD 0xffff0000
1536#define BCCKTXSIG 0xff 1559#define BCCKTXSIG 0xff
1537#define BCCKTXSERVICE 0xff00 1560#define BCCKTXSERVICE 0xff00
1538#define BCCKLENGTHEXT 0x8000 1561#define BCCKLENGTHEXT 0x8000
1539#define BCCKTXLENGHT 0xffff0000 1562#define BCCKTXLENGHT 0xffff0000
1540#define BCCKTXCRC16 0xffff 1563#define BCCKTXCRC16 0xffff
1541#define BCCKTXSTATUS 0x1 1564#define BCCKTXSTATUS 0x1
1542#define BOFDMTXSTATUS 0x2 1565#define BOFDMTXSTATUS 0x2
1543#define IS_BB_REG_OFFSET_92S(_Offset) \ 1566#define IS_BB_REG_OFFSET_92S(_offset) \
1544 ((_Offset >= 0x800) && (_Offset <= 0xfff)) 1567 ((_offset >= 0x800) && (_offset <= 0xfff))
1545 1568
1546#define BRFMOD 0x1 1569#define BRFMOD 0x1
1547#define BJAPANMODE 0x2 1570#define BJAPANMODE 0x2
1548#define BCCKTXSC 0x30 1571#define BCCKTXSC 0x30
1549#define BCCKEN 0x1000000 1572#define BCCKEN 0x1000000
1550#define BOFDMEN 0x2000000 1573#define BOFDMEN 0x2000000
1551 1574
1552#define BOFDMRXADCPHASE 0x10000 1575#define BOFDMRXADCPHASE 0x10000
1553#define BOFDMTXDACPHASE 0x40000 1576#define BOFDMTXDACPHASE 0x40000
1554#define BXATXAGC 0x3f 1577#define BXATXAGC 0x3f
1555 1578
1556#define BXBTXAGC 0xf00 1579#define BXBTXAGC 0xf00
1557#define BXCTXAGC 0xf000 1580#define BXCTXAGC 0xf000
1558#define BXDTXAGC 0xf0000 1581#define BXDTXAGC 0xf0000
1559 1582
1560#define BPASTART 0xf0000000 1583#define BPASTART 0xf0000000
1561#define BTRSTART 0x00f00000 1584#define BTRSTART 0x00f00000
1562#define BRFSTART 0x0000f000 1585#define BRFSTART 0x0000f000
1563#define BBBSTART 0x000000f0 1586#define BBBSTART 0x000000f0
1564#define BBBCCKSTART 0x0000000f 1587#define BBBCCKSTART 0x0000000f
1565#define BPAEND 0xf 1588#define BPAEND 0xf
1566#define BTREND 0x0f000000 1589#define BTREND 0x0f000000
1567#define BRFEND 0x000f0000 1590#define BRFEND 0x000f0000
1568#define BCCAMASK 0x000000f0 1591#define BCCAMASK 0x000000f0
1569#define BR2RCCAMASK 0x00000f00 1592#define BR2RCCAMASK 0x00000f00
1570#define BHSSI_R2TDELAY 0xf8000000 1593#define BHSSI_R2TDELAY 0xf8000000
1571#define BHSSI_T2RDELAY 0xf80000 1594#define BHSSI_T2RDELAY 0xf80000
1572#define BCONTXHSSI 0x400 1595#define BCONTXHSSI 0x400
1573#define BIGFROMCCK 0x200 1596#define BIGFROMCCK 0x200
1574#define BAGCADDRESS 0x3f 1597#define BAGCADDRESS 0x3f
1575#define BRXHPTX 0x7000 1598#define BRXHPTX 0x7000
1576#define BRXHP2RX 0x38000 1599#define BRXHP2RX 0x38000
1577#define BRXHPCCKINI 0xc0000 1600#define BRXHPCCKINI 0xc0000
1578#define BAGCTXCODE 0xc00000 1601#define BAGCTXCODE 0xc00000
1579#define BAGCRXCODE 0x300000 1602#define BAGCRXCODE 0x300000
1580 1603
1581#define B3WIREDATALENGTH 0x800 1604#define B3WIREDATALENGTH 0x800
1582#define B3WIREADDREAALENGTH 0x400 1605#define B3WIREADDREAALENGTH 0x400
1583 1606
1584#define B3WIRERFPOWERDOWN 0x1 1607#define B3WIRERFPOWERDOWN 0x1
1585#define B5GPAPEPOLARITY 0x40000000 1608#define B5GPAPEPOLARITY 0x40000000
1586#define B2GPAPEPOLARITY 0x80000000 1609#define B2GPAPEPOLARITY 0x80000000
1587#define BRFSW_TXDEFAULTANT 0x3 1610#define BRFSW_TXDEFAULTANT 0x3
1588#define BRFSW_TXOPTIONANT 0x30 1611#define BRFSW_TXOPTIONANT 0x30
1589#define BRFSW_RXDEFAULTANT 0x300 1612#define BRFSW_RXDEFAULTANT 0x300
1590#define BRFSW_RXOPTIONANT 0x3000 1613#define BRFSW_RXOPTIONANT 0x3000
1591#define BRFSI_3WIREDATA 0x1 1614#define BRFSI_3WIREDATA 0x1
1592#define BRFSI_3WIRECLOCK 0x2 1615#define BRFSI_3WIRECLOCK 0x2
1593#define BRFSI_3WIRELOAD 0x4 1616#define BRFSI_3WIRELOAD 0x4
1594#define BRFSI_3WIRERW 0x8 1617#define BRFSI_3WIRERW 0x8
1595#define BRFSI_3WIRE 0xf 1618#define BRFSI_3WIRE 0xf
1596 1619
1597#define BRFSI_RFENV 0x10 1620#define BRFSI_RFENV 0x10
1598 1621
1599#define BRFSI_TRSW 0x20 1622#define BRFSI_TRSW 0x20
1600#define BRFSI_TRSWB 0x40 1623#define BRFSI_TRSWB 0x40
1601#define BRFSI_ANTSW 0x100 1624#define BRFSI_ANTSW 0x100
1602#define BRFSI_ANTSWB 0x200 1625#define BRFSI_ANTSWB 0x200
1603#define BRFSI_PAPE 0x400 1626#define BRFSI_PAPE 0x400
1604#define BRFSI_PAPE5G 0x800 1627#define BRFSI_PAPE5G 0x800
1605#define BBANDSELECT 0x1 1628#define BBANDSELECT 0x1
1606#define BHTSIG2_GI 0x80 1629#define BHTSIG2_GI 0x80
1607#define BHTSIG2_SMOOTHING 0x01 1630#define BHTSIG2_SMOOTHING 0x01
1608#define BHTSIG2_SOUNDING 0x02 1631#define BHTSIG2_SOUNDING 0x02
1609#define BHTSIG2_AGGREATON 0x08 1632#define BHTSIG2_AGGREATON 0x08
1610#define BHTSIG2_STBC 0x30 1633#define BHTSIG2_STBC 0x30
1611#define BHTSIG2_ADVCODING 0x40 1634#define BHTSIG2_ADVCODING 0x40
1612#define BHTSIG2_NUMOFHTLTF 0x300 1635#define BHTSIG2_NUMOFHTLTF 0x300
1613#define BHTSIG2_CRC8 0x3fc 1636#define BHTSIG2_CRC8 0x3fc
1614#define BHTSIG1_MCS 0x7f 1637#define BHTSIG1_MCS 0x7f
1615#define BHTSIG1_BANDWIDTH 0x80 1638#define BHTSIG1_BANDWIDTH 0x80
1616#define BHTSIG1_HTLENGTH 0xffff 1639#define BHTSIG1_HTLENGTH 0xffff
1617#define BLSIG_RATE 0xf 1640#define BLSIG_RATE 0xf
1618#define BLSIG_RESERVED 0x10 1641#define BLSIG_RESERVED 0x10
1619#define BLSIG_LENGTH 0x1fffe 1642#define BLSIG_LENGTH 0x1fffe
1620#define BLSIG_PARITY 0x20 1643#define BLSIG_PARITY 0x20
1621#define BCCKRXPHASE 0x4 1644#define BCCKRXPHASE 0x4
1622 1645
1623#define BLSSIREADADDRESS 0x7f800000 1646#define BLSSIREADADDRESS 0x7f800000
1624#define BLSSIREADEDGE 0x80000000 1647#define BLSSIREADEDGE 0x80000000
1625 1648
1626#define BLSSIREADBACKDATA 0xfffff 1649#define BLSSIREADBACKDATA 0xfffff
1627 1650
1628#define BLSSIREADOKFLAG 0x1000 1651#define BLSSIREADOKFLAG 0x1000
1629#define BCCKSAMPLERATE 0x8 1652#define BCCKSAMPLERATE 0x8
1630#define BREGULATOR0STANDBY 0x1 1653#define BREGULATOR0STANDBY 0x1
1631#define BREGULATORPLLSTANDBY 0x2 1654#define BREGULATORPLLSTANDBY 0x2
1632#define BREGULATOR1STANDBY 0x4 1655#define BREGULATOR1STANDBY 0x4
1633#define BPLLPOWERUP 0x8 1656#define BPLLPOWERUP 0x8
1634#define BDPLLPOWERUP 0x10 1657#define BDPLLPOWERUP 0x10
1635#define BDA10POWERUP 0x20 1658#define BDA10POWERUP 0x20
1636#define BAD7POWERUP 0x200 1659#define BAD7POWERUP 0x200
1637#define BDA6POWERUP 0x2000 1660#define BDA6POWERUP 0x2000
1638#define BXTALPOWERUP 0x4000 1661#define BXTALPOWERUP 0x4000
1639#define B40MDCLKPOWERUP 0x8000 1662#define B40MDCLKPOWERUP 0x8000
1640#define BDA6DEBUGMODE 0x20000 1663#define BDA6DEBUGMODE 0x20000
1641#define BDA6SWING 0x380000 1664#define BDA6SWING 0x380000
1642 1665
1643#define BADCLKPHASE 0x4000000 1666#define BADCLKPHASE 0x4000000
1644#define B80MCLKDELAY 0x18000000 1667#define B80MCLKDELAY 0x18000000
1645#define BAFEWATCHDOGENABLE 0x20000000 1668#define BAFEWATCHDOGENABLE 0x20000000
1646 1669
1647#define BXTALCAP01 0xc0000000 1670#define BXTALCAP01 0xc0000000
1648#define BXTALCAP23 0x3 1671#define BXTALCAP23 0x3
1649#define BXTALCAP92X 0x0f000000 1672#define BXTALCAP92X 0x0f000000
1650#define BXTALCAP 0x0f000000 1673#define BXTALCAP 0x0f000000
1651 1674
1652#define BINTDIFCLKENABLE 0x400 1675#define BINTDIFCLKENABLE 0x400
1653#define BEXTSIGCLKENABLE 0x800 1676#define BEXTSIGCLKENABLE 0x800
1654#define BBANDGAP_MBIAS_POWERUP 0x10000 1677#define BBANDGAP_MBIAS_POWERUP 0x10000
1655#define BAD11SH_GAIN 0xc0000 1678#define BAD11SH_GAIN 0xc0000
1656#define BAD11NPUT_RANGE 0x700000 1679#define BAD11NPUT_RANGE 0x700000
1657#define BAD110P_CURRENT 0x3800000 1680#define BAD110P_CURRENT 0x3800000
1658#define BLPATH_LOOPBACK 0x4000000 1681#define BLPATH_LOOPBACK 0x4000000
1659#define BQPATH_LOOPBACK 0x8000000 1682#define BQPATH_LOOPBACK 0x8000000
1660#define BAFE_LOOPBACK 0x10000000 1683#define BAFE_LOOPBACK 0x10000000
1661#define BDA10_SWING 0x7e0 1684#define BDA10_SWING 0x7e0
1662#define BDA10_REVERSE 0x800 1685#define BDA10_REVERSE 0x800
1663#define BDA_CLK_SOURCE 0x1000 1686#define BDA_CLK_SOURCE 0x1000
1664#define BDA7INPUT_RANGE 0x6000 1687#define BDA7INPUT_RANGE 0x6000
1665#define BDA7_GAIN 0x38000 1688#define BDA7_GAIN 0x38000
1666#define BDA7OUTPUT_CM_MODE 0x40000 1689#define BDA7OUTPUT_CM_MODE 0x40000
1667#define BDA7INPUT_CM_MODE 0x380000 1690#define BDA7INPUT_CM_MODE 0x380000
1668#define BDA7CURRENT 0xc00000 1691#define BDA7CURRENT 0xc00000
1669#define BREGULATOR_ADJUST 0x7000000 1692#define BREGULATOR_ADJUST 0x7000000
1670#define BAD11POWERUP_ATTX 0x1 1693#define BAD11POWERUP_ATTX 0x1
1671#define BDA10PS_ATTX 0x10 1694#define BDA10PS_ATTX 0x10
1672#define BAD11POWERUP_ATRX 0x100 1695#define BAD11POWERUP_ATRX 0x100
1673#define BDA10PS_ATRX 0x1000 1696#define BDA10PS_ATRX 0x1000
1674#define BCCKRX_AGC_FORMAT 0x200 1697#define BCCKRX_AGC_FORMAT 0x200
1675#define BPSDFFT_SAMPLE_POINT 0xc000 1698#define BPSDFFT_SAMPLE_POINT 0xc000
1676#define BPSD_AVERAGE_NUM 0x3000 1699#define BPSD_AVERAGE_NUM 0x3000
1677#define BIQPATH_CONTROL 0xc00 1700#define BIQPATH_CONTROL 0xc00
1678#define BPSD_FREQ 0x3ff 1701#define BPSD_FREQ 0x3ff
1679#define BPSD_ANTENNA_PATH 0x30 1702#define BPSD_ANTENNA_PATH 0x30
1680#define BPSD_IQ_SWITCH 0x40 1703#define BPSD_IQ_SWITCH 0x40
1681#define BPSD_RX_TRIGGER 0x400000 1704#define BPSD_RX_TRIGGER 0x400000
1682#define BPSD_TX_TRIGGER 0x80000000 1705#define BPSD_TX_TRIGGER 0x80000000
1683#define BPSD_SINE_TONE_SCALE 0x7f000000 1706#define BPSD_SINE_TONE_SCALE 0x7f000000
1684#define BPSD_REPORT 0xffff 1707#define BPSD_REPORT 0xffff
1685 1708
1686#define BOFDM_TXSC 0x30000000 1709#define BOFDM_TXSC 0x30000000
1687#define BCCK_TXON 0x1 1710#define BCCK_TXON 0x1
1688#define BOFDM_TXON 0x2 1711#define BOFDM_TXON 0x2
1689#define BDEBUG_PAGE 0xfff 1712#define BDEBUG_PAGE 0xfff
1690#define BDEBUG_ITEM 0xff 1713#define BDEBUG_ITEM 0xff
1691#define BANTL 0x10 1714#define BANTL 0x10
1692#define BANT_NONHT 0x100 1715#define BANT_NONHT 0x100
1693#define BANT_HT1 0x1000 1716#define BANT_HT1 0x1000
1694#define BANT_HT2 0x10000 1717#define BANT_HT2 0x10000
1695#define BANT_HT1S1 0x100000 1718#define BANT_HT1S1 0x100000
1696#define BANT_NONHTS1 0x1000000 1719#define BANT_NONHTS1 0x1000000
1697 1720
1698#define BCCK_BBMODE 0x3 1721#define BCCK_BBMODE 0x3
1699#define BCCK_TXPOWERSAVING 0x80 1722#define BCCK_TXPOWERSAVING 0x80
1700#define BCCK_RXPOWERSAVING 0x40 1723#define BCCK_RXPOWERSAVING 0x40
1701 1724
1702#define BCCK_SIDEBAND 0x10 1725#define BCCK_SIDEBAND 0x10
1703 1726
1704#define BCCK_SCRAMBLE 0x8 1727#define BCCK_SCRAMBLE 0x8
1705#define BCCK_ANTDIVERSITY 0x8000 1728#define BCCK_ANTDIVERSITY 0x8000
1706#define BCCK_CARRIER_RECOVERY 0x4000 1729#define BCCK_CARRIER_RECOVERY 0x4000
1707#define BCCK_TXRATE 0x3000 1730#define BCCK_TXRATE 0x3000
1708#define BCCK_DCCANCEL 0x0800 1731#define BCCK_DCCANCEL 0x0800
1709#define BCCK_ISICANCEL 0x0400 1732#define BCCK_ISICANCEL 0x0400
1710#define BCCK_MATCH_FILTER 0x0200 1733#define BCCK_MATCH_FILTER 0x0200
1711#define BCCK_EQUALIZER 0x0100 1734#define BCCK_EQUALIZER 0x0100
1712#define BCCK_PREAMBLE_DETECT 0x800000 1735#define BCCK_PREAMBLE_DETECT 0x800000
1713#define BCCK_FAST_FALSECCAi 0x400000 1736#define BCCK_FAST_FALSECCA 0x400000
1714#define BCCK_CH_ESTSTARTi 0x300000 1737#define BCCK_CH_ESTSTART 0x300000
1715#define BCCK_CCA_COUNTi 0x080000 1738#define BCCK_CCA_COUNT 0x080000
1716#define BCCK_CS_LIM 0x070000 1739#define BCCK_CS_LIM 0x070000
1717#define BCCK_BIST_MODEi 0x80000000 1740#define BCCK_BIST_MODE 0x80000000
1718#define BCCK_CCAMASK 0x40000000 1741#define BCCK_CCAMASK 0x40000000
1719#define BCCK_TX_DAC_PHASE 0x4 1742#define BCCK_TX_DAC_PHASE 0x4
1720#define BCCK_RX_ADC_PHASE 0x20000000 1743#define BCCK_RX_ADC_PHASE 0x20000000
1721#define BCCKR_CP_MODE 0x0100 1744#define BCCKR_CP_MODE 0x0100
1722#define BCCK_TXDC_OFFSET 0xf0 1745#define BCCK_TXDC_OFFSET 0xf0
1723#define BCCK_RXDC_OFFSET 0xf 1746#define BCCK_RXDC_OFFSET 0xf
1724#define BCCK_CCA_MODE 0xc000 1747#define BCCK_CCA_MODE 0xc000
1725#define BCCK_FALSECS_LIM 0x3f00 1748#define BCCK_FALSECS_LIM 0x3f00
1726#define BCCK_CS_RATIO 0xc00000 1749#define BCCK_CS_RATIO 0xc00000
1727#define BCCK_CORGBIT_SEL 0x300000 1750#define BCCK_CORGBIT_SEL 0x300000
1728#define BCCK_PD_LIM 0x0f0000 1751#define BCCK_PD_LIM 0x0f0000
1729#define BCCK_NEWCCA 0x80000000 1752#define BCCK_NEWCCA 0x80000000
1730#define BCCK_RXHP_OF_IG 0x8000 1753#define BCCK_RXHP_OF_IG 0x8000
1731#define BCCK_RXIG 0x7f00 1754#define BCCK_RXIG 0x7f00
1732#define BCCK_LNA_POLARITY 0x800000 1755#define BCCK_LNA_POLARITY 0x800000
1733#define BCCK_RX1ST_BAIN 0x7f0000 1756#define BCCK_RX1ST_BAIN 0x7f0000
1734#define BCCK_RF_EXTEND 0x20000000 1757#define BCCK_RF_EXTEND 0x20000000
1735#define BCCK_RXAGC_SATLEVEL 0x1f000000 1758#define BCCK_RXAGC_SATLEVEL 0x1f000000
1736#define BCCK_RXAGC_SATCOUNT 0xe0 1759#define BCCK_RXAGC_SATCOUNT 0xe0
1737#define bCCKRxRFSettle 0x1f 1760#define BCCKRXRFSETTLE 0x1f
1738#define BCCK_FIXED_RXAGC 0x8000 1761#define BCCK_FIXED_RXAGC 0x8000
1739#define BCCK_ANTENNA_POLARITY 0x2000 1762#define BCCK_ANTENNA_POLARITY 0x2000
1740#define BCCK_TXFILTER_TYPE 0x0c00 1763#define BCCK_TXFILTER_TYPE 0x0c00
1741#define BCCK_RXAGC_REPORTTYPE 0x0300 1764#define BCCK_RXAGC_REPORTTYPE 0x0300
1742#define BCCK_RXDAGC_EN 0x80000000 1765#define BCCK_RXDAGC_EN 0x80000000
1743#define BCCK_RXDAGC_PERIOD 0x20000000 1766#define BCCK_RXDAGC_PERIOD 0x20000000
1744#define BCCK_RXDAGC_SATLEVEL 0x1f000000 1767#define BCCK_RXDAGC_SATLEVEL 0x1f000000
1745#define BCCK_TIMING_RECOVERY 0x800000 1768#define BCCK_TIMING_RECOVERY 0x800000
1746#define BCCK_TXC0 0x3f0000 1769#define BCCK_TXC0 0x3f0000
1747#define BCCK_TXC1 0x3f000000 1770#define BCCK_TXC1 0x3f000000
1748#define BCCK_TXC2 0x3f 1771#define BCCK_TXC2 0x3f
1749#define BCCK_TXC3 0x3f00 1772#define BCCK_TXC3 0x3f00
1750#define BCCK_TXC4 0x3f0000 1773#define BCCK_TXC4 0x3f0000
1751#define BCCK_TXC5 0x3f000000 1774#define BCCK_TXC5 0x3f000000
1752#define BCCK_TXC6 0x3f 1775#define BCCK_TXC6 0x3f
1753#define BCCK_TXC7 0x3f00 1776#define BCCK_TXC7 0x3f00
1754#define BCCK_DEBUGPORT 0xff0000 1777#define BCCK_DEBUGPORT 0xff0000
1755#define BCCK_DAC_DEBUG 0x0f000000 1778#define BCCK_DAC_DEBUG 0x0f000000
1756#define BCCK_FALSEALARM_ENABLE 0x8000 1779#define BCCK_FALSEALARM_ENABLE 0x8000
1757#define BCCK_FALSEALARM_READ 0x4000 1780#define BCCK_FALSEALARM_READ 0x4000
1758#define BCCK_TRSSI 0x7f 1781#define BCCK_TRSSI 0x7f
1759#define BCCK_RXAGC_REPORT 0xfe 1782#define BCCK_RXAGC_REPORT 0xfe
1760#define BCCK_RXREPORT_ANTSEL 0x80000000 1783#define BCCK_RXREPORT_ANTSEL 0x80000000
1761#define BCCK_RXREPORT_MFOFF 0x40000000 1784#define BCCK_RXREPORT_MFOFF 0x40000000
1762#define BCCK_RXREPORT_SQLOSS 0x20000000 1785#define BCCK_RXREPORT_SQLOSS 0x20000000
1763#define BCCK_RXREPORT_PKTLOSS 0x10000000 1786#define BCCK_RXREPORT_PKTLOSS 0x10000000
1764#define BCCK_RXREPORT_LOCKEDBIT 0x08000000 1787#define BCCK_RXREPORT_LOCKEDBIT 0x08000000
1765#define BCCK_RXREPORT_RATEERROR 0x04000000 1788#define BCCK_RXREPORT_RATEERROR 0x04000000
1766#define BCCK_RXREPORT_RXRATE 0x03000000 1789#define BCCK_RXREPORT_RXRATE 0x03000000
1767#define BCCK_RXFA_COUNTER_LOWER 0xff 1790#define BCCK_RXFA_COUNTER_LOWER 0xff
1768#define BCCK_RXFA_COUNTER_UPPER 0xff000000 1791#define BCCK_RXFA_COUNTER_UPPER 0xff000000
1769#define BCCK_RXHPAGC_START 0xe000 1792#define BCCK_RXHPAGC_START 0xe000
1770#define BCCK_RXHPAGC_FINAL 0x1c00 1793#define BCCK_RXHPAGC_FINAL 0x1c00
1771#define BCCK_RXFALSEALARM_ENABLE 0x8000 1794#define BCCK_RXFALSEALARM_ENABLE 0x8000
1772#define BCCK_FACOUNTER_FREEZE 0x4000 1795#define BCCK_FACOUNTER_FREEZE 0x4000
1773#define BCCK_TXPATH_SEL 0x10000000 1796#define BCCK_TXPATH_SEL 0x10000000
1774#define BCCK_DEFAULT_RXPATH 0xc000000 1797#define BCCK_DEFAULT_RXPATH 0xc000000
1775#define BCCK_OPTION_RXPATH 0x3000000 1798#define BCCK_OPTION_RXPATH 0x3000000
1776 1799
1777#define BNUM_OFSTF 0x3 1800#define BNUM_OFSTF 0x3
1778#define BSHIFT_L 0xc0 1801#define BSHIFT_L 0xc0
1779#define BGI_TH 0xc 1802#define BGI_TH 0xc
1780#define BRXPATH_A 0x1 1803#define BRXPATH_A 0x1
1781#define BRXPATH_B 0x2 1804#define BRXPATH_B 0x2
1782#define BRXPATH_C 0x4 1805#define BRXPATH_C 0x4
1783#define BRXPATH_D 0x8 1806#define BRXPATH_D 0x8
1784#define BTXPATH_A 0x1 1807#define BTXPATH_A 0x1
1785#define BTXPATH_B 0x2 1808#define BTXPATH_B 0x2
1786#define BTXPATH_C 0x4 1809#define BTXPATH_C 0x4
1787#define BTXPATH_D 0x8 1810#define BTXPATH_D 0x8
1788#define BTRSSI_FREQ 0x200 1811#define BTRSSI_FREQ 0x200
1789#define BADC_BACKOFF 0x3000 1812#define BADC_BACKOFF 0x3000
1790#define BDFIR_BACKOFF 0xc000 1813#define BDFIR_BACKOFF 0xc000
1791#define BTRSSI_LATCH_PHASE 0x10000 1814#define BTRSSI_LATCH_PHASE 0x10000
1792#define BRX_LDC_OFFSET 0xff 1815#define BRX_LDC_OFFSET 0xff
1793#define BRX_QDC_OFFSET 0xff00 1816#define BRX_QDC_OFFSET 0xff00
1794#define BRX_DFIR_MODE 0x1800000 1817#define BRX_DFIR_MODE 0x1800000
1795#define BRX_DCNF_TYPE 0xe000000 1818#define BRX_DCNF_TYPE 0xe000000
1796#define BRXIQIMB_A 0x3ff 1819#define BRXIQIMB_A 0x3ff
1797#define BRXIQIMB_B 0xfc00 1820#define BRXIQIMB_B 0xfc00
1798#define BRXIQIMB_C 0x3f0000 1821#define BRXIQIMB_C 0x3f0000
1799#define BRXIQIMB_D 0xffc00000 1822#define BRXIQIMB_D 0xffc00000
1800#define BDC_DC_NOTCH 0x60000 1823#define BDC_DC_NOTCH 0x60000
1801#define BRXNB_NOTCH 0x1f000000 1824#define BRXNB_NOTCH 0x1f000000
1802#define BPD_TH 0xf 1825#define BPD_TH 0xf
1803#define BPD_TH_OPT2 0xc000 1826#define BPD_TH_OPT2 0xc000
1804#define BPWED_TH 0x700 1827#define BPWED_TH 0x700
1805#define BIFMF_WIN_L 0x800 1828#define BIFMF_WIN_L 0x800
1806#define BPD_OPTION 0x1000 1829#define BPD_OPTION 0x1000
1807#define BMF_WIN_L 0xe000 1830#define BMF_WIN_L 0xe000
1808#define BBW_SEARCH_L 0x30000 1831#define BBW_SEARCH_L 0x30000
1809#define BWIN_ENH_L 0xc0000 1832#define BWIN_ENH_L 0xc0000
1810#define BBW_TH 0x700000 1833#define BBW_TH 0x700000
1811#define BED_TH2 0x3800000 1834#define BED_TH2 0x3800000
1812#define BBW_OPTION 0x4000000 1835#define BBW_OPTION 0x4000000
1813#define BRADIO_TH 0x18000000 1836#define BRADIO_TH 0x18000000
1814#define BWINDOW_L 0xe0000000 1837#define BWINDOW_L 0xe0000000
1815#define BSBD_OPTION 0x1 1838#define BSBD_OPTION 0x1
1816#define BFRAME_TH 0x1c 1839#define BFRAME_TH 0x1c
1817#define BFS_OPTION 0x60 1840#define BFS_OPTION 0x60
1818#define BDC_SLOPE_CHECK 0x80 1841#define BDC_SLOPE_CHECK 0x80
1819#define BFGUARD_COUNTER_DC_L 0xe00 1842#define BFGUARD_COUNTER_DC_L 0xe00
1820#define BFRAME_WEIGHT_SHORT 0x7000 1843#define BFRAME_WEIGHT_SHORT 0x7000
1821#define BSUB_TUNE 0xe00000 1844#define BSUB_TUNE 0xe00000
1822#define BFRAME_DC_LENGTH 0xe000000 1845#define BFRAME_DC_LENGTH 0xe000000
1823#define BSBD_START_OFFSET 0x30000000 1846#define BSBD_START_OFFSET 0x30000000
1824#define BFRAME_TH_2 0x7 1847#define BFRAME_TH_2 0x7
1825#define BFRAME_GI2_TH 0x38 1848#define BFRAME_GI2_TH 0x38
1826#define BGI2_SYNC_EN 0x40 1849#define BGI2_SYNC_EN 0x40
1827#define BSARCH_SHORT_EARLY 0x300 1850#define BSARCH_SHORT_EARLY 0x300
1828#define BSARCH_SHORT_LATE 0xc00 1851#define BSARCH_SHORT_LATE 0xc00
1829#define BSARCH_GI2_LATE 0x70000 1852#define BSARCH_GI2_LATE 0x70000
1830#define BCFOANTSUM 0x1 1853#define BCFOANTSUM 0x1
1831#define BCFOACC 0x2 1854#define BCFOACC 0x2
1832#define BCFOSTARTOFFSET 0xc 1855#define BCFOSTARTOFFSET 0xc
1833#define BCFOLOOPBACK 0x70 1856#define BCFOLOOPBACK 0x70
1834#define BCFOSUMWEIGHT 0x80 1857#define BCFOSUMWEIGHT 0x80
1835#define BDAGCENABLE 0x10000 1858#define BDAGCENABLE 0x10000
1836#define BTXIQIMB_A 0x3ff 1859#define BTXIQIMB_A 0x3ff
1837#define BTXIQIMB_b 0xfc00 1860#define BTXIQIMB_b 0xfc00
1838#define BTXIQIMB_C 0x3f0000 1861#define BTXIQIMB_C 0x3f0000
1839#define BTXIQIMB_D 0xffc00000 1862#define BTXIQIMB_D 0xffc00000
1840#define BTXIDCOFFSET 0xff 1863#define BTXIDCOFFSET 0xff
1841#define BTXIQDCOFFSET 0xff00 1864#define BTXIQDCOFFSET 0xff00
1842#define BTXDFIRMODE 0x10000 1865#define BTXDFIRMODE 0x10000
1843#define BTXPESUDO_NOISEON 0x4000000 1866#define BTXPESUDO_NOISEON 0x4000000
1844#define BTXPESUDO_NOISE_A 0xff 1867#define BTXPESUDO_NOISE_A 0xff
1845#define BTXPESUDO_NOISE_B 0xff00 1868#define BTXPESUDO_NOISE_B 0xff00
1846#define BTXPESUDO_NOISE_C 0xff0000 1869#define BTXPESUDO_NOISE_C 0xff0000
1847#define BTXPESUDO_NOISE_D 0xff000000 1870#define BTXPESUDO_NOISE_D 0xff000000
1848#define BCCA_DROPOPTION 0x20000 1871#define BCCA_DROPOPTION 0x20000
1849#define BCCA_DROPTHRES 0xfff00000 1872#define BCCA_DROPTHRES 0xfff00000
1850#define BEDCCA_H 0xf 1873#define BEDCCA_H 0xf
1851#define BEDCCA_L 0xf0 1874#define BEDCCA_L 0xf0
1852#define BLAMBDA_ED 0x300 1875#define BLAMBDA_ED 0x300
1853#define BRX_INITIALGAIN 0x7f 1876#define BRX_INITIALGAIN 0x7f
1854#define BRX_ANTDIV_EN 0x80 1877#define BRX_ANTDIV_EN 0x80
1855#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00 1878#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00
1856#define BRX_HIGHPOWER_FLOW 0x8000 1879#define BRX_HIGHPOWER_FLOW 0x8000
1857#define BRX_AGC_FREEZE_THRES 0xc0000 1880#define BRX_AGC_FREEZE_THRES 0xc0000
1858#define BRX_FREEZESTEP_AGC1 0x300000 1881#define BRX_FREEZESTEP_AGC1 0x300000
1859#define BRX_FREEZESTEP_AGC2 0xc00000 1882#define BRX_FREEZESTEP_AGC2 0xc00000
1860#define BRX_FREEZESTEP_AGC3 0x3000000 1883#define BRX_FREEZESTEP_AGC3 0x3000000
1861#define BRX_FREEZESTEP_AGC0 0xc000000 1884#define BRX_FREEZESTEP_AGC0 0xc000000
1862#define BRXRSSI_CMP_EN 0x10000000 1885#define BRXRSSI_CMP_EN 0x10000000
1863#define BRXQUICK_AGCEN 0x20000000 1886#define BRXQUICK_AGCEN 0x20000000
1864#define BRXAGC_FREEZE_THRES_MODE 0x40000000 1887#define BRXAGC_FREEZE_THRES_MODE 0x40000000
1865#define BRX_OVERFLOW_CHECKTYPE 0x80000000 1888#define BRX_OVERFLOW_CHECKTYPE 0x80000000
1866#define BRX_AGCSHIFT 0x7f 1889#define BRX_AGCSHIFT 0x7f
1867#define BTRSW_TRI_ONLY 0x80 1890#define BTRSW_TRI_ONLY 0x80
1868#define BPOWER_THRES 0x300 1891#define BPOWER_THRES 0x300
1869#define BRXAGC_EN 0x1 1892#define BRXAGC_EN 0x1
1870#define BRXAGC_TOGETHER_EN 0x2 1893#define BRXAGC_TOGETHER_EN 0x2
1871#define BRXAGC_MIN 0x4 1894#define BRXAGC_MIN 0x4
1872#define BRXHP_INI 0x7 1895#define BRXHP_INI 0x7
1873#define BRXHP_TRLNA 0x70 1896#define BRXHP_TRLNA 0x70
1874#define BRXHP_RSSI 0x700 1897#define BRXHP_RSSI 0x700
1875#define BRXHP_BBP1 0x7000 1898#define BRXHP_BBP1 0x7000
1876#define BRXHP_BBP2 0x70000 1899#define BRXHP_BBP2 0x70000
1877#define BRXHP_BBP3 0x700000 1900#define BRXHP_BBP3 0x700000
1878#define BRSSI_H 0x7f0000 1901#define BRSSI_H 0x7f0000
1879#define BRSSI_GEN 0x7f000000 1902#define BRSSI_GEN 0x7f000000
1880#define BRXSETTLE_TRSW 0x7 1903#define BRXSETTLE_TRSW 0x7
1881#define BRXSETTLE_LNA 0x38 1904#define BRXSETTLE_LNA 0x38
1882#define BRXSETTLE_RSSI 0x1c0 1905#define BRXSETTLE_RSSI 0x1c0
1883#define BRXSETTLE_BBP 0xe00 1906#define BRXSETTLE_BBP 0xe00
1884#define BRXSETTLE_RXHP 0x7000 1907#define BRXSETTLE_RXHP 0x7000
1885#define BRXSETTLE_ANTSW_RSSI 0x38000 1908#define BRXSETTLE_ANTSW_RSSI 0x38000
1886#define BRXSETTLE_ANTSW 0xc0000 1909#define BRXSETTLE_ANTSW 0xc0000
1887#define BRXPROCESS_TIME_DAGC 0x300000 1910#define BRXPROCESS_TIME_DAGC 0x300000
1888#define BRXSETTLE_HSSI 0x400000 1911#define BRXSETTLE_HSSI 0x400000
1889#define BRXPROCESS_TIME_BBPPW 0x800000 1912#define BRXPROCESS_TIME_BBPPW 0x800000
1890#define BRXANTENNA_POWER_SHIFT 0x3000000 1913#define BRXANTENNA_POWER_SHIFT 0x3000000
1891#define BRSSI_TABLE_SELECT 0xc000000 1914#define BRSSI_TABLE_SELECT 0xc000000
1892#define BRXHP_FINAL 0x7000000 1915#define BRXHP_FINAL 0x7000000
1893#define BRXHPSETTLE_BBP 0x7 1916#define BRXHPSETTLE_BBP 0x7
1894#define BRXHTSETTLE_HSSI 0x8 1917#define BRXHTSETTLE_HSSI 0x8
1895#define BRXHTSETTLE_RXHP 0x70 1918#define BRXHTSETTLE_RXHP 0x70
1896#define BRXHTSETTLE_BBPPW 0x80 1919#define BRXHTSETTLE_BBPPW 0x80
1897#define BRXHTSETTLE_IDLE 0x300 1920#define BRXHTSETTLE_IDLE 0x300
1898#define BRXHTSETTLE_RESERVED 0x1c00 1921#define BRXHTSETTLE_RESERVED 0x1c00
1899#define BRXHT_RXHP_EN 0x8000 1922#define BRXHT_RXHP_EN 0x8000
1900#define BRXAGC_FREEZE_THRES 0x30000 1923#define BRXAGC_FREEZE_THRES 0x30000
1901#define BRXAGC_TOGETHEREN 0x40000 1924#define BRXAGC_TOGETHEREN 0x40000
1902#define BRXHTAGC_MIN 0x80000 1925#define BRXHTAGC_MIN 0x80000
1903#define BRXHTAGC_EN 0x100000 1926#define BRXHTAGC_EN 0x100000
1904#define BRXHTDAGC_EN 0x200000 1927#define BRXHTDAGC_EN 0x200000
1905#define BRXHT_RXHP_BBP 0x1c00000 1928#define BRXHT_RXHP_BBP 0x1c00000
1906#define BRXHT_RXHP_FINAL 0xe0000000 1929#define BRXHT_RXHP_FINAL 0xe0000000
1907#define BRXPW_RADIO_TH 0x3 1930#define BRXPW_RADIO_TH 0x3
1908#define BRXPW_RADIO_EN 0x4 1931#define BRXPW_RADIO_EN 0x4
1909#define BRXMF_HOLD 0x3800 1932#define BRXMF_HOLD 0x3800
1910#define BRXPD_DELAY_TH1 0x38 1933#define BRXPD_DELAY_TH1 0x38
1911#define BRXPD_DELAY_TH2 0x1c0 1934#define BRXPD_DELAY_TH2 0x1c0
1912#define BRXPD_DC_COUNT_MAX 0x600 1935#define BRXPD_DC_COUNT_MAX 0x600
1913#define BRXPD_DELAY_TH 0x8000 1936#define BRXPD_DELAY_TH 0x8000
1914#define BRXPROCESS_DELAY 0xf0000 1937#define BRXPROCESS_DELAY 0xf0000
1915#define BRXSEARCHRANGE_GI2_EARLY 0x700000 1938#define BRXSEARCHRANGE_GI2_EARLY 0x700000
1916#define BRXFRAME_FUARD_COUNTER_L 0x3800000 1939#define BRXFRAME_FUARD_COUNTER_L 0x3800000
1917#define BRXSGI_GUARD_L 0xc000000 1940#define BRXSGI_GUARD_L 0xc000000
1918#define BRXSGI_SEARCH_L 0x30000000 1941#define BRXSGI_SEARCH_L 0x30000000
1919#define BRXSGI_TH 0xc0000000 1942#define BRXSGI_TH 0xc0000000
1920#define BDFSCNT0 0xff 1943#define BDFSCNT0 0xff
1921#define BDFSCNT1 0xff00 1944#define BDFSCNT1 0xff00
1922#define BDFSFLAG 0xf0000 1945#define BDFSFLAG 0xf0000
1923#define BMF_WEIGHT_SUM 0x300000 1946#define BMF_WEIGHT_SUM 0x300000
1924#define BMINIDX_TH 0x7f000000 1947#define BMINIDX_TH 0x7f000000
1925#define BDAFORMAT 0x40000 1948#define BDAFORMAT 0x40000
1926#define BTXCH_EMU_ENABLE 0x01000000 1949#define BTXCH_EMU_ENABLE 0x01000000
1927#define BTRSW_ISOLATION_A 0x7f 1950#define BTRSW_ISOLATION_A 0x7f
1928#define BTRSW_ISOLATION_B 0x7f00 1951#define BTRSW_ISOLATION_B 0x7f00
1929#define BTRSW_ISOLATION_C 0x7f0000 1952#define BTRSW_ISOLATION_C 0x7f0000
1930#define BTRSW_ISOLATION_D 0x7f000000 1953#define BTRSW_ISOLATION_D 0x7f000000
1931#define BEXT_LNA_GAIN 0x7c00 1954#define BEXT_LNA_GAIN 0x7c00
1932 1955
1933#define BSTBC_EN 0x4 1956#define BSTBC_EN 0x4
1934#define BANTENNA_MAPPING 0x10 1957#define BANTENNA_MAPPING 0x10
1935#define BNSS 0x20 1958#define BNSS 0x20
1936#define BCFO_ANTSUM_ID 0x200 1959#define BCFO_ANTSUM_ID 0x200
1937#define BPHY_COUNTER_RESET 0x8000000 1960#define BPHY_COUNTER_RESET 0x8000000
1938#define BCFO_REPORT_GET 0x4000000 1961#define BCFO_REPORT_GET 0x4000000
1939#define BOFDM_CONTINUE_TX 0x10000000 1962#define BOFDM_CONTINUE_TX 0x10000000
1940#define BOFDM_SINGLE_CARRIER 0x20000000 1963#define BOFDM_SINGLE_CARRIER 0x20000000
1941#define BOFDM_SINGLE_TONE 0x40000000 1964#define BOFDM_SINGLE_TONE 0x40000000
1942#define BHT_DETECT 0x100 1965#define BHT_DETECT 0x100
1943#define BCFOEN 0x10000 1966#define BCFOEN 0x10000
1944#define BCFOVALUE 0xfff00000 1967#define BCFOVALUE 0xfff00000
1945#define BSIGTONE_RE 0x3f 1968#define BSIGTONE_RE 0x3f
1946#define BSIGTONE_IM 0x7f00 1969#define BSIGTONE_IM 0x7f00
1947#define BCOUNTER_CCA 0xffff 1970#define BCOUNTER_CCA 0xffff
1948#define BCOUNTER_PARITYFAIL 0xffff0000 1971#define BCOUNTER_PARITYFAIL 0xffff0000
1949#define BCOUNTER_RATEILLEGAL 0xffff 1972#define BCOUNTER_RATEILLEGAL 0xffff
1950#define BCOUNTER_CRC8FAIL 0xffff0000 1973#define BCOUNTER_CRC8FAIL 0xffff0000
1951#define BCOUNTER_MCSNOSUPPORT 0xffff 1974#define BCOUNTER_MCSNOSUPPORT 0xffff
1952#define BCOUNTER_FASTSYNC 0xffff 1975#define BCOUNTER_FASTSYNC 0xffff
1953#define BSHORTCFO 0xfff 1976#define BSHORTCFO 0xfff
1954#define BSHORTCFOT_LENGTH 12 1977#define BSHORTCFOT_LENGTH 12
1955#define BSHORTCFOF_LENGTH 11 1978#define BSHORTCFOF_LENGTH 11
1956#define BLONGCFO 0x7ff 1979#define BLONGCFO 0x7ff
1957#define BLONGCFOT_LENGTH 11 1980#define BLONGCFOT_LENGTH 11
1958#define BLONGCFOF_LENGTH 11 1981#define BLONGCFOF_LENGTH 11
1959#define BTAILCFO 0x1fff 1982#define BTAILCFO 0x1fff
1960#define BTAILCFOT_LENGTH 13 1983#define BTAILCFOT_LENGTH 13
1961#define BTAILCFOF_LENGTH 12 1984#define BTAILCFOF_LENGTH 12
1962#define BNOISE_EN_PWDB 0xffff 1985#define BNOISE_EN_PWDB 0xffff
1963#define BCC_POWER_DB 0xffff0000 1986#define BCC_POWER_DB 0xffff0000
1964#define BMOISE_PWDB 0xffff 1987#define BMOISE_PWDB 0xffff
1965#define BPOWERMEAST_LENGTH 10 1988#define BPOWERMEAST_LENGTH 10
1966#define BPOWERMEASF_LENGTH 3 1989#define BPOWERMEASF_LENGTH 3
1967#define BRX_HT_BW 0x1 1990#define BRX_HT_BW 0x1
1968#define BRXSC 0x6 1991#define BRXSC 0x6
1969#define BRX_HT 0x8 1992#define BRX_HT 0x8
1970#define BNB_INTF_DET_ON 0x1 1993#define BNB_INTF_DET_ON 0x1
1971#define BINTF_WIN_LEN_CFG 0x30 1994#define BINTF_WIN_LEN_CFG 0x30
1972#define BNB_INTF_TH_CFG 0x1c0 1995#define BNB_INTF_TH_CFG 0x1c0
1973#define BRFGAIN 0x3f 1996#define BRFGAIN 0x3f
1974#define BTABLESEL 0x40 1997#define BTABLESEL 0x40
1975#define BTRSW 0x80 1998#define BTRSW 0x80
1976#define BRXSNR_A 0xff 1999#define BRXSNR_A 0xff
1977#define BRXSNR_B 0xff00 2000#define BRXSNR_B 0xff00
1978#define BRXSNR_C 0xff0000 2001#define BRXSNR_C 0xff0000
1979#define BRXSNR_D 0xff000000 2002#define BRXSNR_D 0xff000000
1980#define BSNR_EVMT_LENGTH 8 2003#define BSNR_EVMT_LENGTH 8
1981#define BSNR_EVMF_LENGTH 1 2004#define BSNR_EVMF_LENGTH 1
1982#define BCSI1ST 0xff 2005#define BCSI1ST 0xff
1983#define BCSI2ND 0xff00 2006#define BCSI2ND 0xff00
1984#define BRXEVM1ST 0xff0000 2007#define BRXEVM1ST 0xff0000
1985#define BRXEVM2ND 0xff000000 2008#define BRXEVM2ND 0xff000000
1986#define BSIGEVM 0xff 2009#define BSIGEVM 0xff
1987#define BPWDB 0xff00 2010#define BPWDB 0xff00
1988#define BSGIEN 0x10000 2011#define BSGIEN 0x10000
1989 2012
1990#define BSFACTOR_QMA1 0xf 2013#define BSFACTOR_QMA1 0xf
1991#define BSFACTOR_QMA2 0xf0 2014#define BSFACTOR_QMA2 0xf0
1992#define BSFACTOR_QMA3 0xf00 2015#define BSFACTOR_QMA3 0xf00
1993#define BSFACTOR_QMA4 0xf000 2016#define BSFACTOR_QMA4 0xf000
1994#define BSFACTOR_QMA5 0xf0000 2017#define BSFACTOR_QMA5 0xf0000
1995#define BSFACTOR_QMA6 0xf0000 2018#define BSFACTOR_QMA6 0xf0000
1996#define BSFACTOR_QMA7 0xf00000 2019#define BSFACTOR_QMA7 0xf00000
1997#define BSFACTOR_QMA8 0xf000000 2020#define BSFACTOR_QMA8 0xf000000
1998#define BSFACTOR_QMA9 0xf0000000 2021#define BSFACTOR_QMA9 0xf0000000
1999#define BCSI_SCHEME 0x100000 2022#define BCSI_SCHEME 0x100000
2000 2023
2001#define BNOISE_LVL_TOP_SET 0x3 2024#define BNOISE_LVL_TOP_SET 0x3
2002#define BCHSMOOTH 0x4 2025#define BCHSMOOTH 0x4
2003#define BCHSMOOTH_CFG1 0x38 2026#define BCHSMOOTH_CFG1 0x38
2004#define BCHSMOOTH_CFG2 0x1c0 2027#define BCHSMOOTH_CFG2 0x1c0
2005#define BCHSMOOTH_CFG3 0xe00 2028#define BCHSMOOTH_CFG3 0xe00
2006#define BCHSMOOTH_CFG4 0x7000 2029#define BCHSMOOTH_CFG4 0x7000
2007#define BMRCMODE 0x800000 2030#define BMRCMODE 0x800000
2008#define BTHEVMCFG 0x7000000 2031#define BTHEVMCFG 0x7000000
2009 2032
2010#define BLOOP_FIT_TYPE 0x1 2033#define BLOOP_FIT_TYPE 0x1
2011#define BUPD_CFO 0x40 2034#define BUPD_CFO 0x40
2012#define BUPD_CFO_OFFDATA 0x80 2035#define BUPD_CFO_OFFDATA 0x80
2013#define BADV_UPD_CFO 0x100 2036#define BADV_UPD_CFO 0x100
2014#define BADV_TIME_CTRL 0x800 2037#define BADV_TIME_CTRL 0x800
2015#define BUPD_CLKO 0x1000 2038#define BUPD_CLKO 0x1000
2016#define BFC 0x6000 2039#define BFC 0x6000
2017#define BTRACKING_MODE 0x8000 2040#define BTRACKING_MODE 0x8000
2018#define BPHCMP_ENABLE 0x10000 2041#define BPHCMP_ENABLE 0x10000
2019#define BUPD_CLKO_LTF 0x20000 2042#define BUPD_CLKO_LTF 0x20000
2020#define BCOM_CH_CFO 0x40000 2043#define BCOM_CH_CFO 0x40000
2021#define BCSI_ESTI_MODE 0x80000 2044#define BCSI_ESTI_MODE 0x80000
2022#define BADV_UPD_EQZ 0x100000 2045#define BADV_UPD_EQZ 0x100000
2023#define BUCHCFG 0x7000000 2046#define BUCHCFG 0x7000000
2024#define BUPDEQZ 0x8000000 2047#define BUPDEQZ 0x8000000
2025 2048
2026#define BRX_PESUDO_NOISE_ON 0x20000000 2049#define BRX_PESUDO_NOISE_ON 0x20000000
2027#define BRX_PESUDO_NOISE_A 0xff 2050#define BRX_PESUDO_NOISE_A 0xff
2028#define BRX_PESUDO_NOISE_B 0xff00 2051#define BRX_PESUDO_NOISE_B 0xff00
2029#define BRX_PESUDO_NOISE_C 0xff0000 2052#define BRX_PESUDO_NOISE_C 0xff0000
2030#define BRX_PESUDO_NOISE_D 0xff000000 2053#define BRX_PESUDO_NOISE_D 0xff000000
2031#define BRX_PESUDO_NOISESTATE_A 0xffff 2054#define BRX_PESUDO_NOISESTATE_A 0xffff
2032#define BRX_PESUDO_NOISESTATE_B 0xffff0000 2055#define BRX_PESUDO_NOISESTATE_B 0xffff0000
2033#define BRX_PESUDO_NOISESTATE_C 0xffff 2056#define BRX_PESUDO_NOISESTATE_C 0xffff
2034#define BRX_PESUDO_NOISESTATE_D 0xffff0000 2057#define BRX_PESUDO_NOISESTATE_D 0xffff0000
2035 2058
2036#define BZEBRA1_HSSIENABLE 0x8 2059#define BZEBRA1_HSSIENABLE 0x8
2037#define BZEBRA1_TRXCONTROL 0xc00 2060#define BZEBRA1_TRXCONTROL 0xc00
2038#define BZEBRA1_TRXGAINSETTING 0x07f 2061#define BZEBRA1_TRXGAINSETTING 0x07f
2039#define BZEBRA1_RXCOUNTER 0xc00 2062#define BZEBRA1_RXCOUNTER 0xc00
2040#define BZEBRA1_TXCHANGEPUMP 0x38 2063#define BZEBRA1_TXCHANGEPUMP 0x38
2041#define BZEBRA1_RXCHANGEPUMP 0x7 2064#define BZEBRA1_RXCHANGEPUMP 0x7
2042#define BZEBRA1_CHANNEL_NUM 0xf80 2065#define BZEBRA1_CHANNEL_NUM 0xf80
2043#define BZEBRA1_TXLPFBW 0x400 2066#define BZEBRA1_TXLPFBW 0x400
2044#define BZEBRA1_RXLPFBW 0x600 2067#define BZEBRA1_RXLPFBW 0x600
2045 2068
2046#define BRTL8256REG_MODE_CTRL1 0x100 2069#define BRTL8256REG_MODE_CTRL1 0x100
2047#define BRTL8256REG_MODE_CTRL0 0x40 2070#define BRTL8256REG_MODE_CTRL0 0x40
2048#define BRTL8256REG_TXLPFBW 0x18 2071#define BRTL8256REG_TXLPFBW 0x18
2049#define BRTL8256REG_RXLPFBW 0x600 2072#define BRTL8256REG_RXLPFBW 0x600
2050 2073
2051#define BRTL8258_TXLPFBW 0xc 2074#define BRTL8258_TXLPFBW 0xc
2052#define BRTL8258_RXLPFBW 0xc00 2075#define BRTL8258_RXLPFBW 0xc00
2053#define BRTL8258_RSSILPFBW 0xc0 2076#define BRTL8258_RSSILPFBW 0xc0
2054 2077
2055#define BBYTE0 0x1 2078#define BBYTE0 0x1
2056#define BBYTE1 0x2 2079#define BBYTE1 0x2
2057#define BBYTE2 0x4 2080#define BBYTE2 0x4
2058#define BBYTE3 0x8 2081#define BBYTE3 0x8
2059#define BWORD0 0x3 2082#define BWORD0 0x3
2060#define BWORD1 0xc 2083#define BWORD1 0xc
2061#define BWORD 0xf 2084#define BWORD 0xf
2062 2085
2063#define BENABLE 0x1 2086#define MASKBYTE0 0xff
2064#define BDISABLE 0x0 2087#define MASKBYTE1 0xff00
2065 2088#define MASKBYTE2 0xff0000
2066#define LEFT_ANTENNA 0x0 2089#define MASKBYTE3 0xff000000
2067#define RIGHT_ANTENNA 0x1 2090#define MASKHWORD 0xffff0000
2068 2091#define MASKLWORD 0x0000ffff
2069#define TCHECK_TXSTATUS 500 2092#define MASKDWORD 0xffffffff
2070#define TUPDATE_RXCOUNTER 100 2093#define MASK12BITS 0xfff
2094#define MASKH4BITS 0xf0000000
2095#define MASKOFDM_D 0xffc00000
2096#define MASKCCK 0x3f3f3f3f
2097
2098#define MASK4BITS 0x0f
2099#define MASK20BITS 0xfffff
2100#define RFREG_OFFSET_MASK 0xfffff
2101
2102#define BENABLE 0x1
2103#define BDISABLE 0x0
2104
2105#define LEFT_ANTENNA 0x0
2106#define RIGHT_ANTENNA 0x1
2107
2108#define TCHECK_TXSTATUS 500
2109#define TUPDATE_RXCOUNTER 100
2071 2110
2072/* 2 EFUSE_TEST (For RTL8723 partially) */ 2111/* 2 EFUSE_TEST (For RTL8723 partially) */
2073#define EFUSE_SEL(x) (((x) & 0x3) << 8) 2112#define EFUSE_SEL(x) (((x) & 0x3) << 8)
2074#define EFUSE_SEL_MASK 0x300 2113#define EFUSE_SEL_MASK 0x300
2075#define EFUSE_WIFI_SEL_0 0x0 2114#define EFUSE_WIFI_SEL_0 0x0
2076
2077/* Enable GPIO[9] as WiFi HW PDn source*/ 2115/* Enable GPIO[9] as WiFi HW PDn source*/
2078#define WL_HWPDN_EN BIT(0) 2116#define WL_HWPDN_EN BIT(0)
2079/* WiFi HW PDn polarity control*/ 2117/* WiFi HW PDn polarity control*/
2080#define WL_HWPDN_SL BIT(1) 2118#define WL_HWPDN_SL BIT(1)
2081 2119
2082#endif 2120#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/rf.c b/drivers/net/wireless/rtlwifi/rtl8723ae/rf.c
index 50dd2fb2c93d..9ebc8281ff99 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/rf.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/rf.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -34,10 +30,12 @@
34#include "rf.h" 30#include "rf.h"
35#include "dm.h" 31#include "dm.h"
36 32
37void rtl8723ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth) 33static bool _rtl8723e_phy_rf6052_config_parafile(struct ieee80211_hw *hw);
34
35void rtl8723e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
38{ 36{
39 struct rtl_priv *rtlpriv = rtl_priv(hw); 37 struct rtl_priv *rtlpriv = rtl_priv(hw);
40 struct rtl_phy *rtlphy = &(rtlpriv->phy); 38 struct rtl_phy *rtlphy = &rtlpriv->phy;
41 39
42 switch (bandwidth) { 40 switch (bandwidth) {
43 case HT_CHANNEL_WIDTH_20: 41 case HT_CHANNEL_WIDTH_20:
@@ -59,11 +57,11 @@ void rtl8723ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
59 } 57 }
60} 58}
61 59
62void rtl8723ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, 60void rtl8723e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
63 u8 *ppowerlevel) 61 u8 *ppowerlevel)
64{ 62{
65 struct rtl_priv *rtlpriv = rtl_priv(hw); 63 struct rtl_priv *rtlpriv = rtl_priv(hw);
66 struct rtl_phy *rtlphy = &(rtlpriv->phy); 64 struct rtl_phy *rtlphy = &rtlpriv->phy;
67 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 65 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
68 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 66 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
69 u32 tx_agc[2] = {0, 0}, tmpval; 67 u32 tx_agc[2] = {0, 0}, tmpval;
@@ -79,7 +77,8 @@ void rtl8723ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
79 tx_agc[RF90_PATH_B] = 0x3f3f3f3f; 77 tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
80 78
81 if (turbo_scanoff) { 79 if (turbo_scanoff) {
82 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 80 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B;
81 idx1++) {
83 tx_agc[idx1] = ppowerlevel[idx1] | 82 tx_agc[idx1] = ppowerlevel[idx1] |
84 (ppowerlevel[idx1] << 8) | 83 (ppowerlevel[idx1] << 8) |
85 (ppowerlevel[idx1] << 16) | 84 (ppowerlevel[idx1] << 16) |
@@ -89,24 +88,27 @@ void rtl8723ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
89 } else { 88 } else {
90 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 89 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
91 tx_agc[idx1] = ppowerlevel[idx1] | 90 tx_agc[idx1] = ppowerlevel[idx1] |
92 (ppowerlevel[idx1] << 8) | 91 (ppowerlevel[idx1] << 8) |
93 (ppowerlevel[idx1] << 16) | 92 (ppowerlevel[idx1] << 16) |
94 (ppowerlevel[idx1] << 24); 93 (ppowerlevel[idx1] << 24);
95 } 94 }
96 95
97 if (rtlefuse->eeprom_regulatory == 0) { 96 if (rtlefuse->eeprom_regulatory == 0) {
98 tmpval = (rtlphy->mcs_offset[0][6]) + 97 tmpval =
99 (rtlphy->mcs_offset[0][7] << 8); 98 (rtlphy->mcs_txpwrlevel_origoffset[0][6]) +
99 (rtlphy->mcs_txpwrlevel_origoffset[0][7] <<
100 8);
100 tx_agc[RF90_PATH_A] += tmpval; 101 tx_agc[RF90_PATH_A] += tmpval;
101 102
102 tmpval = (rtlphy->mcs_offset[0][14]) + 103 tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][14]) +
103 (rtlphy->mcs_offset[0][15] << 24); 104 (rtlphy->mcs_txpwrlevel_origoffset[0][15] <<
105 24);
104 tx_agc[RF90_PATH_B] += tmpval; 106 tx_agc[RF90_PATH_B] += tmpval;
105 } 107 }
106 } 108 }
107 109
108 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 110 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
109 ptr = (u8 *) (&(tx_agc[idx1])); 111 ptr = (u8 *)&tx_agc[idx1];
110 for (idx2 = 0; idx2 < 4; idx2++) { 112 for (idx2 = 0; idx2 < 4; idx2++) {
111 if (*ptr > RF6052_MAX_TX_PWR) 113 if (*ptr > RF6052_MAX_TX_PWR)
112 *ptr = RF6052_MAX_TX_PWR; 114 *ptr = RF6052_MAX_TX_PWR;
@@ -119,7 +121,7 @@ void rtl8723ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
119 121
120 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 122 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
121 "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, 123 "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
122 RTXAGC_A_CCK1_MCS32); 124 RTXAGC_A_CCK1_MCS32);
123 125
124 tmpval = tx_agc[RF90_PATH_A] >> 8; 126 tmpval = tx_agc[RF90_PATH_A] >> 8;
125 127
@@ -129,100 +131,99 @@ void rtl8723ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
129 131
130 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 132 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
131 "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, 133 "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
132 RTXAGC_B_CCK11_A_CCK2_11); 134 RTXAGC_B_CCK11_A_CCK2_11);
133 135
134 tmpval = tx_agc[RF90_PATH_B] >> 24; 136 tmpval = tx_agc[RF90_PATH_B] >> 24;
135 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval); 137 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval);
136 138
137 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 139 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
138 "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, 140 "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
139 RTXAGC_B_CCK11_A_CCK2_11); 141 RTXAGC_B_CCK11_A_CCK2_11);
140 142
141 tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff; 143 tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
142 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval); 144 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
143 145
144 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 146 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
145 "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, 147 "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
146 RTXAGC_B_CCK1_55_MCS32); 148 RTXAGC_B_CCK1_55_MCS32);
147} 149}
148 150
149static void rtl8723ae_phy_get_power_base(struct ieee80211_hw *hw, 151static void rtl8723e_phy_get_power_base(struct ieee80211_hw *hw,
150 u8 *ppowerlevel, u8 channel, 152 u8 *ppowerlevel, u8 channel,
151 u32 *ofdmbase, u32 *mcsbase) 153 u32 *ofdmbase, u32 *mcsbase)
152{ 154{
153 struct rtl_priv *rtlpriv = rtl_priv(hw); 155 struct rtl_priv *rtlpriv = rtl_priv(hw);
154 struct rtl_phy *rtlphy = &(rtlpriv->phy); 156 struct rtl_phy *rtlphy = &rtlpriv->phy;
155 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 157 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
156 u32 powerBase0, powerBase1; 158 u32 powerbase0, powerbase1;
157 u8 legacy_pwrdiff, ht20_pwrdiff; 159 u8 legacy_pwrdiff, ht20_pwrdiff;
158 u8 i, powerlevel[2]; 160 u8 i, powerlevel[2];
159 161
160 for (i = 0; i < 2; i++) { 162 for (i = 0; i < 2; i++) {
161 powerlevel[i] = ppowerlevel[i]; 163 powerlevel[i] = ppowerlevel[i];
162 legacy_pwrdiff = rtlefuse->txpwr_legacyhtdiff[i][channel - 1]; 164 legacy_pwrdiff = rtlefuse->txpwr_legacyhtdiff[i][channel - 1];
163 powerBase0 = powerlevel[i] + legacy_pwrdiff; 165 powerbase0 = powerlevel[i] + legacy_pwrdiff;
164 166
165 powerBase0 = (powerBase0 << 24) | (powerBase0 << 16) | 167 powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
166 (powerBase0 << 8) | powerBase0; 168 (powerbase0 << 8) | powerbase0;
167 *(ofdmbase + i) = powerBase0; 169 *(ofdmbase + i) = powerbase0;
168 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 170 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
169 " [OFDM power base index rf(%c) = 0x%x]\n", 171 " [OFDM power base index rf(%c) = 0x%x]\n",
170 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i)); 172 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i));
171 } 173 }
172 174
173 for (i = 0; i < 2; i++) { 175 for (i = 0; i < 2; i++) {
174 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) { 176 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20) {
175 ht20_pwrdiff = rtlefuse->txpwr_ht20diff[i][channel - 1]; 177 ht20_pwrdiff =
178 rtlefuse->txpwr_ht20diff[i][channel - 1];
176 powerlevel[i] += ht20_pwrdiff; 179 powerlevel[i] += ht20_pwrdiff;
177 } 180 }
178 powerBase1 = powerlevel[i]; 181 powerbase1 = powerlevel[i];
179 powerBase1 = (powerBase1 << 24) | 182 powerbase1 = (powerbase1 << 24) |
180 (powerBase1 << 16) | (powerBase1 << 8) | powerBase1; 183 (powerbase1 << 16) | (powerbase1 << 8) | powerbase1;
181 184
182 *(mcsbase + i) = powerBase1; 185 *(mcsbase + i) = powerbase1;
183 186
184 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 187 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
185 " [MCS power base index rf(%c) = 0x%x]\n", 188 " [MCS power base index rf(%c) = 0x%x]\n",
186 ((i == 0) ? 'A' : 'B'), *(mcsbase + i)); 189 ((i == 0) ? 'A' : 'B'), *(mcsbase + i));
187 } 190 }
188} 191}
189 192
190static void rtl8723ae_get_txpwr_val_by_reg(struct ieee80211_hw *hw, 193static void get_txpower_writeval_by_reg(struct ieee80211_hw *hw,
191 u8 channel, u8 index, 194 u8 channel, u8 index,
192 u32 *powerBase0, 195 u32 *powerbase0,
193 u32 *powerBase1, 196 u32 *powerbase1,
194 u32 *p_outwriteval) 197 u32 *p_outwriteval)
195{ 198{
196 struct rtl_priv *rtlpriv = rtl_priv(hw); 199 struct rtl_priv *rtlpriv = rtl_priv(hw);
197 struct rtl_phy *rtlphy = &(rtlpriv->phy); 200 struct rtl_phy *rtlphy = &rtlpriv->phy;
198 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 201 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
199 u8 i, chnlgroup = 0, pwr_diff_limit[4]; 202 u8 i, chnlgroup = 0, pwr_diff_limit[4];
200 u32 writeVal, customer_limit, rf; 203 u32 writeval, customer_limit, rf;
201 204
202 for (rf = 0; rf < 2; rf++) { 205 for (rf = 0; rf < 2; rf++) {
203 switch (rtlefuse->eeprom_regulatory) { 206 switch (rtlefuse->eeprom_regulatory) {
204 case 0: 207 case 0:
205 chnlgroup = 0; 208 chnlgroup = 0;
206 209
207 writeVal = rtlphy->mcs_offset[chnlgroup] 210 writeval =
208 [index + (rf ? 8 : 0)] + 211 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup][index +
209 ((index < 2) ? powerBase0[rf] : 212 (rf ? 8 : 0)]
210 powerBase1[rf]); 213 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
211 214
212 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 215 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
213 "RTK better performance, " 216 "RTK better performance, writeval(%c) = 0x%x\n",
214 "writeVal(%c) = 0x%x\n", 217 ((rf == 0) ? 'A' : 'B'), writeval);
215 ((rf == 0) ? 'A' : 'B'), writeVal);
216 break; 218 break;
217 case 1: 219 case 1:
218 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 220 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
219 writeVal = ((index < 2) ? powerBase0[rf] : 221 writeval = ((index < 2) ? powerbase0[rf] :
220 powerBase1[rf]); 222 powerbase1[rf]);
221 223
222 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 224 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
223 "Realtek regulatory, 40MHz, " 225 "Realtek regulatory, 40MHz, writeval(%c) = 0x%x\n",
224 "writeVal(%c) = 0x%x\n", 226 ((rf == 0) ? 'A' : 'B'), writeval);
225 ((rf == 0) ? 'A' : 'B'), writeVal);
226 } else { 227 } else {
227 if (rtlphy->pwrgroup_cnt == 1) 228 if (rtlphy->pwrgroup_cnt == 1)
228 chnlgroup = 0; 229 chnlgroup = 0;
@@ -234,29 +235,30 @@ static void rtl8723ae_get_txpwr_val_by_reg(struct ieee80211_hw *hw,
234 else if (channel > 9) 235 else if (channel > 9)
235 chnlgroup = 2; 236 chnlgroup = 2;
236 if (rtlphy->current_chan_bw == 237 if (rtlphy->current_chan_bw ==
237 HT_CHANNEL_WIDTH_20) 238 HT_CHANNEL_WIDTH_20)
238 chnlgroup++; 239 chnlgroup++;
239 else 240 else
240 chnlgroup += 4; 241 chnlgroup += 4;
241 } 242 }
242 243
243 writeVal = rtlphy->mcs_offset[chnlgroup] 244 writeval =
245 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
244 [index + (rf ? 8 : 0)] + ((index < 2) ? 246 [index + (rf ? 8 : 0)] + ((index < 2) ?
245 powerBase0[rf] : 247 powerbase0[rf] :
246 powerBase1[rf]); 248 powerbase1[rf]);
247 249
248 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 250 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
249 "Realtek regulatory, 20MHz, writeVal(%c) = 0x%x\n", 251 "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
250 ((rf == 0) ? 'A' : 'B'), writeVal); 252 ((rf == 0) ? 'A' : 'B'), writeval);
251 } 253 }
252 break; 254 break;
253 case 2: 255 case 2:
254 writeVal = 256 writeval =
255 ((index < 2) ? powerBase0[rf] : powerBase1[rf]); 257 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
256 258
257 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 259 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
258 "Better regulatory, writeVal(%c) = 0x%x\n", 260 "Better regulatory, writeval(%c) = 0x%x\n",
259 ((rf == 0) ? 'A' : 'B'), writeVal); 261 ((rf == 0) ? 'A' : 'B'), writeval);
260 break; 262 break;
261 case 3: 263 case 3:
262 chnlgroup = 0; 264 chnlgroup = 0;
@@ -265,18 +267,21 @@ static void rtl8723ae_get_txpwr_val_by_reg(struct ieee80211_hw *hw,
265 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 267 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
266 "customer's limit, 40MHz rf(%c) = 0x%x\n", 268 "customer's limit, 40MHz rf(%c) = 0x%x\n",
267 ((rf == 0) ? 'A' : 'B'), 269 ((rf == 0) ? 'A' : 'B'),
268 rtlefuse->pwrgroup_ht40[rf][channel-1]); 270 rtlefuse->pwrgroup_ht40[rf][channel -
271 1]);
269 } else { 272 } else {
270 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 273 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
271 "customer's limit, 20MHz rf(%c) = 0x%x\n", 274 "customer's limit, 20MHz rf(%c) = 0x%x\n",
272 ((rf == 0) ? 'A' : 'B'), 275 ((rf == 0) ? 'A' : 'B'),
273 rtlefuse->pwrgroup_ht20[rf][channel-1]); 276 rtlefuse->pwrgroup_ht20[rf][channel -
277 1]);
274 } 278 }
275 for (i = 0; i < 4; i++) { 279 for (i = 0; i < 4; i++) {
276 pwr_diff_limit[i] = 280 pwr_diff_limit[i] =
277 (u8) ((rtlphy->mcs_offset 281 (u8)((rtlphy->mcs_txpwrlevel_origoffset
278 [chnlgroup][index + (rf ? 8 : 0)] & 282 [chnlgroup][index +
279 (0x7f << (i * 8))) >> (i * 8)); 283 (rf ? 8 : 0)] & (0x7f <<
284 (i * 8))) >> (i * 8));
280 285
281 if (rtlphy->current_chan_bw == 286 if (rtlphy->current_chan_bw ==
282 HT_CHANNEL_WIDTH_20_40) { 287 HT_CHANNEL_WIDTH_20_40) {
@@ -302,41 +307,42 @@ static void rtl8723ae_get_txpwr_val_by_reg(struct ieee80211_hw *hw,
302 307
303 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 308 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
304 "Customer's limit rf(%c) = 0x%x\n", 309 "Customer's limit rf(%c) = 0x%x\n",
305 ((rf == 0) ? 'A' : 'B'), customer_limit); 310 ((rf == 0) ? 'A' : 'B'), customer_limit);
306 311
307 writeVal = customer_limit + 312 writeval = customer_limit +
308 ((index < 2) ? powerBase0[rf] : powerBase1[rf]); 313 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
309 314
310 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 315 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
311 "Customer, writeVal rf(%c)= 0x%x\n", 316 "Customer, writeval rf(%c)= 0x%x\n",
312 ((rf == 0) ? 'A' : 'B'), writeVal); 317 ((rf == 0) ? 'A' : 'B'), writeval);
313 break; 318 break;
314 default: 319 default:
315 chnlgroup = 0; 320 chnlgroup = 0;
316 writeVal = rtlphy->mcs_offset[chnlgroup][index + 321 writeval =
317 (rf ? 8 : 0)] + ((index < 2) ? powerBase0[rf] : 322 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
318 powerBase1[rf]); 323 [index + (rf ? 8 : 0)]
324 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
319 325
320 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 326 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
321 "RTK better performance, writeVal rf(%c) = 0x%x\n", 327 "RTK better performance, writeval rf(%c) = 0x%x\n",
322 ((rf == 0) ? 'A' : 'B'), writeVal); 328 ((rf == 0) ? 'A' : 'B'), writeval);
323 break; 329 break;
324 } 330 }
325 331
326 if (rtlpriv->dm.dynamic_txhighpower_lvl == TXHIGHPWRLEVEL_BT1) 332 if (rtlpriv->dm.dynamic_txhighpower_lvl == TXHIGHPWRLEVEL_BT1)
327 writeVal = writeVal - 0x06060606; 333 writeval = writeval - 0x06060606;
328 else if (rtlpriv->dm.dynamic_txhighpower_lvl == 334 else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
329 TXHIGHPWRLEVEL_BT2) 335 TXHIGHPWRLEVEL_BT2)
330 writeVal = writeVal - 0x0c0c0c0c; 336 writeval = writeval - 0x0c0c0c0c;
331 *(p_outwriteval + rf) = writeVal; 337 *(p_outwriteval + rf) = writeval;
332 } 338 }
333} 339}
334 340
335static void _rtl8723ae_write_ofdm_power_reg(struct ieee80211_hw *hw, 341static void _rtl8723e_write_ofdm_power_reg(struct ieee80211_hw *hw,
336 u8 index, u32 *pValue) 342 u8 index, u32 *pvalue)
337{ 343{
338 struct rtl_priv *rtlpriv = rtl_priv(hw); 344 struct rtl_priv *rtlpriv = rtl_priv(hw);
339 struct rtl_phy *rtlphy = &(rtlpriv->phy); 345 struct rtl_phy *rtlphy = &rtlpriv->phy;
340 346
341 u16 regoffset_a[6] = { 347 u16 regoffset_a[6] = {
342 RTXAGC_A_RATE18_06, RTXAGC_A_RATE54_24, 348 RTXAGC_A_RATE18_06, RTXAGC_A_RATE54_24,
@@ -349,29 +355,29 @@ static void _rtl8723ae_write_ofdm_power_reg(struct ieee80211_hw *hw,
349 RTXAGC_B_MCS11_MCS08, RTXAGC_B_MCS15_MCS12 355 RTXAGC_B_MCS11_MCS08, RTXAGC_B_MCS15_MCS12
350 }; 356 };
351 u8 i, rf, pwr_val[4]; 357 u8 i, rf, pwr_val[4];
352 u32 writeVal; 358 u32 writeval;
353 u16 regoffset; 359 u16 regoffset;
354 360
355 for (rf = 0; rf < 2; rf++) { 361 for (rf = 0; rf < 2; rf++) {
356 writeVal = pValue[rf]; 362 writeval = pvalue[rf];
357 for (i = 0; i < 4; i++) { 363 for (i = 0; i < 4; i++) {
358 pwr_val[i] = (u8) ((writeVal & (0x7f << 364 pwr_val[i] = (u8)((writeval & (0x7f <<
359 (i * 8))) >> (i * 8)); 365 (i * 8))) >> (i * 8));
360 366
361 if (pwr_val[i] > RF6052_MAX_TX_PWR) 367 if (pwr_val[i] > RF6052_MAX_TX_PWR)
362 pwr_val[i] = RF6052_MAX_TX_PWR; 368 pwr_val[i] = RF6052_MAX_TX_PWR;
363 } 369 }
364 writeVal = (pwr_val[3] << 24) | (pwr_val[2] << 16) | 370 writeval = (pwr_val[3] << 24) | (pwr_val[2] << 16) |
365 (pwr_val[1] << 8) | pwr_val[0]; 371 (pwr_val[1] << 8) | pwr_val[0];
366 372
367 if (rf == 0) 373 if (rf == 0)
368 regoffset = regoffset_a[index]; 374 regoffset = regoffset_a[index];
369 else 375 else
370 regoffset = regoffset_b[index]; 376 regoffset = regoffset_b[index];
371 rtl_set_bbreg(hw, regoffset, MASKDWORD, writeVal); 377 rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval);
372 378
373 RTPRINT(rtlpriv, FPHY, PHY_TXPWR, 379 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
374 "Set 0x%x = %08x\n", regoffset, writeVal); 380 "Set 0x%x = %08x\n", regoffset, writeval);
375 381
376 if (((get_rf_type(rtlphy) == RF_2T2R) && 382 if (((get_rf_type(rtlphy) == RF_2T2R) &&
377 (regoffset == RTXAGC_A_MCS15_MCS12 || 383 (regoffset == RTXAGC_A_MCS15_MCS12 ||
@@ -380,7 +386,7 @@ static void _rtl8723ae_write_ofdm_power_reg(struct ieee80211_hw *hw,
380 (regoffset == RTXAGC_A_MCS07_MCS04 || 386 (regoffset == RTXAGC_A_MCS07_MCS04 ||
381 regoffset == RTXAGC_B_MCS07_MCS04))) { 387 regoffset == RTXAGC_B_MCS07_MCS04))) {
382 388
383 writeVal = pwr_val[3]; 389 writeval = pwr_val[3];
384 if (regoffset == RTXAGC_A_MCS15_MCS12 || 390 if (regoffset == RTXAGC_A_MCS15_MCS12 ||
385 regoffset == RTXAGC_A_MCS07_MCS04) 391 regoffset == RTXAGC_A_MCS07_MCS04)
386 regoffset = 0xc90; 392 regoffset = 0xc90;
@@ -389,37 +395,49 @@ static void _rtl8723ae_write_ofdm_power_reg(struct ieee80211_hw *hw,
389 regoffset = 0xc98; 395 regoffset = 0xc98;
390 396
391 for (i = 0; i < 3; i++) { 397 for (i = 0; i < 3; i++) {
392 writeVal = (writeVal > 6) ? (writeVal - 6) : 0; 398 writeval = (writeval > 6) ? (writeval - 6) : 0;
393 rtl_write_byte(rtlpriv, (u32) (regoffset + i), 399 rtl_write_byte(rtlpriv, (u32) (regoffset + i),
394 (u8) writeVal); 400 (u8)writeval);
395 } 401 }
396 } 402 }
397 } 403 }
398} 404}
399 405
400void rtl8723ae_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, 406void rtl8723e_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
401 u8 *ppowerlevel, u8 channel) 407 u8 *ppowerlevel, u8 channel)
402{ 408{
403 u32 writeVal[2], powerBase0[2], powerBase1[2]; 409 u32 writeval[2], powerbase0[2], powerbase1[2];
404 u8 index; 410 u8 index;
405 411
406 rtl8723ae_phy_get_power_base(hw, ppowerlevel, 412 rtl8723e_phy_get_power_base(hw, ppowerlevel,
407 channel, &powerBase0[0], &powerBase1[0]); 413 channel, &powerbase0[0], &powerbase1[0]);
408 414
409 for (index = 0; index < 6; index++) { 415 for (index = 0; index < 6; index++) {
410 rtl8723ae_get_txpwr_val_by_reg(hw, channel, index, 416 get_txpower_writeval_by_reg(hw, channel, index, &powerbase0[0],
411 &powerBase0[0], 417 &powerbase1[0],
412 &powerBase1[0], 418 &writeval[0]);
413 &writeVal[0]);
414 419
415 _rtl8723ae_write_ofdm_power_reg(hw, index, &writeVal[0]); 420 _rtl8723e_write_ofdm_power_reg(hw, index, &writeval[0]);
416 } 421 }
417} 422}
418 423
419static bool _rtl8723ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw) 424bool rtl8723e_phy_rf6052_config(struct ieee80211_hw *hw)
420{ 425{
421 struct rtl_priv *rtlpriv = rtl_priv(hw); 426 struct rtl_priv *rtlpriv = rtl_priv(hw);
422 struct rtl_phy *rtlphy = &(rtlpriv->phy); 427 struct rtl_phy *rtlphy = &rtlpriv->phy;
428
429 if (rtlphy->rf_type == RF_1T1R)
430 rtlphy->num_total_rfpath = 1;
431 else
432 rtlphy->num_total_rfpath = 2;
433
434 return _rtl8723e_phy_rf6052_config_parafile(hw);
435}
436
437static bool _rtl8723e_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
438{
439 struct rtl_priv *rtlpriv = rtl_priv(hw);
440 struct rtl_phy *rtlphy = &rtlpriv->phy;
423 u32 u4_regvalue = 0; 441 u32 u4_regvalue = 0;
424 u8 rfpath; 442 u8 rfpath;
425 bool rtstatus = true; 443 bool rtstatus = true;
@@ -457,11 +475,12 @@ static bool _rtl8723ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
457 475
458 switch (rfpath) { 476 switch (rfpath) {
459 case RF90_PATH_A: 477 case RF90_PATH_A:
460 rtstatus = rtl8723ae_phy_config_rf_with_headerfile(hw, 478 rtstatus = rtl8723e_phy_config_rf_with_headerfile(hw,
461 (enum radio_path)rfpath); 479 (enum radio_path)rfpath);
462 break; 480 break;
463 case RF90_PATH_B: 481 case RF90_PATH_B:
464 rtstatus = rtl8723ae_phy_config_rf_with_headerfile(hw, 482 rtstatus =
483 rtl8723e_phy_config_rf_with_headerfile(hw,
465 (enum radio_path)rfpath); 484 (enum radio_path)rfpath);
466 break; 485 break;
467 case RF90_PATH_C: 486 case RF90_PATH_C:
@@ -469,6 +488,7 @@ static bool _rtl8723ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
469 case RF90_PATH_D: 488 case RF90_PATH_D:
470 break; 489 break;
471 } 490 }
491
472 switch (rfpath) { 492 switch (rfpath) {
473 case RF90_PATH_A: 493 case RF90_PATH_A:
474 case RF90_PATH_C: 494 case RF90_PATH_C:
@@ -481,25 +501,14 @@ static bool _rtl8723ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
481 BRFSI_RFENV << 16, u4_regvalue); 501 BRFSI_RFENV << 16, u4_regvalue);
482 break; 502 break;
483 } 503 }
504
484 if (rtstatus != true) { 505 if (rtstatus != true) {
485 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 506 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
486 "Radio[%d] Fail!!", rfpath); 507 "Radio[%d] Fail!!", rfpath);
487 return false; 508 return false;
488 } 509 }
489 } 510 }
490 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "<---\n");
491 return rtstatus;
492}
493
494bool rtl8723ae_phy_rf6052_config(struct ieee80211_hw *hw)
495{
496 struct rtl_priv *rtlpriv = rtl_priv(hw);
497 struct rtl_phy *rtlphy = &(rtlpriv->phy);
498 511
499 if (rtlphy->rf_type == RF_1T1R) 512 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
500 rtlphy->num_total_rfpath = 1; 513 return rtstatus;
501 else
502 rtlphy->num_total_rfpath = 2;
503
504 return _rtl8723ae_phy_rf6052_config_parafile(hw);
505} 514}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h b/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h
index 57f1933ee663..f3f45b16361f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/rf.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -31,12 +27,14 @@
31#define __RTL8723E_RF_H__ 27#define __RTL8723E_RF_H__
32 28
33#define RF6052_MAX_TX_PWR 0x3F 29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
34 31
35void rtl8723ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth); 32void rtl8723e_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
36void rtl8723ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw, 33 u8 bandwidth);
37 u8 *ppowerlevel); 34void rtl8723e_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
38void rtl8723ae_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw, 35 u8 *ppowerlevel);
39 u8 *ppowerlevel, u8 channel); 36void rtl8723e_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
40bool rtl8723ae_phy_rf6052_config(struct ieee80211_hw *hw); 37 u8 *ppowerlevel, u8 channel);
38bool rtl8723e_phy_rf6052_config(struct ieee80211_hw *hw);
41 39
42#endif 40#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c b/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c
index 73cba1eec8cf..8280bab43df4 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/sw.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -28,34 +24,35 @@
28 *****************************************************************************/ 24 *****************************************************************************/
29 25
30#include "../wifi.h" 26#include "../wifi.h"
31#include <linux/vmalloc.h>
32#include <linux/module.h>
33
34#include "../core.h" 27#include "../core.h"
35#include "../pci.h" 28#include "../pci.h"
36#include "../base.h"
37#include "reg.h" 29#include "reg.h"
38#include "def.h" 30#include "def.h"
39#include "phy.h" 31#include "phy.h"
40#include "../rtl8723com/phy_common.h"
41#include "dm.h" 32#include "dm.h"
42#include "hw.h"
43#include "fw.h" 33#include "fw.h"
44#include "../rtl8723com/fw_common.h" 34#include "../rtl8723com/fw_common.h"
35#include "hw.h"
45#include "sw.h" 36#include "sw.h"
46#include "trx.h" 37#include "trx.h"
47#include "led.h" 38#include "led.h"
48#include "table.h" 39#include "table.h"
49#include "hal_btc.h" 40#include "hal_btc.h"
41#include "../btcoexist/rtl_btc.h"
42#include "../rtl8723com/phy_common.h"
50 43
51static void rtl8723ae_init_aspm_vars(struct ieee80211_hw *hw) 44#include <linux/vmalloc.h>
45#include <linux/module.h>
46
47static void rtl8723e_init_aspm_vars(struct ieee80211_hw *hw)
52{ 48{
53 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 49 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
54 50
55 /*close ASPM for AMD defaultly */ 51 /*close ASPM for AMD defaultly */
56 rtlpci->const_amdpci_aspm = 0; 52 rtlpci->const_amdpci_aspm = 0;
57 53
58 /* ASPM PS mode. 54 /**
55 * ASPM PS mode.
59 * 0 - Disable ASPM, 56 * 0 - Disable ASPM,
60 * 1 - Enable ASPM without Clock Req, 57 * 1 - Enable ASPM without Clock Req,
61 * 2 - Enable ASPM with Clock Req, 58 * 2 - Enable ASPM with Clock Req,
@@ -71,7 +68,8 @@ static void rtl8723ae_init_aspm_vars(struct ieee80211_hw *hw)
71 /*Setting for PCI-E bridge */ 68 /*Setting for PCI-E bridge */
72 rtlpci->const_hostpci_aspm_setting = 0x02; 69 rtlpci->const_hostpci_aspm_setting = 0x02;
73 70
74 /* In Hw/Sw Radio Off situation. 71 /**
72 * In Hw/Sw Radio Off situation.
75 * 0 - Default, 73 * 0 - Default,
76 * 1 - From ASPM setting without low Mac Pwr, 74 * 1 - From ASPM setting without low Mac Pwr,
77 * 2 - From ASPM setting with low Mac Pwr, 75 * 2 - From ASPM setting with low Mac Pwr,
@@ -80,7 +78,8 @@ static void rtl8723ae_init_aspm_vars(struct ieee80211_hw *hw)
80 */ 78 */
81 rtlpci->const_hwsw_rfoff_d3 = 0; 79 rtlpci->const_hwsw_rfoff_d3 = 0;
82 80
83 /* This setting works for those device with 81 /**
82 * This setting works for those device with
84 * backdoor ASPM setting such as EPHY setting. 83 * backdoor ASPM setting such as EPHY setting.
85 * 0 - Not support ASPM, 84 * 0 - Not support ASPM,
86 * 1 - Support ASPM, 85 * 1 - Support ASPM,
@@ -89,14 +88,17 @@ static void rtl8723ae_init_aspm_vars(struct ieee80211_hw *hw)
89 rtlpci->const_support_pciaspm = 1; 88 rtlpci->const_support_pciaspm = 1;
90} 89}
91 90
92int rtl8723ae_init_sw_vars(struct ieee80211_hw *hw) 91int rtl8723e_init_sw_vars(struct ieee80211_hw *hw)
93{ 92{
94 struct rtl_priv *rtlpriv = rtl_priv(hw); 93 struct rtl_priv *rtlpriv = rtl_priv(hw);
95 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 94 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
96 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 95 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
97 int err; 96 int err = 0;
97
98 rtl8723e_bt_reg_init(hw);
99
100 rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
98 101
99 rtl8723ae_bt_reg_init(hw);
100 rtlpriv->dm.dm_initialgain_enable = 1; 102 rtlpriv->dm.dm_initialgain_enable = 1;
101 rtlpriv->dm.dm_flag = 0; 103 rtlpriv->dm.dm_flag = 0;
102 rtlpriv->dm.disable_framebursting = 0; 104 rtlpriv->dm.disable_framebursting = 0;
@@ -138,7 +140,9 @@ int rtl8723ae_init_sw_vars(struct ieee80211_hw *hw)
138 PHIMR_PSTIMEOUT | 140 PHIMR_PSTIMEOUT |
139 0); 141 0);
140 142
141 rtlpci->irq_mask[1] = (u32)(PHIMR_RXFOVW | 0); 143 rtlpci->irq_mask[1] =
144 (u32)(PHIMR_RXFOVW |
145 0);
142 146
143 /* for debug level */ 147 /* for debug level */
144 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug; 148 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
@@ -146,12 +150,11 @@ int rtl8723ae_init_sw_vars(struct ieee80211_hw *hw)
146 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 150 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
147 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 151 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
148 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; 152 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
153 if (rtlpriv->cfg->mod_params->disable_watchdog)
154 pr_info("watchdog disabled\n");
149 rtlpriv->psc.reg_fwctrl_lps = 3; 155 rtlpriv->psc.reg_fwctrl_lps = 3;
150 rtlpriv->psc.reg_max_lps_awakeintvl = 5; 156 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
151 /* for ASPM, you can close aspm through 157 rtl8723e_init_aspm_vars(hw);
152 * set const_support_pciaspm = 0
153 */
154 rtl8723ae_init_aspm_vars(hw);
155 158
156 if (rtlpriv->psc.reg_fwctrl_lps == 1) 159 if (rtlpriv->psc.reg_fwctrl_lps == 1)
157 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE; 160 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
@@ -161,7 +164,7 @@ int rtl8723ae_init_sw_vars(struct ieee80211_hw *hw)
161 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE; 164 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
162 165
163 /* for firmware buf */ 166 /* for firmware buf */
164 rtlpriv->rtlhal.pfirmware = vmalloc(0x6000); 167 rtlpriv->rtlhal.pfirmware = vzalloc(0x6000);
165 if (!rtlpriv->rtlhal.pfirmware) { 168 if (!rtlpriv->rtlhal.pfirmware) {
166 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 169 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
167 "Can't alloc buffer for fw.\n"); 170 "Can't alloc buffer for fw.\n");
@@ -186,7 +189,7 @@ int rtl8723ae_init_sw_vars(struct ieee80211_hw *hw)
186 return 0; 189 return 0;
187} 190}
188 191
189void rtl8723ae_deinit_sw_vars(struct ieee80211_hw *hw) 192void rtl8723e_deinit_sw_vars(struct ieee80211_hw *hw)
190{ 193{
191 struct rtl_priv *rtlpriv = rtl_priv(hw); 194 struct rtl_priv *rtlpriv = rtl_priv(hw);
192 195
@@ -196,59 +199,69 @@ void rtl8723ae_deinit_sw_vars(struct ieee80211_hw *hw)
196 } 199 }
197} 200}
198 201
199static bool is_fw_header(struct rtl92c_firmware_header *hdr) 202/* get bt coexist status */
203bool rtl8723e_get_btc_status(void)
204{
205 return true;
206}
207
208static bool is_fw_header(struct rtl8723e_firmware_header *hdr)
200{ 209{
201 return (hdr->signature & 0xfff0) == 0x2300; 210 return (hdr->signature & 0xfff0) == 0x2300;
202} 211}
203 212
204static struct rtl_hal_ops rtl8723ae_hal_ops = { 213static struct rtl_hal_ops rtl8723e_hal_ops = {
205 .init_sw_vars = rtl8723ae_init_sw_vars, 214 .init_sw_vars = rtl8723e_init_sw_vars,
206 .deinit_sw_vars = rtl8723ae_deinit_sw_vars, 215 .deinit_sw_vars = rtl8723e_deinit_sw_vars,
207 .read_eeprom_info = rtl8723ae_read_eeprom_info, 216 .read_eeprom_info = rtl8723e_read_eeprom_info,
208 .interrupt_recognized = rtl8723ae_interrupt_recognized, 217 .interrupt_recognized = rtl8723e_interrupt_recognized,
209 .hw_init = rtl8723ae_hw_init, 218 .hw_init = rtl8723e_hw_init,
210 .hw_disable = rtl8723ae_card_disable, 219 .hw_disable = rtl8723e_card_disable,
211 .hw_suspend = rtl8723ae_suspend, 220 .hw_suspend = rtl8723e_suspend,
212 .hw_resume = rtl8723ae_resume, 221 .hw_resume = rtl8723e_resume,
213 .enable_interrupt = rtl8723ae_enable_interrupt, 222 .enable_interrupt = rtl8723e_enable_interrupt,
214 .disable_interrupt = rtl8723ae_disable_interrupt, 223 .disable_interrupt = rtl8723e_disable_interrupt,
215 .set_network_type = rtl8723ae_set_network_type, 224 .set_network_type = rtl8723e_set_network_type,
216 .set_chk_bssid = rtl8723ae_set_check_bssid, 225 .set_chk_bssid = rtl8723e_set_check_bssid,
217 .set_qos = rtl8723ae_set_qos, 226 .set_qos = rtl8723e_set_qos,
218 .set_bcn_reg = rtl8723ae_set_beacon_related_registers, 227 .set_bcn_reg = rtl8723e_set_beacon_related_registers,
219 .set_bcn_intv = rtl8723ae_set_beacon_interval, 228 .set_bcn_intv = rtl8723e_set_beacon_interval,
220 .update_interrupt_mask = rtl8723ae_update_interrupt_mask, 229 .update_interrupt_mask = rtl8723e_update_interrupt_mask,
221 .get_hw_reg = rtl8723ae_get_hw_reg, 230 .get_hw_reg = rtl8723e_get_hw_reg,
222 .set_hw_reg = rtl8723ae_set_hw_reg, 231 .set_hw_reg = rtl8723e_set_hw_reg,
223 .update_rate_tbl = rtl8723ae_update_hal_rate_tbl, 232 .update_rate_tbl = rtl8723e_update_hal_rate_tbl,
224 .fill_tx_desc = rtl8723ae_tx_fill_desc, 233 .fill_tx_desc = rtl8723e_tx_fill_desc,
225 .fill_tx_cmddesc = rtl8723ae_tx_fill_cmddesc, 234 .fill_tx_cmddesc = rtl8723e_tx_fill_cmddesc,
226 .query_rx_desc = rtl8723ae_rx_query_desc, 235 .query_rx_desc = rtl8723e_rx_query_desc,
227 .set_channel_access = rtl8723ae_update_channel_access_setting, 236 .set_channel_access = rtl8723e_update_channel_access_setting,
228 .radio_onoff_checking = rtl8723ae_gpio_radio_on_off_checking, 237 .radio_onoff_checking = rtl8723e_gpio_radio_on_off_checking,
229 .set_bw_mode = rtl8723ae_phy_set_bw_mode, 238 .set_bw_mode = rtl8723e_phy_set_bw_mode,
230 .switch_channel = rtl8723ae_phy_sw_chnl, 239 .switch_channel = rtl8723e_phy_sw_chnl,
231 .dm_watchdog = rtl8723ae_dm_watchdog, 240 .dm_watchdog = rtl8723e_dm_watchdog,
232 .scan_operation_backup = rtl_phy_scan_operation_backup, 241 .scan_operation_backup = rtl8723e_phy_scan_operation_backup,
233 .set_rf_power_state = rtl8723ae_phy_set_rf_power_state, 242 .set_rf_power_state = rtl8723e_phy_set_rf_power_state,
234 .led_control = rtl8723ae_led_control, 243 .led_control = rtl8723e_led_control,
235 .set_desc = rtl8723ae_set_desc, 244 .set_desc = rtl8723e_set_desc,
236 .get_desc = rtl8723ae_get_desc, 245 .get_desc = rtl8723e_get_desc,
237 .tx_polling = rtl8723ae_tx_polling, 246 .is_tx_desc_closed = rtl8723e_is_tx_desc_closed,
238 .enable_hw_sec = rtl8723ae_enable_hw_security_config, 247 .tx_polling = rtl8723e_tx_polling,
239 .set_key = rtl8723ae_set_key, 248 .enable_hw_sec = rtl8723e_enable_hw_security_config,
240 .init_sw_leds = rtl8723ae_init_sw_leds, 249 .set_key = rtl8723e_set_key,
250 .init_sw_leds = rtl8723e_init_sw_leds,
241 .get_bbreg = rtl8723_phy_query_bb_reg, 251 .get_bbreg = rtl8723_phy_query_bb_reg,
242 .set_bbreg = rtl8723_phy_set_bb_reg, 252 .set_bbreg = rtl8723_phy_set_bb_reg,
243 .get_rfreg = rtl8723ae_phy_query_rf_reg, 253 .get_rfreg = rtl8723e_phy_query_rf_reg,
244 .set_rfreg = rtl8723ae_phy_set_rf_reg, 254 .set_rfreg = rtl8723e_phy_set_rf_reg,
245 .c2h_command_handle = rtl_8723e_c2h_command_handle, 255 .c2h_command_handle = rtl_8723e_c2h_command_handle,
246 .bt_wifi_media_status_notify = rtl_8723e_bt_wifi_media_status_notify, 256 .bt_wifi_media_status_notify = rtl_8723e_bt_wifi_media_status_notify,
247 .bt_coex_off_before_lps = rtl8723ae_bt_coex_off_before_lps, 257 .bt_coex_off_before_lps =
258 rtl8723e_dm_bt_turn_off_bt_coexist_before_enter_lps,
259 .get_btc_status = rtl8723e_get_btc_status,
260 .rx_command_packet = rtl8723e_rx_command_packet,
248 .is_fw_header = is_fw_header, 261 .is_fw_header = is_fw_header,
249}; 262};
250 263
251static struct rtl_mod_params rtl8723ae_mod_params = { 264static struct rtl_mod_params rtl8723e_mod_params = {
252 .sw_crypto = false, 265 .sw_crypto = false,
253 .inactiveps = true, 266 .inactiveps = true,
254 .swctrl_lps = false, 267 .swctrl_lps = false,
@@ -256,13 +269,13 @@ static struct rtl_mod_params rtl8723ae_mod_params = {
256 .debug = DBG_EMERG, 269 .debug = DBG_EMERG,
257}; 270};
258 271
259static struct rtl_hal_cfg rtl8723ae_hal_cfg = { 272static struct rtl_hal_cfg rtl8723e_hal_cfg = {
260 .bar_id = 2, 273 .bar_id = 2,
261 .write_readback = true, 274 .write_readback = true,
262 .name = "rtl8723ae_pci", 275 .name = "rtl8723e_pci",
263 .fw_name = "rtlwifi/rtl8723fw.bin", 276 .fw_name = "rtlwifi/rtl8723efw.bin",
264 .ops = &rtl8723ae_hal_ops, 277 .ops = &rtl8723e_hal_ops,
265 .mod_params = &rtl8723ae_mod_params, 278 .mod_params = &rtl8723e_mod_params,
266 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL, 279 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
267 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN, 280 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
268 .maps[SYS_CLK] = REG_SYS_CLKR, 281 .maps[SYS_CLK] = REG_SYS_CLKR,
@@ -271,6 +284,8 @@ static struct rtl_hal_cfg rtl8723ae_hal_cfg = {
271 .maps[MAC_RCR_ACRC32] = ACRC32, 284 .maps[MAC_RCR_ACRC32] = ACRC32,
272 .maps[MAC_RCR_ACF] = ACF, 285 .maps[MAC_RCR_ACF] = ACF,
273 .maps[MAC_RCR_AAP] = AAP, 286 .maps[MAC_RCR_AAP] = AAP,
287 .maps[MAC_HIMR] = REG_HIMR,
288 .maps[MAC_HIMRE] = REG_HIMRE,
274 .maps[EFUSE_TEST] = REG_EFUSE_TEST, 289 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
275 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL, 290 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
276 .maps[EFUSE_CLK] = 0, 291 .maps[EFUSE_CLK] = 0,
@@ -328,62 +343,63 @@ static struct rtl_hal_cfg rtl8723ae_hal_cfg = {
328 .maps[RTL_IMR_VIDOK] = PHIMR_VIDOK, 343 .maps[RTL_IMR_VIDOK] = PHIMR_VIDOK,
329 .maps[RTL_IMR_VODOK] = PHIMR_VODOK, 344 .maps[RTL_IMR_VODOK] = PHIMR_VODOK,
330 .maps[RTL_IMR_ROK] = PHIMR_ROK, 345 .maps[RTL_IMR_ROK] = PHIMR_ROK,
331 .maps[RTL_IBSS_INT_MASKS] = (PHIMR_BCNDMAINT0 | 346 .maps[RTL_IBSS_INT_MASKS] =
332 PHIMR_TXBCNOK | PHIMR_TXBCNERR), 347 (PHIMR_BCNDMAINT0 | PHIMR_TXBCNOK | PHIMR_TXBCNERR),
333 .maps[RTL_IMR_C2HCMD] = PHIMR_C2HCMD, 348 .maps[RTL_IMR_C2HCMD] = PHIMR_C2HCMD,
334 349
335 350
336 .maps[RTL_RC_CCK_RATE1M] = DESC92_RATE1M, 351 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
337 .maps[RTL_RC_CCK_RATE2M] = DESC92_RATE2M, 352 .maps[RTL_RC_CCK_RATE2M] = DESC92C_RATE2M,
338 .maps[RTL_RC_CCK_RATE5_5M] = DESC92_RATE5_5M, 353 .maps[RTL_RC_CCK_RATE5_5M] = DESC92C_RATE5_5M,
339 .maps[RTL_RC_CCK_RATE11M] = DESC92_RATE11M, 354 .maps[RTL_RC_CCK_RATE11M] = DESC92C_RATE11M,
340 .maps[RTL_RC_OFDM_RATE6M] = DESC92_RATE6M, 355 .maps[RTL_RC_OFDM_RATE6M] = DESC92C_RATE6M,
341 .maps[RTL_RC_OFDM_RATE9M] = DESC92_RATE9M, 356 .maps[RTL_RC_OFDM_RATE9M] = DESC92C_RATE9M,
342 .maps[RTL_RC_OFDM_RATE12M] = DESC92_RATE12M, 357 .maps[RTL_RC_OFDM_RATE12M] = DESC92C_RATE12M,
343 .maps[RTL_RC_OFDM_RATE18M] = DESC92_RATE18M, 358 .maps[RTL_RC_OFDM_RATE18M] = DESC92C_RATE18M,
344 .maps[RTL_RC_OFDM_RATE24M] = DESC92_RATE24M, 359 .maps[RTL_RC_OFDM_RATE24M] = DESC92C_RATE24M,
345 .maps[RTL_RC_OFDM_RATE36M] = DESC92_RATE36M, 360 .maps[RTL_RC_OFDM_RATE36M] = DESC92C_RATE36M,
346 .maps[RTL_RC_OFDM_RATE48M] = DESC92_RATE48M, 361 .maps[RTL_RC_OFDM_RATE48M] = DESC92C_RATE48M,
347 .maps[RTL_RC_OFDM_RATE54M] = DESC92_RATE54M, 362 .maps[RTL_RC_OFDM_RATE54M] = DESC92C_RATE54M,
348 363
349 .maps[RTL_RC_HT_RATEMCS7] = DESC92_RATEMCS7, 364 .maps[RTL_RC_HT_RATEMCS7] = DESC92C_RATEMCS7,
350 .maps[RTL_RC_HT_RATEMCS15] = DESC92_RATEMCS15, 365 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
351}; 366};
352 367
353static struct pci_device_id rtl8723ae_pci_ids[] = { 368static struct pci_device_id rtl8723e_pci_ids[] = {
354 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8723, rtl8723ae_hal_cfg)}, 369 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8723, rtl8723e_hal_cfg)},
355 {}, 370 {},
356}; 371};
357 372
358MODULE_DEVICE_TABLE(pci, rtl8723ae_pci_ids); 373MODULE_DEVICE_TABLE(pci, rtl8723e_pci_ids);
359 374
360MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>"); 375MODULE_AUTHOR("lizhaoming <chaoming_li@realsil.com.cn>");
361MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); 376MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
362MODULE_AUTHOR("Larry Finger <Larry.Finger@lwfinger.net>");
363MODULE_LICENSE("GPL"); 377MODULE_LICENSE("GPL");
364MODULE_DESCRIPTION("Realtek 8723E 802.11n PCI wireless"); 378MODULE_DESCRIPTION("Realtek 8723E 802.11n PCI wireless");
365MODULE_FIRMWARE("rtlwifi/rtl8723fw.bin"); 379MODULE_FIRMWARE("rtlwifi/rtl8723efw.bin");
366MODULE_FIRMWARE("rtlwifi/rtl8723fw_B.bin"); 380
367 381module_param_named(swenc, rtl8723e_mod_params.sw_crypto, bool, 0444);
368module_param_named(swenc, rtl8723ae_mod_params.sw_crypto, bool, 0444); 382module_param_named(debug, rtl8723e_mod_params.debug, int, 0444);
369module_param_named(debug, rtl8723ae_mod_params.debug, int, 0444); 383module_param_named(ips, rtl8723e_mod_params.inactiveps, bool, 0444);
370module_param_named(ips, rtl8723ae_mod_params.inactiveps, bool, 0444); 384module_param_named(swlps, rtl8723e_mod_params.swctrl_lps, bool, 0444);
371module_param_named(swlps, rtl8723ae_mod_params.swctrl_lps, bool, 0444); 385module_param_named(fwlps, rtl8723e_mod_params.fwctrl_lps, bool, 0444);
372module_param_named(fwlps, rtl8723ae_mod_params.fwctrl_lps, bool, 0444); 386module_param_named(disable_watchdog, rtl8723e_mod_params.disable_watchdog,
387 bool, 0444);
373MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n"); 388MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
374MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n"); 389MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
375MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n"); 390MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
376MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n"); 391MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
377MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); 392MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
393MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
378 394
379static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); 395static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
380 396
381static struct pci_driver rtl8723ae_driver = { 397static struct pci_driver rtl8723e_driver = {
382 .name = KBUILD_MODNAME, 398 .name = KBUILD_MODNAME,
383 .id_table = rtl8723ae_pci_ids, 399 .id_table = rtl8723e_pci_ids,
384 .probe = rtl_pci_probe, 400 .probe = rtl_pci_probe,
385 .remove = rtl_pci_disconnect, 401 .remove = rtl_pci_disconnect,
386 .driver.pm = &rtlwifi_pm_ops, 402 .driver.pm = &rtlwifi_pm_ops,
387}; 403};
388 404
389module_pci_driver(rtl8723ae_driver); 405module_pci_driver(rtl8723e_driver);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/sw.h b/drivers/net/wireless/rtlwifi/rtl8723ae/sw.h
index fc4fde5e3eb5..46478780d262 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/sw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/sw.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,8 +26,10 @@
30#ifndef __RTL8723E_SW_H__ 26#ifndef __RTL8723E_SW_H__
31#define __RTL8723E_SW_H__ 27#define __RTL8723E_SW_H__
32 28
33int rtl8723ae_init_sw_vars(struct ieee80211_hw *hw); 29int rtl8723e_init_sw_vars(struct ieee80211_hw *hw);
34void rtl8723ae_deinit_sw_vars(struct ieee80211_hw *hw); 30void rtl8723e_deinit_sw_vars(struct ieee80211_hw *hw);
35void rtl8723ae_init_var_map(struct ieee80211_hw *hw); 31void rtl8723e_init_var_map(struct ieee80211_hw *hw);
32bool rtl8723e_get_btc_status(void);
33
36 34
37#endif 35#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/table.c b/drivers/net/wireless/rtlwifi/rtl8723ae/table.c
index 9b0b50cc4ade..61e86045f15c 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/table.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/table.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -335,7 +331,7 @@ u32 RTL8723EPHY_REG_ARRAY_PG[RTL8723E_PHY_REG_ARRAY_PGLENGTH] = {
335 0x868, 0xffffffff, 0x00000000, 331 0x868, 0xffffffff, 0x00000000,
336}; 332};
337 333
338u32 RTL8723E_RADIOA_1TARRAY[Rtl8723ERADIOA_1TARRAYLENGTH] = { 334u32 RTL8723E_RADIOA_1TARRAY[RTL8723ERADIOA_1TARRAYLENGTH] = {
339 0x000, 0x00030159, 335 0x000, 0x00030159,
340 0x001, 0x00031284, 336 0x001, 0x00031284,
341 0x002, 0x00098000, 337 0x002, 0x00098000,
@@ -479,12 +475,10 @@ u32 RTL8723E_RADIOA_1TARRAY[Rtl8723ERADIOA_1TARRAYLENGTH] = {
479 0x000, 0x00030159, 475 0x000, 0x00030159,
480}; 476};
481 477
482
483u32 RTL8723E_RADIOB_1TARRAY[RTL8723E_RADIOB_1TARRAYLENGTH] = { 478u32 RTL8723E_RADIOB_1TARRAY[RTL8723E_RADIOB_1TARRAYLENGTH] = {
484 0x0, 479 0x0,
485}; 480};
486 481
487
488u32 RTL8723EMAC_ARRAY[RTL8723E_MACARRAYLENGTH] = { 482u32 RTL8723EMAC_ARRAY[RTL8723E_MACARRAYLENGTH] = {
489 0x420, 0x00000080, 483 0x420, 0x00000080,
490 0x423, 0x00000000, 484 0x423, 0x00000000,
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/table.h b/drivers/net/wireless/rtlwifi/rtl8723ae/table.h
index f5ce71375c20..57a548ceba7d 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/table.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/table.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -38,8 +34,8 @@
38extern u32 RTL8723EPHY_REG_1TARRAY[RTL8723E_PHY_REG_1TARRAY_LENGTH]; 34extern u32 RTL8723EPHY_REG_1TARRAY[RTL8723E_PHY_REG_1TARRAY_LENGTH];
39#define RTL8723E_PHY_REG_ARRAY_PGLENGTH 336 35#define RTL8723E_PHY_REG_ARRAY_PGLENGTH 336
40extern u32 RTL8723EPHY_REG_ARRAY_PG[RTL8723E_PHY_REG_ARRAY_PGLENGTH]; 36extern u32 RTL8723EPHY_REG_ARRAY_PG[RTL8723E_PHY_REG_ARRAY_PGLENGTH];
41#define Rtl8723ERADIOA_1TARRAYLENGTH 282 37#define RTL8723ERADIOA_1TARRAYLENGTH 282
42extern u32 RTL8723E_RADIOA_1TARRAY[Rtl8723ERADIOA_1TARRAYLENGTH]; 38extern u32 RTL8723E_RADIOA_1TARRAY[RTL8723ERADIOA_1TARRAYLENGTH];
43#define RTL8723E_RADIOB_1TARRAYLENGTH 1 39#define RTL8723E_RADIOB_1TARRAYLENGTH 1
44extern u32 RTL8723E_RADIOB_1TARRAY[RTL8723E_RADIOB_1TARRAYLENGTH]; 40extern u32 RTL8723E_RADIOB_1TARRAY[RTL8723E_RADIOB_1TARRAYLENGTH];
45#define RTL8723E_MACARRAYLENGTH 172 41#define RTL8723E_MACARRAYLENGTH 172
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
index 10b7577b6ae5..d372ccaf3465 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -37,7 +33,7 @@
37#include "trx.h" 33#include "trx.h"
38#include "led.h" 34#include "led.h"
39 35
40static u8 _rtl8723ae_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue) 36static u8 _rtl8723e_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
41{ 37{
42 __le16 fc = rtl_get_fc(skb); 38 __le16 fc = rtl_get_fc(skb);
43 39
@@ -49,16 +45,174 @@ static u8 _rtl8723ae_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
49 return skb->priority; 45 return skb->priority;
50} 46}
51 47
52static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw, 48/* mac80211's rate_idx is like this:
53 struct rtl_stats *pstatus, u8 *pdesc, 49 *
54 struct rx_fwinfo_8723e *p_drvinfo, 50 * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
55 bool bpacket_match_bssid, 51 *
56 bool bpacket_toself, bool packet_beacon) 52 * B/G rate:
53 * (rx_status->flag & RX_FLAG_HT) = 0,
54 * DESC92C_RATE1M-->DESC92C_RATE54M ==> idx is 0-->11,
55 *
56 * N rate:
57 * (rx_status->flag & RX_FLAG_HT) = 1,
58 * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
59 *
60 * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
61 * A rate:
62 * (rx_status->flag & RX_FLAG_HT) = 0,
63 * DESC92C_RATE6M-->DESC92C_RATE54M ==> idx is 0-->7,
64 *
65 * N rate:
66 * (rx_status->flag & RX_FLAG_HT) = 1,
67 * DESC92C_RATEMCS0-->DESC92C_RATEMCS15 ==> idx is 0-->15
68 */
69static int _rtl8723e_rate_mapping(struct ieee80211_hw *hw,
70 bool isht, u8 desc_rate)
71{
72 int rate_idx;
73
74 if (!isht) {
75 if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
76 switch (desc_rate) {
77 case DESC92C_RATE1M:
78 rate_idx = 0;
79 break;
80 case DESC92C_RATE2M:
81 rate_idx = 1;
82 break;
83 case DESC92C_RATE5_5M:
84 rate_idx = 2;
85 break;
86 case DESC92C_RATE11M:
87 rate_idx = 3;
88 break;
89 case DESC92C_RATE6M:
90 rate_idx = 4;
91 break;
92 case DESC92C_RATE9M:
93 rate_idx = 5;
94 break;
95 case DESC92C_RATE12M:
96 rate_idx = 6;
97 break;
98 case DESC92C_RATE18M:
99 rate_idx = 7;
100 break;
101 case DESC92C_RATE24M:
102 rate_idx = 8;
103 break;
104 case DESC92C_RATE36M:
105 rate_idx = 9;
106 break;
107 case DESC92C_RATE48M:
108 rate_idx = 10;
109 break;
110 case DESC92C_RATE54M:
111 rate_idx = 11;
112 break;
113 default:
114 rate_idx = 0;
115 break;
116 }
117 } else {
118 switch (desc_rate) {
119 case DESC92C_RATE6M:
120 rate_idx = 0;
121 break;
122 case DESC92C_RATE9M:
123 rate_idx = 1;
124 break;
125 case DESC92C_RATE12M:
126 rate_idx = 2;
127 break;
128 case DESC92C_RATE18M:
129 rate_idx = 3;
130 break;
131 case DESC92C_RATE24M:
132 rate_idx = 4;
133 break;
134 case DESC92C_RATE36M:
135 rate_idx = 5;
136 break;
137 case DESC92C_RATE48M:
138 rate_idx = 6;
139 break;
140 case DESC92C_RATE54M:
141 rate_idx = 7;
142 break;
143 default:
144 rate_idx = 0;
145 break;
146 }
147 }
148 } else {
149 switch (desc_rate) {
150 case DESC92C_RATEMCS0:
151 rate_idx = 0;
152 break;
153 case DESC92C_RATEMCS1:
154 rate_idx = 1;
155 break;
156 case DESC92C_RATEMCS2:
157 rate_idx = 2;
158 break;
159 case DESC92C_RATEMCS3:
160 rate_idx = 3;
161 break;
162 case DESC92C_RATEMCS4:
163 rate_idx = 4;
164 break;
165 case DESC92C_RATEMCS5:
166 rate_idx = 5;
167 break;
168 case DESC92C_RATEMCS6:
169 rate_idx = 6;
170 break;
171 case DESC92C_RATEMCS7:
172 rate_idx = 7;
173 break;
174 case DESC92C_RATEMCS8:
175 rate_idx = 8;
176 break;
177 case DESC92C_RATEMCS9:
178 rate_idx = 9;
179 break;
180 case DESC92C_RATEMCS10:
181 rate_idx = 10;
182 break;
183 case DESC92C_RATEMCS11:
184 rate_idx = 11;
185 break;
186 case DESC92C_RATEMCS12:
187 rate_idx = 12;
188 break;
189 case DESC92C_RATEMCS13:
190 rate_idx = 13;
191 break;
192 case DESC92C_RATEMCS14:
193 rate_idx = 14;
194 break;
195 case DESC92C_RATEMCS15:
196 rate_idx = 15;
197 break;
198 default:
199 rate_idx = 0;
200 break;
201 }
202 }
203 return rate_idx;
204}
205
206static void _rtl8723e_query_rxphystatus(struct ieee80211_hw *hw,
207 struct rtl_stats *pstatus, u8 *pdesc,
208 struct rx_fwinfo_8723e *p_drvinfo,
209 bool bpacket_match_bssid,
210 bool bpacket_toself, bool packet_beacon)
57{ 211{
58 struct rtl_priv *rtlpriv = rtl_priv(hw); 212 struct rtl_priv *rtlpriv = rtl_priv(hw);
59 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv); 213 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
60 struct phy_sts_cck_8723e_t *cck_buf; 214 struct phy_sts_cck_8723e_t *cck_buf;
61 s8 rx_pwr_all, rx_pwr[4]; 215 s8 rx_pwr_all = 0, rx_pwr[4];
62 u8 rf_rx_num = 0, evm, pwdb_all; 216 u8 rf_rx_num = 0, evm, pwdb_all;
63 u8 i, max_spatial_stream; 217 u8 i, max_spatial_stream;
64 u32 rssi, total_rssi = 0; 218 u32 rssi, total_rssi = 0;
@@ -68,8 +222,8 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
68 pstatus->packet_matchbssid = bpacket_match_bssid; 222 pstatus->packet_matchbssid = bpacket_match_bssid;
69 pstatus->packet_toself = bpacket_toself; 223 pstatus->packet_toself = bpacket_toself;
70 pstatus->packet_beacon = packet_beacon; 224 pstatus->packet_beacon = packet_beacon;
71 pstatus->rx_mimo_sig_qual[0] = -1; 225 pstatus->rx_mimo_signalquality[0] = -1;
72 pstatus->rx_mimo_sig_qual[1] = -1; 226 pstatus->rx_mimo_signalquality[1] = -1;
73 227
74 if (is_cck) { 228 if (is_cck) {
75 u8 report, cck_highpwr; 229 u8 report, cck_highpwr;
@@ -77,14 +231,14 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
77 /* CCK Driver info Structure is not the same as OFDM packet. */ 231 /* CCK Driver info Structure is not the same as OFDM packet. */
78 cck_buf = (struct phy_sts_cck_8723e_t *)p_drvinfo; 232 cck_buf = (struct phy_sts_cck_8723e_t *)p_drvinfo;
79 233
80 /* (1)Hardware does not provide RSSI for CCK 234 /* (1)Hardware does not provide RSSI for CCK */
81 * (2)PWDB, Average PWDB cacluated by 235 /* (2)PWDB, Average PWDB cacluated by
82 * hardware (for rate adaptive) 236 * hardware (for rate adaptive)
83 */ 237 */
84 if (ppsc->rfpwr_state == ERFON) 238 if (ppsc->rfpwr_state == ERFON)
85 cck_highpwr = (u8) rtl_get_bbreg(hw, 239 cck_highpwr = (u8)rtl_get_bbreg(hw,
86 RFPGA0_XA_HSSIPARAMETER2, 240 RFPGA0_XA_HSSIPARAMETER2,
87 BIT(9)); 241 BIT(9));
88 else 242 else
89 cck_highpwr = false; 243 cck_highpwr = false;
90 244
@@ -127,8 +281,9 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
127 } 281 }
128 282
129 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all); 283 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
130 /* CCK gain is smaller than OFDM/MCS gain, 284 /* CCK gain is smaller than OFDM/MCS gain, */
131 * so we add gain diff. From experience, the val is 6 285 /* so we add gain diff by experiences,
286 * the val is 6
132 */ 287 */
133 pwdb_all += 6; 288 pwdb_all += 6;
134 if (pwdb_all > 100) 289 if (pwdb_all > 100)
@@ -152,9 +307,9 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
152 if (bpacket_match_bssid) { 307 if (bpacket_match_bssid) {
153 u8 sq; 308 u8 sq;
154 309
155 if (pstatus->rx_pwdb_all > 40) { 310 if (pstatus->rx_pwdb_all > 40)
156 sq = 100; 311 sq = 100;
157 } else { 312 else {
158 sq = cck_buf->sq_rpt; 313 sq = cck_buf->sq_rpt;
159 if (sq > 64) 314 if (sq > 64)
160 sq = 0; 315 sq = 0;
@@ -165,8 +320,8 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
165 } 320 }
166 321
167 pstatus->signalquality = sq; 322 pstatus->signalquality = sq;
168 pstatus->rx_mimo_sig_qual[0] = sq; 323 pstatus->rx_mimo_signalquality[0] = sq;
169 pstatus->rx_mimo_sig_qual[1] = -1; 324 pstatus->rx_mimo_signalquality[1] = -1;
170 } 325 }
171 } else { 326 } else {
172 rtlpriv->dm.rfpath_rxenable[0] = 327 rtlpriv->dm.rfpath_rxenable[0] =
@@ -179,18 +334,20 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
179 if (rtlpriv->dm.rfpath_rxenable[i]) 334 if (rtlpriv->dm.rfpath_rxenable[i])
180 rf_rx_num++; 335 rf_rx_num++;
181 336
182 rx_pwr[i] = ((p_drvinfo->gain_trsw[i] & 0x3f)*2) - 110; 337 rx_pwr[i] = ((p_drvinfo->gain_trsw[i] &
338 0x3f) * 2) - 110;
183 339
184 /* Translate DBM to percentage. */ 340 /* Translate DBM to percentage. */
185 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]); 341 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
186 total_rssi += rssi; 342 total_rssi += rssi;
187 343
188 /* Get Rx snr value in DB */ 344 /* Get Rx snr value in DB */
189 rtlpriv->stats.rx_snr_db[i] = (p_drvinfo->rxsnr[i] / 2); 345 rtlpriv->stats.rx_snr_db[i] =
346 (long)(p_drvinfo->rxsnr[i] / 2);
190 347
191 /* Record Signal Strength for next packet */ 348 /* Record Signal Strength for next packet */
192 if (bpacket_match_bssid) 349 if (bpacket_match_bssid)
193 pstatus->rx_mimo_signalstrength[i] = (u8) rssi; 350 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
194 } 351 }
195 352
196 /* (2)PWDB, Average PWDB cacluated by 353 /* (2)PWDB, Average PWDB cacluated by
@@ -204,8 +361,8 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
204 pstatus->recvsignalpower = rx_pwr_all; 361 pstatus->recvsignalpower = rx_pwr_all;
205 362
206 /* (3)EVM of HT rate */ 363 /* (3)EVM of HT rate */
207 if (pstatus->is_ht && pstatus->rate >= DESC92_RATEMCS8 && 364 if (pstatus->is_ht && pstatus->rate >= DESC92C_RATEMCS8 &&
208 pstatus->rate <= DESC92_RATEMCS15) 365 pstatus->rate <= DESC92C_RATEMCS15)
209 max_spatial_stream = 2; 366 max_spatial_stream = 2;
210 else 367 else
211 max_spatial_stream = 1; 368 max_spatial_stream = 1;
@@ -218,8 +375,10 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
218 * spatial stream only 375 * spatial stream only
219 */ 376 */
220 if (i == 0) 377 if (i == 0)
221 pstatus->signalquality = (evm & 0xff); 378 pstatus->signalquality =
222 pstatus->rx_mimo_sig_qual[i] = (evm & 0xff); 379 (u8)(evm & 0xff);
380 pstatus->rx_mimo_signalquality[i] =
381 (u8)(evm & 0xff);
223 } 382 }
224 } 383 }
225 } 384 }
@@ -235,78 +394,83 @@ static void _rtl8723ae_query_rxphystatus(struct ieee80211_hw *hw,
235 total_rssi /= rf_rx_num)); 394 total_rssi /= rf_rx_num));
236} 395}
237 396
238static void _rtl8723ae_translate_rx_signal_stuff(struct ieee80211_hw *hw, 397static void translate_rx_signal_stuff(struct ieee80211_hw *hw,
239 struct sk_buff *skb, struct rtl_stats *pstatus, 398 struct sk_buff *skb,
240 u8 *pdesc, struct rx_fwinfo_8723e *p_drvinfo) 399 struct rtl_stats *pstatus, u8 *pdesc,
400 struct rx_fwinfo_8723e *p_drvinfo)
241{ 401{
242 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 402 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
243 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 403 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
244 struct ieee80211_hdr *hdr; 404 struct ieee80211_hdr *hdr;
245 u8 *tmp_buf; 405 u8 *tmp_buf;
246 u8 *praddr; 406 u8 *praddr;
247 __le16 fc; 407 /*u8 *psaddr;*/
248 u16 type; 408 u16 fc, type;
249 bool packet_matchbssid, packet_toself, packet_beacon = false; 409 bool packet_matchbssid, packet_toself, packet_beacon;
250 410
251 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift; 411 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
252 412
253 hdr = (struct ieee80211_hdr *)tmp_buf; 413 hdr = (struct ieee80211_hdr *)tmp_buf;
254 fc = hdr->frame_control; 414 fc = le16_to_cpu(hdr->frame_control);
255 type = WLAN_FC_GET_TYPE(fc); 415 type = WLAN_FC_GET_TYPE(hdr->frame_control);
256 praddr = hdr->addr1; 416 praddr = hdr->addr1;
257 417
258 packet_matchbssid = 418 packet_matchbssid = ((IEEE80211_FTYPE_CTL != type) &&
259 ((IEEE80211_FTYPE_CTL != type) && 419 (ether_addr_equal(mac->bssid, (fc & IEEE80211_FCTL_TODS) ?
260 ether_addr_equal(mac->bssid, 420 hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS) ?
261 (le16_to_cpu(fc) & IEEE80211_FCTL_TODS) ? hdr->addr1 : 421 hdr->addr2 : hdr->addr3)) &&
262 (le16_to_cpu(fc) & IEEE80211_FCTL_FROMDS) ? hdr->addr2 : 422 (!pstatus->hwerror) &&
263 hdr->addr3) && 423 (!pstatus->crc) && (!pstatus->icv));
264 (!pstatus->hwerror) && (!pstatus->crc) && (!pstatus->icv));
265 424
266 packet_toself = (packet_matchbssid && 425 packet_toself = packet_matchbssid &&
267 ether_addr_equal(praddr, rtlefuse->dev_addr)); 426 (ether_addr_equal(praddr, rtlefuse->dev_addr));
268 427
269 if (ieee80211_is_beacon(fc)) 428 if (ieee80211_is_beacon(hdr->frame_control))
270 packet_beacon = true; 429 packet_beacon = true;
430 else
431 packet_beacon = false;
271 432
272 _rtl8723ae_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo, 433 _rtl8723e_query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
273 packet_matchbssid, packet_toself, 434 packet_matchbssid, packet_toself,
274 packet_beacon); 435 packet_beacon);
275 436
276 rtl_process_phyinfo(hw, tmp_buf, pstatus); 437 rtl_process_phyinfo(hw, tmp_buf, pstatus);
277} 438}
278 439
279bool rtl8723ae_rx_query_desc(struct ieee80211_hw *hw, 440bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
280 struct rtl_stats *status, 441 struct rtl_stats *status,
281 struct ieee80211_rx_status *rx_status, 442 struct ieee80211_rx_status *rx_status,
282 u8 *pdesc, struct sk_buff *skb) 443 u8 *pdesc, struct sk_buff *skb)
283{ 444{
284 struct rx_fwinfo_8723e *p_drvinfo; 445 struct rx_fwinfo_8723e *p_drvinfo;
285 struct ieee80211_hdr *hdr; 446 struct ieee80211_hdr *hdr;
286 u32 phystatus = GET_RX_DESC_PHYST(pdesc); 447 u32 phystatus = GET_RX_DESC_PHYST(pdesc);
287 448
288 status->length = (u16) GET_RX_DESC_PKT_LEN(pdesc); 449 status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
289 status->rx_drvinfo_size = (u8) GET_RX_DESC_DRV_INFO_SIZE(pdesc) * 450 status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
290 RX_DRV_INFO_SIZE_UNIT; 451 RX_DRV_INFO_SIZE_UNIT;
291 status->rx_bufshift = (u8) (GET_RX_DESC_SHIFT(pdesc) & 0x03); 452 status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
292 status->icv = (u16) GET_RX_DESC_ICV(pdesc); 453 status->icv = (u16)GET_RX_DESC_ICV(pdesc);
293 status->crc = (u16) GET_RX_DESC_CRC32(pdesc); 454 status->crc = (u16)GET_RX_DESC_CRC32(pdesc);
294 status->hwerror = (status->crc | status->icv); 455 status->hwerror = (status->crc | status->icv);
295 status->decrypted = !GET_RX_DESC_SWDEC(pdesc); 456 status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
296 status->rate = (u8) GET_RX_DESC_RXMCS(pdesc); 457 status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
297 status->shortpreamble = (u16) GET_RX_DESC_SPLCP(pdesc); 458 status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc);
298 status->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1); 459 status->isampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
299 status->isfirst_ampdu = (bool) ((GET_RX_DESC_PAGGR(pdesc) == 1) 460 status->isfirst_ampdu = (bool)((GET_RX_DESC_PAGGR(pdesc) == 1) &&
300 && (GET_RX_DESC_FAGGR(pdesc) == 1)); 461 (GET_RX_DESC_FAGGR(pdesc) == 1));
301 status->timestamp_low = GET_RX_DESC_TSFL(pdesc); 462 status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
302 status->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc); 463 status->rx_is40Mhzpacket = (bool)GET_RX_DESC_BW(pdesc);
303 status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc); 464 status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
304 465
305 status->is_cck = RTL8723E_RX_HAL_IS_CCK_RATE(status->rate); 466 status->is_cck = RX_HAL_IS_CCK_RATE(status->rate);
306 467
307 rx_status->freq = hw->conf.chandef.chan->center_freq; 468 rx_status->freq = hw->conf.chandef.chan->center_freq;
308 rx_status->band = hw->conf.chandef.chan->band; 469 rx_status->band = hw->conf.chandef.chan->band;
309 470
471 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size
472 + status->rx_bufshift);
473
310 if (status->crc) 474 if (status->crc)
311 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; 475 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
312 476
@@ -320,69 +484,62 @@ bool rtl8723ae_rx_query_desc(struct ieee80211_hw *hw,
320 484
321 /* hw will set status->decrypted true, if it finds the 485 /* hw will set status->decrypted true, if it finds the
322 * frame is open data frame or mgmt frame. 486 * frame is open data frame or mgmt frame.
323 * Thus hw will not decrypt a robust managment frame 487 * So hw will not decryption robust managment frame
324 * for IEEE80211w but still set status->decrypted 488 * for IEEE80211w but still set status->decrypted
325 * true, so here we should set it back to undecrypted 489 * true, so here we should set it back to undecrypted
326 * for IEEE80211w frame, and mac80211 sw will help 490 * for IEEE80211w frame, and mac80211 sw will help
327 * to decrypt it 491 * to decrypt it
328 */ 492 */
329 if (status->decrypted) { 493 if (status->decrypted) {
330 hdr = (struct ieee80211_hdr *)(skb->data + 494 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
331 status->rx_drvinfo_size + status->rx_bufshift); 495 (ieee80211_has_protected(hdr->frame_control)))
332
333 if (!hdr) {
334 /* during testing, hdr could be NULL here */
335 return false;
336 }
337 if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
338 (ieee80211_has_protected(hdr->frame_control)))
339 rx_status->flag &= ~RX_FLAG_DECRYPTED;
340 else
341 rx_status->flag |= RX_FLAG_DECRYPTED; 496 rx_status->flag |= RX_FLAG_DECRYPTED;
497 else
498 rx_status->flag &= ~RX_FLAG_DECRYPTED;
342 } 499 }
343 500
344 /* rate_idx: index of data rate into band's 501 /* rate_idx: index of data rate into band's
345 * supported rates or MCS index if HT rates 502 * supported rates or MCS index if HT rates
346 * are use (RX_FLAG_HT) 503 * are use (RX_FLAG_HT)
504 * Notice: this is diff with windows define
347 */ 505 */
348 rx_status->rate_idx = rtlwifi_rate_mapping(hw, status->is_ht, 506 rx_status->rate_idx = _rtl8723e_rate_mapping(hw,
349 status->rate, false); 507 status->is_ht, status->rate);
350 508
351 rx_status->mactime = status->timestamp_low; 509 rx_status->mactime = status->timestamp_low;
352 if (phystatus == true) { 510 if (phystatus == true) {
353 p_drvinfo = (struct rx_fwinfo_8723e *)(skb->data + 511 p_drvinfo = (struct rx_fwinfo_8723e *)(skb->data +
354 status->rx_bufshift); 512 status->rx_bufshift);
355 513
356 _rtl8723ae_translate_rx_signal_stuff(hw, 514 translate_rx_signal_stuff(hw, skb, status, pdesc, p_drvinfo);
357 skb, status, pdesc, p_drvinfo);
358 } 515 }
359
360 /*rx_status->qual = status->signal; */
361 rx_status->signal = status->recvsignalpower + 10; 516 rx_status->signal = status->recvsignalpower + 10;
362
363 return true; 517 return true;
364} 518}
365 519
366void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw, 520void rtl8723e_tx_fill_desc(struct ieee80211_hw *hw,
367 struct ieee80211_hdr *hdr, u8 *pdesc_tx, 521 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
368 u8 *pbd_desc_tx, struct ieee80211_tx_info *info, 522 u8 *txbd, struct ieee80211_tx_info *info,
369 struct ieee80211_sta *sta, 523 struct ieee80211_sta *sta,
370 struct sk_buff *skb, u8 hw_queue, 524 struct sk_buff *skb,
371 struct rtl_tcb_desc *ptcdesc) 525 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
372{ 526{
373 struct rtl_priv *rtlpriv = rtl_priv(hw); 527 struct rtl_priv *rtlpriv = rtl_priv(hw);
374 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 528 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
375 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 529 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
376 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 530 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
377 bool defaultadapter = true; 531 bool b_defaultadapter = true;
378 u8 *pdesc = pdesc_tx; 532 /* bool b_trigger_ac = false; */
533 u8 *pdesc = (u8 *)pdesc_tx;
379 u16 seq_number; 534 u16 seq_number;
380 __le16 fc = hdr->frame_control; 535 __le16 fc = hdr->frame_control;
381 u8 fw_qsel = _rtl8723ae_map_hwqueue_to_fwqueue(skb, hw_queue); 536 u8 fw_qsel = _rtl8723e_map_hwqueue_to_fwqueue(skb, hw_queue);
382 bool firstseg = ((hdr->seq_ctrl & 537 bool firstseg = ((hdr->seq_ctrl &
383 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0); 538 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
539
384 bool lastseg = ((hdr->frame_control & 540 bool lastseg = ((hdr->frame_control &
385 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0); 541 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
542
386 dma_addr_t mapping = pci_map_single(rtlpci->pdev, 543 dma_addr_t mapping = pci_map_single(rtlpci->pdev,
387 skb->data, skb->len, 544 skb->data, skb->len,
388 PCI_DMA_TODEVICE); 545 PCI_DMA_TODEVICE);
@@ -398,12 +555,13 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
398 } else if (mac->opmode == NL80211_IFTYPE_AP || 555 } else if (mac->opmode == NL80211_IFTYPE_AP ||
399 mac->opmode == NL80211_IFTYPE_ADHOC) { 556 mac->opmode == NL80211_IFTYPE_ADHOC) {
400 if (sta) 557 if (sta)
401 bw_40 = sta->bandwidth >= IEEE80211_STA_RX_BW_40; 558 bw_40 = sta->ht_cap.cap &
559 IEEE80211_HT_CAP_SUP_WIDTH_20_40;
402 } 560 }
403 561
404 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4; 562 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
405 563
406 rtl_get_tcb_desc(hw, info, sta, skb, ptcdesc); 564 rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
407 565
408 CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_8723e)); 566 CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_8723e));
409 567
@@ -415,9 +573,9 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
415 if (firstseg) { 573 if (firstseg) {
416 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); 574 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
417 575
418 SET_TX_DESC_TX_RATE(pdesc, ptcdesc->hw_rate); 576 SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
419 577
420 if (ptcdesc->use_shortgi || ptcdesc->use_shortpreamble) 578 if (ptcb_desc->use_shortgi || ptcb_desc->use_shortpreamble)
421 SET_TX_DESC_DATA_SHORTGI(pdesc, 1); 579 SET_TX_DESC_DATA_SHORTGI(pdesc, 1);
422 580
423 if (info->flags & IEEE80211_TX_CTL_AMPDU) { 581 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
@@ -426,31 +584,33 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
426 } 584 }
427 SET_TX_DESC_SEQ(pdesc, seq_number); 585 SET_TX_DESC_SEQ(pdesc, seq_number);
428 586
429 SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcdesc->rts_enable && 587 SET_TX_DESC_RTS_ENABLE(pdesc,
430 !ptcdesc-> 588 ((ptcb_desc->rts_enable &&
431 cts_enable) ? 1 : 0)); 589 !ptcb_desc->cts_enable) ? 1 : 0));
432 SET_TX_DESC_HW_RTS_ENABLE(pdesc, 590 SET_TX_DESC_HW_RTS_ENABLE(pdesc,
433 ((ptcdesc->rts_enable 591 ((ptcb_desc->rts_enable ||
434 || ptcdesc->cts_enable) ? 1 : 0)); 592 ptcb_desc->cts_enable) ? 1 : 0));
435 SET_TX_DESC_CTS2SELF(pdesc, ((ptcdesc->cts_enable) ? 1 : 0)); 593 SET_TX_DESC_CTS2SELF(pdesc,
436 SET_TX_DESC_RTS_STBC(pdesc, ((ptcdesc->rts_stbc) ? 1 : 0)); 594 ((ptcb_desc->cts_enable) ? 1 : 0));
437 595 SET_TX_DESC_RTS_STBC(pdesc,
438 SET_TX_DESC_RTS_RATE(pdesc, ptcdesc->rts_rate); 596 ((ptcb_desc->rts_stbc) ? 1 : 0));
597
598 SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
439 SET_TX_DESC_RTS_BW(pdesc, 0); 599 SET_TX_DESC_RTS_BW(pdesc, 0);
440 SET_TX_DESC_RTS_SC(pdesc, ptcdesc->rts_sc); 600 SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
441 SET_TX_DESC_RTS_SHORT(pdesc, 601 SET_TX_DESC_RTS_SHORT(pdesc,
442 ((ptcdesc->rts_rate <= DESC92_RATE54M) ? 602 ((ptcb_desc->rts_rate <= DESC92C_RATE54M) ?
443 (ptcdesc->rts_use_shortpreamble ? 1 : 0) 603 (ptcb_desc->rts_use_shortpreamble ? 1 : 0)
444 : (ptcdesc->rts_use_shortgi ? 1 : 0))); 604 : (ptcb_desc->rts_use_shortgi ? 1 : 0)));
445 605
446 if (bw_40) { 606 if (bw_40) {
447 if (ptcdesc->packet_bw) { 607 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
448 SET_TX_DESC_DATA_BW(pdesc, 1); 608 SET_TX_DESC_DATA_BW(pdesc, 1);
449 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3); 609 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
450 } else { 610 } else {
451 SET_TX_DESC_DATA_BW(pdesc, 0); 611 SET_TX_DESC_DATA_BW(pdesc, 0);
452 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 612 SET_TX_DESC_TX_SUB_CARRIER(pdesc,
453 mac->cur_40_prime_sc); 613 mac->cur_40_prime_sc);
454 } 614 }
455 } else { 615 } else {
456 SET_TX_DESC_DATA_BW(pdesc, 0); 616 SET_TX_DESC_DATA_BW(pdesc, 0);
@@ -481,6 +641,7 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
481 default: 641 default:
482 SET_TX_DESC_SEC_TYPE(pdesc, 0x0); 642 SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
483 break; 643 break;
644
484 } 645 }
485 } 646 }
486 647
@@ -490,7 +651,7 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
490 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F); 651 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
491 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF); 652 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
492 SET_TX_DESC_DISABLE_FB(pdesc, 0); 653 SET_TX_DESC_DISABLE_FB(pdesc, 0);
493 SET_TX_DESC_USE_RATE(pdesc, ptcdesc->use_driver_rate ? 1 : 0); 654 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
494 655
495 if (ieee80211_is_data_qos(fc)) { 656 if (ieee80211_is_data_qos(fc)) {
496 if (mac->rdg_en) { 657 if (mac->rdg_en) {
@@ -510,18 +671,21 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
510 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping); 671 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
511 672
512 if (rtlpriv->dm.useramask) { 673 if (rtlpriv->dm.useramask) {
513 SET_TX_DESC_RATE_ID(pdesc, ptcdesc->ratr_index); 674 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
514 SET_TX_DESC_MACID(pdesc, ptcdesc->mac_id); 675 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
515 } else { 676 } else {
516 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcdesc->ratr_index); 677 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
517 SET_TX_DESC_MACID(pdesc, ptcdesc->ratr_index); 678 SET_TX_DESC_MACID(pdesc, ptcb_desc->ratr_index);
518 } 679 }
519 680
520 if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) { 681 if ((!ieee80211_is_data_qos(fc)) && ppsc->fwctrl_lps) {
521 SET_TX_DESC_HWSEQ_EN_8723(pdesc, 1); 682 SET_TX_DESC_HWSEQ_EN_8723(pdesc, 1);
683 /* SET_TX_DESC_HWSEQ_EN(pdesc, 1); */
684 /* SET_TX_DESC_PKT_ID(pdesc, 8); */
522 685
523 if (!defaultadapter) 686 if (!b_defaultadapter)
524 SET_TX_DESC_HWSEQ_SEL_8723(pdesc, 1); 687 SET_TX_DESC_HWSEQ_SEL_8723(pdesc, 1);
688 /* SET_TX_DESC_QOS(pdesc, 1); */
525 } 689 }
526 690
527 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1)); 691 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
@@ -534,17 +698,19 @@ void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw,
534 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n"); 698 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
535} 699}
536 700
537void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw, 701void rtl8723e_tx_fill_cmddesc(struct ieee80211_hw *hw,
538 u8 *pdesc, bool firstseg, 702 u8 *pdesc, bool firstseg,
539 bool lastseg, struct sk_buff *skb) 703 bool lastseg, struct sk_buff *skb)
540{ 704{
541 struct rtl_priv *rtlpriv = rtl_priv(hw); 705 struct rtl_priv *rtlpriv = rtl_priv(hw);
542 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 706 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
543 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
544 u8 fw_queue = QSLT_BEACON; 707 u8 fw_queue = QSLT_BEACON;
708
545 dma_addr_t mapping = pci_map_single(rtlpci->pdev, 709 dma_addr_t mapping = pci_map_single(rtlpci->pdev,
546 skb->data, skb->len, 710 skb->data, skb->len,
547 PCI_DMA_TODEVICE); 711 PCI_DMA_TODEVICE);
712
713 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
548 __le16 fc = hdr->frame_control; 714 __le16 fc = hdr->frame_control;
549 715
550 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) { 716 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
@@ -557,7 +723,7 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
557 if (firstseg) 723 if (firstseg)
558 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN); 724 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
559 725
560 SET_TX_DESC_TX_RATE(pdesc, DESC92_RATE1M); 726 SET_TX_DESC_TX_RATE(pdesc, DESC92C_RATE1M);
561 727
562 SET_TX_DESC_SEQ(pdesc, 0); 728 SET_TX_DESC_SEQ(pdesc, 0);
563 729
@@ -577,7 +743,7 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
577 743
578 SET_TX_DESC_OWN(pdesc, 1); 744 SET_TX_DESC_OWN(pdesc, 1);
579 745
580 SET_TX_DESC_PKT_SIZE(pdesc, (u16) (skb->len)); 746 SET_TX_DESC_PKT_SIZE((u8 *)pdesc, (u16)(skb->len));
581 747
582 SET_TX_DESC_FIRST_SEG(pdesc, 1); 748 SET_TX_DESC_FIRST_SEG(pdesc, 1);
583 SET_TX_DESC_LAST_SEG(pdesc, 1); 749 SET_TX_DESC_LAST_SEG(pdesc, 1);
@@ -597,8 +763,8 @@ void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
597 pdesc, TX_DESC_SIZE); 763 pdesc, TX_DESC_SIZE);
598} 764}
599 765
600void rtl8723ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, 766void rtl8723e_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
601 u8 desc_name, u8 *val) 767 bool istx, u8 desc_name, u8 *val)
602{ 768{
603 if (istx == true) { 769 if (istx == true) {
604 switch (desc_name) { 770 switch (desc_name) {
@@ -635,7 +801,7 @@ void rtl8723ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
635 } 801 }
636} 802}
637 803
638u32 rtl8723ae_get_desc(u8 *pdesc, bool istx, u8 desc_name) 804u32 rtl8723e_get_desc(u8 *pdesc, bool istx, u8 desc_name)
639{ 805{
640 u32 ret = 0; 806 u32 ret = 0;
641 807
@@ -660,6 +826,9 @@ u32 rtl8723ae_get_desc(u8 *pdesc, bool istx, u8 desc_name)
660 case HW_DESC_RXPKT_LEN: 826 case HW_DESC_RXPKT_LEN:
661 ret = GET_RX_DESC_PKT_LEN(pdesc); 827 ret = GET_RX_DESC_PKT_LEN(pdesc);
662 break; 828 break;
829 case HW_DESC_RXBUFF_ADDR:
830 ret = GET_RX_DESC_BUFF_ADDR(pdesc);
831 break;
663 default: 832 default:
664 RT_ASSERT(false, "ERR rxdesc :%d not process\n", 833 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
665 desc_name); 834 desc_name);
@@ -669,7 +838,25 @@ u32 rtl8723ae_get_desc(u8 *pdesc, bool istx, u8 desc_name)
669 return ret; 838 return ret;
670} 839}
671 840
672void rtl8723ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) 841bool rtl8723e_is_tx_desc_closed(struct ieee80211_hw *hw,
842 u8 hw_queue, u16 index)
843{
844 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
845 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
846 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
847 u8 own = (u8)rtl8723e_get_desc(entry, true, HW_DESC_OWN);
848
849 /**
850 *beacon packet will only use the first
851 *descriptor defautly,and the own may not
852 *be cleared by the hardware
853 */
854 if (own)
855 return false;
856 return true;
857}
858
859void rtl8723e_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
673{ 860{
674 struct rtl_priv *rtlpriv = rtl_priv(hw); 861 struct rtl_priv *rtlpriv = rtl_priv(hw);
675 if (hw_queue == BEACON_QUEUE) { 862 if (hw_queue == BEACON_QUEUE) {
@@ -679,3 +866,10 @@ void rtl8723ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
679 BIT(0) << (hw_queue)); 866 BIT(0) << (hw_queue));
680 } 867 }
681} 868}
869
870u32 rtl8723e_rx_command_packet(struct ieee80211_hw *hw,
871 struct rtl_stats status,
872 struct sk_buff *skb)
873{
874 return 0;
875}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.h b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.h
index 4380b7d3a91a..017da7e194d8 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723ae/trx.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723ae/trx.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -30,77 +26,77 @@
30#ifndef __RTL8723E_TRX_H__ 26#ifndef __RTL8723E_TRX_H__
31#define __RTL8723E_TRX_H__ 27#define __RTL8723E_TRX_H__
32 28
33#define TX_DESC_SIZE 64 29#define TX_DESC_SIZE 64
34#define TX_DESC_AGGR_SUBFRAME_SIZE 32 30#define TX_DESC_AGGR_SUBFRAME_SIZE 32
35 31
36#define RX_DESC_SIZE 32 32#define RX_DESC_SIZE 32
37#define RX_DRV_INFO_SIZE_UNIT 8 33#define RX_DRV_INFO_SIZE_UNIT 8
38 34
39#define TX_DESC_NEXT_DESC_OFFSET 40 35#define TX_DESC_NEXT_DESC_OFFSET 40
40#define USB_HWDESC_HEADER_LEN 32 36#define USB_HWDESC_HEADER_LEN 32
41#define CRCLENGTH 4 37#define CRCLENGTH 4
42 38
43#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \ 39#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \
44 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 16, __val) 40 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 16, __val)
45#define SET_TX_DESC_OFFSET(__pdesc, __val) \ 41#define SET_TX_DESC_OFFSET(__pdesc, __val) \
46 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 8, __val) 42 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 8, __val)
47#define SET_TX_DESC_BMC(__pdesc, __val) \ 43#define SET_TX_DESC_BMC(__pdesc, __val) \
48 SET_BITS_TO_LE_4BYTE(__pdesc, 24, 1, __val) 44 SET_BITS_TO_LE_4BYTE(__pdesc, 24, 1, __val)
49#define SET_TX_DESC_HTC(__pdesc, __val) \ 45#define SET_TX_DESC_HTC(__pdesc, __val) \
50 SET_BITS_TO_LE_4BYTE(__pdesc, 25, 1, __val) 46 SET_BITS_TO_LE_4BYTE(__pdesc, 25, 1, __val)
51#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \ 47#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \
52 SET_BITS_TO_LE_4BYTE(__pdesc, 26, 1, __val) 48 SET_BITS_TO_LE_4BYTE(__pdesc, 26, 1, __val)
53#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \ 49#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \
54 SET_BITS_TO_LE_4BYTE(__pdesc, 27, 1, __val) 50 SET_BITS_TO_LE_4BYTE(__pdesc, 27, 1, __val)
55#define SET_TX_DESC_LINIP(__pdesc, __val) \ 51#define SET_TX_DESC_LINIP(__pdesc, __val) \
56 SET_BITS_TO_LE_4BYTE(__pdesc, 28, 1, __val) 52 SET_BITS_TO_LE_4BYTE(__pdesc, 28, 1, __val)
57#define SET_TX_DESC_NO_ACM(__pdesc, __val) \ 53#define SET_TX_DESC_NO_ACM(__pdesc, __val) \
58 SET_BITS_TO_LE_4BYTE(__pdesc, 29, 1, __val) 54 SET_BITS_TO_LE_4BYTE(__pdesc, 29, 1, __val)
59#define SET_TX_DESC_GF(__pdesc, __val) \ 55#define SET_TX_DESC_GF(__pdesc, __val) \
60 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val) 56 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
61#define SET_TX_DESC_OWN(__pdesc, __val) \ 57#define SET_TX_DESC_OWN(__pdesc, __val) \
62 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val) 58 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
63 59
64#define GET_TX_DESC_PKT_SIZE(__pdesc) \ 60#define GET_TX_DESC_PKT_SIZE(__pdesc) \
65 LE_BITS_TO_4BYTE(__pdesc, 0, 16) 61 LE_BITS_TO_4BYTE(__pdesc, 0, 16)
66#define GET_TX_DESC_OFFSET(__pdesc) \ 62#define GET_TX_DESC_OFFSET(__pdesc) \
67 LE_BITS_TO_4BYTE(__pdesc, 16, 8) 63 LE_BITS_TO_4BYTE(__pdesc, 16, 8)
68#define GET_TX_DESC_BMC(__pdesc) \ 64#define GET_TX_DESC_BMC(__pdesc) \
69 LE_BITS_TO_4BYTE(__pdesc, 24, 1) 65 LE_BITS_TO_4BYTE(__pdesc, 24, 1)
70#define GET_TX_DESC_HTC(__pdesc) \ 66#define GET_TX_DESC_HTC(__pdesc) \
71 LE_BITS_TO_4BYTE(__pdesc, 25, 1) 67 LE_BITS_TO_4BYTE(__pdesc, 25, 1)
72#define GET_TX_DESC_LAST_SEG(__pdesc) \ 68#define GET_TX_DESC_LAST_SEG(__pdesc) \
73 LE_BITS_TO_4BYTE(__pdesc, 26, 1) 69 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
74#define GET_TX_DESC_FIRST_SEG(__pdesc) \ 70#define GET_TX_DESC_FIRST_SEG(__pdesc) \
75 LE_BITS_TO_4BYTE(__pdesc, 27, 1) 71 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
76#define GET_TX_DESC_LINIP(__pdesc) \ 72#define GET_TX_DESC_LINIP(__pdesc) \
77 LE_BITS_TO_4BYTE(__pdesc, 28, 1) 73 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
78#define GET_TX_DESC_NO_ACM(__pdesc) \ 74#define GET_TX_DESC_NO_ACM(__pdesc) \
79 LE_BITS_TO_4BYTE(__pdesc, 29, 1) 75 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
80#define GET_TX_DESC_GF(__pdesc) \ 76#define GET_TX_DESC_GF(__pdesc) \
81 LE_BITS_TO_4BYTE(__pdesc, 30, 1) 77 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
82#define GET_TX_DESC_OWN(__pdesc) \ 78#define GET_TX_DESC_OWN(__pdesc) \
83 LE_BITS_TO_4BYTE(__pdesc, 31, 1) 79 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
84 80
85#define SET_TX_DESC_MACID(__pdesc, __val) \ 81#define SET_TX_DESC_MACID(__pdesc, __val) \
86 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 5, __val) 82 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 5, __val)
87#define SET_TX_DESC_AGG_BREAK(__pdesc, __val) \ 83#define SET_TX_DESC_AGG_BREAK(__pdesc, __val) \
88 SET_BITS_TO_LE_4BYTE(__pdesc+4, 5, 1, __val) 84 SET_BITS_TO_LE_4BYTE(__pdesc+4, 5, 1, __val)
89#define SET_TX_DESC_BK(__pdesc, __val) \ 85#define SET_TX_DESC_BK(__pdesc, __val) \
90 SET_BITS_TO_LE_4BYTE(__pdesc+4, 6, 1, __val) 86 SET_BITS_TO_LE_4BYTE(__pdesc+4, 6, 1, __val)
91#define SET_TX_DESC_RDG_ENABLE(__pdesc, __val) \ 87#define SET_TX_DESC_RDG_ENABLE(__pdesc, __val) \
92 SET_BITS_TO_LE_4BYTE(__pdesc+4, 7, 1, __val) 88 SET_BITS_TO_LE_4BYTE(__pdesc+4, 7, 1, __val)
93#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \ 89#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \
94 SET_BITS_TO_LE_4BYTE(__pdesc+4, 8, 5, __val) 90 SET_BITS_TO_LE_4BYTE(__pdesc+4, 8, 5, __val)
95#define SET_TX_DESC_RDG_NAV_EXT(__pdesc, __val) \ 91#define SET_TX_DESC_RDG_NAV_EXT(__pdesc, __val) \
96 SET_BITS_TO_LE_4BYTE(__pdesc+4, 13, 1, __val) 92 SET_BITS_TO_LE_4BYTE(__pdesc+4, 13, 1, __val)
97#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \ 93#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \
98 SET_BITS_TO_LE_4BYTE(__pdesc+4, 14, 1, __val) 94 SET_BITS_TO_LE_4BYTE(__pdesc+4, 14, 1, __val)
99#define SET_TX_DESC_PIFS(__pdesc, __val) \ 95#define SET_TX_DESC_PIFS(__pdesc, __val) \
100 SET_BITS_TO_LE_4BYTE(__pdesc+4, 15, 1, __val) 96 SET_BITS_TO_LE_4BYTE(__pdesc+4, 15, 1, __val)
101#define SET_TX_DESC_RATE_ID(__pdesc, __val) \ 97#define SET_TX_DESC_RATE_ID(__pdesc, __val) \
102 SET_BITS_TO_LE_4BYTE(__pdesc+4, 16, 4, __val) 98 SET_BITS_TO_LE_4BYTE(__pdesc+4, 16, 4, __val)
103#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \ 99#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \
104 SET_BITS_TO_LE_4BYTE(__pdesc+4, 20, 1, __val) 100 SET_BITS_TO_LE_4BYTE(__pdesc+4, 20, 1, __val)
105#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \ 101#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \
106 SET_BITS_TO_LE_4BYTE(__pdesc+4, 21, 1, __val) 102 SET_BITS_TO_LE_4BYTE(__pdesc+4, 21, 1, __val)
@@ -109,34 +105,34 @@
109#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \ 105#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \
110 SET_BITS_TO_LE_4BYTE(__pdesc+4, 24, 8, __val) 106 SET_BITS_TO_LE_4BYTE(__pdesc+4, 24, 8, __val)
111 107
112#define GET_TX_DESC_MACID(__pdesc) \ 108#define GET_TX_DESC_MACID(__pdesc) \
113 LE_BITS_TO_4BYTE(__pdesc+4, 0, 5) 109 LE_BITS_TO_4BYTE(__pdesc+4, 0, 5)
114#define GET_TX_DESC_AGG_ENABLE(__pdesc) \ 110#define GET_TX_DESC_AGG_ENABLE(__pdesc) \
115 LE_BITS_TO_4BYTE(__pdesc+4, 5, 1) 111 LE_BITS_TO_4BYTE(__pdesc+4, 5, 1)
116#define GET_TX_DESC_AGG_BREAK(__pdesc) \ 112#define GET_TX_DESC_AGG_BREAK(__pdesc) \
117 LE_BITS_TO_4BYTE(__pdesc+4, 6, 1) 113 LE_BITS_TO_4BYTE(__pdesc+4, 6, 1)
118#define GET_TX_DESC_RDG_ENABLE(__pdesc) \ 114#define GET_TX_DESC_RDG_ENABLE(__pdesc) \
119 LE_BITS_TO_4BYTE(__pdesc+4, 7, 1) 115 LE_BITS_TO_4BYTE(__pdesc+4, 7, 1)
120#define GET_TX_DESC_QUEUE_SEL(__pdesc) \ 116#define GET_TX_DESC_QUEUE_SEL(__pdesc) \
121 LE_BITS_TO_4BYTE(__pdesc+4, 8, 5) 117 LE_BITS_TO_4BYTE(__pdesc+4, 8, 5)
122#define GET_TX_DESC_RDG_NAV_EXT(__pdesc) \ 118#define GET_TX_DESC_RDG_NAV_EXT(__pdesc) \
123 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1) 119 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1)
124#define GET_TX_DESC_LSIG_TXOP_EN(__pdesc) \ 120#define GET_TX_DESC_LSIG_TXOP_EN(__pdesc) \
125 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1) 121 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1)
126#define GET_TX_DESC_PIFS(__pdesc) \ 122#define GET_TX_DESC_PIFS(__pdesc) \
127 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1) 123 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1)
128#define GET_TX_DESC_RATE_ID(__pdesc) \ 124#define GET_TX_DESC_RATE_ID(__pdesc) \
129 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4) 125 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4)
130#define GET_TX_DESC_NAV_USE_HDR(__pdesc) \ 126#define GET_TX_DESC_NAV_USE_HDR(__pdesc) \
131 LE_BITS_TO_4BYTE(__pdesc+4, 20, 1) 127 LE_BITS_TO_4BYTE(__pdesc+4, 20, 1)
132#define GET_TX_DESC_EN_DESC_ID(__pdesc) \ 128#define GET_TX_DESC_EN_DESC_ID(__pdesc) \
133 LE_BITS_TO_4BYTE(__pdesc+4, 21, 1) 129 LE_BITS_TO_4BYTE(__pdesc+4, 21, 1)
134#define GET_TX_DESC_SEC_TYPE(__pdesc) \ 130#define GET_TX_DESC_SEC_TYPE(__pdesc) \
135 LE_BITS_TO_4BYTE(__pdesc+4, 22, 2) 131 LE_BITS_TO_4BYTE(__pdesc+4, 22, 2)
136#define GET_TX_DESC_PKT_OFFSET(__pdesc) \ 132#define GET_TX_DESC_PKT_OFFSET(__pdesc) \
137 LE_BITS_TO_4BYTE(__pdesc+4, 24, 8) 133 LE_BITS_TO_4BYTE(__pdesc+4, 24, 8)
138 134
139#define SET_TX_DESC_RTS_RC(__pdesc, __val) \ 135#define SET_TX_DESC_RTS_RC(__pdesc, __val) \
140 SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 6, __val) 136 SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 6, __val)
141#define SET_TX_DESC_DATA_RC(__pdesc, __val) \ 137#define SET_TX_DESC_DATA_RC(__pdesc, __val) \
142 SET_BITS_TO_LE_4BYTE(__pdesc+8, 6, 6, __val) 138 SET_BITS_TO_LE_4BYTE(__pdesc+8, 6, 6, __val)
@@ -144,9 +140,9 @@
144 SET_BITS_TO_LE_4BYTE(__pdesc+8, 14, 2, __val) 140 SET_BITS_TO_LE_4BYTE(__pdesc+8, 14, 2, __val)
145#define SET_TX_DESC_MORE_FRAG(__pdesc, __val) \ 141#define SET_TX_DESC_MORE_FRAG(__pdesc, __val) \
146 SET_BITS_TO_LE_4BYTE(__pdesc+8, 17, 1, __val) 142 SET_BITS_TO_LE_4BYTE(__pdesc+8, 17, 1, __val)
147#define SET_TX_DESC_RAW(__pdesc, __val) \ 143#define SET_TX_DESC_RAW(__pdesc, __val) \
148 SET_BITS_TO_LE_4BYTE(__pdesc+8, 18, 1, __val) 144 SET_BITS_TO_LE_4BYTE(__pdesc+8, 18, 1, __val)
149#define SET_TX_DESC_CCX(__pdesc, __val) \ 145#define SET_TX_DESC_CCX(__pdesc, __val) \
150 SET_BITS_TO_LE_4BYTE(__pdesc+8, 19, 1, __val) 146 SET_BITS_TO_LE_4BYTE(__pdesc+8, 19, 1, __val)
151#define SET_TX_DESC_AMPDU_DENSITY(__pdesc, __val) \ 147#define SET_TX_DESC_AMPDU_DENSITY(__pdesc, __val) \
152 SET_BITS_TO_LE_4BYTE(__pdesc+8, 20, 3, __val) 148 SET_BITS_TO_LE_4BYTE(__pdesc+8, 20, 3, __val)
@@ -161,62 +157,62 @@
161#define SET_TX_DESC_TX_ANT_HT(__pdesc, __val) \ 157#define SET_TX_DESC_TX_ANT_HT(__pdesc, __val) \
162 SET_BITS_TO_LE_4BYTE(__pdesc+8, 30, 2, __val) 158 SET_BITS_TO_LE_4BYTE(__pdesc+8, 30, 2, __val)
163 159
164#define GET_TX_DESC_RTS_RC(__pdesc) \ 160#define GET_TX_DESC_RTS_RC(__pdesc) \
165 LE_BITS_TO_4BYTE(__pdesc+8, 0, 6) 161 LE_BITS_TO_4BYTE(__pdesc+8, 0, 6)
166#define GET_TX_DESC_DATA_RC(__pdesc) \ 162#define GET_TX_DESC_DATA_RC(__pdesc) \
167 LE_BITS_TO_4BYTE(__pdesc+8, 6, 6) 163 LE_BITS_TO_4BYTE(__pdesc+8, 6, 6)
168#define GET_TX_DESC_BAR_RTY_TH(__pdesc) \ 164#define GET_TX_DESC_BAR_RTY_TH(__pdesc) \
169 LE_BITS_TO_4BYTE(__pdesc+8, 14, 2) 165 LE_BITS_TO_4BYTE(__pdesc+8, 14, 2)
170#define GET_TX_DESC_MORE_FRAG(__pdesc) \ 166#define GET_TX_DESC_MORE_FRAG(__pdesc) \
171 LE_BITS_TO_4BYTE(__pdesc+8, 17, 1) 167 LE_BITS_TO_4BYTE(__pdesc+8, 17, 1)
172#define GET_TX_DESC_RAW(__pdesc) \ 168#define GET_TX_DESC_RAW(__pdesc) \
173 LE_BITS_TO_4BYTE(__pdesc+8, 18, 1) 169 LE_BITS_TO_4BYTE(__pdesc+8, 18, 1)
174#define GET_TX_DESC_CCX(__pdesc) \ 170#define GET_TX_DESC_CCX(__pdesc) \
175 LE_BITS_TO_4BYTE(__pdesc+8, 19, 1) 171 LE_BITS_TO_4BYTE(__pdesc+8, 19, 1)
176#define GET_TX_DESC_AMPDU_DENSITY(__pdesc) \ 172#define GET_TX_DESC_AMPDU_DENSITY(__pdesc) \
177 LE_BITS_TO_4BYTE(__pdesc+8, 20, 3) 173 LE_BITS_TO_4BYTE(__pdesc+8, 20, 3)
178#define GET_TX_DESC_ANTSEL_A(__pdesc) \ 174#define GET_TX_DESC_ANTSEL_A(__pdesc) \
179 LE_BITS_TO_4BYTE(__pdesc+8, 24, 1) 175 LE_BITS_TO_4BYTE(__pdesc+8, 24, 1)
180#define GET_TX_DESC_ANTSEL_B(__pdesc) \ 176#define GET_TX_DESC_ANTSEL_B(__pdesc) \
181 LE_BITS_TO_4BYTE(__pdesc+8, 25, 1) 177 LE_BITS_TO_4BYTE(__pdesc+8, 25, 1)
182#define GET_TX_DESC_TX_ANT_CCK(__pdesc) \ 178#define GET_TX_DESC_TX_ANT_CCK(__pdesc) \
183 LE_BITS_TO_4BYTE(__pdesc+8, 26, 2) 179 LE_BITS_TO_4BYTE(__pdesc+8, 26, 2)
184#define GET_TX_DESC_TX_ANTL(__pdesc) \ 180#define GET_TX_DESC_TX_ANTL(__pdesc) \
185 LE_BITS_TO_4BYTE(__pdesc+8, 28, 2) 181 LE_BITS_TO_4BYTE(__pdesc+8, 28, 2)
186#define GET_TX_DESC_TX_ANT_HT(__pdesc) \ 182#define GET_TX_DESC_TX_ANT_HT(__pdesc) \
187 LE_BITS_TO_4BYTE(__pdesc+8, 30, 2) 183 LE_BITS_TO_4BYTE(__pdesc+8, 30, 2)
188 184
189#define SET_TX_DESC_NEXT_HEAP_PAGE(__pdesc, __val) \ 185#define SET_TX_DESC_NEXT_HEAP_PAGE(__pdesc, __val) \
190 SET_BITS_TO_LE_4BYTE(__pdesc+12, 0, 8, __val) 186 SET_BITS_TO_LE_4BYTE(__pdesc+12, 0, 8, __val)
191#define SET_TX_DESC_TAIL_PAGE(__pdesc, __val) \ 187#define SET_TX_DESC_TAIL_PAGE(__pdesc, __val) \
192 SET_BITS_TO_LE_4BYTE(__pdesc+12, 8, 8, __val) 188 SET_BITS_TO_LE_4BYTE(__pdesc+12, 8, 8, __val)
193#define SET_TX_DESC_SEQ(__pdesc, __val) \ 189#define SET_TX_DESC_SEQ(__pdesc, __val) \
194 SET_BITS_TO_LE_4BYTE(__pdesc+12, 16, 12, __val) 190 SET_BITS_TO_LE_4BYTE(__pdesc+12, 16, 12, __val)
195#define SET_TX_DESC_PKT_ID(__pdesc, __val) \ 191#define SET_TX_DESC_PKT_ID(__pdesc, __val) \
196 SET_BITS_TO_LE_4BYTE(__pdesc+12, 28, 4, __val) 192 SET_BITS_TO_LE_4BYTE(__pdesc+12, 28, 4, __val)
197 193
198#define GET_TX_DESC_NEXT_HEAP_PAGE(__pdesc) \ 194#define GET_TX_DESC_NEXT_HEAP_PAGE(__pdesc) \
199 LE_BITS_TO_4BYTE(__pdesc+12, 0, 8) 195 LE_BITS_TO_4BYTE(__pdesc+12, 0, 8)
200#define GET_TX_DESC_TAIL_PAGE(__pdesc) \ 196#define GET_TX_DESC_TAIL_PAGE(__pdesc) \
201 LE_BITS_TO_4BYTE(__pdesc+12, 8, 8) 197 LE_BITS_TO_4BYTE(__pdesc+12, 8, 8)
202#define GET_TX_DESC_SEQ(__pdesc) \ 198#define GET_TX_DESC_SEQ(__pdesc) \
203 LE_BITS_TO_4BYTE(__pdesc+12, 16, 12) 199 LE_BITS_TO_4BYTE(__pdesc+12, 16, 12)
204#define GET_TX_DESC_PKT_ID(__pdesc) \ 200#define GET_TX_DESC_PKT_ID(__pdesc) \
205 LE_BITS_TO_4BYTE(__pdesc+12, 28, 4) 201 LE_BITS_TO_4BYTE(__pdesc+12, 28, 4)
206 202
207/* For RTL8723 */ 203/* For RTL8723 */
208#define SET_TX_DESC_TRIGGER_INT(__pdesc, __val) \ 204#define SET_TX_DESC_TRIGGER_INT(__pdesc, __val) \
209 SET_BITS_TO_LE_4BYTE(__pdesc+12, 30, 1, __val) 205 SET_BITS_TO_LE_4BYTE(__pdesc+12, 30, 1, __val)
210#define SET_TX_DESC_HWSEQ_EN_8723(__pdesc, __val) \ 206#define SET_TX_DESC_HWSEQ_EN_8723(__pdesc, __val) \
211 SET_BITS_TO_LE_4BYTE(__pdesc+12, 31, 1, __val) 207 SET_BITS_TO_LE_4BYTE(__pdesc+12, 31, 1, __val)
212#define SET_TX_DESC_HWSEQ_SEL_8723(__pTxDesc, __Value) \ 208#define SET_TX_DESC_HWSEQ_SEL_8723(__txdesc, __value) \
213 SET_BITS_TO_LE_4BYTE(__pTxDesc+16, 6, 2, __Value) 209 SET_BITS_TO_LE_4BYTE(__txdesc+16, 6, 2, __value)
214 210
215#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \ 211#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \
216 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 5, __val) 212 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 5, __val)
217#define SET_TX_DESC_AP_DCFE(__pdesc, __val) \ 213#define SET_TX_DESC_AP_DCFE(__pdesc, __val) \
218 SET_BITS_TO_LE_4BYTE(__pdesc+16, 5, 1, __val) 214 SET_BITS_TO_LE_4BYTE(__pdesc+16, 5, 1, __val)
219#define SET_TX_DESC_QOS(__pdesc, __val) \ 215#define SET_TX_DESC_QOS(__pdesc, __val) \
220 SET_BITS_TO_LE_4BYTE(__pdesc+16, 6, 1, __val) 216 SET_BITS_TO_LE_4BYTE(__pdesc+16, 6, 1, __val)
221#define SET_TX_DESC_HWSEQ_EN(__pdesc, __val) \ 217#define SET_TX_DESC_HWSEQ_EN(__pdesc, __val) \
222 SET_BITS_TO_LE_4BYTE(__pdesc+16, 7, 1, __val) 218 SET_BITS_TO_LE_4BYTE(__pdesc+16, 7, 1, __val)
@@ -248,54 +244,54 @@
248 SET_BITS_TO_LE_4BYTE(__pdesc+16, 25, 1, __val) 244 SET_BITS_TO_LE_4BYTE(__pdesc+16, 25, 1, __val)
249#define SET_TX_DESC_RTS_SHORT(__pdesc, __val) \ 245#define SET_TX_DESC_RTS_SHORT(__pdesc, __val) \
250 SET_BITS_TO_LE_4BYTE(__pdesc+16, 26, 1, __val) 246 SET_BITS_TO_LE_4BYTE(__pdesc+16, 26, 1, __val)
251#define SET_TX_DESC_RTS_BW(__pdesc, __val) \ 247#define SET_TX_DESC_RTS_BW(__pdesc, __val) \
252 SET_BITS_TO_LE_4BYTE(__pdesc+16, 27, 1, __val) 248 SET_BITS_TO_LE_4BYTE(__pdesc+16, 27, 1, __val)
253#define SET_TX_DESC_RTS_SC(__pdesc, __val) \ 249#define SET_TX_DESC_RTS_SC(__pdesc, __val) \
254 SET_BITS_TO_LE_4BYTE(__pdesc+16, 28, 2, __val) 250 SET_BITS_TO_LE_4BYTE(__pdesc+16, 28, 2, __val)
255#define SET_TX_DESC_RTS_STBC(__pdesc, __val) \ 251#define SET_TX_DESC_RTS_STBC(__pdesc, __val) \
256 SET_BITS_TO_LE_4BYTE(__pdesc+16, 30, 2, __val) 252 SET_BITS_TO_LE_4BYTE(__pdesc+16, 30, 2, __val)
257 253
258#define GET_TX_DESC_RTS_RATE(__pdesc) \ 254#define GET_TX_DESC_RTS_RATE(__pdesc) \
259 LE_BITS_TO_4BYTE(__pdesc+16, 0, 5) 255 LE_BITS_TO_4BYTE(__pdesc+16, 0, 5)
260#define GET_TX_DESC_AP_DCFE(__pdesc) \ 256#define GET_TX_DESC_AP_DCFE(__pdesc) \
261 LE_BITS_TO_4BYTE(__pdesc+16, 5, 1) 257 LE_BITS_TO_4BYTE(__pdesc+16, 5, 1)
262#define GET_TX_DESC_QOS(__pdesc) \ 258#define GET_TX_DESC_QOS(__pdesc) \
263 LE_BITS_TO_4BYTE(__pdesc+16, 6, 1) 259 LE_BITS_TO_4BYTE(__pdesc+16, 6, 1)
264#define GET_TX_DESC_HWSEQ_EN(__pdesc) \ 260#define GET_TX_DESC_HWSEQ_EN(__pdesc) \
265 LE_BITS_TO_4BYTE(__pdesc+16, 7, 1) 261 LE_BITS_TO_4BYTE(__pdesc+16, 7, 1)
266#define GET_TX_DESC_USE_RATE(__pdesc) \ 262#define GET_TX_DESC_USE_RATE(__pdesc) \
267 LE_BITS_TO_4BYTE(__pdesc+16, 8, 1) 263 LE_BITS_TO_4BYTE(__pdesc+16, 8, 1)
268#define GET_TX_DESC_DISABLE_RTS_FB(__pdesc) \ 264#define GET_TX_DESC_DISABLE_RTS_FB(__pdesc) \
269 LE_BITS_TO_4BYTE(__pdesc+16, 9, 1) 265 LE_BITS_TO_4BYTE(__pdesc+16, 9, 1)
270#define GET_TX_DESC_DISABLE_FB(__pdesc) \ 266#define GET_TX_DESC_DISABLE_FB(__pdesc) \
271 LE_BITS_TO_4BYTE(__pdesc+16, 10, 1) 267 LE_BITS_TO_4BYTE(__pdesc+16, 10, 1)
272#define GET_TX_DESC_CTS2SELF(__pdesc) \ 268#define GET_TX_DESC_CTS2SELF(__pdesc) \
273 LE_BITS_TO_4BYTE(__pdesc+16, 11, 1) 269 LE_BITS_TO_4BYTE(__pdesc+16, 11, 1)
274#define GET_TX_DESC_RTS_ENABLE(__pdesc) \ 270#define GET_TX_DESC_RTS_ENABLE(__pdesc) \
275 LE_BITS_TO_4BYTE(__pdesc+16, 12, 1) 271 LE_BITS_TO_4BYTE(__pdesc+16, 12, 1)
276#define GET_TX_DESC_HW_RTS_ENABLE(__pdesc) \ 272#define GET_TX_DESC_HW_RTS_ENABLE(__pdesc) \
277 LE_BITS_TO_4BYTE(__pdesc+16, 13, 1) 273 LE_BITS_TO_4BYTE(__pdesc+16, 13, 1)
278#define GET_TX_DESC_PORT_ID(__pdesc) \ 274#define GET_TX_DESC_PORT_ID(__pdesc) \
279 LE_BITS_TO_4BYTE(__pdesc+16, 14, 1) 275 LE_BITS_TO_4BYTE(__pdesc+16, 14, 1)
280#define GET_TX_DESC_WAIT_DCTS(__pdesc) \ 276#define GET_TX_DESC_WAIT_DCTS(__pdesc) \
281 LE_BITS_TO_4BYTE(__pdesc+16, 18, 1) 277 LE_BITS_TO_4BYTE(__pdesc+16, 18, 1)
282#define GET_TX_DESC_CTS2AP_EN(__pdesc) \ 278#define GET_TX_DESC_CTS2AP_EN(__pdesc) \
283 LE_BITS_TO_4BYTE(__pdesc+16, 19, 1) 279 LE_BITS_TO_4BYTE(__pdesc+16, 19, 1)
284#define GET_TX_DESC_TX_SUB_CARRIER(__pdesc) \ 280#define GET_TX_DESC_TX_SUB_CARRIER(__pdesc) \
285 LE_BITS_TO_4BYTE(__pdesc+16, 20, 2) 281 LE_BITS_TO_4BYTE(__pdesc+16, 20, 2)
286#define GET_TX_DESC_TX_STBC(__pdesc) \ 282#define GET_TX_DESC_TX_STBC(__pdesc) \
287 LE_BITS_TO_4BYTE(__pdesc+16, 22, 2) 283 LE_BITS_TO_4BYTE(__pdesc+16, 22, 2)
288#define GET_TX_DESC_DATA_SHORT(__pdesc) \ 284#define GET_TX_DESC_DATA_SHORT(__pdesc) \
289 LE_BITS_TO_4BYTE(__pdesc+16, 24, 1) 285 LE_BITS_TO_4BYTE(__pdesc+16, 24, 1)
290#define GET_TX_DESC_DATA_BW(__pdesc) \ 286#define GET_TX_DESC_DATA_BW(__pdesc) \
291 LE_BITS_TO_4BYTE(__pdesc+16, 25, 1) 287 LE_BITS_TO_4BYTE(__pdesc+16, 25, 1)
292#define GET_TX_DESC_RTS_SHORT(__pdesc) \ 288#define GET_TX_DESC_RTS_SHORT(__pdesc) \
293 LE_BITS_TO_4BYTE(__pdesc+16, 26, 1) 289 LE_BITS_TO_4BYTE(__pdesc+16, 26, 1)
294#define GET_TX_DESC_RTS_BW(__pdesc) \ 290#define GET_TX_DESC_RTS_BW(__pdesc) \
295 LE_BITS_TO_4BYTE(__pdesc+16, 27, 1) 291 LE_BITS_TO_4BYTE(__pdesc+16, 27, 1)
296#define GET_TX_DESC_RTS_SC(__pdesc) \ 292#define GET_TX_DESC_RTS_SC(__pdesc) \
297 LE_BITS_TO_4BYTE(__pdesc+16, 28, 2) 293 LE_BITS_TO_4BYTE(__pdesc+16, 28, 2)
298#define GET_TX_DESC_RTS_STBC(__pdesc) \ 294#define GET_TX_DESC_RTS_STBC(__pdesc) \
299 LE_BITS_TO_4BYTE(__pdesc+16, 30, 2) 295 LE_BITS_TO_4BYTE(__pdesc+16, 30, 2)
300 296
301#define SET_TX_DESC_TX_RATE(__pdesc, __val) \ 297#define SET_TX_DESC_TX_RATE(__pdesc, __val) \
@@ -315,17 +311,17 @@
315#define SET_TX_DESC_USB_TXAGG_NUM(__pdesc, __val) \ 311#define SET_TX_DESC_USB_TXAGG_NUM(__pdesc, __val) \
316 SET_BITS_TO_LE_4BYTE(__pdesc+20, 24, 8, __val) 312 SET_BITS_TO_LE_4BYTE(__pdesc+20, 24, 8, __val)
317 313
318#define GET_TX_DESC_TX_RATE(__pdesc) \ 314#define GET_TX_DESC_TX_RATE(__pdesc) \
319 LE_BITS_TO_4BYTE(__pdesc+20, 0, 6) 315 LE_BITS_TO_4BYTE(__pdesc+20, 0, 6)
320#define GET_TX_DESC_DATA_SHORTGI(__pdesc) \ 316#define GET_TX_DESC_DATA_SHORTGI(__pdesc) \
321 LE_BITS_TO_4BYTE(__pdesc+20, 6, 1) 317 LE_BITS_TO_4BYTE(__pdesc+20, 6, 1)
322#define GET_TX_DESC_CCX_TAG(__pdesc) \ 318#define GET_TX_DESC_CCX_TAG(__pdesc) \
323 LE_BITS_TO_4BYTE(__pdesc+20, 7, 1) 319 LE_BITS_TO_4BYTE(__pdesc+20, 7, 1)
324#define GET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc) \ 320#define GET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc) \
325 LE_BITS_TO_4BYTE(__pdesc+20, 8, 5) 321 LE_BITS_TO_4BYTE(__pdesc+20, 8, 5)
326#define GET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc) \ 322#define GET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc) \
327 LE_BITS_TO_4BYTE(__pdesc+20, 13, 4) 323 LE_BITS_TO_4BYTE(__pdesc+20, 13, 4)
328#define GET_TX_DESC_RETRY_LIMIT_ENABLE(__pdesc) \ 324#define GET_TX_DESC_RETRY_LIMIT_ENABLE(__pdesc) \
329 LE_BITS_TO_4BYTE(__pdesc+20, 17, 1) 325 LE_BITS_TO_4BYTE(__pdesc+20, 17, 1)
330#define GET_TX_DESC_DATA_RETRY_LIMIT(__pdesc) \ 326#define GET_TX_DESC_DATA_RETRY_LIMIT(__pdesc) \
331 LE_BITS_TO_4BYTE(__pdesc+20, 18, 6) 327 LE_BITS_TO_4BYTE(__pdesc+20, 18, 6)
@@ -336,9 +332,9 @@
336 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 5, __val) 332 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 5, __val)
337#define SET_TX_DESC_TXAGC_B(__pdesc, __val) \ 333#define SET_TX_DESC_TXAGC_B(__pdesc, __val) \
338 SET_BITS_TO_LE_4BYTE(__pdesc+24, 5, 5, __val) 334 SET_BITS_TO_LE_4BYTE(__pdesc+24, 5, 5, __val)
339#define SET_TX_DESC_USE_MAX_LEN(__pdesc, __val) \ 335#define SET_TX_DESC_USE_MAX_LEN(__pdesc, __val) \
340 SET_BITS_TO_LE_4BYTE(__pdesc+24, 10, 1, __val) 336 SET_BITS_TO_LE_4BYTE(__pdesc+24, 10, 1, __val)
341#define SET_TX_DESC_MAX_AGG_NUM(__pdesc, __val) \ 337#define SET_TX_DESC_MAX_AGG_NUM(__pdesc, __val) \
342 SET_BITS_TO_LE_4BYTE(__pdesc+24, 11, 5, __val) 338 SET_BITS_TO_LE_4BYTE(__pdesc+24, 11, 5, __val)
343#define SET_TX_DESC_MCSG1_MAX_LEN(__pdesc, __val) \ 339#define SET_TX_DESC_MCSG1_MAX_LEN(__pdesc, __val) \
344 SET_BITS_TO_LE_4BYTE(__pdesc+24, 16, 4, __val) 340 SET_BITS_TO_LE_4BYTE(__pdesc+24, 16, 4, __val)
@@ -349,19 +345,19 @@
349#define SET_TX_DESC_MCS7_SGI_MAX_LEN(__pdesc, __val)\ 345#define SET_TX_DESC_MCS7_SGI_MAX_LEN(__pdesc, __val)\
350 SET_BITS_TO_LE_4BYTE(__pdesc+24, 28, 4, __val) 346 SET_BITS_TO_LE_4BYTE(__pdesc+24, 28, 4, __val)
351 347
352#define GET_TX_DESC_TXAGC_A(__pdesc) \ 348#define GET_TX_DESC_TXAGC_A(__pdesc) \
353 LE_BITS_TO_4BYTE(__pdesc+24, 0, 5) 349 LE_BITS_TO_4BYTE(__pdesc+24, 0, 5)
354#define GET_TX_DESC_TXAGC_B(__pdesc) \ 350#define GET_TX_DESC_TXAGC_B(__pdesc) \
355 LE_BITS_TO_4BYTE(__pdesc+24, 5, 5) 351 LE_BITS_TO_4BYTE(__pdesc+24, 5, 5)
356#define GET_TX_DESC_USE_MAX_LEN(__pdesc) \ 352#define GET_TX_DESC_USE_MAX_LEN(__pdesc) \
357 LE_BITS_TO_4BYTE(__pdesc+24, 10, 1) 353 LE_BITS_TO_4BYTE(__pdesc+24, 10, 1)
358#define GET_TX_DESC_MAX_AGG_NUM(__pdesc) \ 354#define GET_TX_DESC_MAX_AGG_NUM(__pdesc) \
359 LE_BITS_TO_4BYTE(__pdesc+24, 11, 5) 355 LE_BITS_TO_4BYTE(__pdesc+24, 11, 5)
360#define GET_TX_DESC_MCSG1_MAX_LEN(__pdesc) \ 356#define GET_TX_DESC_MCSG1_MAX_LEN(__pdesc) \
361 LE_BITS_TO_4BYTE(__pdesc+24, 16, 4) 357 LE_BITS_TO_4BYTE(__pdesc+24, 16, 4)
362#define GET_TX_DESC_MCSG2_MAX_LEN(__pdesc) \ 358#define GET_TX_DESC_MCSG2_MAX_LEN(__pdesc) \
363 LE_BITS_TO_4BYTE(__pdesc+24, 20, 4) 359 LE_BITS_TO_4BYTE(__pdesc+24, 20, 4)
364#define GET_TX_DESC_MCSG3_MAX_LEN(__pdesc) \ 360#define GET_TX_DESC_MCSG3_MAX_LEN(__pdesc) \
365 LE_BITS_TO_4BYTE(__pdesc+24, 24, 4) 361 LE_BITS_TO_4BYTE(__pdesc+24, 24, 4)
366#define GET_TX_DESC_MCS7_SGI_MAX_LEN(__pdesc) \ 362#define GET_TX_DESC_MCS7_SGI_MAX_LEN(__pdesc) \
367 LE_BITS_TO_4BYTE(__pdesc+24, 28, 4) 363 LE_BITS_TO_4BYTE(__pdesc+24, 28, 4)
@@ -379,11 +375,11 @@
379 375
380#define GET_TX_DESC_TX_BUFFER_SIZE(__pdesc) \ 376#define GET_TX_DESC_TX_BUFFER_SIZE(__pdesc) \
381 LE_BITS_TO_4BYTE(__pdesc+28, 0, 16) 377 LE_BITS_TO_4BYTE(__pdesc+28, 0, 16)
382#define GET_TX_DESC_MCSG4_MAX_LEN(__pdesc) \ 378#define GET_TX_DESC_MCSG4_MAX_LEN(__pdesc) \
383 LE_BITS_TO_4BYTE(__pdesc+28, 16, 4) 379 LE_BITS_TO_4BYTE(__pdesc+28, 16, 4)
384#define GET_TX_DESC_MCSG5_MAX_LEN(__pdesc) \ 380#define GET_TX_DESC_MCSG5_MAX_LEN(__pdesc) \
385 LE_BITS_TO_4BYTE(__pdesc+28, 20, 4) 381 LE_BITS_TO_4BYTE(__pdesc+28, 20, 4)
386#define GET_TX_DESC_MCSG6_MAX_LEN(__pdesc) \ 382#define GET_TX_DESC_MCSG6_MAX_LEN(__pdesc) \
387 LE_BITS_TO_4BYTE(__pdesc+28, 24, 4) 383 LE_BITS_TO_4BYTE(__pdesc+28, 24, 4)
388#define GET_TX_DESC_MCS15_SGI_MAX_LEN(__pdesc) \ 384#define GET_TX_DESC_MCS15_SGI_MAX_LEN(__pdesc) \
389 LE_BITS_TO_4BYTE(__pdesc+28, 28, 4) 385 LE_BITS_TO_4BYTE(__pdesc+28, 28, 4)
@@ -395,7 +391,7 @@
395 391
396#define GET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc) \ 392#define GET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc) \
397 LE_BITS_TO_4BYTE(__pdesc+32, 0, 32) 393 LE_BITS_TO_4BYTE(__pdesc+32, 0, 32)
398#define GET_TX_DESC_TX_BUFFER_ADDRESS64(__pdesc) \ 394#define GET_TX_DESC_TX_BUFFER_ADDRESS64(__pdesc) \
399 LE_BITS_TO_4BYTE(__pdesc+36, 0, 32) 395 LE_BITS_TO_4BYTE(__pdesc+36, 0, 32)
400 396
401#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc, __val) \ 397#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc, __val) \
@@ -410,97 +406,97 @@
410 406
411#define GET_RX_DESC_PKT_LEN(__pdesc) \ 407#define GET_RX_DESC_PKT_LEN(__pdesc) \
412 LE_BITS_TO_4BYTE(__pdesc, 0, 14) 408 LE_BITS_TO_4BYTE(__pdesc, 0, 14)
413#define GET_RX_DESC_CRC32(__pdesc) \ 409#define GET_RX_DESC_CRC32(__pdesc) \
414 LE_BITS_TO_4BYTE(__pdesc, 14, 1) 410 LE_BITS_TO_4BYTE(__pdesc, 14, 1)
415#define GET_RX_DESC_ICV(__pdesc) \ 411#define GET_RX_DESC_ICV(__pdesc) \
416 LE_BITS_TO_4BYTE(__pdesc, 15, 1) 412 LE_BITS_TO_4BYTE(__pdesc, 15, 1)
417#define GET_RX_DESC_DRV_INFO_SIZE(__pdesc) \ 413#define GET_RX_DESC_DRV_INFO_SIZE(__pdesc) \
418 LE_BITS_TO_4BYTE(__pdesc, 16, 4) 414 LE_BITS_TO_4BYTE(__pdesc, 16, 4)
419#define GET_RX_DESC_SECURITY(__pdesc) \ 415#define GET_RX_DESC_SECURITY(__pdesc) \
420 LE_BITS_TO_4BYTE(__pdesc, 20, 3) 416 LE_BITS_TO_4BYTE(__pdesc, 20, 3)
421#define GET_RX_DESC_QOS(__pdesc) \ 417#define GET_RX_DESC_QOS(__pdesc) \
422 LE_BITS_TO_4BYTE(__pdesc, 23, 1) 418 LE_BITS_TO_4BYTE(__pdesc, 23, 1)
423#define GET_RX_DESC_SHIFT(__pdesc) \ 419#define GET_RX_DESC_SHIFT(__pdesc) \
424 LE_BITS_TO_4BYTE(__pdesc, 24, 2) 420 LE_BITS_TO_4BYTE(__pdesc, 24, 2)
425#define GET_RX_DESC_PHYST(__pdesc) \ 421#define GET_RX_DESC_PHYST(__pdesc) \
426 LE_BITS_TO_4BYTE(__pdesc, 26, 1) 422 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
427#define GET_RX_DESC_SWDEC(__pdesc) \ 423#define GET_RX_DESC_SWDEC(__pdesc) \
428 LE_BITS_TO_4BYTE(__pdesc, 27, 1) 424 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
429#define GET_RX_DESC_LS(__pdesc) \ 425#define GET_RX_DESC_LS(__pdesc) \
430 LE_BITS_TO_4BYTE(__pdesc, 28, 1) 426 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
431#define GET_RX_DESC_FS(__pdesc) \ 427#define GET_RX_DESC_FS(__pdesc) \
432 LE_BITS_TO_4BYTE(__pdesc, 29, 1) 428 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
433#define GET_RX_DESC_EOR(__pdesc) \ 429#define GET_RX_DESC_EOR(__pdesc) \
434 LE_BITS_TO_4BYTE(__pdesc, 30, 1) 430 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
435#define GET_RX_DESC_OWN(__pdesc) \ 431#define GET_RX_DESC_OWN(__pdesc) \
436 LE_BITS_TO_4BYTE(__pdesc, 31, 1) 432 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
437 433
438#define SET_RX_DESC_PKT_LEN(__pdesc, __val) \ 434#define SET_RX_DESC_PKT_LEN(__pdesc, __val) \
439 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 14, __val) 435 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 14, __val)
440#define SET_RX_DESC_EOR(__pdesc, __val) \ 436#define SET_RX_DESC_EOR(__pdesc, __val) \
441 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val) 437 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
442#define SET_RX_DESC_OWN(__pdesc, __val) \ 438#define SET_RX_DESC_OWN(__pdesc, __val) \
443 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val) 439 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
444 440
445#define GET_RX_DESC_MACID(__pdesc) \ 441#define GET_RX_DESC_MACID(__pdesc) \
446 LE_BITS_TO_4BYTE(__pdesc+4, 0, 5) 442 LE_BITS_TO_4BYTE(__pdesc+4, 0, 5)
447#define GET_RX_DESC_TID(__pdesc) \ 443#define GET_RX_DESC_TID(__pdesc) \
448 LE_BITS_TO_4BYTE(__pdesc+4, 5, 4) 444 LE_BITS_TO_4BYTE(__pdesc+4, 5, 4)
449#define GET_RX_DESC_HWRSVD(__pdesc) \ 445#define GET_RX_DESC_HWRSVD(__pdesc) \
450 LE_BITS_TO_4BYTE(__pdesc+4, 9, 5) 446 LE_BITS_TO_4BYTE(__pdesc+4, 9, 5)
451#define GET_RX_DESC_PAGGR(__pdesc) \ 447#define GET_RX_DESC_PAGGR(__pdesc) \
452 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1) 448 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1)
453#define GET_RX_DESC_FAGGR(__pdesc) \ 449#define GET_RX_DESC_FAGGR(__pdesc) \
454 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1) 450 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1)
455#define GET_RX_DESC_A1_FIT(__pdesc) \ 451#define GET_RX_DESC_A1_FIT(__pdesc) \
456 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4) 452 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4)
457#define GET_RX_DESC_A2_FIT(__pdesc) \ 453#define GET_RX_DESC_A2_FIT(__pdesc) \
458 LE_BITS_TO_4BYTE(__pdesc+4, 20, 4) 454 LE_BITS_TO_4BYTE(__pdesc+4, 20, 4)
459#define GET_RX_DESC_PAM(__pdesc) \ 455#define GET_RX_DESC_PAM(__pdesc) \
460 LE_BITS_TO_4BYTE(__pdesc+4, 24, 1) 456 LE_BITS_TO_4BYTE(__pdesc+4, 24, 1)
461#define GET_RX_DESC_PWR(__pdesc) \ 457#define GET_RX_DESC_PWR(__pdesc) \
462 LE_BITS_TO_4BYTE(__pdesc+4, 25, 1) 458 LE_BITS_TO_4BYTE(__pdesc+4, 25, 1)
463#define GET_RX_DESC_MD(__pdesc) \ 459#define GET_RX_DESC_MD(__pdesc) \
464 LE_BITS_TO_4BYTE(__pdesc+4, 26, 1) 460 LE_BITS_TO_4BYTE(__pdesc+4, 26, 1)
465#define GET_RX_DESC_MF(__pdesc) \ 461#define GET_RX_DESC_MF(__pdesc) \
466 LE_BITS_TO_4BYTE(__pdesc+4, 27, 1) 462 LE_BITS_TO_4BYTE(__pdesc+4, 27, 1)
467#define GET_RX_DESC_TYPE(__pdesc) \ 463#define GET_RX_DESC_TYPE(__pdesc) \
468 LE_BITS_TO_4BYTE(__pdesc+4, 28, 2) 464 LE_BITS_TO_4BYTE(__pdesc+4, 28, 2)
469#define GET_RX_DESC_MC(__pdesc) \ 465#define GET_RX_DESC_MC(__pdesc) \
470 LE_BITS_TO_4BYTE(__pdesc+4, 30, 1) 466 LE_BITS_TO_4BYTE(__pdesc+4, 30, 1)
471#define GET_RX_DESC_BC(__pdesc) \ 467#define GET_RX_DESC_BC(__pdesc) \
472 LE_BITS_TO_4BYTE(__pdesc+4, 31, 1) 468 LE_BITS_TO_4BYTE(__pdesc+4, 31, 1)
473#define GET_RX_DESC_SEQ(__pdesc) \ 469#define GET_RX_DESC_SEQ(__pdesc) \
474 LE_BITS_TO_4BYTE(__pdesc+8, 0, 12) 470 LE_BITS_TO_4BYTE(__pdesc+8, 0, 12)
475#define GET_RX_DESC_FRAG(__pdesc) \ 471#define GET_RX_DESC_FRAG(__pdesc) \
476 LE_BITS_TO_4BYTE(__pdesc+8, 12, 4) 472 LE_BITS_TO_4BYTE(__pdesc+8, 12, 4)
477#define GET_RX_DESC_NEXT_PKT_LEN(__pdesc) \ 473#define GET_RX_DESC_NEXT_PKT_LEN(__pdesc) \
478 LE_BITS_TO_4BYTE(__pdesc+8, 16, 14) 474 LE_BITS_TO_4BYTE(__pdesc+8, 16, 14)
479#define GET_RX_DESC_NEXT_IND(__pdesc) \ 475#define GET_RX_DESC_NEXT_IND(__pdesc) \
480 LE_BITS_TO_4BYTE(__pdesc+8, 30, 1) 476 LE_BITS_TO_4BYTE(__pdesc+8, 30, 1)
481#define GET_RX_DESC_RSVD(__pdesc) \ 477#define GET_RX_DESC_RSVD(__pdesc) \
482 LE_BITS_TO_4BYTE(__pdesc+8, 31, 1) 478 LE_BITS_TO_4BYTE(__pdesc+8, 31, 1)
483 479
484#define GET_RX_DESC_RXMCS(__pdesc) \ 480#define GET_RX_DESC_RXMCS(__pdesc) \
485 LE_BITS_TO_4BYTE(__pdesc+12, 0, 6) 481 LE_BITS_TO_4BYTE(__pdesc+12, 0, 6)
486#define GET_RX_DESC_RXHT(__pdesc) \ 482#define GET_RX_DESC_RXHT(__pdesc) \
487 LE_BITS_TO_4BYTE(__pdesc+12, 6, 1) 483 LE_BITS_TO_4BYTE(__pdesc+12, 6, 1)
488#define GET_RX_DESC_SPLCP(__pdesc) \ 484#define GET_RX_DESC_SPLCP(__pdesc) \
489 LE_BITS_TO_4BYTE(__pdesc+12, 8, 1) 485 LE_BITS_TO_4BYTE(__pdesc+12, 8, 1)
490#define GET_RX_DESC_BW(__pdesc) \ 486#define GET_RX_DESC_BW(__pdesc) \
491 LE_BITS_TO_4BYTE(__pdesc+12, 9, 1) 487 LE_BITS_TO_4BYTE(__pdesc+12, 9, 1)
492#define GET_RX_DESC_HTC(__pdesc) \ 488#define GET_RX_DESC_HTC(__pdesc) \
493 LE_BITS_TO_4BYTE(__pdesc+12, 10, 1) 489 LE_BITS_TO_4BYTE(__pdesc+12, 10, 1)
494#define GET_RX_DESC_HWPC_ERR(__pdesc) \ 490#define GET_RX_DESC_HWPC_ERR(__pdesc) \
495 LE_BITS_TO_4BYTE(__pdesc+12, 14, 1) 491 LE_BITS_TO_4BYTE(__pdesc+12, 14, 1)
496#define GET_RX_DESC_HWPC_IND(__pdesc) \ 492#define GET_RX_DESC_HWPC_IND(__pdesc) \
497 LE_BITS_TO_4BYTE(__pdesc+12, 15, 1) 493 LE_BITS_TO_4BYTE(__pdesc+12, 15, 1)
498#define GET_RX_DESC_IV0(__pdesc) \ 494#define GET_RX_DESC_IV0(__pdesc) \
499 LE_BITS_TO_4BYTE(__pdesc+12, 16, 16) 495 LE_BITS_TO_4BYTE(__pdesc+12, 16, 16)
500 496
501#define GET_RX_DESC_IV1(__pdesc) \ 497#define GET_RX_DESC_IV1(__pdesc) \
502 LE_BITS_TO_4BYTE(__pdesc+16, 0, 32) 498 LE_BITS_TO_4BYTE(__pdesc+16, 0, 32)
503#define GET_RX_DESC_TSFL(__pdesc) \ 499#define GET_RX_DESC_TSFL(__pdesc) \
504 LE_BITS_TO_4BYTE(__pdesc+20, 0, 32) 500 LE_BITS_TO_4BYTE(__pdesc+20, 0, 32)
505 501
506#define GET_RX_DESC_BUFF_ADDR(__pdesc) \ 502#define GET_RX_DESC_BUFF_ADDR(__pdesc) \
@@ -508,17 +504,17 @@
508#define GET_RX_DESC_BUFF_ADDR64(__pdesc) \ 504#define GET_RX_DESC_BUFF_ADDR64(__pdesc) \
509 LE_BITS_TO_4BYTE(__pdesc+28, 0, 32) 505 LE_BITS_TO_4BYTE(__pdesc+28, 0, 32)
510 506
511#define SET_RX_DESC_BUFF_ADDR(__pdesc, __val) \ 507#define SET_RX_DESC_BUFF_ADDR(__pdesc, __val) \
512 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 32, __val) 508 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 32, __val)
513#define SET_RX_DESC_BUFF_ADDR64(__pdesc, __val) \ 509#define SET_RX_DESC_BUFF_ADDR64(__pdesc, __val) \
514 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 32, __val) 510 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 32, __val)
515 511
516#define CLEAR_PCI_TX_DESC_CONTENT(__pdesc, _size) \ 512#define CLEAR_PCI_TX_DESC_CONTENT(__pdesc, _size) \
517do { \ 513do { \
518 if (_size > TX_DESC_NEXT_DESC_OFFSET) \ 514 if (_size > TX_DESC_NEXT_DESC_OFFSET) \
519 memset(__pdesc, 0, TX_DESC_NEXT_DESC_OFFSET); \ 515 memset(__pdesc, 0, TX_DESC_NEXT_DESC_OFFSET); \
520 else \ 516 else \
521 memset(__pdesc, 0, _size); \ 517 memset(__pdesc, 0, _size); \
522} while (0) 518} while (0)
523 519
524struct rx_fwinfo_8723e { 520struct rx_fwinfo_8723e {
@@ -699,22 +695,27 @@ struct rx_desc_8723e {
699 695
700} __packed; 696} __packed;
701 697
702void rtl8723ae_tx_fill_desc(struct ieee80211_hw *hw, 698void rtl8723e_tx_fill_desc(struct ieee80211_hw *hw,
703 struct ieee80211_hdr *hdr, u8 *pdesc, 699 struct ieee80211_hdr *hdr,
704 u8 *pbd_desc_tx, struct ieee80211_tx_info *info, 700 u8 *pdesc, u8 *txbd,
705 struct ieee80211_sta *sta, 701 struct ieee80211_tx_info *info,
706 struct sk_buff *skb, u8 hw_queue, 702 struct ieee80211_sta *sta,
707 struct rtl_tcb_desc *ptcb_desc); 703 struct sk_buff *skb, u8 hw_queue,
708bool rtl8723ae_rx_query_desc(struct ieee80211_hw *hw, 704 struct rtl_tcb_desc *ptcb_desc);
709 struct rtl_stats *status, 705bool rtl8723e_rx_query_desc(struct ieee80211_hw *hw,
710 struct ieee80211_rx_status *rx_status, 706 struct rtl_stats *status,
711 u8 *pdesc, struct sk_buff *skb); 707 struct ieee80211_rx_status *rx_status,
712void rtl8723ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, 708 u8 *pdesc, struct sk_buff *skb);
713 u8 desc_name, u8 *val); 709void rtl8723e_set_desc(struct ieee80211_hw *hw,
714u32 rtl8723ae_get_desc(u8 *pdesc, bool istx, u8 desc_name); 710 u8 *pdesc, bool istx, u8 desc_name, u8 *val);
715void rtl8723ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); 711u32 rtl8723e_get_desc(u8 *pdesc, bool istx, u8 desc_name);
716void rtl8723ae_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, 712bool rtl8723e_is_tx_desc_closed(struct ieee80211_hw *hw,
717 bool b_firstseg, bool b_lastseg, 713 u8 hw_queue, u16 index);
714void rtl8723e_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
715void rtl8723e_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
716 bool firstseg, bool lastseg,
717 struct sk_buff *skb);
718u32 rtl8723e_rx_command_packet(struct ieee80211_hw *hw,
719 struct rtl_stats status,
718 struct sk_buff *skb); 720 struct sk_buff *skb);
719
720#endif 721#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/def.h b/drivers/net/wireless/rtlwifi/rtl8723be/def.h
index 3c30b74e983d..025ea5c0f3f6 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/def.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/def.h
@@ -26,158 +26,24 @@
26#ifndef __RTL8723BE_DEF_H__ 26#ifndef __RTL8723BE_DEF_H__
27#define __RTL8723BE_DEF_H__ 27#define __RTL8723BE_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 33
72#define RX_MPDU_QUEUE 0 34#define RX_MPDU_QUEUE 0
73#define RX_CMD_QUEUE 1 35#define CHIP_8723B (BIT(1) | BIT(2))
74#define RX_MAX_QUEUE 2 36#define NORMAL_CHIP BIT(3)
75#define AC2QUEUEID(_AC) (_AC) 37#define CHIP_VENDOR_SMIC BIT(8)
76 38/* Currently only for RTL8723B */
77#define C2H_RX_CMD_HDR_LEN 8 39#define EXT_VENDOR_ID (BIT(18) | BIT(19))
78#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
79 LE_BITS_TO_4BYTE((__prxhdr), 0, 16)
80#define GET_C2H_CMD_ELEMENT_ID(__prxhdr) \
81 LE_BITS_TO_4BYTE((__prxhdr), 16, 8)
82#define GET_C2H_CMD_CMD_SEQ(__prxhdr) \
83 LE_BITS_TO_4BYTE((__prxhdr), 24, 7)
84#define GET_C2H_CMD_CONTINUE(__prxhdr) \
85 LE_BITS_TO_4BYTE((__prxhdr), 31, 1)
86#define GET_C2H_CMD_CONTENT(__prxhdr) \
87 ((u8 *)(__prxhdr) + C2H_RX_CMD_HDR_LEN)
88
89#define GET_C2H_CMD_FEEDBACK_ELEMENT_ID(__pcmdfbhdr) \
90 LE_BITS_TO_4BYTE((__pcmdfbhdr), 0, 8)
91#define GET_C2H_CMD_FEEDBACK_CCX_LEN(__pcmdfbhdr) \
92 LE_BITS_TO_4BYTE((__pcmdfbhdr), 8, 8)
93#define GET_C2H_CMD_FEEDBACK_CCX_CMD_CNT(__pcmdfbhdr) \
94 LE_BITS_TO_4BYTE((__pcmdfbhdr), 16, 16)
95#define GET_C2H_CMD_FEEDBACK_CCX_MAC_ID(__pcmdfbhdr) \
96 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 0, 5)
97#define GET_C2H_CMD_FEEDBACK_CCX_VALID(__pcmdfbhdr) \
98 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 7, 1)
99#define GET_C2H_CMD_FEEDBACK_CCX_RETRY_CNT(__pcmdfbhdr) \
100 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 8, 5)
101#define GET_C2H_CMD_FEEDBACK_CCX_TOK(__pcmdfbhdr) \
102 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 15, 1)
103#define GET_C2H_CMD_FEEDBACK_CCX_QSEL(__pcmdfbhdr) \
104 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
105#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
106 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
107
108#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
109#define CHIP_BONDING_92C_1T2R 0x1
110
111#define CHIP_8723 BIT(0)
112#define CHIP_8723B (BIT(1) | BIT(2))
113#define NORMAL_CHIP BIT(3)
114#define RF_TYPE_1T1R (~(BIT(4) | BIT(5) | BIT(6)))
115#define RF_TYPE_1T2R BIT(4)
116#define RF_TYPE_2T2R BIT(5)
117#define CHIP_VENDOR_UMC BIT(7)
118#define B_CUT_VERSION BIT(12)
119#define C_CUT_VERSION BIT(13)
120#define D_CUT_VERSION ((BIT(12) | BIT(13)))
121#define E_CUT_VERSION BIT(14)
122#define RF_RL_ID (BIT(31) | BIT(30) | BIT(29) | BIT(28))
123
124/* MASK */
125#define IC_TYPE_MASK (BIT(0) | BIT(1) | BIT(2))
126#define CHIP_TYPE_MASK BIT(3)
127#define RF_TYPE_MASK (BIT(4) | BIT(5) | BIT(6))
128#define MANUFACTUER_MASK BIT(7)
129#define ROM_VERSION_MASK (BIT(11) | BIT(10) | BIT(9) | BIT(8))
130#define CUT_VERSION_MASK (BIT(15) | BIT(14) | BIT(13) | BIT(12))
131
132/* Get element */
133#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
134#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
135#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
136#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
137#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
138#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
139
140#define IS_92C_SERIAL(version) ((IS_81XXC(version) && IS_2T2R(version)) ?\
141 true : false)
142#define IS_81XXC(version) ((GET_CVID_IC_TYPE(version) == 0) ?\
143 true : false)
144#define IS_8723_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8723) ?\
145 true : false)
146#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version)) ? false : true)
147#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)\
148 ? true : false)
149#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)\
150 ? true : false)
151enum rf_optype {
152 RF_OP_BY_SW_3WIRE = 0,
153 RF_OP_BY_FW,
154 RF_OP_MAX
155};
156
157enum rf_power_state {
158 RF_ON,
159 RF_OFF,
160 RF_SLEEP,
161 RF_SHUT_DOWN,
162};
163
164enum power_save_mode {
165 POWER_SAVE_MODE_ACTIVE,
166 POWER_SAVE_MODE_SAVE,
167};
168 40
169enum power_polocy_config { 41enum rx_packet_type {
170 POWERCFG_MAX_POWER_SAVINGS, 42 NORMAL_RX,
171 POWERCFG_GLOBAL_POWER_SAVINGS, 43 TX_REPORT1,
172 POWERCFG_LOCAL_POWER_SAVINGS, 44 TX_REPORT2,
173 POWERCFG_LENOVO, 45 HIS_REPORT,
174}; 46 C2H_PACKET,
175
176enum interface_select_pci {
177 INTF_SEL1_MINICARD = 0,
178 INTF_SEL0_PCIE = 1,
179 INTF_SEL2_RSV = 2,
180 INTF_SEL3_RSV = 3,
181}; 47};
182 48
183enum rtl_desc_qsel { 49enum rtl_desc_qsel {
@@ -222,27 +88,5 @@ enum rtl_desc8723e_rate {
222 DESC92C_RATEMCS13 = 0x19, 88 DESC92C_RATEMCS13 = 0x19,
223 DESC92C_RATEMCS14 = 0x1a, 89 DESC92C_RATEMCS14 = 0x1a,
224 DESC92C_RATEMCS15 = 0x1b, 90 DESC92C_RATEMCS15 = 0x1b,
225 DESC92C_RATEMCS15_SG = 0x1c,
226 DESC92C_RATEMCS32 = 0x20,
227}; 91};
228
229enum rx_packet_type {
230 NORMAL_RX,
231 TX_REPORT1,
232 TX_REPORT2,
233 HIS_REPORT,
234};
235
236struct phy_sts_cck_8723e_t {
237 u8 adc_pwdb_X[4];
238 u8 sq_rpt;
239 u8 cck_agc_rpt;
240};
241
242struct h2c_cmd_8723e {
243 u8 element_id;
244 u32 cmd_len;
245 u8 *p_cmdbuffer;
246};
247
248#endif 92#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
index 13d53a1df789..dd7eb4371f49 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.c
@@ -32,7 +32,6 @@
32#include "dm.h" 32#include "dm.h"
33#include "../rtl8723com/dm_common.h" 33#include "../rtl8723com/dm_common.h"
34#include "fw.h" 34#include "fw.h"
35#include "../rtl8723com/fw_common.h"
36#include "trx.h" 35#include "trx.h"
37#include "../btcoexist/rtl_btc.h" 36#include "../btcoexist/rtl_btc.h"
38 37
@@ -209,7 +208,7 @@ void rtl8723be_dm_txpower_track_adjust(struct ieee80211_hw *hw, u8 type,
209 pwr_val = TXPWRTRACK_MAX_IDX; 208 pwr_val = TXPWRTRACK_MAX_IDX;
210 209
211 *poutwrite_val = pwr_val | (pwr_val << 8) | 210 *poutwrite_val = pwr_val | (pwr_val << 8) |
212 (pwr_val << 16) | (pwr_val << 24); 211 (pwr_val << 16) | (pwr_val << 24);
213} 212}
214 213
215static void rtl8723be_dm_diginit(struct ieee80211_hw *hw) 214static void rtl8723be_dm_diginit(struct ieee80211_hw *hw)
@@ -218,8 +217,7 @@ static void rtl8723be_dm_diginit(struct ieee80211_hw *hw)
218 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 217 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
219 218
220 dm_digtable->dig_enable_flag = true; 219 dm_digtable->dig_enable_flag = true;
221 dm_digtable->cur_igvalue = rtl_get_bbreg(hw, 220 dm_digtable->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
222 ROFDM0_XAAGCCORE1, 0x7f);
223 dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW; 221 dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
224 dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH; 222 dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
225 dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW; 223 dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
@@ -234,8 +232,8 @@ static void rtl8723be_dm_diginit(struct ieee80211_hw *hw)
234 dm_digtable->forbidden_igi = DM_DIG_MIN; 232 dm_digtable->forbidden_igi = DM_DIG_MIN;
235 dm_digtable->large_fa_hit = 0; 233 dm_digtable->large_fa_hit = 0;
236 dm_digtable->recover_cnt = 0; 234 dm_digtable->recover_cnt = 0;
237 dm_digtable->dig_min_0 = DM_DIG_MIN; 235 dm_digtable->dig_dynamic_min = DM_DIG_MIN;
238 dm_digtable->dig_min_1 = DM_DIG_MIN; 236 dm_digtable->dig_dynamic_min_1 = DM_DIG_MIN;
239 dm_digtable->media_connect_0 = false; 237 dm_digtable->media_connect_0 = false;
240 dm_digtable->media_connect_1 = false; 238 dm_digtable->media_connect_1 = false;
241 rtlpriv->dm.dm_initialgain_enable = true; 239 rtlpriv->dm.dm_initialgain_enable = true;
@@ -245,18 +243,18 @@ static void rtl8723be_dm_diginit(struct ieee80211_hw *hw)
245void rtl8723be_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw) 243void rtl8723be_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
246{ 244{
247 struct rtl_priv *rtlpriv = rtl_priv(hw); 245 struct rtl_priv *rtlpriv = rtl_priv(hw);
248 struct rate_adaptive *ra = &(rtlpriv->ra); 246 struct rate_adaptive *p_ra = &rtlpriv->ra;
249 247
250 ra->ratr_state = DM_RATR_STA_INIT; 248 p_ra->ratr_state = DM_RATR_STA_INIT;
251 ra->pre_ratr_state = DM_RATR_STA_INIT; 249 p_ra->pre_ratr_state = DM_RATR_STA_INIT;
252 250
253 if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER) 251 if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
254 rtlpriv->dm.useramask = true; 252 rtlpriv->dm.useramask = true;
255 else 253 else
256 rtlpriv->dm.useramask = false; 254 rtlpriv->dm.useramask = false;
257 255
258 ra->high_rssi_thresh_for_ra = 50; 256 p_ra->high_rssi_thresh_for_ra = 50;
259 ra->low_rssi_thresh_for_ra40m = 20; 257 p_ra->low_rssi_thresh_for_ra40m = 20;
260} 258}
261 259
262static void rtl8723be_dm_init_txpower_tracking(struct ieee80211_hw *hw) 260static void rtl8723be_dm_init_txpower_tracking(struct ieee80211_hw *hw)
@@ -279,7 +277,7 @@ static void rtl8723be_dm_init_txpower_tracking(struct ieee80211_hw *hw)
279 277
280 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 278 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
281 " rtlpriv->dm.txpower_tracking = %d\n", 279 " rtlpriv->dm.txpower_tracking = %d\n",
282 rtlpriv->dm.txpower_tracking); 280 rtlpriv->dm.txpower_tracking);
283} 281}
284 282
285static void rtl8723be_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw) 283static void rtl8723be_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw)
@@ -287,6 +285,7 @@ static void rtl8723be_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw)
287 struct rtl_priv *rtlpriv = rtl_priv(hw); 285 struct rtl_priv *rtlpriv = rtl_priv(hw);
288 286
289 rtlpriv->dm.crystal_cap = rtlpriv->efuse.crystalcap; 287 rtlpriv->dm.crystal_cap = rtlpriv->efuse.crystalcap;
288
290 rtlpriv->dm.atc_status = rtl_get_bbreg(hw, ROFDM1_CFOTRACKING, 0x800); 289 rtlpriv->dm.atc_status = rtl_get_bbreg(hw, ROFDM1_CFOTRACKING, 0x800);
291 rtlpriv->dm.cfo_threshold = CFO_THRESHOLD_XTAL; 290 rtlpriv->dm.cfo_threshold = CFO_THRESHOLD_XTAL;
292} 291}
@@ -308,7 +307,7 @@ void rtl8723be_dm_init(struct ieee80211_hw *hw)
308static void rtl8723be_dm_find_minimum_rssi(struct ieee80211_hw *hw) 307static void rtl8723be_dm_find_minimum_rssi(struct ieee80211_hw *hw)
309{ 308{
310 struct rtl_priv *rtlpriv = rtl_priv(hw); 309 struct rtl_priv *rtlpriv = rtl_priv(hw);
311 struct dig_t *rtl_dm_dig = &(rtlpriv->dm_digtable); 310 struct dig_t *rtl_dm_dig = &rtlpriv->dm_digtable;
312 struct rtl_mac *mac = rtl_mac(rtlpriv); 311 struct rtl_mac *mac = rtl_mac(rtlpriv);
313 312
314 /* Determine the minimum RSSI */ 313 /* Determine the minimum RSSI */
@@ -325,20 +324,20 @@ static void rtl8723be_dm_find_minimum_rssi(struct ieee80211_hw *hw)
325 rtlpriv->dm.entry_min_undec_sm_pwdb; 324 rtlpriv->dm.entry_min_undec_sm_pwdb;
326 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD, 325 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
327 "AP Client PWDB = 0x%lx\n", 326 "AP Client PWDB = 0x%lx\n",
328 rtlpriv->dm.entry_min_undec_sm_pwdb); 327 rtlpriv->dm.entry_min_undec_sm_pwdb);
329 } else { 328 } else {
330 rtl_dm_dig->min_undec_pwdb_for_dm = 329 rtl_dm_dig->min_undec_pwdb_for_dm =
331 rtlpriv->dm.undec_sm_pwdb; 330 rtlpriv->dm.undec_sm_pwdb;
332 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD, 331 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
333 "STA Default Port PWDB = 0x%x\n", 332 "STA Default Port PWDB = 0x%x\n",
334 rtl_dm_dig->min_undec_pwdb_for_dm); 333 rtl_dm_dig->min_undec_pwdb_for_dm);
335 } 334 }
336 } else { 335 } else {
337 rtl_dm_dig->min_undec_pwdb_for_dm = 336 rtl_dm_dig->min_undec_pwdb_for_dm =
338 rtlpriv->dm.entry_min_undec_sm_pwdb; 337 rtlpriv->dm.entry_min_undec_sm_pwdb;
339 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD, 338 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
340 "AP Ext Port or disconnet PWDB = 0x%x\n", 339 "AP Ext Port or disconnet PWDB = 0x%x\n",
341 rtl_dm_dig->min_undec_pwdb_for_dm); 340 rtl_dm_dig->min_undec_pwdb_for_dm);
342 } 341 }
343 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "MinUndecoratedPWDBForDM =%d\n", 342 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "MinUndecoratedPWDBForDM =%d\n",
344 rtl_dm_dig->min_undec_pwdb_for_dm); 343 rtl_dm_dig->min_undec_pwdb_for_dm);
@@ -347,6 +346,7 @@ static void rtl8723be_dm_find_minimum_rssi(struct ieee80211_hw *hw)
347static void rtl8723be_dm_check_rssi_monitor(struct ieee80211_hw *hw) 346static void rtl8723be_dm_check_rssi_monitor(struct ieee80211_hw *hw)
348{ 347{
349 struct rtl_priv *rtlpriv = rtl_priv(hw); 348 struct rtl_priv *rtlpriv = rtl_priv(hw);
349 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
350 struct rtl_sta_info *drv_priv; 350 struct rtl_sta_info *drv_priv;
351 u8 h2c_parameter[3] = { 0 }; 351 u8 h2c_parameter[3] = { 0 };
352 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff; 352 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff;
@@ -367,69 +367,78 @@ static void rtl8723be_dm_check_rssi_monitor(struct ieee80211_hw *hw)
367 367
368 /* If associated entry is found */ 368 /* If associated entry is found */
369 if (tmp_entry_max_pwdb != 0) { 369 if (tmp_entry_max_pwdb != 0) {
370 rtlpriv->dm.entry_max_undec_sm_pwdb = tmp_entry_max_pwdb; 370 rtlpriv->dm.entry_max_undec_sm_pwdb =
371 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 371 tmp_entry_max_pwdb;
372 "EntryMaxPWDB = 0x%lx(%ld)\n", 372 RTPRINT(rtlpriv, FDM, DM_PWDB,
373 "EntryMaxPWDB = 0x%lx(%ld)\n",
373 tmp_entry_max_pwdb, tmp_entry_max_pwdb); 374 tmp_entry_max_pwdb, tmp_entry_max_pwdb);
374 } else { 375 } else {
375 rtlpriv->dm.entry_max_undec_sm_pwdb = 0; 376 rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
376 } 377 }
377 /* If associated entry is found */ 378 /* If associated entry is found */
378 if (tmp_entry_min_pwdb != 0xff) { 379 if (tmp_entry_min_pwdb != 0xff) {
379 rtlpriv->dm.entry_min_undec_sm_pwdb = tmp_entry_min_pwdb; 380 rtlpriv->dm.entry_min_undec_sm_pwdb =
380 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 381 tmp_entry_min_pwdb;
381 "EntryMinPWDB = 0x%lx(%ld)\n", 382 RTPRINT(rtlpriv, FDM, DM_PWDB,
383 "EntryMinPWDB = 0x%lx(%ld)\n",
382 tmp_entry_min_pwdb, tmp_entry_min_pwdb); 384 tmp_entry_min_pwdb, tmp_entry_min_pwdb);
383 } else { 385 } else {
384 rtlpriv->dm.entry_min_undec_sm_pwdb = 0; 386 rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
385 } 387 }
386 /* Indicate Rx signal strength to FW. */ 388 /* Indicate Rx signal strength to FW. */
387 if (rtlpriv->dm.useramask) { 389 if (rtlpriv->dm.useramask) {
388 h2c_parameter[2] = (u8) (rtlpriv->dm.undec_sm_pwdb & 0xFF); 390 h2c_parameter[2] =
391 (u8)(rtlpriv->dm.undec_sm_pwdb & 0xFF);
389 h2c_parameter[1] = 0x20; 392 h2c_parameter[1] = 0x20;
390 h2c_parameter[0] = 0; 393 h2c_parameter[0] = 0;
391 rtl8723be_fill_h2c_cmd(hw, H2C_RSSI_REPORT, 3, h2c_parameter); 394 rtl8723be_fill_h2c_cmd(hw, H2C_RSSIBE_REPORT, 3, h2c_parameter);
392 } else { 395 } else {
393 rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb); 396 rtl_write_byte(rtlpriv, 0x4fe,
397 rtlpriv->dm.undec_sm_pwdb);
394 } 398 }
395 rtl8723be_dm_find_minimum_rssi(hw); 399 rtl8723be_dm_find_minimum_rssi(hw);
396 rtlpriv->dm_digtable.rssi_val_min = 400 dm_digtable->rssi_val_min =
397 rtlpriv->dm_digtable.min_undec_pwdb_for_dm; 401 rtlpriv->dm_digtable.min_undec_pwdb_for_dm;
398} 402}
399 403
400void rtl8723be_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi) 404void rtl8723be_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi)
401{ 405{
402 struct rtl_priv *rtlpriv = rtl_priv(hw); 406 struct rtl_priv *rtlpriv = rtl_priv(hw);
407 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
403 408
404 if (rtlpriv->dm_digtable.cur_igvalue != current_igi) { 409 if (dm_digtable->stop_dig)
410 return;
411
412 if (dm_digtable->cur_igvalue != current_igi) {
405 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, current_igi); 413 rtl_set_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f, current_igi);
406 if (rtlpriv->phy.rf_type != RF_1T1R) 414 if (rtlpriv->phy.rf_type != RF_1T1R)
407 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1, 0x7f, current_igi); 415 rtl_set_bbreg(hw, ROFDM0_XBAGCCORE1,
416 0x7f, current_igi);
408 } 417 }
409 rtlpriv->dm_digtable.pre_igvalue = rtlpriv->dm_digtable.cur_igvalue; 418 dm_digtable->pre_igvalue = dm_digtable->cur_igvalue;
410 rtlpriv->dm_digtable.cur_igvalue = current_igi; 419 dm_digtable->cur_igvalue = current_igi;
411} 420}
412 421
413static void rtl8723be_dm_dig(struct ieee80211_hw *hw) 422static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
414{ 423{
415 struct rtl_priv *rtlpriv = rtl_priv(hw); 424 struct rtl_priv *rtlpriv = rtl_priv(hw);
425 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
416 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 426 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
417 struct dig_t *dm_digtable = &(rtlpriv->dm_digtable);
418 u8 dig_dynamic_min, dig_maxofmin; 427 u8 dig_dynamic_min, dig_maxofmin;
419 bool firstconnect, firstdisconnect; 428 bool bfirstconnect, bfirstdisconnect;
420 u8 dm_dig_max, dm_dig_min; 429 u8 dm_dig_max, dm_dig_min;
421 u8 current_igi = dm_digtable->cur_igvalue; 430 u8 current_igi = dm_digtable->cur_igvalue;
422 u8 offset; 431 u8 offset;
423 432
424 /* AP, BT */ 433 /* AP,BT */
425 if (mac->act_scanning) 434 if (mac->act_scanning)
426 return; 435 return;
427 436
428 dig_dynamic_min = dm_digtable->dig_min_0; 437 dig_dynamic_min = dm_digtable->dig_dynamic_min;
429 firstconnect = (mac->link_state >= MAC80211_LINKED) && 438 bfirstconnect = (mac->link_state >= MAC80211_LINKED) &&
430 !dm_digtable->media_connect_0; 439 !dm_digtable->media_connect_0;
431 firstdisconnect = (mac->link_state < MAC80211_LINKED) && 440 bfirstdisconnect = (mac->link_state < MAC80211_LINKED) &&
432 dm_digtable->media_connect_0; 441 (dm_digtable->media_connect_0);
433 442
434 dm_dig_max = 0x5a; 443 dm_dig_max = 0x5a;
435 dm_dig_min = DM_DIG_MIN; 444 dm_dig_min = DM_DIG_MIN;
@@ -457,6 +466,7 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
457 } else { 466 } else {
458 dig_dynamic_min = dm_dig_min; 467 dig_dynamic_min = dm_dig_min;
459 } 468 }
469
460 } else { 470 } else {
461 dm_digtable->rx_gain_max = dm_dig_max; 471 dm_digtable->rx_gain_max = dm_dig_max;
462 dig_dynamic_min = dm_dig_min; 472 dig_dynamic_min = dm_dig_min;
@@ -506,7 +516,7 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
506 dm_digtable->rx_gain_min = dm_digtable->rx_gain_max; 516 dm_digtable->rx_gain_min = dm_digtable->rx_gain_max;
507 517
508 if (mac->link_state >= MAC80211_LINKED) { 518 if (mac->link_state >= MAC80211_LINKED) {
509 if (firstconnect) { 519 if (bfirstconnect) {
510 if (dm_digtable->rssi_val_min <= dig_maxofmin) 520 if (dm_digtable->rssi_val_min <= dig_maxofmin)
511 current_igi = dm_digtable->rssi_val_min; 521 current_igi = dm_digtable->rssi_val_min;
512 else 522 else
@@ -522,7 +532,7 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
522 current_igi -= 2; 532 current_igi -= 2;
523 } 533 }
524 } else { 534 } else {
525 if (firstdisconnect) { 535 if (bfirstdisconnect) {
526 current_igi = dm_digtable->rx_gain_min; 536 current_igi = dm_digtable->rx_gain_min;
527 } else { 537 } else {
528 if (rtlpriv->falsealm_cnt.cnt_all > 10000) 538 if (rtlpriv->falsealm_cnt.cnt_all > 10000)
@@ -542,14 +552,15 @@ static void rtl8723be_dm_dig(struct ieee80211_hw *hw)
542 rtl8723be_dm_write_dig(hw, current_igi); 552 rtl8723be_dm_write_dig(hw, current_igi);
543 dm_digtable->media_connect_0 = 553 dm_digtable->media_connect_0 =
544 ((mac->link_state >= MAC80211_LINKED) ? true : false); 554 ((mac->link_state >= MAC80211_LINKED) ? true : false);
545 dm_digtable->dig_min_0 = dig_dynamic_min; 555 dm_digtable->dig_dynamic_min = dig_dynamic_min;
546} 556}
547 557
548static void rtl8723be_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw) 558static void rtl8723be_dm_false_alarm_counter_statistics(
559 struct ieee80211_hw *hw)
549{ 560{
550 u32 ret_value; 561 u32 ret_value;
551 struct rtl_priv *rtlpriv = rtl_priv(hw); 562 struct rtl_priv *rtlpriv = rtl_priv(hw);
552 struct false_alarm_statistics *falsealm_cnt = &(rtlpriv->falsealm_cnt); 563 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
553 564
554 rtl_set_bbreg(hw, DM_REG_OFDM_FA_HOLDC_11N, BIT(31), 1); 565 rtl_set_bbreg(hw, DM_REG_OFDM_FA_HOLDC_11N, BIT(31), 1);
555 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTD_11N, BIT(31), 1); 566 rtl_set_bbreg(hw, DM_REG_OFDM_FA_RSTD_11N, BIT(31), 1);
@@ -615,16 +626,14 @@ static void rtl8723be_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
615 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(15) | BIT(14), 2); 626 rtl_set_bbreg(hw, DM_REG_CCK_FA_RST_11N, BIT(15) | BIT(14), 2);
616 627
617 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 628 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
618 "cnt_parity_fail = %d, cnt_rate_illegal = %d, " 629 "cnt_parity_fail = %d, cnt_rate_illegal = %d, cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
619 "cnt_crc8_fail = %d, cnt_mcs_fail = %d\n",
620 falsealm_cnt->cnt_parity_fail, 630 falsealm_cnt->cnt_parity_fail,
621 falsealm_cnt->cnt_rate_illegal, 631 falsealm_cnt->cnt_rate_illegal,
622 falsealm_cnt->cnt_crc8_fail, 632 falsealm_cnt->cnt_crc8_fail,
623 falsealm_cnt->cnt_mcs_fail); 633 falsealm_cnt->cnt_mcs_fail);
624 634
625 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 635 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
626 "cnt_ofdm_fail = %x, cnt_cck_fail = %x," 636 "cnt_ofdm_fail = %x, cnt_cck_fail = %x, cnt_all = %x\n",
627 " cnt_all = %x\n",
628 falsealm_cnt->cnt_ofdm_fail, 637 falsealm_cnt->cnt_ofdm_fail,
629 falsealm_cnt->cnt_cck_fail, 638 falsealm_cnt->cnt_cck_fail,
630 falsealm_cnt->cnt_all); 639 falsealm_cnt->cnt_all);
@@ -690,7 +699,7 @@ static void rtl8723be_dm_tx_power_track_set_power(struct ieee80211_hw *hw,
690 u8 rfpath, u8 idx) 699 u8 rfpath, u8 idx)
691{ 700{
692 struct rtl_priv *rtlpriv = rtl_priv(hw); 701 struct rtl_priv *rtlpriv = rtl_priv(hw);
693 struct rtl_phy *rtlphy = &(rtlpriv->phy); 702 struct rtl_phy *rtlphy = &rtlpriv->phy;
694 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 703 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
695 u8 swing_idx_ofdm_limit = 36; 704 u8 swing_idx_ofdm_limit = 36;
696 705
@@ -762,7 +771,8 @@ static void rtl8723be_dm_tx_power_track_set_power(struct ieee80211_hw *hw,
762 } 771 }
763} 772}
764 773
765static void txpwr_track_cb_therm(struct ieee80211_hw *hw) 774static void rtl8723be_dm_txpower_tracking_callback_thermalmeter(
775 struct ieee80211_hw *hw)
766{ 776{
767 struct rtl_priv *rtlpriv = rtl_priv(hw); 777 struct rtl_priv *rtlpriv = rtl_priv(hw);
768 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 778 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
@@ -773,30 +783,29 @@ static void txpwr_track_cb_therm(struct ieee80211_hw *hw)
773 int i = 0; 783 int i = 0;
774 784
775 u8 ofdm_min_index = 6; 785 u8 ofdm_min_index = 6;
776 u8 index = 0; 786 u8 index_for_channel = 0;
777 787
778 char delta_swing_table_idx_tup_a[] = { 788 char delta_swing_table_idx_tup_a[TXSCALE_TABLE_SIZE] = {
779 0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 789 0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5,
780 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 790 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10,
781 10, 11, 11, 12, 12, 13, 14, 15}; 791 10, 11, 11, 12, 12, 13, 14, 15};
782 char delta_swing_table_idx_tdown_a[] = { 792 char delta_swing_table_idx_tdown_a[TXSCALE_TABLE_SIZE] = {
783 0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5, 793 0, 0, 1, 2, 2, 2, 3, 3, 3, 4, 5,
784 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9, 794 5, 6, 6, 6, 6, 7, 7, 7, 8, 8, 9,
785 9, 10, 10, 11, 12, 13, 14, 15}; 795 9, 10, 10, 11, 12, 13, 14, 15};
786 796
787 /*Initilization ( 7 steps in total)*/ 797 /*Initilization ( 7 steps in total )*/
788 rtlpriv->dm.txpower_trackinginit = true; 798 rtlpriv->dm.txpower_trackinginit = true;
789 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 799 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
790 "rtl8723be_dm_txpower_tracking" 800 "rtl8723be_dm_txpower_tracking_callback_thermalmeter\n");
791 "_callback_thermalmeter\n");
792 801
793 thermalvalue = (u8)rtl_get_rfreg(hw, RF90_PATH_A, RF_T_METER, 0xfc00); 802 thermalvalue = (u8)rtl_get_rfreg(hw,
803 RF90_PATH_A, RF_T_METER, 0xfc00);
794 if (!rtlpriv->dm.txpower_track_control || thermalvalue == 0 || 804 if (!rtlpriv->dm.txpower_track_control || thermalvalue == 0 ||
795 rtlefuse->eeprom_thermalmeter == 0xFF) 805 rtlefuse->eeprom_thermalmeter == 0xFF)
796 return; 806 return;
797 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 807 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
798 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x " 808 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x\n",
799 "eeprom_thermalmeter 0x%x\n",
800 thermalvalue, rtldm->thermalvalue, 809 thermalvalue, rtldm->thermalvalue,
801 rtlefuse->eeprom_thermalmeter); 810 rtlefuse->eeprom_thermalmeter);
802 /*3 Initialize ThermalValues of RFCalibrateInfo*/ 811 /*3 Initialize ThermalValues of RFCalibrateInfo*/
@@ -833,9 +842,7 @@ static void txpwr_track_cb_therm(struct ieee80211_hw *hw)
833 (rtlpriv->dm.thermalvalue_iqk - thermalvalue); 842 (rtlpriv->dm.thermalvalue_iqk - thermalvalue);
834 843
835 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 844 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
836 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x " 845 "Readback Thermal Meter = 0x%x pre thermal meter 0x%x eeprom_thermalmeter 0x%x delta 0x%x delta_lck 0x%x delta_iqk 0x%x\n",
837 "eeprom_thermalmeter 0x%x delta 0x%x "
838 "delta_lck 0x%x delta_iqk 0x%x\n",
839 thermalvalue, rtlpriv->dm.thermalvalue, 846 thermalvalue, rtlpriv->dm.thermalvalue,
840 rtlefuse->eeprom_thermalmeter, delta, delta_lck, delta_iqk); 847 rtlefuse->eeprom_thermalmeter, delta, delta_lck, delta_iqk);
841 /* 6 If necessary, do LCK.*/ 848 /* 6 If necessary, do LCK.*/
@@ -905,10 +912,10 @@ static void txpwr_track_cb_therm(struct ieee80211_hw *hw)
905 rtldm->done_txpower = true; 912 rtldm->done_txpower = true;
906 if (thermalvalue > rtlefuse->eeprom_thermalmeter) 913 if (thermalvalue > rtlefuse->eeprom_thermalmeter)
907 rtl8723be_dm_tx_power_track_set_power(hw, BBSWING, 0, 914 rtl8723be_dm_tx_power_track_set_power(hw, BBSWING, 0,
908 index); 915 index_for_channel);
909 else 916 else
910 rtl8723be_dm_tx_power_track_set_power(hw, BBSWING, 0, 917 rtl8723be_dm_tx_power_track_set_power(hw, BBSWING, 0,
911 index); 918 index_for_channel);
912 919
913 rtldm->swing_idx_cck_base = rtldm->swing_idx_cck; 920 rtldm->swing_idx_cck_base = rtldm->swing_idx_cck;
914 rtldm->swing_idx_ofdm_base[RF90_PATH_A] = 921 rtldm->swing_idx_ofdm_base[RF90_PATH_A] =
@@ -923,6 +930,7 @@ static void txpwr_track_cb_therm(struct ieee80211_hw *hw)
923 930
924 rtldm->txpowercount = 0; 931 rtldm->txpowercount = 0;
925 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "end\n"); 932 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "end\n");
933
926} 934}
927 935
928void rtl8723be_dm_check_txpower_tracking(struct ieee80211_hw *hw) 936void rtl8723be_dm_check_txpower_tracking(struct ieee80211_hw *hw)
@@ -943,7 +951,7 @@ void rtl8723be_dm_check_txpower_tracking(struct ieee80211_hw *hw)
943 } else { 951 } else {
944 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 952 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
945 "Schedule TxPowerTracking !!\n"); 953 "Schedule TxPowerTracking !!\n");
946 txpwr_track_cb_therm(hw); 954 rtl8723be_dm_txpower_tracking_callback_thermalmeter(hw);
947 tm_trigger = 0; 955 tm_trigger = 0;
948 } 956 }
949} 957}
@@ -953,11 +961,11 @@ static void rtl8723be_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
953 struct rtl_priv *rtlpriv = rtl_priv(hw); 961 struct rtl_priv *rtlpriv = rtl_priv(hw);
954 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 962 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
955 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 963 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
956 struct rate_adaptive *ra = &(rtlpriv->ra); 964 struct rate_adaptive *p_ra = &rtlpriv->ra;
957 struct ieee80211_sta *sta = NULL; 965 u32 low_rssithresh_for_ra = p_ra->low2high_rssi_thresh_for_ra40m;
958 u32 low_rssithresh_for_ra = ra->low2high_rssi_thresh_for_ra40m; 966 u32 high_rssithresh_for_ra = p_ra->high_rssi_thresh_for_ra;
959 u32 high_rssithresh_for_ra = ra->high_rssi_thresh_for_ra;
960 u8 go_up_gap = 5; 967 u8 go_up_gap = 5;
968 struct ieee80211_sta *sta = NULL;
961 969
962 if (is_hal_stop(rtlhal)) { 970 if (is_hal_stop(rtlhal)) {
963 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 971 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
@@ -972,8 +980,8 @@ static void rtl8723be_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
972 } 980 }
973 981
974 if (mac->link_state == MAC80211_LINKED && 982 if (mac->link_state == MAC80211_LINKED &&
975 mac->opmode == NL80211_IFTYPE_STATION) { 983 mac->opmode == NL80211_IFTYPE_STATION) {
976 switch (ra->pre_ratr_state) { 984 switch (p_ra->pre_ratr_state) {
977 case DM_RATR_STA_MIDDLE: 985 case DM_RATR_STA_MIDDLE:
978 high_rssithresh_for_ra += go_up_gap; 986 high_rssithresh_for_ra += go_up_gap;
979 break; 987 break;
@@ -987,31 +995,31 @@ static void rtl8723be_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
987 995
988 if (rtlpriv->dm.undec_sm_pwdb > 996 if (rtlpriv->dm.undec_sm_pwdb >
989 (long)high_rssithresh_for_ra) 997 (long)high_rssithresh_for_ra)
990 ra->ratr_state = DM_RATR_STA_HIGH; 998 p_ra->ratr_state = DM_RATR_STA_HIGH;
991 else if (rtlpriv->dm.undec_sm_pwdb > 999 else if (rtlpriv->dm.undec_sm_pwdb >
992 (long)low_rssithresh_for_ra) 1000 (long)low_rssithresh_for_ra)
993 ra->ratr_state = DM_RATR_STA_MIDDLE; 1001 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
994 else 1002 else
995 ra->ratr_state = DM_RATR_STA_LOW; 1003 p_ra->ratr_state = DM_RATR_STA_LOW;
996 1004
997 if (ra->pre_ratr_state != ra->ratr_state) { 1005 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
998 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1006 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
999 "RSSI = %ld\n", 1007 "RSSI = %ld\n",
1000 rtlpriv->dm.undec_sm_pwdb); 1008 rtlpriv->dm.undec_sm_pwdb);
1001 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1009 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1002 "RSSI_LEVEL = %d\n", ra->ratr_state); 1010 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
1003 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD, 1011 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
1004 "PreState = %d, CurState = %d\n", 1012 "PreState = %d, CurState = %d\n",
1005 ra->pre_ratr_state, ra->ratr_state); 1013 p_ra->pre_ratr_state, p_ra->ratr_state);
1006 1014
1007 rcu_read_lock(); 1015 rcu_read_lock();
1008 sta = rtl_find_sta(hw, mac->bssid); 1016 sta = rtl_find_sta(hw, mac->bssid);
1009 if (sta) 1017 if (sta)
1010 rtlpriv->cfg->ops->update_rate_tbl(hw, sta, 1018 rtlpriv->cfg->ops->update_rate_tbl(hw, sta,
1011 ra->ratr_state); 1019 p_ra->ratr_state);
1012 rcu_read_unlock(); 1020 rcu_read_unlock();
1013 1021
1014 ra->pre_ratr_state = ra->ratr_state; 1022 p_ra->pre_ratr_state = p_ra->ratr_state;
1015 } 1023 }
1016 } 1024 }
1017} 1025}
@@ -1020,10 +1028,6 @@ static bool rtl8723be_dm_is_edca_turbo_disable(struct ieee80211_hw *hw)
1020{ 1028{
1021 struct rtl_priv *rtlpriv = rtl_priv(hw); 1029 struct rtl_priv *rtlpriv = rtl_priv(hw);
1022 1030
1023 if (rtlpriv->cfg->ops->get_btc_status()) {
1024 if (rtlpriv->btcoexist.btc_ops->btc_is_disable_edca_turbo(rtlpriv))
1025 return true;
1026 }
1027 if (rtlpriv->mac80211.mode == WIRELESS_MODE_B) 1031 if (rtlpriv->mac80211.mode == WIRELESS_MODE_B)
1028 return true; 1032 return true;
1029 1033
@@ -1034,6 +1038,7 @@ static void rtl8723be_dm_check_edca_turbo(struct ieee80211_hw *hw)
1034{ 1038{
1035 struct rtl_priv *rtlpriv = rtl_priv(hw); 1039 struct rtl_priv *rtlpriv = rtl_priv(hw);
1036 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1040 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1041
1037 static u64 last_txok_cnt; 1042 static u64 last_txok_cnt;
1038 static u64 last_rxok_cnt; 1043 static u64 last_rxok_cnt;
1039 u64 cur_txok_cnt = 0; 1044 u64 cur_txok_cnt = 0;
@@ -1042,22 +1047,22 @@ static void rtl8723be_dm_check_edca_turbo(struct ieee80211_hw *hw)
1042 u32 edca_be_dl = 0x6ea42b;/*not sure*/ 1047 u32 edca_be_dl = 0x6ea42b;/*not sure*/
1043 u32 edca_be = 0x5ea42b; 1048 u32 edca_be = 0x5ea42b;
1044 u32 iot_peer = 0; 1049 u32 iot_peer = 0;
1045 bool is_cur_rdlstate; 1050 bool b_is_cur_rdlstate;
1046 bool last_is_cur_rdlstate = false; 1051 bool b_last_is_cur_rdlstate = false;
1047 bool bias_on_rx = false; 1052 bool b_bias_on_rx = false;
1048 bool edca_turbo_on = false; 1053 bool b_edca_turbo_on = false;
1049 1054
1050 last_is_cur_rdlstate = rtlpriv->dm.is_cur_rdlstate; 1055 b_last_is_cur_rdlstate = rtlpriv->dm.is_cur_rdlstate;
1051 1056
1052 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt; 1057 cur_txok_cnt = rtlpriv->stats.txbytesunicast - last_txok_cnt;
1053 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt; 1058 cur_rxok_cnt = rtlpriv->stats.rxbytesunicast - last_rxok_cnt;
1054 1059
1055 iot_peer = rtlpriv->mac80211.vendor; 1060 iot_peer = rtlpriv->mac80211.vendor;
1056 bias_on_rx = (iot_peer == PEER_RAL || iot_peer == PEER_ATH) ? 1061 b_bias_on_rx = (iot_peer == PEER_RAL || iot_peer == PEER_ATH) ?
1057 true : false; 1062 true : false;
1058 edca_turbo_on = ((!rtlpriv->dm.is_any_nonbepkts) && 1063 b_edca_turbo_on = ((!rtlpriv->dm.is_any_nonbepkts) &&
1059 (!rtlpriv->dm.disable_framebursting)) ? 1064 (!rtlpriv->dm.disable_framebursting)) ?
1060 true : false; 1065 true : false;
1061 1066
1062 if ((iot_peer == PEER_CISCO) && 1067 if ((iot_peer == PEER_CISCO) &&
1063 (mac->mode == WIRELESS_MODE_N_24G)) { 1068 (mac->mode == WIRELESS_MODE_N_24G)) {
@@ -1067,23 +1072,23 @@ static void rtl8723be_dm_check_edca_turbo(struct ieee80211_hw *hw)
1067 if (rtl8723be_dm_is_edca_turbo_disable(hw)) 1072 if (rtl8723be_dm_is_edca_turbo_disable(hw))
1068 goto exit; 1073 goto exit;
1069 1074
1070 if (edca_turbo_on) { 1075 if (b_edca_turbo_on) {
1071 if (bias_on_rx) 1076 if (b_bias_on_rx)
1072 is_cur_rdlstate = (cur_txok_cnt > cur_rxok_cnt * 4) ? 1077 b_is_cur_rdlstate = (cur_txok_cnt > cur_rxok_cnt * 4) ?
1073 false : true; 1078 false : true;
1074 else 1079 else
1075 is_cur_rdlstate = (cur_rxok_cnt > cur_txok_cnt * 4) ? 1080 b_is_cur_rdlstate = (cur_rxok_cnt > cur_txok_cnt * 4) ?
1076 true : false; 1081 true : false;
1077 1082
1078 edca_be = (is_cur_rdlstate) ? edca_be_dl : edca_be_ul; 1083 edca_be = (b_is_cur_rdlstate) ? edca_be_dl : edca_be_ul;
1079 rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, edca_be); 1084 rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, edca_be);
1080 rtlpriv->dm.is_cur_rdlstate = is_cur_rdlstate; 1085 rtlpriv->dm.is_cur_rdlstate = b_is_cur_rdlstate;
1081 rtlpriv->dm.current_turbo_edca = true; 1086 rtlpriv->dm.current_turbo_edca = true;
1082 } else { 1087 } else {
1083 if (rtlpriv->dm.current_turbo_edca) { 1088 if (rtlpriv->dm.current_turbo_edca) {
1084 u8 tmp = AC0_BE; 1089 u8 tmp = AC0_BE;
1085 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, 1090 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
1086 &tmp); 1091 (u8 *)(&tmp));
1087 } 1092 }
1088 rtlpriv->dm.current_turbo_edca = false; 1093 rtlpriv->dm.current_turbo_edca = false;
1089 } 1094 }
@@ -1097,13 +1102,14 @@ exit:
1097static void rtl8723be_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw) 1102static void rtl8723be_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
1098{ 1103{
1099 struct rtl_priv *rtlpriv = rtl_priv(hw); 1104 struct rtl_priv *rtlpriv = rtl_priv(hw);
1105 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
1100 u8 cur_cck_cca_thresh; 1106 u8 cur_cck_cca_thresh;
1101 1107
1102 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) { 1108 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
1103 if (rtlpriv->dm_digtable.rssi_val_min > 25) { 1109 if (dm_digtable->rssi_val_min > 25) {
1104 cur_cck_cca_thresh = 0xcd; 1110 cur_cck_cca_thresh = 0xcd;
1105 } else if ((rtlpriv->dm_digtable.rssi_val_min <= 25) && 1111 } else if ((dm_digtable->rssi_val_min <= 25) &&
1106 (rtlpriv->dm_digtable.rssi_val_min > 10)) { 1112 (dm_digtable->rssi_val_min > 10)) {
1107 cur_cck_cca_thresh = 0x83; 1113 cur_cck_cca_thresh = 0x83;
1108 } else { 1114 } else {
1109 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000) 1115 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
@@ -1118,14 +1124,13 @@ static void rtl8723be_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
1118 cur_cck_cca_thresh = 0x40; 1124 cur_cck_cca_thresh = 0x40;
1119 } 1125 }
1120 1126
1121 if (rtlpriv->dm_digtable.cur_cck_cca_thres != cur_cck_cca_thresh) 1127 if (dm_digtable->cur_cck_cca_thres != cur_cck_cca_thresh)
1122 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, cur_cck_cca_thresh); 1128 rtl_set_bbreg(hw, RCCK0_CCA, MASKBYTE2, cur_cck_cca_thresh);
1123 1129
1124 rtlpriv->dm_digtable.pre_cck_cca_thres = rtlpriv->dm_digtable.cur_cck_cca_thres; 1130 dm_digtable->pre_cck_cca_thres = dm_digtable->cur_cck_cca_thres;
1125 rtlpriv->dm_digtable.cur_cck_cca_thres = cur_cck_cca_thresh; 1131 dm_digtable->cur_cck_cca_thres = cur_cck_cca_thresh;
1126 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE, 1132 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
1127 "CCK cca thresh hold =%x\n", 1133 "CCK cca thresh hold =%x\n", dm_digtable->cur_cck_cca_thres);
1128 rtlpriv->dm_digtable.cur_cck_cca_thres);
1129} 1134}
1130 1135
1131static void rtl8723be_dm_dynamic_edcca(struct ieee80211_hw *hw) 1136static void rtl8723be_dm_dynamic_edcca(struct ieee80211_hw *hw)
@@ -1173,8 +1178,7 @@ static void rtl8723be_dm_dynamic_atc_switch(struct ieee80211_hw *hw)
1173 if (rtlpriv->cfg->ops->get_btc_status()) { 1178 if (rtlpriv->cfg->ops->get_btc_status()) {
1174 if (!rtlpriv->btcoexist.btc_ops->btc_is_bt_disabled(rtlpriv)) { 1179 if (!rtlpriv->btcoexist.btc_ops->btc_is_bt_disabled(rtlpriv)) {
1175 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 1180 RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
1176 "odm_DynamicATCSwitch(): Disable" 1181 "odm_DynamicATCSwitch(): Disable CFO tracking for BT!!\n");
1177 " CFO tracking for BT!!\n");
1178 return; 1182 return;
1179 } 1183 }
1180 } 1184 }
@@ -1207,9 +1211,8 @@ static void rtl8723be_dm_dynamic_atc_switch(struct ieee80211_hw *hw)
1207 if (cfo_ave_diff > 20 && rtldm->large_cfo_hit == 0) { 1211 if (cfo_ave_diff > 20 && rtldm->large_cfo_hit == 0) {
1208 rtldm->large_cfo_hit = 1; 1212 rtldm->large_cfo_hit = 1;
1209 return; 1213 return;
1210 } else { 1214 } else
1211 rtldm->large_cfo_hit = 0; 1215 rtldm->large_cfo_hit = 0;
1212 }
1213 1216
1214 rtldm->cfo_ave_pre = cfo_ave; 1217 rtldm->cfo_ave_pre = cfo_ave;
1215 1218
@@ -1263,20 +1266,20 @@ static void rtl8723be_dm_dynamic_atc_switch(struct ieee80211_hw *hw)
1263static void rtl8723be_dm_common_info_self_update(struct ieee80211_hw *hw) 1266static void rtl8723be_dm_common_info_self_update(struct ieee80211_hw *hw)
1264{ 1267{
1265 struct rtl_priv *rtlpriv = rtl_priv(hw); 1268 struct rtl_priv *rtlpriv = rtl_priv(hw);
1266 struct rtl_sta_info *drv_priv;
1267 u8 cnt = 0; 1269 u8 cnt = 0;
1270 struct rtl_sta_info *drv_priv;
1268 1271
1269 rtlpriv->dm.one_entry_only = false; 1272 rtlpriv->dm.one_entry_only = false;
1270 1273
1271 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_STATION && 1274 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_STATION &&
1272 rtlpriv->mac80211.link_state >= MAC80211_LINKED) { 1275 rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
1273 rtlpriv->dm.one_entry_only = true; 1276 rtlpriv->dm.one_entry_only = true;
1274 return; 1277 return;
1275 } 1278 }
1276 1279
1277 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP || 1280 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
1278 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC || 1281 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC ||
1279 rtlpriv->mac80211.opmode == NL80211_IFTYPE_MESH_POINT) { 1282 rtlpriv->mac80211.opmode == NL80211_IFTYPE_MESH_POINT) {
1280 spin_lock_bh(&rtlpriv->locks.entry_list_lock); 1283 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1281 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) { 1284 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
1282 cnt++; 1285 cnt++;
@@ -1305,8 +1308,8 @@ void rtl8723be_dm_watchdog(struct ieee80211_hw *hw)
1305 fw_ps_awake = false; 1308 fw_ps_awake = false;
1306 1309
1307 if ((ppsc->rfpwr_state == ERFON) && 1310 if ((ppsc->rfpwr_state == ERFON) &&
1308 ((!fw_current_inpsmode) && fw_ps_awake) && 1311 ((!fw_current_inpsmode) && fw_ps_awake) &&
1309 (!ppsc->rfchange_inprogress)) { 1312 (!ppsc->rfchange_inprogress)) {
1310 rtl8723be_dm_common_info_self_update(hw); 1313 rtl8723be_dm_common_info_self_update(hw);
1311 rtl8723be_dm_false_alarm_counter_statistics(hw); 1314 rtl8723be_dm_false_alarm_counter_statistics(hw);
1312 rtl8723be_dm_check_rssi_monitor(hw); 1315 rtl8723be_dm_check_rssi_monitor(hw);
@@ -1318,8 +1321,6 @@ void rtl8723be_dm_watchdog(struct ieee80211_hw *hw)
1318 rtl8723be_dm_dynamic_atc_switch(hw); 1321 rtl8723be_dm_dynamic_atc_switch(hw);
1319 rtl8723be_dm_check_txpower_tracking(hw); 1322 rtl8723be_dm_check_txpower_tracking(hw);
1320 rtl8723be_dm_dynamic_txpower(hw); 1323 rtl8723be_dm_dynamic_txpower(hw);
1321 if (rtlpriv->cfg->ops->get_btc_status())
1322 rtlpriv->btcoexist.btc_ops->btc_periodical(rtlpriv);
1323 } 1324 }
1324 rtlpriv->dm.dbginfo.num_qry_beacon_pkt = 0; 1325 rtlpriv->dm.dbginfo.num_qry_beacon_pkt = 0;
1325} 1326}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
index c6c2f2a78a66..e4c0e8ae6f47 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/dm.h
@@ -141,7 +141,7 @@
141#define DM_REG_TX_CCK_BBON_11N 0xE78 141#define DM_REG_TX_CCK_BBON_11N 0xE78
142#define DM_REG_OFDM_RFON_11N 0xE7C 142#define DM_REG_OFDM_RFON_11N 0xE7C
143#define DM_REG_OFDM_BBON_11N 0xE80 143#define DM_REG_OFDM_BBON_11N 0xE80
144#define DM_REG_TX2RX_11N 0xE84 144#define DM_REG_TX2RX_11N 0xE84
145#define DM_REG_TX2TX_11N 0xE88 145#define DM_REG_TX2TX_11N 0xE88
146#define DM_REG_RX_CCK_11N 0xE8C 146#define DM_REG_RX_CCK_11N 0xE8C
147#define DM_REG_RX_OFDM_11N 0xED0 147#define DM_REG_RX_OFDM_11N 0xED0
@@ -202,6 +202,7 @@
202#define DM_DIG_BACKOFF_MIN -4 202#define DM_DIG_BACKOFF_MIN -4
203#define DM_DIG_BACKOFF_DEFAULT 10 203#define DM_DIG_BACKOFF_DEFAULT 10
204 204
205#define RXPATHSELECTION_SS_TH_LOW 30
205#define RXPATHSELECTION_DIFF_TH 18 206#define RXPATHSELECTION_DIFF_TH 18
206 207
207#define DM_RATR_STA_INIT 0 208#define DM_RATR_STA_INIT 0
@@ -212,6 +213,8 @@
212#define CTS2SELF_THVAL 30 213#define CTS2SELF_THVAL 30
213#define REGC38_TH 20 214#define REGC38_TH 20
214 215
216#define WAIOTTHVAL 25
217
215#define TXHIGHPWRLEVEL_NORMAL 0 218#define TXHIGHPWRLEVEL_NORMAL 0
216#define TXHIGHPWRLEVEL_LEVEL1 1 219#define TXHIGHPWRLEVEL_LEVEL1 1
217#define TXHIGHPWRLEVEL_LEVEL2 2 220#define TXHIGHPWRLEVEL_LEVEL2 2
@@ -231,22 +234,6 @@
231#define CFO_THRESHOLD_XTAL 10 /* kHz */ 234#define CFO_THRESHOLD_XTAL 10 /* kHz */
232#define CFO_THRESHOLD_ATC 80 /* kHz */ 235#define CFO_THRESHOLD_ATC 80 /* kHz */
233 236
234enum FAT_STATE {
235 FAT_NORMAL_STATE = 0,
236 FAT_TRAINING_STATE = 1,
237};
238
239enum tag_dynamic_init_gain_operation_type_definition {
240 DIG_TYPE_THRESH_HIGH = 0,
241 DIG_TYPE_THRESH_LOW = 1,
242 DIG_TYPE_BACKOFF = 2,
243 DIG_TYPE_RX_GAIN_MIN = 3,
244 DIG_TYPE_RX_GAIN_MAX = 4,
245 DIG_TYPE_ENABLE = 5,
246 DIG_TYPE_DISABLE = 6,
247 DIG_OP_TYPE_MAX
248};
249
250enum dm_1r_cca_e { 237enum dm_1r_cca_e {
251 CCA_1R = 0, 238 CCA_1R = 0,
252 CCA_2R = 1, 239 CCA_2R = 1,
@@ -292,12 +279,17 @@ enum pwr_track_control_method {
292#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1) 279#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1)
293#define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1) 280#define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1)
294#define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1) 281#define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1)
282#define GET_UNDECORATED_AVERAGE_RSSI(_priv) \
283 ((((struct rtl_priv *)(_priv))->mac80211.opmode == \
284 NL80211_IFTYPE_ADHOC) ? \
285 (((struct rtl_priv *)(_priv))->dm.entry_min_undecoratedsmoothed_pwdb) :\
286 (((struct rtl_priv *)(_priv))->dm.undecorated_smoothed_pwdb))
295 287
296void rtl8723be_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw, u8 *pdesc, 288void rtl8723be_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw, u8 *pdesc,
297 u32 mac_id); 289 u32 mac_id);
298void rtl8723be_dm_ant_sel_statistics(struct ieee80211_hw *hw, u8 antsel_tr_mux, 290void rtl8723be_dm_ant_sel_statistics(struct ieee80211_hw *hw, u8 antsel_tr_mux,
299 u32 mac_id, u32 rx_pwdb_all); 291 u32 mac_id, u32 rx_pwdb_all);
300void rtl8723be_dm_fast_antenna_trainning_callback(unsigned long data); 292void rtl8723be_dm_fast_antenna_training_callback(unsigned long data);
301void rtl8723be_dm_init(struct ieee80211_hw *hw); 293void rtl8723be_dm_init(struct ieee80211_hw *hw);
302void rtl8723be_dm_watchdog(struct ieee80211_hw *hw); 294void rtl8723be_dm_watchdog(struct ieee80211_hw *hw);
303void rtl8723be_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi); 295void rtl8723be_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi);
@@ -305,6 +297,4 @@ void rtl8723be_dm_check_txpower_tracking(struct ieee80211_hw *hw);
305void rtl8723be_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw); 297void rtl8723be_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
306void rtl8723be_dm_txpower_track_adjust(struct ieee80211_hw *hw, u8 type, 298void rtl8723be_dm_txpower_track_adjust(struct ieee80211_hw *hw, u8 type,
307 u8 *pdirection, u32 *poutwrite_val); 299 u8 *pdirection, u32 *poutwrite_val);
308void rtl8723be_dm_init_edca_turbo(struct ieee80211_hw *hw);
309
310#endif 300#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/fw.c b/drivers/net/wireless/rtlwifi/rtl8723be/fw.c
index f856be6fc138..69d4f0fc1af1 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/fw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/fw.c
@@ -26,6 +26,7 @@
26#include "../wifi.h" 26#include "../wifi.h"
27#include "../pci.h" 27#include "../pci.h"
28#include "../base.h" 28#include "../base.h"
29#include "../core.h"
29#include "reg.h" 30#include "reg.h"
30#include "def.h" 31#include "def.h"
31#include "fw.h" 32#include "fw.h"
@@ -55,8 +56,8 @@ static void _rtl8723be_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
55 bool isfw_read = false; 56 bool isfw_read = false;
56 u8 buf_index = 0; 57 u8 buf_index = 0;
57 bool bwrite_sucess = false; 58 bool bwrite_sucess = false;
58 u8 wait_h2c_limit = 100; 59 u8 wait_h2c_limmit = 100;
59 u8 wait_writeh2c_limit = 100; 60 u8 wait_writeh2c_limmit = 100;
60 u8 boxcontent[4], boxextcontent[4]; 61 u8 boxcontent[4], boxextcontent[4];
61 u32 h2c_waitcounter = 0; 62 u32 h2c_waitcounter = 0;
62 unsigned long flag; 63 unsigned long flag;
@@ -68,8 +69,8 @@ static void _rtl8723be_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
68 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 69 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
69 if (rtlhal->h2c_setinprogress) { 70 if (rtlhal->h2c_setinprogress) {
70 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 71 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
71 "H2C set in progress! Wait to set.." 72 "H2C set in progress! Wait to set..element_id(%d).\n",
72 "element_id(%d).\n", element_id); 73 element_id);
73 74
74 while (rtlhal->h2c_setinprogress) { 75 while (rtlhal->h2c_setinprogress) {
75 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, 76 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
@@ -92,14 +93,15 @@ static void _rtl8723be_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
92 break; 93 break;
93 } 94 }
94 } 95 }
96
95 while (!bwrite_sucess) { 97 while (!bwrite_sucess) {
96 wait_writeh2c_limit--; 98 wait_writeh2c_limmit--;
97 if (wait_writeh2c_limit == 0) { 99 if (wait_writeh2c_limmit == 0) {
98 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 100 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
99 "Write H2C fail because no trigger " 101 "Write H2C fail because no trigger for FW INT!\n");
100 "for FW INT!\n");
101 break; 102 break;
102 } 103 }
104
103 boxnum = rtlhal->last_hmeboxnum; 105 boxnum = rtlhal->last_hmeboxnum;
104 switch (boxnum) { 106 switch (boxnum) {
105 case 0: 107 case 0:
@@ -120,39 +122,43 @@ static void _rtl8723be_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
120 break; 122 break;
121 default: 123 default:
122 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 124 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
123 "switch case not processed\n"); 125 "switch case not process\n");
124 break; 126 break;
125 } 127 }
128
126 isfw_read = _rtl8723be_check_fw_read_last_h2c(hw, boxnum); 129 isfw_read = _rtl8723be_check_fw_read_last_h2c(hw, boxnum);
127 while (!isfw_read) { 130 while (!isfw_read) {
128 wait_h2c_limit--; 131 wait_h2c_limmit--;
129 if (wait_h2c_limit == 0) { 132 if (wait_h2c_limmit == 0) {
130 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 133 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
131 "Wating too long for FW read " 134 "Waiting too long for FW read clear HMEBox(%d)!\n",
132 "clear HMEBox(%d)!\n", boxnum); 135 boxnum);
133 break; 136 break;
134 } 137 }
138
135 udelay(10); 139 udelay(10);
136 140
137 isfw_read = _rtl8723be_check_fw_read_last_h2c(hw, 141 isfw_read = _rtl8723be_check_fw_read_last_h2c(hw,
138 boxnum); 142 boxnum);
139 u1b_tmp = rtl_read_byte(rtlpriv, 0x130); 143 u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
140 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 144 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
141 "Wating for FW read clear HMEBox(%d)!!! 0x130 = %2x\n", 145 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
142 boxnum, u1b_tmp); 146 boxnum, u1b_tmp);
143 } 147 }
148
144 if (!isfw_read) { 149 if (!isfw_read) {
145 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 150 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
146 "Write H2C register BOX[%d] fail!!!!! " 151 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
147 "Fw do not read.\n", boxnum); 152 boxnum);
148 break; 153 break;
149 } 154 }
155
150 memset(boxcontent, 0, sizeof(boxcontent)); 156 memset(boxcontent, 0, sizeof(boxcontent));
151 memset(boxextcontent, 0, sizeof(boxextcontent)); 157 memset(boxextcontent, 0, sizeof(boxextcontent));
152 boxcontent[0] = element_id; 158 boxcontent[0] = element_id;
153 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 159 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
154 "Write element_id box_reg(%4x) = %2x\n", 160 "Write element_id box_reg(%4x) = %2x\n",
155 box_reg, element_id); 161 box_reg, element_id);
156 162
157 switch (cmd_len) { 163 switch (cmd_len) {
158 case 1: 164 case 1:
@@ -181,6 +187,7 @@ static void _rtl8723be_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
181 rtl_write_byte(rtlpriv, box_extreg + idx, 187 rtl_write_byte(rtlpriv, box_extreg + idx,
182 boxextcontent[idx]); 188 boxextcontent[idx]);
183 } 189 }
190
184 for (idx = 0; idx < 4; idx++) { 191 for (idx = 0; idx < 4; idx++) {
185 rtl_write_byte(rtlpriv, box_reg + idx, 192 rtl_write_byte(rtlpriv, box_reg + idx,
186 boxcontent[idx]); 193 boxcontent[idx]);
@@ -191,6 +198,7 @@ static void _rtl8723be_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
191 "switch case not process\n"); 198 "switch case not process\n");
192 break; 199 break;
193 } 200 }
201
194 bwrite_sucess = true; 202 bwrite_sucess = true;
195 203
196 rtlhal->last_hmeboxnum = boxnum + 1; 204 rtlhal->last_hmeboxnum = boxnum + 1;
@@ -199,8 +207,9 @@ static void _rtl8723be_fill_h2c_command(struct ieee80211_hw *hw, u8 element_id,
199 207
200 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, 208 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
201 "pHalData->last_hmeboxnum = %d\n", 209 "pHalData->last_hmeboxnum = %d\n",
202 rtlhal->last_hmeboxnum); 210 rtlhal->last_hmeboxnum);
203 } 211 }
212
204 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag); 213 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
205 rtlhal->h2c_setinprogress = false; 214 rtlhal->h2c_setinprogress = false;
206 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag); 215 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
@@ -219,6 +228,7 @@ void rtl8723be_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
219 "return H2C cmd because of Fw download fail!!!\n"); 228 "return H2C cmd because of Fw download fail!!!\n");
220 return; 229 return;
221 } 230 }
231
222 memset(tmp_cmdbuf, 0, 8); 232 memset(tmp_cmdbuf, 0, 8);
223 memcpy(tmp_cmdbuf, p_cmdbuffer, cmd_len); 233 memcpy(tmp_cmdbuf, p_cmdbuffer, cmd_len);
224 _rtl8723be_fill_h2c_command(hw, element_id, cmd_len, 234 _rtl8723be_fill_h2c_command(hw, element_id, cmd_len,
@@ -229,17 +239,17 @@ void rtl8723be_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
229void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode) 239void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
230{ 240{
231 struct rtl_priv *rtlpriv = rtl_priv(hw); 241 struct rtl_priv *rtlpriv = rtl_priv(hw);
232 u8 u1_h2c_set_pwrmode[H2C_8723BE_PWEMODE_LENGTH] = { 0 }; 242 u8 u1_h2c_set_pwrmode[H2C_PWEMODE_LENGTH] = { 0 };
233 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 243 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
234 u8 rlbm, power_state = 0; 244 u8 rlbm, power_state = 0;
235 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode); 245 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
236 246
237 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0)); 247 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
238 rlbm = 0;/*YJ, temp, 120316. FW now not support RLBM = 2.*/ 248 rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/
239 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm); 249 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
240 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 250 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
241 (rtlpriv->mac80211.p2p) ? 251 (rtlpriv->mac80211.p2p) ?
242 ppsc->smart_ps : 1); 252 ppsc->smart_ps : 1);
243 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode, 253 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
244 ppsc->reg_max_lps_awakeintvl); 254 ppsc->reg_max_lps_awakeintvl);
245 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0); 255 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
@@ -251,44 +261,26 @@ void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
251 261
252 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 262 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
253 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n", 263 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
254 u1_h2c_set_pwrmode, H2C_8723BE_PWEMODE_LENGTH); 264 u1_h2c_set_pwrmode, H2C_PWEMODE_LENGTH);
255 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_SETPWRMODE, 265 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_SETPWRMODE, H2C_PWEMODE_LENGTH,
256 H2C_8723BE_PWEMODE_LENGTH,
257 u1_h2c_set_pwrmode); 266 u1_h2c_set_pwrmode);
258} 267}
259 268
260static bool _rtl8723be_cmd_send_packet(struct ieee80211_hw *hw, 269void rtl8723be_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus)
261 struct sk_buff *skb)
262{ 270{
263 struct rtl_priv *rtlpriv = rtl_priv(hw); 271 u8 parm[3] = { 0, 0, 0 };
264 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 272 /* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
265 struct rtl8192_tx_ring *ring; 273 * bit1=0-->update Media Status to MACID
266 struct rtl_tx_desc *pdesc; 274 * bit1=1-->update Media Status from MACID to MACID_End
267 struct sk_buff *pskb = NULL; 275 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
268 u8 own; 276 * parm[2]: MACID_End
269 unsigned long flags; 277 */
270 278 SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
271 ring = &rtlpci->tx_ring[BEACON_QUEUE]; 279 SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
272 280
273 pskb = __skb_dequeue(&ring->queue); 281 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_MSRRPT, 3, parm);
274 if (pskb)
275 kfree_skb(pskb);
276
277 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
278
279 pdesc = &ring->desc[0];
280 own = (u8) rtlpriv->cfg->ops->get_desc((u8 *)pdesc, true, HW_DESC_OWN);
281
282 rtlpriv->cfg->ops->fill_tx_cmddesc(hw, (u8 *)pdesc, 1, 1, skb);
283
284 __skb_queue_tail(&ring->queue, skb);
285
286 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
287
288 rtlpriv->cfg->ops->tx_polling(hw, BEACON_QUEUE);
289
290 return true;
291} 282}
283
292#define BEACON_PG 0 /* ->1 */ 284#define BEACON_PG 0 /* ->1 */
293#define PSPOLL_PG 2 285#define PSPOLL_PG 2
294#define NULL_PG 3 286#define NULL_PG 3
@@ -407,7 +399,7 @@ static u8 reserved_page_packet[TOTAL_RESERVED_PKT_LEN] = {
407}; 399};
408 400
409void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, 401void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
410 bool dl_finished) 402 bool b_dl_finished)
411{ 403{
412 struct rtl_priv *rtlpriv = rtl_priv(hw); 404 struct rtl_priv *rtlpriv = rtl_priv(hw);
413 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 405 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
@@ -416,7 +408,7 @@ void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
416 u32 totalpacketlen; 408 u32 totalpacketlen;
417 bool rtstatus; 409 bool rtstatus;
418 u8 u1rsvdpageloc[5] = { 0 }; 410 u8 u1rsvdpageloc[5] = { 0 };
419 bool dlok = false; 411 bool b_dlok = false;
420 412
421 u8 *beacon; 413 u8 *beacon;
422 u8 *p_pspoll; 414 u8 *p_pspoll;
@@ -466,43 +458,40 @@ void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
466 totalpacketlen = TOTAL_RESERVED_PKT_LEN; 458 totalpacketlen = TOTAL_RESERVED_PKT_LEN;
467 459
468 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD, 460 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
469 "rtl8723be_set_fw_rsvdpagepkt(): " 461 "rtl8723be_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
470 "HW_VAR_SET_TX_CMD: ALL\n",
471 &reserved_page_packet[0], totalpacketlen); 462 &reserved_page_packet[0], totalpacketlen);
472 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, 463 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
473 "rtl8723be_set_fw_rsvdpagepkt(): " 464 "rtl8723be_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
474 "HW_VAR_SET_TX_CMD: ALL\n", u1rsvdpageloc, 3); 465 u1rsvdpageloc, 3);
475
476 466
477 skb = dev_alloc_skb(totalpacketlen); 467 skb = dev_alloc_skb(totalpacketlen);
478 memcpy((u8 *)skb_put(skb, totalpacketlen), 468 memcpy((u8 *)skb_put(skb, totalpacketlen),
479 &reserved_page_packet, totalpacketlen); 469 &reserved_page_packet, totalpacketlen);
480 470
481 rtstatus = _rtl8723be_cmd_send_packet(hw, skb); 471 rtstatus = rtl_cmd_send_packet(hw, skb);
482 472
483 if (rtstatus) 473 if (rtstatus)
484 dlok = true; 474 b_dlok = true;
485 475
486 if (dlok) { 476 if (b_dlok) {
487 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 477 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
488 "Set RSVD page location to Fw.\n"); 478 "Set RSVD page location to Fw.\n");
489 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, "H2C_RSVDPAGE:\n", 479 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG, "H2C_RSVDPAGE:\n",
490 u1rsvdpageloc, 3); 480 u1rsvdpageloc, 3);
491 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_RSVDPAGE, 481 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_RSVDPAGE,
492 sizeof(u1rsvdpageloc), u1rsvdpageloc); 482 sizeof(u1rsvdpageloc), u1rsvdpageloc);
493 } else { 483 } else
494 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 484 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
495 "Set RSVD page location to Fw FAIL!!!!!!.\n"); 485 "Set RSVD page location to Fw FAIL!!!!!!.\n");
496 }
497} 486}
498 487
499/*Should check FW support p2p or not.*/ 488/*Should check FW support p2p or not.*/
500static void rtl8723be_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, 489static void rtl8723be_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw,
501 u8 ctwindow) 490 u8 ctwindow)
502{ 491{
503 u8 u1_ctwindow_period[1] = {ctwindow}; 492 u8 u1_ctwindow_period[1] = { ctwindow};
504 493
505 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_P2P_PS_CTW_CMD, 1, 494 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_P2P_PS_CTW_CMD, 1,
506 u1_ctwindow_period); 495 u1_ctwindow_period);
507} 496}
508 497
@@ -521,7 +510,7 @@ void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
521 switch (p2p_ps_state) { 510 switch (p2p_ps_state) {
522 case P2P_PS_DISABLE: 511 case P2P_PS_DISABLE:
523 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n"); 512 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
524 memset(p2p_ps_offload, 0, sizeof(struct p2p_ps_offload_t)); 513 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
525 break; 514 break;
526 case P2P_PS_ENABLE: 515 case P2P_PS_ENABLE:
527 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n"); 516 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
@@ -532,7 +521,7 @@ void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
532 rtl8723be_set_p2p_ctw_period_cmd(hw, ctwindow); 521 rtl8723be_set_p2p_ctw_period_cmd(hw, ctwindow);
533 } 522 }
534 /* hw only support 2 set of NoA */ 523 /* hw only support 2 set of NoA */
535 for (i = 0; i < p2pinfo->noa_num; i++) { 524 for (i = 0 ; i < p2pinfo->noa_num ; i++) {
536 /* To control the register setting 525 /* To control the register setting
537 * for which NOA 526 * for which NOA
538 */ 527 */
@@ -563,6 +552,7 @@ void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
563 rtl_write_dword(rtlpriv, 0x5EC, 552 rtl_write_dword(rtlpriv, 0x5EC,
564 p2pinfo->noa_count_type[i]); 553 p2pinfo->noa_count_type[i]);
565 } 554 }
555
566 if ((p2pinfo->opp_ps == 1) || 556 if ((p2pinfo->opp_ps == 1) ||
567 (p2pinfo->noa_num > 0)) { 557 (p2pinfo->noa_num > 0)) {
568 /* rst p2p circuit */ 558 /* rst p2p circuit */
@@ -591,30 +581,60 @@ void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
591 default: 581 default:
592 break; 582 break;
593 } 583 }
594 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_P2P_PS_OFFLOAD, 1, 584
585 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_P2P_PS_OFFLOAD, 1,
595 (u8 *)p2p_ps_offload); 586 (u8 *)p2p_ps_offload);
596} 587}
597 588
598void rtl8723be_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus) 589static void _rtl8723be_c2h_content_parsing(struct ieee80211_hw *hw,
590 u8 c2h_cmd_id,
591 u8 c2h_cmd_len, u8 *tmp_buf)
599{ 592{
600 u8 u1_joinbssrpt_parm[1] = { 0 }; 593 struct rtl_priv *rtlpriv = rtl_priv(hw);
601
602 SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(u1_joinbssrpt_parm, mstatus);
603 594
604 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_JOINBSSRPT, 1, 595 switch (c2h_cmd_id) {
605 u1_joinbssrpt_parm); 596 case C2H_8723B_DBG:
597 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
598 "[C2H], C2H_8723BE_DBG!!\n");
599 break;
600 case C2H_8723B_TX_REPORT:
601 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
602 "[C2H], C2H_8723BE_TX_REPORT!\n");
603 break;
604 case C2H_8723B_BT_INFO:
605 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
606 "[C2H], C2H_8723BE_BT_INFO!!\n");
607 rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv, tmp_buf,
608 c2h_cmd_len);
609 break;
610 case C2H_8723B_BT_MP:
611 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
612 "[C2H], C2H_8723BE_BT_MP!!\n");
613 break;
614 default:
615 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
616 "[C2H], Unkown packet!! CmdId(%#X)!\n", c2h_cmd_id);
617 break;
618 }
606} 619}
607 620
608void rtl8723be_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw, 621void rtl8723be_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len)
609 u8 ap_offload_enable)
610{ 622{
611 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 623 struct rtl_priv *rtlpriv = rtl_priv(hw);
612 u8 u1_apoffload_parm[H2C_8723BE_AP_OFFLOAD_LENGTH] = { 0 }; 624 u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
625 u8 *tmp_buf = NULL;
626
627 c2h_cmd_id = buffer[0];
628 c2h_cmd_seq = buffer[1];
629 c2h_cmd_len = len - 2;
630 tmp_buf = buffer + 2;
631
632 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
633 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
634 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
613 635
614 SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable); 636 RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_TRACE,
615 SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid); 637 "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
616 SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
617 638
618 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_AP_OFFLOAD, 639 _rtl8723be_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
619 H2C_8723BE_AP_OFFLOAD_LENGTH, u1_apoffload_parm);
620} 640}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/fw.h b/drivers/net/wireless/rtlwifi/rtl8723be/fw.h
index 31eec281e446..067429669bda 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/fw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/fw.h
@@ -30,50 +30,23 @@
30#define FW_8192C_END_ADDRESS 0x5FFF 30#define FW_8192C_END_ADDRESS 0x5FFF
31#define FW_8192C_PAGE_SIZE 4096 31#define FW_8192C_PAGE_SIZE 4096
32#define FW_8192C_POLLING_DELAY 5 32#define FW_8192C_POLLING_DELAY 5
33#define FW_8192C_POLLING_TIMEOUT_COUNT 6000
34 33
35#define IS_FW_HEADER_EXIST(_pfwhdr) \
36 ((_pfwhdr->signature&0xFFF0) == 0x5300)
37#define USE_OLD_WOWLAN_DEBUG_FW 0 34#define USE_OLD_WOWLAN_DEBUG_FW 0
38 35
39#define H2C_8723BE_RSVDPAGE_LOC_LEN 5 36#define H2C_PWEMODE_LENGTH 5
40#define H2C_8723BE_PWEMODE_LENGTH 5
41#define H2C_8723BE_JOINBSSRPT_LENGTH 1
42#define H2C_8723BE_AP_OFFLOAD_LENGTH 3
43#define H2C_8723BE_WOWLAN_LENGTH 3
44#define H2C_8723BE_KEEP_ALIVE_CTRL_LENGTH 3
45#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
46#define H2C_8723BE_REMOTE_WAKE_CTRL_LEN 1
47#else
48#define H2C_8723BE_REMOTE_WAKE_CTRL_LEN 3
49#endif
50#define H2C_8723BE_AOAC_GLOBAL_INFO_LEN 2
51#define H2C_8723BE_AOAC_RSVDPAGE_LOC_LEN 7
52
53 37
54/* Fw PS state for RPWM. 38/* Fw PS state for RPWM.
55*BIT[2:0] = HW state 39*BIT[2:0] = HW state
56*BIT[3] = Protocol PS state, 1: register active state , 0: register sleep state 40*BIT[3] = Protocol PS state, 1: register active state , 0: register sleep state
57*BIT[4] = sub-state 41*BIT[4] = sub-state
58*/ 42*/
59#define FW_PS_GO_ON BIT(0)
60#define FW_PS_TX_NULL BIT(1)
61#define FW_PS_RF_ON BIT(2) 43#define FW_PS_RF_ON BIT(2)
62#define FW_PS_REGISTER_ACTIVE BIT(3) 44#define FW_PS_REGISTER_ACTIVE BIT(3)
63 45
64#define FW_PS_DPS BIT(0)
65#define FW_PS_LCLK (FW_PS_DPS)
66#define FW_PS_RF_OFF BIT(1)
67#define FW_PS_ALL_ON BIT(2)
68#define FW_PS_ST_ACTIVE BIT(3)
69#define FW_PS_ISR_ENABLE BIT(4)
70#define FW_PS_IMR_ENABLE BIT(5)
71
72
73#define FW_PS_ACK BIT(6) 46#define FW_PS_ACK BIT(6)
74#define FW_PS_TOGGLE BIT(7) 47#define FW_PS_TOGGLE BIT(7)
75 48
76 /* 88E RPWM value*/ 49 /* 8723BE RPWM value*/
77 /* BIT[0] = 1: 32k, 0: 40M*/ 50 /* BIT[0] = 1: 32k, 0: 40M*/
78#define FW_PS_CLOCK_OFF BIT(0) /* 32k*/ 51#define FW_PS_CLOCK_OFF BIT(0) /* 32k*/
79#define FW_PS_CLOCK_ON 0 /*40M*/ 52#define FW_PS_CLOCK_ON 0 /*40M*/
@@ -83,75 +56,61 @@
83/*ISR_ENABLE, IMR_ENABLE, and PS mode should be inherited.*/ 56/*ISR_ENABLE, IMR_ENABLE, and PS mode should be inherited.*/
84#define FW_PS_STATE_INT_MASK (0x3F) 57#define FW_PS_STATE_INT_MASK (0x3F)
85 58
86#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x)) 59#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x))
87#define FW_PS_STATE_HW(x) (FW_PS_STATE_HW_MASK & (x))
88#define FW_PS_STATE_INT(x) (FW_PS_STATE_INT_MASK & (x))
89#define FW_PS_ISR_VAL(x) ((x) & 0x70)
90#define FW_PS_IMR_MASK(x) ((x) & 0xDF)
91#define FW_PS_KEEP_IMR(x) ((x) & 0x20)
92
93
94#define FW_PS_STATE_S0 (FW_PS_DPS)
95#define FW_PS_STATE_S1 (FW_PS_LCLK)
96#define FW_PS_STATE_S2 (FW_PS_RF_OFF)
97#define FW_PS_STATE_S3 (FW_PS_ALL_ON)
98#define FW_PS_STATE_S4 ((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))
99 60
100/* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/ 61/* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/
101#define FW_PS_STATE_ALL_ON_88E (FW_PS_CLOCK_ON) 62#define FW_PS_STATE_ALL_ON (FW_PS_CLOCK_ON)
102/* (FW_PS_RF_ON)*/ 63/* (FW_PS_RF_ON)*/
103#define FW_PS_STATE_RF_ON_88E (FW_PS_CLOCK_ON) 64#define FW_PS_STATE_RF_ON (FW_PS_CLOCK_ON)
104/* 0x0*/ 65/* 0x0*/
105#define FW_PS_STATE_RF_OFF_88E (FW_PS_CLOCK_ON) 66#define FW_PS_STATE_RF_OFF (FW_PS_CLOCK_ON)
106/* (FW_PS_STATE_RF_OFF)*/ 67/* (FW_PS_STATE_RF_OFF)*/
107#define FW_PS_STATE_RF_OFF_LOW_PWR_88E (FW_PS_CLOCK_OFF) 68#define FW_PS_STATE_RF_OFF_LOW_PWR (FW_PS_CLOCK_OFF)
108 69
109#define FW_PS_STATE_ALL_ON_92C (FW_PS_STATE_S4)
110#define FW_PS_STATE_RF_ON_92C (FW_PS_STATE_S3)
111#define FW_PS_STATE_RF_OFF_92C (FW_PS_STATE_S2)
112#define FW_PS_STATE_RF_OFF_LOW_PWR_92C (FW_PS_STATE_S1)
113 70
114 71/* For 8723BE H2C PwrMode Cmd ID 5.*/
115/* For 88E H2C PwrMode Cmd ID 5.*/
116#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE)) 72#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
117#define FW_PWR_STATE_RF_OFF 0 73#define FW_PWR_STATE_RF_OFF 0
118 74
119#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK) 75#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK)
120#define FW_PS_IS_CLK_ON(x) ((x) & (FW_PS_RF_OFF | FW_PS_ALL_ON))
121#define FW_PS_IS_RF_ON(x) ((x) & (FW_PS_ALL_ON))
122#define FW_PS_IS_ACTIVE(x) ((x) & (FW_PS_ST_ACTIVE))
123#define FW_PS_IS_CPWM_INT(x) ((x) & 0x40)
124
125#define FW_CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))
126 76
127#define IS_IN_LOW_POWER_STATE_88E(fwpsstate) \ 77#define IS_IN_LOW_POWER_STATE(__fwpsstate) \
128 (FW_PS_STATE(fwpsstate) == FW_PS_CLOCK_OFF) 78 (FW_PS_STATE(__fwpsstate) == FW_PS_CLOCK_OFF)
129 79
130#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE)) 80#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
131#define FW_PWR_STATE_RF_OFF 0 81#define FW_PWR_STATE_RF_OFF 0
132 82
133#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0)) 83enum rtl8723b_h2c_cmd {
134 84 H2C_8723B_RSVDPAGE = 0,
135#define SET_88E_H2CCMD_WOWLAN_FUNC_ENABLE(__ph2ccmd, __val) \ 85 H2C_8723B_MSRRPT = 1,
136 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val) 86 H2C_8723B_SCAN = 2,
137#define SET_88E_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__ph2ccmd, __val) \ 87 H2C_8723B_KEEP_ALIVE_CTRL = 3,
138 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val) 88 H2C_8723B_DISCONNECT_DECISION = 4,
139#define SET_88E_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__ph2ccmd, __val) \ 89 H2C_8723B_BCN_RSVDPAGE = 9,
140 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 2, 1, __val) 90 H2C_8723B_PROBERSP_RSVDPAGE = 10,
141#define SET_88E_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__ph2ccmd, __val) \ 91
142 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 3, 1, __val) 92 H2C_8723B_SETPWRMODE = 0x20,
143#define SET_88E_H2CCMD_WOWLAN_ALL_PKT_DROP(__ph2ccmd, __val) \ 93 H2C_8723B_PS_LPS_PARA = 0x23,
144 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 4, 1, __val) 94 H2C_8723B_P2P_PS_OFFLOAD = 0x24,
145#define SET_88E_H2CCMD_WOWLAN_GPIO_ACTIVE(__ph2ccmd, __val) \ 95
146 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 5, 1, __val) 96 H2C_8723B_RA_MASK = 0x40,
147#define SET_88E_H2CCMD_WOWLAN_REKEY_WAKE_UP(__ph2ccmd, __val) \ 97 H2C_RSSIBE_REPORT = 0x42,
148 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 6, 1, __val) 98 /*Not defined CTW CMD for P2P yet*/
149#define SET_88E_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__ph2ccmd, __val) \ 99 H2C_8723B_P2P_PS_CTW_CMD,
150 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 7, 1, __val) 100 MAX_8723B_H2CCMD
151#define SET_88E_H2CCMD_WOWLAN_GPIONUM(__ph2ccmd, __val) \ 101};
152 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val) 102
153#define SET_88E_H2CCMD_WOWLAN_GPIO_DURATION(__ph2ccmd, __val) \ 103enum rtl8723b_c2h_evt {
154 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val) 104 C2H_8723B_DBG = 0,
105 C2H_8723B_LB = 1,
106 C2H_8723B_TXBF = 2,
107 C2H_8723B_TX_REPORT = 3,
108 C2H_8723B_BT_INFO = 9,
109 C2H_8723B_BT_MP = 11,
110 MAX_8723B_C2HEVENT
111};
112
113#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))
155 114
156 115
157#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \ 116#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
@@ -169,8 +128,11 @@
169#define GET_88E_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd) \ 128#define GET_88E_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd) \
170 LE_BITS_TO_1BYTE(__ph2ccmd, 0, 8) 129 LE_BITS_TO_1BYTE(__ph2ccmd, 0, 8)
171 130
172#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__ph2ccmd, __val) \ 131#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__ph2ccmd, __val) \
173 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val) 132 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
133#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__ph2ccmd, __val) \
134 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
135
174#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val) \ 136#define SET_H2CCMD_RSVDPAGE_LOC_PROBE_RSP(__ph2ccmd, __val) \
175 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val) 137 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
176#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \ 138#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \
@@ -178,71 +140,13 @@
178#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \ 140#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \
179 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val) 141 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
180 142
181/* AP_OFFLOAD */
182#define SET_H2CCMD_AP_OFFLOAD_ON(__ph2ccmd, __val) \
183 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
184#define SET_H2CCMD_AP_OFFLOAD_HIDDEN(__ph2ccmd, __val) \
185 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
186#define SET_H2CCMD_AP_OFFLOAD_DENYANY(__ph2ccmd, __val) \
187 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
188#define SET_H2CCMD_AP_OFFLOAD_WAKEUP_EVT_RPT(__ph2ccmd, __val) \
189 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+3, 0, 8, __val)
190 143
191/* Keep Alive Control*/
192#define SET_88E_H2CCMD_KEEP_ALIVE_ENABLE(__ph2ccmd, __val) \
193 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
194#define SET_88E_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(__ph2ccmd, __val)\
195 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
196#define SET_88E_H2CCMD_KEEP_ALIVE_PERIOD(__ph2ccmd, __val) \
197 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
198
199/*REMOTE_WAKE_CTRL */
200#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_EN(__ph2ccmd, __val) \
201 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 1, __val)
202#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
203#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__ph2ccmd, __val)\
204 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 1, 1, __val)
205#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__ph2ccmd, __val)\
206 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 2, 1, __val)
207#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__ph2ccmd, __val)\
208 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 3, 1, __val)
209#else
210#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_PAIRWISE_ENC_ALG(__ph2ccmd, __val)\
211 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
212#define SET_88E_H2CCMD_REMOTE_WAKE_CTRL_GROUP_ENC_ALG(__ph2ccmd, __val) \
213 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
214#endif
215
216/* GTK_OFFLOAD */
217#define SET_88E_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__ph2ccmd, __val)\
218 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
219#define SET_88E_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__ph2ccmd, __val) \
220 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
221
222/* AOAC_RSVDPAGE_LOC */
223#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_REM_WAKE_CTRL_INFO(__ph2ccmd, __val)\
224 SET_BITS_TO_LE_1BYTE((__ph2ccmd), 0, 8, __val)
225#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__ph2ccmd, __val) \
226 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
227#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__ph2ccmd, __val) \
228 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
229#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__ph2ccmd, __val) \
230 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+3, 0, 8, __val)
231#define SET_88E_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__ph2ccmd, __val) \
232 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+4, 0, 8, __val)
233
234void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
235void rtl8723be_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
236 u8 ap_offload_enable);
237void rtl8723be_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id, 144void rtl8723be_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
238 u32 cmd_len, u8 *p_cmdbuffer); 145 u32 cmd_len, u8 *p_cmdbuffer);
239void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw); 146void rtl8723be_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
240void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, 147void rtl8723be_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw, u8 mstatus);
241 bool dl_finished); 148void rtl8723be_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool b_dl_finished);
242void rtl8723be_set_fw_joinbss_report_cmd(struct ieee80211_hw *hw, u8 mstatus); 149void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state);
243int rtl8723be_download_fw(struct ieee80211_hw *hw, 150void rtl8723be_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer, u8 len);
244 bool buse_wake_on_wlan_fw);
245void rtl8723be_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
246 u8 p2p_ps_state);
247 151
248#endif 152#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/hw.c b/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
index 3cd286930fe0..6dad28e77bbb 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/hw.c
@@ -33,12 +33,14 @@
33#include "reg.h" 33#include "reg.h"
34#include "def.h" 34#include "def.h"
35#include "phy.h" 35#include "phy.h"
36#include "../rtl8723com/phy_common.h"
36#include "dm.h" 37#include "dm.h"
37#include "../rtl8723com/dm_common.h" 38#include "../rtl8723com/dm_common.h"
38#include "fw.h" 39#include "fw.h"
39#include "../rtl8723com/fw_common.h" 40#include "../rtl8723com/fw_common.h"
40#include "led.h" 41#include "led.h"
41#include "hw.h" 42#include "hw.h"
43#include "../pwrseqcmd.h"
42#include "pwrseq.h" 44#include "pwrseq.h"
43#include "../btcoexist/rtl_btc.h" 45#include "../btcoexist/rtl_btc.h"
44 46
@@ -49,7 +51,9 @@ static void _rtl8723be_return_beacon_queue_skb(struct ieee80211_hw *hw)
49 struct rtl_priv *rtlpriv = rtl_priv(hw); 51 struct rtl_priv *rtlpriv = rtl_priv(hw);
50 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 52 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
51 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; 53 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
54 unsigned long flags;
52 55
56 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
53 while (skb_queue_len(&ring->queue)) { 57 while (skb_queue_len(&ring->queue)) {
54 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; 58 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
55 struct sk_buff *skb = __skb_dequeue(&ring->queue); 59 struct sk_buff *skb = __skb_dequeue(&ring->queue);
@@ -61,6 +65,7 @@ static void _rtl8723be_return_beacon_queue_skb(struct ieee80211_hw *hw)
61 kfree_skb(skb); 65 kfree_skb(skb);
62 ring->idx = (ring->idx + 1) % ring->entries; 66 ring->idx = (ring->idx + 1) % ring->entries;
63 } 67 }
68 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
64} 69}
65 70
66static void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw, 71static void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
@@ -72,7 +77,7 @@ static void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
72 rtlpci->reg_bcn_ctrl_val |= set_bits; 77 rtlpci->reg_bcn_ctrl_val |= set_bits;
73 rtlpci->reg_bcn_ctrl_val &= ~clear_bits; 78 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
74 79
75 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8) rtlpci->reg_bcn_ctrl_val); 80 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
76} 81}
77 82
78static void _rtl8723be_stop_tx_beacon(struct ieee80211_hw *hw) 83static void _rtl8723be_stop_tx_beacon(struct ieee80211_hw *hw)
@@ -112,15 +117,15 @@ static void _rtl8723be_disable_bcn_sub_func(struct ieee80211_hw *hw)
112} 117}
113 118
114static void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val, 119static void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val,
115 bool need_turn_off_ckk) 120 bool b_need_turn_off_ckk)
116{ 121{
117 struct rtl_priv *rtlpriv = rtl_priv(hw); 122 struct rtl_priv *rtlpriv = rtl_priv(hw);
118 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 123 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
119 bool support_remote_wake_up; 124 bool b_support_remote_wake_up;
120 u32 count = 0, isr_regaddr, content; 125 u32 count = 0, isr_regaddr, content;
121 bool schedule_timer = need_turn_off_ckk; 126 bool b_schedule_timer = b_need_turn_off_ckk;
122 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN, 127 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
123 (u8 *)(&support_remote_wake_up)); 128 (u8 *)(&b_support_remote_wake_up));
124 129
125 if (!rtlhal->fw_ready) 130 if (!rtlhal->fw_ready)
126 return; 131 return;
@@ -145,9 +150,10 @@ static void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val,
145 break; 150 break;
146 } 151 }
147 } 152 }
148 if (IS_IN_LOW_POWER_STATE_88E(rtlhal->fw_ps_state)) { 153
154 if (IS_IN_LOW_POWER_STATE(rtlhal->fw_ps_state)) {
149 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM, 155 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
150 &rpwm_val); 156 (u8 *)(&rpwm_val));
151 if (FW_PS_IS_ACK(rpwm_val)) { 157 if (FW_PS_IS_ACK(rpwm_val)) {
152 isr_regaddr = REG_HISR; 158 isr_regaddr = REG_HISR;
153 content = rtl_read_dword(rtlpriv, isr_regaddr); 159 content = rtl_read_dword(rtlpriv, isr_regaddr);
@@ -159,20 +165,19 @@ static void _rtl8723be_set_fw_clock_on(struct ieee80211_hw *hw, u8 rpwm_val,
159 165
160 if (content & IMR_CPWM) { 166 if (content & IMR_CPWM) {
161 rtl_write_word(rtlpriv, isr_regaddr, 0x0100); 167 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
162 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_88E; 168 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON;
163 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 169 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
164 "Receive CPWM INT!!! Set " 170 "Receive CPWM INT!!! Set pHalData->FwPSState = %X\n",
165 "pHalData->FwPSState = %X\n",
166 rtlhal->fw_ps_state); 171 rtlhal->fw_ps_state);
167 } 172 }
168 } 173 }
174
169 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 175 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
170 rtlhal->fw_clk_change_in_progress = false; 176 rtlhal->fw_clk_change_in_progress = false;
171 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 177 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
172 if (schedule_timer) { 178 if (b_schedule_timer)
173 mod_timer(&rtlpriv->works.fw_clockoff_timer, 179 mod_timer(&rtlpriv->works.fw_clockoff_timer,
174 jiffies + MSECS(10)); 180 jiffies + MSECS(10));
175 }
176 } else { 181 } else {
177 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 182 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
178 rtlhal->fw_clk_change_in_progress = false; 183 rtlhal->fw_clk_change_in_progress = false;
@@ -187,7 +192,7 @@ static void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
187 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 192 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
188 struct rtl8192_tx_ring *ring; 193 struct rtl8192_tx_ring *ring;
189 enum rf_pwrstate rtstate; 194 enum rf_pwrstate rtstate;
190 bool schedule_timer = false; 195 bool b_schedule_timer = false;
191 u8 queue; 196 u8 queue;
192 197
193 if (!rtlhal->fw_ready) 198 if (!rtlhal->fw_ready)
@@ -203,17 +208,18 @@ static void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
203 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) { 208 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
204 ring = &rtlpci->tx_ring[queue]; 209 ring = &rtlpci->tx_ring[queue];
205 if (skb_queue_len(&ring->queue)) { 210 if (skb_queue_len(&ring->queue)) {
206 schedule_timer = true; 211 b_schedule_timer = true;
207 break; 212 break;
208 } 213 }
209 } 214 }
210 if (schedule_timer) { 215
216 if (b_schedule_timer) {
211 mod_timer(&rtlpriv->works.fw_clockoff_timer, 217 mod_timer(&rtlpriv->works.fw_clockoff_timer,
212 jiffies + MSECS(10)); 218 jiffies + MSECS(10));
213 return; 219 return;
214 } 220 }
215 if (FW_PS_STATE(rtlhal->fw_ps_state) != 221
216 FW_PS_STATE_RF_OFF_LOW_PWR_88E) { 222 if (FW_PS_STATE(rtlhal->fw_ps_state) != FW_PS_STATE_RF_OFF_LOW_PWR) {
217 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 223 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
218 if (!rtlhal->fw_clk_change_in_progress) { 224 if (!rtlhal->fw_clk_change_in_progress) {
219 rtlhal->fw_clk_change_in_progress = true; 225 rtlhal->fw_clk_change_in_progress = true;
@@ -221,7 +227,7 @@ static void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
221 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val); 227 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
222 rtl_write_word(rtlpriv, REG_HISR, 0x0100); 228 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
223 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, 229 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
224 &rpwm_val); 230 (u8 *)(&rpwm_val));
225 spin_lock_bh(&rtlpriv->locks.fw_ps_lock); 231 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
226 rtlhal->fw_clk_change_in_progress = false; 232 rtlhal->fw_clk_change_in_progress = false;
227 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock); 233 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
@@ -231,12 +237,13 @@ static void _rtl8723be_set_fw_clock_off(struct ieee80211_hw *hw, u8 rpwm_val)
231 jiffies + MSECS(10)); 237 jiffies + MSECS(10));
232 } 238 }
233 } 239 }
240
234} 241}
235 242
236static void _rtl8723be_set_fw_ps_rf_on(struct ieee80211_hw *hw) 243static void _rtl8723be_set_fw_ps_rf_on(struct ieee80211_hw *hw)
237{ 244{
238 u8 rpwm_val = 0; 245 u8 rpwm_val = 0;
239 rpwm_val |= (FW_PS_STATE_RF_OFF_88E | FW_PS_ACK); 246 rpwm_val |= (FW_PS_STATE_RF_OFF | FW_PS_ACK);
240 _rtl8723be_set_fw_clock_on(hw, rpwm_val, true); 247 _rtl8723be_set_fw_clock_on(hw, rpwm_val, true);
241} 248}
242 249
@@ -249,21 +256,23 @@ static void _rtl8723be_fwlps_leave(struct ieee80211_hw *hw)
249 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE; 256 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
250 257
251 if (ppsc->low_power_enable) { 258 if (ppsc->low_power_enable) {
252 rpwm_val = (FW_PS_STATE_ALL_ON_88E | FW_PS_ACK);/* RF on */ 259 rpwm_val = (FW_PS_STATE_ALL_ON | FW_PS_ACK);/* RF on */
253 _rtl8723be_set_fw_clock_on(hw, rpwm_val, false); 260 _rtl8723be_set_fw_clock_on(hw, rpwm_val, false);
254 rtlhal->allow_sw_to_change_hwclc = false; 261 rtlhal->allow_sw_to_change_hwclc = false;
255 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 262 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
256 &fw_pwrmode); 263 (u8 *)(&fw_pwrmode));
257 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 264 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
258 (u8 *)(&fw_current_inps)); 265 (u8 *)(&fw_current_inps));
259 } else { 266 } else {
260 rpwm_val = FW_PS_STATE_ALL_ON_88E; /* RF on */ 267 rpwm_val = FW_PS_STATE_ALL_ON; /* RF on */
261 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val); 268 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
269 (u8 *)(&rpwm_val));
262 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 270 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
263 &fw_pwrmode); 271 (u8 *)(&fw_pwrmode));
264 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 272 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
265 (u8 *)(&fw_current_inps)); 273 (u8 *)(&fw_current_inps));
266 } 274 }
275
267} 276}
268 277
269static void _rtl8723be_fwlps_enter(struct ieee80211_hw *hw) 278static void _rtl8723be_fwlps_enter(struct ieee80211_hw *hw)
@@ -275,22 +284,23 @@ static void _rtl8723be_fwlps_enter(struct ieee80211_hw *hw)
275 u8 rpwm_val; 284 u8 rpwm_val;
276 285
277 if (ppsc->low_power_enable) { 286 if (ppsc->low_power_enable) {
278 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_88E; /* RF off */ 287 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR; /* RF off */
279 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 288 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
280 (u8 *)(&fw_current_inps)); 289 (u8 *)(&fw_current_inps));
281 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 290 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
282 &ppsc->fwctrl_psmode); 291 (u8 *)(&ppsc->fwctrl_psmode));
283 rtlhal->allow_sw_to_change_hwclc = true; 292 rtlhal->allow_sw_to_change_hwclc = true;
284 _rtl8723be_set_fw_clock_off(hw, rpwm_val); 293 _rtl8723be_set_fw_clock_off(hw, rpwm_val);
285
286 } else { 294 } else {
287 rpwm_val = FW_PS_STATE_RF_OFF_88E; /* RF off */ 295 rpwm_val = FW_PS_STATE_RF_OFF; /* RF off */
288 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS, 296 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
289 (u8 *)(&fw_current_inps)); 297 (u8 *)(&fw_current_inps));
290 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE, 298 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
291 &ppsc->fwctrl_psmode); 299 (u8 *)(&ppsc->fwctrl_psmode));
292 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM, &rpwm_val); 300 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
301 (u8 *)(&rpwm_val));
293 } 302 }
303
294} 304}
295 305
296void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 306void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
@@ -306,13 +316,13 @@ void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
306 case HW_VAR_RF_STATE: 316 case HW_VAR_RF_STATE:
307 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state; 317 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
308 break; 318 break;
309 case HW_VAR_FWLPS_RF_ON: { 319 case HW_VAR_FWLPS_RF_ON:{
310 enum rf_pwrstate rfstate; 320 enum rf_pwrstate rfState;
311 u32 val_rcr; 321 u32 val_rcr;
312 322
313 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, 323 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE,
314 (u8 *)(&rfstate)); 324 (u8 *)(&rfState));
315 if (rfstate == ERFOFF) { 325 if (rfState == ERFOFF) {
316 *((bool *)(val)) = true; 326 *((bool *)(val)) = true;
317 } else { 327 } else {
318 val_rcr = rtl_read_dword(rtlpriv, REG_RCR); 328 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
@@ -322,11 +332,12 @@ void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
322 else 332 else
323 *((bool *)(val)) = true; 333 *((bool *)(val)) = true;
324 } 334 }
325 break; } 335 }
336 break;
326 case HW_VAR_FW_PSMODE_STATUS: 337 case HW_VAR_FW_PSMODE_STATUS:
327 *((bool *)(val)) = ppsc->fw_current_inpsmode; 338 *((bool *)(val)) = ppsc->fw_current_inpsmode;
328 break; 339 break;
329 case HW_VAR_CORRECT_TSF: { 340 case HW_VAR_CORRECT_TSF:{
330 u64 tsf; 341 u64 tsf;
331 u32 *ptsf_low = (u32 *)&tsf; 342 u32 *ptsf_low = (u32 *)&tsf;
332 u32 *ptsf_high = ((u32 *)&tsf) + 1; 343 u32 *ptsf_high = ((u32 *)&tsf) + 1;
@@ -335,15 +346,65 @@ void rtl8723be_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
335 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR); 346 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
336 347
337 *((u64 *)(val)) = tsf; 348 *((u64 *)(val)) = tsf;
338 349 }
339 break; } 350 break;
340 default: 351 default:
341 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 352 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
342 "switch case not process %x\n", variable); 353 "switch case not process %x\n", variable);
343 break; 354 break;
344 } 355 }
345} 356}
346 357
358static void _rtl8723be_download_rsvd_page(struct ieee80211_hw *hw)
359{
360 struct rtl_priv *rtlpriv = rtl_priv(hw);
361 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
362 u8 count = 0, dlbcn_count = 0;
363 bool b_recover = false;
364
365 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
366 rtl_write_byte(rtlpriv, REG_CR + 1,
367 (tmp_regcr | BIT(0)));
368
369 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
370 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
371
372 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
373 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422 & (~BIT(6)));
374 if (tmp_reg422 & BIT(6))
375 b_recover = true;
376
377 do {
378 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
379 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
380 (bcnvalid_reg | BIT(0)));
381 _rtl8723be_return_beacon_queue_skb(hw);
382
383 rtl8723be_set_fw_rsvdpagepkt(hw, 0);
384 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
385 count = 0;
386 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
387 count++;
388 udelay(10);
389 bcnvalid_reg = rtl_read_byte(rtlpriv,
390 REG_TDECTRL + 2);
391 }
392 dlbcn_count++;
393 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
394
395 if (bcnvalid_reg & BIT(0))
396 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
397
398 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
399 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
400
401 if (b_recover)
402 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
403
404 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
405 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
406}
407
347void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val) 408void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
348{ 409{
349 struct rtl_priv *rtlpriv = rtl_priv(hw); 410 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -358,22 +419,24 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
358 for (idx = 0; idx < ETH_ALEN; idx++) 419 for (idx = 0; idx < ETH_ALEN; idx++)
359 rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]); 420 rtl_write_byte(rtlpriv, (REG_MACID + idx), val[idx]);
360 break; 421 break;
361 case HW_VAR_BASIC_RATE: { 422 case HW_VAR_BASIC_RATE:{
362 u16 rate_cfg = ((u16 *)val)[0]; 423 u16 b_rate_cfg = ((u16 *)val)[0];
363 u8 rate_index = 0; 424 u8 rate_index = 0;
364 rate_cfg = rate_cfg & 0x15f; 425 b_rate_cfg = b_rate_cfg & 0x15f;
365 rate_cfg |= 0x01; 426 b_rate_cfg |= 0x01;
366 rtl_write_byte(rtlpriv, REG_RRSR, rate_cfg & 0xff); 427 rtl_write_byte(rtlpriv, REG_RRSR, b_rate_cfg & 0xff);
367 rtl_write_byte(rtlpriv, REG_RRSR + 1, (rate_cfg >> 8) & 0xff); 428 rtl_write_byte(rtlpriv, REG_RRSR + 1, (b_rate_cfg >> 8) & 0xff);
368 while (rate_cfg > 0x1) { 429 while (b_rate_cfg > 0x1) {
369 rate_cfg = (rate_cfg >> 1); 430 b_rate_cfg = (b_rate_cfg >> 1);
370 rate_index++; 431 rate_index++;
371 } 432 }
372 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, rate_index); 433 rtl_write_byte(rtlpriv, REG_INIRTS_RATE_SEL, rate_index);
373 break; } 434 }
435 break;
374 case HW_VAR_BSSID: 436 case HW_VAR_BSSID:
375 for (idx = 0; idx < ETH_ALEN; idx++) 437 for (idx = 0; idx < ETH_ALEN; idx++)
376 rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]); 438 rtl_write_byte(rtlpriv, (REG_BSSID + idx), val[idx]);
439
377 break; 440 break;
378 case HW_VAR_SIFS: 441 case HW_VAR_SIFS:
379 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]); 442 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
@@ -388,7 +451,7 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
388 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM, 451 rtl_write_word(rtlpriv, REG_RESP_SIFS_OFDM,
389 *((u16 *)val)); 452 *((u16 *)val));
390 break; 453 break;
391 case HW_VAR_SLOT_TIME: { 454 case HW_VAR_SLOT_TIME:{
392 u8 e_aci; 455 u8 e_aci;
393 456
394 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 457 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
@@ -398,12 +461,13 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
398 461
399 for (e_aci = 0; e_aci < AC_MAX; e_aci++) { 462 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
400 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM, 463 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
401 &e_aci); 464 (u8 *)(&e_aci));
402 } 465 }
403 break; } 466 }
404 case HW_VAR_ACK_PREAMBLE: { 467 break;
468 case HW_VAR_ACK_PREAMBLE:{
405 u8 reg_tmp; 469 u8 reg_tmp;
406 u8 short_preamble = (bool)*val; 470 u8 short_preamble = (bool)(*(u8 *)val);
407 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL + 2); 471 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL + 2);
408 if (short_preamble) { 472 if (short_preamble) {
409 reg_tmp |= 0x02; 473 reg_tmp |= 0x02;
@@ -412,15 +476,16 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
412 reg_tmp &= 0xFD; 476 reg_tmp &= 0xFD;
413 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp); 477 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2, reg_tmp);
414 } 478 }
415 break; } 479 }
480 break;
416 case HW_VAR_WPA_CONFIG: 481 case HW_VAR_WPA_CONFIG:
417 rtl_write_byte(rtlpriv, REG_SECCFG, *val); 482 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
418 break; 483 break;
419 case HW_VAR_AMPDU_MIN_SPACE: { 484 case HW_VAR_AMPDU_MIN_SPACE:{
420 u8 min_spacing_to_set; 485 u8 min_spacing_to_set;
421 u8 sec_min_space; 486 u8 sec_min_space;
422 487
423 min_spacing_to_set = *val; 488 min_spacing_to_set = *((u8 *)val);
424 if (min_spacing_to_set <= 7) { 489 if (min_spacing_to_set <= 7) {
425 sec_min_space = 0; 490 sec_min_space = 0;
426 491
@@ -434,26 +499,28 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
434 499
435 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 500 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
436 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n", 501 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
437 mac->min_space_cfg); 502 mac->min_space_cfg);
438 503
439 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 504 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
440 mac->min_space_cfg); 505 mac->min_space_cfg);
441 } 506 }
442 break; } 507 }
443 case HW_VAR_SHORTGI_DENSITY: { 508 break;
509 case HW_VAR_SHORTGI_DENSITY:{
444 u8 density_to_set; 510 u8 density_to_set;
445 511
446 density_to_set = *val; 512 density_to_set = *((u8 *)val);
447 mac->min_space_cfg |= (density_to_set << 3); 513 mac->min_space_cfg |= (density_to_set << 3);
448 514
449 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 515 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
450 "Set HW_VAR_SHORTGI_DENSITY: %#x\n", 516 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
451 mac->min_space_cfg); 517 mac->min_space_cfg);
452 518
453 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE, 519 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
454 mac->min_space_cfg); 520 mac->min_space_cfg);
455 break; } 521 }
456 case HW_VAR_AMPDU_FACTOR: { 522 break;
523 case HW_VAR_AMPDU_FACTOR:{
457 u8 regtoset_normal[4] = {0x41, 0xa8, 0x72, 0xb9}; 524 u8 regtoset_normal[4] = {0x41, 0xa8, 0x72, 0xb9};
458 u8 factor_toset; 525 u8 factor_toset;
459 u8 *p_regtoset = NULL; 526 u8 *p_regtoset = NULL;
@@ -461,7 +528,7 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
461 528
462 p_regtoset = regtoset_normal; 529 p_regtoset = regtoset_normal;
463 530
464 factor_toset = *val; 531 factor_toset = *((u8 *)val);
465 if (factor_toset <= 3) { 532 if (factor_toset <= 3) {
466 factor_toset = (1 << (factor_toset + 2)); 533 factor_toset = (1 << (factor_toset + 2));
467 if (factor_toset > 0xf) 534 if (factor_toset > 0xf)
@@ -482,22 +549,26 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
482 rtl_write_byte(rtlpriv, 549 rtl_write_byte(rtlpriv,
483 (REG_AGGLEN_LMT + index), 550 (REG_AGGLEN_LMT + index),
484 p_regtoset[index]); 551 p_regtoset[index]);
552
485 } 553 }
554
486 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 555 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
487 "Set HW_VAR_AMPDU_FACTOR: %#x\n", 556 "Set HW_VAR_AMPDU_FACTOR: %#x\n",
488 factor_toset); 557 factor_toset);
489 } 558 }
490 break; } 559 }
491 case HW_VAR_AC_PARAM: { 560 break;
492 u8 e_aci = *val; 561 case HW_VAR_AC_PARAM:{
562 u8 e_aci = *((u8 *)val);
493 rtl8723_dm_init_edca_turbo(hw); 563 rtl8723_dm_init_edca_turbo(hw);
494 564
495 if (rtlpci->acm_method != EACMWAY2_SW) 565 if (rtlpci->acm_method != EACMWAY2_SW)
496 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL, 566 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ACM_CTRL,
497 &e_aci); 567 (u8 *)(&e_aci));
498 break; } 568 }
499 case HW_VAR_ACM_CTRL: { 569 break;
500 u8 e_aci = *val; 570 case HW_VAR_ACM_CTRL:{
571 u8 e_aci = *((u8 *)val);
501 union aci_aifsn *p_aci_aifsn = 572 union aci_aifsn *p_aci_aifsn =
502 (union aci_aifsn *)(&(mac->ac[0].aifs)); 573 (union aci_aifsn *)(&(mac->ac[0].aifs));
503 u8 acm = p_aci_aifsn->f.acm; 574 u8 acm = p_aci_aifsn->f.acm;
@@ -519,8 +590,8 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
519 break; 590 break;
520 default: 591 default:
521 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 592 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
522 "HW_VAR_ACM_CTRL acm set " 593 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
523 "failed: eACI is %d\n", acm); 594 acm);
524 break; 595 break;
525 } 596 }
526 } else { 597 } else {
@@ -535,27 +606,30 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
535 acm_ctrl &= (~ACMHW_BEQEN); 606 acm_ctrl &= (~ACMHW_BEQEN);
536 break; 607 break;
537 default: 608 default:
538 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 609 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
539 "switch case not process\n"); 610 "switch case not process\n");
540 break; 611 break;
541 } 612 }
542 } 613 }
614
543 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE, 615 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
544 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] " 616 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
545 "Write 0x%X\n", acm_ctrl); 617 acm_ctrl);
546 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl); 618 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
547 break; } 619 }
620 break;
548 case HW_VAR_RCR: 621 case HW_VAR_RCR:
549 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]); 622 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
550 rtlpci->receive_config = ((u32 *)(val))[0]; 623 rtlpci->receive_config = ((u32 *)(val))[0];
551 break; 624 break;
552 case HW_VAR_RETRY_LIMIT: { 625 case HW_VAR_RETRY_LIMIT:{
553 u8 retry_limit = *val; 626 u8 retry_limit = ((u8 *)(val))[0];
554 627
555 rtl_write_word(rtlpriv, REG_RL, 628 rtl_write_word(rtlpriv, REG_RL,
556 retry_limit << RETRY_LIMIT_SHORT_SHIFT | 629 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
557 retry_limit << RETRY_LIMIT_LONG_SHIFT); 630 retry_limit << RETRY_LIMIT_LONG_SHIFT);
558 break; } 631 }
632 break;
559 case HW_VAR_DUAL_TSF_RST: 633 case HW_VAR_DUAL_TSF_RST:
560 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1))); 634 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
561 break; 635 break;
@@ -563,25 +637,27 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
563 rtlefuse->efuse_usedbytes = *((u16 *)val); 637 rtlefuse->efuse_usedbytes = *((u16 *)val);
564 break; 638 break;
565 case HW_VAR_EFUSE_USAGE: 639 case HW_VAR_EFUSE_USAGE:
566 rtlefuse->efuse_usedpercentage = *val; 640 rtlefuse->efuse_usedpercentage = *((u8 *)val);
567 break; 641 break;
568 case HW_VAR_IO_CMD: 642 case HW_VAR_IO_CMD:
569 rtl8723be_phy_set_io_cmd(hw, (*(enum io_type *)val)); 643 rtl8723be_phy_set_io_cmd(hw, (*(enum io_type *)val));
570 break; 644 break;
571 case HW_VAR_SET_RPWM: { 645 case HW_VAR_SET_RPWM:{
572 u8 rpwm_val; 646 u8 rpwm_val;
573 647
574 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM); 648 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
575 udelay(1); 649 udelay(1);
576 650
577 if (rpwm_val & BIT(7)) { 651 if (rpwm_val & BIT(7)) {
578 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val); 652 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, (*(u8 *)val));
579 } else { 653 } else {
580 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM, *val | BIT(7)); 654 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
655 ((*(u8 *)val) | BIT(7)));
581 } 656 }
582 break; } 657 }
658 break;
583 case HW_VAR_H2C_FW_PWRMODE: 659 case HW_VAR_H2C_FW_PWRMODE:
584 rtl8723be_set_fw_pwrmode_cmd(hw, *val); 660 rtl8723be_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
585 break; 661 break;
586 case HW_VAR_FW_PSMODE_STATUS: 662 case HW_VAR_FW_PSMODE_STATUS:
587 ppsc->fw_current_inpsmode = *((bool *)val); 663 ppsc->fw_current_inpsmode = *((bool *)val);
@@ -589,85 +665,38 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
589 case HW_VAR_RESUME_CLK_ON: 665 case HW_VAR_RESUME_CLK_ON:
590 _rtl8723be_set_fw_ps_rf_on(hw); 666 _rtl8723be_set_fw_ps_rf_on(hw);
591 break; 667 break;
592 case HW_VAR_FW_LPS_ACTION: { 668 case HW_VAR_FW_LPS_ACTION:{
593 bool enter_fwlps = *((bool *)val); 669 bool b_enter_fwlps = *((bool *)val);
594 670
595 if (enter_fwlps) 671 if (b_enter_fwlps)
596 _rtl8723be_fwlps_enter(hw); 672 _rtl8723be_fwlps_enter(hw);
597 else 673 else
598 _rtl8723be_fwlps_leave(hw); 674 _rtl8723be_fwlps_leave(hw);
599 675 }
600 break; } 676 break;
601 case HW_VAR_H2C_FW_JOINBSSRPT: { 677 case HW_VAR_H2C_FW_JOINBSSRPT:{
602 u8 mstatus = *val; 678 u8 mstatus = (*(u8 *)val);
603 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
604 u8 count = 0, dlbcn_count = 0;
605 bool recover = false;
606 679
607 if (mstatus == RT_MEDIA_CONNECT) { 680 if (mstatus == RT_MEDIA_CONNECT) {
608 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL); 681 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
609 682 _rtl8723be_download_rsvd_page(hw);
610 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1); 683 }
611 rtl_write_byte(rtlpriv, REG_CR + 1, 684 rtl8723be_set_fw_media_status_rpt_cmd(hw, mstatus);
612 (tmp_regcr | BIT(0)));
613
614 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(3));
615 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(4), 0);
616
617 tmp_reg422 = rtl_read_byte(rtlpriv,
618 REG_FWHW_TXQ_CTRL + 2);
619 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
620 tmp_reg422 & (~BIT(6)));
621 if (tmp_reg422 & BIT(6))
622 recover = true;
623
624 do {
625 bcnvalid_reg = rtl_read_byte(rtlpriv,
626 REG_TDECTRL + 2);
627 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
628 (bcnvalid_reg | BIT(0)));
629 _rtl8723be_return_beacon_queue_skb(hw);
630
631 rtl8723be_set_fw_rsvdpagepkt(hw, 0);
632 bcnvalid_reg = rtl_read_byte(rtlpriv,
633 REG_TDECTRL + 2);
634 count = 0;
635 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
636 count++;
637 udelay(10);
638 bcnvalid_reg = rtl_read_byte(rtlpriv,
639 REG_TDECTRL + 2);
640 }
641 dlbcn_count++;
642 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
643
644 if (bcnvalid_reg & BIT(0))
645 rtl_write_byte(rtlpriv, REG_TDECTRL+2, BIT(0));
646
647 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
648 _rtl8723be_set_bcn_ctrl_reg(hw, 0, BIT(4));
649
650 if (recover) {
651 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
652 tmp_reg422);
653 }
654 rtl_write_byte(rtlpriv, REG_CR + 1,
655 (tmp_regcr & ~(BIT(0))));
656 } 685 }
657 rtl8723be_set_fw_joinbss_report_cmd(hw, *val); 686 break;
658 break; }
659 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD: 687 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
660 rtl8723be_set_p2p_ps_offload_cmd(hw, *val); 688 rtl8723be_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
661 break; 689 break;
662 case HW_VAR_AID: { 690 case HW_VAR_AID:{
663 u16 u2btmp; 691 u16 u2btmp;
664 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT); 692 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
665 u2btmp &= 0xC000; 693 u2btmp &= 0xC000;
666 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, 694 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT,
667 (u2btmp | mac->assoc_id)); 695 (u2btmp | mac->assoc_id));
668 break; } 696 }
669 case HW_VAR_CORRECT_TSF: { 697 break;
670 u8 btype_ibss = *val; 698 case HW_VAR_CORRECT_TSF:{
699 u8 btype_ibss = ((u8 *)(val))[0];
671 700
672 if (btype_ibss) 701 if (btype_ibss)
673 _rtl8723be_stop_tx_beacon(hw); 702 _rtl8723be_stop_tx_beacon(hw);
@@ -683,16 +712,17 @@ void rtl8723be_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
683 712
684 if (btype_ibss) 713 if (btype_ibss)
685 _rtl8723be_resume_tx_beacon(hw); 714 _rtl8723be_resume_tx_beacon(hw);
686 break; } 715 }
687 case HW_VAR_KEEP_ALIVE: { 716 break;
717 case HW_VAR_KEEP_ALIVE:{
688 u8 array[2]; 718 u8 array[2];
689 array[0] = 0xff; 719 array[0] = 0xff;
690 array[1] = *val; 720 array[1] = *((u8 *)val);
691 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_KEEP_ALIVE_CTRL, 721 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_KEEP_ALIVE_CTRL, 2, array);
692 2, array); 722 }
693 break; } 723 break;
694 default: 724 default:
695 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 725 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
696 "switch case not process %x\n", 726 "switch case not process %x\n",
697 variable); 727 variable);
698 break; 728 break;
@@ -703,7 +733,7 @@ static bool _rtl8723be_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
703{ 733{
704 struct rtl_priv *rtlpriv = rtl_priv(hw); 734 struct rtl_priv *rtlpriv = rtl_priv(hw);
705 bool status = true; 735 bool status = true;
706 int count = 0; 736 long count = 0;
707 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) | 737 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
708 _LLT_OP(_LLT_WRITE_ACCESS); 738 _LLT_OP(_LLT_WRITE_ACCESS);
709 739
@@ -716,8 +746,8 @@ static bool _rtl8723be_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
716 746
717 if (count > POLLING_LLT_THRESHOLD) { 747 if (count > POLLING_LLT_THRESHOLD) {
718 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 748 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
719 "Failed to polling write LLT done at " 749 "Failed to polling write LLT done at address %d!\n",
720 "address %d!\n", address); 750 address);
721 status = false; 751 status = false;
722 break; 752 break;
723 } 753 }
@@ -731,10 +761,10 @@ static bool _rtl8723be_llt_table_init(struct ieee80211_hw *hw)
731 struct rtl_priv *rtlpriv = rtl_priv(hw); 761 struct rtl_priv *rtlpriv = rtl_priv(hw);
732 unsigned short i; 762 unsigned short i;
733 u8 txpktbuf_bndy; 763 u8 txpktbuf_bndy;
734 u8 maxpage; 764 u8 maxPage;
735 bool status; 765 bool status;
736 766
737 maxpage = 255; 767 maxPage = 255;
738 txpktbuf_bndy = 245; 768 txpktbuf_bndy = 245;
739 769
740 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY, 770 rtl_write_dword(rtlpriv, REG_TRXFF_BNDY,
@@ -753,17 +783,19 @@ static bool _rtl8723be_llt_table_init(struct ieee80211_hw *hw)
753 if (!status) 783 if (!status)
754 return status; 784 return status;
755 } 785 }
786
756 status = _rtl8723be_llt_write(hw, (txpktbuf_bndy - 1), 0xFF); 787 status = _rtl8723be_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
757 788
758 if (!status) 789 if (!status)
759 return status; 790 return status;
760 791
761 for (i = txpktbuf_bndy; i < maxpage; i++) { 792 for (i = txpktbuf_bndy; i < maxPage; i++) {
762 status = _rtl8723be_llt_write(hw, i, (i + 1)); 793 status = _rtl8723be_llt_write(hw, i, (i + 1));
763 if (!status) 794 if (!status)
764 return status; 795 return status;
765 } 796 }
766 status = _rtl8723be_llt_write(hw, maxpage, txpktbuf_bndy); 797
798 status = _rtl8723be_llt_write(hw, maxPage, txpktbuf_bndy);
767 if (!status) 799 if (!status)
768 return status; 800 return status;
769 801
@@ -795,11 +827,9 @@ static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
795{ 827{
796 struct rtl_priv *rtlpriv = rtl_priv(hw); 828 struct rtl_priv *rtlpriv = rtl_priv(hw);
797 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 829 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
798 830 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
799 unsigned char bytetmp; 831 unsigned char bytetmp;
800 unsigned short wordtmp; 832 unsigned short wordtmp;
801 u16 retry = 0;
802 bool mac_func_enable;
803 833
804 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00); 834 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
805 835
@@ -807,12 +837,6 @@ static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
807 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7)); 837 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
808 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp); 838 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
809 839
810 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
811 if (bytetmp == 0xFF)
812 mac_func_enable = true;
813 else
814 mac_func_enable = false;
815
816 /* HW Power on sequence */ 840 /* HW Power on sequence */
817 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, 841 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
818 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, 842 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
@@ -821,6 +845,10 @@ static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
821 "init MAC Fail as power on failure\n"); 845 "init MAC Fail as power on failure\n");
822 return false; 846 return false;
823 } 847 }
848
849 bytetmp = rtl_read_byte(rtlpriv, REG_MULTI_FUNC_CTRL);
850 rtl_write_byte(rtlpriv, REG_MULTI_FUNC_CTRL, bytetmp | BIT(3));
851
824 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4); 852 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
825 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp); 853 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
826 854
@@ -837,25 +865,21 @@ static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
837 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3); 865 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
838 if (bytetmp & BIT(0)) { 866 if (bytetmp & BIT(0)) {
839 bytetmp = rtl_read_byte(rtlpriv, 0x7c); 867 bytetmp = rtl_read_byte(rtlpriv, 0x7c);
840 bytetmp |= BIT(6); 868 rtl_write_byte(rtlpriv, 0x7c, bytetmp | BIT(6));
841 rtl_write_byte(rtlpriv, 0x7c, bytetmp);
842 } 869 }
870
843 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR); 871 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
844 bytetmp |= BIT(3); 872 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp | BIT(3));
845 rtl_write_byte(rtlpriv, REG_SYS_CLKR, bytetmp);
846 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1); 873 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
847 bytetmp &= ~BIT(4); 874 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp & (~BIT(4)));
848 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp);
849
850 bytetmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG+3);
851 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG+3, bytetmp | 0x77);
852 875
853 rtl_write_word(rtlpriv, REG_CR, 0x2ff); 876 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
854 877
855 if (!mac_func_enable) { 878 if (!rtlhal->mac_func_enable) {
856 if (!_rtl8723be_llt_table_init(hw)) 879 if (_rtl8723be_llt_table_init(hw) == false)
857 return false; 880 return false;
858 } 881 }
882
859 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff); 883 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
860 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff); 884 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
861 885
@@ -873,8 +897,6 @@ static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
873 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF); 897 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
874 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config); 898 rtl_write_dword(rtlpriv, REG_TCR, rtlpci->transmit_config);
875 899
876 rtl_write_byte(rtlpriv, 0x4d0, 0x0);
877
878 rtl_write_dword(rtlpriv, REG_BCNQ_DESA, 900 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
879 ((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) & 901 ((u64) rtlpci->tx_ring[BEACON_QUEUE].dma) &
880 DMA_BIT_MASK(32)); 902 DMA_BIT_MASK(32));
@@ -901,57 +923,213 @@ static bool _rtl8723be_init_mac(struct ieee80211_hw *hw)
901 923
902 rtl_write_dword(rtlpriv, REG_INT_MIG, 0); 924 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
903 925
904 bytetmp = rtl_read_byte(rtlpriv, REG_APSD_CTRL); 926 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0);
905 rtl_write_byte(rtlpriv, REG_APSD_CTRL, bytetmp & ~BIT(6));
906 927
907 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3); 928 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
908 929
909 do { 930 /* <20130114, Kordan> The following setting is
910 retry++; 931 * only for DPDT and Fixed board type.
911 bytetmp = rtl_read_byte(rtlpriv, REG_APSD_CTRL); 932 * TODO: A better solution is configure it
912 } while ((retry < 200) && (bytetmp & BIT(7))); 933 * according EFUSE during the run-time.
913 934 */
914 _rtl8723be_gen_refresh_led_state(hw); 935 rtl_set_bbreg(hw, 0x64, BIT(20), 0x0);/* 0x66[4]=0 */
915 936 rtl_set_bbreg(hw, 0x64, BIT(24), 0x0);/* 0x66[8]=0 */
916 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0x0); 937 rtl_set_bbreg(hw, 0x40, BIT(4), 0x0)/* 0x40[4]=0 */;
938 rtl_set_bbreg(hw, 0x40, BIT(3), 0x1)/* 0x40[3]=1 */;
939 rtl_set_bbreg(hw, 0x4C, BIT(24) | BIT(23), 0x2)/* 0x4C[24:23]=10 */;
940 rtl_set_bbreg(hw, 0x944, BIT(1) | BIT(0), 0x3)/* 0x944[1:0]=11 */;
941 rtl_set_bbreg(hw, 0x930, MASKBYTE0, 0x77)/* 0x930[7:0]=77 */;
942 rtl_set_bbreg(hw, 0x38, BIT(11), 0x1)/* 0x38[11]=1 */;
917 943
918 bytetmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL); 944 bytetmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
919 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, bytetmp & ~BIT(2)); 945 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, bytetmp & (~BIT(2)));
920 946
947 _rtl8723be_gen_refresh_led_state(hw);
921 return true; 948 return true;
922} 949}
923 950
924static void _rtl8723be_hw_configure(struct ieee80211_hw *hw) 951static void _rtl8723be_hw_configure(struct ieee80211_hw *hw)
925{ 952{
926 struct rtl_priv *rtlpriv = rtl_priv(hw); 953 struct rtl_priv *rtlpriv = rtl_priv(hw);
927 u8 reg_bw_opmode; 954 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
928 u32 reg_ratr, reg_prsr; 955 u32 reg_rrsr;
956
957 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
958 /* Init value for RRSR. */
959 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
960
961 /* ARFB table 9 for 11ac 5G 2SS */
962 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
963
964 /* ARFB table 10 for 11ac 5G 1SS */
965 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
966
967 /* CF-End setting. */
968 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
969
970 /* 0x456 = 0x70, sugguested by Zhilin */
971 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
972
973 /* Set retry limit */
974 rtl_write_word(rtlpriv, REG_RL, 0x0707);
975
976 /* Set Data / Response auto rate fallack retry count */
977 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
978 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
979 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
980 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
981
982 rtlpci->reg_bcn_ctrl_val = 0x1d;
983 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
984
985 /* TBTT prohibit hold time. Suggested by designer TimChen. */
986 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff); /* 8 ms */
987
988 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
989
990 /*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
991 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
929 992
930 reg_bw_opmode = BW_OPMODE_20MHZ; 993 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
931 reg_ratr = RATE_ALL_CCK | RATE_ALL_OFDM_AG |
932 RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
933 reg_prsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
934 994
935 rtl_write_dword(rtlpriv, REG_RRSR, reg_prsr); 995 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
936 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, 0xFF); 996
997 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x1F);
998}
999
1000static u8 _rtl8723be_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
1001{
1002 u16 read_addr = addr & 0xfffc;
1003 u8 ret = 0, tmp = 0, count = 0;
1004
1005 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
1006 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
1007 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1008 count = 0;
1009 while (tmp && count < 20) {
1010 udelay(10);
1011 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1012 count++;
1013 }
1014 if (0 == tmp) {
1015 read_addr = REG_DBI_RDATA + addr % 4;
1016 ret = rtl_read_byte(rtlpriv, read_addr);
1017 }
1018
1019 return ret;
1020}
1021
1022static void _rtl8723be_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1023{
1024 u8 tmp = 0, count = 0;
1025 u16 write_addr = 0, remainder = addr % 4;
1026
1027 /* Write DBI 1Byte Data */
1028 write_addr = REG_DBI_WDATA + remainder;
1029 rtl_write_byte(rtlpriv, write_addr, data);
1030
1031 /* Write DBI 2Byte Address & Write Enable */
1032 write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1033 rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr);
1034
1035 /* Write DBI Write Flag */
1036 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1037
1038 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1039 count = 0;
1040 while (tmp && count < 20) {
1041 udelay(10);
1042 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1043 count++;
1044 }
1045}
1046
1047static u16 _rtl8723be_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1048{
1049 u16 ret = 0;
1050 u8 tmp = 0, count = 0;
1051
1052 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1053 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1054 count = 0;
1055 while (tmp && count < 20) {
1056 udelay(10);
1057 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1058 count++;
1059 }
1060
1061 if (0 == tmp)
1062 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1063
1064 return ret;
1065}
1066
1067static void _rtl8723be_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1068{
1069 u8 tmp = 0, count = 0;
1070
1071 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1072 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1073 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1074 count = 0;
1075 while (tmp && count < 20) {
1076 udelay(10);
1077 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1078 count++;
1079 }
937} 1080}
938 1081
939static void _rtl8723be_enable_aspm_back_door(struct ieee80211_hw *hw) 1082static void _rtl8723be_enable_aspm_back_door(struct ieee80211_hw *hw)
940{ 1083{
941 struct rtl_priv *rtlpriv = rtl_priv(hw); 1084 struct rtl_priv *rtlpriv = rtl_priv(hw);
942 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 1085 u8 tmp8 = 0;
1086 u16 tmp16 = 0;
943 1087
944 rtl_write_byte(rtlpriv, 0x34b, 0x93); 1088 /* <Roger_Notes> Overwrite following ePHY parameter for
945 rtl_write_word(rtlpriv, 0x350, 0x870c); 1089 * some platform compatibility issue,
946 rtl_write_byte(rtlpriv, 0x352, 0x1); 1090 * especially when CLKReq is enabled, 2012.11.09.
1091 */
1092 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x01);
1093 if (tmp16 != 0x0663)
1094 _rtl8723be_mdio_write(rtlpriv, 0x01, 0x0663);
947 1095
948 if (ppsc->support_backdoor) 1096 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x04);
949 rtl_write_byte(rtlpriv, 0x349, 0x1b); 1097 if (tmp16 != 0x7544)
950 else 1098 _rtl8723be_mdio_write(rtlpriv, 0x04, 0x7544);
951 rtl_write_byte(rtlpriv, 0x349, 0x03); 1099
1100 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x06);
1101 if (tmp16 != 0xB880)
1102 _rtl8723be_mdio_write(rtlpriv, 0x06, 0xB880);
1103
1104 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x07);
1105 if (tmp16 != 0x4000)
1106 _rtl8723be_mdio_write(rtlpriv, 0x07, 0x4000);
1107
1108 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x08);
1109 if (tmp16 != 0x9003)
1110 _rtl8723be_mdio_write(rtlpriv, 0x08, 0x9003);
1111
1112 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x09);
1113 if (tmp16 != 0x0D03)
1114 _rtl8723be_mdio_write(rtlpriv, 0x09, 0x0D03);
1115
1116 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0A);
1117 if (tmp16 != 0x4037)
1118 _rtl8723be_mdio_write(rtlpriv, 0x0A, 0x4037);
952 1119
953 rtl_write_word(rtlpriv, 0x350, 0x2718); 1120 tmp16 = _rtl8723be_mdio_read(rtlpriv, 0x0B);
954 rtl_write_byte(rtlpriv, 0x352, 0x1); 1121 if (tmp16 != 0x0070)
1122 _rtl8723be_mdio_write(rtlpriv, 0x0B, 0x0070);
1123
1124 /* Configuration Space offset 0x70f BIT7 is used to control L0S */
1125 tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x70f);
1126 _rtl8723be_dbi_write(rtlpriv, 0x70f, tmp8 | BIT(7));
1127
1128 /* Configuration Space offset 0x719 Bit3 is for L1
1129 * BIT4 is for clock request
1130 */
1131 tmp8 = _rtl8723be_dbi_read(rtlpriv, 0x719);
1132 _rtl8723be_dbi_write(rtlpriv, 0x719, tmp8 | BIT(3) | BIT(4));
955} 1133}
956 1134
957void rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw) 1135void rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw)
@@ -961,30 +1139,208 @@ void rtl8723be_enable_hw_security_config(struct ieee80211_hw *hw)
961 1139
962 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, 1140 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
963 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n", 1141 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
964 rtlpriv->sec.pairwise_enc_algorithm, 1142 rtlpriv->sec.pairwise_enc_algorithm,
965 rtlpriv->sec.group_enc_algorithm); 1143 rtlpriv->sec.group_enc_algorithm);
966 1144
967 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) { 1145 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
968 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 1146 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
969 "not open hw encryption\n"); 1147 "not open hw encryption\n");
970 return; 1148 return;
971 } 1149 }
1150
972 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE; 1151 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
973 1152
974 if (rtlpriv->sec.use_defaultkey) { 1153 if (rtlpriv->sec.use_defaultkey) {
975 sec_reg_value |= SCR_TXUSEDK; 1154 sec_reg_value |= SCR_TXUSEDK;
976 sec_reg_value |= SCR_RXUSEDK; 1155 sec_reg_value |= SCR_RXUSEDK;
977 } 1156 }
1157
978 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK); 1158 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
979 1159
980 rtl_write_byte(rtlpriv, REG_CR + 1, 0x02); 1160 rtl_write_byte(rtlpriv, REG_CR + 1, 0x02);
981 1161
982 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "The SECR-value %x\n", 1162 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
983 sec_reg_value); 1163 "The SECR-value %x\n", sec_reg_value);
984 1164
985 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value); 1165 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
986} 1166}
987 1167
1168static void _rtl8723be_poweroff_adapter(struct ieee80211_hw *hw)
1169{
1170 struct rtl_priv *rtlpriv = rtl_priv(hw);
1171 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1172 u8 u1b_tmp;
1173
1174 rtlhal->mac_func_enable = false;
1175 /* Combo (PCIe + USB) Card and PCIe-MF Card */
1176 /* 1. Run LPS WL RFOFF flow */
1177 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1178 PWR_INTF_PCI_MSK, RTL8723_NIC_LPS_ENTER_FLOW);
1179
1180 /* 2. 0x1F[7:0] = 0 */
1181 /* turn off RF */
1182 /* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */
1183 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1184 rtlhal->fw_ready) {
1185 rtl8723be_firmware_selfreset(hw);
1186 }
1187
1188 /* Reset MCU. Suggested by Filen. */
1189 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1190 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1191
1192 /* g. MCUFWDL 0x80[1:0]=0 */
1193 /* reset MCU ready status */
1194 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1195
1196 /* HW card disable configuration. */
1197 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1198 PWR_INTF_PCI_MSK, RTL8723_NIC_DISABLE_FLOW);
1199
1200 /* Reset MCU IO Wrapper */
1201 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1202 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1203 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1204 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1205
1206 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1207 /* lock ISO/CLK/Power control register */
1208 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1209}
1210
1211static bool _rtl8723be_check_pcie_dma_hang(struct rtl_priv *rtlpriv)
1212{
1213 u8 tmp;
1214
1215 /* write reg 0x350 Bit[26]=1. Enable debug port. */
1216 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1217 if (!(tmp & BIT(2))) {
1218 rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
1219 mdelay(100); /* Suggested by DD Justin_tsai. */
1220 }
1221
1222 /* read reg 0x350 Bit[25] if 1 : RX hang
1223 * read reg 0x350 Bit[24] if 1 : TX hang
1224 */
1225 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1226 if ((tmp & BIT(0)) || (tmp & BIT(1))) {
1227 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1228 "CheckPcieDMAHang8723BE(): true!!\n");
1229 return true;
1230 }
1231 return false;
1232}
1233
1234static void _rtl8723be_reset_pcie_interface_dma(struct rtl_priv *rtlpriv,
1235 bool mac_power_on)
1236{
1237 u8 tmp;
1238 bool release_mac_rx_pause;
1239 u8 backup_pcie_dma_pause;
1240
1241 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1242 "ResetPcieInterfaceDMA8723BE()\n");
1243
1244 /* Revise Note: Follow the document "PCIe RX DMA Hang Reset Flow_v03"
1245 * released by SD1 Alan.
1246 * 2013.05.07, by tynli.
1247 */
1248
1249 /* 1. disable register write lock
1250 * write 0x1C bit[1:0] = 2'h0
1251 * write 0xCC bit[2] = 1'b1
1252 */
1253 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1254 tmp &= ~(BIT(1) | BIT(0));
1255 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1256 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1257 tmp |= BIT(2);
1258 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1259
1260 /* 2. Check and pause TRX DMA
1261 * write 0x284 bit[18] = 1'b1
1262 * write 0x301 = 0xFF
1263 */
1264 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1265 if (tmp & BIT(2)) {
1266 /* Already pause before the function for another purpose. */
1267 release_mac_rx_pause = false;
1268 } else {
1269 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1270 release_mac_rx_pause = true;
1271 }
1272
1273 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
1274 if (backup_pcie_dma_pause != 0xFF)
1275 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
1276
1277 if (mac_power_on) {
1278 /* 3. reset TRX function
1279 * write 0x100 = 0x00
1280 */
1281 rtl_write_byte(rtlpriv, REG_CR, 0);
1282 }
1283
1284 /* 4. Reset PCIe DMA
1285 * write 0x003 bit[0] = 0
1286 */
1287 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1288 tmp &= ~(BIT(0));
1289 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1290
1291 /* 5. Enable PCIe DMA
1292 * write 0x003 bit[0] = 1
1293 */
1294 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1295 tmp |= BIT(0);
1296 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1297
1298 if (mac_power_on) {
1299 /* 6. enable TRX function
1300 * write 0x100 = 0xFF
1301 */
1302 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1303
1304 /* We should init LLT & RQPN and
1305 * prepare Tx/Rx descrptor address later
1306 * because MAC function is reset.
1307 */
1308 }
1309
1310 /* 7. Restore PCIe autoload down bit
1311 * write 0xF8 bit[17] = 1'b1
1312 */
1313 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
1314 tmp |= BIT(1);
1315 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
1316
1317 /* In MAC power on state, BB and RF maybe in ON state,
1318 * if we release TRx DMA here
1319 * it will cause packets to be started to Tx/Rx,
1320 * so we release Tx/Rx DMA later.
1321 */
1322 if (!mac_power_on) {
1323 /* 8. release TRX DMA
1324 * write 0x284 bit[18] = 1'b0
1325 * write 0x301 = 0x00
1326 */
1327 if (release_mac_rx_pause) {
1328 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1329 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
1330 (tmp & (~BIT(2))));
1331 }
1332 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
1333 backup_pcie_dma_pause);
1334 }
1335
1336 /* 9. lock system register
1337 * write 0xCC bit[2] = 1'b0
1338 */
1339 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1340 tmp &= ~(BIT(2));
1341 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1342}
1343
988int rtl8723be_hw_init(struct ieee80211_hw *hw) 1344int rtl8723be_hw_init(struct ieee80211_hw *hw)
989{ 1345{
990 struct rtl_priv *rtlpriv = rtl_priv(hw); 1346 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -1002,33 +1358,51 @@ int rtl8723be_hw_init(struct ieee80211_hw *hw)
1002 local_save_flags(flags); 1358 local_save_flags(flags);
1003 local_irq_enable(); 1359 local_irq_enable();
1004 1360
1361 rtlhal->fw_ready = false;
1005 rtlpriv->rtlhal.being_init_adapter = true; 1362 rtlpriv->rtlhal.being_init_adapter = true;
1006 rtlpriv->intf_ops->disable_aspm(hw); 1363 rtlpriv->intf_ops->disable_aspm(hw);
1364
1365 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1366 if (tmp_u1b != 0 && tmp_u1b != 0xea) {
1367 rtlhal->mac_func_enable = true;
1368 } else {
1369 rtlhal->mac_func_enable = false;
1370 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON;
1371 }
1372
1373 if (_rtl8723be_check_pcie_dma_hang(rtlpriv)) {
1374 _rtl8723be_reset_pcie_interface_dma(rtlpriv,
1375 rtlhal->mac_func_enable);
1376 rtlhal->mac_func_enable = false;
1377 }
1378 if (rtlhal->mac_func_enable) {
1379 _rtl8723be_poweroff_adapter(hw);
1380 rtlhal->mac_func_enable = false;
1381 }
1007 rtstatus = _rtl8723be_init_mac(hw); 1382 rtstatus = _rtl8723be_init_mac(hw);
1008 if (!rtstatus) { 1383 if (!rtstatus) {
1009 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n"); 1384 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1010 err = 1; 1385 err = 1;
1011 goto exit; 1386 goto exit;
1012 } 1387 }
1388
1013 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG); 1389 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1014 tmp_u1b &= 0x7F; 1390 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b & 0x7F);
1015 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b);
1016 1391
1017 err = rtl8723_download_fw(hw, true); 1392 err = rtl8723_download_fw(hw, true, FW_8723B_POLLING_TIMEOUT_COUNT);
1018 if (err) { 1393 if (err) {
1019 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 1394 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1020 "Failed to download FW. Init HW without FW now..\n"); 1395 "Failed to download FW. Init HW without FW now..\n");
1021 err = 1; 1396 err = 1;
1022 rtlhal->fw_ready = false;
1023 goto exit; 1397 goto exit;
1024 } else {
1025 rtlhal->fw_ready = true;
1026 } 1398 }
1399 rtlhal->fw_ready = true;
1400
1027 rtlhal->last_hmeboxnum = 0; 1401 rtlhal->last_hmeboxnum = 0;
1028 rtl8723be_phy_mac_config(hw); 1402 rtl8723be_phy_mac_config(hw);
1029 /* because last function modify RCR, so we update 1403 /* because last function modify RCR, so we update
1030 * rcr var here, or TP will unstable for receive_config 1404 * rcr var here, or TP will unstable for receive_config
1031 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx 1405 * is wrong, RX RCR_ACRC32 will cause TP unstable & Rx
1032 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252 1406 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1033 */ 1407 */
1034 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR); 1408 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
@@ -1036,7 +1410,6 @@ int rtl8723be_hw_init(struct ieee80211_hw *hw)
1036 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config); 1410 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1037 1411
1038 rtl8723be_phy_bb_config(hw); 1412 rtl8723be_phy_bb_config(hw);
1039 rtlphy->rf_mode = RF_OP_BY_SW_3WIRE;
1040 rtl8723be_phy_rf_config(hw); 1413 rtl8723be_phy_rf_config(hw);
1041 1414
1042 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0, 1415 rtlphy->rfreg_chnlval[0] = rtl_get_rfreg(hw, (enum radio_path)0,
@@ -1046,10 +1419,8 @@ int rtl8723be_hw_init(struct ieee80211_hw *hw)
1046 rtlphy->rfreg_chnlval[0] &= 0xFFF03FF; 1419 rtlphy->rfreg_chnlval[0] &= 0xFFF03FF;
1047 rtlphy->rfreg_chnlval[0] |= (BIT(10) | BIT(11)); 1420 rtlphy->rfreg_chnlval[0] |= (BIT(10) | BIT(11));
1048 1421
1049 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1050 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1051 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);
1052 _rtl8723be_hw_configure(hw); 1422 _rtl8723be_hw_configure(hw);
1423 rtlhal->mac_func_enable = true;
1053 rtl_cam_reset_all_entry(hw); 1424 rtl_cam_reset_all_entry(hw);
1054 rtl8723be_enable_hw_security_config(hw); 1425 rtl8723be_enable_hw_security_config(hw);
1055 1426
@@ -1061,36 +1432,32 @@ int rtl8723be_hw_init(struct ieee80211_hw *hw)
1061 1432
1062 rtl8723be_bt_hw_init(hw); 1433 rtl8723be_bt_hw_init(hw);
1063 1434
1064 rtl_set_bbreg(hw, 0x64, BIT(20), 0);
1065 rtl_set_bbreg(hw, 0x64, BIT(24), 0);
1066
1067 rtl_set_bbreg(hw, 0x40, BIT(4), 0);
1068 rtl_set_bbreg(hw, 0x40, BIT(3), 1);
1069
1070 rtl_set_bbreg(hw, 0x944, BIT(0)|BIT(1), 0x3);
1071 rtl_set_bbreg(hw, 0x930, 0xff, 0x77);
1072
1073 rtl_set_bbreg(hw, 0x38, BIT(11), 0x1);
1074
1075 rtl_set_bbreg(hw, 0xb2c, 0xffffffff, 0x80000000);
1076
1077 if (ppsc->rfpwr_state == ERFON) { 1435 if (ppsc->rfpwr_state == ERFON) {
1436 rtl8723be_phy_set_rfpath_switch(hw, 1);
1437 /* when use 1ant NIC, iqk will disturb BT music
1438 * root cause is not clear now, is something
1439 * related with 'mdelay' and Reg[0x948]
1440 */
1441 if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2 ||
1442 !rtlpriv->cfg->ops->get_btc_status()) {
1443 rtl8723be_phy_iq_calibrate(hw, false);
1444 rtlphy->iqk_initialized = true;
1445 }
1078 rtl8723be_dm_check_txpower_tracking(hw); 1446 rtl8723be_dm_check_txpower_tracking(hw);
1079 rtl8723be_phy_lc_calibrate(hw); 1447 rtl8723be_phy_lc_calibrate(hw);
1080 } 1448 }
1081 tmp_u1b = efuse_read_1byte(hw, 0x1FA); 1449 rtl_write_byte(rtlpriv, REG_NAV_UPPER, ((30000 + 127) / 128));
1082 if (!(tmp_u1b & BIT(0))) { 1450
1083 rtl_set_rfreg(hw, RF90_PATH_A, 0x15, 0x0F, 0x05); 1451 /* Release Rx DMA. */
1084 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "PA BIAS path A\n"); 1452 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1085 } 1453 if (tmp_u1b & BIT(2)) {
1086 if (!(tmp_u1b & BIT(4))) { 1454 /* Release Rx DMA if needed */
1087 tmp_u1b = rtl_read_byte(rtlpriv, 0x16); 1455 tmp_u1b &= (~BIT(2));
1088 tmp_u1b &= 0x0F; 1456 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
1089 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x80);
1090 udelay(10);
1091 rtl_write_byte(rtlpriv, 0x16, tmp_u1b | 0x90);
1092 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "under 1.5V\n");
1093 } 1457 }
1458 /* Release Tx/Rx PCIE DMA. */
1459 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
1460
1094 rtl8723be_dm_init(hw); 1461 rtl8723be_dm_init(hw);
1095exit: 1462exit:
1096 local_irq_restore(flags); 1463 local_irq_restore(flags);
@@ -1103,43 +1470,29 @@ static enum version_8723e _rtl8723be_read_chip_version(struct ieee80211_hw *hw)
1103 struct rtl_priv *rtlpriv = rtl_priv(hw); 1470 struct rtl_priv *rtlpriv = rtl_priv(hw);
1104 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1471 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1105 enum version_8723e version = VERSION_UNKNOWN; 1472 enum version_8723e version = VERSION_UNKNOWN;
1106 u8 count = 0;
1107 u8 value8;
1108 u32 value32; 1473 u32 value32;
1109 1474
1110 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0);
1111
1112 value8 = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 2);
1113 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 2, value8 | BIT(0));
1114
1115 value8 = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1);
1116 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, value8 | BIT(0));
1117
1118 value8 = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1);
1119 while (((value8 & BIT(0))) && (count++ < 100)) {
1120 udelay(10);
1121 value8 = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1);
1122 }
1123 count = 0;
1124 value8 = rtl_read_byte(rtlpriv, REG_ROM_VERSION);
1125 while ((value8 == 0) && (count++ < 50)) {
1126 value8 = rtl_read_byte(rtlpriv, REG_ROM_VERSION);
1127 mdelay(1);
1128 }
1129 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1); 1475 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG1);
1130 if ((value32 & (CHIP_8723B)) != CHIP_8723B) 1476 if ((value32 & (CHIP_8723B)) != CHIP_8723B)
1131 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "unkown chip version\n"); 1477 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "unkown chip version\n");
1132 else 1478 else
1133 version = (enum version_8723e) VERSION_TEST_CHIP_1T1R_8723B; 1479 version = (enum version_8723e)CHIP_8723B;
1134 1480
1135 rtlphy->rf_type = RF_1T1R; 1481 rtlphy->rf_type = RF_1T1R;
1482
1483 /* treat rtl8723be chip as MP version in default */
1484 version = (enum version_8723e)(version | NORMAL_CHIP);
1485
1486 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
1487 /* cut version */
1488 version |= (enum version_8723e)(value32 & CHIP_VER_RTL_MASK);
1489 /* Manufacture */
1490 if (((value32 & EXT_VENDOR_ID) >> 18) == 0x01)
1491 version = (enum version_8723e)(version | CHIP_VENDOR_SMIC);
1136 1492
1137 value8 = rtl_read_byte(rtlpriv, REG_ROM_VERSION);
1138 if (value8 >= 0x02)
1139 version |= BIT(3);
1140 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1493 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1141 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ? 1494 "Chip RF Type: %s\n", (rtlphy->rf_type == RF_2T2R) ?
1142 "RF_2T2R" : "RF_1T1R"); 1495 "RF_2T2R" : "RF_1T1R");
1143 1496
1144 return version; 1497 return version;
1145} 1498}
@@ -1150,43 +1503,29 @@ static int _rtl8723be_set_media_status(struct ieee80211_hw *hw,
1150 struct rtl_priv *rtlpriv = rtl_priv(hw); 1503 struct rtl_priv *rtlpriv = rtl_priv(hw);
1151 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc; 1504 u8 bt_msr = rtl_read_byte(rtlpriv, MSR) & 0xfc;
1152 enum led_ctl_mode ledaction = LED_CTL_NO_LINK; 1505 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
1506 u8 mode = MSR_NOLINK;
1153 1507
1154 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0);
1155 RT_TRACE(rtlpriv, COMP_BEACON, DBG_LOUD,
1156 "clear 0x550 when set HW_VAR_MEDIA_STATUS\n");
1157
1158 if (type == NL80211_IFTYPE_UNSPECIFIED ||
1159 type == NL80211_IFTYPE_STATION) {
1160 _rtl8723be_stop_tx_beacon(hw);
1161 _rtl8723be_enable_bcn_sub_func(hw);
1162 } else if (type == NL80211_IFTYPE_ADHOC || type == NL80211_IFTYPE_AP) {
1163 _rtl8723be_resume_tx_beacon(hw);
1164 _rtl8723be_disable_bcn_sub_func(hw);
1165 } else {
1166 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1167 "Set HW_VAR_MEDIA_STATUS: "
1168 "No such media status(%x).\n", type);
1169 }
1170 switch (type) { 1508 switch (type) {
1171 case NL80211_IFTYPE_UNSPECIFIED: 1509 case NL80211_IFTYPE_UNSPECIFIED:
1172 bt_msr |= MSR_NOLINK; 1510 mode = MSR_NOLINK;
1173 ledaction = LED_CTL_LINK;
1174 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1511 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1175 "Set Network type to NO LINK!\n"); 1512 "Set Network type to NO LINK!\n");
1176 break; 1513 break;
1177 case NL80211_IFTYPE_ADHOC: 1514 case NL80211_IFTYPE_ADHOC:
1178 bt_msr |= MSR_ADHOC; 1515 case NL80211_IFTYPE_MESH_POINT:
1516 mode = MSR_ADHOC;
1179 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1517 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1180 "Set Network type to Ad Hoc!\n"); 1518 "Set Network type to Ad Hoc!\n");
1181 break; 1519 break;
1182 case NL80211_IFTYPE_STATION: 1520 case NL80211_IFTYPE_STATION:
1183 bt_msr |= MSR_INFRA; 1521 mode = MSR_INFRA;
1184 ledaction = LED_CTL_LINK; 1522 ledaction = LED_CTL_LINK;
1185 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1523 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1186 "Set Network type to STA!\n"); 1524 "Set Network type to STA!\n");
1187 break; 1525 break;
1188 case NL80211_IFTYPE_AP: 1526 case NL80211_IFTYPE_AP:
1189 bt_msr |= MSR_AP; 1527 mode = MSR_AP;
1528 ledaction = LED_CTL_LINK;
1190 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1529 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1191 "Set Network type to AP!\n"); 1530 "Set Network type to AP!\n");
1192 break; 1531 break;
@@ -1195,9 +1534,33 @@ static int _rtl8723be_set_media_status(struct ieee80211_hw *hw,
1195 "Network type %d not support!\n", type); 1534 "Network type %d not support!\n", type);
1196 return 1; 1535 return 1;
1197 } 1536 }
1198 rtl_write_byte(rtlpriv, (MSR), bt_msr); 1537
1538 /* MSR_INFRA == Link in infrastructure network;
1539 * MSR_ADHOC == Link in ad hoc network;
1540 * Therefore, check link state is necessary.
1541 *
1542 * MSR_AP == AP mode; link state is not cared here.
1543 */
1544 if (mode != MSR_AP && rtlpriv->mac80211.link_state < MAC80211_LINKED) {
1545 mode = MSR_NOLINK;
1546 ledaction = LED_CTL_NO_LINK;
1547 }
1548
1549 if (mode == MSR_NOLINK || mode == MSR_INFRA) {
1550 _rtl8723be_stop_tx_beacon(hw);
1551 _rtl8723be_enable_bcn_sub_func(hw);
1552 } else if (mode == MSR_ADHOC || mode == MSR_AP) {
1553 _rtl8723be_resume_tx_beacon(hw);
1554 _rtl8723be_disable_bcn_sub_func(hw);
1555 } else {
1556 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1557 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
1558 mode);
1559 }
1560
1561 rtl_write_byte(rtlpriv, (MSR), bt_msr | mode);
1199 rtlpriv->cfg->ops->led_control(hw, ledaction); 1562 rtlpriv->cfg->ops->led_control(hw, ledaction);
1200 if ((bt_msr & MSR_MASK) == MSR_AP) 1563 if (mode == MSR_AP)
1201 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00); 1564 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
1202 else 1565 else
1203 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66); 1566 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
@@ -1224,6 +1587,7 @@ void rtl8723be_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
1224 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR, 1587 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
1225 (u8 *)(&reg_rcr)); 1588 (u8 *)(&reg_rcr));
1226 } 1589 }
1590
1227} 1591}
1228 1592
1229int rtl8723be_set_network_type(struct ieee80211_hw *hw, 1593int rtl8723be_set_network_type(struct ieee80211_hw *hw,
@@ -1240,6 +1604,7 @@ int rtl8723be_set_network_type(struct ieee80211_hw *hw,
1240 } else { 1604 } else {
1241 rtl8723be_set_check_bssid(hw, false); 1605 rtl8723be_set_check_bssid(hw, false);
1242 } 1606 }
1607
1243 return 0; 1608 return 0;
1244} 1609}
1245 1610
@@ -1249,6 +1614,7 @@ int rtl8723be_set_network_type(struct ieee80211_hw *hw,
1249void rtl8723be_set_qos(struct ieee80211_hw *hw, int aci) 1614void rtl8723be_set_qos(struct ieee80211_hw *hw, int aci)
1250{ 1615{
1251 struct rtl_priv *rtlpriv = rtl_priv(hw); 1616 struct rtl_priv *rtlpriv = rtl_priv(hw);
1617
1252 rtl8723_dm_init_edca_turbo(hw); 1618 rtl8723_dm_init_edca_turbo(hw);
1253 switch (aci) { 1619 switch (aci) {
1254 case AC1_BK: 1620 case AC1_BK:
@@ -1268,20 +1634,32 @@ void rtl8723be_set_qos(struct ieee80211_hw *hw, int aci)
1268 } 1634 }
1269} 1635}
1270 1636
1637static void rtl8723be_clear_interrupt(struct ieee80211_hw *hw)
1638{
1639 struct rtl_priv *rtlpriv = rtl_priv(hw);
1640 u32 tmp;
1641
1642 tmp = rtl_read_dword(rtlpriv, REG_HISR);
1643 rtl_write_dword(rtlpriv, REG_HISR, tmp);
1644
1645 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
1646 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
1647
1648 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
1649 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
1650}
1651
1271void rtl8723be_enable_interrupt(struct ieee80211_hw *hw) 1652void rtl8723be_enable_interrupt(struct ieee80211_hw *hw)
1272{ 1653{
1273 struct rtl_priv *rtlpriv = rtl_priv(hw); 1654 struct rtl_priv *rtlpriv = rtl_priv(hw);
1274 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 1655 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1275 1656
1657 rtl8723be_clear_interrupt(hw);/*clear it here first*/
1658
1276 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF); 1659 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
1277 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF); 1660 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
1278 rtlpci->irq_enabled = true; 1661 rtlpci->irq_enabled = true;
1279 /* there are some C2H CMDs have been sent 1662
1280 * before system interrupt is enabled, e.g., C2H, CPWM.
1281 * So we need to clear all C2H events that FW has notified,
1282 * otherwise FW won't schedule any commands anymore.
1283 */
1284 rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0);
1285 /*enable system interrupt*/ 1663 /*enable system interrupt*/
1286 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF); 1664 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
1287} 1665}
@@ -1294,48 +1672,7 @@ void rtl8723be_disable_interrupt(struct ieee80211_hw *hw)
1294 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED); 1672 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
1295 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED); 1673 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
1296 rtlpci->irq_enabled = false; 1674 rtlpci->irq_enabled = false;
1297 synchronize_irq(rtlpci->pdev->irq); 1675 /*synchronize_irq(rtlpci->pdev->irq);*/
1298}
1299
1300static void _rtl8723be_poweroff_adapter(struct ieee80211_hw *hw)
1301{
1302 struct rtl_priv *rtlpriv = rtl_priv(hw);
1303 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1304 u8 u1b_tmp;
1305
1306 /* Combo (PCIe + USB) Card and PCIe-MF Card */
1307 /* 1. Run LPS WL RFOFF flow */
1308 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1309 PWR_INTF_PCI_MSK, RTL8723_NIC_LPS_ENTER_FLOW);
1310
1311 /* 2. 0x1F[7:0] = 0 */
1312 /* turn off RF */
1313 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00);
1314 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1315 rtlhal->fw_ready)
1316 rtl8723be_firmware_selfreset(hw);
1317
1318 /* Reset MCU. Suggested by Filen. */
1319 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1320 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, (u1b_tmp & (~BIT(2))));
1321
1322 /* g. MCUFWDL 0x80[1:0]= 0 */
1323 /* reset MCU ready status */
1324 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1325
1326 /* HW card disable configuration. */
1327 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1328 PWR_INTF_PCI_MSK, RTL8723_NIC_DISABLE_FLOW);
1329
1330 /* Reset MCU IO Wrapper */
1331 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1332 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1333 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1334 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1335
1336 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1337 /* lock ISO/CLK/Power control register */
1338 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1339} 1676}
1340 1677
1341void rtl8723be_card_disable(struct ieee80211_hw *hw) 1678void rtl8723be_card_disable(struct ieee80211_hw *hw)
@@ -1442,10 +1779,9 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1442 u32 path, addr = EEPROM_TX_PWR_INX, group, cnt = 0; 1779 u32 path, addr = EEPROM_TX_PWR_INX, group, cnt = 0;
1443 1780
1444 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1781 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1445 "hal_ReadPowerValueFromPROM8723BE(): " 1782 "hal_ReadPowerValueFromPROM8723BE(): PROMContent[0x%x]=0x%x\n",
1446 "PROMContent[0x%x]= 0x%x\n",
1447 (addr + 1), hwinfo[addr + 1]); 1783 (addr + 1), hwinfo[addr + 1]);
1448 if (0xFF == hwinfo[addr + 1]) /*YJ, add, 120316*/ 1784 if (0xFF == hwinfo[addr + 1]) /*YJ,add,120316*/
1449 autoload_fail = true; 1785 autoload_fail = true;
1450 1786
1451 if (autoload_fail) { 1787 if (autoload_fail) {
@@ -1453,7 +1789,7 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1453 "auto load fail : Use Default value!\n"); 1789 "auto load fail : Use Default value!\n");
1454 for (path = 0; path < MAX_RF_PATH; path++) { 1790 for (path = 0; path < MAX_RF_PATH; path++) {
1455 /* 2.4G default value */ 1791 /* 2.4G default value */
1456 for (group = 0; group < MAX_CHNL_GROUP_24G; group++) { 1792 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
1457 pw2g->index_cck_base[path][group] = 0x2D; 1793 pw2g->index_cck_base[path][group] = 0x2D;
1458 pw2g->index_bw40_base[path][group] = 0x2D; 1794 pw2g->index_bw40_base[path][group] = 0x2D;
1459 } 1795 }
@@ -1471,12 +1807,14 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1471 } 1807 }
1472 return; 1808 return;
1473 } 1809 }
1810
1474 for (path = 0; path < MAX_RF_PATH; path++) { 1811 for (path = 0; path < MAX_RF_PATH; path++) {
1475 /*2.4G default value*/ 1812 /*2.4G default value*/
1476 for (group = 0; group < MAX_CHNL_GROUP_24G; group++) { 1813 for (group = 0; group < MAX_CHNL_GROUP_24G; group++) {
1477 pw2g->index_cck_base[path][group] = hwinfo[addr++]; 1814 pw2g->index_cck_base[path][group] = hwinfo[addr++];
1478 if (pw2g->index_cck_base[path][group] == 0xFF) 1815 if (pw2g->index_cck_base[path][group] == 0xFF)
1479 pw2g->index_cck_base[path][group] = 0x2D; 1816 pw2g->index_cck_base[path][group] = 0x2D;
1817
1480 } 1818 }
1481 for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) { 1819 for (group = 0; group < MAX_CHNL_GROUP_24G - 1; group++) {
1482 pw2g->index_bw40_base[path][group] = hwinfo[addr++]; 1820 pw2g->index_bw40_base[path][group] = hwinfo[addr++];
@@ -1493,8 +1831,10 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1493 (hwinfo[addr] & 0xf0) >> 4; 1831 (hwinfo[addr] & 0xf0) >> 4;
1494 /*bit sign number to 8 bit sign number*/ 1832 /*bit sign number to 8 bit sign number*/
1495 if (pw2g->bw20_diff[path][cnt] & BIT(3)) 1833 if (pw2g->bw20_diff[path][cnt] & BIT(3))
1496 pw2g->bw20_diff[path][cnt] |= 0xF0; 1834 pw2g->bw20_diff[path][cnt] |=
1835 0xF0;
1497 } 1836 }
1837
1498 if (hwinfo[addr] == 0xFF) { 1838 if (hwinfo[addr] == 0xFF) {
1499 pw2g->ofdm_diff[path][cnt] = 0x04; 1839 pw2g->ofdm_diff[path][cnt] = 0x04;
1500 } else { 1840 } else {
@@ -1517,6 +1857,7 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1517 pw2g->bw40_diff[path][cnt] |= 1857 pw2g->bw40_diff[path][cnt] |=
1518 0xF0; 1858 0xF0;
1519 } 1859 }
1860
1520 if (hwinfo[addr] == 0xFF) { 1861 if (hwinfo[addr] == 0xFF) {
1521 pw2g->bw20_diff[path][cnt] = 0xFE; 1862 pw2g->bw20_diff[path][cnt] = 0xFE;
1522 } else { 1863 } else {
@@ -1537,9 +1878,10 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1537 pw2g->ofdm_diff[path][cnt] |= 1878 pw2g->ofdm_diff[path][cnt] |=
1538 0xF0; 1879 0xF0;
1539 } 1880 }
1540 if (hwinfo[addr] == 0xFF) { 1881
1882 if (hwinfo[addr] == 0xFF)
1541 pw2g->cck_diff[path][cnt] = 0xFE; 1883 pw2g->cck_diff[path][cnt] = 0xFE;
1542 } else { 1884 else {
1543 pw2g->cck_diff[path][cnt] = 1885 pw2g->cck_diff[path][cnt] =
1544 (hwinfo[addr] & 0x0f); 1886 (hwinfo[addr] & 0x0f);
1545 if (pw2g->cck_diff[path][cnt] & BIT(3)) 1887 if (pw2g->cck_diff[path][cnt] & BIT(3))
@@ -1549,12 +1891,14 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1549 addr++; 1891 addr++;
1550 } 1892 }
1551 } 1893 }
1894
1552 /*5G default value*/ 1895 /*5G default value*/
1553 for (group = 0; group < MAX_CHNL_GROUP_5G; group++) { 1896 for (group = 0; group < MAX_CHNL_GROUP_5G; group++) {
1554 pw5g->index_bw40_base[path][group] = hwinfo[addr++]; 1897 pw5g->index_bw40_base[path][group] = hwinfo[addr++];
1555 if (pw5g->index_bw40_base[path][group] == 0xFF) 1898 if (pw5g->index_bw40_base[path][group] == 0xFF)
1556 pw5g->index_bw40_base[path][group] = 0xFE; 1899 pw5g->index_bw40_base[path][group] = 0xFE;
1557 } 1900 }
1901
1558 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) { 1902 for (cnt = 0; cnt < MAX_TX_COUNT; cnt++) {
1559 if (cnt == 0) { 1903 if (cnt == 0) {
1560 pw5g->bw40_diff[path][cnt] = 0; 1904 pw5g->bw40_diff[path][cnt] = 0;
@@ -1568,9 +1912,10 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1568 pw5g->bw20_diff[path][cnt] |= 1912 pw5g->bw20_diff[path][cnt] |=
1569 0xF0; 1913 0xF0;
1570 } 1914 }
1571 if (hwinfo[addr] == 0xFF) { 1915
1916 if (hwinfo[addr] == 0xFF)
1572 pw5g->ofdm_diff[path][cnt] = 0x04; 1917 pw5g->ofdm_diff[path][cnt] = 0x04;
1573 } else { 1918 else {
1574 pw5g->ofdm_diff[path][0] = 1919 pw5g->ofdm_diff[path][0] =
1575 (hwinfo[addr] & 0x0f); 1920 (hwinfo[addr] & 0x0f);
1576 if (pw5g->ofdm_diff[path][cnt] & BIT(3)) 1921 if (pw5g->ofdm_diff[path][cnt] & BIT(3))
@@ -1587,6 +1932,7 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1587 if (pw5g->bw40_diff[path][cnt] & BIT(3)) 1932 if (pw5g->bw40_diff[path][cnt] & BIT(3))
1588 pw5g->bw40_diff[path][cnt] |= 0xF0; 1933 pw5g->bw40_diff[path][cnt] |= 0xF0;
1589 } 1934 }
1935
1590 if (hwinfo[addr] == 0xFF) { 1936 if (hwinfo[addr] == 0xFF) {
1591 pw5g->bw20_diff[path][cnt] = 0xFE; 1937 pw5g->bw20_diff[path][cnt] = 0xFE;
1592 } else { 1938 } else {
@@ -1598,6 +1944,7 @@ static void _rtl8723be_read_power_value_fromprom(struct ieee80211_hw *hw,
1598 addr++; 1944 addr++;
1599 } 1945 }
1600 } 1946 }
1947
1601 if (hwinfo[addr] == 0xFF) { 1948 if (hwinfo[addr] == 0xFF) {
1602 pw5g->ofdm_diff[path][1] = 0xFE; 1949 pw5g->ofdm_diff[path][1] = 0xFE;
1603 pw5g->ofdm_diff[path][2] = 0xFE; 1950 pw5g->ofdm_diff[path][2] = 0xFE;
@@ -1653,14 +2000,16 @@ static void _rtl8723be_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1653 rtlefuse->txpwr_legacyhtdiff[rf_path][i] = 2000 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
1654 pw2g.ofdm_diff[rf_path][i]; 2001 pw2g.ofdm_diff[rf_path][i];
1655 } 2002 }
2003
1656 for (i = 0; i < 14; i++) { 2004 for (i = 0; i < 14; i++) {
1657 RTPRINT(rtlpriv, FINIT, INIT_EEPROM, 2005 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1658 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = " 2006 "RF(%d)-Ch(%d) [CCK / HT40_1S ] = [0x%x / 0x%x ]\n",
1659 "[0x%x / 0x%x ]\n", rf_path, i, 2007 rf_path, i,
1660 rtlefuse->txpwrlevel_cck[rf_path][i], 2008 rtlefuse->txpwrlevel_cck[rf_path][i],
1661 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]); 2009 rtlefuse->txpwrlevel_ht40_1s[rf_path][i]);
1662 } 2010 }
1663 } 2011 }
2012
1664 if (!autoload_fail) 2013 if (!autoload_fail)
1665 rtlefuse->eeprom_thermalmeter = 2014 rtlefuse->eeprom_thermalmeter =
1666 hwinfo[EEPROM_THERMAL_METER_88E]; 2015 hwinfo[EEPROM_THERMAL_METER_88E];
@@ -1671,8 +2020,9 @@ static void _rtl8723be_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1671 rtlefuse->apk_thermalmeterignore = true; 2020 rtlefuse->apk_thermalmeterignore = true;
1672 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER; 2021 rtlefuse->eeprom_thermalmeter = EEPROM_DEFAULT_THERMALMETER;
1673 } 2022 }
2023
1674 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter; 2024 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
1675 RTPRINT(rtlpriv, FINIT, INIT_EEPROM, 2025 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1676 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter); 2026 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
1677 2027
1678 if (!autoload_fail) { 2028 if (!autoload_fail) {
@@ -1683,7 +2033,7 @@ static void _rtl8723be_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
1683 } else { 2033 } else {
1684 rtlefuse->eeprom_regulatory = 0; 2034 rtlefuse->eeprom_regulatory = 0;
1685 } 2035 }
1686 RTPRINT(rtlpriv, FINIT, INIT_EEPROM, 2036 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
1687 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory); 2037 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
1688} 2038}
1689 2039
@@ -1743,6 +2093,7 @@ static void _rtl8723be_read_adapter_info(struct ieee80211_hw *hw,
1743 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n"); 2093 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
1744 rtlefuse->autoload_failflag = false; 2094 rtlefuse->autoload_failflag = false;
1745 } 2095 }
2096
1746 if (rtlefuse->autoload_failflag) 2097 if (rtlefuse->autoload_failflag)
1747 return; 2098 return;
1748 2099
@@ -1958,100 +2309,10 @@ void rtl8723be_read_eeprom_info(struct ieee80211_hw *hw)
1958 _rtl8723be_hal_customized_behavior(hw); 2309 _rtl8723be_hal_customized_behavior(hw);
1959} 2310}
1960 2311
1961static void rtl8723be_update_hal_rate_table(struct ieee80211_hw *hw,
1962 struct ieee80211_sta *sta)
1963{
1964 struct rtl_priv *rtlpriv = rtl_priv(hw);
1965 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1966 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1967 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1968 u32 ratr_value;
1969 u8 ratr_index = 0;
1970 u8 nmode = mac->ht_enable;
1971 u8 mimo_ps = IEEE80211_SMPS_OFF;
1972 u16 shortgi_rate;
1973 u32 tmp_ratr_value;
1974 u8 curtxbw_40mhz = mac->bw_40;
1975 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
1976 1 : 0;
1977 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
1978 1 : 0;
1979 enum wireless_mode wirelessmode = mac->mode;
1980
1981 if (rtlhal->current_bandtype == BAND_ON_5G)
1982 ratr_value = sta->supp_rates[1] << 4;
1983 else
1984 ratr_value = sta->supp_rates[0];
1985 if (mac->opmode == NL80211_IFTYPE_ADHOC)
1986 ratr_value = 0xfff;
1987 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
1988 sta->ht_cap.mcs.rx_mask[0] << 12);
1989 switch (wirelessmode) {
1990 case WIRELESS_MODE_B:
1991 if (ratr_value & 0x0000000c)
1992 ratr_value &= 0x0000000d;
1993 else
1994 ratr_value &= 0x0000000f;
1995 break;
1996 case WIRELESS_MODE_G:
1997 ratr_value &= 0x00000FF5;
1998 break;
1999 case WIRELESS_MODE_N_24G:
2000 case WIRELESS_MODE_N_5G:
2001 nmode = 1;
2002 if (mimo_ps == IEEE80211_SMPS_STATIC) {
2003 ratr_value &= 0x0007F005;
2004 } else {
2005 u32 ratr_mask;
2006
2007 if (get_rf_type(rtlphy) == RF_1T2R ||
2008 get_rf_type(rtlphy) == RF_1T1R)
2009 ratr_mask = 0x000ff005;
2010 else
2011 ratr_mask = 0x0f0ff005;
2012 ratr_value &= ratr_mask;
2013 }
2014 break;
2015 default:
2016 if (rtlphy->rf_type == RF_1T2R)
2017 ratr_value &= 0x000ff0ff;
2018 else
2019 ratr_value &= 0x0f0ff0ff;
2020 break;
2021 }
2022 if ((rtlpriv->btcoexist.bt_coexistence) &&
2023 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
2024 (rtlpriv->btcoexist.bt_cur_state) &&
2025 (rtlpriv->btcoexist.bt_ant_isolation) &&
2026 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
2027 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
2028 ratr_value &= 0x0fffcfc0;
2029 else
2030 ratr_value &= 0x0FFFFFFF;
2031
2032 if (nmode && ((curtxbw_40mhz && curshortgi_40mhz) ||
2033 (!curtxbw_40mhz && curshortgi_20mhz))) {
2034 ratr_value |= 0x10000000;
2035 tmp_ratr_value = (ratr_value >> 12);
2036
2037 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
2038 if ((1 << shortgi_rate) & tmp_ratr_value)
2039 break;
2040 }
2041 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
2042 (shortgi_rate << 4) | (shortgi_rate);
2043 }
2044 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
2045
2046 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2047 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
2048}
2049
2050static u8 _rtl8723be_mrate_idx_to_arfr_id(struct ieee80211_hw *hw, 2312static u8 _rtl8723be_mrate_idx_to_arfr_id(struct ieee80211_hw *hw,
2051 u8 rate_index) 2313 u8 rate_index)
2052{ 2314{
2053 u8 ret = 0; 2315 u8 ret = 0;
2054
2055 switch (rate_index) { 2316 switch (rate_index) {
2056 case RATR_INX_WIRELESS_NGB: 2317 case RATR_INX_WIRELESS_NGB:
2057 ret = 1; 2318 ret = 1;
@@ -2090,16 +2351,15 @@ static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
2090 u32 ratr_bitmap; 2351 u32 ratr_bitmap;
2091 u8 ratr_index; 2352 u8 ratr_index;
2092 u8 curtxbw_40mhz = (sta->ht_cap.cap & 2353 u8 curtxbw_40mhz = (sta->ht_cap.cap &
2093 IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0; 2354 IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1 : 0;
2094 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ? 2355 u8 curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
2095 1 : 0; 2356 1 : 0;
2096 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ? 2357 u8 curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
2097 1 : 0; 2358 1 : 0;
2098 enum wireless_mode wirelessmode = 0; 2359 enum wireless_mode wirelessmode = 0;
2099 bool shortgi = false; 2360 bool shortgi = false;
2100 u8 rate_mask[7]; 2361 u8 rate_mask[7];
2101 u8 macid = 0; 2362 u8 macid = 0;
2102 u8 mimo_ps = IEEE80211_SMPS_OFF;
2103 2363
2104 sta_entry = (struct rtl_sta_info *)sta->drv_priv; 2364 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
2105 wirelessmode = sta_entry->wireless_mode; 2365 wirelessmode = sta_entry->wireless_mode;
@@ -2135,55 +2395,40 @@ static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
2135 else 2395 else
2136 ratr_bitmap &= 0x00000ff5; 2396 ratr_bitmap &= 0x00000ff5;
2137 break; 2397 break;
2138 case WIRELESS_MODE_A:
2139 ratr_index = RATR_INX_WIRELESS_A;
2140 ratr_bitmap &= 0x00000ff0;
2141 break;
2142 case WIRELESS_MODE_N_24G: 2398 case WIRELESS_MODE_N_24G:
2143 case WIRELESS_MODE_N_5G: 2399 case WIRELESS_MODE_N_5G:
2144 ratr_index = RATR_INX_WIRELESS_NGB; 2400 ratr_index = RATR_INX_WIRELESS_NGB;
2145 2401 if (rtlphy->rf_type == RF_1T1R) {
2146 if (mimo_ps == IEEE80211_SMPS_STATIC || 2402 if (curtxbw_40mhz) {
2147 mimo_ps == IEEE80211_SMPS_DYNAMIC) { 2403 if (rssi_level == 1)
2148 if (rssi_level == 1) 2404 ratr_bitmap &= 0x000f0000;
2149 ratr_bitmap &= 0x00070000; 2405 else if (rssi_level == 2)
2150 else if (rssi_level == 2) 2406 ratr_bitmap &= 0x000ff000;
2151 ratr_bitmap &= 0x0007f000; 2407 else
2152 else 2408 ratr_bitmap &= 0x000ff015;
2153 ratr_bitmap &= 0x0007f005; 2409 } else {
2410 if (rssi_level == 1)
2411 ratr_bitmap &= 0x000f0000;
2412 else if (rssi_level == 2)
2413 ratr_bitmap &= 0x000ff000;
2414 else
2415 ratr_bitmap &= 0x000ff005;
2416 }
2154 } else { 2417 } else {
2155 if (rtlphy->rf_type == RF_1T1R) { 2418 if (curtxbw_40mhz) {
2156 if (curtxbw_40mhz) { 2419 if (rssi_level == 1)
2157 if (rssi_level == 1) 2420 ratr_bitmap &= 0x0f8f0000;
2158 ratr_bitmap &= 0x000f0000; 2421 else if (rssi_level == 2)
2159 else if (rssi_level == 2) 2422 ratr_bitmap &= 0x0f8ff000;
2160 ratr_bitmap &= 0x000ff000; 2423 else
2161 else 2424 ratr_bitmap &= 0x0f8ff015;
2162 ratr_bitmap &= 0x000ff015;
2163 } else {
2164 if (rssi_level == 1)
2165 ratr_bitmap &= 0x000f0000;
2166 else if (rssi_level == 2)
2167 ratr_bitmap &= 0x000ff000;
2168 else
2169 ratr_bitmap &= 0x000ff005;
2170 }
2171 } else { 2425 } else {
2172 if (curtxbw_40mhz) { 2426 if (rssi_level == 1)
2173 if (rssi_level == 1) 2427 ratr_bitmap &= 0x0f8f0000;
2174 ratr_bitmap &= 0x0f8f0000; 2428 else if (rssi_level == 2)
2175 else if (rssi_level == 2) 2429 ratr_bitmap &= 0x0f8ff000;
2176 ratr_bitmap &= 0x0f8ff000; 2430 else
2177 else 2431 ratr_bitmap &= 0x0f8ff005;
2178 ratr_bitmap &= 0x0f8ff015;
2179 } else {
2180 if (rssi_level == 1)
2181 ratr_bitmap &= 0x0f8f0000;
2182 else if (rssi_level == 2)
2183 ratr_bitmap &= 0x0f8ff000;
2184 else
2185 ratr_bitmap &= 0x0f8ff005;
2186 }
2187 } 2432 }
2188 } 2433 }
2189 if ((curtxbw_40mhz && curshortgi_40mhz) || 2434 if ((curtxbw_40mhz && curshortgi_40mhz) ||
@@ -2203,18 +2448,17 @@ static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
2203 ratr_bitmap &= 0x0f0ff0ff; 2448 ratr_bitmap &= 0x0f0ff0ff;
2204 break; 2449 break;
2205 } 2450 }
2451
2206 sta_entry->ratr_index = ratr_index; 2452 sta_entry->ratr_index = ratr_index;
2207 2453
2208 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG, 2454 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
2209 "ratr_bitmap :%x\n", ratr_bitmap); 2455 "ratr_bitmap :%x\n", ratr_bitmap);
2210 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) | (ratr_index << 28); 2456 *(u32 *)&rate_mask = (ratr_bitmap & 0x0fffffff) |
2457 (ratr_index << 28);
2211 rate_mask[0] = macid; 2458 rate_mask[0] = macid;
2212 rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) | 2459 rate_mask[1] = _rtl8723be_mrate_idx_to_arfr_id(hw, ratr_index) |
2213 (shortgi ? 0x80 : 0x00); 2460 (shortgi ? 0x80 : 0x00);
2214 rate_mask[2] = curtxbw_40mhz; 2461 rate_mask[2] = curtxbw_40mhz;
2215 /* if (prox_priv->proxim_modeinfo->power_output > 0)
2216 * rate_mask[2] |= BIT(6);
2217 */
2218 2462
2219 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff); 2463 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
2220 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8); 2464 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
@@ -2228,7 +2472,7 @@ static void rtl8723be_update_hal_rate_mask(struct ieee80211_hw *hw,
2228 rate_mask[2], rate_mask[3], 2472 rate_mask[2], rate_mask[3],
2229 rate_mask[4], rate_mask[5], 2473 rate_mask[4], rate_mask[5],
2230 rate_mask[6]); 2474 rate_mask[6]);
2231 rtl8723be_fill_h2c_cmd(hw, H2C_8723BE_RA_MASK, 7, rate_mask); 2475 rtl8723be_fill_h2c_cmd(hw, H2C_8723B_RA_MASK, 7, rate_mask);
2232 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0); 2476 _rtl8723be_set_bcn_ctrl_reg(hw, BIT(3), 0);
2233} 2477}
2234 2478
@@ -2239,8 +2483,6 @@ void rtl8723be_update_hal_rate_tbl(struct ieee80211_hw *hw,
2239 struct rtl_priv *rtlpriv = rtl_priv(hw); 2483 struct rtl_priv *rtlpriv = rtl_priv(hw);
2240 if (rtlpriv->dm.useramask) 2484 if (rtlpriv->dm.useramask)
2241 rtl8723be_update_hal_rate_mask(hw, sta, rssi_level); 2485 rtl8723be_update_hal_rate_mask(hw, sta, rssi_level);
2242 else
2243 rtl8723be_update_hal_rate_table(hw, sta);
2244} 2486}
2245 2487
2246void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw) 2488void rtl8723be_update_channel_access_setting(struct ieee80211_hw *hw)
@@ -2264,7 +2506,7 @@ bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2264 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2506 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2265 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate; 2507 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
2266 u8 u1tmp; 2508 u8 u1tmp;
2267 bool actuallyset = false; 2509 bool b_actuallyset = false;
2268 2510
2269 if (rtlpriv->rtlhal.being_init_adapter) 2511 if (rtlpriv->rtlhal.being_init_adapter)
2270 return false; 2512 return false;
@@ -2280,6 +2522,7 @@ bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2280 ppsc->rfchange_inprogress = true; 2522 ppsc->rfchange_inprogress = true;
2281 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2523 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2282 } 2524 }
2525
2283 cur_rfstate = ppsc->rfpwr_state; 2526 cur_rfstate = ppsc->rfpwr_state;
2284 2527
2285 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2, 2528 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
@@ -2292,24 +2535,23 @@ bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2292 else 2535 else
2293 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF; 2536 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
2294 2537
2295 if (ppsc->hwradiooff && 2538 if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
2296 (e_rfpowerstate_toset == ERFON)) {
2297 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2539 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2298 "GPIOChangeRF - HW Radio ON, RF ON\n"); 2540 "GPIOChangeRF - HW Radio ON, RF ON\n");
2299 2541
2300 e_rfpowerstate_toset = ERFON; 2542 e_rfpowerstate_toset = ERFON;
2301 ppsc->hwradiooff = false; 2543 ppsc->hwradiooff = false;
2302 actuallyset = true; 2544 b_actuallyset = true;
2303 } else if (!ppsc->hwradiooff && 2545 } else if (!ppsc->hwradiooff && (e_rfpowerstate_toset == ERFOFF)) {
2304 (e_rfpowerstate_toset == ERFOFF)) {
2305 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2546 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2306 "GPIOChangeRF - HW Radio OFF, RF OFF\n"); 2547 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
2307 2548
2308 e_rfpowerstate_toset = ERFOFF; 2549 e_rfpowerstate_toset = ERFOFF;
2309 ppsc->hwradiooff = true; 2550 ppsc->hwradiooff = true;
2310 actuallyset = true; 2551 b_actuallyset = true;
2311 } 2552 }
2312 if (actuallyset) { 2553
2554 if (b_actuallyset) {
2313 spin_lock(&rtlpriv->locks.rf_ps_lock); 2555 spin_lock(&rtlpriv->locks.rf_ps_lock);
2314 ppsc->rfchange_inprogress = false; 2556 ppsc->rfchange_inprogress = false;
2315 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2557 spin_unlock(&rtlpriv->locks.rf_ps_lock);
@@ -2321,8 +2563,10 @@ bool rtl8723be_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
2321 ppsc->rfchange_inprogress = false; 2563 ppsc->rfchange_inprogress = false;
2322 spin_unlock(&rtlpriv->locks.rf_ps_lock); 2564 spin_unlock(&rtlpriv->locks.rf_ps_lock);
2323 } 2565 }
2566
2324 *valid = 1; 2567 *valid = 1;
2325 return !ppsc->hwradiooff; 2568 return !ppsc->hwradiooff;
2569
2326} 2570}
2327 2571
2328void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index, 2572void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
@@ -2363,6 +2607,7 @@ void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2363 rtlpriv->sec.key_len[idx] = 0; 2607 rtlpriv->sec.key_len[idx] = 0;
2364 } 2608 }
2365 } 2609 }
2610
2366 } else { 2611 } else {
2367 switch (enc_algo) { 2612 switch (enc_algo) {
2368 case WEP40_ENCRYPTION: 2613 case WEP40_ENCRYPTION:
@@ -2378,7 +2623,7 @@ void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2378 enc_algo = CAM_AES; 2623 enc_algo = CAM_AES;
2379 break; 2624 break;
2380 default: 2625 default:
2381 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2626 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2382 "switch case not process\n"); 2627 "switch case not process\n");
2383 enc_algo = CAM_TKIP; 2628 enc_algo = CAM_TKIP;
2384 break; 2629 break;
@@ -2398,22 +2643,22 @@ void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2398 if (entry_id >= TOTAL_CAM_ENTRY) { 2643 if (entry_id >= TOTAL_CAM_ENTRY) {
2399 RT_TRACE(rtlpriv, COMP_SEC, 2644 RT_TRACE(rtlpriv, COMP_SEC,
2400 DBG_EMERG, 2645 DBG_EMERG,
2401 "Can not find free" 2646 "Can not find free hw security cam entry\n");
2402 " hw security cam "
2403 "entry\n");
2404 return; 2647 return;
2405 } 2648 }
2406 } else { 2649 } else {
2407 entry_id = CAM_PAIRWISE_KEY_POSITION; 2650 entry_id = CAM_PAIRWISE_KEY_POSITION;
2408 } 2651 }
2652
2409 key_index = PAIRWISE_KEYIDX; 2653 key_index = PAIRWISE_KEYIDX;
2410 is_pairwise = true; 2654 is_pairwise = true;
2411 } 2655 }
2412 } 2656 }
2657
2413 if (rtlpriv->sec.key_len[key_index] == 0) { 2658 if (rtlpriv->sec.key_len[key_index] == 0) {
2414 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 2659 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2415 "delete one entry, entry_id is %d\n", 2660 "delete one entry, entry_id is %d\n",
2416 entry_id); 2661 entry_id);
2417 if (mac->opmode == NL80211_IFTYPE_AP) 2662 if (mac->opmode == NL80211_IFTYPE_AP)
2418 rtl_cam_del_entry(hw, p_macaddr); 2663 rtl_cam_del_entry(hw, p_macaddr);
2419 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id); 2664 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
@@ -2422,12 +2667,12 @@ void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2422 "add one entry\n"); 2667 "add one entry\n");
2423 if (is_pairwise) { 2668 if (is_pairwise) {
2424 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 2669 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2425 "set Pairwise key\n"); 2670 "set Pairwiase key\n");
2426 2671
2427 rtl_cam_add_one_entry(hw, macaddr, key_index, 2672 rtl_cam_add_one_entry(hw, macaddr, key_index,
2428 entry_id, enc_algo, 2673 entry_id, enc_algo,
2429 CAM_CONFIG_NO_USEDK, 2674 CAM_CONFIG_NO_USEDK,
2430 rtlpriv->sec.key_buf[key_index]); 2675 rtlpriv->sec.key_buf[key_index]);
2431 } else { 2676 } else {
2432 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, 2677 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
2433 "set group key\n"); 2678 "set group key\n");
@@ -2442,10 +2687,11 @@ void rtl8723be_set_key(struct ieee80211_hw *hw, u32 key_index,
2442 rtlpriv->sec.key_buf 2687 rtlpriv->sec.key_buf
2443 [entry_id]); 2688 [entry_id]);
2444 } 2689 }
2690
2445 rtl_cam_add_one_entry(hw, macaddr, key_index, 2691 rtl_cam_add_one_entry(hw, macaddr, key_index,
2446 entry_id, enc_algo, 2692 entry_id, enc_algo,
2447 CAM_CONFIG_NO_USEDK, 2693 CAM_CONFIG_NO_USEDK,
2448 rtlpriv->sec.key_buf[entry_id]); 2694 rtlpriv->sec.key_buf[entry_id]);
2449 } 2695 }
2450 } 2696 }
2451 } 2697 }
@@ -2464,7 +2710,7 @@ void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2464 rtlpriv->btcoexist.btc_info.btcoexist = 1; 2710 rtlpriv->btcoexist.btc_info.btcoexist = 1;
2465 else 2711 else
2466 rtlpriv->btcoexist.btc_info.btcoexist = 0; 2712 rtlpriv->btcoexist.btc_info.btcoexist = 0;
2467 value = hwinfo[RF_OPTION4]; 2713 value = hwinfo[EEPROM_RF_BT_SETTING_8723B];
2468 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B; 2714 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2469 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1); 2715 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
2470 } else { 2716 } else {
@@ -2472,6 +2718,7 @@ void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
2472 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B; 2718 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8723B;
2473 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2; 2719 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
2474 } 2720 }
2721
2475} 2722}
2476 2723
2477void rtl8723be_bt_reg_init(struct ieee80211_hw *hw) 2724void rtl8723be_bt_reg_init(struct ieee80211_hw *hw)
@@ -2492,6 +2739,7 @@ void rtl8723be_bt_hw_init(struct ieee80211_hw *hw)
2492 2739
2493 if (rtlpriv->cfg->ops->get_btc_status()) 2740 if (rtlpriv->cfg->ops->get_btc_status())
2494 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv); 2741 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
2742
2495} 2743}
2496 2744
2497void rtl8723be_suspend(struct ieee80211_hw *hw) 2745void rtl8723be_suspend(struct ieee80211_hw *hw)
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/hw.h b/drivers/net/wireless/rtlwifi/rtl8723be/hw.h
index 64c7551af6b7..eae863d08de8 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/hw.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/hw.h
@@ -59,4 +59,5 @@ void rtl8723be_bt_reg_init(struct ieee80211_hw *hw);
59void rtl8723be_bt_hw_init(struct ieee80211_hw *hw); 59void rtl8723be_bt_hw_init(struct ieee80211_hw *hw);
60void rtl8723be_suspend(struct ieee80211_hw *hw); 60void rtl8723be_suspend(struct ieee80211_hw *hw);
61void rtl8723be_resume(struct ieee80211_hw *hw); 61void rtl8723be_resume(struct ieee80211_hw *hw);
62
62#endif 63#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/led.c b/drivers/net/wireless/rtlwifi/rtl8723be/led.c
index cb931a38dc48..4196efb723a2 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/led.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/led.c
@@ -42,7 +42,7 @@ void rtl8723be_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
42 struct rtl_priv *rtlpriv = rtl_priv(hw); 42 struct rtl_priv *rtlpriv = rtl_priv(hw);
43 43
44 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, 44 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
45 "LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); 45 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
46 46
47 switch (pled->ledpin) { 47 switch (pled->ledpin) {
48 case LED_PIN_GPIO0: 48 case LED_PIN_GPIO0:
@@ -71,7 +71,7 @@ void rtl8723be_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
71 u8 ledcfg; 71 u8 ledcfg;
72 72
73 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, 73 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
74 "LedAddr:%X ledpin =%d\n", REG_LEDCFG2, pled->ledpin); 74 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
75 75
76 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2); 76 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
77 77
@@ -100,7 +100,7 @@ void rtl8723be_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
100 break; 100 break;
101 default: 101 default:
102 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 102 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
103 "switch case not processed\n"); 103 "switch case not process\n");
104 break; 104 break;
105 } 105 }
106 pled->ledon = false; 106 pled->ledon = false;
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/phy.c b/drivers/net/wireless/rtlwifi/rtl8723be/phy.c
index 1575ef9ece9f..20dcc25c506c 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/phy.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/phy.c
@@ -26,224 +26,28 @@
26#include "../wifi.h" 26#include "../wifi.h"
27#include "../pci.h" 27#include "../pci.h"
28#include "../ps.h" 28#include "../ps.h"
29#include "../core.h"
30#include "reg.h" 29#include "reg.h"
31#include "def.h" 30#include "def.h"
32#include "phy.h" 31#include "phy.h"
33#include "../rtl8723com/phy_common.h" 32#include "../rtl8723com/phy_common.h"
34#include "rf.h" 33#include "rf.h"
35#include "dm.h" 34#include "dm.h"
35#include "../rtl8723com/dm_common.h"
36#include "table.h" 36#include "table.h"
37#include "trx.h" 37#include "trx.h"
38 38
39static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw); 39static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw);
40static bool _rtl8723be_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
41static bool _rtl8723be_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
42 u8 configtype);
40static bool _rtl8723be_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw, 43static bool _rtl8723be_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
41 u8 configtype); 44 u8 configtype);
42static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw, 45static bool _rtl8723be_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
43 u8 channel, u8 *stage, 46 u8 channel, u8 *stage,
44 u8 *step, u32 *delay); 47 u8 *step, u32 *delay);
45static bool _rtl8723be_check_condition(struct ieee80211_hw *hw,
46 const u32 condition)
47{
48 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
49 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
50 u32 _board = rtlefuse->board_type; /*need efuse define*/
51 u32 _interface = rtlhal->interface;
52 u32 _platform = 0x08;/*SupportPlatform */
53 u32 cond = condition;
54
55 if (condition == 0xCDCDCDCD)
56 return true;
57
58 cond = condition & 0xFF;
59 if ((_board & cond) == 0 && cond != 0x1F)
60 return false;
61
62 cond = condition & 0xFF00;
63 cond = cond >> 8;
64 if ((_interface & cond) == 0 && cond != 0x07)
65 return false;
66
67 cond = condition & 0xFF0000;
68 cond = cond >> 16;
69 if ((_platform & cond) == 0 && cond != 0x0F)
70 return false;
71 return true;
72}
73
74static bool _rtl8723be_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
75{
76 struct rtl_priv *rtlpriv = rtl_priv(hw);
77 u32 i;
78 u32 arraylength;
79 u32 *ptrarray;
80
81 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read rtl8723beMACPHY_Array\n");
82 arraylength = RTL8723BEMAC_1T_ARRAYLEN;
83 ptrarray = RTL8723BEMAC_1T_ARRAY;
84 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
85 "Img:RTL8723bEMAC_1T_ARRAY LEN %d\n", arraylength);
86 for (i = 0; i < arraylength; i = i + 2)
87 rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
88 return true;
89}
90
91static bool _rtl8723be_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
92 u8 configtype)
93{
94 #define READ_NEXT_PAIR(v1, v2, i) \
95 do { \
96 i += 2; \
97 v1 = array_table[i];\
98 v2 = array_table[i+1]; \
99 } while (0)
100
101 int i;
102 u32 *array_table;
103 u16 arraylen;
104 struct rtl_priv *rtlpriv = rtl_priv(hw);
105 u32 v1 = 0, v2 = 0;
106
107 if (configtype == BASEBAND_CONFIG_PHY_REG) {
108 arraylen = RTL8723BEPHY_REG_1TARRAYLEN;
109 array_table = RTL8723BEPHY_REG_1TARRAY;
110
111 for (i = 0; i < arraylen; i = i + 2) {
112 v1 = array_table[i];
113 v2 = array_table[i+1];
114 if (v1 < 0xcdcdcdcd) {
115 rtl_bb_delay(hw, v1, v2);
116 } else {/*This line is the start line of branch.*/
117 if (!_rtl8723be_check_condition(hw, array_table[i])) {
118 /*Discard the following (offset, data) pairs*/
119 READ_NEXT_PAIR(v1, v2, i);
120 while (v2 != 0xDEAD &&
121 v2 != 0xCDEF &&
122 v2 != 0xCDCD &&
123 i < arraylen - 2) {
124 READ_NEXT_PAIR(v1, v2, i);
125 }
126 i -= 2; /* prevent from for-loop += 2*/
127 /* Configure matched pairs and
128 * skip to end of if-else.
129 */
130 } else {
131 READ_NEXT_PAIR(v1, v2, i);
132 while (v2 != 0xDEAD &&
133 v2 != 0xCDEF &&
134 v2 != 0xCDCD &&
135 i < arraylen - 2) {
136 rtl_bb_delay(hw,
137 v1, v2);
138 READ_NEXT_PAIR(v1, v2, i);
139 }
140 48
141 while (v2 != 0xDEAD && i < arraylen - 2) 49static void rtl8723be_phy_set_rf_on(struct ieee80211_hw *hw);
142 READ_NEXT_PAIR(v1, v2, i); 50static void rtl8723be_phy_set_io(struct ieee80211_hw *hw);
143 }
144 }
145 }
146 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
147 arraylen = RTL8723BEAGCTAB_1TARRAYLEN;
148 array_table = RTL8723BEAGCTAB_1TARRAY;
149
150 for (i = 0; i < arraylen; i = i + 2) {
151 v1 = array_table[i];
152 v2 = array_table[i+1];
153 if (v1 < 0xCDCDCDCD) {
154 rtl_set_bbreg(hw, array_table[i],
155 MASKDWORD,
156 array_table[i + 1]);
157 udelay(1);
158 continue;
159 } else {/*This line is the start line of branch.*/
160 if (!_rtl8723be_check_condition(hw, array_table[i])) {
161 /* Discard the following
162 * (offset, data) pairs
163 */
164 READ_NEXT_PAIR(v1, v2, i);
165 while (v2 != 0xDEAD &&
166 v2 != 0xCDEF &&
167 v2 != 0xCDCD &&
168 i < arraylen - 2) {
169 READ_NEXT_PAIR(v1, v2, i);
170 }
171 i -= 2; /* prevent from for-loop += 2*/
172 /*Configure matched pairs and
173 *skip to end of if-else.
174 */
175 } else {
176 READ_NEXT_PAIR(v1, v2, i);
177 while (v2 != 0xDEAD &&
178 v2 != 0xCDEF &&
179 v2 != 0xCDCD &&
180 i < arraylen - 2) {
181 rtl_set_bbreg(hw, array_table[i],
182 MASKDWORD,
183 array_table[i + 1]);
184 udelay(1);
185 READ_NEXT_PAIR(v1, v2, i);
186 }
187
188 while (v2 != 0xDEAD && i < arraylen - 2)
189 READ_NEXT_PAIR(v1, v2, i);
190 }
191 }
192 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
193 "The agctab_array_table[0] is "
194 "%x Rtl818EEPHY_REGArray[1] is %x\n",
195 array_table[i], array_table[i + 1]);
196 }
197 }
198 return true;
199}
200
201static u8 _rtl8723be_get_rate_section_index(u32 regaddr)
202{
203 u8 index = 0;
204
205 switch (regaddr) {
206 case RTXAGC_A_RATE18_06:
207 case RTXAGC_B_RATE18_06:
208 index = 0;
209 break;
210 case RTXAGC_A_RATE54_24:
211 case RTXAGC_B_RATE54_24:
212 index = 1;
213 break;
214 case RTXAGC_A_CCK1_MCS32:
215 case RTXAGC_B_CCK1_55_MCS32:
216 index = 2;
217 break;
218 case RTXAGC_B_CCK11_A_CCK2_11:
219 index = 3;
220 break;
221 case RTXAGC_A_MCS03_MCS00:
222 case RTXAGC_B_MCS03_MCS00:
223 index = 4;
224 break;
225 case RTXAGC_A_MCS07_MCS04:
226 case RTXAGC_B_MCS07_MCS04:
227 index = 5;
228 break;
229 case RTXAGC_A_MCS11_MCS08:
230 case RTXAGC_B_MCS11_MCS08:
231 index = 6;
232 break;
233 case RTXAGC_A_MCS15_MCS12:
234 case RTXAGC_B_MCS15_MCS12:
235 index = 7;
236 break;
237 default:
238 regaddr &= 0xFFF;
239 if (regaddr >= 0xC20 && regaddr <= 0xC4C)
240 index = (u8) ((regaddr - 0xC20) / 4);
241 else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
242 index = (u8) ((regaddr - 0xE20) / 4);
243 break;
244 };
245 return index;
246}
247 51
248u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath, 52u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
249 u32 regaddr, u32 bitmask) 53 u32 regaddr, u32 bitmask)
@@ -265,9 +69,8 @@ u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
265 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags); 69 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
266 70
267 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 71 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
268 "regaddr(%#x), rfpath(%#x), " 72 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
269 "bitmask(%#x), original_value(%#x)\n", 73 regaddr, rfpath, bitmask, original_value);
270 regaddr, rfpath, bitmask, original_value);
271 74
272 return readback_value; 75 return readback_value;
273} 76}
@@ -300,6 +103,7 @@ void rtl8723be_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path path,
300 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 103 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
301 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 104 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
302 regaddr, bitmask, data, path); 105 regaddr, bitmask, data, path);
106
303} 107}
304 108
305bool rtl8723be_phy_mac_config(struct ieee80211_hw *hw) 109bool rtl8723be_phy_mac_config(struct ieee80211_hw *hw)
@@ -316,7 +120,7 @@ bool rtl8723be_phy_bb_config(struct ieee80211_hw *hw)
316 bool rtstatus = true; 120 bool rtstatus = true;
317 struct rtl_priv *rtlpriv = rtl_priv(hw); 121 struct rtl_priv *rtlpriv = rtl_priv(hw);
318 u16 regval; 122 u16 regval;
319 u8 reg_hwparafile = 1; 123 u8 b_reg_hwparafile = 1;
320 u32 tmp; 124 u32 tmp;
321 u8 crystalcap = rtlpriv->efuse.crystalcap; 125 u8 crystalcap = rtlpriv->efuse.crystalcap;
322 rtl8723_phy_init_bb_rf_reg_def(hw); 126 rtl8723_phy_init_bb_rf_reg_def(hw);
@@ -333,7 +137,7 @@ bool rtl8723be_phy_bb_config(struct ieee80211_hw *hw)
333 137
334 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80); 138 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
335 139
336 if (reg_hwparafile == 1) 140 if (b_reg_hwparafile == 1)
337 rtstatus = _rtl8723be_phy_bb8723b_config_parafile(hw); 141 rtstatus = _rtl8723be_phy_bb8723b_config_parafile(hw);
338 142
339 crystalcap = crystalcap & 0x3F; 143 crystalcap = crystalcap & 0x3F;
@@ -348,18 +152,49 @@ bool rtl8723be_phy_rf_config(struct ieee80211_hw *hw)
348 return rtl8723be_phy_rf6052_config(hw); 152 return rtl8723be_phy_rf6052_config(hw);
349} 153}
350 154
155static bool _rtl8723be_check_condition(struct ieee80211_hw *hw,
156 const u32 condition)
157{
158 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
159 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
160 u32 _board = rtlefuse->board_type; /*need efuse define*/
161 u32 _interface = rtlhal->interface;
162 u32 _platform = 0x08;/*SupportPlatform */
163 u32 cond = condition;
164
165 if (condition == 0xCDCDCDCD)
166 return true;
167
168 cond = condition & 0xFF;
169 if ((_board & cond) == 0 && cond != 0x1F)
170 return false;
171
172 cond = condition & 0xFF00;
173 cond = cond >> 8;
174 if ((_interface & cond) == 0 && cond != 0x07)
175 return false;
176
177 cond = condition & 0xFF0000;
178 cond = cond >> 16;
179 if ((_platform & cond) == 0 && cond != 0x0F)
180 return false;
181 return true;
182}
183
351static void _rtl8723be_config_rf_reg(struct ieee80211_hw *hw, u32 addr, 184static void _rtl8723be_config_rf_reg(struct ieee80211_hw *hw, u32 addr,
352 u32 data, enum radio_path rfpath, 185 u32 data, enum radio_path rfpath,
353 u32 regaddr) 186 u32 regaddr)
354{ 187{
355 if (addr == 0xfe || addr == 0xffe) { 188 if (addr == 0xfe || addr == 0xffe) {
189 /* In order not to disturb BT music
190 * when wifi init.(1ant NIC only)
191 */
356 mdelay(50); 192 mdelay(50);
357 } else { 193 } else {
358 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data); 194 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
359 udelay(1); 195 udelay(1);
360 } 196 }
361} 197}
362
363static void _rtl8723be_config_rf_radio_a(struct ieee80211_hw *hw, 198static void _rtl8723be_config_rf_radio_a(struct ieee80211_hw *hw,
364 u32 addr, u32 data) 199 u32 addr, u32 data)
365{ 200{
@@ -368,12 +203,13 @@ static void _rtl8723be_config_rf_radio_a(struct ieee80211_hw *hw,
368 203
369 _rtl8723be_config_rf_reg(hw, addr, data, RF90_PATH_A, 204 _rtl8723be_config_rf_reg(hw, addr, data, RF90_PATH_A,
370 addr | maskforphyset); 205 addr | maskforphyset);
206
371} 207}
372 208
373static void _rtl8723be_phy_init_tx_power_by_rate(struct ieee80211_hw *hw) 209static void _rtl8723be_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
374{ 210{
375 struct rtl_priv *rtlpriv = rtl_priv(hw); 211 struct rtl_priv *rtlpriv = rtl_priv(hw);
376 struct rtl_phy *rtlphy = &(rtlpriv->phy); 212 struct rtl_phy *rtlphy = &rtlpriv->phy;
377 213
378 u8 band, path, txnum, section; 214 u8 band, path, txnum, section;
379 215
@@ -383,16 +219,38 @@ static void _rtl8723be_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
383 for (section = 0; 219 for (section = 0;
384 section < TX_PWR_BY_RATE_NUM_SECTION; 220 section < TX_PWR_BY_RATE_NUM_SECTION;
385 ++section) 221 ++section)
386 rtlphy->tx_power_by_rate_offset[band] 222 rtlphy->tx_power_by_rate_offset
387 [path][txnum][section] = 0; 223 [band][path][txnum][section] = 0;
224}
225
226static void _rtl8723be_config_bb_reg(struct ieee80211_hw *hw,
227 u32 addr, u32 data)
228{
229 if (addr == 0xfe) {
230 mdelay(50);
231 } else if (addr == 0xfd) {
232 mdelay(5);
233 } else if (addr == 0xfc) {
234 mdelay(1);
235 } else if (addr == 0xfb) {
236 udelay(50);
237 } else if (addr == 0xfa) {
238 udelay(5);
239 } else if (addr == 0xf9) {
240 udelay(1);
241 } else {
242 rtl_set_bbreg(hw, addr, MASKDWORD, data);
243 udelay(1);
244 }
388} 245}
389 246
390static void phy_set_txpwr_by_rate_base(struct ieee80211_hw *hw, u8 band, 247static void _rtl8723be_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
391 u8 path, u8 rate_section, 248 u8 band,
392 u8 txnum, u8 value) 249 u8 path, u8 rate_section,
250 u8 txnum, u8 value)
393{ 251{
394 struct rtl_priv *rtlpriv = rtl_priv(hw); 252 struct rtl_priv *rtlpriv = rtl_priv(hw);
395 struct rtl_phy *rtlphy = &(rtlpriv->phy); 253 struct rtl_phy *rtlphy = &rtlpriv->phy;
396 254
397 if (path > RF90_PATH_D) { 255 if (path > RF90_PATH_D) {
398 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 256 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
@@ -417,23 +275,24 @@ static void phy_set_txpwr_by_rate_base(struct ieee80211_hw *hw, u8 band,
417 break; 275 break;
418 default: 276 default:
419 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 277 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
420 "Invalid RateSection %d in Band 2.4G, Rf Path" 278 "Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
421 " %d, %dTx in PHY_SetTxPowerByRateBase()\n", 279 rate_section, path, txnum);
422 rate_section, path, txnum);
423 break; 280 break;
424 }; 281 };
425 } else { 282 } else {
426 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 283 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
427 "Invalid Band %d in PHY_SetTxPowerByRateBase()\n", 284 "Invalid Band %d in PHY_SetTxPowerByRateBase()\n",
428 band); 285 band);
429 } 286 }
287
430} 288}
431 289
432static u8 phy_get_txpwr_by_rate_base(struct ieee80211_hw *hw, u8 band, u8 path, 290static u8 _rtl8723be_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
433 u8 txnum, u8 rate_section) 291 u8 band, u8 path, u8 txnum,
292 u8 rate_section)
434{ 293{
435 struct rtl_priv *rtlpriv = rtl_priv(hw); 294 struct rtl_priv *rtlpriv = rtl_priv(hw);
436 struct rtl_phy *rtlphy = &(rtlpriv->phy); 295 struct rtl_phy *rtlphy = &rtlpriv->phy;
437 u8 value = 0; 296 u8 value = 0;
438 if (path > RF90_PATH_D) { 297 if (path > RF90_PATH_D) {
439 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 298 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
@@ -458,15 +317,14 @@ static u8 phy_get_txpwr_by_rate_base(struct ieee80211_hw *hw, u8 band, u8 path,
458 break; 317 break;
459 default: 318 default:
460 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 319 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
461 "Invalid RateSection %d in Band 2.4G, Rf Path" 320 "Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
462 " %d, %dTx in PHY_GetTxPowerByRateBase()\n", 321 rate_section, path, txnum);
463 rate_section, path, txnum);
464 break; 322 break;
465 }; 323 };
466 } else { 324 } else {
467 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 325 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
468 "Invalid Band %d in PHY_GetTxPowerByRateBase()\n", 326 "Invalid Band %d in PHY_GetTxPowerByRateBase()\n",
469 band); 327 band);
470 } 328 }
471 329
472 return value; 330 return value;
@@ -475,45 +333,51 @@ static u8 phy_get_txpwr_by_rate_base(struct ieee80211_hw *hw, u8 band, u8 path,
475static void _rtl8723be_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw) 333static void _rtl8723be_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
476{ 334{
477 struct rtl_priv *rtlpriv = rtl_priv(hw); 335 struct rtl_priv *rtlpriv = rtl_priv(hw);
478 struct rtl_phy *rtlphy = &(rtlpriv->phy); 336 struct rtl_phy *rtlphy = &rtlpriv->phy;
479 u16 raw_value = 0; 337 u16 rawvalue = 0;
480 u8 base = 0, path = 0; 338 u8 base = 0, path = 0;
481 339
482 for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) { 340 for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
483 if (path == RF90_PATH_A) { 341 if (path == RF90_PATH_A) {
484 raw_value = (u16) (rtlphy->tx_power_by_rate_offset 342 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
485 [BAND_ON_2_4G][path][RF_1TX][3] >> 24) & 0xFF; 343 [BAND_ON_2_4G][path][RF_1TX][3] >> 24) & 0xFF;
486 base = (raw_value >> 4) * 10 + (raw_value & 0xF); 344 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
487 phy_set_txpwr_by_rate_base(hw, BAND_ON_2_4G, path, CCK, 345 _rtl8723be_phy_set_txpower_by_rate_base(hw,
488 RF_1TX, base); 346 BAND_ON_2_4G, path, CCK, RF_1TX, base);
489 } else if (path == RF90_PATH_B) { 347 } else if (path == RF90_PATH_B) {
490 raw_value = (u16) (rtlphy->tx_power_by_rate_offset 348 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
491 [BAND_ON_2_4G][path][RF_1TX][3] >> 0) & 0xFF; 349 [BAND_ON_2_4G][path][RF_1TX][3] >> 0) & 0xFF;
492 base = (raw_value >> 4) * 10 + (raw_value & 0xF); 350 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
493 phy_set_txpwr_by_rate_base(hw, BAND_ON_2_4G, path, 351 _rtl8723be_phy_set_txpower_by_rate_base(hw,
494 CCK, RF_1TX, base); 352 BAND_ON_2_4G,
353 path, CCK,
354 RF_1TX, base);
495 } 355 }
496 raw_value = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 356 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
497 [path][RF_1TX][1] >> 24) & 0xFF; 357 [BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF;
498 base = (raw_value >> 4) * 10 + (raw_value & 0xF); 358 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
499 phy_set_txpwr_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, 359 _rtl8723be_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
500 base); 360 path, OFDM, RF_1TX,
501 361 base);
502 raw_value = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 362
503 [path][RF_1TX][5] >> 24) & 0xFF; 363 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
504 base = (raw_value >> 4) * 10 + (raw_value & 0xF); 364 [BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF;
505 phy_set_txpwr_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, 365 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
506 RF_1TX, base); 366 _rtl8723be_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
507 367 path, HT_MCS0_MCS7,
508 raw_value = (u16) (rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 368 RF_1TX, base);
509 [path][RF_2TX][7] >> 24) & 0xFF; 369
510 base = (raw_value >> 4) * 10 + (raw_value & 0xF); 370 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset
511 phy_set_txpwr_by_rate_base(hw, BAND_ON_2_4G, path, 371 [BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF;
512 HT_MCS8_MCS15, RF_2TX, base); 372 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF);
373 _rtl8723be_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
374 path, HT_MCS8_MCS15,
375 RF_2TX, base);
513 } 376 }
514} 377}
515 378
516static void phy_conv_dbm_to_rel(u32 *data, u8 start, u8 end, u8 base_val) 379static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
380 u8 end, u8 base_val)
517{ 381{
518 char i = 0; 382 char i = 0;
519 u8 temp_value = 0; 383 u8 temp_value = 0;
@@ -522,15 +386,15 @@ static void phy_conv_dbm_to_rel(u32 *data, u8 start, u8 end, u8 base_val)
522 for (i = 3; i >= 0; --i) { 386 for (i = 3; i >= 0; --i) {
523 if (i >= start && i <= end) { 387 if (i >= start && i <= end) {
524 /* Get the exact value */ 388 /* Get the exact value */
525 temp_value = (u8) (*data >> (i * 8)) & 0xF; 389 temp_value = (u8)(*data >> (i * 8)) & 0xF;
526 temp_value += ((u8) ((*data >> (i*8 + 4)) & 0xF)) * 10; 390 temp_value += ((u8)((*data >> (i*8 + 4)) & 0xF)) * 10;
527 391
528 /* Change the value to a relative value */ 392 /* Change the value to a relative value */
529 temp_value = (temp_value > base_val) ? 393 temp_value = (temp_value > base_val) ?
530 temp_value - base_val : 394 temp_value - base_val :
531 base_val - temp_value; 395 base_val - temp_value;
532 } else { 396 } else {
533 temp_value = (u8) (*data >> (i * 8)) & 0xFF; 397 temp_value = (u8)(*data >> (i * 8)) & 0xFF;
534 } 398 }
535 temp_data <<= 8; 399 temp_data <<= 8;
536 temp_data |= temp_value; 400 temp_data |= temp_value;
@@ -538,56 +402,65 @@ static void phy_conv_dbm_to_rel(u32 *data, u8 start, u8 end, u8 base_val)
538 *data = temp_data; 402 *data = temp_data;
539} 403}
540 404
541static void conv_dbm_to_rel(struct ieee80211_hw *hw) 405static void _rtl8723be_phy_convert_txpower_dbm_to_relative_value(
406 struct ieee80211_hw *hw)
542{ 407{
543 struct rtl_priv *rtlpriv = rtl_priv(hw); 408 struct rtl_priv *rtlpriv = rtl_priv(hw);
544 struct rtl_phy *rtlphy = &(rtlpriv->phy); 409 struct rtl_phy *rtlphy = &rtlpriv->phy;
545 u8 base = 0, rfpath = RF90_PATH_A; 410 u8 base = 0, rfpath = RF90_PATH_A;
546 411
547 base = phy_get_txpwr_by_rate_base(hw, BAND_ON_2_4G, rfpath, 412 base = _rtl8723be_phy_get_txpower_by_rate_base(hw,
548 RF_1TX, CCK); 413 BAND_ON_2_4G, rfpath, RF_1TX, CCK);
549 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 414 _phy_convert_txpower_dbm_to_relative_value(
550 [rfpath][RF_1TX][2]), 1, 1, base); 415 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][2],
551 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 416 1, 1, base);
552 [rfpath][RF_1TX][3]), 1, 3, base); 417 _phy_convert_txpower_dbm_to_relative_value(
553 418 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][3],
554 base = phy_get_txpwr_by_rate_base(hw, BAND_ON_2_4G, rfpath, 419 1, 3, base);
555 RF_1TX, OFDM); 420
556 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 421 base = _rtl8723be_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath,
557 [rfpath][RF_1TX][0]), 0, 3, base); 422 RF_1TX, OFDM);
558 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 423 _phy_convert_txpower_dbm_to_relative_value(
559 [rfpath][RF_1TX][1]), 0, 3, base); 424 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][0],
560 425 0, 3, base);
561 base = phy_get_txpwr_by_rate_base(hw, BAND_ON_2_4G, rfpath, 426 _phy_convert_txpower_dbm_to_relative_value(
562 RF_1TX, HT_MCS0_MCS7); 427 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][1],
563 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 428 0, 3, base);
564 [rfpath][RF_1TX][4]), 0, 3, base); 429
565 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 430 base = _rtl8723be_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G,
566 [rfpath][RF_1TX][5]), 0, 3, base); 431 rfpath, RF_1TX, HT_MCS0_MCS7);
567 432 _phy_convert_txpower_dbm_to_relative_value(
568 base = phy_get_txpwr_by_rate_base(hw, BAND_ON_2_4G, rfpath, 433 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][4],
569 RF_2TX, HT_MCS8_MCS15); 434 0, 3, base);
570 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 435 _phy_convert_txpower_dbm_to_relative_value(
571 [rfpath][RF_2TX][6]), 0, 3, base); 436 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][5],
572 437 0, 3, base);
573 phy_conv_dbm_to_rel(&(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G] 438
574 [rfpath][RF_2TX][7]), 0, 3, base); 439 base = _rtl8723be_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G,
440 rfpath, RF_2TX,
441 HT_MCS8_MCS15);
442 _phy_convert_txpower_dbm_to_relative_value(
443 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][6],
444 0, 3, base);
445
446 _phy_convert_txpower_dbm_to_relative_value(
447 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][7],
448 0, 3, base);
575 449
576 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 450 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
577 "<=== conv_dbm_to_rel()\n"); 451 "<===_rtl8723be_phy_convert_txpower_dbm_to_relative_value()\n");
578} 452}
579 453
580static void _rtl8723be_phy_txpower_by_rate_configuration( 454static void phy_txpower_by_rate_config(struct ieee80211_hw *hw)
581 struct ieee80211_hw *hw)
582{ 455{
583 _rtl8723be_phy_store_txpower_by_rate_base(hw); 456 _rtl8723be_phy_store_txpower_by_rate_base(hw);
584 conv_dbm_to_rel(hw); 457 _rtl8723be_phy_convert_txpower_dbm_to_relative_value(hw);
585} 458}
586 459
587static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw) 460static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw)
588{ 461{
589 struct rtl_priv *rtlpriv = rtl_priv(hw); 462 struct rtl_priv *rtlpriv = rtl_priv(hw);
590 struct rtl_phy *rtlphy = &(rtlpriv->phy); 463 struct rtl_phy *rtlphy = &rtlpriv->phy;
591 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 464 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
592 bool rtstatus; 465 bool rtstatus;
593 466
@@ -603,7 +476,7 @@ static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw)
603 rtstatus = _rtl8723be_phy_config_bb_with_pgheaderfile(hw, 476 rtstatus = _rtl8723be_phy_config_bb_with_pgheaderfile(hw,
604 BASEBAND_CONFIG_PHY_REG); 477 BASEBAND_CONFIG_PHY_REG);
605 } 478 }
606 _rtl8723be_phy_txpower_by_rate_configuration(hw); 479 phy_txpower_by_rate_config(hw);
607 if (!rtstatus) { 480 if (!rtstatus) {
608 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!"); 481 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
609 return false; 482 return false;
@@ -614,39 +487,237 @@ static bool _rtl8723be_phy_bb8723b_config_parafile(struct ieee80211_hw *hw)
614 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n"); 487 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
615 return false; 488 return false;
616 } 489 }
617 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw, 490 rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
618 RFPGA0_XA_HSSIPARAMETER2, 491 RFPGA0_XA_HSSIPARAMETER2,
619 0x200)); 492 0x200));
620 return true; 493 return true;
621} 494}
622 495
496static bool _rtl8723be_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
497{
498 struct rtl_priv *rtlpriv = rtl_priv(hw);
499 u32 i;
500 u32 arraylength;
501 u32 *ptrarray;
502
503 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read rtl8723beMACPHY_Array\n");
504 arraylength = RTL8723BEMAC_1T_ARRAYLEN;
505 ptrarray = RTL8723BEMAC_1T_ARRAY;
506 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
507 "Img:RTL8723bEMAC_1T_ARRAY LEN %d\n", arraylength);
508 for (i = 0; i < arraylength; i = i + 2)
509 rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]);
510 return true;
511}
512
513static bool _rtl8723be_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
514 u8 configtype)
515{
516 #define READ_NEXT_PAIR(v1, v2, i) \
517 do { \
518 i += 2; \
519 v1 = array_table[i];\
520 v2 = array_table[i+1]; \
521 } while (0)
522
523 int i;
524 u32 *array_table;
525 u16 arraylen;
526 struct rtl_priv *rtlpriv = rtl_priv(hw);
527 u32 v1 = 0, v2 = 0;
528
529 if (configtype == BASEBAND_CONFIG_PHY_REG) {
530 arraylen = RTL8723BEPHY_REG_1TARRAYLEN;
531 array_table = RTL8723BEPHY_REG_1TARRAY;
532
533 for (i = 0; i < arraylen; i = i + 2) {
534 v1 = array_table[i];
535 v2 = array_table[i+1];
536 if (v1 < 0xcdcdcdcd) {
537 _rtl8723be_config_bb_reg(hw, v1, v2);
538 } else {/*This line is the start line of branch.*/
539 /* to protect READ_NEXT_PAIR not overrun */
540 if (i >= arraylen - 2)
541 break;
542
543 if (!_rtl8723be_check_condition(hw,
544 array_table[i])) {
545 /*Discard the following
546 *(offset, data) pairs
547 */
548 READ_NEXT_PAIR(v1, v2, i);
549 while (v2 != 0xDEAD &&
550 v2 != 0xCDEF &&
551 v2 != 0xCDCD &&
552 i < arraylen - 2) {
553 READ_NEXT_PAIR(v1, v2, i);
554 }
555 i -= 2; /* prevent from for-loop += 2*/
556 /*Configure matched pairs and
557 *skip to end of if-else.
558 */
559 } else {
560 READ_NEXT_PAIR(v1, v2, i);
561 while (v2 != 0xDEAD &&
562 v2 != 0xCDEF &&
563 v2 != 0xCDCD &&
564 i < arraylen - 2) {
565 _rtl8723be_config_bb_reg(hw,
566 v1, v2);
567 READ_NEXT_PAIR(v1, v2, i);
568 }
569
570 while (v2 != 0xDEAD && i < arraylen - 2)
571 READ_NEXT_PAIR(v1, v2, i);
572 }
573 }
574 }
575 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
576 arraylen = RTL8723BEAGCTAB_1TARRAYLEN;
577 array_table = RTL8723BEAGCTAB_1TARRAY;
578
579 for (i = 0; i < arraylen; i = i + 2) {
580 v1 = array_table[i];
581 v2 = array_table[i+1];
582 if (v1 < 0xCDCDCDCD) {
583 rtl_set_bbreg(hw, array_table[i],
584 MASKDWORD,
585 array_table[i + 1]);
586 udelay(1);
587 continue;
588 } else {/*This line is the start line of branch.*/
589 /* to protect READ_NEXT_PAIR not overrun */
590 if (i >= arraylen - 2)
591 break;
592
593 if (!_rtl8723be_check_condition(hw,
594 array_table[i])) {
595 /*Discard the following
596 *(offset, data) pairs
597 */
598 READ_NEXT_PAIR(v1, v2, i);
599 while (v2 != 0xDEAD &&
600 v2 != 0xCDEF &&
601 v2 != 0xCDCD &&
602 i < arraylen - 2) {
603 READ_NEXT_PAIR(v1, v2, i);
604 }
605 i -= 2; /* prevent from for-loop += 2*/
606 /*Configure matched pairs and
607 *skip to end of if-else.
608 */
609 } else {
610 READ_NEXT_PAIR(v1, v2, i);
611 while (v2 != 0xDEAD &&
612 v2 != 0xCDEF &&
613 v2 != 0xCDCD &&
614 i < arraylen - 2) {
615 rtl_set_bbreg(hw, array_table[i],
616 MASKDWORD,
617 array_table[i + 1]);
618 udelay(1);
619 READ_NEXT_PAIR(v1, v2, i);
620 }
621
622 while (v2 != 0xDEAD && i < arraylen - 2)
623 READ_NEXT_PAIR(v1, v2, i);
624 }
625 }
626 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
627 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
628 array_table[i], array_table[i + 1]);
629 }
630 }
631 return true;
632}
633
634static u8 _rtl8723be_get_rate_section_index(u32 regaddr)
635{
636 u8 index = 0;
637
638 switch (regaddr) {
639 case RTXAGC_A_RATE18_06:
640 index = 0;
641 break;
642 case RTXAGC_A_RATE54_24:
643 index = 1;
644 break;
645 case RTXAGC_A_CCK1_MCS32:
646 index = 2;
647 break;
648 case RTXAGC_B_CCK11_A_CCK2_11:
649 index = 3;
650 break;
651 case RTXAGC_A_MCS03_MCS00:
652 index = 4;
653 break;
654 case RTXAGC_A_MCS07_MCS04:
655 index = 5;
656 break;
657 case RTXAGC_A_MCS11_MCS08:
658 index = 6;
659 break;
660 case RTXAGC_A_MCS15_MCS12:
661 index = 7;
662 break;
663 case RTXAGC_B_RATE18_06:
664 index = 0;
665 break;
666 case RTXAGC_B_RATE54_24:
667 index = 1;
668 break;
669 case RTXAGC_B_CCK1_55_MCS32:
670 index = 2;
671 break;
672 case RTXAGC_B_MCS03_MCS00:
673 index = 4;
674 break;
675 case RTXAGC_B_MCS07_MCS04:
676 index = 5;
677 break;
678 case RTXAGC_B_MCS11_MCS08:
679 index = 6;
680 break;
681 case RTXAGC_B_MCS15_MCS12:
682 index = 7;
683 break;
684 default:
685 regaddr &= 0xFFF;
686 if (regaddr >= 0xC20 && regaddr <= 0xC4C)
687 index = (u8)((regaddr - 0xC20) / 4);
688 else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
689 index = (u8)((regaddr - 0xE20) / 4);
690 break;
691 };
692 return index;
693}
694
623static void _rtl8723be_store_tx_power_by_rate(struct ieee80211_hw *hw, 695static void _rtl8723be_store_tx_power_by_rate(struct ieee80211_hw *hw,
624 u32 band, u32 rfpath, 696 u32 band, u32 rfpath,
625 u32 txnum, u32 regaddr, 697 u32 txnum, u32 regaddr,
626 u32 bitmask, u32 data) 698 u32 bitmask, u32 data)
627{ 699{
628 struct rtl_priv *rtlpriv = rtl_priv(hw); 700 struct rtl_priv *rtlpriv = rtl_priv(hw);
629 struct rtl_phy *rtlphy = &(rtlpriv->phy); 701 struct rtl_phy *rtlphy = &rtlpriv->phy;
630 u8 rate_section = _rtl8723be_get_rate_section_index(regaddr); 702 u8 rate_section = _rtl8723be_get_rate_section_index(regaddr);
631 703
632 if (band != BAND_ON_2_4G && band != BAND_ON_5G) { 704 if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
633 RT_TRACE(rtlpriv, COMP_POWER, PHY_TXPWR, 705 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid Band %d\n", band);
634 "Invalid Band %d\n", band);
635 return; 706 return;
636 } 707 }
637 708 if (rfpath > MAX_RF_PATH - 1) {
638 if (rfpath > TX_PWR_BY_RATE_NUM_RF) { 709 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR,
639 RT_TRACE(rtlpriv, COMP_POWER, PHY_TXPWR,
640 "Invalid RfPath %d\n", rfpath); 710 "Invalid RfPath %d\n", rfpath);
641 return; 711 return;
642 } 712 }
643 if (txnum > TX_PWR_BY_RATE_NUM_RF) { 713 if (txnum > MAX_RF_PATH - 1) {
644 RT_TRACE(rtlpriv, COMP_POWER, PHY_TXPWR, 714 RT_TRACE(rtlpriv, FPHY, PHY_TXPWR, "Invalid TxNum %d\n", txnum);
645 "Invalid TxNum %d\n", txnum);
646 return; 715 return;
647 } 716 }
717
648 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = 718 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] =
649 data; 719 data;
720
650} 721}
651 722
652static bool _rtl8723be_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw, 723static bool _rtl8723be_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
@@ -678,21 +749,6 @@ static bool _rtl8723be_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
678 _rtl8723be_store_tx_power_by_rate(hw, 749 _rtl8723be_store_tx_power_by_rate(hw,
679 v1, v2, v3, v4, v5, v6); 750 v1, v2, v3, v4, v5, v6);
680 continue; 751 continue;
681 } else {
682 /*don't need the hw_body*/
683 if (!_rtl8723be_check_condition(hw,
684 phy_regarray_table_pg[i])) {
685 i += 2; /* skip the pair of expression*/
686 v1 = phy_regarray_table_pg[i];
687 v2 = phy_regarray_table_pg[i+1];
688 v3 = phy_regarray_table_pg[i+2];
689 while (v2 != 0xDEAD) {
690 i += 3;
691 v1 = phy_regarray_table_pg[i];
692 v2 = phy_regarray_table_pg[i+1];
693 v3 = phy_regarray_table_pg[i+2];
694 }
695 }
696 } 752 }
697 } 753 }
698 } else { 754 } else {
@@ -733,22 +789,27 @@ bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
733 v2 = radioa_array_table[i+1]; 789 v2 = radioa_array_table[i+1];
734 if (v1 < 0xcdcdcdcd) { 790 if (v1 < 0xcdcdcdcd) {
735 _rtl8723be_config_rf_radio_a(hw, v1, v2); 791 _rtl8723be_config_rf_radio_a(hw, v1, v2);
736 } else { /*This line is the start line of branch.*/ 792 } else {/*This line is the start line of branch.*/
793 /* to protect READ_NEXT_PAIR not overrun */
794 if (i >= radioa_arraylen - 2)
795 break;
796
737 if (!_rtl8723be_check_condition(hw, 797 if (!_rtl8723be_check_condition(hw,
738 radioa_array_table[i])) { 798 radioa_array_table[i])) {
739 /* Discard the following 799 /*Discard the following
740 * (offset, data) pairs 800 *(offset, data) pairs
741 */ 801 */
742 READ_NEXT_RF_PAIR(v1, v2, i); 802 READ_NEXT_RF_PAIR(v1, v2, i);
743 while (v2 != 0xDEAD && 803 while (v2 != 0xDEAD &&
744 v2 != 0xCDEF && 804 v2 != 0xCDEF &&
745 v2 != 0xCDCD && 805 v2 != 0xCDCD &&
746 i < radioa_arraylen - 2) 806 i < radioa_arraylen - 2) {
747 READ_NEXT_RF_PAIR(v1, v2, i); 807 READ_NEXT_RF_PAIR(v1, v2, i);
808 }
748 i -= 2; /* prevent from for-loop += 2*/ 809 i -= 2; /* prevent from for-loop += 2*/
749 } else { 810 } else {
750 /* Configure matched pairs 811 /*Configure matched pairs
751 * and skip to end of if-else. 812 *and skip to end of if-else.
752 */ 813 */
753 READ_NEXT_RF_PAIR(v1, v2, i); 814 READ_NEXT_RF_PAIR(v1, v2, i);
754 while (v2 != 0xDEAD && 815 while (v2 != 0xDEAD &&
@@ -770,18 +831,12 @@ bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
770 831
771 if (rtlhal->oem_id == RT_CID_819X_HP) 832 if (rtlhal->oem_id == RT_CID_819X_HP)
772 _rtl8723be_config_rf_radio_a(hw, 0x52, 0x7E4BD); 833 _rtl8723be_config_rf_radio_a(hw, 0x52, 0x7E4BD);
773
774 break; 834 break;
775 case RF90_PATH_B: 835 case RF90_PATH_B:
776 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
777 "switch case not process\n");
778 break;
779 case RF90_PATH_C: 836 case RF90_PATH_C:
780 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
781 "switch case not process\n");
782 break; 837 break;
783 case RF90_PATH_D: 838 case RF90_PATH_D:
784 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 839 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
785 "switch case not process\n"); 840 "switch case not process\n");
786 break; 841 break;
787 } 842 }
@@ -791,26 +846,25 @@ bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
791void rtl8723be_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw) 846void rtl8723be_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
792{ 847{
793 struct rtl_priv *rtlpriv = rtl_priv(hw); 848 struct rtl_priv *rtlpriv = rtl_priv(hw);
794 struct rtl_phy *rtlphy = &(rtlpriv->phy); 849 struct rtl_phy *rtlphy = &rtlpriv->phy;
795 850
796 rtlphy->default_initialgain[0] = 851 rtlphy->default_initialgain[0] =
797 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0); 852 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
798 rtlphy->default_initialgain[1] = 853 rtlphy->default_initialgain[1] =
799 (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0); 854 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
800 rtlphy->default_initialgain[2] = 855 rtlphy->default_initialgain[2] =
801 (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0); 856 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
802 rtlphy->default_initialgain[3] = 857 rtlphy->default_initialgain[3] =
803 (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0); 858 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
804 859
805 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 860 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
806 "Default initial gain (c50 = 0x%x, " 861 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
807 "c58 = 0x%x, c60 = 0x%x, c68 = 0x%x\n", 862 rtlphy->default_initialgain[0],
808 rtlphy->default_initialgain[0], 863 rtlphy->default_initialgain[1],
809 rtlphy->default_initialgain[1], 864 rtlphy->default_initialgain[2],
810 rtlphy->default_initialgain[2], 865 rtlphy->default_initialgain[3]);
811 rtlphy->default_initialgain[3]); 866
812 867 rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
813 rtlphy->framesync = (u8) rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
814 MASKBYTE0); 868 MASKBYTE0);
815 rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2, 869 rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
816 MASKDWORD); 870 MASKDWORD);
@@ -823,7 +877,7 @@ void rtl8723be_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
823void rtl8723be_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel) 877void rtl8723be_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
824{ 878{
825 struct rtl_priv *rtlpriv = rtl_priv(hw); 879 struct rtl_priv *rtlpriv = rtl_priv(hw);
826 struct rtl_phy *rtlphy = &(rtlpriv->phy); 880 struct rtl_phy *rtlphy = &rtlpriv->phy;
827 u8 txpwr_level; 881 u8 txpwr_level;
828 long txpwr_dbm; 882 long txpwr_dbm;
829 883
@@ -854,6 +908,7 @@ static u8 _rtl8723be_phy_get_ratesection_intxpower_byrate(enum radio_path path,
854 case DESC92C_RATE1M: 908 case DESC92C_RATE1M:
855 rate_section = 2; 909 rate_section = 2;
856 break; 910 break;
911
857 case DESC92C_RATE2M: 912 case DESC92C_RATE2M:
858 case DESC92C_RATE5_5M: 913 case DESC92C_RATE5_5M:
859 if (path == RF90_PATH_A) 914 if (path == RF90_PATH_A)
@@ -861,49 +916,58 @@ static u8 _rtl8723be_phy_get_ratesection_intxpower_byrate(enum radio_path path,
861 else if (path == RF90_PATH_B) 916 else if (path == RF90_PATH_B)
862 rate_section = 2; 917 rate_section = 2;
863 break; 918 break;
919
864 case DESC92C_RATE11M: 920 case DESC92C_RATE11M:
865 rate_section = 3; 921 rate_section = 3;
866 break; 922 break;
923
867 case DESC92C_RATE6M: 924 case DESC92C_RATE6M:
868 case DESC92C_RATE9M: 925 case DESC92C_RATE9M:
869 case DESC92C_RATE12M: 926 case DESC92C_RATE12M:
870 case DESC92C_RATE18M: 927 case DESC92C_RATE18M:
871 rate_section = 0; 928 rate_section = 0;
872 break; 929 break;
930
873 case DESC92C_RATE24M: 931 case DESC92C_RATE24M:
874 case DESC92C_RATE36M: 932 case DESC92C_RATE36M:
875 case DESC92C_RATE48M: 933 case DESC92C_RATE48M:
876 case DESC92C_RATE54M: 934 case DESC92C_RATE54M:
877 rate_section = 1; 935 rate_section = 1;
878 break; 936 break;
937
879 case DESC92C_RATEMCS0: 938 case DESC92C_RATEMCS0:
880 case DESC92C_RATEMCS1: 939 case DESC92C_RATEMCS1:
881 case DESC92C_RATEMCS2: 940 case DESC92C_RATEMCS2:
882 case DESC92C_RATEMCS3: 941 case DESC92C_RATEMCS3:
883 rate_section = 4; 942 rate_section = 4;
884 break; 943 break;
944
885 case DESC92C_RATEMCS4: 945 case DESC92C_RATEMCS4:
886 case DESC92C_RATEMCS5: 946 case DESC92C_RATEMCS5:
887 case DESC92C_RATEMCS6: 947 case DESC92C_RATEMCS6:
888 case DESC92C_RATEMCS7: 948 case DESC92C_RATEMCS7:
889 rate_section = 5; 949 rate_section = 5;
890 break; 950 break;
951
891 case DESC92C_RATEMCS8: 952 case DESC92C_RATEMCS8:
892 case DESC92C_RATEMCS9: 953 case DESC92C_RATEMCS9:
893 case DESC92C_RATEMCS10: 954 case DESC92C_RATEMCS10:
894 case DESC92C_RATEMCS11: 955 case DESC92C_RATEMCS11:
895 rate_section = 6; 956 rate_section = 6;
896 break; 957 break;
958
897 case DESC92C_RATEMCS12: 959 case DESC92C_RATEMCS12:
898 case DESC92C_RATEMCS13: 960 case DESC92C_RATEMCS13:
899 case DESC92C_RATEMCS14: 961 case DESC92C_RATEMCS14:
900 case DESC92C_RATEMCS15: 962 case DESC92C_RATEMCS15:
901 rate_section = 7; 963 rate_section = 7;
902 break; 964 break;
965
903 default: 966 default:
904 RT_ASSERT(true, "Rate_Section is Illegal\n"); 967 RT_ASSERT(true, "Rate_Section is Illegal\n");
905 break; 968 break;
906 } 969 }
970
907 return rate_section; 971 return rate_section;
908} 972}
909 973
@@ -912,7 +976,7 @@ static u8 _rtl8723be_get_txpower_by_rate(struct ieee80211_hw *hw,
912 enum radio_path rfpath, u8 rate) 976 enum radio_path rfpath, u8 rate)
913{ 977{
914 struct rtl_priv *rtlpriv = rtl_priv(hw); 978 struct rtl_priv *rtlpriv = rtl_priv(hw);
915 struct rtl_phy *rtlphy = &(rtlpriv->phy); 979 struct rtl_phy *rtlphy = &rtlpriv->phy;
916 u8 shift = 0, rate_section, tx_num; 980 u8 shift = 0, rate_section, tx_num;
917 char tx_pwr_diff = 0; 981 char tx_pwr_diff = 0;
918 982
@@ -988,7 +1052,7 @@ static u8 _rtl8723be_get_txpower_index(struct ieee80211_hw *hw, u8 path,
988 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 1052 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
989 "Illegal channel!\n"); 1053 "Illegal channel!\n");
990 } 1054 }
991 if (RTL8723E_RX_HAL_IS_CCK_RATE(rate)) 1055 if (RX_HAL_IS_CCK_RATE(rate))
992 txpower = rtlefuse->txpwrlevel_cck[path][index]; 1056 txpower = rtlefuse->txpwrlevel_cck[path][index];
993 else if (DESC92C_RATE6M <= rate) 1057 else if (DESC92C_RATE6M <= rate)
994 txpower = rtlefuse->txpwrlevel_ht40_1s[path][index]; 1058 txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
@@ -997,7 +1061,7 @@ static u8 _rtl8723be_get_txpower_index(struct ieee80211_hw *hw, u8 path,
997 "invalid rate\n"); 1061 "invalid rate\n");
998 1062
999 if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M && 1063 if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M &&
1000 !RTL8723E_RX_HAL_IS_CCK_RATE(rate)) 1064 !RX_HAL_IS_CCK_RATE(rate))
1001 txpower += rtlefuse->txpwr_legacyhtdiff[0][TX_1S]; 1065 txpower += rtlefuse->txpwr_legacyhtdiff[0][TX_1S];
1002 1066
1003 if (bandwidth == HT_CHANNEL_WIDTH_20) { 1067 if (bandwidth == HT_CHANNEL_WIDTH_20) {
@@ -1011,6 +1075,7 @@ static u8 _rtl8723be_get_txpower_index(struct ieee80211_hw *hw, u8 path,
1011 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15) 1075 if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1012 txpower += rtlefuse->txpwr_ht40diff[0][TX_2S]; 1076 txpower += rtlefuse->txpwr_ht40diff[0][TX_2S];
1013 } 1077 }
1078
1014 if (rtlefuse->eeprom_regulatory != 2) 1079 if (rtlefuse->eeprom_regulatory != 2)
1015 power_diff_byrate = _rtl8723be_get_txpower_by_rate(hw, 1080 power_diff_byrate = _rtl8723be_get_txpower_by_rate(hw,
1016 BAND_ON_2_4G, 1081 BAND_ON_2_4G,
@@ -1046,6 +1111,7 @@ static void _rtl8723be_phy_set_txpower_index(struct ieee80211_hw *hw,
1046 rtl8723_phy_set_bb_reg(hw, RTXAGC_B_CCK11_A_CCK2_11, 1111 rtl8723_phy_set_bb_reg(hw, RTXAGC_B_CCK11_A_CCK2_11,
1047 MASKBYTE3, power_index); 1112 MASKBYTE3, power_index);
1048 break; 1113 break;
1114
1049 case DESC92C_RATE6M: 1115 case DESC92C_RATE6M:
1050 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06, 1116 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06,
1051 MASKBYTE0, power_index); 1117 MASKBYTE0, power_index);
@@ -1062,6 +1128,7 @@ static void _rtl8723be_phy_set_txpower_index(struct ieee80211_hw *hw,
1062 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06, 1128 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE18_06,
1063 MASKBYTE3, power_index); 1129 MASKBYTE3, power_index);
1064 break; 1130 break;
1131
1065 case DESC92C_RATE24M: 1132 case DESC92C_RATE24M:
1066 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24, 1133 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24,
1067 MASKBYTE0, power_index); 1134 MASKBYTE0, power_index);
@@ -1078,6 +1145,7 @@ static void _rtl8723be_phy_set_txpower_index(struct ieee80211_hw *hw,
1078 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24, 1145 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_RATE54_24,
1079 MASKBYTE3, power_index); 1146 MASKBYTE3, power_index);
1080 break; 1147 break;
1148
1081 case DESC92C_RATEMCS0: 1149 case DESC92C_RATEMCS0:
1082 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00, 1150 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00,
1083 MASKBYTE0, power_index); 1151 MASKBYTE0, power_index);
@@ -1094,6 +1162,7 @@ static void _rtl8723be_phy_set_txpower_index(struct ieee80211_hw *hw,
1094 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00, 1162 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS03_MCS00,
1095 MASKBYTE3, power_index); 1163 MASKBYTE3, power_index);
1096 break; 1164 break;
1165
1097 case DESC92C_RATEMCS4: 1166 case DESC92C_RATEMCS4:
1098 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04, 1167 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04,
1099 MASKBYTE0, power_index); 1168 MASKBYTE0, power_index);
@@ -1110,6 +1179,7 @@ static void _rtl8723be_phy_set_txpower_index(struct ieee80211_hw *hw,
1110 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04, 1179 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS07_MCS04,
1111 MASKBYTE3, power_index); 1180 MASKBYTE3, power_index);
1112 break; 1181 break;
1182
1113 case DESC92C_RATEMCS8: 1183 case DESC92C_RATEMCS8:
1114 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08, 1184 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08,
1115 MASKBYTE0, power_index); 1185 MASKBYTE0, power_index);
@@ -1126,9 +1196,9 @@ static void _rtl8723be_phy_set_txpower_index(struct ieee80211_hw *hw,
1126 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08, 1196 rtl8723_phy_set_bb_reg(hw, RTXAGC_A_MCS11_MCS08,
1127 MASKBYTE3, power_index); 1197 MASKBYTE3, power_index);
1128 break; 1198 break;
1199
1129 default: 1200 default:
1130 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 1201 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Rate!!\n");
1131 "Invalid Rate!!\n");
1132 break; 1202 break;
1133 } 1203 }
1134 } else { 1204 } else {
@@ -1192,10 +1262,11 @@ void rtl8723be_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1192 1262
1193 if (!is_hal_stop(rtlhal)) { 1263 if (!is_hal_stop(rtlhal)) {
1194 switch (operation) { 1264 switch (operation) {
1195 case SCAN_OPT_BACKUP: 1265 case SCAN_OPT_BACKUP_BAND0:
1196 iotype = IO_CMD_PAUSE_DM_BY_SCAN; 1266 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1197 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD, 1267 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1198 (u8 *)&iotype); 1268 (u8 *)&iotype);
1269
1199 break; 1270 break;
1200 case SCAN_OPT_RESTORE: 1271 case SCAN_OPT_RESTORE:
1201 iotype = IO_CMD_RESUME_DM_BY_SCAN; 1272 iotype = IO_CMD_RESUME_DM_BY_SCAN;
@@ -1214,15 +1285,15 @@ void rtl8723be_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1214{ 1285{
1215 struct rtl_priv *rtlpriv = rtl_priv(hw); 1286 struct rtl_priv *rtlpriv = rtl_priv(hw);
1216 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1287 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1217 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1288 struct rtl_phy *rtlphy = &rtlpriv->phy;
1218 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 1289 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1219 u8 reg_bw_opmode; 1290 u8 reg_bw_opmode;
1220 u8 reg_prsr_rsc; 1291 u8 reg_prsr_rsc;
1221 1292
1222 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 1293 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
1223 "Switch to %s bandwidth\n", 1294 "Switch to %s bandwidth\n",
1224 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? 1295 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1225 "20MHz" : "40MHz"); 1296 "20MHz" : "40MHz");
1226 1297
1227 if (is_hal_stop(rtlhal)) { 1298 if (is_hal_stop(rtlhal)) {
1228 rtlphy->set_bwmode_inprogress = false; 1299 rtlphy->set_bwmode_inprogress = false;
@@ -1254,13 +1325,17 @@ void rtl8723be_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1254 case HT_CHANNEL_WIDTH_20: 1325 case HT_CHANNEL_WIDTH_20:
1255 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0); 1326 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1256 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0); 1327 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1328 /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1);*/
1257 break; 1329 break;
1258 case HT_CHANNEL_WIDTH_20_40: 1330 case HT_CHANNEL_WIDTH_20_40:
1259 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1); 1331 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1260 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1); 1332 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1333
1261 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND, 1334 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
1262 (mac->cur_40_prime_sc >> 1)); 1335 (mac->cur_40_prime_sc >> 1));
1263 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc); 1336 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
1337 /*rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 0);*/
1338
1264 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)), 1339 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1265 (mac->cur_40_prime_sc == 1340 (mac->cur_40_prime_sc ==
1266 HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1); 1341 HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
@@ -1279,7 +1354,7 @@ void rtl8723be_phy_set_bw_mode(struct ieee80211_hw *hw,
1279 enum nl80211_channel_type ch_type) 1354 enum nl80211_channel_type ch_type)
1280{ 1355{
1281 struct rtl_priv *rtlpriv = rtl_priv(hw); 1356 struct rtl_priv *rtlpriv = rtl_priv(hw);
1282 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1357 struct rtl_phy *rtlphy = &rtlpriv->phy;
1283 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1358 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1284 u8 tmp_bw = rtlphy->current_chan_bw; 1359 u8 tmp_bw = rtlphy->current_chan_bw;
1285 1360
@@ -1300,7 +1375,7 @@ void rtl8723be_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1300{ 1375{
1301 struct rtl_priv *rtlpriv = rtl_priv(hw); 1376 struct rtl_priv *rtlpriv = rtl_priv(hw);
1302 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1377 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1303 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1378 struct rtl_phy *rtlphy = &rtlpriv->phy;
1304 u32 delay; 1379 u32 delay;
1305 1380
1306 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 1381 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
@@ -1310,11 +1385,11 @@ void rtl8723be_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1310 do { 1385 do {
1311 if (!rtlphy->sw_chnl_inprogress) 1386 if (!rtlphy->sw_chnl_inprogress)
1312 break; 1387 break;
1313 if (!rtl8723be_phy_sw_chn_step_by_step(hw, 1388 if (!_rtl8723be_phy_sw_chnl_step_by_step(hw,
1314 rtlphy->current_channel, 1389 rtlphy->current_channel,
1315 &rtlphy->sw_chnl_stage, 1390 &rtlphy->sw_chnl_stage,
1316 &rtlphy->sw_chnl_step, 1391 &rtlphy->sw_chnl_step,
1317 &delay)) { 1392 &delay)) {
1318 if (delay > 0) 1393 if (delay > 0)
1319 mdelay(delay); 1394 mdelay(delay);
1320 else 1395 else
@@ -1330,7 +1405,7 @@ void rtl8723be_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1330u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw) 1405u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw)
1331{ 1406{
1332 struct rtl_priv *rtlpriv = rtl_priv(hw); 1407 struct rtl_priv *rtlpriv = rtl_priv(hw);
1333 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1408 struct rtl_phy *rtlphy = &rtlpriv->phy;
1334 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1409 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1335 1410
1336 if (rtlphy->sw_chnl_inprogress) 1411 if (rtlphy->sw_chnl_inprogress)
@@ -1345,25 +1420,23 @@ u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw)
1345 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { 1420 if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1346 rtl8723be_phy_sw_chnl_callback(hw); 1421 rtl8723be_phy_sw_chnl_callback(hw);
1347 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD, 1422 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1348 "sw_chnl_inprogress false schdule " 1423 "sw_chnl_inprogress false schdule workitem current channel %d\n",
1349 "workitem current channel %d\n", 1424 rtlphy->current_channel);
1350 rtlphy->current_channel);
1351 rtlphy->sw_chnl_inprogress = false; 1425 rtlphy->sw_chnl_inprogress = false;
1352 } else { 1426 } else {
1353 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD, 1427 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
1354 "sw_chnl_inprogress false driver sleep or" 1428 "sw_chnl_inprogress false driver sleep or unload\n");
1355 " unload\n");
1356 rtlphy->sw_chnl_inprogress = false; 1429 rtlphy->sw_chnl_inprogress = false;
1357 } 1430 }
1358 return 1; 1431 return 1;
1359} 1432}
1360 1433
1361static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw, 1434static bool _rtl8723be_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1362 u8 channel, u8 *stage, 1435 u8 channel, u8 *stage,
1363 u8 *step, u32 *delay) 1436 u8 *step, u32 *delay)
1364{ 1437{
1365 struct rtl_priv *rtlpriv = rtl_priv(hw); 1438 struct rtl_priv *rtlpriv = rtl_priv(hw);
1366 struct rtl_phy *rtlphy = &(rtlpriv->phy); 1439 struct rtl_phy *rtlphy = &rtlpriv->phy;
1367 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT]; 1440 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1368 u32 precommoncmdcnt; 1441 u32 precommoncmdcnt;
1369 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT]; 1442 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
@@ -1381,10 +1454,13 @@ static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw,
1381 0, 0, 0); 1454 0, 0, 0);
1382 rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++, 1455 rtl8723_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1383 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0); 1456 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1457
1384 postcommoncmdcnt = 0; 1458 postcommoncmdcnt = 0;
1459
1385 rtl8723_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++, 1460 rtl8723_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1386 MAX_POSTCMD_CNT, CMDID_END, 1461 MAX_POSTCMD_CNT, CMDID_END,
1387 0, 0, 0); 1462 0, 0, 0);
1463
1388 rfdependcmdcnt = 0; 1464 rfdependcmdcnt = 0;
1389 1465
1390 RT_ASSERT((channel >= 1 && channel <= 14), 1466 RT_ASSERT((channel >= 1 && channel <= 14),
@@ -1397,7 +1473,7 @@ static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw,
1397 1473
1398 rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++, 1474 rtl8723_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1399 MAX_RFDEPENDCMD_CNT, 1475 MAX_RFDEPENDCMD_CNT,
1400 CMDID_END, 0, 0, 0); 1476 CMDID_END, 0, 0, 0);
1401 1477
1402 do { 1478 do {
1403 switch (*stage) { 1479 switch (*stage) {
@@ -1410,6 +1486,10 @@ static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw,
1410 case 2: 1486 case 2:
1411 currentcmd = &postcommoncmd[*step]; 1487 currentcmd = &postcommoncmd[*step];
1412 break; 1488 break;
1489 default:
1490 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1491 "Invalid 'stage' = %d, Check it!\n", *stage);
1492 return true;
1413 } 1493 }
1414 1494
1415 if (currentcmd->cmdid == CMDID_END) { 1495 if (currentcmd->cmdid == CMDID_END) {
@@ -1432,11 +1512,11 @@ static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw,
1432 break; 1512 break;
1433 case CMDID_WRITEPORT_USHORT: 1513 case CMDID_WRITEPORT_USHORT:
1434 rtl_write_word(rtlpriv, currentcmd->para1, 1514 rtl_write_word(rtlpriv, currentcmd->para1,
1435 (u16) currentcmd->para2); 1515 (u16)currentcmd->para2);
1436 break; 1516 break;
1437 case CMDID_WRITEPORT_UCHAR: 1517 case CMDID_WRITEPORT_UCHAR:
1438 rtl_write_byte(rtlpriv, currentcmd->para1, 1518 rtl_write_byte(rtlpriv, currentcmd->para1,
1439 (u8) currentcmd->para2); 1519 (u8)currentcmd->para2);
1440 break; 1520 break;
1441 case CMDID_RF_WRITEREG: 1521 case CMDID_RF_WRITEREG:
1442 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) { 1522 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
@@ -1451,7 +1531,7 @@ static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw,
1451 } 1531 }
1452 break; 1532 break;
1453 default: 1533 default:
1454 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 1534 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1455 "switch case not process\n"); 1535 "switch case not process\n");
1456 break; 1536 break;
1457 } 1537 }
@@ -1464,54 +1544,515 @@ static bool rtl8723be_phy_sw_chn_step_by_step(struct ieee80211_hw *hw,
1464 return false; 1544 return false;
1465} 1545}
1466 1546
1467static u8 _rtl8723be_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb) 1547static u8 _rtl8723be_phy_path_a_iqk(struct ieee80211_hw *hw)
1468{ 1548{
1469 u32 reg_eac, reg_e94, reg_e9c, reg_ea4; 1549 u32 reg_eac, reg_e94, reg_e9c, tmp;
1470 u8 result = 0x00; 1550 u8 result = 0x00;
1471 1551
1472 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1c); 1552 /* leave IQK mode */
1473 rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x30008c1c); 1553 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1474 rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x8214032a); 1554 /* switch to path A */
1475 rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160000); 1555 rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000000);
1476 1556 /* enable path A PA in TXIQK mode */
1477 rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911); 1557 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
1478 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000); 1558 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x20000);
1479 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000); 1559 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0003f);
1560 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xc7f87);
1561
1562 /* 1. TX IQK */
1563 /* path-A IQK setting */
1564 /* IQK setting */
1565 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1566 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1567 /* path-A IQK setting */
1568 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1569 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1570 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1571 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1572
1573 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x821403ea);
1574 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160000);
1575 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1576 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1577 /* LO calibration setting */
1578 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1579 /* enter IQK mode */
1580 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1581
1582 /* One shot, path A LOK & IQK */
1583 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1584 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1480 1585
1481 mdelay(IQK_DELAY_TIME); 1586 mdelay(IQK_DELAY_TIME);
1482 1587
1588 /* leave IQK mode */
1589 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1590
1591 /* Check failed */
1483 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD); 1592 reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1484 reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD); 1593 reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1485 reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD); 1594 reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1486 reg_ea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1487 1595
1488 if (!(reg_eac & BIT(28)) && 1596 if (!(reg_eac & BIT(28)) &&
1489 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) && 1597 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1490 (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) 1598 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1491 result |= 0x01; 1599 result |= 0x01;
1600 else /* if Tx not OK, ignore Rx */
1601 return result;
1602
1603 /* Allen 20131125 */
1604 tmp = (reg_e9c & 0x03FF0000) >> 16;
1605 if ((tmp & 0x200) > 0)
1606 tmp = 0x400 - tmp;
1607
1608 if (!(reg_eac & BIT(28)) &&
1609 (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1610 (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1611 (tmp < 0xf))
1612 result |= 0x01;
1613 else /* if Tx not OK, ignore Rx */
1614 return result;
1615
1492 return result; 1616 return result;
1493} 1617}
1494 1618
1495static bool phy_similarity_cmp(struct ieee80211_hw *hw, long result[][8], 1619/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1496 u8 c1, u8 c2) 1620static u8 _rtl8723be_phy_path_a_rx_iqk(struct ieee80211_hw *hw)
1497{ 1621{
1498 u32 i, j, diff, simularity_bitmap, bound; 1622 u32 reg_eac, reg_e94, reg_e9c, reg_ea4, u32tmp, tmp;
1499 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 1623 u8 result = 0x00;
1624
1625 /* leave IQK mode */
1626 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1627
1628 /* switch to path A */
1629 rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000000);
1630
1631 /* 1 Get TXIMR setting */
1632 /* modify RXIQK mode table */
1633 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x1);
1634 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1635 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1636 /* LNA2 off, PA on for Dcut */
1637 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7fb7);
1638 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1639
1640 /* IQK setting */
1641 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1642 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1643
1644 /* path-A IQK setting */
1645 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1646 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1647 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1648 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1649
1650 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160ff0);
1651 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28110000);
1652 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1653 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1654
1655 /* LO calibration setting */
1656 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
1657
1658 /* enter IQK mode */
1659 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1660
1661 /* One shot, path A LOK & IQK */
1662 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1663 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1664
1665 mdelay(IQK_DELAY_TIME);
1666
1667 /* leave IQK mode */
1668 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1669
1670 /* Check failed */
1671 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1672 reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
1673 reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
1674
1675 if (!(reg_eac & BIT(28)) &&
1676 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1677 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1678 result |= 0x01;
1679 else /* if Tx not OK, ignore Rx */
1680 return result;
1681
1682 /* Allen 20131125 */
1683 tmp = (reg_e9c & 0x03FF0000) >> 16;
1684 if ((tmp & 0x200) > 0)
1685 tmp = 0x400 - tmp;
1686
1687 if (!(reg_eac & BIT(28)) &&
1688 (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1689 (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1690 (tmp < 0xf))
1691 result |= 0x01;
1692 else /* if Tx not OK, ignore Rx */
1693 return result;
1694
1695 u32tmp = 0x80007C00 | (reg_e94 & 0x3FF0000) |
1696 ((reg_e9c & 0x3FF0000) >> 16);
1697 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32tmp);
1698
1699 /* 1 RX IQK */
1700 /* modify RXIQK mode table */
1701 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1702 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x1);
1703 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1704 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1705 /* LAN2 on, PA off for Dcut */
1706 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7d77);
1707
1708 /* PA, PAD setting */
1709 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0xf80);
1710 rtl_set_rfreg(hw, RF90_PATH_A, 0x55, RFREG_OFFSET_MASK, 0x4021f);
1711
1712 /* IQK setting */
1713 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1714
1715 /* path-A IQK setting */
1716 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1717 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1718 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1719 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1720
1721 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82110000);
1722 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x2816001f);
1723 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1724 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1725
1726 /* LO calibration setting */
1727 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a8d1);
1728
1729 /* enter IQK mode */
1730 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1731
1732 /* One shot, path A LOK & IQK */
1733 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1734 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1735
1736 mdelay(IQK_DELAY_TIME);
1737
1738 /* leave IQK mode */
1739 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1740
1741 /* Check failed */
1742 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1743 reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
1744
1745 /* leave IQK mode */
1746 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1747 rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x780);
1748
1749 /* Allen 20131125 */
1750 tmp = (reg_eac & 0x03FF0000) >> 16;
1751 if ((tmp & 0x200) > 0)
1752 tmp = 0x400 - tmp;
1753 /* if Tx is OK, check whether Rx is OK */
1754 if (!(reg_eac & BIT(27)) &&
1755 (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
1756 (((reg_eac & 0x03FF0000) >> 16) != 0x36))
1757 result |= 0x02;
1758 else if (!(reg_eac & BIT(27)) &&
1759 (((reg_ea4 & 0x03FF0000) >> 16) < 0x110) &&
1760 (((reg_ea4 & 0x03FF0000) >> 16) > 0xf0) &&
1761 (tmp < 0xf))
1762 result |= 0x02;
1763
1764 return result;
1765}
1766
1767static u8 _rtl8723be_phy_path_b_iqk(struct ieee80211_hw *hw)
1768{
1769 u32 reg_eac, reg_e94, reg_e9c, tmp;
1770 u8 result = 0x00;
1771
1772 /* leave IQK mode */
1773 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1774 /* switch to path B */
1775 rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000280);
1776
1777 /* enable path B PA in TXIQK mode */
1778 rtl_set_rfreg(hw, RF90_PATH_A, 0xed, RFREG_OFFSET_MASK, 0x00020);
1779 rtl_set_rfreg(hw, RF90_PATH_A, 0x43, RFREG_OFFSET_MASK, 0x40fc1);
1780
1781 /* 1 Tx IQK */
1782 /* IQK setting */
1783 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1784 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1785 /* path-A IQK setting */
1786 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1787 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1788 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1789 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1790
1791 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x821403ea);
1792 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28110000);
1793 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1794 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1795
1796 /* LO calibration setting */
1797 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1798
1799 /* enter IQK mode */
1800 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1801
1802 /* One shot, path B LOK & IQK */
1803 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1804 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1805
1806 mdelay(IQK_DELAY_TIME);
1807
1808 /* leave IQK mode */
1809 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1810
1811 /* Check failed */
1812 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1813 reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
1814 reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
1815
1816 if (!(reg_eac & BIT(28)) &&
1817 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1818 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1819 result |= 0x01;
1820 else
1821 return result;
1822
1823 /* Allen 20131125 */
1824 tmp = (reg_e9c & 0x03FF0000) >> 16;
1825 if ((tmp & 0x200) > 0)
1826 tmp = 0x400 - tmp;
1827
1828 if (!(reg_eac & BIT(28)) &&
1829 (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1830 (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1831 (tmp < 0xf))
1832 result |= 0x01;
1833 else
1834 return result;
1835
1836 return result;
1837}
1838
1839/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1840static u8 _rtl8723be_phy_path_b_rx_iqk(struct ieee80211_hw *hw)
1841{
1842 u32 reg_e94, reg_e9c, reg_ea4, reg_eac, u32tmp, tmp;
1843 u8 result = 0x00;
1844
1845 /* leave IQK mode */
1846 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1847 /* switch to path B */
1848 rtl_set_bbreg(hw, 0x948, MASKDWORD, 0x00000280);
1849
1850 /* 1 Get TXIMR setting */
1851 /* modify RXIQK mode table */
1852 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
1853 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1854 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1855 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ff7);
1856
1857 /* open PA S1 & SMIXER */
1858 rtl_set_rfreg(hw, RF90_PATH_A, 0xed, RFREG_OFFSET_MASK, 0x00020);
1859 rtl_set_rfreg(hw, RF90_PATH_A, 0x43, RFREG_OFFSET_MASK, 0x60fed);
1860
1861 /* IQK setting */
1862 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
1863 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1864
1865 /* path-B IQK setting */
1866 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1867 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1868 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1869 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1870
1871 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160ff0);
1872 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28110000);
1873 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1874 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1875
1876 /* LO calibration setting */
1877 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
1878 /* enter IQK mode */
1879 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1880
1881 /* One shot, path B TXIQK @ RXIQK */
1882 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1883 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1884
1885 mdelay(IQK_DELAY_TIME);
1886
1887 /* leave IQK mode */
1888 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1889 /* Check failed */
1890 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1891 reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
1892 reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
1893
1894 if (!(reg_eac & BIT(28)) &&
1895 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1896 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1897 result |= 0x01;
1898 else /* if Tx not OK, ignore Rx */
1899 return result;
1500 1900
1501 u8 final_candidate[2] = { 0xFF, 0xFF }; 1901 /* Allen 20131125 */
1502 bool bresult = true, is2t = IS_92C_SERIAL(rtlhal->version); 1902 tmp = (reg_e9c & 0x03FF0000) >> 16;
1903 if ((tmp & 0x200) > 0)
1904 tmp = 0x400 - tmp;
1503 1905
1504 if (is2t) 1906 if (!(reg_eac & BIT(28)) &&
1505 bound = 8; 1907 (((reg_e94 & 0x03FF0000) >> 16) < 0x110) &&
1908 (((reg_e94 & 0x03FF0000) >> 16) > 0xf0) &&
1909 (tmp < 0xf))
1910 result |= 0x01;
1911 else
1912 return result;
1913
1914 u32tmp = 0x80007C00 | (reg_e94 & 0x3FF0000) |
1915 ((reg_e9c & 0x3FF0000) >> 16);
1916 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32tmp);
1917
1918 /* 1 RX IQK */
1919
1920 /* <20121009, Kordan> RF Mode = 3 */
1921 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1922 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x1);
1923 rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
1924 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0001f);
1925 rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7d77);
1926 rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, 0x80000, 0x0);
1927
1928 /* open PA S1 & close SMIXER */
1929 rtl_set_rfreg(hw, RF90_PATH_A, 0xed, RFREG_OFFSET_MASK, 0x00020);
1930 rtl_set_rfreg(hw, RF90_PATH_A, 0x43, RFREG_OFFSET_MASK, 0x60fbd);
1931
1932 /* IQK setting */
1933 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
1934
1935 /* path-B IQK setting */
1936 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1937 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1938 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1939 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1940
1941 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82110000);
1942 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x2816001f);
1943 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000);
1944 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28110000);
1945
1946 /* LO calibration setting */
1947 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a8d1);
1948 /* enter IQK mode */
1949 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1950
1951 /* One shot, path B LOK & IQK */
1952 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1953 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1954
1955 mdelay(IQK_DELAY_TIME);
1956
1957 /* leave IQK mode */
1958 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1959 /* Check failed */
1960 reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
1961 reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
1962
1963 /* Allen 20131125 */
1964 tmp = (reg_eac & 0x03FF0000) >> 16;
1965 if ((tmp & 0x200) > 0)
1966 tmp = 0x400 - tmp;
1967
1968 /* if Tx is OK, check whether Rx is OK */
1969 if (!(reg_eac & BIT(27)) &&
1970 (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
1971 (((reg_eac & 0x03FF0000) >> 16) != 0x36))
1972 result |= 0x02;
1973 else if (!(reg_eac & BIT(27)) &&
1974 (((reg_ea4 & 0x03FF0000) >> 16) < 0x110) &&
1975 (((reg_ea4 & 0x03FF0000) >> 16) > 0xf0) &&
1976 (tmp < 0xf))
1977 result |= 0x02;
1506 else 1978 else
1507 bound = 4; 1979 return result;
1980
1981 return result;
1982}
1983
1984static void _rtl8723be_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
1985 bool b_iqk_ok,
1986 long result[][8],
1987 u8 final_candidate,
1988 bool btxonly)
1989{
1990 u32 oldval_1, x, tx1_a, reg;
1991 long y, tx1_c;
1992
1993 if (final_candidate == 0xFF) {
1994 return;
1995 } else if (b_iqk_ok) {
1996 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
1997 MASKDWORD) >> 22) & 0x3FF;
1998 x = result[final_candidate][4];
1999 if ((x & 0x00000200) != 0)
2000 x = x | 0xFFFFFC00;
2001 tx1_a = (x * oldval_1) >> 8;
2002 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
2003 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
2004 ((x * oldval_1 >> 7) & 0x1));
2005 y = result[final_candidate][5];
2006 if ((y & 0x00000200) != 0)
2007 y = y | 0xFFFFFC00;
2008 tx1_c = (y * oldval_1) >> 8;
2009 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2010 ((tx1_c & 0x3C0) >> 6));
2011 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2012 (tx1_c & 0x3F));
2013 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
2014 ((y * oldval_1 >> 7) & 0x1));
2015 if (btxonly)
2016 return;
2017 reg = result[final_candidate][6];
2018 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2019 reg = result[final_candidate][7] & 0x3F;
2020 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2021 reg = (result[final_candidate][7] >> 6) & 0xF;
2022 /* rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg); */
2023 }
2024}
2025
2026static bool _rtl8723be_phy_simularity_compare(struct ieee80211_hw *hw,
2027 long result[][8], u8 c1, u8 c2)
2028{
2029 u32 i, j, diff, simularity_bitmap, bound = 0;
2030
2031 u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */
2032 bool bresult = true; /* is2t = true*/
2033 s32 tmp1 = 0, tmp2 = 0;
2034
2035 bound = 8;
1508 2036
1509 simularity_bitmap = 0; 2037 simularity_bitmap = 0;
1510 2038
1511 for (i = 0; i < bound; i++) { 2039 for (i = 0; i < bound; i++) {
1512 diff = (result[c1][i] > result[c2][i]) ? 2040 if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
1513 (result[c1][i] - result[c2][i]) : 2041 if ((result[c1][i] & 0x00000200) != 0)
1514 (result[c2][i] - result[c1][i]); 2042 tmp1 = result[c1][i] | 0xFFFFFC00;
2043 else
2044 tmp1 = result[c1][i];
2045
2046 if ((result[c2][i] & 0x00000200) != 0)
2047 tmp2 = result[c2][i] | 0xFFFFFC00;
2048 else
2049 tmp2 = result[c2][i];
2050 } else {
2051 tmp1 = result[c1][i];
2052 tmp2 = result[c2][i];
2053 }
2054
2055 diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
1515 2056
1516 if (diff > MAX_TOLERANCE) { 2057 if (diff > MAX_TOLERANCE) {
1517 if ((i == 2 || i == 6) && !simularity_bitmap) { 2058 if ((i == 2 || i == 6) && !simularity_bitmap) {
@@ -1521,9 +2062,8 @@ static bool phy_similarity_cmp(struct ieee80211_hw *hw, long result[][8],
1521 final_candidate[(i / 4)] = c1; 2062 final_candidate[(i / 4)] = c1;
1522 else 2063 else
1523 simularity_bitmap |= (1 << i); 2064 simularity_bitmap |= (1 << i);
1524 } else { 2065 } else
1525 simularity_bitmap |= (1 << i); 2066 simularity_bitmap |= (1 << i);
1526 }
1527 } 2067 }
1528 } 2068 }
1529 2069
@@ -1537,15 +2077,23 @@ static bool phy_similarity_cmp(struct ieee80211_hw *hw, long result[][8],
1537 } 2077 }
1538 } 2078 }
1539 return bresult; 2079 return bresult;
1540 } else if (!(simularity_bitmap & 0x0F)) {
1541 for (i = 0; i < 4; i++)
1542 result[3][i] = result[c1][i];
1543 return false;
1544 } else if (!(simularity_bitmap & 0xF0) && is2t) {
1545 for (i = 4; i < 8; i++)
1546 result[3][i] = result[c1][i];
1547 return false;
1548 } else { 2080 } else {
2081 if (!(simularity_bitmap & 0x03)) { /* path A TX OK */
2082 for (i = 0; i < 2; i++)
2083 result[3][i] = result[c1][i];
2084 }
2085 if (!(simularity_bitmap & 0x0c)) { /* path A RX OK */
2086 for (i = 2; i < 4; i++)
2087 result[3][i] = result[c1][i];
2088 }
2089 if (!(simularity_bitmap & 0x30)) { /* path B TX OK */
2090 for (i = 4; i < 6; i++)
2091 result[3][i] = result[c1][i];
2092 }
2093 if (!(simularity_bitmap & 0xc0)) { /* path B RX OK */
2094 for (i = 6; i < 8; i++)
2095 result[3][i] = result[c1][i];
2096 }
1549 return false; 2097 return false;
1550 } 2098 }
1551} 2099}
@@ -1554,9 +2102,9 @@ static void _rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
1554 long result[][8], u8 t, bool is2t) 2102 long result[][8], u8 t, bool is2t)
1555{ 2103{
1556 struct rtl_priv *rtlpriv = rtl_priv(hw); 2104 struct rtl_priv *rtlpriv = rtl_priv(hw);
1557 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2105 struct rtl_phy *rtlphy = &rtlpriv->phy;
1558 u32 i; 2106 u32 i;
1559 u8 patha_ok; 2107 u8 patha_ok, pathb_ok;
1560 u32 adda_reg[IQK_ADDA_REG_NUM] = { 2108 u32 adda_reg[IQK_ADDA_REG_NUM] = {
1561 0x85c, 0xe6c, 0xe70, 0xe74, 2109 0x85c, 0xe6c, 0xe70, 0xe74,
1562 0xe78, 0xe7c, 0xe80, 0xe84, 2110 0xe78, 0xe7c, 0xe80, 0xe84,
@@ -1571,10 +2119,12 @@ static void _rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
1571 ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR, 2119 ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
1572 RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c, 2120 RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
1573 0x870, 0x860, 2121 0x870, 0x860,
1574 0x864, 0x800 2122 0x864, 0xa04
1575 }; 2123 };
1576 const u32 retrycount = 2; 2124 const u32 retrycount = 2;
1577 u32 path_sel_bb, path_sel_rf; 2125
2126 u32 path_sel_bb;/* path_sel_rf */
2127
1578 u8 tmp_reg_c50, tmp_reg_c58; 2128 u8 tmp_reg_c50, tmp_reg_c58;
1579 2129
1580 tmp_reg_c50 = rtl_get_bbreg(hw, 0xc50, MASKBYTE0); 2130 tmp_reg_c50 = rtl_get_bbreg(hw, 0xc50, MASKBYTE0);
@@ -1591,62 +2141,97 @@ static void _rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
1591 } 2141 }
1592 rtl8723_phy_path_adda_on(hw, adda_reg, true, is2t); 2142 rtl8723_phy_path_adda_on(hw, adda_reg, true, is2t);
1593 if (t == 0) { 2143 if (t == 0) {
1594 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw, 2144 rtlphy->rfpi_enable = (u8)rtl_get_bbreg(hw,
1595 RFPGA0_XA_HSSIPARAMETER1, 2145 RFPGA0_XA_HSSIPARAMETER1,
1596 BIT(8)); 2146 BIT(8));
1597 } 2147 }
1598 if (!rtlphy->rfpi_enable)
1599 rtl8723_phy_pi_mode_switch(hw, true);
1600 2148
1601 path_sel_bb = rtl_get_bbreg(hw, 0x948, MASKDWORD); 2149 path_sel_bb = rtl_get_bbreg(hw, 0x948, MASKDWORD);
1602 path_sel_rf = rtl_get_rfreg(hw, RF90_PATH_A, 0xb0, 0xfffff);
1603 2150
2151 rtl8723_phy_mac_setting_calibration(hw, iqk_mac_reg,
2152 rtlphy->iqk_mac_backup);
1604 /*BB Setting*/ 2153 /*BB Setting*/
1605 rtl_set_bbreg(hw, 0x800, BIT(24), 0x00); 2154 rtl_set_bbreg(hw, 0xa04, 0x0f000000, 0xf);
1606 rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600); 2155 rtl_set_bbreg(hw, 0xc04, MASKDWORD, 0x03a05600);
1607 rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4); 2156 rtl_set_bbreg(hw, 0xc08, MASKDWORD, 0x000800e4);
1608 rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000); 2157 rtl_set_bbreg(hw, 0x874, MASKDWORD, 0x22204000);
1609 2158
1610 rtl_set_bbreg(hw, 0x870, BIT(10), 0x01); 2159 /* path A TX IQK */
1611 rtl_set_bbreg(hw, 0x870, BIT(26), 0x01);
1612 rtl_set_bbreg(hw, 0x860, BIT(10), 0x00);
1613 rtl_set_bbreg(hw, 0x864, BIT(10), 0x00);
1614
1615 if (is2t)
1616 rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASKDWORD, 0x10000);
1617 rtl8723_phy_mac_setting_calibration(hw, iqk_mac_reg,
1618 rtlphy->iqk_mac_backup);
1619 rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1620
1621 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1622 rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
1623 rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x81004800);
1624 for (i = 0; i < retrycount; i++) { 2160 for (i = 0; i < retrycount; i++) {
1625 patha_ok = _rtl8723be_phy_path_a_iqk(hw, is2t); 2161 patha_ok = _rtl8723be_phy_path_a_iqk(hw);
1626 if (patha_ok == 0x01) { 2162 if (patha_ok == 0x01) {
1627 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2163 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1628 "Path A Tx IQK Success!!\n"); 2164 "Path A Tx IQK Success!!\n");
1629 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) & 2165 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1630 0x3FF0000) >> 16; 2166 0x3FF0000) >> 16;
1631 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) & 2167 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1632 0x3FF0000) >> 16; 2168 0x3FF0000) >> 16;
1633 break; 2169 break;
2170 } else {
2171 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2172 "Path A Tx IQK Fail!!\n");
1634 } 2173 }
1635 } 2174 }
1636 2175 /* path A RX IQK */
1637 if (0 == patha_ok) 2176 for (i = 0; i < retrycount; i++) {
2177 patha_ok = _rtl8723be_phy_path_a_rx_iqk(hw);
2178 if (patha_ok == 0x03) {
2179 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2180 "Path A Rx IQK Success!!\n");
2181 result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
2182 0x3FF0000) >> 16;
2183 result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
2184 0x3FF0000) >> 16;
2185 break;
2186 }
1638 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2187 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1639 "Path A IQK Success!!\n"); 2188 "Path A Rx IQK Fail!!\n");
2189 }
2190
2191 if (0x00 == patha_ok)
2192 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Path A IQK Fail!!\n");
2193
1640 if (is2t) { 2194 if (is2t) {
1641 rtl8723_phy_path_a_standby(hw); 2195 /* path B TX IQK */
1642 rtl8723_phy_path_adda_on(hw, adda_reg, false, is2t); 2196 for (i = 0; i < retrycount; i++) {
2197 pathb_ok = _rtl8723be_phy_path_b_iqk(hw);
2198 if (pathb_ok == 0x01) {
2199 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2200 "Path B Tx IQK Success!!\n");
2201 result[t][4] = (rtl_get_bbreg(hw, 0xe94,
2202 MASKDWORD) &
2203 0x3FF0000) >> 16;
2204 result[t][5] = (rtl_get_bbreg(hw, 0xe9c,
2205 MASKDWORD) &
2206 0x3FF0000) >> 16;
2207 break;
2208 }
2209 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2210 "Path B Tx IQK Fail!!\n");
2211 }
2212 /* path B RX IQK */
2213 for (i = 0; i < retrycount; i++) {
2214 pathb_ok = _rtl8723be_phy_path_b_rx_iqk(hw);
2215 if (pathb_ok == 0x03) {
2216 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2217 "Path B Rx IQK Success!!\n");
2218 result[t][6] = (rtl_get_bbreg(hw, 0xea4,
2219 MASKDWORD) &
2220 0x3FF0000) >> 16;
2221 result[t][7] = (rtl_get_bbreg(hw, 0xeac,
2222 MASKDWORD) &
2223 0x3FF0000) >> 16;
2224 break;
2225 }
2226 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2227 "Path B Rx IQK Fail!!\n");
2228 }
1643 } 2229 }
1644 2230
1645 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0); 2231 /* Back to BB mode, load original value */
2232 rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0);
1646 2233
1647 if (t != 0) { 2234 if (t != 0) {
1648 if (!rtlphy->rfpi_enable)
1649 rtl8723_phy_pi_mode_switch(hw, false);
1650 rtl8723_phy_reload_adda_registers(hw, adda_reg, 2235 rtl8723_phy_reload_adda_registers(hw, adda_reg,
1651 rtlphy->adda_backup, 16); 2236 rtlphy->adda_backup, 16);
1652 rtl8723_phy_reload_mac_registers(hw, iqk_mac_reg, 2237 rtl8723_phy_reload_mac_registers(hw, iqk_mac_reg,
@@ -1656,7 +2241,7 @@ static void _rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
1656 IQK_BB_REG_NUM); 2241 IQK_BB_REG_NUM);
1657 2242
1658 rtl_set_bbreg(hw, 0x948, MASKDWORD, path_sel_bb); 2243 rtl_set_bbreg(hw, 0x948, MASKDWORD, path_sel_bb);
1659 rtl_set_rfreg(hw, RF90_PATH_B, 0xb0, 0xfffff, path_sel_rf); 2244 /*rtl_set_rfreg(hw, RF90_PATH_B, 0xb0, 0xfffff, path_sel_rf);*/
1660 2245
1661 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50); 2246 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
1662 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_reg_c50); 2247 rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_reg_c50);
@@ -1670,11 +2255,33 @@ static void _rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
1670 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "8723be IQK Finish!!\n"); 2255 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "8723be IQK Finish!!\n");
1671} 2256}
1672 2257
2258static u8 _get_right_chnl_place_for_iqk(u8 chnl)
2259{
2260 u8 channel_all[TARGET_CHNL_NUM_2G_5G] = {
2261 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
2262 13, 14, 36, 38, 40, 42, 44, 46,
2263 48, 50, 52, 54, 56, 58, 60, 62, 64,
2264 100, 102, 104, 106, 108, 110,
2265 112, 114, 116, 118, 120, 122,
2266 124, 126, 128, 130, 132, 134, 136,
2267 138, 140, 149, 151, 153, 155, 157,
2268 159, 161, 163, 165};
2269 u8 place = chnl;
2270
2271 if (chnl > 14) {
2272 for (place = 14; place < sizeof(channel_all); place++) {
2273 if (channel_all[place] == chnl)
2274 return place - 13;
2275 }
2276 }
2277 return 0;
2278}
2279
1673static void _rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) 2280static void _rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
1674{ 2281{
1675 struct rtl_priv *rtlpriv = rtl_priv(hw);
1676 u8 tmpreg; 2282 u8 tmpreg;
1677 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal; 2283 u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
2284 struct rtl_priv *rtlpriv = rtl_priv(hw);
1678 2285
1679 tmpreg = rtl_read_byte(rtlpriv, 0xd03); 2286 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
1680 2287
@@ -1702,7 +2309,10 @@ static void _rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
1702 rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, RFREG_OFFSET_MASK, 0xdfbe0); 2309 rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, RFREG_OFFSET_MASK, 0xdfbe0);
1703 rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, 0x8c0a); 2310 rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, 0x8c0a);
1704 2311
1705 mdelay(100); 2312 /* In order not to disturb BT music when wifi init.(1ant NIC only) */
2313 /*mdelay(100);*/
2314 /* In order not to disturb BT music when wifi init.(1ant NIC only) */
2315 mdelay(50);
1706 2316
1707 rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, RFREG_OFFSET_MASK, 0xdffe0); 2317 rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, RFREG_OFFSET_MASK, 0xdffe0);
1708 2318
@@ -1716,68 +2326,34 @@ static void _rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
1716 } else { 2326 } else {
1717 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 2327 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1718 } 2328 }
1719 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n"); 2329RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
2330
1720} 2331}
1721 2332
1722static void _rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, 2333static void _rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw,
1723 bool bmain, bool is2t) 2334 bool bmain, bool is2t)
1724{ 2335{
1725 struct rtl_priv *rtlpriv = rtl_priv(hw); 2336 struct rtl_priv *rtlpriv = rtl_priv(hw);
1726 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1727 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1728 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n"); 2337 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
1729 2338
1730 if (is_hal_stop(rtlhal)) { 2339 if (bmain) /* left antenna */
1731 u8 u1btmp; 2340 rtl_set_bbreg(hw, 0x92C, MASKDWORD, 0x1);
1732 u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0); 2341 else
1733 rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7)); 2342 rtl_set_bbreg(hw, 0x92C, MASKDWORD, 0x2);
1734 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
1735 }
1736 if (is2t) {
1737 if (bmain)
1738 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
1739 BIT(5) | BIT(6), 0x1);
1740 else
1741 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
1742 BIT(5) | BIT(6), 0x2);
1743 } else {
1744 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
1745 rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
1746
1747 /* We use the RF definition of MAIN and AUX,
1748 * left antenna and right antenna repectively.
1749 * Default output at AUX.
1750 */
1751 if (bmain) {
1752 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
1753 BIT(14) | BIT(13) | BIT(12), 0);
1754 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
1755 BIT(5) | BIT(4) | BIT(3), 0);
1756 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1757 rtl_set_bbreg(hw, CONFIG_RAM64X16, BIT(31), 0);
1758 } else {
1759 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
1760 BIT(14) | BIT(13) | BIT(12), 1);
1761 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
1762 BIT(5) | BIT(4) | BIT(3), 1);
1763 if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
1764 rtl_set_bbreg(hw, CONFIG_RAM64X16, BIT(31), 1);
1765 }
1766 }
1767} 2343}
1768 2344
1769#undef IQK_ADDA_REG_NUM 2345#undef IQK_ADDA_REG_NUM
1770#undef IQK_DELAY_TIME 2346#undef IQK_DELAY_TIME
1771 2347/* IQK is merge from Merge Temp */
1772void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery) 2348void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
1773{ 2349{
1774 struct rtl_priv *rtlpriv = rtl_priv(hw); 2350 struct rtl_priv *rtlpriv = rtl_priv(hw);
1775 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2351 struct rtl_phy *rtlphy = &rtlpriv->phy;
1776 long result[4][8]; 2352 long result[4][8];
1777 u8 i, final_candidate; 2353 u8 i, final_candidate, idx;
1778 bool patha_ok, pathb_ok; 2354 bool b_patha_ok, b_pathb_ok;
1779 long reg_e94, reg_e9c, reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4, 2355 long reg_e94, reg_e9c, reg_ea4, reg_eac, reg_eb4, reg_ebc, reg_ec4;
1780 reg_ecc, reg_tmp = 0; 2356 long reg_ecc, reg_tmp = 0;
1781 bool is12simular, is13simular, is23simular; 2357 bool is12simular, is13simular, is23simular;
1782 u32 iqk_bb_reg[9] = { 2358 u32 iqk_bb_reg[9] = {
1783 ROFDM0_XARXIQIMBALANCE, 2359 ROFDM0_XARXIQIMBALANCE,
@@ -1790,12 +2366,23 @@ void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1790 ROFDM0_XDTXAFE, 2366 ROFDM0_XDTXAFE,
1791 ROFDM0_RXIQEXTANTA 2367 ROFDM0_RXIQEXTANTA
1792 }; 2368 };
2369 u32 path_sel_bb = 0; /* path_sel_rf = 0 */
1793 2370
1794 if (recovery) { 2371 if (rtlphy->lck_inprogress)
2372 return;
2373
2374 spin_lock(&rtlpriv->locks.iqk_lock);
2375 rtlphy->lck_inprogress = true;
2376 spin_unlock(&rtlpriv->locks.iqk_lock);
2377
2378 if (b_recovery) {
1795 rtl8723_phy_reload_adda_registers(hw, iqk_bb_reg, 2379 rtl8723_phy_reload_adda_registers(hw, iqk_bb_reg,
1796 rtlphy->iqk_bb_backup, 9); 2380 rtlphy->iqk_bb_backup, 9);
1797 return; 2381 return;
1798 } 2382 }
2383 /* Save RF Path */
2384 path_sel_bb = rtl_get_bbreg(hw, 0x948, MASKDWORD);
2385 /* path_sel_rf = rtl_get_rfreg(hw, RF90_PATH_A, 0xb0, 0xfffff); */
1799 2386
1800 for (i = 0; i < 8; i++) { 2387 for (i = 0; i < 8; i++) {
1801 result[0][i] = 0; 2388 result[0][i] = 0;
@@ -1804,30 +2391,33 @@ void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1804 result[3][i] = 0; 2391 result[3][i] = 0;
1805 } 2392 }
1806 final_candidate = 0xff; 2393 final_candidate = 0xff;
1807 patha_ok = false; 2394 b_patha_ok = false;
1808 pathb_ok = false; 2395 b_pathb_ok = false;
1809 is12simular = false; 2396 is12simular = false;
1810 is23simular = false; 2397 is23simular = false;
1811 is13simular = false; 2398 is13simular = false;
1812 for (i = 0; i < 3; i++) { 2399 for (i = 0; i < 3; i++) {
1813 if (get_rf_type(rtlphy) == RF_2T2R) 2400 _rtl8723be_phy_iq_calibrate(hw, result, i, true);
1814 _rtl8723be_phy_iq_calibrate(hw, result, i, true);
1815 else
1816 _rtl8723be_phy_iq_calibrate(hw, result, i, false);
1817 if (i == 1) { 2401 if (i == 1) {
1818 is12simular = phy_similarity_cmp(hw, result, 0, 1); 2402 is12simular = _rtl8723be_phy_simularity_compare(hw,
2403 result,
2404 0, 1);
1819 if (is12simular) { 2405 if (is12simular) {
1820 final_candidate = 0; 2406 final_candidate = 0;
1821 break; 2407 break;
1822 } 2408 }
1823 } 2409 }
1824 if (i == 2) { 2410 if (i == 2) {
1825 is13simular = phy_similarity_cmp(hw, result, 0, 2); 2411 is13simular = _rtl8723be_phy_simularity_compare(hw,
2412 result,
2413 0, 2);
1826 if (is13simular) { 2414 if (is13simular) {
1827 final_candidate = 0; 2415 final_candidate = 0;
1828 break; 2416 break;
1829 } 2417 }
1830 is23simular = phy_similarity_cmp(hw, result, 1, 2); 2418 is23simular = _rtl8723be_phy_simularity_compare(hw,
2419 result,
2420 1, 2);
1831 if (is23simular) { 2421 if (is23simular) {
1832 final_candidate = 1; 2422 final_candidate = 1;
1833 } else { 2423 } else {
@@ -1864,32 +2454,48 @@ void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, bool recovery)
1864 rtlphy->reg_ebc = reg_ebc; 2454 rtlphy->reg_ebc = reg_ebc;
1865 reg_ec4 = result[final_candidate][6]; 2455 reg_ec4 = result[final_candidate][6];
1866 reg_ecc = result[final_candidate][7]; 2456 reg_ecc = result[final_candidate][7];
1867 patha_ok = true; 2457 b_patha_ok = true;
1868 pathb_ok = true; 2458 b_pathb_ok = true;
1869 } else { 2459 } else {
1870 rtlphy->reg_e94 = 0x100; 2460 rtlphy->reg_e94 = 0x100;
1871 rtlphy->reg_eb4 = 0x100; 2461 rtlphy->reg_eb4 = 0x100;
1872 rtlphy->reg_e9c = 0x0; 2462 rtlphy->reg_e9c = 0x0;
1873 rtlphy->reg_ebc = 0x0; 2463 rtlphy->reg_ebc = 0x0;
1874 } 2464 }
1875 if (reg_e94 != 0) /*&&(reg_ea4 != 0) */ 2465 if (reg_e94 != 0)
1876 rtl8723_phy_path_a_fill_iqk_matrix(hw, patha_ok, result, 2466 rtl8723_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
1877 final_candidate, 2467 final_candidate,
1878 (reg_ea4 == 0)); 2468 (reg_ea4 == 0));
1879 if (final_candidate != 0xFF) { 2469 if (reg_eb4 != 0)
2470 _rtl8723be_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result,
2471 final_candidate,
2472 (reg_ec4 == 0));
2473
2474 idx = _get_right_chnl_place_for_iqk(rtlphy->current_channel);
2475
2476 if (final_candidate < 4) {
1880 for (i = 0; i < IQK_MATRIX_REG_NUM; i++) 2477 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
1881 rtlphy->iqk_matrix[0].value[0][i] = 2478 rtlphy->iqk_matrix[idx].value[0][i] =
1882 result[final_candidate][i]; 2479 result[final_candidate][i];
1883 rtlphy->iqk_matrix[0].iqk_done = true; 2480 rtlphy->iqk_matrix[idx].iqk_done = true;
2481
1884 } 2482 }
1885 rtl8723_save_adda_registers(hw, iqk_bb_reg, rtlphy->iqk_bb_backup, 9); 2483 rtl8723_save_adda_registers(hw, iqk_bb_reg,
2484 rtlphy->iqk_bb_backup, 9);
2485
2486 rtl_set_bbreg(hw, 0x948, MASKDWORD, path_sel_bb);
2487 /* rtl_set_rfreg(hw, RF90_PATH_A, 0xb0, 0xfffff, path_sel_rf); */
2488
2489 spin_lock(&rtlpriv->locks.iqk_lock);
2490 rtlphy->lck_inprogress = false;
2491 spin_unlock(&rtlpriv->locks.iqk_lock);
1886} 2492}
1887 2493
1888void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw) 2494void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw)
1889{ 2495{
1890 struct rtl_priv *rtlpriv = rtl_priv(hw); 2496 struct rtl_priv *rtlpriv = rtl_priv(hw);
1891 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2497 struct rtl_phy *rtlphy = &rtlpriv->phy;
1892 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal); 2498 struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
1893 u32 timeout = 2000, timecount = 0; 2499 u32 timeout = 2000, timecount = 0;
1894 2500
1895 while (rtlpriv->mac80211.act_scanning && timecount < timeout) { 2501 while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
@@ -1898,68 +2504,25 @@ void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw)
1898 } 2504 }
1899 2505
1900 rtlphy->lck_inprogress = true; 2506 rtlphy->lck_inprogress = true;
1901 RTPRINT(rtlpriv, FINIT, INIT_EEPROM, 2507 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1902 "LCK:Start!!! currentband %x delay %d ms\n", 2508 "LCK:Start!!! currentband %x delay %d ms\n",
1903 rtlhal->current_bandtype, timecount); 2509 rtlhal->current_bandtype, timecount);
1904 2510
1905 _rtl8723be_phy_lc_calibrate(hw, false); 2511 _rtl8723be_phy_lc_calibrate(hw, false);
1906 2512
1907 rtlphy->lck_inprogress = false; 2513 rtlphy->lck_inprogress = false;
1908} 2514}
1909 2515
1910void rtl23b_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
1911{
1912 struct rtl_priv *rtlpriv = rtl_priv(hw);
1913 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1914
1915 if (rtlphy->apk_done)
1916 return;
1917
1918 return;
1919}
1920
1921void rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain) 2516void rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
1922{ 2517{
1923 _rtl8723be_phy_set_rfpath_switch(hw, bmain, false); 2518 _rtl8723be_phy_set_rfpath_switch(hw, bmain, true);
1924}
1925
1926static void rtl8723be_phy_set_io(struct ieee80211_hw *hw)
1927{
1928 struct rtl_priv *rtlpriv = rtl_priv(hw);
1929 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1930
1931 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1932 "--->Cmd(%#x), set_io_inprogress(%d)\n",
1933 rtlphy->current_io_type, rtlphy->set_io_inprogress);
1934 switch (rtlphy->current_io_type) {
1935 case IO_CMD_RESUME_DM_BY_SCAN:
1936 rtlpriv->dm_digtable.cur_igvalue =
1937 rtlphy->initgain_backup.xaagccore1;
1938 /*rtl92c_dm_write_dig(hw);*/
1939 rtl8723be_phy_set_txpower_level(hw, rtlphy->current_channel);
1940 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x83);
1941 break;
1942 case IO_CMD_PAUSE_DM_BY_SCAN:
1943 rtlphy->initgain_backup.xaagccore1 =
1944 rtlpriv->dm_digtable.cur_igvalue;
1945 rtlpriv->dm_digtable.cur_igvalue = 0x17;
1946 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x40);
1947 break;
1948 default:
1949 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
1950 "switch case not process\n");
1951 break;
1952 }
1953 rtlphy->set_io_inprogress = false;
1954 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1955 "(%#x)\n", rtlphy->current_io_type);
1956} 2519}
1957 2520
1958bool rtl8723be_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype) 2521bool rtl8723be_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1959{ 2522{
1960 struct rtl_priv *rtlpriv = rtl_priv(hw); 2523 struct rtl_priv *rtlpriv = rtl_priv(hw);
1961 struct rtl_phy *rtlphy = &(rtlpriv->phy); 2524 struct rtl_phy *rtlphy = &rtlpriv->phy;
1962 bool postprocessing = false; 2525 bool b_postprocessing = false;
1963 2526
1964 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 2527 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1965 "-->IO Cmd(%#x), set_io_inprogress(%d)\n", 2528 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
@@ -1969,20 +2532,20 @@ bool rtl8723be_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1969 case IO_CMD_RESUME_DM_BY_SCAN: 2532 case IO_CMD_RESUME_DM_BY_SCAN:
1970 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 2533 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1971 "[IO CMD] Resume DM after scan.\n"); 2534 "[IO CMD] Resume DM after scan.\n");
1972 postprocessing = true; 2535 b_postprocessing = true;
1973 break; 2536 break;
1974 case IO_CMD_PAUSE_DM_BY_SCAN: 2537 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
1975 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 2538 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
1976 "[IO CMD] Pause DM before scan.\n"); 2539 "[IO CMD] Pause DM before scan.\n");
1977 postprocessing = true; 2540 b_postprocessing = true;
1978 break; 2541 break;
1979 default: 2542 default:
1980 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2543 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
1981 "switch case not process\n"); 2544 "switch case not process\n");
1982 break; 2545 break;
1983 } 2546 }
1984 } while (false); 2547 } while (false);
1985 if (postprocessing && !rtlphy->set_io_inprogress) { 2548 if (b_postprocessing && !rtlphy->set_io_inprogress) {
1986 rtlphy->set_io_inprogress = true; 2549 rtlphy->set_io_inprogress = true;
1987 rtlphy->current_io_type = iotype; 2550 rtlphy->current_io_type = iotype;
1988 } else { 2551 } else {
@@ -1993,6 +2556,37 @@ bool rtl8723be_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
1993 return true; 2556 return true;
1994} 2557}
1995 2558
2559static void rtl8723be_phy_set_io(struct ieee80211_hw *hw)
2560{
2561 struct rtl_priv *rtlpriv = rtl_priv(hw);
2562 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2563 struct rtl_phy *rtlphy = &rtlpriv->phy;
2564
2565 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2566 "--->Cmd(%#x), set_io_inprogress(%d)\n",
2567 rtlphy->current_io_type, rtlphy->set_io_inprogress);
2568 switch (rtlphy->current_io_type) {
2569 case IO_CMD_RESUME_DM_BY_SCAN:
2570 dm_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2571 /*rtl92c_dm_write_dig(hw);*/
2572 rtl8723be_phy_set_txpower_level(hw, rtlphy->current_channel);
2573 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x83);
2574 break;
2575 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
2576 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
2577 dm_digtable->cur_igvalue = 0x17;
2578 rtl_set_bbreg(hw, RCCK0_CCA, 0xff0000, 0x40);
2579 break;
2580 default:
2581 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2582 "switch case not process\n");
2583 break;
2584 }
2585 rtlphy->set_io_inprogress = false;
2586 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2587 "(%#x)\n", rtlphy->current_io_type);
2588}
2589
1996static void rtl8723be_phy_set_rf_on(struct ieee80211_hw *hw) 2590static void rtl8723be_phy_set_rf_on(struct ieee80211_hw *hw)
1997{ 2591{
1998 struct rtl_priv *rtlpriv = rtl_priv(hw); 2592 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -2028,15 +2622,15 @@ static bool _rtl8723be_phy_set_rf_power_state(struct ieee80211_hw *hw,
2028 switch (rfpwr_state) { 2622 switch (rfpwr_state) {
2029 case ERFON: 2623 case ERFON:
2030 if ((ppsc->rfpwr_state == ERFOFF) && 2624 if ((ppsc->rfpwr_state == ERFOFF) &&
2031 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) { 2625 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
2032 bool rtstatus; 2626 bool rtstatus;
2033 u32 initialize_count = 0; 2627 u32 initializecount = 0;
2034 do { 2628 do {
2035 initialize_count++; 2629 initializecount++;
2036 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 2630 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
2037 "IPS Set eRf nic enable\n"); 2631 "IPS Set eRf nic enable\n");
2038 rtstatus = rtl_ps_enable_nic(hw); 2632 rtstatus = rtl_ps_enable_nic(hw);
2039 } while (!rtstatus && (initialize_count < 10)); 2633 } while (!rtstatus && (initializecount < 10));
2040 RT_CLEAR_PS_LEVEL(ppsc, 2634 RT_CLEAR_PS_LEVEL(ppsc,
2041 RT_RF_OFF_LEVL_HALT_NIC); 2635 RT_RF_OFF_LEVL_HALT_NIC);
2042 } else { 2636 } else {
@@ -2051,28 +2645,33 @@ static bool _rtl8723be_phy_set_rf_power_state(struct ieee80211_hw *hw,
2051 rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK); 2645 rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
2052 else 2646 else
2053 rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK); 2647 rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
2648
2054 break; 2649 break;
2650
2055 case ERFOFF: 2651 case ERFOFF:
2056 for (queue_id = 0, i = 0; 2652 for (queue_id = 0, i = 0;
2057 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 2653 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
2058 ring = &pcipriv->dev.tx_ring[queue_id]; 2654 ring = &pcipriv->dev.tx_ring[queue_id];
2059 if (skb_queue_len(&ring->queue) == 0) { 2655 /* Don't check BEACON Q.
2656 * BEACON Q is always not empty,
2657 * because '_rtl8723be_cmd_send_packet'
2658 */
2659 if (queue_id == BEACON_QUEUE ||
2660 skb_queue_len(&ring->queue) == 0) {
2060 queue_id++; 2661 queue_id++;
2061 continue; 2662 continue;
2062 } else { 2663 } else {
2063 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 2664 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2064 "eRf Off/Sleep: %d times " 2665 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
2065 "TcbBusyQueue[%d] =%d before " 2666 (i + 1), queue_id,
2066 "doze!\n", (i + 1), queue_id, 2667 skb_queue_len(&ring->queue));
2067 skb_queue_len(&ring->queue));
2068 2668
2069 udelay(10); 2669 udelay(10);
2070 i++; 2670 i++;
2071 } 2671 }
2072 if (i >= MAX_DOZE_WAITING_TIMES_9x) { 2672 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
2073 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 2673 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2074 "\n ERFSLEEP: %d times " 2674 "ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
2075 "TcbBusyQueue[%d] = %d !\n",
2076 MAX_DOZE_WAITING_TIMES_9x, 2675 MAX_DOZE_WAITING_TIMES_9x,
2077 queue_id, 2676 queue_id,
2078 skb_queue_len(&ring->queue)); 2677 skb_queue_len(&ring->queue));
@@ -2095,6 +2694,7 @@ static bool _rtl8723be_phy_set_rf_power_state(struct ieee80211_hw *hw,
2095 } 2694 }
2096 } 2695 }
2097 break; 2696 break;
2697
2098 case ERFSLEEP: 2698 case ERFSLEEP:
2099 if (ppsc->rfpwr_state == ERFOFF) 2699 if (ppsc->rfpwr_state == ERFOFF)
2100 break; 2700 break;
@@ -2106,21 +2706,19 @@ static bool _rtl8723be_phy_set_rf_power_state(struct ieee80211_hw *hw,
2106 continue; 2706 continue;
2107 } else { 2707 } else {
2108 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 2708 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2109 "eRf Off/Sleep: %d times " 2709 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
2110 "TcbBusyQueue[%d] =%d before " 2710 (i + 1), queue_id,
2111 "doze!\n", (i + 1), queue_id, 2711 skb_queue_len(&ring->queue));
2112 skb_queue_len(&ring->queue));
2113 2712
2114 udelay(10); 2713 udelay(10);
2115 i++; 2714 i++;
2116 } 2715 }
2117 if (i >= MAX_DOZE_WAITING_TIMES_9x) { 2716 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
2118 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 2717 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2119 "\n ERFSLEEP: %d times " 2718 "ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
2120 "TcbBusyQueue[%d] = %d !\n", 2719 MAX_DOZE_WAITING_TIMES_9x,
2121 MAX_DOZE_WAITING_TIMES_9x, 2720 queue_id,
2122 queue_id, 2721 skb_queue_len(&ring->queue));
2123 skb_queue_len(&ring->queue));
2124 break; 2722 break;
2125 } 2723 }
2126 } 2724 }
@@ -2131,8 +2729,9 @@ static bool _rtl8723be_phy_set_rf_power_state(struct ieee80211_hw *hw,
2131 ppsc->last_sleep_jiffies = jiffies; 2729 ppsc->last_sleep_jiffies = jiffies;
2132 _rtl8723be_phy_set_rf_sleep(hw); 2730 _rtl8723be_phy_set_rf_sleep(hw);
2133 break; 2731 break;
2732
2134 default: 2733 default:
2135 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 2734 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
2136 "switch case not process\n"); 2735 "switch case not process\n");
2137 bresult = false; 2736 bresult = false;
2138 break; 2737 break;
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/phy.h b/drivers/net/wireless/rtlwifi/rtl8723be/phy.h
index 444ef95bb6af..6339738a0e33 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/phy.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/phy.h
@@ -26,22 +26,28 @@
26#ifndef __RTL8723BE_PHY_H__ 26#ifndef __RTL8723BE_PHY_H__
27#define __RTL8723BE_PHY_H__ 27#define __RTL8723BE_PHY_H__
28 28
29/*It must always set to 4, otherwise read efuse table secquence will be wrong.*/ 29/* MAX_TX_COUNT must always set to 4, otherwise read efuse table sequence
30 * will be wrong.
31 */
30#define MAX_TX_COUNT 4 32#define MAX_TX_COUNT 4
31#define TX_1S 0 33#define TX_1S 0
32#define TX_2S 1 34#define TX_2S 1
35#define TX_3S 2
36#define TX_4S 3
33 37
34#define MAX_POWER_INDEX 0x3F 38#define MAX_POWER_INDEX 0x3F
35 39
36#define MAX_PRECMD_CNT 16 40#define MAX_PRECMD_CNT 16
37#define MAX_RFDEPENDCMD_CNT 16 41#define MAX_RFDEPENDCMD_CNT 16
38#define MAX_POSTCMD_CNT 16 42#define MAX_POSTCMD_CNT 16
39 43
40#define MAX_DOZE_WAITING_TIMES_9x 64 44#define MAX_DOZE_WAITING_TIMES_9x 64
41 45
42#define RT_CANNOT_IO(hw) false 46#define RT_CANNOT_IO(hw) false
43#define HIGHPOWER_RADIOA_ARRAYLEN 22 47#define HIGHPOWER_RADIOA_ARRAYLEN 22
44 48
49#define TARGET_CHNL_NUM_2G_5G 59
50
45#define IQK_ADDA_REG_NUM 16 51#define IQK_ADDA_REG_NUM 16
46#define IQK_BB_REG_NUM 9 52#define IQK_BB_REG_NUM 9
47#define MAX_TOLERANCE 5 53#define MAX_TOLERANCE 5
@@ -83,104 +89,19 @@
83 89
84#define RTL92C_MAX_PATH_NUM 2 90#define RTL92C_MAX_PATH_NUM 2
85 91
86enum hw90_block_e {
87 HW90_BLOCK_MAC = 0,
88 HW90_BLOCK_PHY0 = 1,
89 HW90_BLOCK_PHY1 = 2,
90 HW90_BLOCK_RF = 3,
91 HW90_BLOCK_MAXIMUM = 4,
92};
93
94enum baseband_config_type { 92enum baseband_config_type {
95 BASEBAND_CONFIG_PHY_REG = 0, 93 BASEBAND_CONFIG_PHY_REG = 0,
96 BASEBAND_CONFIG_AGC_TAB = 1, 94 BASEBAND_CONFIG_AGC_TAB = 1,
97}; 95};
98 96
99enum ra_offset_area { 97enum ant_div_type {
100 RA_OFFSET_LEGACY_OFDM1, 98 NO_ANTDIV = 0xFF,
101 RA_OFFSET_LEGACY_OFDM2, 99 CG_TRX_HW_ANTDIV = 0x01,
102 RA_OFFSET_HT_OFDM1, 100 CGCS_RX_HW_ANTDIV = 0x02,
103 RA_OFFSET_HT_OFDM2,
104 RA_OFFSET_HT_OFDM3,
105 RA_OFFSET_HT_OFDM4,
106 RA_OFFSET_HT_CCK,
107};
108
109enum antenna_path {
110 ANTENNA_NONE,
111 ANTENNA_D,
112 ANTENNA_C,
113 ANTENNA_CD,
114 ANTENNA_B,
115 ANTENNA_BD,
116 ANTENNA_BC,
117 ANTENNA_BCD,
118 ANTENNA_A,
119 ANTENNA_AD,
120 ANTENNA_AC,
121 ANTENNA_ACD,
122 ANTENNA_AB,
123 ANTENNA_ABD,
124 ANTENNA_ABC,
125 ANTENNA_ABCD
126};
127
128struct r_antenna_select_ofdm {
129 u32 r_tx_antenna:4;
130 u32 r_ant_l:4;
131 u32 r_ant_non_ht:4;
132 u32 r_ant_ht1:4;
133 u32 r_ant_ht2:4;
134 u32 r_ant_ht_s1:4;
135 u32 r_ant_non_ht_s1:4;
136 u32 ofdm_txsc:2;
137 u32 reserved:2;
138};
139
140struct r_antenna_select_cck {
141 u8 r_cckrx_enable_2:2;
142 u8 r_cckrx_enable:2;
143 u8 r_ccktx_enable:4;
144};
145
146
147struct efuse_contents {
148 u8 mac_addr[ETH_ALEN];
149 u8 cck_tx_power_idx[6];
150 u8 ht40_1s_tx_power_idx[6];
151 u8 ht40_2s_tx_power_idx_diff[3];
152 u8 ht20_tx_power_idx_diff[3];
153 u8 ofdm_tx_power_idx_diff[3];
154 u8 ht40_max_power_offset[3];
155 u8 ht20_max_power_offset[3];
156 u8 channel_plan;
157 u8 thermal_meter;
158 u8 rf_option[5];
159 u8 version;
160 u8 oem_id;
161 u8 regulatory;
162};
163
164struct tx_power_struct {
165 u8 cck[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
166 u8 ht40_1s[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
167 u8 ht40_2s[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
168 u8 ht20_diff[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
169 u8 legacy_ht_diff[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
170 u8 legacy_ht_txpowerdiff;
171 u8 groupht20[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
172 u8 groupht40[RTL92C_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
173 u8 pwrgroup_cnt;
174 u32 mcs_original_offset[4][16];
175};
176
177enum _ANT_DIV_TYPE {
178 NO_ANTDIV = 0xFF,
179 CG_TRX_HW_ANTDIV = 0x01,
180 CGCS_RX_HW_ANTDIV = 0x02,
181 FIXED_HW_ANTDIV = 0x03, 101 FIXED_HW_ANTDIV = 0x03,
182 CG_TRX_SMART_ANTDIV = 0x04, 102 CG_TRX_SMART_ANTDIV = 0x04,
183 CGCS_RX_SW_ANTDIV = 0x05, 103 CGCS_RX_SW_ANTDIV = 0x05,
104
184}; 105};
185 106
186u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, 107u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw,
@@ -206,7 +127,6 @@ void rtl8723be_phy_sw_chnl_callback(struct ieee80211_hw *hw);
206u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw); 127u8 rtl8723be_phy_sw_chnl(struct ieee80211_hw *hw);
207void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw, 128void rtl8723be_phy_iq_calibrate(struct ieee80211_hw *hw,
208 bool b_recovery); 129 bool b_recovery);
209void rtl23b_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
210void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw); 130void rtl8723be_phy_lc_calibrate(struct ieee80211_hw *hw);
211void rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain); 131void rtl8723be_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
212bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 132bool rtl8723be_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.c b/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.c
index b5167e73fecf..a1bb1f6116fb 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.c
@@ -23,7 +23,7 @@
23 * 23 *
24 *****************************************************************************/ 24 *****************************************************************************/
25 25
26#include "pwrseqcmd.h" 26#include "../pwrseqcmd.h"
27#include "pwrseq.h" 27#include "pwrseq.h"
28 28
29 29
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.h b/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.h
index a62f43ed8d32..0fee5e0e55c2 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/pwrseq.h
@@ -26,7 +26,9 @@
26#ifndef __RTL8723BE_PWRSEQ_H__ 26#ifndef __RTL8723BE_PWRSEQ_H__
27#define __RTL8723BE_PWRSEQ_H__ 27#define __RTL8723BE_PWRSEQ_H__
28 28
29/* Check document WM-20130425-JackieLau-RTL8723B_Power_Architecture v05.vsd 29#include "../pwrseqcmd.h"
30/**
31 * Check document WM-20130425-JackieLau-RTL8723B_Power_Architecture v05.vsd
30 * There are 6 HW Power States: 32 * There are 6 HW Power States:
31 * 0: POFF--Power Off 33 * 0: POFF--Power Off
32 * 1: PDN--Power Down 34 * 1: PDN--Power Down
@@ -35,7 +37,7 @@
35 * 4: LPS--Low Power State 37 * 4: LPS--Low Power State
36 * 5: SUS--Suspend 38 * 5: SUS--Suspend
37 * 39 *
38 * The transition from different states are defined below 40 * The transision from different states are defined below
39 * TRANS_CARDEMU_TO_ACT 41 * TRANS_CARDEMU_TO_ACT
40 * TRANS_ACT_TO_CARDEMU 42 * TRANS_ACT_TO_CARDEMU
41 * TRANS_CARDEMU_TO_SUS 43 * TRANS_CARDEMU_TO_SUS
@@ -57,203 +59,320 @@
57#define RTL8723B_TRANS_END_STEPS 1 59#define RTL8723B_TRANS_END_STEPS 1
58 60
59#define RTL8723B_TRANS_CARDEMU_TO_ACT \ 61#define RTL8723B_TRANS_CARDEMU_TO_ACT \
62 /* format */ \
63 /* comments here */ \
64 /* {offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value}, */\
65 /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/ \
60 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 66 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
61 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \ 67 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \
62 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 68 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
69 /*0x67[0] = 0 to disable BT_GPS_SEL pins*/ \
63 {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 70 {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
64 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \ 71 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \
65 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \ 72 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \
73 /*Delay 1ms*/ \
66 {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 74 {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
67 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \ 75 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \
68 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS}, \ 76 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS}, \
77 /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/ \
69 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 78 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
70 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \ 79 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \
71 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), 0}, \ 80 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), 0}, \
81 /* disable SW LPS 0x04[10]=0 and WLSUS_EN 0x04[11]=0*/ \
72 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 82 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
73 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT(4)|BIT(3)|BIT(2)), 0}, \ 83 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT(4)|BIT(3)|BIT(2)), 0}, \
84 /* Disable USB suspend */ \
74 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 85 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
75 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0) , 0}, \ 86 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0) , BIT(0)}, \
87 /* wait till 0x04[17] = 1 power ready*/ \
76 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 88 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
77 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1)}, \ 89 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), BIT(1)}, \
90 /* Enable USB suspend */ \
78 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 91 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
79 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0) , BIT(0)}, \ 92 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0) , 0}, \
93 /* release WLON reset 0x04[16]=1*/ \
80 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 94 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
81 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 95 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
96 /* disable HWPDN 0x04[15]=0*/ \
82 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 97 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
83 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, \ 98 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, \
99 /* disable WL suspend*/ \
84 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 100 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
85 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT(4)|BIT(3)), 0}, \ 101 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT(4)|BIT(3)), 0}, \
102 /* polling until return 0*/ \
86 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 103 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
87 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 104 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
88 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 105 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
89 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0}, \ 106 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(0), 0}, \
107 /* Enable WL control XTAL setting*/ \
90 {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 108 {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
91 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6), BIT(6)}, \ 109 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6), BIT(6)}, \
110 /*Enable falling edge triggering interrupt*/ \
92 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 111 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
93 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \ 112 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
113 /*Enable GPIO9 interrupt mode*/ \
94 {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 114 {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
95 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \ 115 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
116 /*Enable GPIO9 input mode*/ \
96 {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 117 {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
97 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \ 118 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \
119 /*Enable HSISR GPIO[C:0] interrupt*/ \
98 {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 120 {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
99 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 121 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
122 /*Enable HSISR GPIO9 interrupt*/ \
100 {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 123 {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
101 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \ 124 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
125 /*For GPIO9 internal pull high setting by test chip*/ \
102 {0x0068, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\ 126 {0x0068, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
103 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3), BIT(3)}, \ 127 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3), BIT(3)}, \
128 /*For GPIO9 internal pull high setting*/ \
104 {0x0069, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 129 {0x0069, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
105 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6), BIT(6)}, 130 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6), BIT(6)},
106 131
107#define RTL8723B_TRANS_ACT_TO_CARDEMU \ 132#define RTL8723B_TRANS_ACT_TO_CARDEMU \
133 /* format */ \
134 /* comments here */ \
135 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
136 /*0x1F[7:0] = 0 turn off RF*/ \
108 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 137 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
109 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, \ 138 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, \
139 /*0x4C[24] = 0x4F[0] = 0, */ \
140 /*switch DPDT_SEL_P output from register 0x65[2] */ \
110 {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 141 {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
111 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \ 142 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \
143 /*Enable rising edge triggering interrupt*/ \
112 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 144 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
113 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \ 145 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \
146 /*0x04[9] = 1 turn off MAC by HW state machine*/ \
114 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 147 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
115 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \ 148 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
149 /*wait till 0x04[9] = 0 polling until return 0 to disable*/ \
116 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 150 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
117 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0}, \ 151 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(1), 0}, \
152 /* Enable BT control XTAL setting*/ \
118 {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 153 {0x0010, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
119 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6), 0}, \ 154 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6), 0}, \
155 /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/ \
120 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 156 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
121 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \ 157 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \
122 PWR_CMD_WRITE, BIT(5), BIT(5)}, \ 158 PWR_CMD_WRITE, BIT(5), BIT(5)}, \
159 /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/ \
123 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 160 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
124 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \ 161 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \
125 PWR_CMD_WRITE, BIT(0), 0}, 162 PWR_CMD_WRITE, BIT(0), 0},
126 163
127#define RTL8723B_TRANS_CARDEMU_TO_SUS \ 164#define RTL8723B_TRANS_CARDEMU_TO_SUS \
165 /* format */ \
166 /* comments here */ \
167 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value },*/\
168 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \
128 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 169 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
129 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4) | BIT(3), (BIT(4) | BIT(3))}, \ 170 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4) | BIT(3), (BIT(4) | BIT(3))}, \
171 /*0x04[12:11] = 2b'01 enable WL suspend*/ \
130 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 172 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
131 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \ 173 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, PWR_BASEADDR_MAC, \
132 PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)}, \ 174 PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)}, \
175 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \
133 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 176 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
134 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \ 177 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \
178 /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/ \
135 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 179 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
136 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20}, \ 180 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20}, \
181 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/ \
137 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 182 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
138 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},\ 183 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},\
184 /*Set SDIO suspend local register*/ \
139 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 185 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
140 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 186 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
187 /*wait power state to suspend*/ \
141 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 188 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
142 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0}, 189 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0},
143 190
144#define RTL8723B_TRANS_SUS_TO_CARDEMU \ 191#define RTL8723B_TRANS_SUS_TO_CARDEMU \
192 /* format */ \
193 /* comments here */ \
194 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
195 /*clear suspend enable and power down enable*/ \
145 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 196 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
146 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(7), 0}, \ 197 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(7), 0}, \
198 /*Set SDIO suspend local register*/ \
147 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 199 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
148 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, \ 200 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, \
201 /*wait power state to suspend*/ \
149 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 202 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
150 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, \ 203 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, \
204 /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \
151 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 205 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
152 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \ 206 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \
207 /*0x04[12:11] = 2b'01enable WL suspend*/ \
153 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 208 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
154 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, 209 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0},
155 210
156#define RTL8723B_TRANS_CARDEMU_TO_CARDDIS \ 211#define RTL8723B_TRANS_CARDEMU_TO_CARDDIS \
212 /* format */ \
213 /* comments here */ \
214 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
215 /*0x07=0x20 , SOP option to disable BG/MB*/ \
157 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 216 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
158 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20}, \ 217 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20}, \
218 /*0x04[12:11] = 2b'01 enable WL suspend*/ \
159 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 219 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
160 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \ 220 PWR_INTF_USB_MSK | PWR_INTF_SDIO_MSK, \
161 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, \ 221 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), BIT(3)}, \
222 /*0x04[10] = 1, enable SW LPS*/ \
162 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 223 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
163 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(2), BIT(2)}, \ 224 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(2), BIT(2)}, \
225 /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/ \
164 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \ 226 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \
165 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 1}, \ 227 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 1}, \
228 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \
166 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 229 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
167 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \ 230 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \
231 /*Set SDIO suspend local register*/ \
168 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 232 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
169 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, \ 233 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), BIT(0)}, \
234 /*wait power state to suspend*/ \
170 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 235 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
171 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0}, 236 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), 0},
172 237
173#define RTL8723B_TRANS_CARDDIS_TO_CARDEMU \ 238#define RTL8723B_TRANS_CARDDIS_TO_CARDEMU \
239 /* format */ \
240 /* comments here */ \
241 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
242 /*clear suspend enable and power down enable*/ \
174 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 243 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
175 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(7), 0}, \ 244 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3) | BIT(7), 0}, \
245 /*Set SDIO suspend local register*/ \
176 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 246 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
177 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, \ 247 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT(0), 0}, \
248 /*wait power state to suspend*/ \
178 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 249 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
179 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, \ 250 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT(1), BIT(1)}, \
251 /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/ \
180 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \ 252 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \
181 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \ 253 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \
254 /*0x04[12:11] = 2b'01enable WL suspend*/ \
182 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 255 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
183 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, \ 256 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(3)|BIT(4), 0}, \
257 /*0x23[4] = 1b'0 12H LDO enter normal mode*/ \
184 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 258 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
185 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \ 259 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \
260 /*PCIe DMA start*/ \
186 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 261 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
187 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, 262 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0},
188 263
189#define RTL8723B_TRANS_CARDEMU_TO_PDN \ 264#define RTL8723B_TRANS_CARDEMU_TO_PDN \
265 /* format */ \
266 /* comments here */ \
267 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
268 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/ \
190 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 269 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
191 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \ 270 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), BIT(4)}, \
271 /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/ \
192 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \ 272 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
193 PWR_INTF_SDIO_MSK | PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, \ 273 PWR_INTF_SDIO_MSK | PWR_INTF_USB_MSK, PWR_BASEADDR_MAC, \
194 PWR_CMD_WRITE, 0xFF, 0x20}, \ 274 PWR_CMD_WRITE, 0xFF, 0x20}, \
275 /* 0x04[16] = 0*/ \
195 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 276 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
196 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \ 277 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \
278 /* 0x04[15] = 1*/ \
197 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 279 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
198 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)}, 280 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), BIT(7)},
199 281
200#define RTL8723B_TRANS_PDN_TO_CARDEMU \ 282#define RTL8723B_TRANS_PDN_TO_CARDEMU \
283 /* format */ \
284 /* comments here */ \
285 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
286 /* 0x04[15] = 0*/ \
201 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 287 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
202 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0}, 288 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(7), 0},
203 289
204#define RTL8723B_TRANS_ACT_TO_LPS \ 290#define RTL8723B_TRANS_ACT_TO_LPS \
291 /* format */ \
292 /* comments here */ \
293 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
294 /*PCIe DMA stop*/ \
205 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 295 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
206 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \ 296 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \
297 /*Tx Pause*/ \
207 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 298 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
208 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \ 299 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \
300 /*Should be zero if no packet is transmitting*/ \
209 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 301 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
210 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 302 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
303 /*Should be zero if no packet is transmitting*/ \
211 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 304 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
212 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 305 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
306 /*Should be zero if no packet is transmitting*/ \
213 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 307 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
214 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 308 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
309 /*Should be zero if no packet is transmitting*/ \
215 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 310 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
216 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \ 311 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0}, \
312 /*CCK and OFDM are disabled,and clock are gated*/ \
217 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 313 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
218 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \ 314 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(0), 0}, \
315 /*Delay 1us*/ \
219 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 316 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
220 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US}, \ 317 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US}, \
318 /*Whole BB is reset*/ \
221 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 319 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
222 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \ 320 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \
321 /*Reset MAC TRX*/ \
223 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 322 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
224 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x03}, \ 323 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x03}, \
324 /*check if removed later*/ \
225 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 325 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
226 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \ 326 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), 0}, \
327 /*When driver enter Sus/ Disable, enable LOP for BT*/ \
227 {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 328 {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
228 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00}, \ 329 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00}, \
330 /*Respond TxOK to scheduler*/ \
229 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 331 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
230 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), BIT(5)}, 332 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(5), BIT(5)},
231 333
232#define RTL8723B_TRANS_LPS_TO_ACT \ 334#define RTL8723B_TRANS_LPS_TO_ACT \
335 /* format */ \
336 /* comments here */ \
337 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
338 /*SDIO RPWM*/ \
233 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \ 339 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK, \
234 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84}, \ 340 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84}, \
341 /*USB RPWM*/ \
235 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \ 342 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK, \
236 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, \ 343 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, \
344 /*PCIe RPWM*/ \
237 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \ 345 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK, \
238 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, \ 346 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84}, \
347 /*Delay*/ \
239 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 348 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
240 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, \ 349 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS}, \
350 /*. 0x08[4] = 0 switch TSF to 40M*/ \
241 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 351 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
242 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \ 352 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(4), 0}, \
353 /*Polling 0x109[7]=0 TSF in 40M*/ \
243 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 354 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
244 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(7), 0}, \ 355 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT(7), 0}, \
356 /*. 0x29[7:6] = 2b'00 enable BB clock*/ \
245 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 357 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
246 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6)|BIT(7), 0}, \ 358 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(6)|BIT(7), 0}, \
359 /*. 0x101[1] = 1*/ \
247 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 360 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
248 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \ 361 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1), BIT(1)}, \
362 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/ \
249 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 363 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
250 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \ 364 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF}, \
365 /*. 0x02[1:0] = 2b'11 enable BB macro*/ \
251 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 366 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
252 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1) | BIT(0), BIT(1) | BIT(0)}, \ 367 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT(1) | BIT(0), BIT(1) | BIT(0)}, \
368 /*. 0x522 = 0*/ \
253 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \ 369 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
254 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0}, 370 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0},
255 371
256#define RTL8723B_TRANS_END \ 372#define RTL8723B_TRANS_END \
373 /* format */ \
374 /* comments here */ \
375 /* { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value }, */\
257 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, 0, \ 376 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, 0, \
258 PWR_CMD_END, 0, 0}, 377 PWR_CMD_END, 0, 0},
259 378
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.c b/drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.c
deleted file mode 100644
index 4573310c707f..000000000000
--- a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.c
+++ /dev/null
@@ -1,139 +0,0 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "pwrseq.h"
27
28/* Description:
29 * This routine deal with the Power Configuration CMDs
30 * parsing for RTL8723/RTL8188E Series IC.
31 * Assumption:
32 * We should follow specific format which was released from HW SD.
33 *
34 * 2011.07.07, added by Roger.
35 */
36bool rtlbe_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
37 u8 fab_version, u8 interface_type,
38 struct wlan_pwr_cfg pwrcfgcmd[])
39
40{
41 struct wlan_pwr_cfg pwr_cfg_cmd = {0};
42 bool b_polling_bit = false;
43 u32 ary_idx = 0;
44 u8 value = 0;
45 u32 offset = 0;
46 u32 polling_count = 0;
47 u32 max_polling_cnt = 5000;
48
49 do {
50 pwr_cfg_cmd = pwrcfgcmd[ary_idx];
51 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
52 "rtlbe_hal_pwrseqcmdparsing(): "
53 "offset(%#x),cut_msk(%#x), fab_msk(%#x),"
54 "interface_msk(%#x), base(%#x), "
55 "cmd(%#x), msk(%#x), value(%#x)\n",
56 GET_PWR_CFG_OFFSET(pwr_cfg_cmd),
57 GET_PWR_CFG_CUT_MASK(pwr_cfg_cmd),
58 GET_PWR_CFG_FAB_MASK(pwr_cfg_cmd),
59 GET_PWR_CFG_INTF_MASK(pwr_cfg_cmd),
60 GET_PWR_CFG_BASE(pwr_cfg_cmd),
61 GET_PWR_CFG_CMD(pwr_cfg_cmd),
62 GET_PWR_CFG_MASK(pwr_cfg_cmd),
63 GET_PWR_CFG_VALUE(pwr_cfg_cmd));
64
65 if ((GET_PWR_CFG_FAB_MASK(pwr_cfg_cmd)&fab_version) &&
66 (GET_PWR_CFG_CUT_MASK(pwr_cfg_cmd)&cut_version) &&
67 (GET_PWR_CFG_INTF_MASK(pwr_cfg_cmd)&interface_type)) {
68 switch (GET_PWR_CFG_CMD(pwr_cfg_cmd)) {
69 case PWR_CMD_READ:
70 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
71 "rtlbe_hal_pwrseqcmdparsing(): "
72 "PWR_CMD_READ\n");
73 break;
74 case PWR_CMD_WRITE:
75 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
76 "rtlbe_hal_pwrseqcmdparsing(): "
77 "PWR_CMD_WRITE\n");
78 offset = GET_PWR_CFG_OFFSET(pwr_cfg_cmd);
79
80 /*Read the value from system register*/
81 value = rtl_read_byte(rtlpriv, offset);
82 value &= (~(GET_PWR_CFG_MASK(pwr_cfg_cmd)));
83 value = value | (GET_PWR_CFG_VALUE(pwr_cfg_cmd)
84 & GET_PWR_CFG_MASK(pwr_cfg_cmd));
85
86 /*Write the value back to sytem register*/
87 rtl_write_byte(rtlpriv, offset, value);
88 break;
89 case PWR_CMD_POLLING:
90 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
91 "rtlbe_hal_pwrseqcmdparsing(): "
92 "PWR_CMD_POLLING\n");
93 b_polling_bit = false;
94 offset = GET_PWR_CFG_OFFSET(pwr_cfg_cmd);
95
96 do {
97 value = rtl_read_byte(rtlpriv, offset);
98
99 value &= GET_PWR_CFG_MASK(pwr_cfg_cmd);
100 if (value ==
101 (GET_PWR_CFG_VALUE(pwr_cfg_cmd) &
102 GET_PWR_CFG_MASK(pwr_cfg_cmd)))
103 b_polling_bit = true;
104 else
105 udelay(10);
106
107 if (polling_count++ > max_polling_cnt)
108 return false;
109
110 } while (!b_polling_bit);
111 break;
112 case PWR_CMD_DELAY:
113 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
114 "rtlbe_hal_pwrseqcmdparsing(): "
115 "PWR_CMD_DELAY\n");
116 if (GET_PWR_CFG_VALUE(pwr_cfg_cmd) ==
117 PWRSEQ_DELAY_US)
118 udelay(GET_PWR_CFG_OFFSET(pwr_cfg_cmd));
119 else
120 mdelay(GET_PWR_CFG_OFFSET(pwr_cfg_cmd));
121 break;
122 case PWR_CMD_END:
123 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
124 "rtlbe_hal_pwrseqcmdparsing(): "
125 "PWR_CMD_END\n");
126 return true;
127 default:
128 RT_ASSERT(false,
129 "rtlbe_hal_pwrseqcmdparsing(): "
130 "Unknown CMD!!\n");
131 break;
132 }
133 }
134
135 ary_idx++;
136 } while (1);
137
138 return true;
139}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.h b/drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.h
deleted file mode 100644
index ce14a3b5cb71..000000000000
--- a/drivers/net/wireless/rtlwifi/rtl8723be/pwrseqcmd.h
+++ /dev/null
@@ -1,95 +0,0 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2014 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8723BE_PWRSEQCMD_H__
27#define __RTL8723BE_PWRSEQCMD_H__
28
29#include "../wifi.h"
30/*---------------------------------------------*/
31/*The value of cmd: 4 bits */
32/*---------------------------------------------*/
33#define PWR_CMD_READ 0x00
34#define PWR_CMD_WRITE 0x01
35#define PWR_CMD_POLLING 0x02
36#define PWR_CMD_DELAY 0x03
37#define PWR_CMD_END 0x04
38
39/* define the base address of each block */
40#define PWR_BASEADDR_MAC 0x00
41#define PWR_BASEADDR_USB 0x01
42#define PWR_BASEADDR_PCIE 0x02
43#define PWR_BASEADDR_SDIO 0x03
44
45#define PWR_INTF_SDIO_MSK BIT(0)
46#define PWR_INTF_USB_MSK BIT(1)
47#define PWR_INTF_PCI_MSK BIT(2)
48#define PWR_INTF_ALL_MSK (BIT(0) | BIT(1) | BIT(2) | BIT(3))
49
50#define PWR_FAB_TSMC_MSK BIT(0)
51#define PWR_FAB_UMC_MSK BIT(1)
52#define PWR_FAB_ALL_MSK (BIT(0) | BIT(1) | BIT(2) | BIT(3))
53
54#define PWR_CUT_TESTCHIP_MSK BIT(0)
55#define PWR_CUT_A_MSK BIT(1)
56#define PWR_CUT_B_MSK BIT(2)
57#define PWR_CUT_C_MSK BIT(3)
58#define PWR_CUT_D_MSK BIT(4)
59#define PWR_CUT_E_MSK BIT(5)
60#define PWR_CUT_F_MSK BIT(6)
61#define PWR_CUT_G_MSK BIT(7)
62#define PWR_CUT_ALL_MSK 0xFF
63
64
65enum pwrseq_delay_unit {
66 PWRSEQ_DELAY_US,
67 PWRSEQ_DELAY_MS,
68};
69
70struct wlan_pwr_cfg {
71 u16 offset;
72 u8 cut_msk;
73 u8 fab_msk:4;
74 u8 interface_msk:4;
75 u8 base:4;
76 u8 cmd:4;
77 u8 msk;
78 u8 value;
79
80};
81
82#define GET_PWR_CFG_OFFSET(__PWR_CMD) __PWR_CMD.offset
83#define GET_PWR_CFG_CUT_MASK(__PWR_CMD) __PWR_CMD.cut_msk
84#define GET_PWR_CFG_FAB_MASK(__PWR_CMD) __PWR_CMD.fab_msk
85#define GET_PWR_CFG_INTF_MASK(__PWR_CMD) __PWR_CMD.interface_msk
86#define GET_PWR_CFG_BASE(__PWR_CMD) __PWR_CMD.base
87#define GET_PWR_CFG_CMD(__PWR_CMD) __PWR_CMD.cmd
88#define GET_PWR_CFG_MASK(__PWR_CMD) __PWR_CMD.msk
89#define GET_PWR_CFG_VALUE(__PWR_CMD) __PWR_CMD.value
90
91bool rtlbe_hal_pwrseqcmdparsing(struct rtl_priv *rtlpriv, u8 cut_version,
92 u8 fab_version, u8 interface_type,
93 struct wlan_pwr_cfg pwrcfgcmd[]);
94
95#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/reg.h b/drivers/net/wireless/rtlwifi/rtl8723be/reg.h
index 3006849ed439..03581d2a5da0 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/reg.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/reg.h
@@ -78,11 +78,11 @@
78#define REG_WOL_EVENT 0x0081 78#define REG_WOL_EVENT 0x0081
79#define REG_MCUTSTCFG 0x0084 79#define REG_MCUTSTCFG 0x0084
80 80
81
82#define REG_HIMR 0x00B0 81#define REG_HIMR 0x00B0
83#define REG_HISR 0x00B4 82#define REG_HISR 0x00B4
84#define REG_HIMRE 0x00B8 83#define REG_HIMRE 0x00B8
85#define REG_HISRE 0x00BC 84#define REG_HISRE 0x00BC
85#define REG_PMC_DBG_CTRL2 0x00CC
86 86
87#define REG_EFUSE_ACCESS 0x00CF 87#define REG_EFUSE_ACCESS 0x00CF
88 88
@@ -95,7 +95,8 @@
95#define REG_HPON_FSM 0x00EC 95#define REG_HPON_FSM 0x00EC
96#define REG_SYS_CFG 0x00F0 96#define REG_SYS_CFG 0x00F0
97#define REG_GPIO_OUTSTS 0x00F4 97#define REG_GPIO_OUTSTS 0x00F4
98#define REG_SYS_CFG1 0x00F0 98#define REG_MAC_PHY_CTRL_NORMAL 0x00F8
99#define REG_SYS_CFG1 0x00FC
99#define REG_ROM_VERSION 0x00FD 100#define REG_ROM_VERSION 0x00FD
100 101
101#define REG_CR 0x0100 102#define REG_CR 0x0100
@@ -170,8 +171,14 @@
170#define REG_BKQ_DESA 0x0338 171#define REG_BKQ_DESA 0x0338
171#define REG_RX_DESA 0x0340 172#define REG_RX_DESA 0x0340
172 173
173#define REG_DBI 0x0348 174#define REG_DBI_WDATA 0x0348
174#define REG_MDIO 0x0354 175#define REG_DBI_RDATA 0x034C
176#define REG_DBI_CTRL 0x0350
177#define REG_DBI_ADDR 0x0350
178#define REG_DBI_FLAG 0x0352
179#define REG_MDIO_WDATA 0x0354
180#define REG_MDIO_RDATA 0x0356
181#define REG_MDIO_CTL 0x0358
175#define REG_DBG_SEL 0x0360 182#define REG_DBG_SEL 0x0360
176#define REG_PCIE_HRPWM 0x0361 183#define REG_PCIE_HRPWM 0x0361
177#define REG_PCIE_HCPWM 0x0363 184#define REG_PCIE_HCPWM 0x0363
@@ -180,7 +187,6 @@
180#define REG_UART_TX_DESA 0x0370 187#define REG_UART_TX_DESA 0x0370
181#define REG_UART_RX_DESA 0x0378 188#define REG_UART_RX_DESA 0x0378
182 189
183
184#define REG_HDAQ_DESA_NODEF 0x0000 190#define REG_HDAQ_DESA_NODEF 0x0000
185#define REG_CMDQ_DESA_NODEF 0x0000 191#define REG_CMDQ_DESA_NODEF 0x0000
186 192
@@ -193,7 +199,6 @@
193#define REG_BCNQ_INFORMATION 0x0418 199#define REG_BCNQ_INFORMATION 0x0418
194#define REG_TXPKT_EMPTY 0x041A 200#define REG_TXPKT_EMPTY 0x041A
195 201
196
197#define REG_CPU_MGQ_INFORMATION 0x041C 202#define REG_CPU_MGQ_INFORMATION 0x041C
198#define REG_FWHW_TXQ_CTRL 0x0420 203#define REG_FWHW_TXQ_CTRL 0x0420
199#define REG_HWSEQ_CTRL 0x0423 204#define REG_HWSEQ_CTRL 0x0423
@@ -207,9 +212,7 @@
207#define REG_RARFRC 0x0438 212#define REG_RARFRC 0x0438
208#define REG_RRSR 0x0440 213#define REG_RRSR 0x0440
209#define REG_ARFR0 0x0444 214#define REG_ARFR0 0x0444
210#define REG_ARFR1 0x0448 215#define REG_ARFR1 0x044C
211#define REG_ARFR2 0x044C
212#define REG_ARFR3 0x0450
213#define REG_AMPDU_MAX_TIME 0x0456 216#define REG_AMPDU_MAX_TIME 0x0456
214#define REG_AGGLEN_LMT 0x0458 217#define REG_AGGLEN_LMT 0x0458
215#define REG_AMPDU_MIN_SPACE 0x045C 218#define REG_AMPDU_MIN_SPACE 0x045C
@@ -223,7 +226,10 @@
223#define REG_POWER_STAGE2 0x04B8 226#define REG_POWER_STAGE2 0x04B8
224#define REG_PKT_LIFE_TIME 0x04C0 227#define REG_PKT_LIFE_TIME 0x04C0
225#define REG_STBC_SETTING 0x04C4 228#define REG_STBC_SETTING 0x04C4
229#define REG_HT_SINGLE_AMPDU 0x04C7
230
226#define REG_PROT_MODE_CTRL 0x04C8 231#define REG_PROT_MODE_CTRL 0x04C8
232#define REG_MAX_AGGR_NUM 0x04CA
227#define REG_BAR_MODE_CTRL 0x04CC 233#define REG_BAR_MODE_CTRL 0x04CC
228#define REG_RA_TRY_RATE_AGG_LMT 0x04CF 234#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
229#define REG_EARLY_MODE_CONTROL 0x04D0 235#define REG_EARLY_MODE_CONTROL 0x04D0
@@ -303,6 +309,7 @@
303#define REG_EIFS 0x0642 309#define REG_EIFS 0x0642
304 310
305#define REG_NAV_CTRL 0x0650 311#define REG_NAV_CTRL 0x0650
312#define REG_NAV_UPPER 0x0652
306#define REG_BACAMCMD 0x0654 313#define REG_BACAMCMD 0x0654
307#define REG_BACAMCONTENT 0x0658 314#define REG_BACAMCONTENT 0x0658
308#define REG_LBDLY 0x0660 315#define REG_LBDLY 0x0660
@@ -355,43 +362,43 @@
355#define REG_NORMAL_SIE_MAC_ADDR 0xFE70 362#define REG_NORMAL_SIE_MAC_ADDR 0xFE70
356#define REG_NORMAL_SIE_STRING 0xFE80 363#define REG_NORMAL_SIE_STRING 0xFE80
357 364
358#define CR9346 REG_9346CR 365#define CR9346 REG_9346CR
359#define MSR (REG_CR + 2) 366#define MSR (REG_CR + 2)
360#define ISR REG_HISR 367#define ISR REG_HISR
361#define TSFR REG_TSFTR 368#define TSFR REG_TSFTR
362 369
363#define MACIDR0 REG_MACID 370#define MACIDR0 REG_MACID
364#define MACIDR4 (REG_MACID + 4) 371#define MACIDR4 (REG_MACID + 4)
365 372
366#define PBP REG_PBP 373#define PBP REG_PBP
367 374
368#define IDR0 MACIDR0 375#define IDR0 MACIDR0
369#define IDR4 MACIDR4 376#define IDR4 MACIDR4
370 377
371#define UNUSED_REGISTER 0x1BF 378#define UNUSED_REGISTER 0x1BF
372#define DCAM UNUSED_REGISTER 379#define DCAM UNUSED_REGISTER
373#define PSR UNUSED_REGISTER 380#define PSR UNUSED_REGISTER
374#define BBADDR UNUSED_REGISTER 381#define BBADDR UNUSED_REGISTER
375#define PHYDATAR UNUSED_REGISTER 382#define PHYDATAR UNUSED_REGISTER
376 383
377#define INVALID_BBRF_VALUE 0x12345678 384#define INVALID_BBRF_VALUE 0x12345678
378 385
379#define MAX_MSS_DENSITY_2T 0x13 386#define MAX_MSS_DENSITY_2T 0x13
380#define MAX_MSS_DENSITY_1T 0x0A 387#define MAX_MSS_DENSITY_1T 0x0A
381 388
382#define CMDEEPROM_EN BIT(5) 389#define CMDEEPROM_EN BIT(5)
383#define CMDEEPROM_SEL BIT(4) 390#define CMDEEPROM_SEL BIT(4)
384#define CMD9346CR_9356SEL BIT(4) 391#define CMD9346CR_9356SEL BIT(4)
385#define AUTOLOAD_EEPROM (CMDEEPROM_EN | CMDEEPROM_SEL) 392#define AUTOLOAD_EEPROM (CMDEEPROM_EN | CMDEEPROM_SEL)
386#define AUTOLOAD_EFUSE CMDEEPROM_EN 393#define AUTOLOAD_EFUSE CMDEEPROM_EN
387 394
388#define GPIOSEL_GPIO 0 395#define GPIOSEL_GPIO 0
389#define GPIOSEL_ENBT BIT(5) 396#define GPIOSEL_ENBT BIT(5)
390 397
391#define GPIO_IN REG_GPIO_PIN_CTRL 398#define GPIO_IN REG_GPIO_PIN_CTRL
392#define GPIO_OUT (REG_GPIO_PIN_CTRL + 1) 399#define GPIO_OUT (REG_GPIO_PIN_CTRL + 1)
393#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL + 2) 400#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL + 2)
394#define GPIO_MOD (REG_GPIO_PIN_CTRL + 3) 401#define GPIO_MOD (REG_GPIO_PIN_CTRL + 3)
395 402
396/* 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) */ 403/* 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) */
397#define HSIMR_GPIO12_0_INT_EN BIT(0) 404#define HSIMR_GPIO12_0_INT_EN BIT(0)
@@ -400,8 +407,7 @@
400#define HSIMR_PDN_INT_EN BIT(7) 407#define HSIMR_PDN_INT_EN BIT(7)
401#define HSIMR_GPIO9_INT_EN BIT(25) 408#define HSIMR_GPIO9_INT_EN BIT(25)
402 409
403/* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */ 410/* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */
404
405#define HSISR_GPIO12_0_INT BIT(0) 411#define HSISR_GPIO12_0_INT BIT(0)
406#define HSISR_SPS_OCP_INT BIT(5) 412#define HSISR_SPS_OCP_INT BIT(5)
407#define HSISR_RON_INT_EN BIT(6) 413#define HSISR_RON_INT_EN BIT(6)
@@ -412,7 +418,6 @@
412#define MSR_ADHOC 0x01 418#define MSR_ADHOC 0x01
413#define MSR_INFRA 0x02 419#define MSR_INFRA 0x02
414#define MSR_AP 0x03 420#define MSR_AP 0x03
415#define MSR_MASK 0x03
416 421
417#define RRSR_RSC_OFFSET 21 422#define RRSR_RSC_OFFSET 21
418#define RRSR_SHORT_OFFSET 23 423#define RRSR_SHORT_OFFSET 23
@@ -542,7 +547,8 @@
542 547
543/********************************************* 548/*********************************************
544* 8723BE IMR/ISR bits 549* 8723BE IMR/ISR bits
545**********************************************/ 550*********************************************
551*/
546#define IMR_DISABLED 0x0 552#define IMR_DISABLED 0x0
547/* IMR DW0(0x0060-0063) Bit 0-31 */ 553/* IMR DW0(0x0060-0063) Bit 0-31 */
548#define IMR_TXCCK BIT(30) /* TXRPT interrupt when 554#define IMR_TXCCK BIT(30) /* TXRPT interrupt when
@@ -644,7 +650,7 @@
644#define RF_OPTION1 0x79 650#define RF_OPTION1 0x79
645#define RF_OPTION2 0x7A 651#define RF_OPTION2 0x7A
646#define RF_OPTION3 0x7B 652#define RF_OPTION3 0x7B
647#define RF_OPTION4 0xC3 653#define EEPROM_RF_BT_SETTING_8723B 0xC3
648 654
649#define EEPROM_DEFAULT_PID 0x1234 655#define EEPROM_DEFAULT_PID 0x1234
650#define EEPROM_DEFAULT_VID 0x5678 656#define EEPROM_DEFAULT_VID 0x5678
@@ -678,14 +684,11 @@
678#define EEPROM_CLK 0x06 684#define EEPROM_CLK 0x06
679#define EEPROM_TESTR 0x08 685#define EEPROM_TESTR 0x08
680 686
681
682#define EEPROM_TXPOWERCCK 0x10 687#define EEPROM_TXPOWERCCK 0x10
683#define EEPROM_TXPOWERHT40_1S 0x16 688#define EEPROM_TXPOWERHT40_1S 0x16
684#define EEPROM_TXPOWERHT20DIFF 0x1B 689#define EEPROM_TXPOWERHT20DIFF 0x1B
685#define EEPROM_TXPOWER_OFDMDIFF 0x1B 690#define EEPROM_TXPOWER_OFDMDIFF 0x1B
686 691
687
688
689#define EEPROM_TX_PWR_INX 0x10 692#define EEPROM_TX_PWR_INX 0x10
690 693
691#define EEPROM_CHANNELPLAN 0xB8 694#define EEPROM_CHANNELPLAN 0xB8
@@ -1198,7 +1201,7 @@
1198#define APP_MIC BIT(30) 1201#define APP_MIC BIT(30)
1199#define APP_FCS BIT(31) 1202#define APP_FCS BIT(31)
1200 1203
1201#define _MIN_SPACE(x) ((x) & 0x7) 1204#define _MIN_SPACE(x) ((x) & 0x7)
1202#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3) 1205#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
1203 1206
1204#define RXERR_TYPE_OFDM_PPDU 0 1207#define RXERR_TYPE_OFDM_PPDU 0
@@ -1216,105 +1219,105 @@
1216#define RXERR_TYPE_HT_MPDU_FAIL 12 1219#define RXERR_TYPE_HT_MPDU_FAIL 12
1217#define RXERR_TYPE_RX_FULL_DROP 15 1220#define RXERR_TYPE_RX_FULL_DROP 15
1218 1221
1219#define RXERR_COUNTER_MASK 0xFFFFF 1222#define RXERR_COUNTER_MASK 0xFFFFF
1220#define RXERR_RPT_RST BIT(27) 1223#define RXERR_RPT_RST BIT(27)
1221#define _RXERR_RPT_SEL(type) ((type) << 28) 1224#define _RXERR_RPT_SEL(type) ((type) << 28)
1222
1223#define SCR_TXUSEDK BIT(0)
1224#define SCR_RXUSEDK BIT(1)
1225#define SCR_TXENCENABLE BIT(2)
1226#define SCR_RXDECENABLE BIT(3)
1227#define SCR_SKBYA2 BIT(4)
1228#define SCR_NOSKMC BIT(5)
1229#define SCR_TXBCUSEDK BIT(6)
1230#define SCR_RXBCUSEDK BIT(7)
1231
1232#define XCLK_VLD BIT(0)
1233#define ACLK_VLD BIT(1)
1234#define UCLK_VLD BIT(2)
1235#define PCLK_VLD BIT(3)
1236#define PCIRSTB BIT(4)
1237#define V15_VLD BIT(5)
1238#define TRP_B15V_EN BIT(7)
1239#define SIC_IDLE BIT(8)
1240#define BD_MAC2 BIT(9)
1241#define BD_MAC1 BIT(10)
1242#define IC_MACPHY_MODE BIT(11)
1243#define BT_FUNC BIT(16)
1244#define VENDOR_ID BIT(19)
1245#define PAD_HWPD_IDN BIT(22)
1246#define TRP_VAUX_EN BIT(23)
1247#define TRP_BT_EN BIT(24)
1248#define BD_PKG_SEL BIT(25)
1249#define BD_HCI_SEL BIT(26)
1250#define TYPE_ID BIT(27)
1251
1252#define USB_IS_HIGH_SPEED 0
1253#define USB_IS_FULL_SPEED 1
1254#define USB_SPEED_MASK BIT(5)
1255
1256#define USB_NORMAL_SIE_EP_MASK 0xF
1257#define USB_NORMAL_SIE_EP_SHIFT 4
1258
1259#define USB_TEST_EP_MASK 0x30
1260#define USB_TEST_EP_SHIFT 4
1261
1262#define USB_AGG_EN BIT(3)
1263
1264#define MAC_ADDR_LEN 6
1265#define LAST_ENTRY_OF_TX_PKT_BUFFER 175/*255 88e*/
1266
1267#define POLLING_LLT_THRESHOLD 20
1268#define POLLING_READY_TIMEOUT_COUNT 3000
1269 1225
1270#define MAX_MSS_DENSITY_2T 0x13 1226#define SCR_TXUSEDK BIT(0)
1271#define MAX_MSS_DENSITY_1T 0x0A 1227#define SCR_RXUSEDK BIT(1)
1228#define SCR_TXENCENABLE BIT(2)
1229#define SCR_RXDECENABLE BIT(3)
1230#define SCR_SKBYA2 BIT(4)
1231#define SCR_NOSKMC BIT(5)
1232#define SCR_TXBCUSEDK BIT(6)
1233#define SCR_RXBCUSEDK BIT(7)
1234
1235#define XCLK_VLD BIT(0)
1236#define ACLK_VLD BIT(1)
1237#define UCLK_VLD BIT(2)
1238#define PCLK_VLD BIT(3)
1239#define PCIRSTB BIT(4)
1240#define V15_VLD BIT(5)
1241#define TRP_B15V_EN BIT(7)
1242#define SIC_IDLE BIT(8)
1243#define BD_MAC2 BIT(9)
1244#define BD_MAC1 BIT(10)
1245#define IC_MACPHY_MODE BIT(11)
1246#define BT_FUNC BIT(16)
1247#define VENDOR_ID BIT(19)
1248#define PAD_HWPD_IDN BIT(22)
1249#define TRP_VAUX_EN BIT(23)
1250#define TRP_BT_EN BIT(24)
1251#define BD_PKG_SEL BIT(25)
1252#define BD_HCI_SEL BIT(26)
1253#define TYPE_ID BIT(27)
1254
1255#define USB_IS_HIGH_SPEED 0
1256#define USB_IS_FULL_SPEED 1
1257#define USB_SPEED_MASK BIT(5)
1258
1259#define USB_NORMAL_SIE_EP_MASK 0xF
1260#define USB_NORMAL_SIE_EP_SHIFT 4
1261
1262#define USB_TEST_EP_MASK 0x30
1263#define USB_TEST_EP_SHIFT 4
1264
1265#define USB_AGG_EN BIT(3)
1266
1267#define MAC_ADDR_LEN 6
1268#define LAST_ENTRY_OF_TX_PKT_BUFFER 175/*255 88e*/
1269
1270#define POLLING_LLT_THRESHOLD 20
1271#define POLLING_READY_TIMEOUT_COUNT 3000
1272
1273#define MAX_MSS_DENSITY_2T 0x13
1274#define MAX_MSS_DENSITY_1T 0x0A
1272 1275
1273#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6)) 1276#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6))
1274#define EPROM_CMD_CONFIG 0x3 1277#define EPROM_CMD_CONFIG 0x3
1275#define EPROM_CMD_LOAD 1 1278#define EPROM_CMD_LOAD 1
1276 1279
1277#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE 1280#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE
1278 1281
1279#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2) 1282#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2)
1280 1283
1281#define RPMAC_RESET 0x100 1284#define RPMAC_RESET 0x100
1282#define RPMAC_TXSTART 0x104 1285#define RPMAC_TXSTART 0x104
1283#define RPMAC_TXLEGACYSIG 0x108 1286#define RPMAC_TXLEGACYSIG 0x108
1284#define RPMAC_TXHTSIG1 0x10c 1287#define RPMAC_TXHTSIG1 0x10c
1285#define RPMAC_TXHTSIG2 0x110 1288#define RPMAC_TXHTSIG2 0x110
1286#define RPMAC_PHYDEBUG 0x114 1289#define RPMAC_PHYDEBUG 0x114
1287#define RPMAC_TXPACKETNUM 0x118 1290#define RPMAC_TXPACKETNUM 0x118
1288#define RPMAC_TXIDLE 0x11c 1291#define RPMAC_TXIDLE 0x11c
1289#define RPMAC_TXMACHEADER0 0x120 1292#define RPMAC_TXMACHEADER0 0x120
1290#define RPMAC_TXMACHEADER1 0x124 1293#define RPMAC_TXMACHEADER1 0x124
1291#define RPMAC_TXMACHEADER2 0x128 1294#define RPMAC_TXMACHEADER2 0x128
1292#define RPMAC_TXMACHEADER3 0x12c 1295#define RPMAC_TXMACHEADER3 0x12c
1293#define RPMAC_TXMACHEADER4 0x130 1296#define RPMAC_TXMACHEADER4 0x130
1294#define RPMAC_TXMACHEADER5 0x134 1297#define RPMAC_TXMACHEADER5 0x134
1295#define RPMAC_TXDADATYPE 0x138 1298#define RPMAC_TXDADATYPE 0x138
1296#define RPMAC_TXRANDOMSEED 0x13c 1299#define RPMAC_TXRANDOMSEED 0x13c
1297#define RPMAC_CCKPLCPPREAMBLE 0x140 1300#define RPMAC_CCKPLCPPREAMBLE 0x140
1298#define RPMAC_CCKPLCPHEADER 0x144 1301#define RPMAC_CCKPLCPHEADER 0x144
1299#define RPMAC_CCKCRC16 0x148 1302#define RPMAC_CCKCRC16 0x148
1300#define RPMAC_OFDMRXCRC32OK 0x170 1303#define RPMAC_OFDMRXCRC32OK 0x170
1301#define RPMAC_OFDMRXCRC32ER 0x174 1304#define RPMAC_OFDMRXCRC32ER 0x174
1302#define RPMAC_OFDMRXPARITYER 0x178 1305#define RPMAC_OFDMRXPARITYER 0x178
1303#define RPMAC_OFDMRXCRC8ER 0x17c 1306#define RPMAC_OFDMRXCRC8ER 0x17c
1304#define RPMAC_CCKCRXRC16ER 0x180 1307#define RPMAC_CCKCRXRC16ER 0x180
1305#define RPMAC_CCKCRXRC32ER 0x184 1308#define RPMAC_CCKCRXRC32ER 0x184
1306#define RPMAC_CCKCRXRC32OK 0x188 1309#define RPMAC_CCKCRXRC32OK 0x188
1307#define RPMAC_TXSTATUS 0x18c 1310#define RPMAC_TXSTATUS 0x18c
1308 1311
1309#define RFPGA0_RFMOD 0x800 1312#define RFPGA0_RFMOD 0x800
1310 1313
1311#define RFPGA0_TXINFO 0x804 1314#define RFPGA0_TXINFO 0x804
1312#define RFPGA0_PSDFUNCTION 0x808 1315#define RFPGA0_PSDFUNCTION 0x808
1313 1316
1314#define RFPGA0_TXGAINSTAGE 0x80c 1317#define RFPGA0_TXGAINSTAGE 0x80c
1315 1318
1316#define RFPGA0_RFTIMING1 0x810 1319#define RFPGA0_RFTIMING1 0x810
1317#define RFPGA0_RFTIMING2 0x814 1320#define RFPGA0_RFTIMING2 0x814
1318 1321
1319#define RFPGA0_XA_HSSIPARAMETER1 0x820 1322#define RFPGA0_XA_HSSIPARAMETER1 0x820
1320#define RFPGA0_XA_HSSIPARAMETER2 0x824 1323#define RFPGA0_XA_HSSIPARAMETER2 0x824
@@ -1385,7 +1388,6 @@
1385#define RCCK0_FACOUNTERUPPER 0xa58 1388#define RCCK0_FACOUNTERUPPER 0xa58
1386#define RCCK0_CCA_CNT 0xa60 1389#define RCCK0_CCA_CNT 0xa60
1387 1390
1388
1389/* PageB(0xB00) */ 1391/* PageB(0xB00) */
1390#define RPDP_ANTA 0xb00 1392#define RPDP_ANTA 0xb00
1391#define RPDP_ANTA_4 0xb04 1393#define RPDP_ANTA_4 0xb04
@@ -1399,7 +1401,7 @@
1399#define RPDP_ANTA_24 0xb24 1401#define RPDP_ANTA_24 0xb24
1400 1402
1401#define RCONFIG_PMPD_ANTA 0xb28 1403#define RCONFIG_PMPD_ANTA 0xb28
1402#define CONFIG_RAM64X16 0xb2c 1404#define RCONFIG_ram64x16 0xb2c
1403 1405
1404#define RBNDA 0xb30 1406#define RBNDA 0xb30
1405#define RHSSIPAR 0xb34 1407#define RHSSIPAR 0xb34
@@ -1494,7 +1496,6 @@
1494#define ROFDM0_FRAMESYNC 0xcf0 1496#define ROFDM0_FRAMESYNC 0xcf0
1495#define ROFDM0_DFSREPORT 0xcf4 1497#define ROFDM0_DFSREPORT 0xcf4
1496 1498
1497
1498#define ROFDM1_LSTF 0xd00 1499#define ROFDM1_LSTF 0xd00
1499#define ROFDM1_TRXPATHENABLE 0xd04 1500#define ROFDM1_TRXPATHENABLE 0xd04
1500 1501
@@ -1593,144 +1594,144 @@
1593#define RSLEEP 0xee0 1594#define RSLEEP 0xee0
1594#define RPMPD_ANAEN 0xeec 1595#define RPMPD_ANAEN 0xeec
1595 1596
1596#define RZEBRA1_HSSIENABLE 0x0 1597#define RZEBRA1_HSSIENABLE 0x0
1597#define RZEBRA1_TRXENABLE1 0x1 1598#define RZEBRA1_TRXENABLE1 0x1
1598#define RZEBRA1_TRXENABLE2 0x2 1599#define RZEBRA1_TRXENABLE2 0x2
1599#define RZEBRA1_AGC 0x4 1600#define RZEBRA1_AGC 0x4
1600#define RZEBRA1_CHARGEPUMP 0x5 1601#define RZEBRA1_CHARGEPUMP 0x5
1601#define RZEBRA1_CHANNEL 0x7 1602#define RZEBRA1_CHANNEL 0x7
1602 1603
1603#define RZEBRA1_TXGAIN 0x8 1604#define RZEBRA1_TXGAIN 0x8
1604#define RZEBRA1_TXLPF 0x9 1605#define RZEBRA1_TXLPF 0x9
1605#define RZEBRA1_RXLPF 0xb 1606#define RZEBRA1_RXLPF 0xb
1606#define RZEBRA1_RXHPFCORNER 0xc 1607#define RZEBRA1_RXHPFCORNER 0xc
1607 1608
1608#define RGLOBALCTRL 0 1609#define RGLOBALCTRL 0
1609#define RRTL8256_TXLPF 19 1610#define RRTL8256_TXLPF 19
1610#define RRTL8256_RXLPF 11 1611#define RRTL8256_RXLPF 11
1611#define RRTL8258_TXLPF 0x11 1612#define RRTL8258_TXLPF 0x11
1612#define RRTL8258_RXLPF 0x13 1613#define RRTL8258_RXLPF 0x13
1613#define RRTL8258_RSSILPF 0xa 1614#define RRTL8258_RSSILPF 0xa
1614 1615
1615#define RF_AC 0x00 1616#define RF_AC 0x00
1616 1617
1617#define RF_IQADJ_G1 0x01 1618#define RF_IQADJ_G1 0x01
1618#define RF_IQADJ_G2 0x02 1619#define RF_IQADJ_G2 0x02
1619#define RF_POW_TRSW 0x05 1620#define RF_POW_TRSW 0x05
1620 1621
1621#define RF_GAIN_RX 0x06 1622#define RF_GAIN_RX 0x06
1622#define RF_GAIN_TX 0x07 1623#define RF_GAIN_TX 0x07
1623 1624
1624#define RF_TXM_IDAC 0x08 1625#define RF_TXM_IDAC 0x08
1625#define RF_BS_IQGEN 0x0F 1626#define RF_BS_IQGEN 0x0F
1626 1627
1627#define RF_MODE1 0x10 1628#define RF_MODE1 0x10
1628#define RF_MODE2 0x11 1629#define RF_MODE2 0x11
1629 1630
1630#define RF_RX_AGC_HP 0x12 1631#define RF_RX_AGC_HP 0x12
1631#define RF_TX_AGC 0x13 1632#define RF_TX_AGC 0x13
1632#define RF_BIAS 0x14 1633#define RF_BIAS 0x14
1633#define RF_IPA 0x15 1634#define RF_IPA 0x15
1634#define RF_POW_ABILITY 0x17 1635#define RF_POW_ABILITY 0x17
1635#define RF_MODE_AG 0x18 1636#define RF_MODE_AG 0x18
1636#define RRFCHANNEL 0x18 1637#define RRFCHANNEL 0x18
1637#define RF_CHNLBW 0x18 1638#define RF_CHNLBW 0x18
1638#define RF_TOP 0x19 1639#define RF_TOP 0x19
1639 1640
1640#define RF_RX_G1 0x1A 1641#define RF_RX_G1 0x1A
1641#define RF_RX_G2 0x1B 1642#define RF_RX_G2 0x1B
1642 1643
1643#define RF_RX_BB2 0x1C 1644#define RF_RX_BB2 0x1C
1644#define RF_RX_BB1 0x1D 1645#define RF_RX_BB1 0x1D
1645 1646
1646#define RF_RCK1 0x1E 1647#define RF_RCK1 0x1E
1647#define RF_RCK2 0x1F 1648#define RF_RCK2 0x1F
1648 1649
1649#define RF_TX_G1 0x20 1650#define RF_TX_G1 0x20
1650#define RF_TX_G2 0x21 1651#define RF_TX_G2 0x21
1651#define RF_TX_G3 0x22 1652#define RF_TX_G3 0x22
1652 1653
1653#define RF_TX_BB1 0x23 1654#define RF_TX_BB1 0x23
1654#define RF_T_METER 0x42 1655#define RF_T_METER 0x42
1655 1656
1656#define RF_SYN_G1 0x25 1657#define RF_SYN_G1 0x25
1657#define RF_SYN_G2 0x26 1658#define RF_SYN_G2 0x26
1658#define RF_SYN_G3 0x27 1659#define RF_SYN_G3 0x27
1659#define RF_SYN_G4 0x28 1660#define RF_SYN_G4 0x28
1660#define RF_SYN_G5 0x29 1661#define RF_SYN_G5 0x29
1661#define RF_SYN_G6 0x2A 1662#define RF_SYN_G6 0x2A
1662#define RF_SYN_G7 0x2B 1663#define RF_SYN_G7 0x2B
1663#define RF_SYN_G8 0x2C 1664#define RF_SYN_G8 0x2C
1664 1665
1665#define RF_RCK_OS 0x30 1666#define RF_RCK_OS 0x30
1666#define RF_TXPA_G1 0x31 1667#define RF_TXPA_G1 0x31
1667#define RF_TXPA_G2 0x32 1668#define RF_TXPA_G2 0x32
1668#define RF_TXPA_G3 0x33 1669#define RF_TXPA_G3 0x33
1669 1670
1670#define RF_TX_BIAS_A 0x35 1671#define RF_TX_BIAS_A 0x35
1671#define RF_TX_BIAS_D 0x36 1672#define RF_TX_BIAS_D 0x36
1672#define RF_LOBF_9 0x38 1673#define RF_LOBF_9 0x38
1673#define RF_RXRF_A3 0x3C 1674#define RF_RXRF_A3 0x3C
1674#define RF_TRSW 0x3F 1675#define RF_TRSW 0x3F
1675 1676
1676#define RF_TXRF_A2 0x41 1677#define RF_TXRF_A2 0x41
1677#define RF_TXPA_G4 0x46 1678#define RF_TXPA_G4 0x46
1678#define RF_TXPA_A4 0x4B 1679#define RF_TXPA_A4 0x4B
1679 1680
1680#define RF_WE_LUT 0xEF 1681#define RF_WE_LUT 0xEF
1681 1682
1682#define BBBRESETB 0x100 1683#define BBBRESETB 0x100
1683#define BGLOBALRESETB 0x200 1684#define BGLOBALRESETB 0x200
1684#define BOFDMTXSTART 0x4 1685#define BOFDMTXSTART 0x4
1685#define BCCKTXSTART 0x8 1686#define BCCKTXSTART 0x8
1686#define BCRC32DEBUG 0x100 1687#define BCRC32DEBUG 0x100
1687#define BPMACLOOPBACK 0x10 1688#define BPMACLOOPBACK 0x10
1688#define BTXLSIG 0xffffff 1689#define BTXLSIG 0xffffff
1689#define BOFDMTXRATE 0xf 1690#define BOFDMTXRATE 0xf
1690#define BOFDMTXRESERVED 0x10 1691#define BOFDMTXRESERVED 0x10
1691#define BOFDMTXLENGTH 0x1ffe0 1692#define BOFDMTXLENGTH 0x1ffe0
1692#define BOFDMTXPARITY 0x20000 1693#define BOFDMTXPARITY 0x20000
1693#define BTXHTSIG1 0xffffff 1694#define BTXHTSIG1 0xffffff
1694#define BTXHTMCSRATE 0x7f 1695#define BTXHTMCSRATE 0x7f
1695#define BTXHTBW 0x80 1696#define BTXHTBW 0x80
1696#define BTXHTLENGTH 0xffff00 1697#define BTXHTLENGTH 0xffff00
1697#define BTXHTSIG2 0xffffff 1698#define BTXHTSIG2 0xffffff
1698#define BTXHTSMOOTHING 0x1 1699#define BTXHTSMOOTHING 0x1
1699#define BTXHTSOUNDING 0x2 1700#define BTXHTSOUNDING 0x2
1700#define BTXHTRESERVED 0x4 1701#define BTXHTRESERVED 0x4
1701#define BTXHTAGGREATION 0x8 1702#define BTXHTAGGREATION 0x8
1702#define BTXHTSTBC 0x30 1703#define BTXHTSTBC 0x30
1703#define BTXHTADVANCECODING 0x40 1704#define BTXHTADVANCECODING 0x40
1704#define BTXHTSHORTGI 0x80 1705#define BTXHTSHORTGI 0x80
1705#define BTXHTNUMBERHT_LTF 0x300 1706#define BTXHTNUMBERHT_LTF 0x300
1706#define BTXHTCRC8 0x3fc00 1707#define BTXHTCRC8 0x3fc00
1707#define BCOUNTERRESET 0x10000 1708#define BCOUNTERRESET 0x10000
1708#define BNUMOFOFDMTX 0xffff 1709#define BNUMOFOFDMTX 0xffff
1709#define BNUMOFCCKTX 0xffff0000 1710#define BNUMOFCCKTX 0xffff0000
1710#define BTXIDLEINTERVAL 0xffff 1711#define BTXIDLEINTERVAL 0xffff
1711#define BOFDMSERVICE 0xffff0000 1712#define BOFDMSERVICE 0xffff0000
1712#define BTXMACHEADER 0xffffffff 1713#define BTXMACHEADER 0xffffffff
1713#define BTXDATAINIT 0xff 1714#define BTXDATAINIT 0xff
1714#define BTXHTMODE 0x100 1715#define BTXHTMODE 0x100
1715#define BTXDATATYPE 0x30000 1716#define BTXDATATYPE 0x30000
1716#define BTXRANDOMSEED 0xffffffff 1717#define BTXRANDOMSEED 0xffffffff
1717#define BCCKTXPREAMBLE 0x1 1718#define BCCKTXPREAMBLE 0x1
1718#define BCCKTXSFD 0xffff0000 1719#define BCCKTXSFD 0xffff0000
1719#define BCCKTXSIG 0xff 1720#define BCCKTXSIG 0xff
1720#define BCCKTXSERVICE 0xff00 1721#define BCCKTXSERVICE 0xff00
1721#define BCCKLENGTHEXT 0x8000 1722#define BCCKLENGTHEXT 0x8000
1722#define BCCKTXLENGHT 0xffff0000 1723#define BCCKTXLENGHT 0xffff0000
1723#define BCCKTXCRC16 0xffff 1724#define BCCKTXCRC16 0xffff
1724#define BCCKTXSTATUS 0x1 1725#define BCCKTXSTATUS 0x1
1725#define BOFDMTXSTATUS 0x2 1726#define BOFDMTXSTATUS 0x2
1726#define IS_BB_REG_OFFSET_92S(_offset) \ 1727#define IS_BB_REG_OFFSET_92S(_offset) \
1727 ((_offset >= 0x800) && (_offset <= 0xfff)) 1728 ((_offset >= 0x800) && (_offset <= 0xfff))
1728 1729
1729#define BRFMOD 0x1 1730#define BRFMOD 0x1
1730#define BJAPANMODE 0x2 1731#define BJAPANMODE 0x2
1731#define BCCKTXSC 0x30 1732#define BCCKTXSC 0x30
1732#define BCCKEN 0x1000000 1733#define BCCKEN 0x1000000
1733#define BOFDMEN 0x2000000 1734#define BOFDMEN 0x2000000
1734 1735
1735#define BOFDMRXADCPHASE 0x10000 1736#define BOFDMRXADCPHASE 0x10000
1736#define BOFDMTXDACPHASE 0x40000 1737#define BOFDMTXDACPHASE 0x40000
@@ -1824,13 +1825,13 @@
1824#define BDA6SWING 0x380000 1825#define BDA6SWING 0x380000
1825 1826
1826#define BADCLKPHASE 0x4000000 1827#define BADCLKPHASE 0x4000000
1827#define B80MCLKDELAY 0x18000000 1828#define B80MCLKDELAY 0x18000000
1828#define BAFEWATCHDOGENABLE 0x20000000 1829#define BAFEWATCHDOGENABLE 0x20000000
1829 1830
1830#define BXTALCAP01 0xc0000000 1831#define BXTALCAP01 0xc0000000
1831#define BXTALCAP23 0x3 1832#define BXTALCAP23 0x3
1832#define BXTALCAP92X 0x0f000000 1833#define BXTALCAP92X 0x0f000000
1833#define BXTALCAP 0x0f000000 1834#define BXTALCAP 0x0f000000
1834 1835
1835#define BINTDIFCLKENABLE 0x400 1836#define BINTDIFCLKENABLE 0x400
1836#define BEXTSIGCLKENABLE 0x800 1837#define BEXTSIGCLKENABLE 0x800
@@ -1857,7 +1858,7 @@
1857#define BCCKRX_AGC_FORMAT 0x200 1858#define BCCKRX_AGC_FORMAT 0x200
1858#define BPSDFFT_SAMPLE_POINT 0xc000 1859#define BPSDFFT_SAMPLE_POINT 0xc000
1859#define BPSD_AVERAGE_NUM 0x3000 1860#define BPSD_AVERAGE_NUM 0x3000
1860#define BIQPATH_CONTROL 0xc00 1861#define BIQPATH_CONTROL 0xc00
1861#define BPSD_FREQ 0x3ff 1862#define BPSD_FREQ 0x3ff
1862#define BPSD_ANTENNA_PATH 0x30 1863#define BPSD_ANTENNA_PATH 0x30
1863#define BPSD_IQ_SWITCH 0x40 1864#define BPSD_IQ_SWITCH 0x40
@@ -1957,300 +1958,316 @@
1957#define BCCK_DEFAULT_RXPATH 0xc000000 1958#define BCCK_DEFAULT_RXPATH 0xc000000
1958#define BCCK_OPTION_RXPATH 0x3000000 1959#define BCCK_OPTION_RXPATH 0x3000000
1959 1960
1960#define BNUM_OFSTF 0x3 1961#define BNUM_OFSTF 0x3
1961#define BSHIFT_L 0xc0 1962#define BSHIFT_L 0xc0
1962#define BGI_TH 0xc 1963#define BGI_TH 0xc
1963#define BRXPATH_A 0x1 1964#define BRXPATH_A 0x1
1964#define BRXPATH_B 0x2 1965#define BRXPATH_B 0x2
1965#define BRXPATH_C 0x4 1966#define BRXPATH_C 0x4
1966#define BRXPATH_D 0x8 1967#define BRXPATH_D 0x8
1967#define BTXPATH_A 0x1 1968#define BTXPATH_A 0x1
1968#define BTXPATH_B 0x2 1969#define BTXPATH_B 0x2
1969#define BTXPATH_C 0x4 1970#define BTXPATH_C 0x4
1970#define BTXPATH_D 0x8 1971#define BTXPATH_D 0x8
1971#define BTRSSI_FREQ 0x200 1972#define BTRSSI_FREQ 0x200
1972#define BADC_BACKOFF 0x3000 1973#define BADC_BACKOFF 0x3000
1973#define BDFIR_BACKOFF 0xc000 1974#define BDFIR_BACKOFF 0xc000
1974#define BTRSSI_LATCH_PHASE 0x10000 1975#define BTRSSI_LATCH_PHASE 0x10000
1975#define BRX_LDC_OFFSET 0xff 1976#define BRX_LDC_OFFSET 0xff
1976#define BRX_QDC_OFFSET 0xff00 1977#define BRX_QDC_OFFSET 0xff00
1977#define BRX_DFIR_MODE 0x1800000 1978#define BRX_DFIR_MODE 0x1800000
1978#define BRX_DCNF_TYPE 0xe000000 1979#define BRX_DCNF_TYPE 0xe000000
1979#define BRXIQIMB_A 0x3ff 1980#define BRXIQIMB_A 0x3ff
1980#define BRXIQIMB_B 0xfc00 1981#define BRXIQIMB_B 0xfc00
1981#define BRXIQIMB_C 0x3f0000 1982#define BRXIQIMB_C 0x3f0000
1982#define BRXIQIMB_D 0xffc00000 1983#define BRXIQIMB_D 0xffc00000
1983#define BDC_DC_NOTCH 0x60000 1984#define BDC_DC_NOTCH 0x60000
1984#define BRXNB_NOTCH 0x1f000000 1985#define BRXNB_NOTCH 0x1f000000
1985#define BPD_TH 0xf 1986#define BPD_TH 0xf
1986#define BPD_TH_OPT2 0xc000 1987#define BPD_TH_OPT2 0xc000
1987#define BPWED_TH 0x700 1988#define BPWED_TH 0x700
1988#define BIFMF_WIN_L 0x800 1989#define BIFMF_WIN_L 0x800
1989#define BPD_OPTION 0x1000 1990#define BPD_OPTION 0x1000
1990#define BMF_WIN_L 0xe000 1991#define BMF_WIN_L 0xe000
1991#define BBW_SEARCH_L 0x30000 1992#define BBW_SEARCH_L 0x30000
1992#define BWIN_ENH_L 0xc0000 1993#define BWIN_ENH_L 0xc0000
1993#define BBW_TH 0x700000 1994#define BBW_TH 0x700000
1994#define BED_TH2 0x3800000 1995#define BED_TH2 0x3800000
1995#define BBW_OPTION 0x4000000 1996#define BBW_OPTION 0x4000000
1996#define BRADIO_TH 0x18000000 1997#define BRADIO_TH 0x18000000
1997#define BWINDOW_L 0xe0000000 1998#define BWINDOW_L 0xe0000000
1998#define BSBD_OPTION 0x1 1999#define BSBD_OPTION 0x1
1999#define BFRAME_TH 0x1c 2000#define BFRAME_TH 0x1c
2000#define BFS_OPTION 0x60 2001#define BFS_OPTION 0x60
2001#define BDC_SLOPE_CHECK 0x80 2002#define BDC_SLOPE_CHECK 0x80
2002#define BFGUARD_COUNTER_DC_L 0xe00 2003#define BFGUARD_COUNTER_DC_L 0xe00
2003#define BFRAME_WEIGHT_SHORT 0x7000 2004#define BFRAME_WEIGHT_SHORT 0x7000
2004#define BSUB_TUNE 0xe00000 2005#define BSUB_TUNE 0xe00000
2005#define BFRAME_DC_LENGTH 0xe000000 2006#define BFRAME_DC_LENGTH 0xe000000
2006#define BSBD_START_OFFSET 0x30000000 2007#define BSBD_START_OFFSET 0x30000000
2007#define BFRAME_TH_2 0x7 2008#define BFRAME_TH_2 0x7
2008#define BFRAME_GI2_TH 0x38 2009#define BFRAME_GI2_TH 0x38
2009#define BGI2_SYNC_EN 0x40 2010#define BGI2_SYNC_EN 0x40
2010#define BSARCH_SHORT_EARLY 0x300 2011#define BSARCH_SHORT_EARLY 0x300
2011#define BSARCH_SHORT_LATE 0xc00 2012#define BSARCH_SHORT_LATE 0xc00
2012#define BSARCH_GI2_LATE 0x70000 2013#define BSARCH_GI2_LATE 0x70000
2013#define BCFOANTSUM 0x1 2014#define BCFOANTSUM 0x1
2014#define BCFOACC 0x2 2015#define BCFOACC 0x2
2015#define BCFOSTARTOFFSET 0xc 2016#define BCFOSTARTOFFSET 0xc
2016#define BCFOLOOPBACK 0x70 2017#define BCFOLOOPBACK 0x70
2017#define BCFOSUMWEIGHT 0x80 2018#define BCFOSUMWEIGHT 0x80
2018#define BDAGCENABLE 0x10000 2019#define BDAGCENABLE 0x10000
2019#define BTXIQIMB_A 0x3ff 2020#define BTXIQIMB_A 0x3ff
2020#define BTXIQIMB_b 0xfc00 2021#define BTXIQIMB_b 0xfc00
2021#define BTXIQIMB_C 0x3f0000 2022#define BTXIQIMB_C 0x3f0000
2022#define BTXIQIMB_D 0xffc00000 2023#define BTXIQIMB_D 0xffc00000
2023#define BTXIDCOFFSET 0xff 2024#define BTXIDCOFFSET 0xff
2024#define BTXIQDCOFFSET 0xff00 2025#define BTXIQDCOFFSET 0xff00
2025#define BTXDFIRMODE 0x10000 2026#define BTXDFIRMODE 0x10000
2026#define BTXPESUDO_NOISEON 0x4000000 2027#define BTXPESUDO_NOISEON 0x4000000
2027#define BTXPESUDO_NOISE_A 0xff 2028#define BTXPESUDO_NOISE_A 0xff
2028#define BTXPESUDO_NOISE_B 0xff00 2029#define BTXPESUDO_NOISE_B 0xff00
2029#define BTXPESUDO_NOISE_C 0xff0000 2030#define BTXPESUDO_NOISE_C 0xff0000
2030#define BTXPESUDO_NOISE_D 0xff000000 2031#define BTXPESUDO_NOISE_D 0xff000000
2031#define BCCA_DROPOPTION 0x20000 2032#define BCCA_DROPOPTION 0x20000
2032#define BCCA_DROPTHRES 0xfff00000 2033#define BCCA_DROPTHRES 0xfff00000
2033#define BEDCCA_H 0xf 2034#define BEDCCA_H 0xf
2034#define BEDCCA_L 0xf0 2035#define BEDCCA_L 0xf0
2035#define BLAMBDA_ED 0x300 2036#define BLAMBDA_ED 0x300
2036#define BRX_INITIALGAIN 0x7f 2037#define BRX_INITIALGAIN 0x7f
2037#define BRX_ANTDIV_EN 0x80 2038#define BRX_ANTDIV_EN 0x80
2038#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00 2039#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00
2039#define BRX_HIGHPOWER_FLOW 0x8000 2040#define BRX_HIGHPOWER_FLOW 0x8000
2040#define BRX_AGC_FREEZE_THRES 0xc0000 2041#define BRX_AGC_FREEZE_THRES 0xc0000
2041#define BRX_FREEZESTEP_AGC1 0x300000 2042#define BRX_FREEZESTEP_AGC1 0x300000
2042#define BRX_FREEZESTEP_AGC2 0xc00000 2043#define BRX_FREEZESTEP_AGC2 0xc00000
2043#define BRX_FREEZESTEP_AGC3 0x3000000 2044#define BRX_FREEZESTEP_AGC3 0x3000000
2044#define BRX_FREEZESTEP_AGC0 0xc000000 2045#define BRX_FREEZESTEP_AGC0 0xc000000
2045#define BRXRSSI_CMP_EN 0x10000000 2046#define BRXRSSI_CMP_EN 0x10000000
2046#define BRXQUICK_AGCEN 0x20000000 2047#define BRXQUICK_AGCEN 0x20000000
2047#define BRXAGC_FREEZE_THRES_MODE 0x40000000 2048#define BRXAGC_FREEZE_THRES_MODE 0x40000000
2048#define BRX_OVERFLOW_CHECKTYPE 0x80000000 2049#define BRX_OVERFLOW_CHECKTYPE 0x80000000
2049#define BRX_AGCSHIFT 0x7f 2050#define BRX_AGCSHIFT 0x7f
2050#define BTRSW_TRI_ONLY 0x80 2051#define BTRSW_TRI_ONLY 0x80
2051#define BPOWER_THRES 0x300 2052#define BPOWER_THRES 0x300
2052#define BRXAGC_EN 0x1 2053#define BRXAGC_EN 0x1
2053#define BRXAGC_TOGETHER_EN 0x2 2054#define BRXAGC_TOGETHER_EN 0x2
2054#define BRXAGC_MIN 0x4 2055#define BRXAGC_MIN 0x4
2055#define BRXHP_INI 0x7 2056#define BRXHP_INI 0x7
2056#define BRXHP_TRLNA 0x70 2057#define BRXHP_TRLNA 0x70
2057#define BRXHP_RSSI 0x700 2058#define BRXHP_RSSI 0x700
2058#define BRXHP_BBP1 0x7000 2059#define BRXHP_BBP1 0x7000
2059#define BRXHP_BBP2 0x70000 2060#define BRXHP_BBP2 0x70000
2060#define BRXHP_BBP3 0x700000 2061#define BRXHP_BBP3 0x700000
2061#define BRSSI_H 0x7f0000 2062#define BRSSI_H 0x7f0000
2062#define BRSSI_GEN 0x7f000000 2063#define BRSSI_GEN 0x7f000000
2063#define BRXSETTLE_TRSW 0x7 2064#define BRXSETTLE_TRSW 0x7
2064#define BRXSETTLE_LNA 0x38 2065#define BRXSETTLE_LNA 0x38
2065#define BRXSETTLE_RSSI 0x1c0 2066#define BRXSETTLE_RSSI 0x1c0
2066#define BRXSETTLE_BBP 0xe00 2067#define BRXSETTLE_BBP 0xe00
2067#define BRXSETTLE_RXHP 0x7000 2068#define BRXSETTLE_RXHP 0x7000
2068#define BRXSETTLE_ANTSW_RSSI 0x38000 2069#define BRXSETTLE_ANTSW_RSSI 0x38000
2069#define BRXSETTLE_ANTSW 0xc0000 2070#define BRXSETTLE_ANTSW 0xc0000
2070#define BRXPROCESS_TIME_DAGC 0x300000 2071#define BRXPROCESS_TIME_DAGC 0x300000
2071#define BRXSETTLE_HSSI 0x400000 2072#define BRXSETTLE_HSSI 0x400000
2072#define BRXPROCESS_TIME_BBPPW 0x800000 2073#define BRXPROCESS_TIME_BBPPW 0x800000
2073#define BRXANTENNA_POWER_SHIFT 0x3000000 2074#define BRXANTENNA_POWER_SHIFT 0x3000000
2074#define BRSSI_TABLE_SELECT 0xc000000 2075#define BRSSI_TABLE_SELECT 0xc000000
2075#define BRXHP_FINAL 0x7000000 2076#define BRXHP_FINAL 0x7000000
2076#define BRXHPSETTLE_BBP 0x7 2077#define BRXHPSETTLE_BBP 0x7
2077#define BRXHTSETTLE_HSSI 0x8 2078#define BRXHTSETTLE_HSSI 0x8
2078#define BRXHTSETTLE_RXHP 0x70 2079#define BRXHTSETTLE_RXHP 0x70
2079#define BRXHTSETTLE_BBPPW 0x80 2080#define BRXHTSETTLE_BBPPW 0x80
2080#define BRXHTSETTLE_IDLE 0x300 2081#define BRXHTSETTLE_IDLE 0x300
2081#define BRXHTSETTLE_RESERVED 0x1c00 2082#define BRXHTSETTLE_RESERVED 0x1c00
2082#define BRXHT_RXHP_EN 0x8000 2083#define BRXHT_RXHP_EN 0x8000
2083#define BRXAGC_FREEZE_THRES 0x30000 2084#define BRXAGC_FREEZE_THRES 0x30000
2084#define BRXAGC_TOGETHEREN 0x40000 2085#define BRXAGC_TOGETHEREN 0x40000
2085#define BRXHTAGC_MIN 0x80000 2086#define BRXHTAGC_MIN 0x80000
2086#define BRXHTAGC_EN 0x100000 2087#define BRXHTAGC_EN 0x100000
2087#define BRXHTDAGC_EN 0x200000 2088#define BRXHTDAGC_EN 0x200000
2088#define BRXHT_RXHP_BBP 0x1c00000 2089#define BRXHT_RXHP_BBP 0x1c00000
2089#define BRXHT_RXHP_FINAL 0xe0000000 2090#define BRXHT_RXHP_FINAL 0xe0000000
2090#define BRXPW_RADIO_TH 0x3 2091#define BRXPW_RADIO_TH 0x3
2091#define BRXPW_RADIO_EN 0x4 2092#define BRXPW_RADIO_EN 0x4
2092#define BRXMF_HOLD 0x3800 2093#define BRXMF_HOLD 0x3800
2093#define BRXPD_DELAY_TH1 0x38 2094#define BRXPD_DELAY_TH1 0x38
2094#define BRXPD_DELAY_TH2 0x1c0 2095#define BRXPD_DELAY_TH2 0x1c0
2095#define BRXPD_DC_COUNT_MAX 0x600 2096#define BRXPD_DC_COUNT_MAX 0x600
2096#define BRXPD_DELAY_TH 0x8000 2097#define BRXPD_DELAY_TH 0x8000
2097#define BRXPROCESS_DELAY 0xf0000 2098#define BRXPROCESS_DELAY 0xf0000
2098#define BRXSEARCHRANGE_GI2_EARLY 0x700000 2099#define BRXSEARCHRANGE_GI2_EARLY 0x700000
2099#define BRXFRAME_FUARD_COUNTER_L 0x3800000 2100#define BRXFRAME_FUARD_COUNTER_L 0x3800000
2100#define BRXSGI_GUARD_L 0xc000000 2101#define BRXSGI_GUARD_L 0xc000000
2101#define BRXSGI_SEARCH_L 0x30000000 2102#define BRXSGI_SEARCH_L 0x30000000
2102#define BRXSGI_TH 0xc0000000 2103#define BRXSGI_TH 0xc0000000
2103#define BDFSCNT0 0xff 2104#define BDFSCNT0 0xff
2104#define BDFSCNT1 0xff00 2105#define BDFSCNT1 0xff00
2105#define BDFSFLAG 0xf0000 2106#define BDFSFLAG 0xf0000
2106#define BMF_WEIGHT_SUM 0x300000 2107#define BMF_WEIGHT_SUM 0x300000
2107#define BMINIDX_TH 0x7f000000 2108#define BMINIDX_TH 0x7f000000
2108#define BDAFORMAT 0x40000 2109#define BDAFORMAT 0x40000
2109#define BTXCH_EMU_ENABLE 0x01000000 2110#define BTXCH_EMU_ENABLE 0x01000000
2110#define BTRSW_ISOLATION_A 0x7f 2111#define BTRSW_ISOLATION_A 0x7f
2111#define BTRSW_ISOLATION_B 0x7f00 2112#define BTRSW_ISOLATION_B 0x7f00
2112#define BTRSW_ISOLATION_C 0x7f0000 2113#define BTRSW_ISOLATION_C 0x7f0000
2113#define BTRSW_ISOLATION_D 0x7f000000 2114#define BTRSW_ISOLATION_D 0x7f000000
2114#define BEXT_LNA_GAIN 0x7c00 2115#define BEXT_LNA_GAIN 0x7c00
2115 2116
2116#define BSTBC_EN 0x4 2117#define BSTBC_EN 0x4
2117#define BANTENNA_MAPPING 0x10 2118#define BANTENNA_MAPPING 0x10
2118#define BNSS 0x20 2119#define BNSS 0x20
2119#define BCFO_ANTSUM_ID 0x200 2120#define BCFO_ANTSUM_ID 0x200
2120#define BPHY_COUNTER_RESET 0x8000000 2121#define BPHY_COUNTER_RESET 0x8000000
2121#define BCFO_REPORT_GET 0x4000000 2122#define BCFO_REPORT_GET 0x4000000
2122#define BOFDM_CONTINUE_TX 0x10000000 2123#define BOFDM_CONTINUE_TX 0x10000000
2123#define BOFDM_SINGLE_CARRIER 0x20000000 2124#define BOFDM_SINGLE_CARRIER 0x20000000
2124#define BOFDM_SINGLE_TONE 0x40000000 2125#define BOFDM_SINGLE_TONE 0x40000000
2125#define BHT_DETECT 0x100 2126#define BHT_DETECT 0x100
2126#define BCFOEN 0x10000 2127#define BCFOEN 0x10000
2127#define BCFOVALUE 0xfff00000 2128#define BCFOVALUE 0xfff00000
2128#define BSIGTONE_RE 0x3f 2129#define BSIGTONE_RE 0x3f
2129#define BSIGTONE_IM 0x7f00 2130#define BSIGTONE_IM 0x7f00
2130#define BCOUNTER_CCA 0xffff 2131#define BCOUNTER_CCA 0xffff
2131#define BCOUNTER_PARITYFAIL 0xffff0000 2132#define BCOUNTER_PARITYFAIL 0xffff0000
2132#define BCOUNTER_RATEILLEGAL 0xffff 2133#define BCOUNTER_RATEILLEGAL 0xffff
2133#define BCOUNTER_CRC8FAIL 0xffff0000 2134#define BCOUNTER_CRC8FAIL 0xffff0000
2134#define BCOUNTER_MCSNOSUPPORT 0xffff 2135#define BCOUNTER_MCSNOSUPPORT 0xffff
2135#define BCOUNTER_FASTSYNC 0xffff 2136#define BCOUNTER_FASTSYNC 0xffff
2136#define BSHORTCFO 0xfff 2137#define BSHORTCFO 0xfff
2137#define BSHORTCFOT_LENGTH 12 2138#define BSHORTCFOT_LENGTH 12
2138#define BSHORTCFOF_LENGTH 11 2139#define BSHORTCFOF_LENGTH 11
2139#define BLONGCFO 0x7ff 2140#define BLONGCFO 0x7ff
2140#define BLONGCFOT_LENGTH 11 2141#define BLONGCFOT_LENGTH 11
2141#define BLONGCFOF_LENGTH 11 2142#define BLONGCFOF_LENGTH 11
2142#define BTAILCFO 0x1fff 2143#define BTAILCFO 0x1fff
2143#define BTAILCFOT_LENGTH 13 2144#define BTAILCFOT_LENGTH 13
2144#define BTAILCFOF_LENGTH 12 2145#define BTAILCFOF_LENGTH 12
2145#define BNOISE_EN_PWDB 0xffff 2146#define BNOISE_EN_PWDB 0xffff
2146#define BCC_POWER_DB 0xffff0000 2147#define BCC_POWER_DB 0xffff0000
2147#define BMOISE_PWDB 0xffff 2148#define BMOISE_PWDB 0xffff
2148#define BPOWERMEAST_LENGTH 10 2149#define BPOWERMEAST_LENGTH 10
2149#define BPOWERMEASF_LENGTH 3 2150#define BPOWERMEASF_LENGTH 3
2150#define BRX_HT_BW 0x1 2151#define BRX_HT_BW 0x1
2151#define BRXSC 0x6 2152#define BRXSC 0x6
2152#define BRX_HT 0x8 2153#define BRX_HT 0x8
2153#define BNB_INTF_DET_ON 0x1 2154#define BNB_INTF_DET_ON 0x1
2154#define BINTF_WIN_LEN_CFG 0x30 2155#define BINTF_WIN_LEN_CFG 0x30
2155#define BNB_INTF_TH_CFG 0x1c0 2156#define BNB_INTF_TH_CFG 0x1c0
2156#define BRFGAIN 0x3f 2157#define BRFGAIN 0x3f
2157#define BTABLESEL 0x40 2158#define BTABLESEL 0x40
2158#define BTRSW 0x80 2159#define BTRSW 0x80
2159#define BRXSNR_A 0xff 2160#define BRXSNR_A 0xff
2160#define BRXSNR_B 0xff00 2161#define BRXSNR_B 0xff00
2161#define BRXSNR_C 0xff0000 2162#define BRXSNR_C 0xff0000
2162#define BRXSNR_D 0xff000000 2163#define BRXSNR_D 0xff000000
2163#define BSNR_EVMT_LENGTH 8 2164#define BSNR_EVMT_LENGTH 8
2164#define BSNR_EVMF_LENGTH 1 2165#define BSNR_EVMF_LENGTH 1
2165#define BCSI1ST 0xff 2166#define BCSI1ST 0xff
2166#define BCSI2ND 0xff00 2167#define BCSI2ND 0xff00
2167#define BRXEVM1ST 0xff0000 2168#define BRXEVM1ST 0xff0000
2168#define BRXEVM2ND 0xff000000 2169#define BRXEVM2ND 0xff000000
2169#define BSIGEVM 0xff 2170#define BSIGEVM 0xff
2170#define BPWDB 0xff00 2171#define BPWDB 0xff00
2171#define BSGIEN 0x10000 2172#define BSGIEN 0x10000
2172 2173
2173#define BSFACTOR_QMA1 0xf 2174#define BSFACTOR_QMA1 0xf
2174#define BSFACTOR_QMA2 0xf0 2175#define BSFACTOR_QMA2 0xf0
2175#define BSFACTOR_QMA3 0xf00 2176#define BSFACTOR_QMA3 0xf00
2176#define BSFACTOR_QMA4 0xf000 2177#define BSFACTOR_QMA4 0xf000
2177#define BSFACTOR_QMA5 0xf0000 2178#define BSFACTOR_QMA5 0xf0000
2178#define BSFACTOR_QMA6 0xf0000 2179#define BSFACTOR_QMA6 0xf0000
2179#define BSFACTOR_QMA7 0xf00000 2180#define BSFACTOR_QMA7 0xf00000
2180#define BSFACTOR_QMA8 0xf000000 2181#define BSFACTOR_QMA8 0xf000000
2181#define BSFACTOR_QMA9 0xf0000000 2182#define BSFACTOR_QMA9 0xf0000000
2182#define BCSI_SCHEME 0x100000 2183#define BCSI_SCHEME 0x100000
2183 2184
2184#define BNOISE_LVL_TOP_SET 0x3 2185#define BNOISE_LVL_TOP_SET 0x3
2185#define BCHSMOOTH 0x4 2186#define BCHSMOOTH 0x4
2186#define BCHSMOOTH_CFG1 0x38 2187#define BCHSMOOTH_CFG1 0x38
2187#define BCHSMOOTH_CFG2 0x1c0 2188#define BCHSMOOTH_CFG2 0x1c0
2188#define BCHSMOOTH_CFG3 0xe00 2189#define BCHSMOOTH_CFG3 0xe00
2189#define BCHSMOOTH_CFG4 0x7000 2190#define BCHSMOOTH_CFG4 0x7000
2190#define BMRCMODE 0x800000 2191#define BMRCMODE 0x800000
2191#define BTHEVMCFG 0x7000000 2192#define BTHEVMCFG 0x7000000
2192 2193
2193#define BLOOP_FIT_TYPE 0x1 2194#define BLOOP_FIT_TYPE 0x1
2194#define BUPD_CFO 0x40 2195#define BUPD_CFO 0x40
2195#define BUPD_CFO_OFFDATA 0x80 2196#define BUPD_CFO_OFFDATA 0x80
2196#define BADV_UPD_CFO 0x100 2197#define BADV_UPD_CFO 0x100
2197#define BADV_TIME_CTRL 0x800 2198#define BADV_TIME_CTRL 0x800
2198#define BUPD_CLKO 0x1000 2199#define BUPD_CLKO 0x1000
2199#define BFC 0x6000 2200#define BFC 0x6000
2200#define BTRACKING_MODE 0x8000 2201#define BTRACKING_MODE 0x8000
2201#define BPHCMP_ENABLE 0x10000 2202#define BPHCMP_ENABLE 0x10000
2202#define BUPD_CLKO_LTF 0x20000 2203#define BUPD_CLKO_LTF 0x20000
2203#define BCOM_CH_CFO 0x40000 2204#define BCOM_CH_CFO 0x40000
2204#define BCSI_ESTI_MODE 0x80000 2205#define BCSI_ESTI_MODE 0x80000
2205#define BADV_UPD_EQZ 0x100000 2206#define BADV_UPD_EQZ 0x100000
2206#define BUCHCFG 0x7000000 2207#define BUCHCFG 0x7000000
2207#define BUPDEQZ 0x8000000 2208#define BUPDEQZ 0x8000000
2208 2209
2209#define BRX_PESUDO_NOISE_ON 0x20000000 2210#define BRX_PESUDO_NOISE_ON 0x20000000
2210#define BRX_PESUDO_NOISE_A 0xff 2211#define BRX_PESUDO_NOISE_A 0xff
2211#define BRX_PESUDO_NOISE_B 0xff00 2212#define BRX_PESUDO_NOISE_B 0xff00
2212#define BRX_PESUDO_NOISE_C 0xff0000 2213#define BRX_PESUDO_NOISE_C 0xff0000
2213#define BRX_PESUDO_NOISE_D 0xff000000 2214#define BRX_PESUDO_NOISE_D 0xff000000
2214#define BRX_PESUDO_NOISESTATE_A 0xffff 2215#define BRX_PESUDO_NOISESTATE_A 0xffff
2215#define BRX_PESUDO_NOISESTATE_B 0xffff0000 2216#define BRX_PESUDO_NOISESTATE_B 0xffff0000
2216#define BRX_PESUDO_NOISESTATE_C 0xffff 2217#define BRX_PESUDO_NOISESTATE_C 0xffff
2217#define BRX_PESUDO_NOISESTATE_D 0xffff0000 2218#define BRX_PESUDO_NOISESTATE_D 0xffff0000
2218 2219
2219#define BZEBRA1_HSSIENABLE 0x8 2220#define BZEBRA1_HSSIENABLE 0x8
2220#define BZEBRA1_TRXCONTROL 0xc00 2221#define BZEBRA1_TRXCONTROL 0xc00
2221#define BZEBRA1_TRXGAINSETTING 0x07f 2222#define BZEBRA1_TRXGAINSETTING 0x07f
2222#define BZEBRA1_RXCOUNTER 0xc00 2223#define BZEBRA1_RXCOUNTER 0xc00
2223#define BZEBRA1_TXCHANGEPUMP 0x38 2224#define BZEBRA1_TXCHANGEPUMP 0x38
2224#define BZEBRA1_RXCHANGEPUMP 0x7 2225#define BZEBRA1_RXCHANGEPUMP 0x7
2225#define BZEBRA1_CHANNEL_NUM 0xf80 2226#define BZEBRA1_CHANNEL_NUM 0xf80
2226#define BZEBRA1_TXLPFBW 0x400 2227#define BZEBRA1_TXLPFBW 0x400
2227#define BZEBRA1_RXLPFBW 0x600 2228#define BZEBRA1_RXLPFBW 0x600
2228 2229
2229#define BRTL8256REG_MODE_CTRL1 0x100 2230#define BRTL8256REG_MODE_CTRL1 0x100
2230#define BRTL8256REG_MODE_CTRL0 0x40 2231#define BRTL8256REG_MODE_CTRL0 0x40
2231#define BRTL8256REG_TXLPFBW 0x18 2232#define BRTL8256REG_TXLPFBW 0x18
2232#define BRTL8256REG_RXLPFBW 0x600 2233#define BRTL8256REG_RXLPFBW 0x600
2233 2234
2234#define BRTL8258_TXLPFBW 0xc 2235#define BRTL8258_TXLPFBW 0xc
2235#define BRTL8258_RXLPFBW 0xc00 2236#define BRTL8258_RXLPFBW 0xc00
2236#define BRTL8258_RSSILPFBW 0xc0 2237#define BRTL8258_RSSILPFBW 0xc0
2237 2238
2238#define BBYTE0 0x1 2239#define BBYTE0 0x1
2239#define BBYTE1 0x2 2240#define BBYTE1 0x2
2240#define BBYTE2 0x4 2241#define BBYTE2 0x4
2241#define BBYTE3 0x8 2242#define BBYTE3 0x8
2242#define BWORD0 0x3 2243#define BWORD0 0x3
2243#define BWORD1 0xc 2244#define BWORD1 0xc
2244#define BWORD 0xf 2245#define BWORD 0xf
2245 2246
2246#define BENABLE 0x1 2247#define MASKBYTE0 0xff
2247#define BDISABLE 0x0 2248#define MASKBYTE1 0xff00
2248 2249#define MASKBYTE2 0xff0000
2249#define LEFT_ANTENNA 0x0 2250#define MASKBYTE3 0xff000000
2250#define RIGHT_ANTENNA 0x1 2251#define MASKHWORD 0xffff0000
2251 2252#define MASKLWORD 0x0000ffff
2252#define TCHECK_TXSTATUS 500 2253#define MASKDWORD 0xffffffff
2253#define TUPDATE_RXCOUNTER 100 2254#define MASK12BITS 0xfff
2255#define MASKH4BITS 0xf0000000
2256#define MASKOFDM_D 0xffc00000
2257#define MASKCCK 0x3f3f3f3f
2258
2259#define MASK4BITS 0x0f
2260#define MASK20BITS 0xfffff
2261#define RFREG_OFFSET_MASK 0xfffff
2262
2263#define BENABLE 0x1
2264#define BDISABLE 0x0
2265
2266#define LEFT_ANTENNA 0x0
2267#define RIGHT_ANTENNA 0x1
2268
2269#define TCHECK_TXSTATUS 500
2270#define TUPDATE_RXCOUNTER 100
2254 2271
2255#define REG_UN_used_register 0x01bf 2272#define REG_UN_used_register 0x01bf
2256 2273
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/rf.c b/drivers/net/wireless/rtlwifi/rtl8723be/rf.c
index 486294930a7b..5ed4492d3c80 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/rf.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/rf.c
@@ -51,7 +51,7 @@ void rtl8723be_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
51 rtlphy->rfreg_chnlval[0]); 51 rtlphy->rfreg_chnlval[0]);
52 break; 52 break;
53 default: 53 default:
54 RT_TRACE(rtlpriv, COMP_INIT, DBG_EMERG, 54 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
55 "unknown bandwidth: %#X\n", bandwidth); 55 "unknown bandwidth: %#X\n", bandwidth);
56 break; 56 break;
57 } 57 }
@@ -93,18 +93,20 @@ void rtl8723be_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
93 (ppowerlevel[idx1] << 16) | 93 (ppowerlevel[idx1] << 16) |
94 (ppowerlevel[idx1] << 24); 94 (ppowerlevel[idx1] << 24);
95 } 95 }
96
96 if (rtlefuse->eeprom_regulatory == 0) { 97 if (rtlefuse->eeprom_regulatory == 0) {
97 tmpval = 98 tmpval =
98 (rtlphy->mcs_offset[0][6]) + 99 (rtlphy->mcs_txpwrlevel_origoffset[0][6]) +
99 (rtlphy->mcs_offset[0][7] << 8); 100 (rtlphy->mcs_txpwrlevel_origoffset[0][7] << 8);
100 tx_agc[RF90_PATH_A] += tmpval; 101 tx_agc[RF90_PATH_A] += tmpval;
101 102
102 tmpval = (rtlphy->mcs_offset[0][14]) + 103 tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][14]) +
103 (rtlphy->mcs_offset[0][15] << 104 (rtlphy->mcs_txpwrlevel_origoffset[0][15] <<
104 24); 105 24);
105 tx_agc[RF90_PATH_B] += tmpval; 106 tx_agc[RF90_PATH_B] += tmpval;
106 } 107 }
107 } 108 }
109
108 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) { 110 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
109 ptr = (u8 *)(&(tx_agc[idx1])); 111 ptr = (u8 *)(&(tx_agc[idx1]));
110 for (idx2 = 0; idx2 < 4; idx2++) { 112 for (idx2 = 0; idx2 < 4; idx2++) {
@@ -124,30 +126,32 @@ void rtl8723be_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
124 tmpval = tx_agc[RF90_PATH_A] & 0xff; 126 tmpval = tx_agc[RF90_PATH_A] & 0xff;
125 rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval); 127 rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, tmpval);
126 128
127 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 129 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
128 "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, 130 "CCK PWR 1M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
129 RTXAGC_A_CCK1_MCS32); 131 RTXAGC_A_CCK1_MCS32);
130 132
131 tmpval = tx_agc[RF90_PATH_A] >> 8; 133 tmpval = tx_agc[RF90_PATH_A] >> 8;
132 134
135 /*tmpval = tmpval & 0xff00ffff;*/
136
133 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval); 137 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, 0xffffff00, tmpval);
134 138
135 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 139 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
136 "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval, 140 "CCK PWR 2~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
137 RTXAGC_B_CCK11_A_CCK2_11); 141 RTXAGC_B_CCK11_A_CCK2_11);
138 142
139 tmpval = tx_agc[RF90_PATH_B] >> 24; 143 tmpval = tx_agc[RF90_PATH_B] >> 24;
140 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval); 144 rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, tmpval);
141 145
142 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 146 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
143 "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, 147 "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
144 RTXAGC_B_CCK11_A_CCK2_11); 148 RTXAGC_B_CCK11_A_CCK2_11);
145 149
146 tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff; 150 tmpval = tx_agc[RF90_PATH_B] & 0x00ffffff;
147 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval); 151 rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, 0xffffff00, tmpval);
148 152
149 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 153 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
150 "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval, 154 "CCK PWR 1~5.5M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
151 RTXAGC_B_CCK1_55_MCS32); 155 RTXAGC_B_CCK1_55_MCS32);
152} 156}
153 157
@@ -169,8 +173,8 @@ static void rtl8723be_phy_get_power_base(struct ieee80211_hw *hw,
169 powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) | 173 powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
170 (powerbase0 << 8) | powerbase0; 174 (powerbase0 << 8) | powerbase0;
171 *(ofdmbase + i) = powerbase0; 175 *(ofdmbase + i) = powerbase0;
172 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 176 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
173 " [OFDM power base index rf(%c) = 0x%x]\n", 177 " [OFDM power base index rf(%c) = 0x%x]\n",
174 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i)); 178 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i));
175 } 179 }
176 180
@@ -179,27 +183,30 @@ static void rtl8723be_phy_get_power_base(struct ieee80211_hw *hw,
179 powerlevel[i] = ppowerlevel_bw20[i]; 183 powerlevel[i] = ppowerlevel_bw20[i];
180 else 184 else
181 powerlevel[i] = ppowerlevel_bw40[i]; 185 powerlevel[i] = ppowerlevel_bw40[i];
186
182 powerbase1 = powerlevel[i]; 187 powerbase1 = powerlevel[i];
183 powerbase1 = (powerbase1 << 24) | (powerbase1 << 16) | 188 powerbase1 = (powerbase1 << 24) | (powerbase1 << 16) |
184 (powerbase1 << 8) | powerbase1; 189 (powerbase1 << 8) | powerbase1;
185 190
186 *(mcsbase + i) = powerbase1; 191 *(mcsbase + i) = powerbase1;
187 192
188 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 193 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
189 " [MCS power base index rf(%c) = 0x%x]\n", 194 " [MCS power base index rf(%c) = 0x%x]\n",
190 ((i == 0) ? 'A' : 'B'), *(mcsbase + i)); 195 ((i == 0) ? 'A' : 'B'), *(mcsbase + i));
191 } 196 }
192} 197}
193 198
194static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index, 199static void _rtl8723be_get_txpower_writeval_by_regulatory(
195 u32 *powerbase0, u32 *powerbase1, 200 struct ieee80211_hw *hw,
196 u32 *p_outwriteval) 201 u8 channel, u8 index,
202 u32 *powerbase0,
203 u32 *powerbase1,
204 u32 *p_outwriteval)
197{ 205{
198 struct rtl_priv *rtlpriv = rtl_priv(hw); 206 struct rtl_priv *rtlpriv = rtl_priv(hw);
199 struct rtl_phy *rtlphy = &(rtlpriv->phy); 207 struct rtl_phy *rtlphy = &(rtlpriv->phy);
200 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 208 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
201 u8 i, chnlgroup = 0, pwr_diff_limit[4]; 209 u8 i, chnlgroup = 0, pwr_diff_limit[4], pwr_diff = 0, customer_pwr_diff;
202 u8 pwr_diff = 0, customer_pwr_diff;
203 u32 writeval, customer_limit, rf; 210 u32 writeval, customer_limit, rf;
204 211
205 for (rf = 0; rf < 2; rf++) { 212 for (rf = 0; rf < 2; rf++) {
@@ -208,13 +215,13 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
208 chnlgroup = 0; 215 chnlgroup = 0;
209 216
210 writeval = 217 writeval =
211 rtlphy->mcs_offset[chnlgroup][index + (rf ? 8 : 0)] 218 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup][index +
219 (rf ? 8 : 0)]
212 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]); 220 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
213 221
214 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 222 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
215 "RTK better performance, " 223 "RTK better performance, writeval(%c) = 0x%x\n",
216 "writeval(%c) = 0x%x\n", 224 ((rf == 0) ? 'A' : 'B'), writeval);
217 ((rf == 0) ? 'A' : 'B'), writeval);
218 break; 225 break;
219 case 1: 226 case 1:
220 if (rtlphy->pwrgroup_cnt == 1) { 227 if (rtlphy->pwrgroup_cnt == 1) {
@@ -233,43 +240,41 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
233 else if (channel == 14) 240 else if (channel == 14)
234 chnlgroup = 5; 241 chnlgroup = 5;
235 } 242 }
236 writeval = rtlphy->mcs_offset[chnlgroup] 243
244 writeval =
245 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
237 [index + (rf ? 8 : 0)] + ((index < 2) ? 246 [index + (rf ? 8 : 0)] + ((index < 2) ?
238 powerbase0[rf] : 247 powerbase0[rf] :
239 powerbase1[rf]); 248 powerbase1[rf]);
240 249
241 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 250 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
242 "Realtek regulatory, 20MHz, " 251 "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
243 "writeval(%c) = 0x%x\n", 252 ((rf == 0) ? 'A' : 'B'), writeval);
244 ((rf == 0) ? 'A' : 'B'), writeval);
245 253
246 break; 254 break;
247 case 2: 255 case 2:
248 writeval = 256 writeval =
249 ((index < 2) ? powerbase0[rf] : powerbase1[rf]); 257 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
250 258
251 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 259 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
252 "Better regulatory, " 260 "Better regulatory, writeval(%c) = 0x%x\n",
253 "writeval(%c) = 0x%x\n", 261 ((rf == 0) ? 'A' : 'B'), writeval);
254 ((rf == 0) ? 'A' : 'B'), writeval);
255 break; 262 break;
256 case 3: 263 case 3:
257 chnlgroup = 0; 264 chnlgroup = 0;
258 265
259 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 266 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
260 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 267 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
261 "customer's limit, 40MHz " 268 "customer's limit, 40MHz rf(%c) = 0x%x\n",
262 "rf(%c) = 0x%x\n", 269 ((rf == 0) ? 'A' : 'B'),
263 ((rf == 0) ? 'A' : 'B'), 270 rtlefuse->pwrgroup_ht40
264 rtlefuse->pwrgroup_ht40[rf] 271 [rf][channel - 1]);
265 [channel-1]);
266 } else { 272 } else {
267 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 273 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
268 "customer's limit, 20MHz " 274 "customer's limit, 20MHz rf(%c) = 0x%x\n",
269 "rf(%c) = 0x%x\n", 275 ((rf == 0) ? 'A' : 'B'),
270 ((rf == 0) ? 'A' : 'B'), 276 rtlefuse->pwrgroup_ht20
271 rtlefuse->pwrgroup_ht20[rf] 277 [rf][channel - 1]);
272 [channel-1]);
273 } 278 }
274 279
275 if (index < 2) 280 if (index < 2)
@@ -294,9 +299,9 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
294 299
295 for (i = 0; i < 4; i++) { 300 for (i = 0; i < 4; i++) {
296 pwr_diff_limit[i] = 301 pwr_diff_limit[i] =
297 (u8)((rtlphy->mcs_offset 302 (u8)((rtlphy->mcs_txpwrlevel_origoffset
298 [chnlgroup][index + (rf ? 8 : 0)] & 303 [chnlgroup][index + (rf ? 8 : 0)] &
299 (0x7f << (i * 8))) >> (i * 8)); 304 (0x7f << (i * 8))) >> (i * 8));
300 305
301 if (pwr_diff_limit[i] > pwr_diff) 306 if (pwr_diff_limit[i] > pwr_diff)
302 pwr_diff_limit[i] = pwr_diff; 307 pwr_diff_limit[i] = pwr_diff;
@@ -307,29 +312,28 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
307 (pwr_diff_limit[1] << 8) | 312 (pwr_diff_limit[1] << 8) |
308 (pwr_diff_limit[0]); 313 (pwr_diff_limit[0]);
309 314
310 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 315 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
311 "Customer's limit rf(%c) = 0x%x\n", 316 "Customer's limit rf(%c) = 0x%x\n",
312 ((rf == 0) ? 'A' : 'B'), customer_limit); 317 ((rf == 0) ? 'A' : 'B'), customer_limit);
313 318
314 writeval = customer_limit + ((index < 2) ? 319 writeval = customer_limit + ((index < 2) ?
315 powerbase0[rf] : 320 powerbase0[rf] :
316 powerbase1[rf]); 321 powerbase1[rf]);
317 322
318 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 323 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
319 "Customer, writeval rf(%c)= 0x%x\n", 324 "Customer, writeval rf(%c)= 0x%x\n",
320 ((rf == 0) ? 'A' : 'B'), writeval); 325 ((rf == 0) ? 'A' : 'B'), writeval);
321 break; 326 break;
322 default: 327 default:
323 chnlgroup = 0; 328 chnlgroup = 0;
324 writeval = 329 writeval =
325 rtlphy->mcs_offset[chnlgroup] 330 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
326 [index + (rf ? 8 : 0)] 331 [index + (rf ? 8 : 0)]
327 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]); 332 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
328 333
329 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 334 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
330 "RTK better performance, writeval " 335 "RTK better performance, writeval rf(%c) = 0x%x\n",
331 "rf(%c) = 0x%x\n", 336 ((rf == 0) ? 'A' : 'B'), writeval);
332 ((rf == 0) ? 'A' : 'B'), writeval);
333 break; 337 break;
334 } 338 }
335 339
@@ -343,7 +347,7 @@ static void txpwr_by_regulatory(struct ieee80211_hw *hw, u8 channel, u8 index,
343} 347}
344 348
345static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw, 349static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw,
346 u8 index, u32 *value) 350 u8 index, u32 *pvalue)
347{ 351{
348 struct rtl_priv *rtlpriv = rtl_priv(hw); 352 struct rtl_priv *rtlpriv = rtl_priv(hw);
349 u16 regoffset_a[6] = { 353 u16 regoffset_a[6] = {
@@ -361,9 +365,9 @@ static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw,
361 u16 regoffset; 365 u16 regoffset;
362 366
363 for (rf = 0; rf < 2; rf++) { 367 for (rf = 0; rf < 2; rf++) {
364 writeval = value[rf]; 368 writeval = pvalue[rf];
365 for (i = 0; i < 4; i++) { 369 for (i = 0; i < 4; i++) {
366 pwr_val[i] = (u8) ((writeval & (0x7f << 370 pwr_val[i] = (u8)((writeval & (0x7f <<
367 (i * 8))) >> (i * 8)); 371 (i * 8))) >> (i * 8));
368 372
369 if (pwr_val[i] > RF6052_MAX_TX_PWR) 373 if (pwr_val[i] > RF6052_MAX_TX_PWR)
@@ -378,8 +382,8 @@ static void _rtl8723be_write_ofdm_power_reg(struct ieee80211_hw *hw,
378 regoffset = regoffset_b[index]; 382 regoffset = regoffset_b[index];
379 rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval); 383 rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval);
380 384
381 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 385 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
382 "Set 0x%x = %08x\n", regoffset, writeval); 386 "Set 0x%x = %08x\n", regoffset, writeval);
383 } 387 }
384} 388}
385 389
@@ -400,8 +404,11 @@ void rtl8723be_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
400 rtl8723be_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value); 404 rtl8723be_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value);
401 405
402 for (index = 0; index < 6; index++) { 406 for (index = 0; index < 6; index++) {
403 txpwr_by_regulatory(hw, channel, index, &powerbase0[0], 407 _rtl8723be_get_txpower_writeval_by_regulatory(hw,
404 &powerbase1[0], &writeval[0]); 408 channel, index,
409 &powerbase0[0],
410 &powerbase1[0],
411 &writeval[0]);
405 if (direction == 1) { 412 if (direction == 1) {
406 writeval[0] += pwrtrac_value; 413 writeval[0] += pwrtrac_value;
407 writeval[1] += pwrtrac_value; 414 writeval[1] += pwrtrac_value;
@@ -424,16 +431,17 @@ bool rtl8723be_phy_rf6052_config(struct ieee80211_hw *hw)
424 rtlphy->num_total_rfpath = 2; 431 rtlphy->num_total_rfpath = 2;
425 432
426 return _rtl8723be_phy_rf6052_config_parafile(hw); 433 return _rtl8723be_phy_rf6052_config_parafile(hw);
434
427} 435}
428 436
429static bool _rtl8723be_phy_rf6052_config_parafile(struct ieee80211_hw *hw) 437static bool _rtl8723be_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
430{ 438{
431 struct rtl_priv *rtlpriv = rtl_priv(hw); 439 struct rtl_priv *rtlpriv = rtl_priv(hw);
432 struct rtl_phy *rtlphy = &(rtlpriv->phy); 440 struct rtl_phy *rtlphy = &(rtlpriv->phy);
433 struct bb_reg_def *pphyreg;
434 u32 u4_regvalue = 0; 441 u32 u4_regvalue = 0;
435 u8 rfpath; 442 u8 rfpath;
436 bool rtstatus = true; 443 bool rtstatus = true;
444 struct bb_reg_def *pphyreg;
437 445
438 for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) { 446 for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
439 pphyreg = &rtlphy->phyreg_def[rfpath]; 447 pphyreg = &rtlphy->phyreg_def[rfpath];
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
index 532913c6622a..223eb42992bd 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/sw.c
@@ -31,6 +31,7 @@
31#include "phy.h" 31#include "phy.h"
32#include "../rtl8723com/phy_common.h" 32#include "../rtl8723com/phy_common.h"
33#include "dm.h" 33#include "dm.h"
34#include "../rtl8723com/dm_common.h"
34#include "hw.h" 35#include "hw.h"
35#include "fw.h" 36#include "fw.h"
36#include "../rtl8723com/fw_common.h" 37#include "../rtl8723com/fw_common.h"
@@ -101,6 +102,8 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
101 rtlpriv->dm.thermalvalue = 0; 102 rtlpriv->dm.thermalvalue = 0;
102 rtlpci->transmit_config = CFENDFORM | BIT(15) | BIT(24) | BIT(25); 103 rtlpci->transmit_config = CFENDFORM | BIT(15) | BIT(24) | BIT(25);
103 104
105 rtlpriv->phy.lck_inprogress = false;
106
104 mac->ht_enable = true; 107 mac->ht_enable = true;
105 108
106 /* compatible 5G band 88ce just 2.4G band & smsp */ 109 /* compatible 5G band 88ce just 2.4G band & smsp */
@@ -137,12 +140,19 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
137 140
138 rtlpci->irq_mask[1] = (u32)(IMR_RXFOVW | 0); 141 rtlpci->irq_mask[1] = (u32)(IMR_RXFOVW | 0);
139 142
143 rtlpci->sys_irq_mask = (u32)(HSIMR_PDN_INT_EN |
144 HSIMR_RON_INT_EN |
145 0);
146
140 /* for debug level */ 147 /* for debug level */
141 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug; 148 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
142 /* for LPS & IPS */ 149 /* for LPS & IPS */
143 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps; 150 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
144 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps; 151 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
145 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps; 152 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
153 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
154 if (rtlpriv->cfg->mod_params->disable_watchdog)
155 pr_info("watchdog disabled\n");
146 rtlpriv->psc.reg_fwctrl_lps = 3; 156 rtlpriv->psc.reg_fwctrl_lps = 3;
147 rtlpriv->psc.reg_max_lps_awakeintvl = 5; 157 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
148 /* for ASPM, you can close aspm through 158 /* for ASPM, you can close aspm through
@@ -157,6 +167,11 @@ int rtl8723be_init_sw_vars(struct ieee80211_hw *hw)
157 else if (rtlpriv->psc.reg_fwctrl_lps == 3) 167 else if (rtlpriv->psc.reg_fwctrl_lps == 3)
158 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE; 168 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
159 169
170 /*low power: Disable 32k */
171 rtlpriv->psc.low_power_enable = false;
172
173 rtlpriv->rtlhal.earlymode_enable = false;
174
160 /* for firmware buf */ 175 /* for firmware buf */
161 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000); 176 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
162 if (!rtlpriv->rtlhal.pfirmware) { 177 if (!rtlpriv->rtlhal.pfirmware) {
@@ -182,8 +197,6 @@ void rtl8723be_deinit_sw_vars(struct ieee80211_hw *hw)
182{ 197{
183 struct rtl_priv *rtlpriv = rtl_priv(hw); 198 struct rtl_priv *rtlpriv = rtl_priv(hw);
184 199
185 if (rtlpriv->cfg->ops->get_btc_status())
186 rtlpriv->btcoexist.btc_ops->btc_halt_notify();
187 if (rtlpriv->rtlhal.pfirmware) { 200 if (rtlpriv->rtlhal.pfirmware) {
188 vfree(rtlpriv->rtlhal.pfirmware); 201 vfree(rtlpriv->rtlhal.pfirmware);
189 rtlpriv->rtlhal.pfirmware = NULL; 202 rtlpriv->rtlhal.pfirmware = NULL;
@@ -196,7 +209,7 @@ bool rtl8723be_get_btc_status(void)
196 return true; 209 return true;
197} 210}
198 211
199static bool is_fw_header(struct rtl92c_firmware_header *hdr) 212static bool is_fw_header(struct rtl8723e_firmware_header *hdr)
200{ 213{
201 return (hdr->signature & 0xfff0) == 0x5300; 214 return (hdr->signature & 0xfff0) == 0x5300;
202} 215}
@@ -245,6 +258,7 @@ static struct rtl_hal_ops rtl8723be_hal_ops = {
245 .set_rfreg = rtl8723be_phy_set_rf_reg, 258 .set_rfreg = rtl8723be_phy_set_rf_reg,
246 .fill_h2c_cmd = rtl8723be_fill_h2c_cmd, 259 .fill_h2c_cmd = rtl8723be_fill_h2c_cmd,
247 .get_btc_status = rtl8723be_get_btc_status, 260 .get_btc_status = rtl8723be_get_btc_status,
261 .rx_command_packet = rtl8723be_rx_command_packet,
248 .is_fw_header = is_fw_header, 262 .is_fw_header = is_fw_header,
249}; 263};
250 264
@@ -253,8 +267,6 @@ static struct rtl_mod_params rtl8723be_mod_params = {
253 .inactiveps = true, 267 .inactiveps = true,
254 .swctrl_lps = false, 268 .swctrl_lps = false,
255 .fwctrl_lps = true, 269 .fwctrl_lps = true,
256 .msi_support = false,
257 .debug = DBG_EMERG,
258}; 270};
259 271
260static struct rtl_hal_cfg rtl8723be_hal_cfg = { 272static struct rtl_hal_cfg rtl8723be_hal_cfg = {
@@ -272,6 +284,9 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
272 .maps[MAC_RCR_ACRC32] = ACRC32, 284 .maps[MAC_RCR_ACRC32] = ACRC32,
273 .maps[MAC_RCR_ACF] = ACF, 285 .maps[MAC_RCR_ACF] = ACF,
274 .maps[MAC_RCR_AAP] = AAP, 286 .maps[MAC_RCR_AAP] = AAP,
287 .maps[MAC_HIMR] = REG_HIMR,
288 .maps[MAC_HIMRE] = REG_HIMRE,
289 .maps[MAC_HSISR] = REG_HSISR,
275 290
276 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS, 291 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
277 292
@@ -305,6 +320,7 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
305 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3, 320 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
306 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2, 321 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
307 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1, 322 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
323/* .maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8, */ /*need check*/
308 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7, 324 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
309 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6, 325 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
310 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5, 326 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
@@ -312,6 +328,8 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
312 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3, 328 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
313 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2, 329 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
314 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1, 330 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
331/* .maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2,*/
332/* .maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1,*/
315 333
316 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW, 334 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
317 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT, 335 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
@@ -329,6 +347,7 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
329 .maps[RTL_IMR_VIDOK] = IMR_VIDOK, 347 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
330 .maps[RTL_IMR_VODOK] = IMR_VODOK, 348 .maps[RTL_IMR_VODOK] = IMR_VODOK,
331 .maps[RTL_IMR_ROK] = IMR_ROK, 349 .maps[RTL_IMR_ROK] = IMR_ROK,
350 .maps[RTL_IMR_HSISR_IND] = IMR_HSISR_IND_ON_INT,
332 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER), 351 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
333 352
334 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M, 353 .maps[RTL_RC_CCK_RATE1M] = DESC92C_RATE1M,
@@ -348,12 +367,12 @@ static struct rtl_hal_cfg rtl8723be_hal_cfg = {
348 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15, 367 .maps[RTL_RC_HT_RATEMCS15] = DESC92C_RATEMCS15,
349}; 368};
350 369
351static const struct pci_device_id rtl8723be_pci_id[] = { 370static struct pci_device_id rtl8723be_pci_ids[] = {
352 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xb723, rtl8723be_hal_cfg)}, 371 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0xB723, rtl8723be_hal_cfg)},
353 {}, 372 {},
354}; 373};
355 374
356MODULE_DEVICE_TABLE(pci, rtl8723be_pci_id); 375MODULE_DEVICE_TABLE(pci, rtl8723be_pci_ids);
357 376
358MODULE_AUTHOR("PageHe <page_he@realsil.com.cn>"); 377MODULE_AUTHOR("PageHe <page_he@realsil.com.cn>");
359MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>"); 378MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
@@ -366,21 +385,22 @@ module_param_named(debug, rtl8723be_mod_params.debug, int, 0444);
366module_param_named(ips, rtl8723be_mod_params.inactiveps, bool, 0444); 385module_param_named(ips, rtl8723be_mod_params.inactiveps, bool, 0444);
367module_param_named(swlps, rtl8723be_mod_params.swctrl_lps, bool, 0444); 386module_param_named(swlps, rtl8723be_mod_params.swctrl_lps, bool, 0444);
368module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444); 387module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444);
369module_param_named(msi, rtl8723be_mod_params.msi_support, bool, 0444); 388module_param_named(disable_watchdog, rtl8723be_mod_params.disable_watchdog,
389 bool, 0444);
370MODULE_PARM_DESC(swenc, "using hardware crypto (default 0 [hardware])\n"); 390MODULE_PARM_DESC(swenc, "using hardware crypto (default 0 [hardware])\n");
371MODULE_PARM_DESC(ips, "using no link power save (default 1 is open)\n"); 391MODULE_PARM_DESC(ips, "using no link power save (default 1 is open)\n");
372MODULE_PARM_DESC(fwlps, "using linked fw control power save (default 1 is open)\n"); 392MODULE_PARM_DESC(fwlps, "using linked fw control power save (default 1 is open)\n");
373MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n"); 393MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n");
374MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)"); 394MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
395MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
375 396
376static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume); 397static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
377 398
378static struct pci_driver rtl8723be_driver = { 399static struct pci_driver rtl8723be_driver = {
379 .name = KBUILD_MODNAME, 400 .name = KBUILD_MODNAME,
380 .id_table = rtl8723be_pci_id, 401 .id_table = rtl8723be_pci_ids,
381 .probe = rtl_pci_probe, 402 .probe = rtl_pci_probe,
382 .remove = rtl_pci_disconnect, 403 .remove = rtl_pci_disconnect,
383
384 .driver.pm = &rtlwifi_pm_ops, 404 .driver.pm = &rtlwifi_pm_ops,
385}; 405};
386 406
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/table.c b/drivers/net/wireless/rtlwifi/rtl8723be/table.c
index 4b283cde042e..a180761e8810 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/table.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/table.c
@@ -27,200 +27,201 @@
27 27
28#include "table.h" 28#include "table.h"
29u32 RTL8723BEPHY_REG_1TARRAY[] = { 29u32 RTL8723BEPHY_REG_1TARRAY[] = {
30 0x800, 0x80040000, 30 0x800, 0x80040000,
31 0x804, 0x00000003, 31 0x804, 0x00000003,
32 0x808, 0x0000FC00, 32 0x808, 0x0000FC00,
33 0x80C, 0x0000000A, 33 0x80C, 0x0000000A,
34 0x810, 0x10001331, 34 0x810, 0x10001331,
35 0x814, 0x020C3D10, 35 0x814, 0x020C3D10,
36 0x818, 0x02200385, 36 0x818, 0x02200385,
37 0x81C, 0x00000000, 37 0x81C, 0x00000000,
38 0x820, 0x01000100, 38 0x820, 0x01000100,
39 0x824, 0x00390204, 39 0x824, 0x00390204,
40 0x828, 0x00000000, 40 0x828, 0x00000000,
41 0x82C, 0x00000000, 41 0x82C, 0x00000000,
42 0x830, 0x00000000, 42 0x830, 0x00000000,
43 0x834, 0x00000000, 43 0x834, 0x00000000,
44 0x838, 0x00000000, 44 0x838, 0x00000000,
45 0x83C, 0x00000000, 45 0x83C, 0x00000000,
46 0x840, 0x00010000, 46 0x840, 0x00010000,
47 0x844, 0x00000000, 47 0x844, 0x00000000,
48 0x848, 0x00000000, 48 0x848, 0x00000000,
49 0x84C, 0x00000000, 49 0x84C, 0x00000000,
50 0x850, 0x00000000, 50 0x850, 0x00000000,
51 0x854, 0x00000000, 51 0x854, 0x00000000,
52 0x858, 0x569A11A9, 52 0x858, 0x569A11A9,
53 0x85C, 0x01000014, 53 0x85C, 0x01000014,
54 0x860, 0x66F60110, 54 0x860, 0x66F60110,
55 0x864, 0x061F0649, 55 0x864, 0x061F0649,
56 0x868, 0x00000000, 56 0x868, 0x00000000,
57 0x86C, 0x27272700, 57 0x86C, 0x27272700,
58 0x870, 0x07000760, 58 0x870, 0x07000760,
59 0x874, 0x25004000, 59 0x874, 0x25004000,
60 0x878, 0x00000808, 60 0x878, 0x00000808,
61 0x87C, 0x00000000, 61 0x87C, 0x00000000,
62 0x880, 0xB0000C1C, 62 0x880, 0xB0000C1C,
63 0x884, 0x00000001, 63 0x884, 0x00000001,
64 0x888, 0x00000000, 64 0x888, 0x00000000,
65 0x88C, 0xCCC000C0, 65 0x88C, 0xCCC000C0,
66 0x890, 0x00000800, 66 0x890, 0x00000800,
67 0x894, 0xFFFFFFFE, 67 0x894, 0xFFFFFFFE,
68 0x898, 0x40302010, 68 0x898, 0x40302010,
69 0x89C, 0x00706050, 69 0x89C, 0x00706050,
70 0x900, 0x00000000, 70 0x900, 0x00000000,
71 0x904, 0x00000023, 71 0x904, 0x00000023,
72 0x908, 0x00000000, 72 0x908, 0x00000000,
73 0x90C, 0x81121111, 73 0x90C, 0x81121111,
74 0x910, 0x00000002, 74 0x910, 0x00000002,
75 0x914, 0x00000201, 75 0x914, 0x00000201,
76 0x948, 0x00000000, 76 0x948, 0x00000280,
77 0xA00, 0x00D047C8, 77 0xA00, 0x00D047C8,
78 0xA04, 0x80FF000C, 78 0xA04, 0x80FF000C,
79 0xA08, 0x8C838300, 79 0xA08, 0x8C838300,
80 0xA0C, 0x2E7F120F, 80 0xA0C, 0x2E7F120F,
81 0xA10, 0x9500BB78, 81 0xA10, 0x9500BB78,
82 0xA14, 0x1114D028, 82 0xA14, 0x1114D028,
83 0xA18, 0x00881117, 83 0xA18, 0x00881117,
84 0xA1C, 0x89140F00, 84 0xA1C, 0x89140F00,
85 0xA20, 0x1A1B0000, 85 0xA20, 0x1A1B0000,
86 0xA24, 0x090E1317, 86 0xA24, 0x090E1317,
87 0xA28, 0x00000204, 87 0xA28, 0x00000204,
88 0xA2C, 0x00D30000, 88 0xA2C, 0x00D30000,
89 0xA70, 0x101FBF00, 89 0xA70, 0x101FBF00,
90 0xA74, 0x00000007, 90 0xA74, 0x00000007,
91 0xA78, 0x00000900, 91 0xA78, 0x00000900,
92 0xA7C, 0x225B0606, 92 0xA7C, 0x225B0606,
93 0xA80, 0x21806490, 93 0xA80, 0x21806490,
94 0xB2C, 0x00000000, 94 0xB2C, 0x00000000,
95 0xC00, 0x48071D40, 95 0xC00, 0x48071D40,
96 0xC04, 0x03A05611, 96 0xC04, 0x03A05611,
97 0xC08, 0x000000E4, 97 0xC08, 0x000000E4,
98 0xC0C, 0x6C6C6C6C, 98 0xC0C, 0x6C6C6C6C,
99 0xC10, 0x08800000, 99 0xC10, 0x08800000,
100 0xC14, 0x40000100, 100 0xC14, 0x40000100,
101 0xC18, 0x08800000, 101 0xC18, 0x08800000,
102 0xC1C, 0x40000100, 102 0xC1C, 0x40000100,
103 0xC20, 0x00000000, 103 0xC20, 0x00000000,
104 0xC24, 0x00000000, 104 0xC24, 0x00000000,
105 0xC28, 0x00000000, 105 0xC28, 0x00000000,
106 0xC2C, 0x00000000, 106 0xC2C, 0x00000000,
107 0xC30, 0x69E9AC44, 107 0xC30, 0x69E9AC44,
108 0xC34, 0x469652AF, 108 0xC34, 0x469652AF,
109 0xC38, 0x49795994, 109 0xC38, 0x49795994,
110 0xC3C, 0x0A97971C, 110 0xC3C, 0x0A97971C,
111 0xC40, 0x1F7C403F, 111 0xC40, 0x1F7C403F,
112 0xC44, 0x000100B7, 112 0xC44, 0x000100B7,
113 0xC48, 0xEC020107, 113 0xC48, 0xEC020107,
114 0xC4C, 0x007F037F, 114 0xC4C, 0x007F037F,
115 0xC50, 0x69553420, 115 0xC50, 0x69553420,
116 0xC54, 0x43BC0094, 116 0xC54, 0x43BC0094,
117 0xC58, 0x00023169, 117 0xC58, 0x00023169,
118 0xC5C, 0x00250492, 118 0xC5C, 0x00250492,
119 0xC60, 0x00000000, 119 0xC60, 0x00000000,
120 0xC64, 0x7112848B, 120 0xC64, 0x7112848B,
121 0xC68, 0x47C00BFF, 121 0xC68, 0x47C00BFF,
122 0xC6C, 0x00000036, 122 0xC6C, 0x00000036,
123 0xC70, 0x2C7F000D, 123 0xC70, 0x2C7F000D,
124 0xC74, 0x020610DB, 124 0xC74, 0x020610DB,
125 0xC78, 0x0000001F, 125 0xC78, 0x0000001F,
126 0xC7C, 0x00B91612, 126 0xC7C, 0x00B91612,
127 0xC80, 0x390000E4, 127 0xC80, 0x390000E4,
128 0xC84, 0x20F60000, 128 0xC84, 0x20F60000,
129 0xC88, 0x40000100, 129 0xC88, 0x40000100,
130 0xC8C, 0x20200000, 130 0xC8C, 0x20200000,
131 0xC90, 0x00020E1A, 131 0xC90, 0x00020E1A,
132 0xC94, 0x00000000, 132 0xC94, 0x00000000,
133 0xC98, 0x00020E1A, 133 0xC98, 0x00020E1A,
134 0xC9C, 0x00007F7F, 134 0xC9C, 0x00007F7F,
135 0xCA0, 0x00000000, 135 0xCA0, 0x00000000,
136 0xCA4, 0x000300A0, 136 0xCA4, 0x000300A0,
137 0xCA8, 0x00000000, 137 0xCA8, 0x00000000,
138 0xCAC, 0x00000000, 138 0xCAC, 0x00000000,
139 0xCB0, 0x00000000, 139 0xCB0, 0x00000000,
140 0xCB4, 0x00000000, 140 0xCB4, 0x00000000,
141 0xCB8, 0x00000000, 141 0xCB8, 0x00000000,
142 0xCBC, 0x28000000, 142 0xCBC, 0x28000000,
143 0xCC0, 0x00000000, 143 0xCC0, 0x00000000,
144 0xCC4, 0x00000000, 144 0xCC4, 0x00000000,
145 0xCC8, 0x00000000, 145 0xCC8, 0x00000000,
146 0xCCC, 0x00000000, 146 0xCCC, 0x00000000,
147 0xCD0, 0x00000000, 147 0xCD0, 0x00000000,
148 0xCD4, 0x00000000, 148 0xCD4, 0x00000000,
149 0xCD8, 0x64B22427, 149 0xCD8, 0x64B22427,
150 0xCDC, 0x00766932, 150 0xCDC, 0x00766932,
151 0xCE0, 0x00222222, 151 0xCE0, 0x00222222,
152 0xCE4, 0x00000000, 152 0xCE4, 0x00000000,
153 0xCE8, 0x37644302, 153 0xCE8, 0x37644302,
154 0xCEC, 0x2F97D40C, 154 0xCEC, 0x2F97D40C,
155 0xD00, 0x00000740, 155 0xD00, 0x00000740,
156 0xD04, 0x40020401, 156 0xD04, 0x40020401,
157 0xD08, 0x0000907F, 157 0xD08, 0x0000907F,
158 0xD0C, 0x20010201, 158 0xD0C, 0x20010201,
159 0xD10, 0xA0633333, 159 0xD10, 0xA0633333,
160 0xD14, 0x3333BC53, 160 0xD14, 0x3333BC53,
161 0xD18, 0x7A8F5B6F, 161 0xD18, 0x7A8F5B6F,
162 0xD2C, 0xCC979975, 162 0xD2C, 0xCC979975,
163 0xD30, 0x00000000, 163 0xD30, 0x00000000,
164 0xD34, 0x80608000, 164 0xD34, 0x80608000,
165 0xD38, 0x00000000, 165 0xD38, 0x00000000,
166 0xD3C, 0x00127353, 166 0xD3C, 0x00127353,
167 0xD40, 0x00000000, 167 0xD40, 0x00000000,
168 0xD44, 0x00000000, 168 0xD44, 0x00000000,
169 0xD48, 0x00000000, 169 0xD48, 0x00000000,
170 0xD4C, 0x00000000, 170 0xD4C, 0x00000000,
171 0xD50, 0x6437140A, 171 0xD50, 0x6437140A,
172 0xD54, 0x00000000, 172 0xD54, 0x00000000,
173 0xD58, 0x00000282, 173 0xD58, 0x00000282,
174 0xD5C, 0x30032064, 174 0xD5C, 0x30032064,
175 0xD60, 0x4653DE68, 175 0xD60, 0x4653DE68,
176 0xD64, 0x04518A3C, 176 0xD64, 0x04518A3C,
177 0xD68, 0x00002101, 177 0xD68, 0x00002101,
178 0xD6C, 0x2A201C16, 178 0xD6C, 0x2A201C16,
179 0xD70, 0x1812362E, 179 0xD70, 0x1812362E,
180 0xD74, 0x322C2220, 180 0xD74, 0x322C2220,
181 0xD78, 0x000E3C24, 181 0xD78, 0x000E3C24,
182 0xE00, 0x2D2D2D2D, 182 0xE00, 0x2D2D2D2D,
183 0xE04, 0x2D2D2D2D, 183 0xE04, 0x2D2D2D2D,
184 0xE08, 0x0390272D, 184 0xE08, 0x0390272D,
185 0xE10, 0x2D2D2D2D, 185 0xE10, 0x2D2D2D2D,
186 0xE14, 0x2D2D2D2D, 186 0xE14, 0x2D2D2D2D,
187 0xE18, 0x2D2D2D2D, 187 0xE18, 0x2D2D2D2D,
188 0xE1C, 0x2D2D2D2D, 188 0xE1C, 0x2D2D2D2D,
189 0xE28, 0x00000000, 189 0xE28, 0x00000000,
190 0xE30, 0x1000DC1F, 190 0xE30, 0x1000DC1F,
191 0xE34, 0x10008C1F, 191 0xE34, 0x10008C1F,
192 0xE38, 0x02140102, 192 0xE38, 0x02140102,
193 0xE3C, 0x681604C2, 193 0xE3C, 0x681604C2,
194 0xE40, 0x01007C00, 194 0xE40, 0x01007C00,
195 0xE44, 0x01004800, 195 0xE44, 0x01004800,
196 0xE48, 0xFB000000, 196 0xE48, 0xFB000000,
197 0xE4C, 0x000028D1, 197 0xE4C, 0x000028D1,
198 0xE50, 0x1000DC1F, 198 0xE50, 0x1000DC1F,
199 0xE54, 0x10008C1F, 199 0xE54, 0x10008C1F,
200 0xE58, 0x02140102, 200 0xE58, 0x02140102,
201 0xE5C, 0x28160D05, 201 0xE5C, 0x28160D05,
202 0xE60, 0x00000008, 202 0xE60, 0x00000008,
203 0xE68, 0x001B2556, 203 0xE68, 0x001B2556,
204 0xE6C, 0x00C00096, 204 0xE6C, 0x00C00096,
205 0xE70, 0x00C00096, 205 0xE70, 0x00C00096,
206 0xE74, 0x01000056, 206 0xE74, 0x01000056,
207 0xE78, 0x01000014, 207 0xE78, 0x01000014,
208 0xE7C, 0x01000056, 208 0xE7C, 0x01000056,
209 0xE80, 0x01000014, 209 0xE80, 0x01000014,
210 0xE84, 0x00C00096, 210 0xE84, 0x00C00096,
211 0xE88, 0x01000056, 211 0xE88, 0x01000056,
212 0xE8C, 0x00C00096, 212 0xE8C, 0x00C00096,
213 0xED0, 0x00C00096, 213 0xED0, 0x00C00096,
214 0xED4, 0x00C00096, 214 0xED4, 0x00C00096,
215 0xED8, 0x00C00096, 215 0xED8, 0x00C00096,
216 0xEDC, 0x000000D6, 216 0xEDC, 0x000000D6,
217 0xEE0, 0x000000D6, 217 0xEE0, 0x000000D6,
218 0xEEC, 0x01C00016, 218 0xEEC, 0x01C00016,
219 0xF14, 0x00000003, 219 0xF14, 0x00000003,
220 0xF4C, 0x00000000, 220 0xF4C, 0x00000000,
221 0xF00, 0x00000300, 221 0xF00, 0x00000300,
222 0x820, 0x01000100, 222 0x820, 0x01000100,
223 0x800, 0x83040000, 223 0x800, 0x83040000,
224
224}; 225};
225 226
226u32 RTL8723BEPHY_REG_ARRAY_PG[] = { 227u32 RTL8723BEPHY_REG_ARRAY_PG[] = {
@@ -233,340 +234,344 @@ u32 RTL8723BEPHY_REG_ARRAY_PG[] = {
233}; 234};
234 235
235u32 RTL8723BE_RADIOA_1TARRAY[] = { 236u32 RTL8723BE_RADIOA_1TARRAY[] = {
236 0x000, 0x00010000, 237 0x000, 0x00010000,
237 0x0B0, 0x000DFFE0, 238 0x0B0, 0x000DFFE0,
238 0x0FE, 0x00000000, 239 0x0FE, 0x00000000,
239 0x0FE, 0x00000000, 240 0x0FE, 0x00000000,
240 0x0FE, 0x00000000, 241 0x0FE, 0x00000000,
241 0x0B1, 0x00000018, 242 0x0B1, 0x00000018,
242 0x0FE, 0x00000000, 243 0x0FE, 0x00000000,
243 0x0FE, 0x00000000, 244 0x0FE, 0x00000000,
244 0x0FE, 0x00000000, 245 0x0FE, 0x00000000,
245 0x0B2, 0x00084C00, 246 0x0B2, 0x00084C00,
246 0x0B5, 0x0000D2CC, 247 0x0B5, 0x0000D2CC,
247 0x0B6, 0x000925AA, 248 0x0B6, 0x000925AA,
248 0x0B7, 0x00000010, 249 0x0B7, 0x00000010,
249 0x0B8, 0x0000907F, 250 0x0B8, 0x0000907F,
250 0x05C, 0x00000002, 251 0x05C, 0x00000002,
251 0x07C, 0x00000002, 252 0x07C, 0x00000002,
252 0x07E, 0x00000005, 253 0x07E, 0x00000005,
253 0x08B, 0x0006FC00, 254 0x08B, 0x0006FC00,
254 0x0B0, 0x000FF9F0, 255 0x0B0, 0x000FF9F0,
255 0x01C, 0x000739D2, 256 0x01C, 0x000739D2,
256 0x01E, 0x00000000, 257 0x01E, 0x00000000,
257 0x0DF, 0x00000780, 258 0x0DF, 0x00000780,
258 0x050, 0x00067435, 259 0x050, 0x00067435,
259 0x051, 0x0006B04E, 260 0x051, 0x0006B04E,
260 0x052, 0x000007D2, 261 0x052, 0x000007D2,
261 0x053, 0x00000000, 262 0x053, 0x00000000,
262 0x054, 0x00050400, 263 0x054, 0x00050400,
263 0x055, 0x0004026E, 264 0x055, 0x0004026E,
264 0x0DD, 0x0000004C, 265 0x0DD, 0x0000004C,
265 0x070, 0x00067435, 266 0x070, 0x00067435,
266 0x071, 0x0006B04E, 267 0x071, 0x0006B04E,
267 0x072, 0x000007D2, 268 0x072, 0x000007D2,
268 0x073, 0x00000000, 269 0x073, 0x00000000,
269 0x074, 0x00050400, 270 0x074, 0x00050400,
270 0x075, 0x0004026E, 271 0x075, 0x0004026E,
271 0x0EF, 0x00000100, 272 0x0EF, 0x00000100,
272 0x034, 0x0000ADD7, 273 0x034, 0x0000ADD7,
273 0x035, 0x00005C00, 274 0x035, 0x00005C00,
274 0x034, 0x00009DD4, 275 0x034, 0x00009DD4,
275 0x035, 0x00005000, 276 0x035, 0x00005000,
276 0x034, 0x00008DD1, 277 0x034, 0x00008DD1,
277 0x035, 0x00004400, 278 0x035, 0x00004400,
278 0x034, 0x00007DCE, 279 0x034, 0x00007DCE,
279 0x035, 0x00003800, 280 0x035, 0x00003800,
280 0x034, 0x00006CD1, 281 0x034, 0x00006CD1,
281 0x035, 0x00004400, 282 0x035, 0x00004400,
282 0x034, 0x00005CCE, 283 0x034, 0x00005CCE,
283 0x035, 0x00003800, 284 0x035, 0x00003800,
284 0x034, 0x000048CE, 285 0x034, 0x000048CE,
285 0x035, 0x00004400, 286 0x035, 0x00004400,
286 0x034, 0x000034CE, 287 0x034, 0x000034CE,
287 0x035, 0x00003800, 288 0x035, 0x00003800,
288 0x034, 0x00002451, 289 0x034, 0x00002451,
289 0x035, 0x00004400, 290 0x035, 0x00004400,
290 0x034, 0x0000144E, 291 0x034, 0x0000144E,
291 0x035, 0x00003800, 292 0x035, 0x00003800,
292 0x034, 0x00000051, 293 0x034, 0x00000051,
293 0x035, 0x00004400, 294 0x035, 0x00004400,
294 0x0EF, 0x00000000, 295 0x0EF, 0x00000000,
295 0x0EF, 0x00000100, 296 0x0EF, 0x00000100,
296 0x0ED, 0x00000010, 297 0x0ED, 0x00000010,
297 0x044, 0x0000ADD7, 298 0x044, 0x0000ADD7,
298 0x044, 0x00009DD4, 299 0x044, 0x00009DD4,
299 0x044, 0x00008DD1, 300 0x044, 0x00008DD1,
300 0x044, 0x00007DCE, 301 0x044, 0x00007DCE,
301 0x044, 0x00006CC1, 302 0x044, 0x00006CC1,
302 0x044, 0x00005CCE, 303 0x044, 0x00005CCE,
303 0x044, 0x000044D1, 304 0x044, 0x000044D1,
304 0x044, 0x000034CE, 305 0x044, 0x000034CE,
305 0x044, 0x00002451, 306 0x044, 0x00002451,
306 0x044, 0x0000144E, 307 0x044, 0x0000144E,
307 0x044, 0x00000051, 308 0x044, 0x00000051,
308 0x0EF, 0x00000000, 309 0x0EF, 0x00000000,
309 0x0ED, 0x00000000, 310 0x0ED, 0x00000000,
310 0x0EF, 0x00002000, 311 0x0EF, 0x00002000,
311 0x03B, 0x000380EF, 312 0x03B, 0x000380EF,
312 0x03B, 0x000302FE, 313 0x03B, 0x000302FE,
313 0x03B, 0x00028CE6, 314 0x03B, 0x00028CE6,
314 0x03B, 0x000200BC, 315 0x03B, 0x000200BC,
315 0x03B, 0x000188A5, 316 0x03B, 0x000188A5,
316 0x03B, 0x00010FBC, 317 0x03B, 0x00010FBC,
317 0x03B, 0x00008F71, 318 0x03B, 0x00008F71,
318 0x03B, 0x00000900, 319 0x03B, 0x00000900,
319 0x0EF, 0x00000000, 320 0x0EF, 0x00000000,
320 0x0ED, 0x00000001, 321 0x0ED, 0x00000001,
321 0x040, 0x000380EF, 322 0x040, 0x000380EF,
322 0x040, 0x000302FE, 323 0x040, 0x000302FE,
323 0x040, 0x00028CE6, 324 0x040, 0x00028CE6,
324 0x040, 0x000200BC, 325 0x040, 0x000200BC,
325 0x040, 0x000188A5, 326 0x040, 0x000188A5,
326 0x040, 0x00010FBC, 327 0x040, 0x00010FBC,
327 0x040, 0x00008F71, 328 0x040, 0x00008F71,
328 0x040, 0x00000900, 329 0x040, 0x00000900,
329 0x0ED, 0x00000000, 330 0x0ED, 0x00000000,
330 0x082, 0x00080000, 331 0x082, 0x00080000,
331 0x083, 0x00008000, 332 0x083, 0x00008000,
332 0x084, 0x00048D80, 333 0x084, 0x00048D80,
333 0x085, 0x00068000, 334 0x085, 0x00068000,
334 0x0A2, 0x00080000, 335 0x0A2, 0x00080000,
335 0x0A3, 0x00008000, 336 0x0A3, 0x00008000,
336 0x0A4, 0x00048D80, 337 0x0A4, 0x00048D80,
337 0x0A5, 0x00068000, 338 0x0A5, 0x00068000,
338 0x000, 0x00033D80, 339 0x000, 0x00033D80,
340
339}; 341};
340 342
341u32 RTL8723BEMAC_1T_ARRAY[] = { 343u32 RTL8723BEMAC_1T_ARRAY[] = {
342 0x02F, 0x00000030, 344 0x02F, 0x00000030,
343 0x035, 0x00000000, 345 0x035, 0x00000000,
344 0x428, 0x0000000A, 346 0x067, 0x00000020,
345 0x429, 0x00000010, 347 0x428, 0x0000000A,
346 0x430, 0x00000000, 348 0x429, 0x00000010,
347 0x431, 0x00000000, 349 0x430, 0x00000000,
348 0x432, 0x00000000, 350 0x431, 0x00000000,
349 0x433, 0x00000001, 351 0x432, 0x00000000,
350 0x434, 0x00000004, 352 0x433, 0x00000001,
351 0x435, 0x00000005, 353 0x434, 0x00000004,
352 0x436, 0x00000007, 354 0x435, 0x00000005,
353 0x437, 0x00000008, 355 0x436, 0x00000007,
354 0x43C, 0x00000004, 356 0x437, 0x00000008,
355 0x43D, 0x00000005, 357 0x43C, 0x00000004,
356 0x43E, 0x00000007, 358 0x43D, 0x00000005,
357 0x43F, 0x00000008, 359 0x43E, 0x00000007,
358 0x440, 0x0000005D, 360 0x43F, 0x00000008,
359 0x441, 0x00000001, 361 0x440, 0x0000005D,
360 0x442, 0x00000000, 362 0x441, 0x00000001,
361 0x444, 0x00000010, 363 0x442, 0x00000000,
362 0x445, 0x00000000, 364 0x444, 0x00000010,
363 0x446, 0x00000000, 365 0x445, 0x00000000,
364 0x447, 0x00000000, 366 0x446, 0x00000000,
365 0x448, 0x00000000, 367 0x447, 0x00000000,
366 0x449, 0x000000F0, 368 0x448, 0x00000000,
367 0x44A, 0x0000000F, 369 0x449, 0x000000F0,
368 0x44B, 0x0000003E, 370 0x44A, 0x0000000F,
369 0x44C, 0x00000010, 371 0x44B, 0x0000003E,
370 0x44D, 0x00000000, 372 0x44C, 0x00000010,
371 0x44E, 0x00000000, 373 0x44D, 0x00000000,
372 0x44F, 0x00000000, 374 0x44E, 0x00000000,
373 0x450, 0x00000000, 375 0x44F, 0x00000000,
374 0x451, 0x000000F0, 376 0x450, 0x00000000,
375 0x452, 0x0000000F, 377 0x451, 0x000000F0,
376 0x453, 0x00000000, 378 0x452, 0x0000000F,
377 0x456, 0x0000005E, 379 0x453, 0x00000000,
378 0x460, 0x00000066, 380 0x456, 0x0000005E,
379 0x461, 0x00000066, 381 0x460, 0x00000066,
380 0x4C8, 0x000000FF, 382 0x461, 0x00000066,
381 0x4C9, 0x00000008, 383 0x4C8, 0x000000FF,
382 0x4CC, 0x000000FF, 384 0x4C9, 0x00000008,
383 0x4CD, 0x000000FF, 385 0x4CC, 0x000000FF,
384 0x4CE, 0x00000001, 386 0x4CD, 0x000000FF,
385 0x500, 0x00000026, 387 0x4CE, 0x00000001,
386 0x501, 0x000000A2, 388 0x500, 0x00000026,
387 0x502, 0x0000002F, 389 0x501, 0x000000A2,
388 0x503, 0x00000000, 390 0x502, 0x0000002F,
389 0x504, 0x00000028, 391 0x503, 0x00000000,
390 0x505, 0x000000A3, 392 0x504, 0x00000028,
391 0x506, 0x0000005E, 393 0x505, 0x000000A3,
392 0x507, 0x00000000, 394 0x506, 0x0000005E,
393 0x508, 0x0000002B, 395 0x507, 0x00000000,
394 0x509, 0x000000A4, 396 0x508, 0x0000002B,
395 0x50A, 0x0000005E, 397 0x509, 0x000000A4,
396 0x50B, 0x00000000, 398 0x50A, 0x0000005E,
397 0x50C, 0x0000004F, 399 0x50B, 0x00000000,
398 0x50D, 0x000000A4, 400 0x50C, 0x0000004F,
399 0x50E, 0x00000000, 401 0x50D, 0x000000A4,
400 0x50F, 0x00000000, 402 0x50E, 0x00000000,
401 0x512, 0x0000001C, 403 0x50F, 0x00000000,
402 0x514, 0x0000000A, 404 0x512, 0x0000001C,
403 0x516, 0x0000000A, 405 0x514, 0x0000000A,
404 0x525, 0x0000004F, 406 0x516, 0x0000000A,
405 0x550, 0x00000010, 407 0x525, 0x0000004F,
406 0x551, 0x00000010, 408 0x550, 0x00000010,
407 0x559, 0x00000002, 409 0x551, 0x00000010,
408 0x55C, 0x00000050, 410 0x559, 0x00000002,
409 0x55D, 0x000000FF, 411 0x55C, 0x00000050,
410 0x605, 0x00000030, 412 0x55D, 0x000000FF,
411 0x608, 0x0000000E, 413 0x605, 0x00000030,
412 0x609, 0x0000002A, 414 0x608, 0x0000000E,
413 0x620, 0x000000FF, 415 0x609, 0x0000002A,
414 0x621, 0x000000FF, 416 0x620, 0x000000FF,
415 0x622, 0x000000FF, 417 0x621, 0x000000FF,
416 0x623, 0x000000FF, 418 0x622, 0x000000FF,
417 0x624, 0x000000FF, 419 0x623, 0x000000FF,
418 0x625, 0x000000FF, 420 0x624, 0x000000FF,
419 0x626, 0x000000FF, 421 0x625, 0x000000FF,
420 0x627, 0x000000FF, 422 0x626, 0x000000FF,
421 0x638, 0x00000050, 423 0x627, 0x000000FF,
422 0x63C, 0x0000000A, 424 0x638, 0x00000050,
423 0x63D, 0x0000000A, 425 0x63C, 0x0000000A,
424 0x63E, 0x0000000E, 426 0x63D, 0x0000000A,
425 0x63F, 0x0000000E, 427 0x63E, 0x0000000E,
426 0x640, 0x00000040, 428 0x63F, 0x0000000E,
427 0x642, 0x00000040, 429 0x640, 0x00000040,
428 0x643, 0x00000000, 430 0x642, 0x00000040,
429 0x652, 0x000000C8, 431 0x643, 0x00000000,
430 0x66E, 0x00000005, 432 0x652, 0x000000C8,
431 0x700, 0x00000021, 433 0x66E, 0x00000005,
432 0x701, 0x00000043, 434 0x700, 0x00000021,
433 0x702, 0x00000065, 435 0x701, 0x00000043,
434 0x703, 0x00000087, 436 0x702, 0x00000065,
435 0x708, 0x00000021, 437 0x703, 0x00000087,
436 0x709, 0x00000043, 438 0x708, 0x00000021,
437 0x70A, 0x00000065, 439 0x709, 0x00000043,
438 0x70B, 0x00000087, 440 0x70A, 0x00000065,
441 0x70B, 0x00000087,
442
439}; 443};
440 444
441u32 RTL8723BEAGCTAB_1TARRAY[] = { 445u32 RTL8723BEAGCTAB_1TARRAY[] = {
442 0xC78, 0xFD000001, 446 0xC78, 0xFD000001,
443 0xC78, 0xFC010001, 447 0xC78, 0xFC010001,
444 0xC78, 0xFB020001, 448 0xC78, 0xFB020001,
445 0xC78, 0xFA030001, 449 0xC78, 0xFA030001,
446 0xC78, 0xF9040001, 450 0xC78, 0xF9040001,
447 0xC78, 0xF8050001, 451 0xC78, 0xF8050001,
448 0xC78, 0xF7060001, 452 0xC78, 0xF7060001,
449 0xC78, 0xF6070001, 453 0xC78, 0xF6070001,
450 0xC78, 0xF5080001, 454 0xC78, 0xF5080001,
451 0xC78, 0xF4090001, 455 0xC78, 0xF4090001,
452 0xC78, 0xF30A0001, 456 0xC78, 0xF30A0001,
453 0xC78, 0xF20B0001, 457 0xC78, 0xF20B0001,
454 0xC78, 0xF10C0001, 458 0xC78, 0xF10C0001,
455 0xC78, 0xF00D0001, 459 0xC78, 0xF00D0001,
456 0xC78, 0xEF0E0001, 460 0xC78, 0xEF0E0001,
457 0xC78, 0xEE0F0001, 461 0xC78, 0xEE0F0001,
458 0xC78, 0xED100001, 462 0xC78, 0xED100001,
459 0xC78, 0xEC110001, 463 0xC78, 0xEC110001,
460 0xC78, 0xEB120001, 464 0xC78, 0xEB120001,
461 0xC78, 0xEA130001, 465 0xC78, 0xEA130001,
462 0xC78, 0xE9140001, 466 0xC78, 0xE9140001,
463 0xC78, 0xE8150001, 467 0xC78, 0xE8150001,
464 0xC78, 0xE7160001, 468 0xC78, 0xE7160001,
465 0xC78, 0xAA170001, 469 0xC78, 0xAA170001,
466 0xC78, 0xA9180001, 470 0xC78, 0xA9180001,
467 0xC78, 0xA8190001, 471 0xC78, 0xA8190001,
468 0xC78, 0xA71A0001, 472 0xC78, 0xA71A0001,
469 0xC78, 0xA61B0001, 473 0xC78, 0xA61B0001,
470 0xC78, 0xA51C0001, 474 0xC78, 0xA51C0001,
471 0xC78, 0xA41D0001, 475 0xC78, 0xA41D0001,
472 0xC78, 0xA31E0001, 476 0xC78, 0xA31E0001,
473 0xC78, 0x671F0001, 477 0xC78, 0x671F0001,
474 0xC78, 0x66200001, 478 0xC78, 0x66200001,
475 0xC78, 0x65210001, 479 0xC78, 0x65210001,
476 0xC78, 0x64220001, 480 0xC78, 0x64220001,
477 0xC78, 0x63230001, 481 0xC78, 0x63230001,
478 0xC78, 0x62240001, 482 0xC78, 0x62240001,
479 0xC78, 0x61250001, 483 0xC78, 0x61250001,
480 0xC78, 0x47260001, 484 0xC78, 0x47260001,
481 0xC78, 0x46270001, 485 0xC78, 0x46270001,
482 0xC78, 0x45280001, 486 0xC78, 0x45280001,
483 0xC78, 0x44290001, 487 0xC78, 0x44290001,
484 0xC78, 0x432A0001, 488 0xC78, 0x432A0001,
485 0xC78, 0x422B0001, 489 0xC78, 0x422B0001,
486 0xC78, 0x292C0001, 490 0xC78, 0x292C0001,
487 0xC78, 0x282D0001, 491 0xC78, 0x282D0001,
488 0xC78, 0x272E0001, 492 0xC78, 0x272E0001,
489 0xC78, 0x262F0001, 493 0xC78, 0x262F0001,
490 0xC78, 0x25300001, 494 0xC78, 0x25300001,
491 0xC78, 0x24310001, 495 0xC78, 0x24310001,
492 0xC78, 0x09320001, 496 0xC78, 0x09320001,
493 0xC78, 0x08330001, 497 0xC78, 0x08330001,
494 0xC78, 0x07340001, 498 0xC78, 0x07340001,
495 0xC78, 0x06350001, 499 0xC78, 0x06350001,
496 0xC78, 0x05360001, 500 0xC78, 0x05360001,
497 0xC78, 0x04370001, 501 0xC78, 0x04370001,
498 0xC78, 0x03380001, 502 0xC78, 0x03380001,
499 0xC78, 0x02390001, 503 0xC78, 0x02390001,
500 0xC78, 0x013A0001, 504 0xC78, 0x013A0001,
501 0xC78, 0x003B0001, 505 0xC78, 0x003B0001,
502 0xC78, 0x003C0001, 506 0xC78, 0x003C0001,
503 0xC78, 0x003D0001, 507 0xC78, 0x003D0001,
504 0xC78, 0x003E0001, 508 0xC78, 0x003E0001,
505 0xC78, 0x003F0001, 509 0xC78, 0x003F0001,
506 0xC78, 0xFC400001, 510 0xC78, 0xFC400001,
507 0xC78, 0xFB410001, 511 0xC78, 0xFB410001,
508 0xC78, 0xFA420001, 512 0xC78, 0xFA420001,
509 0xC78, 0xF9430001, 513 0xC78, 0xF9430001,
510 0xC78, 0xF8440001, 514 0xC78, 0xF8440001,
511 0xC78, 0xF7450001, 515 0xC78, 0xF7450001,
512 0xC78, 0xF6460001, 516 0xC78, 0xF6460001,
513 0xC78, 0xF5470001, 517 0xC78, 0xF5470001,
514 0xC78, 0xF4480001, 518 0xC78, 0xF4480001,
515 0xC78, 0xF3490001, 519 0xC78, 0xF3490001,
516 0xC78, 0xF24A0001, 520 0xC78, 0xF24A0001,
517 0xC78, 0xF14B0001, 521 0xC78, 0xF14B0001,
518 0xC78, 0xF04C0001, 522 0xC78, 0xF04C0001,
519 0xC78, 0xEF4D0001, 523 0xC78, 0xEF4D0001,
520 0xC78, 0xEE4E0001, 524 0xC78, 0xEE4E0001,
521 0xC78, 0xED4F0001, 525 0xC78, 0xED4F0001,
522 0xC78, 0xEC500001, 526 0xC78, 0xEC500001,
523 0xC78, 0xEB510001, 527 0xC78, 0xEB510001,
524 0xC78, 0xEA520001, 528 0xC78, 0xEA520001,
525 0xC78, 0xE9530001, 529 0xC78, 0xE9530001,
526 0xC78, 0xE8540001, 530 0xC78, 0xE8540001,
527 0xC78, 0xE7550001, 531 0xC78, 0xE7550001,
528 0xC78, 0xE6560001, 532 0xC78, 0xE6560001,
529 0xC78, 0xE5570001, 533 0xC78, 0xE5570001,
530 0xC78, 0xAA580001, 534 0xC78, 0xAA580001,
531 0xC78, 0xA9590001, 535 0xC78, 0xA9590001,
532 0xC78, 0xA85A0001, 536 0xC78, 0xA85A0001,
533 0xC78, 0xA75B0001, 537 0xC78, 0xA75B0001,
534 0xC78, 0xA65C0001, 538 0xC78, 0xA65C0001,
535 0xC78, 0xA55D0001, 539 0xC78, 0xA55D0001,
536 0xC78, 0xA45E0001, 540 0xC78, 0xA45E0001,
537 0xC78, 0x675F0001, 541 0xC78, 0x675F0001,
538 0xC78, 0x66600001, 542 0xC78, 0x66600001,
539 0xC78, 0x65610001, 543 0xC78, 0x65610001,
540 0xC78, 0x64620001, 544 0xC78, 0x64620001,
541 0xC78, 0x63630001, 545 0xC78, 0x63630001,
542 0xC78, 0x62640001, 546 0xC78, 0x62640001,
543 0xC78, 0x61650001, 547 0xC78, 0x61650001,
544 0xC78, 0x47660001, 548 0xC78, 0x47660001,
545 0xC78, 0x46670001, 549 0xC78, 0x46670001,
546 0xC78, 0x45680001, 550 0xC78, 0x45680001,
547 0xC78, 0x44690001, 551 0xC78, 0x44690001,
548 0xC78, 0x436A0001, 552 0xC78, 0x436A0001,
549 0xC78, 0x426B0001, 553 0xC78, 0x426B0001,
550 0xC78, 0x296C0001, 554 0xC78, 0x296C0001,
551 0xC78, 0x286D0001, 555 0xC78, 0x286D0001,
552 0xC78, 0x276E0001, 556 0xC78, 0x276E0001,
553 0xC78, 0x266F0001, 557 0xC78, 0x266F0001,
554 0xC78, 0x25700001, 558 0xC78, 0x25700001,
555 0xC78, 0x24710001, 559 0xC78, 0x24710001,
556 0xC78, 0x09720001, 560 0xC78, 0x09720001,
557 0xC78, 0x08730001, 561 0xC78, 0x08730001,
558 0xC78, 0x07740001, 562 0xC78, 0x07740001,
559 0xC78, 0x06750001, 563 0xC78, 0x06750001,
560 0xC78, 0x05760001, 564 0xC78, 0x05760001,
561 0xC78, 0x04770001, 565 0xC78, 0x04770001,
562 0xC78, 0x03780001, 566 0xC78, 0x03780001,
563 0xC78, 0x02790001, 567 0xC78, 0x02790001,
564 0xC78, 0x017A0001, 568 0xC78, 0x017A0001,
565 0xC78, 0x007B0001, 569 0xC78, 0x007B0001,
566 0xC78, 0x007C0001, 570 0xC78, 0x007C0001,
567 0xC78, 0x007D0001, 571 0xC78, 0x007D0001,
568 0xC78, 0x007E0001, 572 0xC78, 0x007E0001,
569 0xC78, 0x007F0001, 573 0xC78, 0x007F0001,
570 0xC50, 0x69553422, 574 0xC50, 0x69553422,
571 0xC50, 0x69553420, 575 0xC50, 0x69553420,
576
572}; 577};
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/table.h b/drivers/net/wireless/rtlwifi/rtl8723be/table.h
index 932760a84827..dc17001632f7 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/table.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/table.h
@@ -35,7 +35,7 @@ extern u32 RTL8723BEPHY_REG_1TARRAY[];
35extern u32 RTL8723BEPHY_REG_ARRAY_PG[]; 35extern u32 RTL8723BEPHY_REG_ARRAY_PG[];
36#define RTL8723BE_RADIOA_1TARRAYLEN 206 36#define RTL8723BE_RADIOA_1TARRAYLEN 206
37extern u32 RTL8723BE_RADIOA_1TARRAY[]; 37extern u32 RTL8723BE_RADIOA_1TARRAY[];
38#define RTL8723BEMAC_1T_ARRAYLEN 194 38#define RTL8723BEMAC_1T_ARRAYLEN 196
39extern u32 RTL8723BEMAC_1T_ARRAY[]; 39extern u32 RTL8723BEMAC_1T_ARRAY[];
40#define RTL8723BEAGCTAB_1TARRAYLEN 260 40#define RTL8723BEAGCTAB_1TARRAYLEN 260
41extern u32 RTL8723BEAGCTAB_1TARRAY[]; 41extern u32 RTL8723BEAGCTAB_1TARRAY[];
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/trx.c b/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
index 969eaea5eddd..d6a1c70cb657 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/trx.c
@@ -33,6 +33,7 @@
33#include "trx.h" 33#include "trx.h"
34#include "led.h" 34#include "led.h"
35#include "dm.h" 35#include "dm.h"
36#include "fw.h"
36 37
37static u8 _rtl8723be_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue) 38static u8 _rtl8723be_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
38{ 39{
@@ -207,196 +208,150 @@ static int _rtl8723be_rate_mapping(struct ieee80211_hw *hw,
207static void _rtl8723be_query_rxphystatus(struct ieee80211_hw *hw, 208static void _rtl8723be_query_rxphystatus(struct ieee80211_hw *hw,
208 struct rtl_stats *pstatus, u8 *pdesc, 209 struct rtl_stats *pstatus, u8 *pdesc,
209 struct rx_fwinfo_8723be *p_drvinfo, 210 struct rx_fwinfo_8723be *p_drvinfo,
210 bool packet_match_bssid, 211 bool bpacket_match_bssid,
211 bool packet_toself, 212 bool bpacket_toself,
212 bool packet_beacon) 213 bool packet_beacon)
213{ 214{
214 struct rtl_priv *rtlpriv = rtl_priv(hw); 215 struct rtl_priv *rtlpriv = rtl_priv(hw);
215 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
216 struct phy_sts_cck_8723e_t *cck_buf;
217 struct phy_status_rpt *p_phystrpt = (struct phy_status_rpt *)p_drvinfo; 216 struct phy_status_rpt *p_phystrpt = (struct phy_status_rpt *)p_drvinfo;
218 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
219 char rx_pwr_all = 0, rx_pwr[4]; 217 char rx_pwr_all = 0, rx_pwr[4];
220 u8 rf_rx_num = 0, evm, pwdb_all; 218 u8 rf_rx_num = 0, evm, pwdb_all, pwdb_all_bt = 0;
221 u8 i, max_spatial_stream; 219 u8 i, max_spatial_stream;
222 u32 rssi, total_rssi = 0; 220 u32 rssi, total_rssi = 0;
223 bool is_cck = pstatus->is_cck; 221 bool is_cck = pstatus->is_cck;
224 u8 lan_idx, vga_idx; 222 u8 lan_idx, vga_idx;
225 223
226 /* Record it for next packet processing */ 224 /* Record it for next packet processing */
227 pstatus->packet_matchbssid = packet_match_bssid; 225 pstatus->packet_matchbssid = bpacket_match_bssid;
228 pstatus->packet_toself = packet_toself; 226 pstatus->packet_toself = bpacket_toself;
229 pstatus->packet_beacon = packet_beacon; 227 pstatus->packet_beacon = packet_beacon;
230 pstatus->rx_mimo_sig_qual[0] = -1; 228 pstatus->rx_mimo_signalquality[0] = -1;
231 pstatus->rx_mimo_sig_qual[1] = -1; 229 pstatus->rx_mimo_signalquality[1] = -1;
232 230
233 if (is_cck) { 231 if (is_cck) {
234 u8 cck_highpwr; 232 u8 cck_highpwr;
235 u8 cck_agc_rpt; 233 u8 cck_agc_rpt;
236 /* CCK Driver info Structure is not the same as OFDM packet. */
237 cck_buf = (struct phy_sts_cck_8723e_t *)p_drvinfo;
238 cck_agc_rpt = cck_buf->cck_agc_rpt;
239 234
240 /* (1)Hardware does not provide RSSI for CCK 235 cck_agc_rpt = p_phystrpt->cck_agc_rpt_ofdm_cfosho_a;
241 * (2)PWDB, Average PWDB cacluated by 236
237 /* (1)Hardware does not provide RSSI for CCK */
238 /* (2)PWDB, Average PWDB cacluated by
242 * hardware (for rate adaptive) 239 * hardware (for rate adaptive)
243 */ 240 */
244 if (ppsc->rfpwr_state == ERFON) 241 cck_highpwr = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2,
245 cck_highpwr = (u8) rtl_get_bbreg(hw, 242 BIT(9));
246 RFPGA0_XA_HSSIPARAMETER2,
247 BIT(9));
248 else
249 cck_highpwr = false;
250 243
251 lan_idx = ((cck_agc_rpt & 0xE0) >> 5); 244 lan_idx = ((cck_agc_rpt & 0xE0) >> 5);
252 vga_idx = (cck_agc_rpt & 0x1f); 245 vga_idx = (cck_agc_rpt & 0x1f);
246
253 switch (lan_idx) { 247 switch (lan_idx) {
254 case 7: 248 /* 46 53 73 95 201301231630 */
255 if (vga_idx <= 27)/*VGA_idx = 27~2*/ 249 /* 46 53 77 99 201301241630 */
256 rx_pwr_all = -100 + 2 * (27 - vga_idx); 250 case 6:
257 else 251 rx_pwr_all = -34 - (2 * vga_idx);
258 rx_pwr_all = -100;
259 break; 252 break;
260 case 6:/*VGA_idx = 2~0*/ 253 case 4:
261 rx_pwr_all = -48 + 2 * (2 - vga_idx); 254 rx_pwr_all = -14 - (2 * vga_idx);
262 break;
263 case 5:/*VGA_idx = 7~5*/
264 rx_pwr_all = -42 + 2 * (7 - vga_idx);
265 break;
266 case 4:/*VGA_idx = 7~4*/
267 rx_pwr_all = -36 + 2 * (7 - vga_idx);
268 break;
269 case 3:/*VGA_idx = 7~0*/
270 rx_pwr_all = -24 + 2 * (7 - vga_idx);
271 break;
272 case 2:
273 if (cck_highpwr)/*VGA_idx = 5~0*/
274 rx_pwr_all = -12 + 2 * (5 - vga_idx);
275 else
276 rx_pwr_all = -6 + 2 * (5 - vga_idx);
277 break; 255 break;
278 case 1: 256 case 1:
279 rx_pwr_all = 8 - 2 * vga_idx; 257 rx_pwr_all = 6 - (2 * vga_idx);
280 break; 258 break;
281 case 0: 259 case 0:
282 rx_pwr_all = 14 - 2 * vga_idx; 260 rx_pwr_all = 16 - (2 * vga_idx);
283 break; 261 break;
284 default: 262 default:
285 break; 263 break;
286 } 264 }
287 rx_pwr_all += 6; 265
288 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all); 266 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
289 /* CCK gain is smaller than OFDM/MCS gain, */
290 /* so we add gain diff by experiences,
291 * the val is 6
292 */
293 pwdb_all += 6;
294 if (pwdb_all > 100) 267 if (pwdb_all > 100)
295 pwdb_all = 100; 268 pwdb_all = 100;
296 /* modify the offset to make the same gain index with OFDM. */
297 if (pwdb_all > 34 && pwdb_all <= 42)
298 pwdb_all -= 2;
299 else if (pwdb_all > 26 && pwdb_all <= 34)
300 pwdb_all -= 6;
301 else if (pwdb_all > 14 && pwdb_all <= 26)
302 pwdb_all -= 8;
303 else if (pwdb_all > 4 && pwdb_all <= 14)
304 pwdb_all -= 4;
305 if (!cck_highpwr) {
306 if (pwdb_all >= 80)
307 pwdb_all = ((pwdb_all - 80) << 1) +
308 ((pwdb_all - 80) >> 1) + 80;
309 else if ((pwdb_all <= 78) && (pwdb_all >= 20))
310 pwdb_all += 3;
311 if (pwdb_all > 100)
312 pwdb_all = 100;
313 }
314 269
315 pstatus->rx_pwdb_all = pwdb_all; 270 pstatus->rx_pwdb_all = pwdb_all;
271 pstatus->bt_rx_rssi_percentage = pwdb_all;
316 pstatus->recvsignalpower = rx_pwr_all; 272 pstatus->recvsignalpower = rx_pwr_all;
317 273
318 /* (3) Get Signal Quality (EVM) */ 274 /* (3) Get Signal Quality (EVM) */
319 if (packet_match_bssid) { 275 if (bpacket_match_bssid) {
320 u8 sq; 276 u8 sq, sq_rpt;
321
322 if (pstatus->rx_pwdb_all > 40) { 277 if (pstatus->rx_pwdb_all > 40) {
323 sq = 100; 278 sq = 100;
324 } else { 279 } else {
325 sq = cck_buf->sq_rpt; 280 sq_rpt = p_phystrpt->cck_sig_qual_ofdm_pwdb_all;
326 if (sq > 64) 281 if (sq_rpt > 64)
327 sq = 0; 282 sq = 0;
328 else if (sq < 20) 283 else if (sq_rpt < 20)
329 sq = 100; 284 sq = 100;
330 else 285 else
331 sq = ((64 - sq) * 100) / 44; 286 sq = ((64 - sq_rpt) * 100) / 44;
332 } 287 }
333
334 pstatus->signalquality = sq; 288 pstatus->signalquality = sq;
335 pstatus->rx_mimo_sig_qual[0] = sq; 289 pstatus->rx_mimo_signalquality[0] = sq;
336 pstatus->rx_mimo_sig_qual[1] = -1; 290 pstatus->rx_mimo_signalquality[1] = -1;
337 } 291 }
338 } else { 292 } else {
339 rtlpriv->dm.rfpath_rxenable[0] = true;
340 rtlpriv->dm.rfpath_rxenable[1] = true;
341
342 /* (1)Get RSSI for HT rate */ 293 /* (1)Get RSSI for HT rate */
343 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) { 294 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
344 /* we will judge RF RX path now. */ 295 /* we will judge RF RX path now. */
345 if (rtlpriv->dm.rfpath_rxenable[i]) 296 if (rtlpriv->dm.rfpath_rxenable[i])
346 rf_rx_num++; 297 rf_rx_num++;
347 298
348 rx_pwr[i] = ((p_drvinfo->gain_trsw[i] & 0x3f)*2) - 110; 299 rx_pwr[i] = ((p_phystrpt->path_agc[i].gain & 0x3f) * 2)
300 - 110;
349 301
302 pstatus->rx_pwr[i] = rx_pwr[i];
350 /* Translate DBM to percentage. */ 303 /* Translate DBM to percentage. */
351 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]); 304 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
352 total_rssi += rssi; 305 total_rssi += rssi;
353 306
354 /* Get Rx snr value in DB */ 307 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
355 rtlpriv->stats.rx_snr_db[i] =
356 (long)(p_drvinfo->rxsnr[i] / 2);
357
358 /* Record Signal Strength for next packet */
359 if (packet_match_bssid)
360 pstatus->rx_mimo_signalstrength[i] = (u8) rssi;
361 } 308 }
362 309
363 /* (2)PWDB, Avg cacluated by hardware (for rate adaptive) */ 310 /* (2)PWDB, Average PWDB cacluated by
364 rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 110; 311 * hardware (for rate adaptive)
312 */
313 rx_pwr_all = ((p_phystrpt->cck_sig_qual_ofdm_pwdb_all >> 1) &
314 0x7f) - 110;
365 315
366 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all); 316 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
317 pwdb_all_bt = pwdb_all;
367 pstatus->rx_pwdb_all = pwdb_all; 318 pstatus->rx_pwdb_all = pwdb_all;
319 pstatus->bt_rx_rssi_percentage = pwdb_all_bt;
368 pstatus->rxpower = rx_pwr_all; 320 pstatus->rxpower = rx_pwr_all;
369 pstatus->recvsignalpower = rx_pwr_all; 321 pstatus->recvsignalpower = rx_pwr_all;
370 322
371 /* (3)EVM of HT rate */ 323 /* (3)EVM of HT rate */
372 if (pstatus->is_ht && pstatus->rate >= DESC92C_RATEMCS8 && 324 if (pstatus->rate >= DESC92C_RATEMCS8 &&
373 pstatus->rate <= DESC92C_RATEMCS15) 325 pstatus->rate <= DESC92C_RATEMCS15)
374 max_spatial_stream = 2; 326 max_spatial_stream = 2;
375 else 327 else
376 max_spatial_stream = 1; 328 max_spatial_stream = 1;
377 329
378 for (i = 0; i < max_spatial_stream; i++) { 330 for (i = 0; i < max_spatial_stream; i++) {
379 evm = rtl_evm_db_to_percentage(p_drvinfo->rxevm[i]); 331 evm = rtl_evm_db_to_percentage(
332 p_phystrpt->stream_rxevm[i]);
380 333
381 if (packet_match_bssid) { 334 if (bpacket_match_bssid) {
382 /* Fill value in RFD, Get the first 335 /* Fill value in RFD, Get the first
383 * spatial stream only 336 * spatial stream only
384 */ 337 */
385 if (i == 0) 338 if (i == 0)
386 pstatus->signalquality = 339 pstatus->signalquality =
387 (u8) (evm & 0xff); 340 (u8)(evm & 0xff);
388 pstatus->rx_mimo_sig_qual[i] = 341 pstatus->rx_mimo_signalquality[i] =
389 (u8) (evm & 0xff); 342 (u8)(evm & 0xff);
390 } 343 }
391 } 344 }
392 if (packet_match_bssid) { 345
346 if (bpacket_match_bssid) {
393 for (i = RF90_PATH_A; i <= RF90_PATH_B; i++) 347 for (i = RF90_PATH_A; i <= RF90_PATH_B; i++)
394 rtl_priv(hw)->dm.cfo_tail[i] = 348 rtl_priv(hw)->dm.cfo_tail[i] =
395 (char)p_phystrpt->path_cfotail[i]; 349 (int)p_phystrpt->path_cfotail[i];
396 350
397 rtl_priv(hw)->dm.packet_count++;
398 if (rtl_priv(hw)->dm.packet_count == 0xffffffff) 351 if (rtl_priv(hw)->dm.packet_count == 0xffffffff)
399 rtl_priv(hw)->dm.packet_count = 0; 352 rtl_priv(hw)->dm.packet_count = 0;
353 else
354 rtl_priv(hw)->dm.packet_count++;
400 } 355 }
401 } 356 }
402 357
@@ -409,10 +364,6 @@ static void _rtl8723be_query_rxphystatus(struct ieee80211_hw *hw,
409 else if (rf_rx_num != 0) 364 else if (rf_rx_num != 0)
410 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw, 365 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
411 total_rssi /= rf_rx_num)); 366 total_rssi /= rf_rx_num));
412 /*HW antenna diversity*/
413 rtldm->fat_table.antsel_rx_keep_0 = p_phystrpt->ant_sel;
414 rtldm->fat_table.antsel_rx_keep_1 = p_phystrpt->ant_sel_b;
415 rtldm->fat_table.antsel_rx_keep_2 = p_phystrpt->antsel_rx_keep_2;
416} 367}
417 368
418static void _rtl8723be_translate_rx_signal_stuff(struct ieee80211_hw *hw, 369static void _rtl8723be_translate_rx_signal_stuff(struct ieee80211_hw *hw,
@@ -440,14 +391,14 @@ static void _rtl8723be_translate_rx_signal_stuff(struct ieee80211_hw *hw,
440 memcpy(pstatus->psaddr, psaddr, ETH_ALEN); 391 memcpy(pstatus->psaddr, psaddr, ETH_ALEN);
441 392
442 packet_matchbssid = ((IEEE80211_FTYPE_CTL != type) && 393 packet_matchbssid = ((IEEE80211_FTYPE_CTL != type) &&
443 (!ether_addr_equal(mac->bssid, (fc & IEEE80211_FCTL_TODS) ? 394 (ether_addr_equal(mac->bssid, (fc & IEEE80211_FCTL_TODS) ?
444 hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS) ? 395 hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS) ?
445 hdr->addr2 : hdr->addr3)) && 396 hdr->addr2 : hdr->addr3)) &&
446 (!pstatus->hwerror) && 397 (!pstatus->hwerror) &&
447 (!pstatus->crc) && (!pstatus->icv)); 398 (!pstatus->crc) && (!pstatus->icv));
448 399
449 packet_toself = packet_matchbssid && 400 packet_toself = packet_matchbssid &&
450 (!ether_addr_equal(praddr, rtlefuse->dev_addr)); 401 (ether_addr_equal(praddr, rtlefuse->dev_addr));
451 402
452 /* YP: packet_beacon is not initialized, 403 /* YP: packet_beacon is not initialized,
453 * this assignment is neccesary, 404 * this assignment is neccesary,
@@ -531,30 +482,33 @@ bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
531 struct ieee80211_hdr *hdr; 482 struct ieee80211_hdr *hdr;
532 483
533 u32 phystatus = GET_RX_DESC_PHYST(pdesc); 484 u32 phystatus = GET_RX_DESC_PHYST(pdesc);
534 status->packet_report_type = (u8)GET_RX_STATUS_DESC_RPT_SEL(pdesc); 485
535 if (status->packet_report_type == TX_REPORT2) 486 status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
536 status->length = (u16) GET_RX_RPT2_DESC_PKT_LEN(pdesc); 487 status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
537 else
538 status->length = (u16) GET_RX_DESC_PKT_LEN(pdesc);
539 status->rx_drvinfo_size = (u8) GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
540 RX_DRV_INFO_SIZE_UNIT; 488 RX_DRV_INFO_SIZE_UNIT;
541 status->rx_bufshift = (u8) (GET_RX_DESC_SHIFT(pdesc) & 0x03); 489 status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
542 status->icv = (u16) GET_RX_DESC_ICV(pdesc); 490 status->icv = (u16) GET_RX_DESC_ICV(pdesc);
543 status->crc = (u16) GET_RX_DESC_CRC32(pdesc); 491 status->crc = (u16) GET_RX_DESC_CRC32(pdesc);
544 status->hwerror = (status->crc | status->icv); 492 status->hwerror = (status->crc | status->icv);
545 status->decrypted = !GET_RX_DESC_SWDEC(pdesc); 493 status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
546 status->rate = (u8) GET_RX_DESC_RXMCS(pdesc); 494 status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
547 status->shortpreamble = (u16) GET_RX_DESC_SPLCP(pdesc); 495 status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc);
548 status->isampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1); 496 status->isampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
549 status->isfirst_ampdu = (bool) (GET_RX_DESC_PAGGR(pdesc) == 1); 497 status->isfirst_ampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
550 if (status->packet_report_type == NORMAL_RX) 498 status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
551 status->timestamp_low = GET_RX_DESC_TSFL(pdesc); 499 status->rx_is40Mhzpacket = (bool)GET_RX_DESC_BW(pdesc);
552 status->rx_is40Mhzpacket = (bool) GET_RX_DESC_BW(pdesc); 500 status->bandwidth = (u8)GET_RX_DESC_BW(pdesc);
501 status->macid = GET_RX_DESC_MACID(pdesc);
553 status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc); 502 status->is_ht = (bool)GET_RX_DESC_RXHT(pdesc);
554 503
555 status->is_cck = RTL8723E_RX_HAL_IS_CCK_RATE(status->rate); 504 status->is_cck = RX_HAL_IS_CCK_RATE(status->rate);
505
506 if (GET_RX_STATUS_DESC_RPT_SEL(pdesc))
507 status->packet_report_type = C2H_PACKET;
508 else
509 status->packet_report_type = NORMAL_RX;
510
556 511
557 status->macid = GET_RX_DESC_MACID(pdesc);
558 if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc)) 512 if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
559 status->wake_match = BIT(2); 513 status->wake_match = BIT(2);
560 else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc)) 514 else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
@@ -565,12 +519,11 @@ bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
565 status->wake_match = 0; 519 status->wake_match = 0;
566 if (status->wake_match) 520 if (status->wake_match)
567 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD, 521 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
568 "GGGGGGGGGGGGGet Wakeup Packet!! WakeMatch=%d\n", 522 "GGGGGGGGGGGGGet Wakeup Packet!! WakeMatch=%d\n",
569 status->wake_match); 523 status->wake_match);
570 rx_status->freq = hw->conf.chandef.chan->center_freq; 524 rx_status->freq = hw->conf.chandef.chan->center_freq;
571 rx_status->band = hw->conf.chandef.chan->band; 525 rx_status->band = hw->conf.chandef.chan->band;
572 526
573
574 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size + 527 hdr = (struct ieee80211_hdr *)(skb->data + status->rx_drvinfo_size +
575 status->rx_bufshift); 528 status->rx_bufshift);
576 529
@@ -594,24 +547,16 @@ bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
594 * to decrypt it 547 * to decrypt it
595 */ 548 */
596 if (status->decrypted) { 549 if (status->decrypted) {
597 if (!hdr) { 550 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
598 WARN_ON_ONCE(true);
599 pr_err("decrypted is true but hdr NULL in skb %p\n",
600 rtl_get_hdr(skb));
601 return false;
602 }
603
604 if ((_ieee80211_is_robust_mgmt_frame(hdr)) &&
605 (ieee80211_has_protected(hdr->frame_control))) 551 (ieee80211_has_protected(hdr->frame_control)))
606 rx_status->flag &= ~RX_FLAG_DECRYPTED;
607 else
608 rx_status->flag |= RX_FLAG_DECRYPTED; 552 rx_status->flag |= RX_FLAG_DECRYPTED;
553 else
554 rx_status->flag &= ~RX_FLAG_DECRYPTED;
609 } 555 }
610 556
611 /* rate_idx: index of data rate into band's 557 /* rate_idx: index of data rate into band's
612 * supported rates or MCS index if HT rates 558 * supported rates or MCS index if HT rates
613 * are use (RX_FLAG_HT) 559 * are use (RX_FLAG_HT)
614 * Notice: this is diff with windows define
615 */ 560 */
616 rx_status->rate_idx = _rtl8723be_rate_mapping(hw, status->is_ht, 561 rx_status->rate_idx = _rtl8723be_rate_mapping(hw, status->is_ht,
617 status->rate); 562 status->rate);
@@ -624,21 +569,19 @@ bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
624 _rtl8723be_translate_rx_signal_stuff(hw, skb, status, 569 _rtl8723be_translate_rx_signal_stuff(hw, skb, status,
625 pdesc, p_drvinfo); 570 pdesc, p_drvinfo);
626 } 571 }
627
628 /*rx_status->qual = status->signal; */
629 rx_status->signal = status->recvsignalpower + 10; 572 rx_status->signal = status->recvsignalpower + 10;
630 if (status->packet_report_type == TX_REPORT2) { 573 if (status->packet_report_type == TX_REPORT2) {
631 status->macid_valid_entry[0] = 574 status->macid_valid_entry[0] =
632 GET_RX_RPT2_DESC_MACID_VALID_1(pdesc); 575 GET_RX_RPT2_DESC_MACID_VALID_1(pdesc);
633 status->macid_valid_entry[1] = 576 status->macid_valid_entry[1] =
634 GET_RX_RPT2_DESC_MACID_VALID_2(pdesc); 577 GET_RX_RPT2_DESC_MACID_VALID_2(pdesc);
635 } 578 }
636 return true; 579 return true;
637} 580}
638 581
639void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw, 582void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
640 struct ieee80211_hdr *hdr, u8 *pdesc_tx, 583 struct ieee80211_hdr *hdr, u8 *pdesc_tx,
641 u8 *pbd_desc_tx, struct ieee80211_tx_info *info, 584 u8 *txbd, struct ieee80211_tx_info *info,
642 struct ieee80211_sta *sta, struct sk_buff *skb, 585 struct ieee80211_sta *sta, struct sk_buff *skb,
643 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc) 586 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
644{ 587{
@@ -646,16 +589,16 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
646 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 589 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
647 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 590 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
648 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 591 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
649 u8 *pdesc = pdesc_tx; 592 u8 *pdesc = (u8 *)pdesc_tx;
650 u16 seq_number; 593 u16 seq_number;
651 __le16 fc = hdr->frame_control; 594 __le16 fc = hdr->frame_control;
652 unsigned int buf_len = 0; 595 unsigned int buf_len = 0;
653 unsigned int skb_len = skb->len; 596 unsigned int skb_len = skb->len;
654 u8 fw_qsel = _rtl8723be_map_hwqueue_to_fwqueue(skb, hw_queue); 597 u8 fw_qsel = _rtl8723be_map_hwqueue_to_fwqueue(skb, hw_queue);
655 bool firstseg = ((hdr->seq_ctrl & 598 bool firstseg = ((hdr->seq_ctrl &
656 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0); 599 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
657 bool lastseg = ((hdr->frame_control & 600 bool lastseg = ((hdr->frame_control &
658 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0); 601 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
659 dma_addr_t mapping; 602 dma_addr_t mapping;
660 u8 bw_40 = 0; 603 u8 bw_40 = 0;
661 u8 short_gi = 0; 604 u8 short_gi = 0;
@@ -732,11 +675,11 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
732 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) : 675 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
733 (ptcb_desc->rts_use_shortgi ? 1 : 0))); 676 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
734 677
735 if (ptcb_desc->btx_enable_sw_calc_duration) 678 if (ptcb_desc->tx_enable_sw_calc_duration)
736 SET_TX_DESC_NAV_USE_HDR(pdesc, 1); 679 SET_TX_DESC_NAV_USE_HDR(pdesc, 1);
737 680
738 if (bw_40) { 681 if (bw_40) {
739 if (ptcb_desc->packet_bw) { 682 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
740 SET_TX_DESC_DATA_BW(pdesc, 1); 683 SET_TX_DESC_DATA_BW(pdesc, 1);
741 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3); 684 SET_TX_DESC_TX_SUB_CARRIER(pdesc, 3);
742 } else { 685 } else {
@@ -776,9 +719,12 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
776 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F); 719 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
777 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF); 720 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
778 SET_TX_DESC_DISABLE_FB(pdesc, ptcb_desc->disable_ratefallback ? 721 SET_TX_DESC_DISABLE_FB(pdesc, ptcb_desc->disable_ratefallback ?
779 1 : 0); 722 1 : 0);
780 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0); 723 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
781 724
725 /* Set TxRate and RTSRate in TxDesc */
726 /* This prevent Tx initial rate of new-coming packets */
727 /* from being overwritten by retried packet rate.*/
782 if (ieee80211_is_data_qos(fc)) { 728 if (ieee80211_is_data_qos(fc)) {
783 if (mac->rdg_en) { 729 if (mac->rdg_en) {
784 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, 730 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
@@ -793,9 +739,14 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
793 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0)); 739 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
794 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) buf_len); 740 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16) buf_len);
795 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping); 741 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
796 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index); 742 /* if (rtlpriv->dm.useramask) { */
797 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id); 743 if (1) {
798 744 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
745 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
746 } else {
747 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
748 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
749 }
799 if (!ieee80211_is_data_qos(fc)) { 750 if (!ieee80211_is_data_qos(fc)) {
800 SET_TX_DESC_HWSEQ_EN(pdesc, 1); 751 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
801 SET_TX_DESC_HWSEQ_SEL(pdesc, 0); 752 SET_TX_DESC_HWSEQ_SEL(pdesc, 0);
@@ -805,11 +756,12 @@ void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
805 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) { 756 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
806 SET_TX_DESC_BMC(pdesc, 1); 757 SET_TX_DESC_BMC(pdesc, 1);
807 } 758 }
759
808 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n"); 760 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
809} 761}
810 762
811void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, 763void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
812 bool b_firstseg, bool b_lastseg, 764 bool firstseg, bool lastseg,
813 struct sk_buff *skb) 765 struct sk_buff *skb)
814{ 766{
815 struct rtl_priv *rtlpriv = rtl_priv(hw); 767 struct rtl_priv *rtlpriv = rtl_priv(hw);
@@ -849,16 +801,19 @@ void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
849 801
850 SET_TX_DESC_OWN(pdesc, 1); 802 SET_TX_DESC_OWN(pdesc, 1);
851 803
852 SET_TX_DESC_PKT_SIZE(pdesc, (u16)(skb->len)); 804 SET_TX_DESC_PKT_SIZE((u8 *)pdesc, (u16)(skb->len));
853 805
854 SET_TX_DESC_FIRST_SEG(pdesc, 1); 806 SET_TX_DESC_FIRST_SEG(pdesc, 1);
855 SET_TX_DESC_LAST_SEG(pdesc, 1); 807 SET_TX_DESC_LAST_SEG(pdesc, 1);
856 808
857 SET_TX_DESC_USE_RATE(pdesc, 1); 809 SET_TX_DESC_USE_RATE(pdesc, 1);
810
811 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
812 "H2C Tx Cmd Content\n", pdesc, TX_DESC_SIZE);
858} 813}
859 814
860void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, 815void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
861 u8 desc_name, u8 *val) 816 bool istx, u8 desc_name, u8 *val)
862{ 817{
863 if (istx) { 818 if (istx) {
864 switch (desc_name) { 819 switch (desc_name) {
@@ -870,7 +825,7 @@ void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
870 break; 825 break;
871 default: 826 default:
872 RT_ASSERT(false, "ERR txdesc :%d not process\n", 827 RT_ASSERT(false, "ERR txdesc :%d not process\n",
873 desc_name); 828 desc_name);
874 break; 829 break;
875 } 830 }
876 } else { 831 } else {
@@ -889,7 +844,7 @@ void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx,
889 break; 844 break;
890 default: 845 default:
891 RT_ASSERT(false, "ERR rxdesc :%d not process\n", 846 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
892 desc_name); 847 desc_name);
893 break; 848 break;
894 } 849 }
895 } 850 }
@@ -909,7 +864,7 @@ u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name)
909 break; 864 break;
910 default: 865 default:
911 RT_ASSERT(false, "ERR txdesc :%d not process\n", 866 RT_ASSERT(false, "ERR txdesc :%d not process\n",
912 desc_name); 867 desc_name);
913 break; 868 break;
914 } 869 }
915 } else { 870 } else {
@@ -920,6 +875,9 @@ u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name)
920 case HW_DESC_RXPKT_LEN: 875 case HW_DESC_RXPKT_LEN:
921 ret = GET_RX_DESC_PKT_LEN(pdesc); 876 ret = GET_RX_DESC_PKT_LEN(pdesc);
922 break; 877 break;
878 case HW_DESC_RXBUFF_ADDR:
879 ret = GET_RX_DESC_BUFF_ADDR(pdesc);
880 break;
923 default: 881 default:
924 RT_ASSERT(false, "ERR rxdesc :%d not process\n", 882 RT_ASSERT(false, "ERR rxdesc :%d not process\n",
925 desc_name); 883 desc_name);
@@ -935,16 +893,15 @@ bool rtl8723be_is_tx_desc_closed(struct ieee80211_hw *hw,
935 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 893 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
936 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue]; 894 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
937 u8 *entry = (u8 *)(&ring->desc[ring->idx]); 895 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
938 u8 own = (u8) rtl8723be_get_desc(entry, true, HW_DESC_OWN); 896 u8 own = (u8)rtl8723be_get_desc(entry, true, HW_DESC_OWN);
939 897
940 /*beacon packet will only use the first 898 /*beacon packet will only use the first
941 *descriptor by default, and the own may not 899 *descriptor defautly,and the own may not
942 *be cleared by the hardware 900 *be cleared by the hardware
943 */ 901 */
944 if (own) 902 if (own)
945 return false; 903 return false;
946 else 904 return true;
947 return true;
948} 905}
949 906
950void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue) 907void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
@@ -957,3 +914,28 @@ void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
957 BIT(0) << (hw_queue)); 914 BIT(0) << (hw_queue));
958 } 915 }
959} 916}
917
918u32 rtl8723be_rx_command_packet(struct ieee80211_hw *hw,
919 struct rtl_stats status,
920 struct sk_buff *skb)
921{
922 u32 result = 0;
923 struct rtl_priv *rtlpriv = rtl_priv(hw);
924
925 switch (status.packet_report_type) {
926 case NORMAL_RX:
927 result = 0;
928 break;
929 case C2H_PACKET:
930 rtl8723be_c2h_packet_handler(hw, skb->data,
931 (u8)skb->len);
932 result = 1;
933 break;
934 default:
935 RT_TRACE(rtlpriv, COMP_RECV, DBG_TRACE,
936 "No this packet type!!\n");
937 break;
938 }
939
940 return result;
941}
diff --git a/drivers/net/wireless/rtlwifi/rtl8723be/trx.h b/drivers/net/wireless/rtlwifi/rtl8723be/trx.h
index 102f33dcc988..45949ac4854c 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723be/trx.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723be/trx.h
@@ -415,21 +415,25 @@ struct phy_status_rpt {
415} __packed; 415} __packed;
416 416
417struct rx_fwinfo_8723be { 417struct rx_fwinfo_8723be {
418 u8 gain_trsw[4]; 418 u8 gain_trsw[2];
419 u16 chl_num:10;
420 u16 sub_chnl:4;
421 u16 r_rfmod:2;
419 u8 pwdb_all; 422 u8 pwdb_all;
420 u8 cfosho[4]; 423 u8 cfosho[4];
421 u8 cfotail[4]; 424 u8 cfotail[4];
422 char rxevm[2]; 425 char rxevm[2];
423 char rxsnr[4]; 426 char rxsnr[2];
427 u8 pcts_msk_rpt[2];
424 u8 pdsnr[2]; 428 u8 pdsnr[2];
425 u8 csi_current[2]; 429 u8 csi_current[2];
426 u8 csi_target[2]; 430 u8 rx_gain_c;
431 u8 rx_gain_d;
427 u8 sigevm; 432 u8 sigevm;
428 u8 max_ex_pwr; 433 u8 resvd_0;
429 u8 ex_intf_flag:1; 434 u8 antidx_anta:3;
430 u8 sgi_en:1; 435 u8 antidx_antb:3;
431 u8 rxsc:2; 436 u8 resvd_1:2;
432 u8 reserve:4;
433} __packed; 437} __packed;
434 438
435struct tx_desc_8723be { 439struct tx_desc_8723be {
@@ -597,21 +601,25 @@ struct rx_desc_8723be {
597} __packed; 601} __packed;
598 602
599void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw, 603void rtl8723be_tx_fill_desc(struct ieee80211_hw *hw,
600 struct ieee80211_hdr *hdr, u8 *pdesc, 604 struct ieee80211_hdr *hdr,
601 u8 *pbd_desc_tx, struct ieee80211_tx_info *info, 605 u8 *pdesc_tx, u8 *txbd,
606 struct ieee80211_tx_info *info,
602 struct ieee80211_sta *sta, struct sk_buff *skb, 607 struct ieee80211_sta *sta, struct sk_buff *skb,
603 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc); 608 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc);
604bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw, 609bool rtl8723be_rx_query_desc(struct ieee80211_hw *hw,
605 struct rtl_stats *status, 610 struct rtl_stats *status,
606 struct ieee80211_rx_status *rx_status, 611 struct ieee80211_rx_status *rx_status,
607 u8 *pdesc, struct sk_buff *skb); 612 u8 *pdesc, struct sk_buff *skb);
608void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc, bool istx, 613void rtl8723be_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
609 u8 desc_name, u8 *val); 614 bool istx, u8 desc_name, u8 *val);
610u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name); 615u32 rtl8723be_get_desc(u8 *pdesc, bool istx, u8 desc_name);
611bool rtl8723be_is_tx_desc_closed(struct ieee80211_hw *hw, 616bool rtl8723be_is_tx_desc_closed(struct ieee80211_hw *hw,
612 u8 hw_queue, u16 index); 617 u8 hw_queue, u16 index);
613void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue); 618void rtl8723be_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
614void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc, 619void rtl8723be_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
615 bool b_firstseg, bool b_lastseg, 620 bool firstseg, bool lastseg,
616 struct sk_buff *skb); 621 struct sk_buff *skb);
622u32 rtl8723be_rx_command_packet(struct ieee80211_hw *hw,
623 struct rtl_stats status,
624 struct sk_buff *skb);
617#endif 625#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723com/dm_common.c b/drivers/net/wireless/rtlwifi/rtl8723com/dm_common.c
index 4e254b72bf45..064340641913 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723com/dm_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723com/dm_common.c
@@ -44,7 +44,6 @@ EXPORT_SYMBOL_GPL(rtl8723_dm_init_dynamic_txpower);
44void rtl8723_dm_init_edca_turbo(struct ieee80211_hw *hw) 44void rtl8723_dm_init_edca_turbo(struct ieee80211_hw *hw)
45{ 45{
46 struct rtl_priv *rtlpriv = rtl_priv(hw); 46 struct rtl_priv *rtlpriv = rtl_priv(hw);
47
48 rtlpriv->dm.current_turbo_edca = false; 47 rtlpriv->dm.current_turbo_edca = false;
49 rtlpriv->dm.is_any_nonbepkts = false; 48 rtlpriv->dm.is_any_nonbepkts = false;
50 rtlpriv->dm.is_cur_rdlstate = false; 49 rtlpriv->dm.is_cur_rdlstate = false;
@@ -54,12 +53,13 @@ EXPORT_SYMBOL_GPL(rtl8723_dm_init_edca_turbo);
54void rtl8723_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw) 53void rtl8723_dm_init_dynamic_bb_powersaving(struct ieee80211_hw *hw)
55{ 54{
56 struct rtl_priv *rtlpriv = rtl_priv(hw); 55 struct rtl_priv *rtlpriv = rtl_priv(hw);
56 struct ps_t *dm_pstable = &rtlpriv->dm_pstable;
57 57
58 rtlpriv->dm_pstable.pre_ccastate = CCA_MAX; 58 dm_pstable->pre_ccastate = CCA_MAX;
59 rtlpriv->dm_pstable.cur_ccasate = CCA_MAX; 59 dm_pstable->cur_ccasate = CCA_MAX;
60 rtlpriv->dm_pstable.pre_rfstate = RF_MAX; 60 dm_pstable->pre_rfstate = RF_MAX;
61 rtlpriv->dm_pstable.cur_rfstate = RF_MAX; 61 dm_pstable->cur_rfstate = RF_MAX;
62 rtlpriv->dm_pstable.rssi_val_min = 0; 62 dm_pstable->rssi_val_min = 0;
63 rtlpriv->dm_pstable.initialize = 0; 63 dm_pstable->initialize = 0;
64} 64}
65EXPORT_SYMBOL_GPL(rtl8723_dm_init_dynamic_bb_powersaving); 65EXPORT_SYMBOL_GPL(rtl8723_dm_init_dynamic_bb_powersaving);
diff --git a/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.c b/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.c
index 540278ff462b..dd698e7e9ace 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.c
@@ -36,7 +36,8 @@ void rtl8723_enable_fw_download(struct ieee80211_hw *hw, bool enable)
36 36
37 if (enable) { 37 if (enable) {
38 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 38 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
39 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp | 0x04); 39 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1,
40 tmp | 0x04);
40 41
41 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL); 42 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
42 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp | 0x01); 43 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp | 0x01);
@@ -95,7 +96,7 @@ void rtl8723_fw_page_write(struct ieee80211_hw *hw,
95} 96}
96EXPORT_SYMBOL_GPL(rtl8723_fw_page_write); 97EXPORT_SYMBOL_GPL(rtl8723_fw_page_write);
97 98
98static void rtl8723_fill_dummy(u8 *pfwbuf, u32 *pfwlen) 99void rtl8723_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
99{ 100{
100 u32 fwlen = *pfwlen; 101 u32 fwlen = *pfwlen;
101 u8 remain = (u8) (fwlen % 4); 102 u8 remain = (u8) (fwlen % 4);
@@ -109,60 +110,64 @@ static void rtl8723_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
109 } 110 }
110 *pfwlen = fwlen; 111 *pfwlen = fwlen;
111} 112}
113EXPORT_SYMBOL(rtl8723_fill_dummy);
112 114
113void rtl8723_write_fw(struct ieee80211_hw *hw, 115void rtl8723_write_fw(struct ieee80211_hw *hw,
114 enum version_8723e version, 116 enum version_8723e version,
115 u8 *buffer, u32 size) 117 u8 *buffer, u32 size, u8 max_page)
116{ 118{
117 struct rtl_priv *rtlpriv = rtl_priv(hw); 119 struct rtl_priv *rtlpriv = rtl_priv(hw);
118 u8 *bufferptr = buffer; 120 u8 *bufferptr = buffer;
119 u32 pagenums, remainsize; 121 u32 page_nums, remain_size;
120 u32 page, offset; 122 u32 page, offset;
121 123
122 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size); 124 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "FW size is %d bytes,\n", size);
123 125
124 rtl8723_fill_dummy(bufferptr, &size); 126 rtl8723_fill_dummy(bufferptr, &size);
125 127
126 pagenums = size / FW_8192C_PAGE_SIZE; 128 page_nums = size / FW_8192C_PAGE_SIZE;
127 remainsize = size % FW_8192C_PAGE_SIZE; 129 remain_size = size % FW_8192C_PAGE_SIZE;
128 130
129 if (pagenums > 8) { 131 if (page_nums > max_page) {
130 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 132 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
131 "Page numbers should not greater then 8\n"); 133 "Page numbers should not greater than %d\n", max_page);
132 } 134 }
133 for (page = 0; page < pagenums; page++) { 135 for (page = 0; page < page_nums; page++) {
134 offset = page * FW_8192C_PAGE_SIZE; 136 offset = page * FW_8192C_PAGE_SIZE;
135 rtl8723_fw_page_write(hw, page, (bufferptr + offset), 137 rtl8723_fw_page_write(hw, page, (bufferptr + offset),
136 FW_8192C_PAGE_SIZE); 138 FW_8192C_PAGE_SIZE);
137 } 139 }
138 if (remainsize) { 140
139 offset = pagenums * FW_8192C_PAGE_SIZE; 141 if (remain_size) {
140 page = pagenums; 142 offset = page_nums * FW_8192C_PAGE_SIZE;
143 page = page_nums;
141 rtl8723_fw_page_write(hw, page, (bufferptr + offset), 144 rtl8723_fw_page_write(hw, page, (bufferptr + offset),
142 remainsize); 145 remain_size);
143 } 146 }
147 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "FW write done.\n");
144} 148}
145EXPORT_SYMBOL_GPL(rtl8723_write_fw); 149EXPORT_SYMBOL_GPL(rtl8723_write_fw);
146 150
147void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw) 151void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw)
148{ 152{
149 u8 u1tmp; 153 u8 u1b_tmp;
150 u8 delay = 100; 154 u8 delay = 100;
151 struct rtl_priv *rtlpriv = rtl_priv(hw); 155 struct rtl_priv *rtlpriv = rtl_priv(hw);
152 156
153 rtl_write_byte(rtlpriv, REG_HMETFR + 3, 0x20); 157 rtl_write_byte(rtlpriv, REG_HMETFR + 3, 0x20);
154 u1tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 158 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
155 159
156 while (u1tmp & BIT(2)) { 160 while (u1b_tmp & BIT(2)) {
157 delay--; 161 delay--;
158 if (delay == 0) 162 if (delay == 0)
159 break; 163 break;
160 udelay(50); 164 udelay(50);
161 u1tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 165 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
162 } 166 }
163 if (delay == 0) { 167 if (delay == 0) {
164 u1tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1); 168 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
165 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, u1tmp&(~BIT(2))); 169 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1,
170 u1b_tmp&(~BIT(2)));
166 } 171 }
167} 172}
168EXPORT_SYMBOL_GPL(rtl8723ae_firmware_selfreset); 173EXPORT_SYMBOL_GPL(rtl8723ae_firmware_selfreset);
@@ -190,7 +195,8 @@ void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw)
190} 195}
191EXPORT_SYMBOL_GPL(rtl8723be_firmware_selfreset); 196EXPORT_SYMBOL_GPL(rtl8723be_firmware_selfreset);
192 197
193int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be) 198int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be,
199 int max_count)
194{ 200{
195 struct rtl_priv *rtlpriv = rtl_priv(hw); 201 struct rtl_priv *rtlpriv = rtl_priv(hw);
196 int err = -EIO; 202 int err = -EIO;
@@ -199,10 +205,10 @@ int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be)
199 205
200 do { 206 do {
201 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL); 207 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
202 } while ((counter++ < FW_8192C_POLLING_TIMEOUT_COUNT) && 208 } while ((counter++ < max_count) &&
203 (!(value32 & FWDL_CHKSUM_RPT))); 209 (!(value32 & FWDL_CHKSUM_RPT)));
204 210
205 if (counter >= FW_8192C_POLLING_TIMEOUT_COUNT) { 211 if (counter >= max_count) {
206 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 212 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
207 "chksum report fail ! REG_MCUFWDL:0x%08x .\n", 213 "chksum report fail ! REG_MCUFWDL:0x%08x .\n",
208 value32); 214 value32);
@@ -223,15 +229,15 @@ int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be)
223 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL); 229 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
224 if (value32 & WINTINI_RDY) { 230 if (value32 & WINTINI_RDY) {
225 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, 231 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
226 "Polling FW ready success!! " 232 "Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",
227 "REG_MCUFWDL:0x%08x .\n",
228 value32); 233 value32);
229 err = 0; 234 err = 0;
230 goto exit; 235 goto exit;
231 } 236 }
232 udelay(FW_8192C_POLLING_DELAY);
233 237
234 } while (counter++ < FW_8192C_POLLING_TIMEOUT_COUNT); 238 mdelay(FW_8192C_POLLING_DELAY);
239
240 } while (counter++ < max_count);
235 241
236 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 242 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
237 "Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", 243 "Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
@@ -243,51 +249,55 @@ exit:
243EXPORT_SYMBOL_GPL(rtl8723_fw_free_to_go); 249EXPORT_SYMBOL_GPL(rtl8723_fw_free_to_go);
244 250
245int rtl8723_download_fw(struct ieee80211_hw *hw, 251int rtl8723_download_fw(struct ieee80211_hw *hw,
246 bool is_8723be) 252 bool is_8723be, int max_count)
247{ 253{
248 struct rtl_priv *rtlpriv = rtl_priv(hw); 254 struct rtl_priv *rtlpriv = rtl_priv(hw);
249 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 255 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
250 struct rtl92c_firmware_header *pfwheader; 256 struct rtl8723e_firmware_header *pfwheader;
251 u8 *pfwdata; 257 u8 *pfwdata;
252 u32 fwsize; 258 u32 fwsize;
253 int err; 259 int err;
254 enum version_8723e version = rtlhal->version; 260 enum version_8723e version = rtlhal->version;
261 int max_page;
255 262
256 if (!rtlhal->pfirmware) 263 if (!rtlhal->pfirmware)
257 return 1; 264 return 1;
258 265
259 pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware; 266 pfwheader = (struct rtl8723e_firmware_header *)rtlhal->pfirmware;
260 pfwdata = rtlhal->pfirmware; 267 pfwdata = rtlhal->pfirmware;
261 fwsize = rtlhal->fwsize; 268 fwsize = rtlhal->fwsize;
262 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
263 "normal Firmware SIZE %d\n", fwsize);
264 269
270 if (!is_8723be)
271 max_page = 6;
272 else
273 max_page = 8;
265 if (rtlpriv->cfg->ops->is_fw_header(pfwheader)) { 274 if (rtlpriv->cfg->ops->is_fw_header(pfwheader)) {
266 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, 275 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
267 "Firmware Version(%d), Signature(%#x), Size(%d)\n", 276 "Firmware Version(%d), Signature(%#x), Size(%d)\n",
268 pfwheader->version, pfwheader->signature, 277 pfwheader->version, pfwheader->signature,
269 (int)sizeof(struct rtl92c_firmware_header)); 278 (int)sizeof(struct rtl8723e_firmware_header));
270 279
271 pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header); 280 pfwdata = pfwdata + sizeof(struct rtl8723e_firmware_header);
272 fwsize = fwsize - sizeof(struct rtl92c_firmware_header); 281 fwsize = fwsize - sizeof(struct rtl8723e_firmware_header);
273 } 282 }
274 if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) { 283
275 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0); 284 if (rtl_read_byte(rtlpriv, REG_MCUFWDL)&BIT(7)) {
276 if (is_8723be) 285 if (is_8723be)
277 rtl8723be_firmware_selfreset(hw); 286 rtl8723be_firmware_selfreset(hw);
278 else 287 else
279 rtl8723ae_firmware_selfreset(hw); 288 rtl8723ae_firmware_selfreset(hw);
289 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
280 } 290 }
281 rtl8723_enable_fw_download(hw, true); 291 rtl8723_enable_fw_download(hw, true);
282 rtl8723_write_fw(hw, version, pfwdata, fwsize); 292 rtl8723_write_fw(hw, version, pfwdata, fwsize, max_page);
283 rtl8723_enable_fw_download(hw, false); 293 rtl8723_enable_fw_download(hw, false);
284 294
285 err = rtl8723_fw_free_to_go(hw, is_8723be); 295 err = rtl8723_fw_free_to_go(hw, is_8723be, max_count);
286 if (err) { 296 if (err) {
287 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, 297 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
288 "Firmware is not ready to run!\n"); 298 "Firmware is not ready to run!\n");
289 } else { 299 } else {
290 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, 300 RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
291 "Firmware is ready to run!\n"); 301 "Firmware is ready to run!\n");
292 } 302 }
293 return 0; 303 return 0;
diff --git a/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.h b/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.h
index cf1cc5804d06..3ebafc80972f 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.h
+++ b/drivers/net/wireless/rtlwifi/rtl8723com/fw_common.h
@@ -30,7 +30,8 @@
30#define REG_MCUFWDL 0x0080 30#define REG_MCUFWDL 0x0080
31#define FW_8192C_START_ADDRESS 0x1000 31#define FW_8192C_START_ADDRESS 0x1000
32#define FW_8192C_PAGE_SIZE 4096 32#define FW_8192C_PAGE_SIZE 4096
33#define FW_8192C_POLLING_TIMEOUT_COUNT 6000 33#define FW_8723A_POLLING_TIMEOUT_COUNT 1000
34#define FW_8723B_POLLING_TIMEOUT_COUNT 6000
34#define FW_8192C_POLLING_DELAY 5 35#define FW_8192C_POLLING_DELAY 5
35 36
36#define MCUFWDL_RDY BIT(1) 37#define MCUFWDL_RDY BIT(1)
@@ -49,16 +50,23 @@ enum version_8723e {
49 VERSION_UNKNOWN = 0xFF, 50 VERSION_UNKNOWN = 0xFF,
50}; 51};
51 52
52enum rtl8723ae_h2c_cmd { 53struct rtl8723e_firmware_header {
53 H2C_AP_OFFLOAD = 0, 54 u16 signature;
54 H2C_SETPWRMODE = 1, 55 u8 category;
55 H2C_JOINBSSRPT = 2, 56 u8 function;
56 H2C_RSVDPAGE = 3, 57 u16 version;
57 H2C_RSSI_REPORT = 4, 58 u8 subversion;
58 H2C_P2P_PS_CTW_CMD = 5, 59 u8 rsvd1;
59 H2C_P2P_PS_OFFLOAD = 6, 60 u8 month;
60 H2C_RA_MASK = 7, 61 u8 date;
61 MAX_H2CCMD 62 u8 hour;
63 u8 minute;
64 u16 ramcodesize;
65 u16 rsvd2;
66 u32 svnindex;
67 u32 rsvd3;
68 u32 rsvd4;
69 u32 rsvd5;
62}; 70};
63 71
64enum rtl8723be_cmd { 72enum rtl8723be_cmd {
@@ -92,25 +100,6 @@ enum rtl8723be_cmd {
92 MAX_8723BE_H2CCMD 100 MAX_8723BE_H2CCMD
93}; 101};
94 102
95struct rtl92c_firmware_header {
96 u16 signature;
97 u8 category;
98 u8 function;
99 u16 version;
100 u8 subversion;
101 u8 rsvd1;
102 u8 month;
103 u8 date;
104 u8 hour;
105 u8 minute;
106 u16 ramcodesize;
107 u16 rsvd2;
108 u32 svnindex;
109 u32 rsvd3;
110 u32 rsvd4;
111 u32 rsvd5;
112};
113
114void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw); 103void rtl8723ae_firmware_selfreset(struct ieee80211_hw *hw);
115void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw); 104void rtl8723be_firmware_selfreset(struct ieee80211_hw *hw);
116void rtl8723_enable_fw_download(struct ieee80211_hw *hw, bool enable); 105void rtl8723_enable_fw_download(struct ieee80211_hw *hw, bool enable);
@@ -120,7 +109,11 @@ void rtl8723_fw_page_write(struct ieee80211_hw *hw,
120 u32 page, const u8 *buffer, u32 size); 109 u32 page, const u8 *buffer, u32 size);
121void rtl8723_write_fw(struct ieee80211_hw *hw, 110void rtl8723_write_fw(struct ieee80211_hw *hw,
122 enum version_8723e version, 111 enum version_8723e version,
123 u8 *buffer, u32 size); 112 u8 *buffer, u32 size, u8 max_page);
124int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be); 113int rtl8723_fw_free_to_go(struct ieee80211_hw *hw, bool is_8723be, int count);
125int rtl8723_download_fw(struct ieee80211_hw *hw, bool is_8723be); 114int rtl8723_download_fw(struct ieee80211_hw *hw, bool is_8723be, int count);
115bool rtl8723_cmd_send_packet(struct ieee80211_hw *hw,
116 struct sk_buff *skb);
117void rtl8723_fill_dummy(u8 *pfwbuf, u32 *pfwlen);
118
126#endif 119#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8723com/phy_common.c b/drivers/net/wireless/rtlwifi/rtl8723com/phy_common.c
index d73b659bd2b5..75cbd1509b52 100644
--- a/drivers/net/wireless/rtlwifi/rtl8723com/phy_common.c
+++ b/drivers/net/wireless/rtlwifi/rtl8723com/phy_common.c
@@ -43,9 +43,8 @@ u32 rtl8723_phy_query_bb_reg(struct ieee80211_hw *hw,
43 returnvalue = (originalvalue & bitmask) >> bitshift; 43 returnvalue = (originalvalue & bitmask) >> bitshift;
44 44
45 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 45 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
46 "BBR MASK = 0x%x Addr[0x%x]= 0x%x\n", 46 "BBR MASK=0x%x Addr[0x%x]=0x%x\n", bitmask,
47 bitmask, regaddr, originalvalue); 47 regaddr, originalvalue);
48
49 return returnvalue; 48 return returnvalue;
50} 49}
51EXPORT_SYMBOL_GPL(rtl8723_phy_query_bb_reg); 50EXPORT_SYMBOL_GPL(rtl8723_phy_query_bb_reg);
@@ -57,8 +56,8 @@ void rtl8723_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
57 u32 originalvalue, bitshift; 56 u32 originalvalue, bitshift;
58 57
59 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 58 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
60 "regaddr(%#x), bitmask(%#x), data(%#x)\n", 59 "regaddr(%#x), bitmask(%#x), data(%#x)\n", regaddr, bitmask,
61 regaddr, bitmask, data); 60 data);
62 61
63 if (bitmask != MASKDWORD) { 62 if (bitmask != MASKDWORD) {
64 originalvalue = rtl_read_dword(rtlpriv, regaddr); 63 originalvalue = rtl_read_dword(rtlpriv, regaddr);
@@ -70,7 +69,7 @@ void rtl8723_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
70 69
71 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 70 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
72 "regaddr(%#x), bitmask(%#x), data(%#x)\n", 71 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
73 regaddr, bitmask, data); 72 regaddr, bitmask, data);
74} 73}
75EXPORT_SYMBOL_GPL(rtl8723_phy_set_bb_reg); 74EXPORT_SYMBOL_GPL(rtl8723_phy_set_bb_reg);
76 75
@@ -109,12 +108,15 @@ u32 rtl8723_phy_rf_serial_read(struct ieee80211_hw *hw,
109 else 108 else
110 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD); 109 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
111 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) | 110 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
112 (newoffset << 23) | BLSSIREADEDGE; 111 (newoffset << 23) | BLSSIREADEDGE;
113 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD, 112 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
114 tmplong & (~BLSSIREADEDGE)); 113 tmplong & (~BLSSIREADEDGE));
115 mdelay(1); 114 mdelay(1);
116 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2); 115 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
117 mdelay(2); 116 mdelay(1);
117 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
118 tmplong | BLSSIREADEDGE);
119 mdelay(1);
118 if (rfpath == RF90_PATH_A) 120 if (rfpath == RF90_PATH_A)
119 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1, 121 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
120 BIT(8)); 122 BIT(8));
@@ -128,8 +130,8 @@ u32 rtl8723_phy_rf_serial_read(struct ieee80211_hw *hw,
128 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb, 130 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
129 BLSSIREADBACKDATA); 131 BLSSIREADBACKDATA);
130 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 132 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
131 "RFR-%d Addr[0x%x]= 0x%x\n", 133 "RFR-%d Addr[0x%x]=0x%x\n",
132 rfpath, pphyreg->rf_rb, retvalue); 134 rfpath, pphyreg->rf_rb, retvalue);
133 return retvalue; 135 return retvalue;
134} 136}
135EXPORT_SYMBOL_GPL(rtl8723_phy_rf_serial_read); 137EXPORT_SYMBOL_GPL(rtl8723_phy_rf_serial_read);
@@ -153,8 +155,9 @@ void rtl8723_phy_rf_serial_write(struct ieee80211_hw *hw,
153 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff; 155 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
154 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr); 156 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
155 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 157 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
156 "RFW-%d Addr[0x%x]= 0x%x\n", rfpath, 158 "RFW-%d Addr[0x%x]=0x%x\n",
157 pphyreg->rf3wire_offset, data_and_addr); 159 rfpath, pphyreg->rf3wire_offset,
160 data_and_addr);
158} 161}
159EXPORT_SYMBOL_GPL(rtl8723_phy_rf_serial_write); 162EXPORT_SYMBOL_GPL(rtl8723_phy_rf_serial_write);
160 163
@@ -171,6 +174,8 @@ long rtl8723_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
171 break; 174 break;
172 case WIRELESS_MODE_G: 175 case WIRELESS_MODE_G:
173 case WIRELESS_MODE_N_24G: 176 case WIRELESS_MODE_N_24G:
177 offset = -8;
178 break;
174 default: 179 default:
175 offset = -8; 180 offset = -8;
176 break; 181 break;
@@ -202,14 +207,14 @@ void rtl8723_phy_init_bb_rf_reg_def(struct ieee80211_hw *hw)
202 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE; 207 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
203 208
204 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = 209 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
205 RFPGA0_XA_LSSIPARAMETER; 210 RFPGA0_XA_LSSIPARAMETER;
206 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = 211 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
207 RFPGA0_XB_LSSIPARAMETER; 212 RFPGA0_XB_LSSIPARAMETER;
208 213
209 rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = rFPGA0_XAB_RFPARAMETER; 214 rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
210 rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = rFPGA0_XAB_RFPARAMETER; 215 rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
211 rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = rFPGA0_XCD_RFPARAMETER; 216 rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
212 rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = rFPGA0_XCD_RFPARAMETER; 217 rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
213 218
214 rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE; 219 rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
215 rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE; 220 rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
@@ -264,6 +269,7 @@ void rtl8723_phy_init_bb_rf_reg_def(struct ieee80211_hw *hw)
264 269
265 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK; 270 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
266 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK; 271 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
272
267} 273}
268EXPORT_SYMBOL_GPL(rtl8723_phy_init_bb_rf_reg_def); 274EXPORT_SYMBOL_GPL(rtl8723_phy_init_bb_rf_reg_def);
269 275
@@ -384,14 +390,21 @@ EXPORT_SYMBOL_GPL(rtl8723_phy_reload_mac_registers);
384void rtl8723_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg, 390void rtl8723_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
385 bool is_patha_on, bool is2t) 391 bool is_patha_on, bool is2t)
386{ 392{
393 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
387 u32 pathon; 394 u32 pathon;
388 u32 i; 395 u32 i;
389 396
390 pathon = is_patha_on ? 0x04db25a4 : 0x0b1b25a4; 397 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8723AE) {
391 if (!is2t) { 398 pathon = is_patha_on ? 0x04db25a4 : 0x0b1b25a4;
392 pathon = 0x0bdb25a0; 399 if (!is2t) {
393 rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0); 400 pathon = 0x0bdb25a0;
401 rtl_set_bbreg(hw, addareg[0], MASKDWORD, 0x0b1b25a0);
402 } else {
403 rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
404 }
394 } else { 405 } else {
406 /* rtl8723be */
407 pathon = 0x01c00014;
395 rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon); 408 rtl_set_bbreg(hw, addareg[0], MASKDWORD, pathon);
396 } 409 }
397 410
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile b/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile
new file mode 100644
index 000000000000..87ad604a1eb3
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/Makefile
@@ -0,0 +1,19 @@
1obj-m := rtl8821ae.o
2
3
4rtl8821ae-objs := \
5 dm.o \
6 fw.o \
7 hw.o \
8 led.o \
9 phy.o \
10 pwrseq.o \
11 rf.o \
12 sw.o \
13 table.o \
14 trx.o \
15
16
17obj-$(CONFIG_RTL8821AE) += rtl8821ae.o
18
19ccflags-y += -D__CHECK_ENDIAN__
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/def.h b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
new file mode 100644
index 000000000000..a730985ae81d
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/def.h
@@ -0,0 +1,450 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_DEF_H__
27#define __RTL8821AE_DEF_H__
28
29/*--------------------------Define -------------------------------------------*/
30#define USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN 1
31
32/* BIT 7 HT Rate*/
33/*TxHT = 0*/
34#define MGN_1M 0x02
35#define MGN_2M 0x04
36#define MGN_5_5M 0x0b
37#define MGN_11M 0x16
38
39#define MGN_6M 0x0c
40#define MGN_9M 0x12
41#define MGN_12M 0x18
42#define MGN_18M 0x24
43#define MGN_24M 0x30
44#define MGN_36M 0x48
45#define MGN_48M 0x60
46#define MGN_54M 0x6c
47
48/* TxHT = 1 */
49#define MGN_MCS0 0x80
50#define MGN_MCS1 0x81
51#define MGN_MCS2 0x82
52#define MGN_MCS3 0x83
53#define MGN_MCS4 0x84
54#define MGN_MCS5 0x85
55#define MGN_MCS6 0x86
56#define MGN_MCS7 0x87
57#define MGN_MCS8 0x88
58#define MGN_MCS9 0x89
59#define MGN_MCS10 0x8a
60#define MGN_MCS11 0x8b
61#define MGN_MCS12 0x8c
62#define MGN_MCS13 0x8d
63#define MGN_MCS14 0x8e
64#define MGN_MCS15 0x8f
65/* VHT rate */
66#define MGN_VHT1SS_MCS0 0x90
67#define MGN_VHT1SS_MCS1 0x91
68#define MGN_VHT1SS_MCS2 0x92
69#define MGN_VHT1SS_MCS3 0x93
70#define MGN_VHT1SS_MCS4 0x94
71#define MGN_VHT1SS_MCS5 0x95
72#define MGN_VHT1SS_MCS6 0x96
73#define MGN_VHT1SS_MCS7 0x97
74#define MGN_VHT1SS_MCS8 0x98
75#define MGN_VHT1SS_MCS9 0x99
76#define MGN_VHT2SS_MCS0 0x9a
77#define MGN_VHT2SS_MCS1 0x9b
78#define MGN_VHT2SS_MCS2 0x9c
79#define MGN_VHT2SS_MCS3 0x9d
80#define MGN_VHT2SS_MCS4 0x9e
81#define MGN_VHT2SS_MCS5 0x9f
82#define MGN_VHT2SS_MCS6 0xa0
83#define MGN_VHT2SS_MCS7 0xa1
84#define MGN_VHT2SS_MCS8 0xa2
85#define MGN_VHT2SS_MCS9 0xa3
86
87#define MGN_VHT3SS_MCS0 0xa4
88#define MGN_VHT3SS_MCS1 0xa5
89#define MGN_VHT3SS_MCS2 0xa6
90#define MGN_VHT3SS_MCS3 0xa7
91#define MGN_VHT3SS_MCS4 0xa8
92#define MGN_VHT3SS_MCS5 0xa9
93#define MGN_VHT3SS_MCS6 0xaa
94#define MGN_VHT3SS_MCS7 0xab
95#define MGN_VHT3SS_MCS8 0xac
96#define MGN_VHT3SS_MCS9 0xad
97
98#define MGN_MCS0_SG 0xc0
99#define MGN_MCS1_SG 0xc1
100#define MGN_MCS2_SG 0xc2
101#define MGN_MCS3_SG 0xc3
102#define MGN_MCS4_SG 0xc4
103#define MGN_MCS5_SG 0xc5
104#define MGN_MCS6_SG 0xc6
105#define MGN_MCS7_SG 0xc7
106#define MGN_MCS8_SG 0xc8
107#define MGN_MCS9_SG 0xc9
108#define MGN_MCS10_SG 0xca
109#define MGN_MCS11_SG 0xcb
110#define MGN_MCS12_SG 0xcc
111#define MGN_MCS13_SG 0xcd
112#define MGN_MCS14_SG 0xce
113#define MGN_MCS15_SG 0xcf
114
115#define MGN_UNKNOWN 0xff
116
117/* 30 ms */
118#define WIFI_NAV_UPPER_US 30000
119#define HAL_92C_NAV_UPPER_UNIT 128
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
149
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
161#define HAL_PRIME_CHNL_OFFSET_LOWER 1
162#define HAL_PRIME_CHNL_OFFSET_UPPER 2
163
164#define MAX_H2C_QUEUE_NUM 10
165
166#define RX_MPDU_QUEUE 0
167#define RX_CMD_QUEUE 1
168#define RX_MAX_QUEUE 2
169#define AC2QUEUEID(_AC) (_AC)
170
171#define MAX_RX_DMA_BUFFER_SIZE_8812 0x3E80
172
173#define C2H_RX_CMD_HDR_LEN 8
174#define GET_C2H_CMD_CMD_LEN(__prxhdr) \
175 LE_BITS_TO_4BYTE((__prxhdr), 0, 16)
176#define GET_C2H_CMD_ELEMENT_ID(__prxhdr) \
177 LE_BITS_TO_4BYTE((__prxhdr), 16, 8)
178#define GET_C2H_CMD_CMD_SEQ(__prxhdr) \
179 LE_BITS_TO_4BYTE((__prxhdr), 24, 7)
180#define GET_C2H_CMD_CONTINUE(__prxhdr) \
181 LE_BITS_TO_4BYTE((__prxhdr), 31, 1)
182#define GET_C2H_CMD_CONTENT(__prxhdr) \
183 ((u8 *)(__prxhdr) + C2H_RX_CMD_HDR_LEN)
184
185#define GET_C2H_CMD_FEEDBACK_ELEMENT_ID(__pcmdfbhdr) \
186 LE_BITS_TO_4BYTE((__pcmdfbhdr), 0, 8)
187#define GET_C2H_CMD_FEEDBACK_CCX_LEN(__pcmdfbhdr) \
188 LE_BITS_TO_4BYTE((__pcmdfbhdr), 8, 8)
189#define GET_C2H_CMD_FEEDBACK_CCX_CMD_CNT(__pcmdfbhdr) \
190 LE_BITS_TO_4BYTE((__pcmdfbhdr), 16, 16)
191#define GET_C2H_CMD_FEEDBACK_CCX_MAC_ID(__pcmdfbhdr) \
192 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 0, 5)
193#define GET_C2H_CMD_FEEDBACK_CCX_VALID(__pcmdfbhdr) \
194 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 7, 1)
195#define GET_C2H_CMD_FEEDBACK_CCX_RETRY_CNT(__pcmdfbhdr) \
196 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 8, 5)
197#define GET_C2H_CMD_FEEDBACK_CCX_TOK(__pcmdfbhdr) \
198 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 15, 1)
199#define GET_C2H_CMD_FEEDBACK_CCX_QSEL(__pcmdfbhdr) \
200 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 16, 4)
201#define GET_C2H_CMD_FEEDBACK_CCX_SEQ(__pcmdfbhdr) \
202 LE_BITS_TO_4BYTE(((__pcmdfbhdr) + 4), 20, 12)
203
204#define CHIP_BONDING_IDENTIFIER(_value) (((_value)>>22)&0x3)
205
206#define CHIP_8812 BIT(2)
207#define CHIP_8821 (BIT(0)|BIT(2))
208
209#define CHIP_8821A (BIT(0)|BIT(2))
210#define NORMAL_CHIP BIT(3)
211#define RF_TYPE_1T1R (~(BIT(4)|BIT(5)|BIT(6)))
212#define RF_TYPE_1T2R BIT(4)
213#define RF_TYPE_2T2R BIT(5)
214#define CHIP_VENDOR_UMC BIT(7)
215#define B_CUT_VERSION BIT(12)
216#define C_CUT_VERSION BIT(13)
217#define D_CUT_VERSION ((BIT(12)|BIT(13)))
218#define E_CUT_VERSION BIT(14)
219#define RF_RL_ID (BIT(31)|BIT(30)|BIT(29)|BIT(28))
220
221enum version_8821ae {
222 VERSION_TEST_CHIP_1T1R_8812 = 0x0004,
223 VERSION_TEST_CHIP_2T2R_8812 = 0x0024,
224 VERSION_NORMAL_TSMC_CHIP_1T1R_8812 = 0x100c,
225 VERSION_NORMAL_TSMC_CHIP_2T2R_8812 = 0x102c,
226 VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT = 0x200c,
227 VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT = 0x202c,
228 VERSION_TEST_CHIP_8821 = 0x0005,
229 VERSION_NORMAL_TSMC_CHIP_8821 = 0x000d,
230 VERSION_NORMAL_TSMC_CHIP_8821_B_CUT = 0x100d,
231 VERSION_UNKNOWN = 0xFF,
232};
233
234enum vht_data_sc {
235 VHT_DATA_SC_DONOT_CARE = 0,
236 VHT_DATA_SC_20_UPPER_OF_80MHZ = 1,
237 VHT_DATA_SC_20_LOWER_OF_80MHZ = 2,
238 VHT_DATA_SC_20_UPPERST_OF_80MHZ = 3,
239 VHT_DATA_SC_20_LOWEST_OF_80MHZ = 4,
240 VHT_DATA_SC_20_RECV1 = 5,
241 VHT_DATA_SC_20_RECV2 = 6,
242 VHT_DATA_SC_20_RECV3 = 7,
243 VHT_DATA_SC_20_RECV4 = 8,
244 VHT_DATA_SC_40_UPPER_OF_80MHZ = 9,
245 VHT_DATA_SC_40_LOWER_OF_80MHZ = 10,
246};
247
248/* MASK */
249#define IC_TYPE_MASK (BIT(0)|BIT(1)|BIT(2))
250#define CHIP_TYPE_MASK BIT(3)
251#define RF_TYPE_MASK (BIT(4)|BIT(5)|BIT(6))
252#define MANUFACTUER_MASK BIT(7)
253#define ROM_VERSION_MASK (BIT(11)|BIT(10)|BIT(9)|BIT(8))
254#define CUT_VERSION_MASK (BIT(15)|BIT(14)|BIT(13)|BIT(12))
255
256/* Get element */
257#define GET_CVID_IC_TYPE(version) ((version) & IC_TYPE_MASK)
258#define GET_CVID_CHIP_TYPE(version) ((version) & CHIP_TYPE_MASK)
259#define GET_CVID_RF_TYPE(version) ((version) & RF_TYPE_MASK)
260#define GET_CVID_MANUFACTUER(version) ((version) & MANUFACTUER_MASK)
261#define GET_CVID_ROM_VERSION(version) ((version) & ROM_VERSION_MASK)
262#define GET_CVID_CUT_VERSION(version) ((version) & CUT_VERSION_MASK)
263
264#define IS_1T1R(version) ((GET_CVID_RF_TYPE(version)) ? false : true)
265#define IS_1T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_1T2R)\
266 ? true : false)
267#define IS_2T2R(version) ((GET_CVID_RF_TYPE(version) == RF_TYPE_2T2R)\
268 ? true : false)
269
270#define IS_8812_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8812) ? \
271 true : false)
272#define IS_8821_SERIES(version) ((GET_CVID_IC_TYPE(version) == CHIP_8821) ? \
273 true : false)
274
275#define IS_VENDOR_8812A_TEST_CHIP(version) ((IS_8812_SERIES(version)) ? \
276 ((IS_NORMAL_CHIP(version)) ? \
277 false : true) : false)
278#define IS_VENDOR_8812A_MP_CHIP(version) ((IS_8812_SERIES(version)) ? \
279 ((IS_NORMAL_CHIP(version)) ? \
280 true : false) : false)
281#define IS_VENDOR_8812A_C_CUT(version) ((IS_8812_SERIES(version)) ? \
282 ((GET_CVID_CUT_VERSION(version) == \
283 C_CUT_VERSION) ? \
284 true : false) : false)
285
286#define IS_VENDOR_8821A_TEST_CHIP(version) ((IS_8821_SERIES(version)) ? \
287 ((IS_NORMAL_CHIP(version)) ? \
288 false : true) : false)
289#define IS_VENDOR_8821A_MP_CHIP(version) ((IS_8821_SERIES(version)) ? \
290 ((IS_NORMAL_CHIP(version)) ? \
291 true : false) : false)
292#define IS_VENDOR_8821A_B_CUT(version) ((IS_8821_SERIES(version)) ? \
293 ((GET_CVID_CUT_VERSION(version) == \
294 B_CUT_VERSION) ? \
295 true : false) : false)
296enum board_type {
297 ODM_BOARD_DEFAULT = 0, /* The DEFAULT case. */
298 ODM_BOARD_MINICARD = BIT(0), /* 0 = non-mini card, 1 = mini card. */
299 ODM_BOARD_SLIM = BIT(1), /* 0 = non-slim card, 1 = slim card */
300 ODM_BOARD_BT = BIT(2), /* 0 = without BT card, 1 = with BT */
301 ODM_BOARD_EXT_PA = BIT(3), /* 1 = existing 2G ext-PA */
302 ODM_BOARD_EXT_LNA = BIT(4), /* 1 = existing 2G ext-LNA */
303 ODM_BOARD_EXT_TRSW = BIT(5), /* 1 = existing ext-TRSW */
304 ODM_BOARD_EXT_PA_5G = BIT(6), /* 1 = existing 5G ext-PA */
305 ODM_BOARD_EXT_LNA_5G = BIT(7), /* 1 = existing 5G ext-LNA */
306};
307
308enum rf_optype {
309 RF_OP_BY_SW_3WIRE = 0,
310 RF_OP_BY_FW,
311 RF_OP_MAX
312};
313
314enum rf_power_state {
315 RF_ON,
316 RF_OFF,
317 RF_SLEEP,
318 RF_SHUT_DOWN,
319};
320
321enum power_save_mode {
322 POWER_SAVE_MODE_ACTIVE,
323 POWER_SAVE_MODE_SAVE,
324};
325
326enum power_polocy_config {
327 POWERCFG_MAX_POWER_SAVINGS,
328 POWERCFG_GLOBAL_POWER_SAVINGS,
329 POWERCFG_LOCAL_POWER_SAVINGS,
330 POWERCFG_LENOVO,
331};
332
333enum interface_select_pci {
334 INTF_SEL1_MINICARD = 0,
335 INTF_SEL0_PCIE = 1,
336 INTF_SEL2_RSV = 2,
337 INTF_SEL3_RSV = 3,
338};
339
340enum hal_fw_c2h_cmd_id {
341 HAL_FW_C2H_CMD_READ_MACREG = 0,
342 HAL_FW_C2H_CMD_READ_BBREG = 1,
343 HAL_FW_C2H_CMD_READ_RFREG = 2,
344 HAL_FW_C2H_CMD_READ_EEPROM = 3,
345 HAL_FW_C2H_CMD_READ_EFUSE = 4,
346 HAL_FW_C2H_CMD_READ_CAM = 5,
347 HAL_FW_C2H_CMD_GET_BASICRATE = 6,
348 HAL_FW_C2H_CMD_GET_DATARATE = 7,
349 HAL_FW_C2H_CMD_SURVEY = 8,
350 HAL_FW_C2H_CMD_SURVEYDONE = 9,
351 HAL_FW_C2H_CMD_JOINBSS = 10,
352 HAL_FW_C2H_CMD_ADDSTA = 11,
353 HAL_FW_C2H_CMD_DELSTA = 12,
354 HAL_FW_C2H_CMD_ATIMDONE = 13,
355 HAL_FW_C2H_CMD_TX_REPORT = 14,
356 HAL_FW_C2H_CMD_CCX_REPORT = 15,
357 HAL_FW_C2H_CMD_DTM_REPORT = 16,
358 HAL_FW_C2H_CMD_TX_RATE_STATISTICS = 17,
359 HAL_FW_C2H_CMD_C2HLBK = 18,
360 HAL_FW_C2H_CMD_C2HDBG = 19,
361 HAL_FW_C2H_CMD_C2HFEEDBACK = 20,
362 HAL_FW_C2H_CMD_MAX
363};
364
365enum rtl_desc_qsel {
366 QSLT_BK = 0x2,
367 QSLT_BE = 0x0,
368 QSLT_VI = 0x5,
369 QSLT_VO = 0x7,
370 QSLT_BEACON = 0x10,
371 QSLT_HIGH = 0x11,
372 QSLT_MGNT = 0x12,
373 QSLT_CMD = 0x13,
374};
375
376enum rtl_desc8821ae_rate {
377 DESC_RATE1M = 0x00,
378 DESC_RATE2M = 0x01,
379 DESC_RATE5_5M = 0x02,
380 DESC_RATE11M = 0x03,
381
382 DESC_RATE6M = 0x04,
383 DESC_RATE9M = 0x05,
384 DESC_RATE12M = 0x06,
385 DESC_RATE18M = 0x07,
386 DESC_RATE24M = 0x08,
387 DESC_RATE36M = 0x09,
388 DESC_RATE48M = 0x0a,
389 DESC_RATE54M = 0x0b,
390
391 DESC_RATEMCS0 = 0x0c,
392 DESC_RATEMCS1 = 0x0d,
393 DESC_RATEMCS2 = 0x0e,
394 DESC_RATEMCS3 = 0x0f,
395 DESC_RATEMCS4 = 0x10,
396 DESC_RATEMCS5 = 0x11,
397 DESC_RATEMCS6 = 0x12,
398 DESC_RATEMCS7 = 0x13,
399 DESC_RATEMCS8 = 0x14,
400 DESC_RATEMCS9 = 0x15,
401 DESC_RATEMCS10 = 0x16,
402 DESC_RATEMCS11 = 0x17,
403 DESC_RATEMCS12 = 0x18,
404 DESC_RATEMCS13 = 0x19,
405 DESC_RATEMCS14 = 0x1a,
406 DESC_RATEMCS15 = 0x1b,
407
408 DESC_RATEVHT1SS_MCS0 = 0x2c,
409 DESC_RATEVHT1SS_MCS1 = 0x2d,
410 DESC_RATEVHT1SS_MCS2 = 0x2e,
411 DESC_RATEVHT1SS_MCS3 = 0x2f,
412 DESC_RATEVHT1SS_MCS4 = 0x30,
413 DESC_RATEVHT1SS_MCS5 = 0x31,
414 DESC_RATEVHT1SS_MCS6 = 0x32,
415 DESC_RATEVHT1SS_MCS7 = 0x33,
416 DESC_RATEVHT1SS_MCS8 = 0x34,
417 DESC_RATEVHT1SS_MCS9 = 0x35,
418 DESC_RATEVHT2SS_MCS0 = 0x36,
419 DESC_RATEVHT2SS_MCS1 = 0x37,
420 DESC_RATEVHT2SS_MCS2 = 0x38,
421 DESC_RATEVHT2SS_MCS3 = 0x39,
422 DESC_RATEVHT2SS_MCS4 = 0x3a,
423 DESC_RATEVHT2SS_MCS5 = 0x3b,
424 DESC_RATEVHT2SS_MCS6 = 0x3c,
425 DESC_RATEVHT2SS_MCS7 = 0x3d,
426 DESC_RATEVHT2SS_MCS8 = 0x3e,
427 DESC_RATEVHT2SS_MCS9 = 0x3f,
428};
429
430enum rx_packet_type {
431 NORMAL_RX,
432 TX_REPORT1,
433 TX_REPORT2,
434 HIS_REPORT,
435 C2H_PACKET,
436};
437
438struct phy_sts_cck_8821ae_t {
439 u8 adc_pwdb_X[4];
440 u8 sq_rpt;
441 u8 cck_agc_rpt;
442};
443
444struct h2c_cmd_8821ae {
445 u8 element_id;
446 u32 cmd_len;
447 u8 *p_cmdbuffer;
448};
449
450#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
new file mode 100644
index 000000000000..9be106109921
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.c
@@ -0,0 +1,3019 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../base.h"
28#include "../pci.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "dm.h"
33#include "fw.h"
34#include "trx.h"
35#include "../btcoexist/rtl_btc.h"
36
37static const u32 txscaling_tbl[TXSCALE_TABLE_SIZE] = {
38 0x081, /* 0, -12.0dB */
39 0x088, /* 1, -11.5dB */
40 0x090, /* 2, -11.0dB */
41 0x099, /* 3, -10.5dB */
42 0x0A2, /* 4, -10.0dB */
43 0x0AC, /* 5, -9.5dB */
44 0x0B6, /* 6, -9.0dB */
45 0x0C0, /* 7, -8.5dB */
46 0x0CC, /* 8, -8.0dB */
47 0x0D8, /* 9, -7.5dB */
48 0x0E5, /* 10, -7.0dB */
49 0x0F2, /* 11, -6.5dB */
50 0x101, /* 12, -6.0dB */
51 0x110, /* 13, -5.5dB */
52 0x120, /* 14, -5.0dB */
53 0x131, /* 15, -4.5dB */
54 0x143, /* 16, -4.0dB */
55 0x156, /* 17, -3.5dB */
56 0x16A, /* 18, -3.0dB */
57 0x180, /* 19, -2.5dB */
58 0x197, /* 20, -2.0dB */
59 0x1AF, /* 21, -1.5dB */
60 0x1C8, /* 22, -1.0dB */
61 0x1E3, /* 23, -0.5dB */
62 0x200, /* 24, +0 dB */
63 0x21E, /* 25, +0.5dB */
64 0x23E, /* 26, +1.0dB */
65 0x261, /* 27, +1.5dB */
66 0x285, /* 28, +2.0dB */
67 0x2AB, /* 29, +2.5dB */
68 0x2D3, /* 30, +3.0dB */
69 0x2FE, /* 31, +3.5dB */
70 0x32B, /* 32, +4.0dB */
71 0x35C, /* 33, +4.5dB */
72 0x38E, /* 34, +5.0dB */
73 0x3C4, /* 35, +5.5dB */
74 0x3FE /* 36, +6.0dB */
75};
76
77static const u32 rtl8821ae_txscaling_table[TXSCALE_TABLE_SIZE] = {
78 0x081, /* 0, -12.0dB */
79 0x088, /* 1, -11.5dB */
80 0x090, /* 2, -11.0dB */
81 0x099, /* 3, -10.5dB */
82 0x0A2, /* 4, -10.0dB */
83 0x0AC, /* 5, -9.5dB */
84 0x0B6, /* 6, -9.0dB */
85 0x0C0, /* 7, -8.5dB */
86 0x0CC, /* 8, -8.0dB */
87 0x0D8, /* 9, -7.5dB */
88 0x0E5, /* 10, -7.0dB */
89 0x0F2, /* 11, -6.5dB */
90 0x101, /* 12, -6.0dB */
91 0x110, /* 13, -5.5dB */
92 0x120, /* 14, -5.0dB */
93 0x131, /* 15, -4.5dB */
94 0x143, /* 16, -4.0dB */
95 0x156, /* 17, -3.5dB */
96 0x16A, /* 18, -3.0dB */
97 0x180, /* 19, -2.5dB */
98 0x197, /* 20, -2.0dB */
99 0x1AF, /* 21, -1.5dB */
100 0x1C8, /* 22, -1.0dB */
101 0x1E3, /* 23, -0.5dB */
102 0x200, /* 24, +0 dB */
103 0x21E, /* 25, +0.5dB */
104 0x23E, /* 26, +1.0dB */
105 0x261, /* 27, +1.5dB */
106 0x285, /* 28, +2.0dB */
107 0x2AB, /* 29, +2.5dB */
108 0x2D3, /* 30, +3.0dB */
109 0x2FE, /* 31, +3.5dB */
110 0x32B, /* 32, +4.0dB */
111 0x35C, /* 33, +4.5dB */
112 0x38E, /* 34, +5.0dB */
113 0x3C4, /* 35, +5.5dB */
114 0x3FE /* 36, +6.0dB */
115};
116
117static const u32 ofdmswing_table[] = {
118 0x0b40002d, /* 0, -15.0dB */
119 0x0c000030, /* 1, -14.5dB */
120 0x0cc00033, /* 2, -14.0dB */
121 0x0d800036, /* 3, -13.5dB */
122 0x0e400039, /* 4, -13.0dB */
123 0x0f00003c, /* 5, -12.5dB */
124 0x10000040, /* 6, -12.0dB */
125 0x11000044, /* 7, -11.5dB */
126 0x12000048, /* 8, -11.0dB */
127 0x1300004c, /* 9, -10.5dB */
128 0x14400051, /* 10, -10.0dB */
129 0x15800056, /* 11, -9.5dB */
130 0x16c0005b, /* 12, -9.0dB */
131 0x18000060, /* 13, -8.5dB */
132 0x19800066, /* 14, -8.0dB */
133 0x1b00006c, /* 15, -7.5dB */
134 0x1c800072, /* 16, -7.0dB */
135 0x1e400079, /* 17, -6.5dB */
136 0x20000080, /* 18, -6.0dB */
137 0x22000088, /* 19, -5.5dB */
138 0x24000090, /* 20, -5.0dB */
139 0x26000098, /* 21, -4.5dB */
140 0x288000a2, /* 22, -4.0dB */
141 0x2ac000ab, /* 23, -3.5dB */
142 0x2d4000b5, /* 24, -3.0dB */
143 0x300000c0, /* 25, -2.5dB */
144 0x32c000cb, /* 26, -2.0dB */
145 0x35c000d7, /* 27, -1.5dB */
146 0x390000e4, /* 28, -1.0dB */
147 0x3c8000f2, /* 29, -0.5dB */
148 0x40000100, /* 30, +0dB */
149 0x43c0010f, /* 31, +0.5dB */
150 0x47c0011f, /* 32, +1.0dB */
151 0x4c000130, /* 33, +1.5dB */
152 0x50800142, /* 34, +2.0dB */
153 0x55400155, /* 35, +2.5dB */
154 0x5a400169, /* 36, +3.0dB */
155 0x5fc0017f, /* 37, +3.5dB */
156 0x65400195, /* 38, +4.0dB */
157 0x6b8001ae, /* 39, +4.5dB */
158 0x71c001c7, /* 40, +5.0dB */
159 0x788001e2, /* 41, +5.5dB */
160 0x7f8001fe /* 42, +6.0dB */
161};
162
163static const u8 cckswing_table_ch1ch13[CCK_TABLE_SIZE][8] = {
164 {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}, /* 0, -16.0dB */
165 {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01}, /* 1, -15.5dB */
166 {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 2, -15.0dB */
167 {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01}, /* 3, -14.5dB */
168 {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 4, -14.0dB */
169 {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01}, /* 5, -13.5dB */
170 {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01}, /* 6, -13.0dB */
171 {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01}, /* 7, -12.5dB */
172 {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01}, /* 8, -12.0dB */
173 {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01}, /* 9, -11.5dB */
174 {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 10, -11.0dB */
175 {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01}, /* 11, -10.5dB */
176 {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 12, -10.0dB */
177 {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01}, /* 13, -9.5dB */
178 {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01}, /* 14, -9.0dB */
179 {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02}, /* 15, -8.5dB */
180 {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01}, /* 16, -8.0dB */
181 {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02}, /* 17, -7.5dB */
182 {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02}, /* 18, -7.0dB */
183 {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02}, /* 19, -6.5dB */
184 {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02}, /* 20, -6.0dB */
185 {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02}, /* 21, -5.5dB */
186 {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02}, /* 22, -5.0dB */
187 {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02}, /* 23, -4.5dB */
188 {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02}, /* 24, -4.0dB */
189 {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03}, /* 25, -3.5dB */
190 {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03}, /* 26, -3.0dB */
191 {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03}, /* 27, -2.5dB */
192 {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03}, /* 28, -2.0dB */
193 {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03}, /* 29, -1.5dB */
194 {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03}, /* 30, -1.0dB */
195 {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04}, /* 31, -0.5dB */
196 {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04} /* 32, +0dB */
197};
198
199static const u8 cckswing_table_ch14[CCK_TABLE_SIZE][8] = {
200 {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}, /* 0, -16.0dB */
201 {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 1, -15.5dB */
202 {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 2, -15.0dB */
203 {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 3, -14.5dB */
204 {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00}, /* 4, -14.0dB */
205 {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 5, -13.5dB */
206 {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 6, -13.0dB */
207 {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00}, /* 7, -12.5dB */
208 {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 8, -12.0dB */
209 {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00}, /* 9, -11.5dB */
210 {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 10, -11.0dB */
211 {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00}, /* 11, -10.5dB */
212 {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 12, -10.0dB */
213 {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00}, /* 13, -9.5dB */
214 {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 14, -9.0dB */
215 {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00}, /* 15, -8.5dB */
216 {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 16, -8.0dB */
217 {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00}, /* 17, -7.5dB */
218 {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00}, /* 18, -7.0dB */
219 {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00}, /* 19, -6.5dB */
220 {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 20, -6.0dB */
221 {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00}, /* 21, -5.5dB */
222 {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00}, /* 22, -5.0dB */
223 {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00}, /* 23, -4.5dB */
224 {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00}, /* 24, -4.0dB */
225 {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00}, /* 25, -3.5dB */
226 {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00}, /* 26, -3.0dB */
227 {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00}, /* 27, -2.5dB */
228 {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00}, /* 28, -2.0dB */
229 {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00}, /* 29, -1.5dB */
230 {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00}, /* 30, -1.0dB */
231 {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00}, /* 31, -0.5dB */
232 {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00} /* 32, +0dB */
233};
234
235static const u32 edca_setting_dl[PEER_MAX] = {
236 0xa44f, /* 0 UNKNOWN */
237 0x5ea44f, /* 1 REALTEK_90 */
238 0x5e4322, /* 2 REALTEK_92SE */
239 0x5ea42b, /* 3 BROAD */
240 0xa44f, /* 4 RAL */
241 0xa630, /* 5 ATH */
242 0x5ea630, /* 6 CISCO */
243 0x5ea42b, /* 7 MARVELL */
244};
245
246static const u32 edca_setting_ul[PEER_MAX] = {
247 0x5e4322, /* 0 UNKNOWN */
248 0xa44f, /* 1 REALTEK_90 */
249 0x5ea44f, /* 2 REALTEK_92SE */
250 0x5ea32b, /* 3 BROAD */
251 0x5ea422, /* 4 RAL */
252 0x5ea322, /* 5 ATH */
253 0x3ea430, /* 6 CISCO */
254 0x5ea44f, /* 7 MARV */
255};
256
257static u8 rtl8818e_delta_swing_table_idx_24gb_p[] = {
258 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 4,
259 4, 4, 4, 5, 5, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9};
260
261static u8 rtl8818e_delta_swing_table_idx_24gb_n[] = {
262 0, 0, 0, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6,
263 7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11};
264
265static u8 rtl8812ae_delta_swing_table_idx_24gb_n[] = {
266 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
267 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11};
268
269static u8 rtl8812ae_delta_swing_table_idx_24gb_p[] = {
270 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
271 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
272
273static u8 rtl8812ae_delta_swing_table_idx_24ga_n[] = {
274 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
275 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11};
276
277static u8 rtl8812ae_delta_swing_table_idx_24ga_p[] = {
278 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
279 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
280
281static u8 rtl8812ae_delta_swing_table_idx_24gcckb_n[] = {
282 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
283 6, 6, 7, 8, 9, 9, 9, 9, 10, 10, 10, 10, 11, 11};
284
285static u8 rtl8812ae_delta_swing_table_idx_24gcckb_p[] = {
286 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
287 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
288
289static u8 rtl8812ae_delta_swing_table_idx_24gccka_n[] = {
290 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 5, 6,
291 6, 6, 7, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11};
292
293static u8 rtl8812ae_delta_swing_table_idx_24gccka_p[] = {
294 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6,
295 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9};
296
297static u8 rtl8812ae_delta_swing_table_idx_5gb_n[][DEL_SW_IDX_SZ] = {
298 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7,
299 7, 8, 8, 9, 9, 9, 10, 10, 11, 11, 12, 12, 13},
300 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
301 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13},
302 {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 10, 11,
303 12, 12, 13, 14, 14, 14, 15, 16, 17, 17, 17, 18, 18, 18},
304};
305
306static u8 rtl8812ae_delta_swing_table_idx_5gb_p[][DEL_SW_IDX_SZ] = {
307 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8,
308 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11},
309 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8,
310 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11},
311 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9,
312 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
313};
314
315static u8 rtl8812ae_delta_swing_table_idx_5ga_n[][DEL_SW_IDX_SZ] = {
316 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8,
317 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 13, 13, 13},
318 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 8, 9,
319 9, 10, 10, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13},
320 {0, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 8, 8, 9, 10, 11,
321 12, 13, 14, 14, 15, 15, 15, 16, 16, 16, 17, 17, 18, 18},
322};
323
324static u8 rtl8812ae_delta_swing_table_idx_5ga_p[][DEL_SW_IDX_SZ] = {
325 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 8,
326 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11},
327 {0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8,
328 9, 9, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
329 {0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 9, 9,
330 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11},
331};
332
333static u8 rtl8821ae_delta_swing_table_idx_24gb_n[] = {
334 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
335 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
336
337static u8 rtl8821ae_delta_swing_table_idx_24gb_p[] = {
338 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
339 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
340
341static u8 rtl8821ae_delta_swing_table_idx_24ga_n[] = {
342 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
343 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
344
345static u8 rtl8821ae_delta_swing_table_idx_24ga_p[] = {
346 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
347 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
348
349static u8 rtl8821ae_delta_swing_table_idx_24gcckb_n[] = {
350 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
351 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
352
353static u8 rtl8821ae_delta_swing_table_idx_24gcckb_p[] = {
354 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
355 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
356
357static u8 rtl8821ae_delta_swing_table_idx_24gccka_n[] = {
358 0, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6,
359 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10};
360
361static u8 rtl8821ae_delta_swing_table_idx_24gccka_p[] = {
362 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8,
363 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12, 12, 12};
364
365static u8 rtl8821ae_delta_swing_table_idx_5gb_n[][DEL_SW_IDX_SZ] = {
366 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
367 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
368 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
369 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
370 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
371 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
372};
373
374static u8 rtl8821ae_delta_swing_table_idx_5gb_p[][DEL_SW_IDX_SZ] = {
375 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
376 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
377 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
378 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
379 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
380 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
381};
382
383static u8 rtl8821ae_delta_swing_table_idx_5ga_n[][DEL_SW_IDX_SZ] = {
384 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
385 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
386 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
387 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
388 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
389 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
390};
391
392static u8 rtl8821ae_delta_swing_table_idx_5ga_p[][DEL_SW_IDX_SZ] = {
393 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
394 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
395 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
396 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
397 {0, 0, 1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9, 9, 10, 11,
398 12, 12, 13, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16},
399};
400
401void rtl8821ae_dm_txpower_track_adjust(struct ieee80211_hw *hw,
402 u8 type, u8 *pdirection,
403 u32 *poutwrite_val)
404{
405 struct rtl_priv *rtlpriv = rtl_priv(hw);
406 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
407 u8 pwr_val = 0;
408
409 if (type == 0) {
410 if (rtlpriv->dm.swing_idx_ofdm[RF90_PATH_A] <=
411 rtlpriv->dm.swing_idx_ofdm_base[RF90_PATH_A]) {
412 *pdirection = 1;
413 pwr_val = rtldm->swing_idx_ofdm_base[RF90_PATH_A] -
414 rtldm->swing_idx_ofdm[RF90_PATH_A];
415 } else {
416 *pdirection = 2;
417 pwr_val = rtldm->swing_idx_ofdm[RF90_PATH_A] -
418 rtldm->swing_idx_ofdm_base[RF90_PATH_A];
419 }
420 } else if (type == 1) {
421 if (rtldm->swing_idx_cck <= rtldm->swing_idx_cck_base) {
422 *pdirection = 1;
423 pwr_val = rtldm->swing_idx_cck_base -
424 rtldm->swing_idx_cck;
425 } else {
426 *pdirection = 2;
427 pwr_val = rtldm->swing_idx_cck -
428 rtldm->swing_idx_cck_base;
429 }
430 }
431
432 if (pwr_val >= TXPWRTRACK_MAX_IDX && (*pdirection == 1))
433 pwr_val = TXPWRTRACK_MAX_IDX;
434
435 *poutwrite_val = pwr_val | (pwr_val << 8)|
436 (pwr_val << 16)|
437 (pwr_val << 24);
438}
439
440void rtl8821ae_dm_clear_txpower_tracking_state(struct ieee80211_hw *hw)
441{
442 struct rtl_priv *rtlpriv = rtl_priv(hw);
443 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
444 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
445 u8 p = 0;
446
447 rtldm->swing_idx_cck_base = rtldm->default_cck_index;
448 rtldm->swing_idx_cck = rtldm->default_cck_index;
449 rtldm->cck_index = 0;
450
451 for (p = RF90_PATH_A; p <= RF90_PATH_B; ++p) {
452 rtldm->swing_idx_ofdm_base[p] = rtldm->default_ofdm_index;
453 rtldm->swing_idx_ofdm[p] = rtldm->default_ofdm_index;
454 rtldm->ofdm_index[p] = rtldm->default_ofdm_index;
455
456 rtldm->power_index_offset[p] = 0;
457 rtldm->delta_power_index[p] = 0;
458 rtldm->delta_power_index_last[p] = 0;
459 /*Initial Mix mode power tracking*/
460 rtldm->absolute_ofdm_swing_idx[p] = 0;
461 rtldm->remnant_ofdm_swing_idx[p] = 0;
462 }
463 /*Initial at Modify Tx Scaling Mode*/
464 rtldm->modify_txagc_flag_path_a = false;
465 /*Initial at Modify Tx Scaling Mode*/
466 rtldm->modify_txagc_flag_path_b = false;
467 rtldm->remnant_cck_idx = 0;
468 rtldm->thermalvalue = rtlefuse->eeprom_thermalmeter;
469 rtldm->thermalvalue_iqk = rtlefuse->eeprom_thermalmeter;
470 rtldm->thermalvalue_lck = rtlefuse->eeprom_thermalmeter;
471}
472
473static u8 rtl8821ae_dm_get_swing_index(struct ieee80211_hw *hw)
474{
475 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
476 u8 i = 0;
477 u32 bb_swing;
478
479 bb_swing = phy_get_tx_swing_8812A(hw, rtlhal->current_bandtype,
480 RF90_PATH_A);
481
482 for (i = 0; i < TXSCALE_TABLE_SIZE; ++i)
483 if (bb_swing == rtl8821ae_txscaling_table[i])
484 break;
485
486 return i;
487}
488
489void rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(
490 struct ieee80211_hw *hw)
491{
492 struct rtl_priv *rtlpriv = rtl_priv(hw);
493 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
494 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
495 u8 default_swing_index = 0;
496 u8 p = 0;
497
498 rtlpriv->dm.txpower_track_control = true;
499 rtldm->thermalvalue = rtlefuse->eeprom_thermalmeter;
500 rtldm->thermalvalue_iqk = rtlefuse->eeprom_thermalmeter;
501 rtldm->thermalvalue_lck = rtlefuse->eeprom_thermalmeter;
502 default_swing_index = rtl8821ae_dm_get_swing_index(hw);
503
504 rtldm->default_ofdm_index =
505 (default_swing_index == TXSCALE_TABLE_SIZE) ?
506 24 : default_swing_index;
507 rtldm->default_cck_index = 24;
508
509 rtldm->swing_idx_cck_base = rtldm->default_cck_index;
510 rtldm->cck_index = rtldm->default_cck_index;
511
512 for (p = RF90_PATH_A; p < MAX_RF_PATH; ++p) {
513 rtldm->swing_idx_ofdm_base[p] =
514 rtldm->default_ofdm_index;
515 rtldm->ofdm_index[p] = rtldm->default_ofdm_index;
516 rtldm->delta_power_index[p] = 0;
517 rtldm->power_index_offset[p] = 0;
518 rtldm->delta_power_index_last[p] = 0;
519 }
520}
521
522static void rtl8821ae_dm_diginit(struct ieee80211_hw *hw)
523{
524 struct rtl_priv *rtlpriv = rtl_priv(hw);
525 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
526
527 dm_digtable->cur_igvalue = rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, 0x7f);
528 dm_digtable->rssi_lowthresh = DM_DIG_THRESH_LOW;
529 dm_digtable->rssi_highthresh = DM_DIG_THRESH_HIGH;
530 dm_digtable->fa_lowthresh = DM_FALSEALARM_THRESH_LOW;
531 dm_digtable->fa_highthresh = DM_FALSEALARM_THRESH_HIGH;
532 dm_digtable->rx_gain_max = DM_DIG_MAX;
533 dm_digtable->rx_gain_min = DM_DIG_MIN;
534 dm_digtable->back_val = DM_DIG_BACKOFF_DEFAULT;
535 dm_digtable->back_range_max = DM_DIG_BACKOFF_MAX;
536 dm_digtable->back_range_min = DM_DIG_BACKOFF_MIN;
537 dm_digtable->pre_cck_cca_thres = 0xff;
538 dm_digtable->cur_cck_cca_thres = 0x83;
539 dm_digtable->forbidden_igi = DM_DIG_MIN;
540 dm_digtable->large_fa_hit = 0;
541 dm_digtable->recover_cnt = 0;
542 dm_digtable->dig_dynamic_min = DM_DIG_MIN;
543 dm_digtable->dig_dynamic_min_1 = DM_DIG_MIN;
544 dm_digtable->media_connect_0 = false;
545 dm_digtable->media_connect_1 = false;
546 rtlpriv->dm.dm_initialgain_enable = true;
547 dm_digtable->bt30_cur_igi = 0x32;
548}
549
550void rtl8821ae_dm_init_edca_turbo(struct ieee80211_hw *hw)
551{
552 struct rtl_priv *rtlpriv = rtl_priv(hw);
553
554 rtlpriv->dm.current_turbo_edca = false;
555 rtlpriv->dm.is_any_nonbepkts = false;
556 rtlpriv->dm.is_cur_rdlstate = false;
557}
558
559void rtl8821ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw)
560{
561 struct rtl_priv *rtlpriv = rtl_priv(hw);
562 struct rate_adaptive *p_ra = &rtlpriv->ra;
563
564 p_ra->ratr_state = DM_RATR_STA_INIT;
565 p_ra->pre_ratr_state = DM_RATR_STA_INIT;
566
567 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
568 if (rtlpriv->dm.dm_type == DM_TYPE_BYDRIVER)
569 rtlpriv->dm.useramask = true;
570 else
571 rtlpriv->dm.useramask = false;
572
573 p_ra->high_rssi_thresh_for_ra = 50;
574 p_ra->low_rssi_thresh_for_ra40m = 20;
575}
576
577static void rtl8821ae_dm_init_dynamic_atc_switch(struct ieee80211_hw *hw)
578{
579 struct rtl_priv *rtlpriv = rtl_priv(hw);
580
581 rtlpriv->dm.crystal_cap = rtlpriv->efuse.crystalcap;
582
583 rtlpriv->dm.atc_status = rtl_get_bbreg(hw, ROFDM1_CFOTRACKING, BIT(11));
584 rtlpriv->dm.cfo_threshold = CFO_THRESHOLD_XTAL;
585}
586
587static void rtl8821ae_dm_common_info_self_init(struct ieee80211_hw *hw)
588{
589 struct rtl_priv *rtlpriv = rtl_priv(hw);
590 struct rtl_phy *rtlphy = &rtlpriv->phy;
591 u8 tmp;
592
593 rtlphy->cck_high_power =
594 (bool)rtl_get_bbreg(hw, ODM_REG_CCK_RPT_FORMAT_11AC,
595 ODM_BIT_CCK_RPT_FORMAT_11AC);
596
597 tmp = (u8)rtl_get_bbreg(hw, ODM_REG_BB_RX_PATH_11AC,
598 ODM_BIT_BB_RX_PATH_11AC);
599 if (tmp & BIT(0))
600 rtlpriv->dm.rfpath_rxenable[0] = true;
601 if (tmp & BIT(1))
602 rtlpriv->dm.rfpath_rxenable[1] = true;
603}
604
605void rtl8821ae_dm_init(struct ieee80211_hw *hw)
606{
607 struct rtl_priv *rtlpriv = rtl_priv(hw);
608 struct rtl_phy *rtlphy = &rtlpriv->phy;
609
610 spin_lock(&rtlpriv->locks.iqk_lock);
611 rtlphy->lck_inprogress = false;
612 spin_unlock(&rtlpriv->locks.iqk_lock);
613
614 rtlpriv->dm.dm_type = DM_TYPE_BYDRIVER;
615 rtl8821ae_dm_common_info_self_init(hw);
616 rtl8821ae_dm_diginit(hw);
617 rtl8821ae_dm_init_rate_adaptive_mask(hw);
618 rtl8821ae_dm_init_edca_turbo(hw);
619 rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(hw);
620 rtl8821ae_dm_init_dynamic_atc_switch(hw);
621}
622
623static void rtl8821ae_dm_find_minimum_rssi(struct ieee80211_hw *hw)
624{
625 struct rtl_priv *rtlpriv = rtl_priv(hw);
626 struct dig_t *rtl_dm_dig = &rtlpriv->dm_digtable;
627 struct rtl_mac *mac = rtl_mac(rtlpriv);
628
629 /* Determine the minimum RSSI */
630 if ((mac->link_state < MAC80211_LINKED) &&
631 (rtlpriv->dm.entry_min_undec_sm_pwdb == 0)) {
632 rtl_dm_dig->min_undec_pwdb_for_dm = 0;
633 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
634 "Not connected to any\n");
635 }
636 if (mac->link_state >= MAC80211_LINKED) {
637 if (mac->opmode == NL80211_IFTYPE_AP ||
638 mac->opmode == NL80211_IFTYPE_ADHOC) {
639 rtl_dm_dig->min_undec_pwdb_for_dm =
640 rtlpriv->dm.entry_min_undec_sm_pwdb;
641 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
642 "AP Client PWDB = 0x%lx\n",
643 rtlpriv->dm.entry_min_undec_sm_pwdb);
644 } else {
645 rtl_dm_dig->min_undec_pwdb_for_dm =
646 rtlpriv->dm.undec_sm_pwdb;
647 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
648 "STA Default Port PWDB = 0x%x\n",
649 rtl_dm_dig->min_undec_pwdb_for_dm);
650 }
651 } else {
652 rtl_dm_dig->min_undec_pwdb_for_dm =
653 rtlpriv->dm.entry_min_undec_sm_pwdb;
654 RT_TRACE(rtlpriv, COMP_BB_POWERSAVING, DBG_LOUD,
655 "AP Ext Port or disconnet PWDB = 0x%x\n",
656 rtl_dm_dig->min_undec_pwdb_for_dm);
657 }
658 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
659 "MinUndecoratedPWDBForDM =%d\n",
660 rtl_dm_dig->min_undec_pwdb_for_dm);
661}
662
663static void rtl8812ae_dm_rssi_dump_to_register(struct ieee80211_hw *hw)
664{
665 struct rtl_priv *rtlpriv = rtl_priv(hw);
666
667 rtl_write_byte(rtlpriv, RA_RSSI_DUMP,
668 rtlpriv->stats.rx_rssi_percentage[0]);
669 rtl_write_byte(rtlpriv, RB_RSSI_DUMP,
670 rtlpriv->stats.rx_rssi_percentage[1]);
671
672 /* Rx EVM*/
673 rtl_write_byte(rtlpriv, RS1_RX_EVM_DUMP,
674 rtlpriv->stats.rx_evm_dbm[0]);
675 rtl_write_byte(rtlpriv, RS2_RX_EVM_DUMP,
676 rtlpriv->stats.rx_evm_dbm[1]);
677
678 /*Rx SNR*/
679 rtl_write_byte(rtlpriv, RA_RX_SNR_DUMP,
680 (u8)(rtlpriv->stats.rx_snr_db[0]));
681 rtl_write_byte(rtlpriv, RB_RX_SNR_DUMP,
682 (u8)(rtlpriv->stats.rx_snr_db[1]));
683
684 /*Rx Cfo_Short*/
685 rtl_write_word(rtlpriv, RA_CFO_SHORT_DUMP,
686 rtlpriv->stats.rx_cfo_short[0]);
687 rtl_write_word(rtlpriv, RB_CFO_SHORT_DUMP,
688 rtlpriv->stats.rx_cfo_short[1]);
689
690 /*Rx Cfo_Tail*/
691 rtl_write_word(rtlpriv, RA_CFO_LONG_DUMP,
692 rtlpriv->stats.rx_cfo_tail[0]);
693 rtl_write_word(rtlpriv, RB_CFO_LONG_DUMP,
694 rtlpriv->stats.rx_cfo_tail[1]);
695}
696
697static void rtl8821ae_dm_check_rssi_monitor(struct ieee80211_hw *hw)
698{
699 struct rtl_priv *rtlpriv = rtl_priv(hw);
700 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
701 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
702 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
703 struct rtl_sta_info *drv_priv;
704 u8 h2c_parameter[4] = { 0 };
705 long tmp_entry_max_pwdb = 0, tmp_entry_min_pwdb = 0xff;
706 u8 stbc_tx = 0;
707 u64 cur_txokcnt = 0, cur_rxokcnt = 0;
708 static u64 last_txokcnt = 0, last_rxokcnt;
709
710 cur_txokcnt = rtlpriv->stats.txbytesunicast - last_txokcnt;
711 cur_rxokcnt = rtlpriv->stats.rxbytesunicast - last_rxokcnt;
712 last_txokcnt = rtlpriv->stats.txbytesunicast;
713 last_rxokcnt = rtlpriv->stats.rxbytesunicast;
714 if (cur_rxokcnt > (last_txokcnt * 6))
715 h2c_parameter[3] = 0x01;
716 else
717 h2c_parameter[3] = 0x00;
718
719 /* AP & ADHOC & MESH */
720 if (mac->opmode == NL80211_IFTYPE_AP ||
721 mac->opmode == NL80211_IFTYPE_ADHOC ||
722 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
723 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
724 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list) {
725 if (drv_priv->rssi_stat.undec_sm_pwdb <
726 tmp_entry_min_pwdb)
727 tmp_entry_min_pwdb =
728 drv_priv->rssi_stat.undec_sm_pwdb;
729 if (drv_priv->rssi_stat.undec_sm_pwdb >
730 tmp_entry_max_pwdb)
731 tmp_entry_max_pwdb =
732 drv_priv->rssi_stat.undec_sm_pwdb;
733 }
734 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
735
736 /* If associated entry is found */
737 if (tmp_entry_max_pwdb != 0) {
738 rtlpriv->dm.entry_max_undec_sm_pwdb =
739 tmp_entry_max_pwdb;
740 RTPRINT(rtlpriv, FDM, DM_PWDB,
741 "EntryMaxPWDB = 0x%lx(%ld)\n",
742 tmp_entry_max_pwdb, tmp_entry_max_pwdb);
743 } else {
744 rtlpriv->dm.entry_max_undec_sm_pwdb = 0;
745 }
746 /* If associated entry is found */
747 if (tmp_entry_min_pwdb != 0xff) {
748 rtlpriv->dm.entry_min_undec_sm_pwdb =
749 tmp_entry_min_pwdb;
750 RTPRINT(rtlpriv, FDM, DM_PWDB,
751 "EntryMinPWDB = 0x%lx(%ld)\n",
752 tmp_entry_min_pwdb, tmp_entry_min_pwdb);
753 } else {
754 rtlpriv->dm.entry_min_undec_sm_pwdb = 0;
755 }
756 }
757 /* Indicate Rx signal strength to FW. */
758 if (rtlpriv->dm.useramask) {
759 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
760 if (mac->mode == WIRELESS_MODE_AC_24G ||
761 mac->mode == WIRELESS_MODE_AC_5G ||
762 mac->mode == WIRELESS_MODE_AC_ONLY)
763 stbc_tx = (mac->vht_cur_stbc &
764 STBC_VHT_ENABLE_TX) ? 1 : 0;
765 else
766 stbc_tx = (mac->ht_cur_stbc &
767 STBC_HT_ENABLE_TX) ? 1 : 0;
768 h2c_parameter[3] |= stbc_tx << 1;
769 }
770 h2c_parameter[2] =
771 (u8)(rtlpriv->dm.undec_sm_pwdb & 0xFF);
772 h2c_parameter[1] = 0x20;
773 h2c_parameter[0] = 0;
774 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
775 rtl8821ae_fill_h2c_cmd(hw, H2C_RSSI_21AE_REPORT, 4,
776 h2c_parameter);
777 else
778 rtl8821ae_fill_h2c_cmd(hw, H2C_RSSI_21AE_REPORT, 3,
779 h2c_parameter);
780 } else {
781 rtl_write_byte(rtlpriv, 0x4fe, rtlpriv->dm.undec_sm_pwdb);
782 }
783 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
784 rtl8812ae_dm_rssi_dump_to_register(hw);
785 rtl8821ae_dm_find_minimum_rssi(hw);
786 dm_digtable->rssi_val_min = rtlpriv->dm_digtable.min_undec_pwdb_for_dm;
787}
788
789void rtl8821ae_dm_write_cck_cca_thres(struct ieee80211_hw *hw, u8 current_cca)
790{
791 struct rtl_priv *rtlpriv = rtl_priv(hw);
792 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
793
794 if (dm_digtable->cur_cck_cca_thres != current_cca)
795 rtl_write_byte(rtlpriv, DM_REG_CCK_CCA_11AC, current_cca);
796
797 dm_digtable->pre_cck_cca_thres = dm_digtable->cur_cck_cca_thres;
798 dm_digtable->cur_cck_cca_thres = current_cca;
799}
800
801void rtl8821ae_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi)
802{
803 struct rtl_priv *rtlpriv = rtl_priv(hw);
804 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
805
806 if (dm_digtable->stop_dig)
807 return;
808
809 if (dm_digtable->cur_igvalue != current_igi) {
810 rtl_set_bbreg(hw, DM_REG_IGI_A_11AC,
811 DM_BIT_IGI_11AC, current_igi);
812 if (rtlpriv->phy.rf_type != RF_1T1R)
813 rtl_set_bbreg(hw, DM_REG_IGI_B_11AC,
814 DM_BIT_IGI_11AC, current_igi);
815 }
816 dm_digtable->cur_igvalue = current_igi;
817}
818
819static void rtl8821ae_dm_dig(struct ieee80211_hw *hw)
820{
821 struct rtl_priv *rtlpriv = rtl_priv(hw);
822 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
823 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
824 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
825 u8 dig_dynamic_min;
826 u8 dig_max_of_min;
827 bool first_connect, first_disconnect;
828 u8 dm_dig_max, dm_dig_min, offset;
829 u8 current_igi = dm_digtable->cur_igvalue;
830
831 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "\n");
832
833 if (mac->act_scanning) {
834 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
835 "Return: In Scan Progress\n");
836 return;
837 }
838
839 /*add by Neil Chen to avoid PSD is processing*/
840 dig_dynamic_min = dm_digtable->dig_dynamic_min;
841 first_connect = (mac->link_state >= MAC80211_LINKED) &&
842 (!dm_digtable->media_connect_0);
843 first_disconnect = (mac->link_state < MAC80211_LINKED) &&
844 (dm_digtable->media_connect_0);
845
846 /*1 Boundary Decision*/
847
848 dm_dig_max = 0x5A;
849
850 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8821AE)
851 dm_dig_min = DM_DIG_MIN;
852 else
853 dm_dig_min = 0x1C;
854
855 dig_max_of_min = DM_DIG_MAX_AP;
856
857 if (mac->link_state >= MAC80211_LINKED) {
858 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8821AE)
859 offset = 20;
860 else
861 offset = 10;
862
863 if ((dm_digtable->rssi_val_min + offset) > dm_dig_max)
864 dm_digtable->rx_gain_max = dm_dig_max;
865 else if ((dm_digtable->rssi_val_min + offset) < dm_dig_min)
866 dm_digtable->rx_gain_max = dm_dig_min;
867 else
868 dm_digtable->rx_gain_max =
869 dm_digtable->rssi_val_min + offset;
870
871 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
872 "dm_digtable->rssi_val_min=0x%x,dm_digtable->rx_gain_max = 0x%x",
873 dm_digtable->rssi_val_min,
874 dm_digtable->rx_gain_max);
875 if (rtlpriv->dm.one_entry_only) {
876 offset = 0;
877
878 if (dm_digtable->rssi_val_min - offset < dm_dig_min)
879 dig_dynamic_min = dm_dig_min;
880 else if (dm_digtable->rssi_val_min -
881 offset > dig_max_of_min)
882 dig_dynamic_min = dig_max_of_min;
883 else
884 dig_dynamic_min =
885 dm_digtable->rssi_val_min - offset;
886
887 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
888 "bOneEntryOnly=TRUE, dig_dynamic_min=0x%x\n",
889 dig_dynamic_min);
890 } else {
891 dig_dynamic_min = dm_dig_min;
892 }
893 } else {
894 dm_digtable->rx_gain_max = dm_dig_max;
895 dig_dynamic_min = dm_dig_min;
896 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
897 "No Link\n");
898 }
899
900 if (rtlpriv->falsealm_cnt.cnt_all > 10000) {
901 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
902 "Abnornally false alarm case.\n");
903
904 if (dm_digtable->large_fa_hit != 3)
905 dm_digtable->large_fa_hit++;
906 if (dm_digtable->forbidden_igi < current_igi) {
907 dm_digtable->forbidden_igi = current_igi;
908 dm_digtable->large_fa_hit = 1;
909 }
910
911 if (dm_digtable->large_fa_hit >= 3) {
912 if ((dm_digtable->forbidden_igi + 1) >
913 dm_digtable->rx_gain_max)
914 dm_digtable->rx_gain_min =
915 dm_digtable->rx_gain_max;
916 else
917 dm_digtable->rx_gain_min =
918 (dm_digtable->forbidden_igi + 1);
919 dm_digtable->recover_cnt = 3600;
920 }
921 } else {
922 /*Recovery mechanism for IGI lower bound*/
923 if (dm_digtable->recover_cnt != 0) {
924 dm_digtable->recover_cnt--;
925 } else {
926 if (dm_digtable->large_fa_hit < 3) {
927 if ((dm_digtable->forbidden_igi - 1) <
928 dig_dynamic_min) {
929 dm_digtable->forbidden_igi =
930 dig_dynamic_min;
931 dm_digtable->rx_gain_min =
932 dig_dynamic_min;
933 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
934 "Normal Case: At Lower Bound\n");
935 } else {
936 dm_digtable->forbidden_igi--;
937 dm_digtable->rx_gain_min =
938 (dm_digtable->forbidden_igi + 1);
939 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
940 "Normal Case: Approach Lower Bound\n");
941 }
942 } else {
943 dm_digtable->large_fa_hit = 0;
944 }
945 }
946 }
947 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
948 "pDM_DigTable->LargeFAHit=%d\n",
949 dm_digtable->large_fa_hit);
950
951 if (rtlpriv->dm.dbginfo.num_qry_beacon_pkt < 10)
952 dm_digtable->rx_gain_min = dm_dig_min;
953
954 if (dm_digtable->rx_gain_min > dm_digtable->rx_gain_max)
955 dm_digtable->rx_gain_min = dm_digtable->rx_gain_max;
956
957 /*Adjust initial gain by false alarm*/
958 if (mac->link_state >= MAC80211_LINKED) {
959 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
960 "DIG AfterLink\n");
961 if (first_connect) {
962 if (dm_digtable->rssi_val_min <= dig_max_of_min)
963 current_igi = dm_digtable->rssi_val_min;
964 else
965 current_igi = dig_max_of_min;
966 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
967 "First Connect\n");
968 } else {
969 if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH2)
970 current_igi = current_igi + 4;
971 else if (rtlpriv->falsealm_cnt.cnt_all > DM_DIG_FA_TH1)
972 current_igi = current_igi + 2;
973 else if (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH0)
974 current_igi = current_igi - 2;
975
976 if ((rtlpriv->dm.dbginfo.num_qry_beacon_pkt < 10) &&
977 (rtlpriv->falsealm_cnt.cnt_all < DM_DIG_FA_TH1)) {
978 current_igi = dm_digtable->rx_gain_min;
979 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
980 "Beacon is less than 10 and FA is less than 768, IGI GOES TO 0x1E!!!!!!!!!!!!\n");
981 }
982 }
983 } else {
984 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
985 "DIG BeforeLink\n");
986 if (first_disconnect) {
987 current_igi = dm_digtable->rx_gain_min;
988 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
989 "First DisConnect\n");
990 } else {
991 /* 2012.03.30 LukeLee: enable DIG before
992 * link but with very high thresholds
993 */
994 if (rtlpriv->falsealm_cnt.cnt_all > 2000)
995 current_igi = current_igi + 4;
996 else if (rtlpriv->falsealm_cnt.cnt_all > 600)
997 current_igi = current_igi + 2;
998 else if (rtlpriv->falsealm_cnt.cnt_all < 300)
999 current_igi = current_igi - 2;
1000
1001 if (current_igi >= 0x3e)
1002 current_igi = 0x3e;
1003
1004 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "England DIG\n");
1005 }
1006 }
1007 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1008 "DIG End Adjust IGI\n");
1009 /* Check initial gain by upper/lower bound*/
1010
1011 if (current_igi > dm_digtable->rx_gain_max)
1012 current_igi = dm_digtable->rx_gain_max;
1013 if (current_igi < dm_digtable->rx_gain_min)
1014 current_igi = dm_digtable->rx_gain_min;
1015
1016 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1017 "rx_gain_max=0x%x, rx_gain_min=0x%x\n",
1018 dm_digtable->rx_gain_max, dm_digtable->rx_gain_min);
1019 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1020 "TotalFA=%d\n", rtlpriv->falsealm_cnt.cnt_all);
1021 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
1022 "CurIGValue=0x%x\n", current_igi);
1023
1024 rtl8821ae_dm_write_dig(hw, current_igi);
1025 dm_digtable->media_connect_0 =
1026 ((mac->link_state >= MAC80211_LINKED) ? true : false);
1027 dm_digtable->dig_dynamic_min = dig_dynamic_min;
1028}
1029
1030static void rtl8821ae_dm_common_info_self_update(struct ieee80211_hw *hw)
1031{
1032 struct rtl_priv *rtlpriv = rtl_priv(hw);
1033 u8 cnt = 0;
1034 struct rtl_sta_info *drv_priv;
1035
1036 rtlpriv->dm.tx_rate = 0xff;
1037
1038 rtlpriv->dm.one_entry_only = false;
1039
1040 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_STATION &&
1041 rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
1042 rtlpriv->dm.one_entry_only = true;
1043 return;
1044 }
1045
1046 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_AP ||
1047 rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC ||
1048 rtlpriv->mac80211.opmode == NL80211_IFTYPE_MESH_POINT) {
1049 spin_lock_bh(&rtlpriv->locks.entry_list_lock);
1050 list_for_each_entry(drv_priv, &rtlpriv->entry_list, list)
1051 cnt++;
1052 spin_unlock_bh(&rtlpriv->locks.entry_list_lock);
1053
1054 if (cnt == 1)
1055 rtlpriv->dm.one_entry_only = true;
1056 }
1057}
1058
1059static void rtl8821ae_dm_false_alarm_counter_statistics(struct ieee80211_hw *hw)
1060{
1061 struct rtl_priv *rtlpriv = rtl_priv(hw);
1062 struct false_alarm_statistics *falsealm_cnt = &rtlpriv->falsealm_cnt;
1063 u32 cck_enable = 0;
1064
1065 /*read OFDM FA counter*/
1066 falsealm_cnt->cnt_ofdm_fail =
1067 rtl_get_bbreg(hw, ODM_REG_OFDM_FA_11AC, BMASKLWORD);
1068 falsealm_cnt->cnt_cck_fail =
1069 rtl_get_bbreg(hw, ODM_REG_CCK_FA_11AC, BMASKLWORD);
1070
1071 cck_enable = rtl_get_bbreg(hw, ODM_REG_BB_RX_PATH_11AC, BIT(28));
1072 if (cck_enable) /*if(pDM_Odm->pBandType == ODM_BAND_2_4G)*/
1073 falsealm_cnt->cnt_all = falsealm_cnt->cnt_ofdm_fail +
1074 falsealm_cnt->cnt_cck_fail;
1075 else
1076 falsealm_cnt->cnt_all = falsealm_cnt->cnt_ofdm_fail;
1077
1078 /*reset OFDM FA coutner*/
1079 rtl_set_bbreg(hw, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 1);
1080 rtl_set_bbreg(hw, ODM_REG_OFDM_FA_RST_11AC, BIT(17), 0);
1081 /* reset CCK FA counter*/
1082 rtl_set_bbreg(hw, ODM_REG_CCK_FA_RST_11AC, BIT(15), 0);
1083 rtl_set_bbreg(hw, ODM_REG_CCK_FA_RST_11AC, BIT(15), 1);
1084
1085 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "Cnt_Cck_fail=%d\n",
1086 falsealm_cnt->cnt_cck_fail);
1087 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "cnt_ofdm_fail=%d\n",
1088 falsealm_cnt->cnt_ofdm_fail);
1089 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "Total False Alarm=%d\n",
1090 falsealm_cnt->cnt_all);
1091}
1092
1093static void rtl8812ae_dm_check_txpower_tracking_thermalmeter(
1094 struct ieee80211_hw *hw)
1095{
1096 struct rtl_priv *rtlpriv = rtl_priv(hw);
1097 static u8 tm_trigger;
1098
1099 if (!tm_trigger) {
1100 rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER_88E,
1101 BIT(17) | BIT(16), 0x03);
1102 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1103 "Trigger 8812 Thermal Meter!!\n");
1104 tm_trigger = 1;
1105 return;
1106 }
1107 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1108 "Schedule TxPowerTracking direct call!!\n");
1109 rtl8812ae_dm_txpower_tracking_callback_thermalmeter(hw);
1110 tm_trigger = 0;
1111}
1112
1113static void rtl8821ae_dm_iq_calibrate(struct ieee80211_hw *hw)
1114{
1115 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1116 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1117 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1118
1119 if (mac->link_state >= MAC80211_LINKED) {
1120 if (rtldm->linked_interval < 3)
1121 rtldm->linked_interval++;
1122
1123 if (rtldm->linked_interval == 2) {
1124 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1125 rtl8812ae_phy_iq_calibrate(hw, false);
1126 else
1127 rtl8821ae_phy_iq_calibrate(hw, false);
1128 }
1129 } else {
1130 rtldm->linked_interval = 0;
1131 }
1132}
1133
1134static void rtl8812ae_get_delta_swing_table(struct ieee80211_hw *hw,
1135 u8 **up_a, u8 **down_a,
1136 u8 **up_b, u8 **down_b)
1137{
1138 struct rtl_priv *rtlpriv = rtl_priv(hw);
1139 struct rtl_phy *rtlphy = &rtlpriv->phy;
1140 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1141 u8 channel = rtlphy->current_channel;
1142 u8 rate = rtldm->tx_rate;
1143
1144 if (1 <= channel && channel <= 14) {
1145 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate)) {
1146 *up_a = rtl8812ae_delta_swing_table_idx_24gccka_p;
1147 *down_a = rtl8812ae_delta_swing_table_idx_24gccka_n;
1148 *up_b = rtl8812ae_delta_swing_table_idx_24gcckb_p;
1149 *down_b = rtl8812ae_delta_swing_table_idx_24gcckb_n;
1150 } else {
1151 *up_a = rtl8812ae_delta_swing_table_idx_24ga_p;
1152 *down_a = rtl8812ae_delta_swing_table_idx_24ga_n;
1153 *up_b = rtl8812ae_delta_swing_table_idx_24gb_p;
1154 *down_b = rtl8812ae_delta_swing_table_idx_24gb_n;
1155 }
1156 } else if (36 <= channel && channel <= 64) {
1157 *up_a = rtl8812ae_delta_swing_table_idx_5ga_p[0];
1158 *down_a = rtl8812ae_delta_swing_table_idx_5ga_n[0];
1159 *up_b = rtl8812ae_delta_swing_table_idx_5gb_p[0];
1160 *down_b = rtl8812ae_delta_swing_table_idx_5gb_n[0];
1161 } else if (100 <= channel && channel <= 140) {
1162 *up_a = rtl8812ae_delta_swing_table_idx_5ga_p[1];
1163 *down_a = rtl8812ae_delta_swing_table_idx_5ga_n[1];
1164 *up_b = rtl8812ae_delta_swing_table_idx_5gb_p[1];
1165 *down_b = rtl8812ae_delta_swing_table_idx_5gb_n[1];
1166 } else if (149 <= channel && channel <= 173) {
1167 *up_a = rtl8812ae_delta_swing_table_idx_5ga_p[2];
1168 *down_a = rtl8812ae_delta_swing_table_idx_5ga_n[2];
1169 *up_b = rtl8812ae_delta_swing_table_idx_5gb_p[2];
1170 *down_b = rtl8812ae_delta_swing_table_idx_5gb_n[2];
1171 } else {
1172 *up_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
1173 *down_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
1174 *up_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
1175 *down_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
1176 }
1177}
1178
1179void rtl8821ae_dm_update_init_rate(struct ieee80211_hw *hw, u8 rate)
1180{
1181 struct rtl_priv *rtlpriv = rtl_priv(hw);
1182 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1183 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1184 u8 p = 0;
1185
1186 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1187 "Get C2H Command! Rate=0x%x\n", rate);
1188
1189 rtldm->tx_rate = rate;
1190
1191 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1192 rtl8821ae_dm_txpwr_track_set_pwr(hw, MIX_MODE, RF90_PATH_A, 0);
1193 } else {
1194 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1195 rtl8812ae_dm_txpwr_track_set_pwr(hw, MIX_MODE, p, 0);
1196 }
1197}
1198
1199u8 rtl8821ae_hw_rate_to_mrate(struct ieee80211_hw *hw, u8 rate)
1200{
1201 struct rtl_priv *rtlpriv = rtl_priv(hw);
1202 u8 ret_rate = MGN_1M;
1203
1204 switch (rate) {
1205 case DESC_RATE1M:
1206 ret_rate = MGN_1M;
1207 break;
1208 case DESC_RATE2M:
1209 ret_rate = MGN_2M;
1210 break;
1211 case DESC_RATE5_5M:
1212 ret_rate = MGN_5_5M;
1213 break;
1214 case DESC_RATE11M:
1215 ret_rate = MGN_11M;
1216 break;
1217 case DESC_RATE6M:
1218 ret_rate = MGN_6M;
1219 break;
1220 case DESC_RATE9M:
1221 ret_rate = MGN_9M;
1222 break;
1223 case DESC_RATE12M:
1224 ret_rate = MGN_12M;
1225 break;
1226 case DESC_RATE18M:
1227 ret_rate = MGN_18M;
1228 break;
1229 case DESC_RATE24M:
1230 ret_rate = MGN_24M;
1231 break;
1232 case DESC_RATE36M:
1233 ret_rate = MGN_36M;
1234 break;
1235 case DESC_RATE48M:
1236 ret_rate = MGN_48M;
1237 break;
1238 case DESC_RATE54M:
1239 ret_rate = MGN_54M;
1240 break;
1241 case DESC_RATEMCS0:
1242 ret_rate = MGN_MCS0;
1243 break;
1244 case DESC_RATEMCS1:
1245 ret_rate = MGN_MCS1;
1246 break;
1247 case DESC_RATEMCS2:
1248 ret_rate = MGN_MCS2;
1249 break;
1250 case DESC_RATEMCS3:
1251 ret_rate = MGN_MCS3;
1252 break;
1253 case DESC_RATEMCS4:
1254 ret_rate = MGN_MCS4;
1255 break;
1256 case DESC_RATEMCS5:
1257 ret_rate = MGN_MCS5;
1258 break;
1259 case DESC_RATEMCS6:
1260 ret_rate = MGN_MCS6;
1261 break;
1262 case DESC_RATEMCS7:
1263 ret_rate = MGN_MCS7;
1264 break;
1265 case DESC_RATEMCS8:
1266 ret_rate = MGN_MCS8;
1267 break;
1268 case DESC_RATEMCS9:
1269 ret_rate = MGN_MCS9;
1270 break;
1271 case DESC_RATEMCS10:
1272 ret_rate = MGN_MCS10;
1273 break;
1274 case DESC_RATEMCS11:
1275 ret_rate = MGN_MCS11;
1276 break;
1277 case DESC_RATEMCS12:
1278 ret_rate = MGN_MCS12;
1279 break;
1280 case DESC_RATEMCS13:
1281 ret_rate = MGN_MCS13;
1282 break;
1283 case DESC_RATEMCS14:
1284 ret_rate = MGN_MCS14;
1285 break;
1286 case DESC_RATEMCS15:
1287 ret_rate = MGN_MCS15;
1288 break;
1289 case DESC_RATEVHT1SS_MCS0:
1290 ret_rate = MGN_VHT1SS_MCS0;
1291 break;
1292 case DESC_RATEVHT1SS_MCS1:
1293 ret_rate = MGN_VHT1SS_MCS1;
1294 break;
1295 case DESC_RATEVHT1SS_MCS2:
1296 ret_rate = MGN_VHT1SS_MCS2;
1297 break;
1298 case DESC_RATEVHT1SS_MCS3:
1299 ret_rate = MGN_VHT1SS_MCS3;
1300 break;
1301 case DESC_RATEVHT1SS_MCS4:
1302 ret_rate = MGN_VHT1SS_MCS4;
1303 break;
1304 case DESC_RATEVHT1SS_MCS5:
1305 ret_rate = MGN_VHT1SS_MCS5;
1306 break;
1307 case DESC_RATEVHT1SS_MCS6:
1308 ret_rate = MGN_VHT1SS_MCS6;
1309 break;
1310 case DESC_RATEVHT1SS_MCS7:
1311 ret_rate = MGN_VHT1SS_MCS7;
1312 break;
1313 case DESC_RATEVHT1SS_MCS8:
1314 ret_rate = MGN_VHT1SS_MCS8;
1315 break;
1316 case DESC_RATEVHT1SS_MCS9:
1317 ret_rate = MGN_VHT1SS_MCS9;
1318 break;
1319 case DESC_RATEVHT2SS_MCS0:
1320 ret_rate = MGN_VHT2SS_MCS0;
1321 break;
1322 case DESC_RATEVHT2SS_MCS1:
1323 ret_rate = MGN_VHT2SS_MCS1;
1324 break;
1325 case DESC_RATEVHT2SS_MCS2:
1326 ret_rate = MGN_VHT2SS_MCS2;
1327 break;
1328 case DESC_RATEVHT2SS_MCS3:
1329 ret_rate = MGN_VHT2SS_MCS3;
1330 break;
1331 case DESC_RATEVHT2SS_MCS4:
1332 ret_rate = MGN_VHT2SS_MCS4;
1333 break;
1334 case DESC_RATEVHT2SS_MCS5:
1335 ret_rate = MGN_VHT2SS_MCS5;
1336 break;
1337 case DESC_RATEVHT2SS_MCS6:
1338 ret_rate = MGN_VHT2SS_MCS6;
1339 break;
1340 case DESC_RATEVHT2SS_MCS7:
1341 ret_rate = MGN_VHT2SS_MCS7;
1342 break;
1343 case DESC_RATEVHT2SS_MCS8:
1344 ret_rate = MGN_VHT2SS_MCS8;
1345 break;
1346 case DESC_RATEVHT2SS_MCS9:
1347 ret_rate = MGN_VHT2SS_MCS9;
1348 break;
1349 default:
1350 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1351 "HwRateToMRate8812(): Non supported Rate [%x]!!!\n",
1352 rate);
1353 break;
1354 }
1355 return ret_rate;
1356}
1357
1358/*-----------------------------------------------------------------------------
1359 * Function: odm_TxPwrTrackSetPwr88E()
1360 *
1361 * Overview: 88E change all channel tx power accordign to flag.
1362 * OFDM & CCK are all different.
1363 *
1364 * Input: NONE
1365 *
1366 * Output: NONE
1367 *
1368 * Return: NONE
1369 *
1370 * Revised History:
1371 * When Who Remark
1372 * 04/23/2012 MHC Create Version 0.
1373 *
1374 *---------------------------------------------------------------------------
1375 */
1376void rtl8812ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
1377 enum pwr_track_control_method method,
1378 u8 rf_path, u8 channel_mapped_index)
1379{
1380 struct rtl_priv *rtlpriv = rtl_priv(hw);
1381 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1382 struct rtl_phy *rtlphy = &rtlpriv->phy;
1383 u32 final_swing_idx[2];
1384 u8 pwr_tracking_limit = 26; /*+1.0dB*/
1385 u8 tx_rate = 0xFF;
1386 char final_ofdm_swing_index = 0;
1387
1388 if (rtldm->tx_rate != 0xFF)
1389 tx_rate =
1390 rtl8821ae_hw_rate_to_mrate(hw, rtldm->tx_rate);
1391
1392 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1393 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
1394 /*20130429 Mimic Modify High Rate BBSwing Limit.*/
1395 if (tx_rate != 0xFF) {
1396 /*CCK*/
1397 if ((tx_rate >= MGN_1M) && (tx_rate <= MGN_11M))
1398 pwr_tracking_limit = 32; /*+4dB*/
1399 /*OFDM*/
1400 else if ((tx_rate >= MGN_6M) && (tx_rate <= MGN_48M))
1401 pwr_tracking_limit = 30; /*+3dB*/
1402 else if (tx_rate == MGN_54M)
1403 pwr_tracking_limit = 28; /*+2dB*/
1404 /*HT*/
1405 /*QPSK/BPSK*/
1406 else if ((tx_rate >= MGN_MCS0) && (tx_rate <= MGN_MCS2))
1407 pwr_tracking_limit = 34; /*+5dB*/
1408 /*16QAM*/
1409 else if ((tx_rate >= MGN_MCS3) && (tx_rate <= MGN_MCS4))
1410 pwr_tracking_limit = 30; /*+3dB*/
1411 /*64QAM*/
1412 else if ((tx_rate >= MGN_MCS5) && (tx_rate <= MGN_MCS7))
1413 pwr_tracking_limit = 28; /*+2dB*/
1414 /*QPSK/BPSK*/
1415 else if ((tx_rate >= MGN_MCS8) && (tx_rate <= MGN_MCS10))
1416 pwr_tracking_limit = 34; /*+5dB*/
1417 /*16QAM*/
1418 else if ((tx_rate >= MGN_MCS11) && (tx_rate <= MGN_MCS12))
1419 pwr_tracking_limit = 30; /*+3dB*/
1420 /*64QAM*/
1421 else if ((tx_rate >= MGN_MCS13) && (tx_rate <= MGN_MCS15))
1422 pwr_tracking_limit = 28; /*+2dB*/
1423
1424 /*2 VHT*/
1425 /*QPSK/BPSK*/
1426 else if ((tx_rate >= MGN_VHT1SS_MCS0) &&
1427 (tx_rate <= MGN_VHT1SS_MCS2))
1428 pwr_tracking_limit = 34; /*+5dB*/
1429 /*16QAM*/
1430 else if ((tx_rate >= MGN_VHT1SS_MCS3) &&
1431 (tx_rate <= MGN_VHT1SS_MCS4))
1432 pwr_tracking_limit = 30; /*+3dB*/
1433 /*64QAM*/
1434 else if ((tx_rate >= MGN_VHT1SS_MCS5) &&
1435 (tx_rate <= MGN_VHT1SS_MCS6))
1436 pwr_tracking_limit = 28; /*+2dB*/
1437 else if (tx_rate == MGN_VHT1SS_MCS7) /*64QAM*/
1438 pwr_tracking_limit = 26; /*+1dB*/
1439 else if (tx_rate == MGN_VHT1SS_MCS8) /*256QAM*/
1440 pwr_tracking_limit = 24; /*+0dB*/
1441 else if (tx_rate == MGN_VHT1SS_MCS9) /*256QAM*/
1442 pwr_tracking_limit = 22; /*-1dB*/
1443 /*QPSK/BPSK*/
1444 else if ((tx_rate >= MGN_VHT2SS_MCS0) &&
1445 (tx_rate <= MGN_VHT2SS_MCS2))
1446 pwr_tracking_limit = 34; /*+5dB*/
1447 /*16QAM*/
1448 else if ((tx_rate >= MGN_VHT2SS_MCS3) &&
1449 (tx_rate <= MGN_VHT2SS_MCS4))
1450 pwr_tracking_limit = 30; /*+3dB*/
1451 /*64QAM*/
1452 else if ((tx_rate >= MGN_VHT2SS_MCS5) &&
1453 (tx_rate <= MGN_VHT2SS_MCS6))
1454 pwr_tracking_limit = 28; /*+2dB*/
1455 else if (tx_rate == MGN_VHT2SS_MCS7) /*64QAM*/
1456 pwr_tracking_limit = 26; /*+1dB*/
1457 else if (tx_rate == MGN_VHT2SS_MCS8) /*256QAM*/
1458 pwr_tracking_limit = 24; /*+0dB*/
1459 else if (tx_rate == MGN_VHT2SS_MCS9) /*256QAM*/
1460 pwr_tracking_limit = 22; /*-1dB*/
1461 else
1462 pwr_tracking_limit = 24;
1463 }
1464 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1465 "TxRate=0x%x, PwrTrackingLimit=%d\n",
1466 tx_rate, pwr_tracking_limit);
1467
1468 if (method == BBSWING) {
1469 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1470 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
1471
1472 if (rf_path == RF90_PATH_A) {
1473 u32 tmp;
1474
1475 final_swing_idx[RF90_PATH_A] =
1476 (rtldm->ofdm_index[RF90_PATH_A] >
1477 pwr_tracking_limit) ?
1478 pwr_tracking_limit :
1479 rtldm->ofdm_index[RF90_PATH_A];
1480 tmp = final_swing_idx[RF90_PATH_A];
1481 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1482 "pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d,pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n",
1483 rtldm->ofdm_index[RF90_PATH_A],
1484 final_swing_idx[RF90_PATH_A]);
1485
1486 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1487 txscaling_tbl[tmp]);
1488 } else {
1489 u32 tmp;
1490
1491 final_swing_idx[RF90_PATH_B] =
1492 rtldm->ofdm_index[RF90_PATH_B] >
1493 pwr_tracking_limit ?
1494 pwr_tracking_limit :
1495 rtldm->ofdm_index[RF90_PATH_B];
1496 tmp = final_swing_idx[RF90_PATH_B];
1497 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1498 "pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_B]=%d, pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_B]=%d\n",
1499 rtldm->ofdm_index[RF90_PATH_B],
1500 final_swing_idx[RF90_PATH_B]);
1501
1502 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
1503 txscaling_tbl[tmp]);
1504 }
1505 } else if (method == MIX_MODE) {
1506 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1507 "pDM_Odm->DefaultOfdmIndex=%d, pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n",
1508 rtldm->default_ofdm_index,
1509 rtldm->absolute_ofdm_swing_idx[rf_path],
1510 rf_path);
1511
1512 final_ofdm_swing_index = rtldm->default_ofdm_index +
1513 rtldm->absolute_ofdm_swing_idx[rf_path];
1514
1515 if (rf_path == RF90_PATH_A) {
1516 /*BBSwing higher then Limit*/
1517 if (final_ofdm_swing_index > pwr_tracking_limit) {
1518 rtldm->remnant_cck_idx =
1519 final_ofdm_swing_index -
1520 pwr_tracking_limit;
1521 /* CCK Follow the same compensation value
1522 * as Path A
1523 */
1524 rtldm->remnant_ofdm_swing_idx[rf_path] =
1525 final_ofdm_swing_index -
1526 pwr_tracking_limit;
1527
1528 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1529 txscaling_tbl[pwr_tracking_limit]);
1530
1531 rtldm->modify_txagc_flag_path_a = true;
1532
1533 /*Set TxAGC Page C{};*/
1534 rtl8821ae_phy_set_txpower_level_by_path(hw,
1535 rtlphy->current_channel,
1536 RF90_PATH_A);
1537
1538 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1539 "******Path_A Over BBSwing Limit ,PwrTrackingLimit = %d ,Remnant TxAGC Value = %d\n",
1540 pwr_tracking_limit,
1541 rtldm->remnant_ofdm_swing_idx[rf_path]);
1542 } else if (final_ofdm_swing_index < 0) {
1543 rtldm->remnant_cck_idx = final_ofdm_swing_index;
1544 /* CCK Follow the same compensate value as Path A*/
1545 rtldm->remnant_ofdm_swing_idx[rf_path] =
1546 final_ofdm_swing_index;
1547
1548 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1549 txscaling_tbl[0]);
1550
1551 rtldm->modify_txagc_flag_path_a = true;
1552
1553 /*Set TxAGC Page C{};*/
1554 rtl8821ae_phy_set_txpower_level_by_path(hw,
1555 rtlphy->current_channel, RF90_PATH_A);
1556
1557 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1558 "******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d\n",
1559 rtldm->remnant_ofdm_swing_idx[rf_path]);
1560 } else {
1561 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
1562 txscaling_tbl[(u8)final_ofdm_swing_index]);
1563
1564 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1565 "******Path_A Compensate with BBSwing, Final_OFDM_Swing_Index = %d\n",
1566 final_ofdm_swing_index);
1567 /*If TxAGC has changed, reset TxAGC again*/
1568 if (rtldm->modify_txagc_flag_path_a) {
1569 rtldm->remnant_cck_idx = 0;
1570 rtldm->remnant_ofdm_swing_idx[rf_path] = 0;
1571
1572 /*Set TxAGC Page C{};*/
1573 rtl8821ae_phy_set_txpower_level_by_path(hw,
1574 rtlphy->current_channel, RF90_PATH_A);
1575 rtldm->modify_txagc_flag_path_a = false;
1576
1577 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
1578 DBG_LOUD,
1579 "******Path_A pDM_Odm->Modify_TxAGC_Flag = FALSE\n");
1580 }
1581 }
1582 }
1583 /*BBSwing higher then Limit*/
1584 if (rf_path == RF90_PATH_B) {
1585 if (final_ofdm_swing_index > pwr_tracking_limit) {
1586 rtldm->remnant_ofdm_swing_idx[rf_path] =
1587 final_ofdm_swing_index -
1588 pwr_tracking_limit;
1589
1590 rtl_set_bbreg(hw, RB_TXSCALE,
1591 0xFFE00000,
1592 txscaling_tbl[pwr_tracking_limit]);
1593
1594 rtldm->modify_txagc_flag_path_b = true;
1595
1596 /*Set TxAGC Page E{};*/
1597 rtl8821ae_phy_set_txpower_level_by_path(hw,
1598 rtlphy->current_channel, RF90_PATH_B);
1599
1600 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1601 "******Path_B Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d\n",
1602 pwr_tracking_limit,
1603 rtldm->remnant_ofdm_swing_idx[rf_path]);
1604 } else if (final_ofdm_swing_index < 0) {
1605 rtldm->remnant_ofdm_swing_idx[rf_path] =
1606 final_ofdm_swing_index;
1607
1608 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
1609 txscaling_tbl[0]);
1610
1611 rtldm->modify_txagc_flag_path_b = true;
1612
1613 /*Set TxAGC Page E{};*/
1614 rtl8821ae_phy_set_txpower_level_by_path(hw,
1615 rtlphy->current_channel, RF90_PATH_B);
1616
1617 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1618 "******Path_B Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d\n",
1619 rtldm->remnant_ofdm_swing_idx[rf_path]);
1620 } else {
1621 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
1622 txscaling_tbl[(u8)final_ofdm_swing_index]);
1623
1624 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1625 "******Path_B Compensate with BBSwing ,Final_OFDM_Swing_Index = %d\n",
1626 final_ofdm_swing_index);
1627 /*If TxAGC has changed, reset TxAGC again*/
1628 if (rtldm->modify_txagc_flag_path_b) {
1629 rtldm->remnant_ofdm_swing_idx[rf_path] = 0;
1630
1631 /*Set TxAGC Page E{};*/
1632 rtl8821ae_phy_set_txpower_level_by_path(hw,
1633 rtlphy->current_channel, RF90_PATH_B);
1634
1635 rtldm->modify_txagc_flag_path_b =
1636 false;
1637
1638 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1639 "******Path_B pDM_Odm->Modify_TxAGC_Flag = FALSE\n");
1640 }
1641 }
1642 }
1643 } else {
1644 return;
1645 }
1646}
1647
1648void rtl8812ae_dm_txpower_tracking_callback_thermalmeter(
1649 struct ieee80211_hw *hw)
1650{
1651 struct rtl_priv *rtlpriv = rtl_priv(hw);
1652 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1653 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
1654 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1655 u8 thermal_value = 0, delta, delta_lck, delta_iqk, p = 0, i = 0;
1656 u8 thermal_value_avg_count = 0;
1657 u32 thermal_value_avg = 0;
1658 /* OFDM BB Swing should be less than +3.0dB, */
1659 u8 ofdm_min_index = 6;
1660 /* GetRightChnlPlaceforIQK(pHalData->CurrentChannel)*/
1661 u8 index_for_channel = 0;
1662 /* 1. The following TWO tables decide
1663 * the final index of OFDM/CCK swing table.
1664 */
1665 u8 *delta_swing_table_idx_tup_a;
1666 u8 *delta_swing_table_idx_tdown_a;
1667 u8 *delta_swing_table_idx_tup_b;
1668 u8 *delta_swing_table_idx_tdown_b;
1669
1670 /*2. Initilization ( 7 steps in total )*/
1671 rtl8812ae_get_delta_swing_table(hw,
1672 (u8 **)&delta_swing_table_idx_tup_a,
1673 (u8 **)&delta_swing_table_idx_tdown_a,
1674 (u8 **)&delta_swing_table_idx_tup_b,
1675 (u8 **)&delta_swing_table_idx_tdown_b);
1676
1677 rtldm->txpower_trackinginit = true;
1678
1679 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1680 "pDM_Odm->BbSwingIdxCckBase: %d, pDM_Odm->BbSwingIdxOfdmBase[A]:%d, pDM_Odm->DefaultOfdmIndex: %d\n",
1681 rtldm->swing_idx_cck_base,
1682 rtldm->swing_idx_ofdm_base[RF90_PATH_A],
1683 rtldm->default_ofdm_index);
1684
1685 thermal_value = (u8)rtl_get_rfreg(hw, RF90_PATH_A,
1686 /*0x42: RF Reg[15:10] 88E*/
1687 RF_T_METER_8812A, 0xfc00);
1688 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1689 "Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
1690 thermal_value, rtlefuse->eeprom_thermalmeter);
1691 if (!rtldm->txpower_track_control ||
1692 rtlefuse->eeprom_thermalmeter == 0 ||
1693 rtlefuse->eeprom_thermalmeter == 0xFF)
1694 return;
1695
1696 /* 3. Initialize ThermalValues of RFCalibrateInfo*/
1697
1698 if (rtlhal->reloadtxpowerindex)
1699 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1700 "reload ofdm index for band switch\n");
1701
1702 /*4. Calculate average thermal meter*/
1703 rtldm->thermalvalue_avg[rtldm->thermalvalue_avg_index] = thermal_value;
1704 rtldm->thermalvalue_avg_index++;
1705 if (rtldm->thermalvalue_avg_index == AVG_THERMAL_NUM_8812A)
1706 /*Average times = c.AverageThermalNum*/
1707 rtldm->thermalvalue_avg_index = 0;
1708
1709 for (i = 0; i < AVG_THERMAL_NUM_8812A; i++) {
1710 if (rtldm->thermalvalue_avg[i]) {
1711 thermal_value_avg += rtldm->thermalvalue_avg[i];
1712 thermal_value_avg_count++;
1713 }
1714 }
1715 /*Calculate Average ThermalValue after average enough times*/
1716 if (thermal_value_avg_count) {
1717 thermal_value = (u8)(thermal_value_avg /
1718 thermal_value_avg_count);
1719 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1720 "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
1721 thermal_value, rtlefuse->eeprom_thermalmeter);
1722 }
1723
1724 /*5. Calculate delta, delta_LCK, delta_IQK.
1725 *"delta" here is used to determine whether
1726 *thermal value changes or not.
1727 */
1728 delta = (thermal_value > rtldm->thermalvalue) ?
1729 (thermal_value - rtldm->thermalvalue) :
1730 (rtldm->thermalvalue - thermal_value);
1731 delta_lck = (thermal_value > rtldm->thermalvalue_lck) ?
1732 (thermal_value - rtldm->thermalvalue_lck) :
1733 (rtldm->thermalvalue_lck - thermal_value);
1734 delta_iqk = (thermal_value > rtldm->thermalvalue_iqk) ?
1735 (thermal_value - rtldm->thermalvalue_iqk) :
1736 (rtldm->thermalvalue_iqk - thermal_value);
1737
1738 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1739 "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
1740 delta, delta_lck, delta_iqk);
1741
1742 /* 6. If necessary, do LCK.
1743 * Delta temperature is equal to or larger than 20 centigrade.
1744 */
1745 if (delta_lck >= IQK_THRESHOLD) {
1746 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1747 "delta_LCK(%d) >= Threshold_IQK(%d)\n",
1748 delta_lck, IQK_THRESHOLD);
1749 rtldm->thermalvalue_lck = thermal_value;
1750 rtl8821ae_phy_lc_calibrate(hw);
1751 }
1752
1753 /*7. If necessary, move the index of swing table to adjust Tx power.*/
1754
1755 if (delta > 0 && rtldm->txpower_track_control) {
1756 /* "delta" here is used to record the
1757 * absolute value of differrence.
1758 */
1759 delta = thermal_value > rtlefuse->eeprom_thermalmeter ?
1760 (thermal_value - rtlefuse->eeprom_thermalmeter) :
1761 (rtlefuse->eeprom_thermalmeter - thermal_value);
1762
1763 if (delta >= TXPWR_TRACK_TABLE_SIZE)
1764 delta = TXPWR_TRACK_TABLE_SIZE - 1;
1765
1766 /*7.1 The Final Power Index = BaseIndex + PowerIndexOffset*/
1767
1768 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
1769 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1770 "delta_swing_table_idx_tup_a[%d] = %d\n",
1771 delta, delta_swing_table_idx_tup_a[delta]);
1772 rtldm->delta_power_index_last[RF90_PATH_A] =
1773 rtldm->delta_power_index[RF90_PATH_A];
1774 rtldm->delta_power_index[RF90_PATH_A] =
1775 delta_swing_table_idx_tup_a[delta];
1776
1777 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
1778 delta_swing_table_idx_tup_a[delta];
1779 /*Record delta swing for mix mode power tracking*/
1780
1781 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1782 "******Temp is higher and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
1783 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
1784
1785 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1786 "delta_swing_table_idx_tup_b[%d] = %d\n",
1787 delta, delta_swing_table_idx_tup_b[delta]);
1788 rtldm->delta_power_index_last[RF90_PATH_B] =
1789 rtldm->delta_power_index[RF90_PATH_B];
1790 rtldm->delta_power_index[RF90_PATH_B] =
1791 delta_swing_table_idx_tup_b[delta];
1792
1793 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B] =
1794 delta_swing_table_idx_tup_b[delta];
1795 /*Record delta swing for mix mode power tracking*/
1796
1797 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1798 "******Temp is higher and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
1799 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B]);
1800 } else {
1801 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1802 "delta_swing_table_idx_tdown_a[%d] = %d\n",
1803 delta, delta_swing_table_idx_tdown_a[delta]);
1804
1805 rtldm->delta_power_index_last[RF90_PATH_A] =
1806 rtldm->delta_power_index[RF90_PATH_A];
1807 rtldm->delta_power_index[RF90_PATH_A] =
1808 -1 * delta_swing_table_idx_tdown_a[delta];
1809
1810 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
1811 -1 * delta_swing_table_idx_tdown_a[delta];
1812 /* Record delta swing for mix mode power tracking*/
1813 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1814 "******Temp is lower and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
1815 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
1816
1817 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1818 "deltaSwingTableIdx_TDOWN_B[%d] = %d\n",
1819 delta, delta_swing_table_idx_tdown_b[delta]);
1820
1821 rtldm->delta_power_index_last[RF90_PATH_B] =
1822 rtldm->delta_power_index[RF90_PATH_B];
1823 rtldm->delta_power_index[RF90_PATH_B] =
1824 -1 * delta_swing_table_idx_tdown_b[delta];
1825
1826 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B] =
1827 -1 * delta_swing_table_idx_tdown_b[delta];
1828 /*Record delta swing for mix mode power tracking*/
1829
1830 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1831 "******Temp is lower and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n",
1832 rtldm->absolute_ofdm_swing_idx[RF90_PATH_B]);
1833 }
1834
1835 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++) {
1836 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1837 "============================= [Path-%c]Calculating PowerIndexOffset =============================\n",
1838 (p == RF90_PATH_A ? 'A' : 'B'));
1839
1840 if (rtldm->delta_power_index[p] ==
1841 rtldm->delta_power_index_last[p])
1842 /*If Thermal value changes but lookup
1843 table value still the same*/
1844 rtldm->power_index_offset[p] = 0;
1845 else
1846 rtldm->power_index_offset[p] =
1847 rtldm->delta_power_index[p] -
1848 rtldm->delta_power_index_last[p];
1849 /* Power Index Diff between 2
1850 * times Power Tracking
1851 */
1852 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1853 "[Path-%c] PowerIndexOffset(%d) =DeltaPowerIndex(%d) -DeltaPowerIndexLast(%d)\n",
1854 (p == RF90_PATH_A ? 'A' : 'B'),
1855 rtldm->power_index_offset[p],
1856 rtldm->delta_power_index[p] ,
1857 rtldm->delta_power_index_last[p]);
1858
1859 rtldm->ofdm_index[p] =
1860 rtldm->swing_idx_ofdm_base[p] +
1861 rtldm->power_index_offset[p];
1862 rtldm->cck_index =
1863 rtldm->swing_idx_cck_base +
1864 rtldm->power_index_offset[p];
1865
1866 rtldm->swing_idx_cck = rtldm->cck_index;
1867 rtldm->swing_idx_ofdm[p] = rtldm->ofdm_index[p];
1868
1869 /****Print BB Swing Base and Index Offset */
1870
1871 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1872 "The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
1873 rtldm->swing_idx_cck,
1874 rtldm->swing_idx_cck_base,
1875 rtldm->power_index_offset[p]);
1876 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1877 "The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
1878 rtldm->swing_idx_ofdm[p],
1879 (p == RF90_PATH_A ? 'A' : 'B'),
1880 rtldm->swing_idx_ofdm_base[p],
1881 rtldm->power_index_offset[p]);
1882
1883 /*7.1 Handle boundary conditions of index.*/
1884
1885 if (rtldm->ofdm_index[p] > TXSCALE_TABLE_SIZE - 1)
1886 rtldm->ofdm_index[p] = TXSCALE_TABLE_SIZE - 1;
1887 else if (rtldm->ofdm_index[p] < ofdm_min_index)
1888 rtldm->ofdm_index[p] = ofdm_min_index;
1889 }
1890 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1891 "\n\n====================================================================================\n");
1892 if (rtldm->cck_index > TXSCALE_TABLE_SIZE - 1)
1893 rtldm->cck_index = TXSCALE_TABLE_SIZE - 1;
1894 else if (rtldm->cck_index < 0)
1895 rtldm->cck_index = 0;
1896 } else {
1897 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1898 "The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
1899 rtldm->txpower_track_control,
1900 thermal_value,
1901 rtldm->thermalvalue);
1902
1903 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1904 rtldm->power_index_offset[p] = 0;
1905 }
1906 /*Print Swing base & current*/
1907 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1908 "TxPowerTracking: [CCK] Swing Current Index: %d,Swing Base Index: %d\n",
1909 rtldm->cck_index, rtldm->swing_idx_cck_base);
1910 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++) {
1911 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1912 "TxPowerTracking: [OFDM] Swing Current Index: %d,Swing Base Index[%c]: %d\n",
1913 rtldm->ofdm_index[p],
1914 (p == RF90_PATH_A ? 'A' : 'B'),
1915 rtldm->swing_idx_ofdm_base[p]);
1916 }
1917
1918 if ((rtldm->power_index_offset[RF90_PATH_A] != 0 ||
1919 rtldm->power_index_offset[RF90_PATH_B] != 0) &&
1920 rtldm->txpower_track_control) {
1921 /*7.2 Configure the Swing Table to adjust Tx Power.
1922 *Always TRUE after Tx Power is adjusted by power tracking.
1923 *
1924 *2012/04/23 MH According to Luke's suggestion,
1925 *we can not write BB digital
1926 *to increase TX power. Otherwise, EVM will be bad.
1927 *
1928 *2012/04/25 MH Add for tx power tracking to set
1929 *tx power in tx agc for 88E.
1930 */
1931 if (thermal_value > rtldm->thermalvalue) {
1932 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1933 "Temperature Increasing(A): delta_pi: %d , delta_t: %d, Now_t: %d,EFUSE_t: %d, Last_t: %d\n",
1934 rtldm->power_index_offset[RF90_PATH_A],
1935 delta, thermal_value,
1936 rtlefuse->eeprom_thermalmeter,
1937 rtldm->thermalvalue);
1938
1939 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1940 "Temperature Increasing(B): delta_pi: %d ,delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
1941 rtldm->power_index_offset[RF90_PATH_B],
1942 delta, thermal_value,
1943 rtlefuse->eeprom_thermalmeter,
1944 rtldm->thermalvalue);
1945 } else if (thermal_value < rtldm->thermalvalue) { /*Low temperature*/
1946 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1947 "Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
1948 rtldm->power_index_offset[RF90_PATH_A],
1949 delta, thermal_value,
1950 rtlefuse->eeprom_thermalmeter,
1951 rtldm->thermalvalue);
1952
1953 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1954 "Temperature Decreasing(B): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
1955 rtldm->power_index_offset[RF90_PATH_B],
1956 delta, thermal_value,
1957 rtlefuse->eeprom_thermalmeter,
1958 rtldm->thermalvalue);
1959 }
1960
1961 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
1962 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1963 "Temperature(%d) higher than PG value(%d)\n",
1964 thermal_value, rtlefuse->eeprom_thermalmeter);
1965
1966 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1967 "**********Enter POWER Tracking MIX_MODE**********\n");
1968 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1969 rtl8812ae_dm_txpwr_track_set_pwr(hw, MIX_MODE,
1970 p, 0);
1971 } else {
1972 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1973 "Temperature(%d) lower than PG value(%d)\n",
1974 thermal_value, rtlefuse->eeprom_thermalmeter);
1975
1976 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1977 "**********Enter POWER Tracking MIX_MODE**********\n");
1978 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1979 rtl8812ae_dm_txpwr_track_set_pwr(hw, MIX_MODE,
1980 p, index_for_channel);
1981 }
1982 /*Record last time Power Tracking result as base.*/
1983 rtldm->swing_idx_cck_base = rtldm->swing_idx_cck;
1984 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8812A; p++)
1985 rtldm->swing_idx_ofdm_base[p] =
1986 rtldm->swing_idx_ofdm[p];
1987
1988 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
1989 "pDM_Odm->RFCalibrateInfo.ThermalValue =%d ThermalValue= %d\n",
1990 rtldm->thermalvalue, thermal_value);
1991 /*Record last Power Tracking Thermal Value*/
1992 rtldm->thermalvalue = thermal_value;
1993 }
1994 /*Delta temperature is equal to or larger than
1995 20 centigrade (When threshold is 8).*/
1996 if (delta_iqk >= IQK_THRESHOLD)
1997 rtl8812ae_do_iqk(hw, delta_iqk, thermal_value, 8);
1998
1999 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2000 "<===rtl8812ae_dm_txpower_tracking_callback_thermalmeter\n");
2001}
2002
2003static void rtl8821ae_get_delta_swing_table(struct ieee80211_hw *hw, u8 **up_a,
2004 u8 **down_a, u8 **up_b, u8 **down_b)
2005{
2006 struct rtl_priv *rtlpriv = rtl_priv(hw);
2007 struct rtl_phy *rtlphy = &rtlpriv->phy;
2008 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2009 u8 channel = rtlphy->current_channel;
2010 u8 rate = rtldm->tx_rate;
2011
2012 if (1 <= channel && channel <= 14) {
2013 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate)) {
2014 *up_a = rtl8821ae_delta_swing_table_idx_24gccka_p;
2015 *down_a = rtl8821ae_delta_swing_table_idx_24gccka_n;
2016 *up_b = rtl8821ae_delta_swing_table_idx_24gcckb_p;
2017 *down_b = rtl8821ae_delta_swing_table_idx_24gcckb_n;
2018 } else {
2019 *up_a = rtl8821ae_delta_swing_table_idx_24ga_p;
2020 *down_a = rtl8821ae_delta_swing_table_idx_24ga_n;
2021 *up_b = rtl8821ae_delta_swing_table_idx_24gb_p;
2022 *down_b = rtl8821ae_delta_swing_table_idx_24gb_n;
2023 }
2024 } else if (36 <= channel && channel <= 64) {
2025 *up_a = rtl8821ae_delta_swing_table_idx_5ga_p[0];
2026 *down_a = rtl8821ae_delta_swing_table_idx_5ga_n[0];
2027 *up_b = rtl8821ae_delta_swing_table_idx_5gb_p[0];
2028 *down_b = rtl8821ae_delta_swing_table_idx_5gb_n[0];
2029 } else if (100 <= channel && channel <= 140) {
2030 *up_a = rtl8821ae_delta_swing_table_idx_5ga_p[1];
2031 *down_a = rtl8821ae_delta_swing_table_idx_5ga_n[1];
2032 *up_b = rtl8821ae_delta_swing_table_idx_5gb_p[1];
2033 *down_b = rtl8821ae_delta_swing_table_idx_5gb_n[1];
2034 } else if (149 <= channel && channel <= 173) {
2035 *up_a = rtl8821ae_delta_swing_table_idx_5ga_p[2];
2036 *down_a = rtl8821ae_delta_swing_table_idx_5ga_n[2];
2037 *up_b = rtl8821ae_delta_swing_table_idx_5gb_p[2];
2038 *down_b = rtl8821ae_delta_swing_table_idx_5gb_n[2];
2039 } else {
2040 *up_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
2041 *down_a = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
2042 *up_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_p;
2043 *down_b = (u8 *)rtl8818e_delta_swing_table_idx_24gb_n;
2044 }
2045 return;
2046}
2047
2048/*-----------------------------------------------------------------------------
2049 * Function: odm_TxPwrTrackSetPwr88E()
2050 *
2051 * Overview: 88E change all channel tx power accordign to flag.
2052 * OFDM & CCK are all different.
2053 *
2054 * Input: NONE
2055 *
2056 * Output: NONE
2057 *
2058 * Return: NONE
2059 *
2060 * Revised History:
2061 * When Who Remark
2062 * 04/23/2012 MHC Create Version 0.
2063 *
2064 *---------------------------------------------------------------------------
2065 */
2066void rtl8821ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
2067 enum pwr_track_control_method method,
2068 u8 rf_path, u8 channel_mapped_index)
2069{
2070 struct rtl_priv *rtlpriv = rtl_priv(hw);
2071 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2072 struct rtl_phy *rtlphy = &rtlpriv->phy;
2073 u32 final_swing_idx[1];
2074 u8 pwr_tracking_limit = 26; /*+1.0dB*/
2075 u8 tx_rate = 0xFF;
2076 char final_ofdm_swing_index = 0;
2077
2078 if (rtldm->tx_rate != 0xFF)
2079 tx_rate = rtl8821ae_hw_rate_to_mrate(hw, rtldm->tx_rate);
2080
2081 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2082 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
2083
2084 if (tx_rate != 0xFF) { /* Mimic Modify High Rate BBSwing Limit.*/
2085 /*CCK*/
2086 if ((tx_rate >= MGN_1M) && (tx_rate <= MGN_11M))
2087 pwr_tracking_limit = 32; /*+4dB*/
2088 /*OFDM*/
2089 else if ((tx_rate >= MGN_6M) && (tx_rate <= MGN_48M))
2090 pwr_tracking_limit = 30; /*+3dB*/
2091 else if (tx_rate == MGN_54M)
2092 pwr_tracking_limit = 28; /*+2dB*/
2093 /*HT*/
2094 /*QPSK/BPSK*/
2095 else if ((tx_rate >= MGN_MCS0) && (tx_rate <= MGN_MCS2))
2096 pwr_tracking_limit = 34; /*+5dB*/
2097 /*16QAM*/
2098 else if ((tx_rate >= MGN_MCS3) && (tx_rate <= MGN_MCS4))
2099 pwr_tracking_limit = 30; /*+3dB*/
2100 /*64QAM*/
2101 else if ((tx_rate >= MGN_MCS5) && (tx_rate <= MGN_MCS7))
2102 pwr_tracking_limit = 28; /*+2dB*/
2103 /*2 VHT*/
2104 /*QPSK/BPSK*/
2105 else if ((tx_rate >= MGN_VHT1SS_MCS0) &&
2106 (tx_rate <= MGN_VHT1SS_MCS2))
2107 pwr_tracking_limit = 34; /*+5dB*/
2108 /*16QAM*/
2109 else if ((tx_rate >= MGN_VHT1SS_MCS3) &&
2110 (tx_rate <= MGN_VHT1SS_MCS4))
2111 pwr_tracking_limit = 30; /*+3dB*/
2112 /*64QAM*/
2113 else if ((tx_rate >= MGN_VHT1SS_MCS5) &&
2114 (tx_rate <= MGN_VHT1SS_MCS6))
2115 pwr_tracking_limit = 28; /*+2dB*/
2116 else if (tx_rate == MGN_VHT1SS_MCS7) /*64QAM*/
2117 pwr_tracking_limit = 26; /*+1dB*/
2118 else if (tx_rate == MGN_VHT1SS_MCS8) /*256QAM*/
2119 pwr_tracking_limit = 24; /*+0dB*/
2120 else if (tx_rate == MGN_VHT1SS_MCS9) /*256QAM*/
2121 pwr_tracking_limit = 22; /*-1dB*/
2122 else
2123 pwr_tracking_limit = 24;
2124 }
2125 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2126 "TxRate=0x%x, PwrTrackingLimit=%d\n",
2127 tx_rate, pwr_tracking_limit);
2128
2129 if (method == BBSWING) {
2130 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2131 "===>rtl8812ae_dm_txpwr_track_set_pwr\n");
2132 if (rf_path == RF90_PATH_A) {
2133 final_swing_idx[RF90_PATH_A] =
2134 (rtldm->ofdm_index[RF90_PATH_A] >
2135 pwr_tracking_limit) ?
2136 pwr_tracking_limit :
2137 rtldm->ofdm_index[RF90_PATH_A];
2138 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2139 "pDM_Odm->RFCalibrateInfo.OFDM_index[ODM_RF_PATH_A]=%d,pDM_Odm->RealBbSwingIdx[ODM_RF_PATH_A]=%d\n",
2140 rtldm->ofdm_index[RF90_PATH_A],
2141 final_swing_idx[RF90_PATH_A]);
2142
2143 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
2144 txscaling_tbl[final_swing_idx[RF90_PATH_A]]);
2145 }
2146 } else if (method == MIX_MODE) {
2147 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2148 "pDM_Odm->DefaultOfdmIndex=%d,pDM_Odm->Aboslute_OFDMSwingIdx[RFPath]=%d, RF_Path = %d\n",
2149 rtldm->default_ofdm_index,
2150 rtldm->absolute_ofdm_swing_idx[rf_path],
2151 rf_path);
2152
2153 final_ofdm_swing_index =
2154 rtldm->default_ofdm_index +
2155 rtldm->absolute_ofdm_swing_idx[rf_path];
2156 /*BBSwing higher then Limit*/
2157 if (rf_path == RF90_PATH_A) {
2158 if (final_ofdm_swing_index > pwr_tracking_limit) {
2159 rtldm->remnant_cck_idx =
2160 final_ofdm_swing_index -
2161 pwr_tracking_limit;
2162 /* CCK Follow the same compensate value as Path A*/
2163 rtldm->remnant_ofdm_swing_idx[rf_path] =
2164 final_ofdm_swing_index -
2165 pwr_tracking_limit;
2166
2167 rtl_set_bbreg(hw, RA_TXSCALE,
2168 0xFFE00000,
2169 txscaling_tbl[pwr_tracking_limit]);
2170
2171 rtldm->modify_txagc_flag_path_a = true;
2172
2173 /*Set TxAGC Page C{};*/
2174 rtl8821ae_phy_set_txpower_level_by_path(hw,
2175 rtlphy->current_channel,
2176 RF90_PATH_A);
2177
2178 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2179 " ******Path_A Over BBSwing Limit , PwrTrackingLimit = %d , Remnant TxAGC Value = %d\n",
2180 pwr_tracking_limit,
2181 rtldm->remnant_ofdm_swing_idx[rf_path]);
2182 } else if (final_ofdm_swing_index < 0) {
2183 rtldm->remnant_cck_idx = final_ofdm_swing_index;
2184 /* CCK Follow the same compensate value as Path A*/
2185 rtldm->remnant_ofdm_swing_idx[rf_path] =
2186 final_ofdm_swing_index;
2187
2188 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
2189 txscaling_tbl[0]);
2190
2191 rtldm->modify_txagc_flag_path_a = true;
2192
2193 /*Set TxAGC Page C{};*/
2194 rtl8821ae_phy_set_txpower_level_by_path(hw,
2195 rtlphy->current_channel, RF90_PATH_A);
2196
2197 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2198 "******Path_A Lower then BBSwing lower bound 0 , Remnant TxAGC Value = %d\n",
2199 rtldm->remnant_ofdm_swing_idx[rf_path]);
2200 } else {
2201 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
2202 txscaling_tbl[(u8)final_ofdm_swing_index]);
2203
2204 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2205 "******Path_A Compensate with BBSwing ,Final_OFDM_Swing_Index = %d\n",
2206 final_ofdm_swing_index);
2207 /*If TxAGC has changed, reset TxAGC again*/
2208 if (rtldm->modify_txagc_flag_path_a) {
2209 rtldm->remnant_cck_idx = 0;
2210 rtldm->remnant_ofdm_swing_idx[rf_path] = 0;
2211
2212 /*Set TxAGC Page C{};*/
2213 rtl8821ae_phy_set_txpower_level_by_path(hw,
2214 rtlphy->current_channel, RF90_PATH_A);
2215
2216 rtldm->modify_txagc_flag_path_a = false;
2217
2218 RT_TRACE(rtlpriv, COMP_POWER_TRACKING,
2219 DBG_LOUD,
2220 "******Path_A pDM_Odm->Modify_TxAGC_Flag= FALSE\n");
2221 }
2222 }
2223 }
2224 } else {
2225 return;
2226 }
2227}
2228
2229void rtl8821ae_dm_txpower_tracking_callback_thermalmeter(
2230 struct ieee80211_hw *hw)
2231{
2232 struct rtl_priv *rtlpriv = rtl_priv(hw);
2233 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2234 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2235 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2236 struct rtl_phy *rtlphy = &rtlpriv->phy;
2237
2238 u8 thermal_value = 0, delta, delta_lck, delta_iqk, p = 0, i = 0;
2239 u8 thermal_value_avg_count = 0;
2240 u32 thermal_value_avg = 0;
2241
2242 u8 ofdm_min_index = 6; /*OFDM BB Swing should be less than +3.0dB */
2243 /* GetRightChnlPlaceforIQK(pHalData->CurrentChannel)*/
2244 u8 index_for_channel = 0;
2245
2246 /* 1. The following TWO tables decide the final
2247 * index of OFDM/CCK swing table.
2248 */
2249 u8 *delta_swing_table_idx_tup_a;
2250 u8 *delta_swing_table_idx_tdown_a;
2251 u8 *delta_swing_table_idx_tup_b;
2252 u8 *delta_swing_table_idx_tdown_b;
2253
2254 /*2. Initilization ( 7 steps in total )*/
2255 rtl8821ae_get_delta_swing_table(hw, (u8 **)&delta_swing_table_idx_tup_a,
2256 (u8 **)&delta_swing_table_idx_tdown_a,
2257 (u8 **)&delta_swing_table_idx_tup_b,
2258 (u8 **)&delta_swing_table_idx_tdown_b);
2259
2260 rtldm->txpower_trackinginit = true;
2261
2262 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2263 "===>rtl8812ae_dm_txpower_tracking_callback_thermalmeter,\n pDM_Odm->BbSwingIdxCckBase: %d,pDM_Odm->BbSwingIdxOfdmBase[A]:%d, pDM_Odm->DefaultOfdmIndex: %d\n",
2264 rtldm->swing_idx_cck_base,
2265 rtldm->swing_idx_ofdm_base[RF90_PATH_A],
2266 rtldm->default_ofdm_index);
2267 /*0x42: RF Reg[15:10] 88E*/
2268 thermal_value = (u8)rtl_get_rfreg(hw,
2269 RF90_PATH_A, RF_T_METER_8812A, 0xfc00);
2270 if (!rtldm->txpower_track_control ||
2271 rtlefuse->eeprom_thermalmeter == 0 ||
2272 rtlefuse->eeprom_thermalmeter == 0xFF)
2273 return;
2274
2275 /* 3. Initialize ThermalValues of RFCalibrateInfo*/
2276
2277 if (rtlhal->reloadtxpowerindex) {
2278 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2279 "reload ofdm index for band switch\n");
2280 }
2281
2282 /*4. Calculate average thermal meter*/
2283 rtldm->thermalvalue_avg[rtldm->thermalvalue_avg_index] = thermal_value;
2284 rtldm->thermalvalue_avg_index++;
2285 if (rtldm->thermalvalue_avg_index == AVG_THERMAL_NUM_8812A)
2286 /*Average times = c.AverageThermalNum*/
2287 rtldm->thermalvalue_avg_index = 0;
2288
2289 for (i = 0; i < AVG_THERMAL_NUM_8812A; i++) {
2290 if (rtldm->thermalvalue_avg[i]) {
2291 thermal_value_avg += rtldm->thermalvalue_avg[i];
2292 thermal_value_avg_count++;
2293 }
2294 }
2295 /*Calculate Average ThermalValue after average enough times*/
2296 if (thermal_value_avg_count) {
2297 thermal_value = (u8)(thermal_value_avg /
2298 thermal_value_avg_count);
2299 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2300 "AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n",
2301 thermal_value, rtlefuse->eeprom_thermalmeter);
2302 }
2303
2304 /*5. Calculate delta, delta_LCK, delta_IQK.
2305 *"delta" here is used to determine whether
2306 * thermal value changes or not.
2307 */
2308 delta = (thermal_value > rtldm->thermalvalue) ?
2309 (thermal_value - rtldm->thermalvalue) :
2310 (rtldm->thermalvalue - thermal_value);
2311 delta_lck = (thermal_value > rtldm->thermalvalue_lck) ?
2312 (thermal_value - rtldm->thermalvalue_lck) :
2313 (rtldm->thermalvalue_lck - thermal_value);
2314 delta_iqk = (thermal_value > rtldm->thermalvalue_iqk) ?
2315 (thermal_value - rtldm->thermalvalue_iqk) :
2316 (rtldm->thermalvalue_iqk - thermal_value);
2317
2318 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2319 "(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n",
2320 delta, delta_lck, delta_iqk);
2321
2322 /* 6. If necessary, do LCK. */
2323 /*Delta temperature is equal to or larger than 20 centigrade.*/
2324 if (delta_lck >= IQK_THRESHOLD) {
2325 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2326 "delta_LCK(%d) >= Threshold_IQK(%d)\n",
2327 delta_lck, IQK_THRESHOLD);
2328 rtldm->thermalvalue_lck = thermal_value;
2329 rtl8821ae_phy_lc_calibrate(hw);
2330 }
2331
2332 /*7. If necessary, move the index of swing table to adjust Tx power.*/
2333
2334 if (delta > 0 && rtldm->txpower_track_control) {
2335 /*"delta" here is used to record the
2336 * absolute value of differrence.
2337 */
2338 delta = thermal_value > rtlefuse->eeprom_thermalmeter ?
2339 (thermal_value - rtlefuse->eeprom_thermalmeter) :
2340 (rtlefuse->eeprom_thermalmeter - thermal_value);
2341
2342 if (delta >= TXSCALE_TABLE_SIZE)
2343 delta = TXSCALE_TABLE_SIZE - 1;
2344
2345 /*7.1 The Final Power Index = BaseIndex + PowerIndexOffset*/
2346
2347 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
2348 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2349 "delta_swing_table_idx_tup_a[%d] = %d\n",
2350 delta, delta_swing_table_idx_tup_a[delta]);
2351 rtldm->delta_power_index_last[RF90_PATH_A] =
2352 rtldm->delta_power_index[RF90_PATH_A];
2353 rtldm->delta_power_index[RF90_PATH_A] =
2354 delta_swing_table_idx_tup_a[delta];
2355
2356 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
2357 delta_swing_table_idx_tup_a[delta];
2358 /*Record delta swing for mix mode power tracking*/
2359
2360 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2361 "******Temp is higher and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
2362 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
2363 } else {
2364 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2365 "delta_swing_table_idx_tdown_a[%d] = %d\n",
2366 delta, delta_swing_table_idx_tdown_a[delta]);
2367
2368 rtldm->delta_power_index_last[RF90_PATH_A] =
2369 rtldm->delta_power_index[RF90_PATH_A];
2370 rtldm->delta_power_index[RF90_PATH_A] =
2371 -1 * delta_swing_table_idx_tdown_a[delta];
2372
2373 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A] =
2374 -1 * delta_swing_table_idx_tdown_a[delta];
2375 /* Record delta swing for mix mode power tracking*/
2376 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2377 "******Temp is lower and pDM_Odm->Aboslute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n",
2378 rtldm->absolute_ofdm_swing_idx[RF90_PATH_A]);
2379 }
2380
2381 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++) {
2382 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2383 "\n\n================================ [Path-%c]Calculating PowerIndexOffset ================================\n",
2384 (p == RF90_PATH_A ? 'A' : 'B'));
2385 /*If Thermal value changes but lookup table value
2386 * still the same
2387 */
2388 if (rtldm->delta_power_index[p] ==
2389 rtldm->delta_power_index_last[p])
2390
2391 rtldm->power_index_offset[p] = 0;
2392 else
2393 rtldm->power_index_offset[p] =
2394 rtldm->delta_power_index[p] -
2395 rtldm->delta_power_index_last[p];
2396 /*Power Index Diff between 2 times Power Tracking*/
2397
2398 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2399 "[Path-%c] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n",
2400 (p == RF90_PATH_A ? 'A' : 'B'),
2401 rtldm->power_index_offset[p],
2402 rtldm->delta_power_index[p] ,
2403 rtldm->delta_power_index_last[p]);
2404
2405 rtldm->ofdm_index[p] =
2406 rtldm->swing_idx_ofdm_base[p] +
2407 rtldm->power_index_offset[p];
2408 rtldm->cck_index =
2409 rtldm->swing_idx_cck_base +
2410 rtldm->power_index_offset[p];
2411
2412 rtldm->swing_idx_cck = rtldm->cck_index;
2413 rtldm->swing_idx_ofdm[p] = rtldm->ofdm_index[p];
2414
2415 /*********Print BB Swing Base and Index Offset********/
2416
2417 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2418 "The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n",
2419 rtldm->swing_idx_cck,
2420 rtldm->swing_idx_cck_base,
2421 rtldm->power_index_offset[p]);
2422 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2423 "The 'OFDM' final index(%d) = BaseIndex[%c](%d) + PowerIndexOffset(%d)\n",
2424 rtldm->swing_idx_ofdm[p],
2425 (p == RF90_PATH_A ? 'A' : 'B'),
2426 rtldm->swing_idx_ofdm_base[p],
2427 rtldm->power_index_offset[p]);
2428
2429 /*7.1 Handle boundary conditions of index.*/
2430
2431 if (rtldm->ofdm_index[p] > TXSCALE_TABLE_SIZE - 1)
2432 rtldm->ofdm_index[p] = TXSCALE_TABLE_SIZE - 1;
2433 else if (rtldm->ofdm_index[p] < ofdm_min_index)
2434 rtldm->ofdm_index[p] = ofdm_min_index;
2435 }
2436 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2437 "\n\n========================================================================================================\n");
2438 if (rtldm->cck_index > TXSCALE_TABLE_SIZE - 1)
2439 rtldm->cck_index = TXSCALE_TABLE_SIZE - 1;
2440 else if (rtldm->cck_index < 0)
2441 rtldm->cck_index = 0;
2442 } else {
2443 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2444 "The thermal meter is unchanged or TxPowerTracking OFF(%d):ThermalValue: %d , pDM_Odm->RFCalibrateInfo.ThermalValue: %d\n",
2445 rtldm->txpower_track_control,
2446 thermal_value,
2447 rtldm->thermalvalue);
2448
2449 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2450 rtldm->power_index_offset[p] = 0;
2451 }
2452 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2453 "TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n",
2454 /*Print Swing base & current*/
2455 rtldm->cck_index, rtldm->swing_idx_cck_base);
2456 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++) {
2457 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2458 "TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%c]: %d\n",
2459 rtldm->ofdm_index[p],
2460 (p == RF90_PATH_A ? 'A' : 'B'),
2461 rtldm->swing_idx_ofdm_base[p]);
2462 }
2463
2464 if ((rtldm->power_index_offset[RF90_PATH_A] != 0 ||
2465 rtldm->power_index_offset[RF90_PATH_B] != 0) &&
2466 rtldm->txpower_track_control) {
2467 /*7.2 Configure the Swing Table to adjust Tx Power.*/
2468 /*Always TRUE after Tx Power is adjusted by power tracking.*/
2469 /*
2470 * 2012/04/23 MH According to Luke's suggestion,
2471 * we can not write BB digital
2472 * to increase TX power. Otherwise, EVM will be bad.
2473 *
2474 * 2012/04/25 MH Add for tx power tracking to
2475 * set tx power in tx agc for 88E.
2476 */
2477 if (thermal_value > rtldm->thermalvalue) {
2478 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2479 "Temperature Increasing(A): delta_pi: %d , delta_t: %d,Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
2480 rtldm->power_index_offset[RF90_PATH_A],
2481 delta, thermal_value,
2482 rtlefuse->eeprom_thermalmeter,
2483 rtldm->thermalvalue);
2484 } else if (thermal_value < rtldm->thermalvalue) { /*Low temperature*/
2485 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2486 "Temperature Decreasing(A): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
2487 rtldm->power_index_offset[RF90_PATH_A],
2488 delta, thermal_value,
2489 rtlefuse->eeprom_thermalmeter,
2490 rtldm->thermalvalue);
2491 }
2492
2493 if (thermal_value > rtlefuse->eeprom_thermalmeter) {
2494 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2495 "Temperature(%d) higher than PG value(%d)\n",
2496 thermal_value, rtlefuse->eeprom_thermalmeter);
2497
2498 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2499 "****Enter POWER Tracking MIX_MODE****\n");
2500 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2501 rtl8821ae_dm_txpwr_track_set_pwr(hw,
2502 MIX_MODE, p, index_for_channel);
2503 } else {
2504 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2505 "Temperature(%d) lower than PG value(%d)\n",
2506 thermal_value, rtlefuse->eeprom_thermalmeter);
2507
2508 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2509 "*****Enter POWER Tracking MIX_MODE*****\n");
2510 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2511 rtl8812ae_dm_txpwr_track_set_pwr(hw,
2512 MIX_MODE, p, index_for_channel);
2513 }
2514 /*Record last time Power Tracking result as base.*/
2515 rtldm->swing_idx_cck_base = rtldm->swing_idx_cck;
2516 for (p = RF90_PATH_A; p < MAX_PATH_NUM_8821A; p++)
2517 rtldm->swing_idx_ofdm_base[p] = rtldm->swing_idx_ofdm[p];
2518
2519 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2520 "pDM_Odm->RFCalibrateInfo.ThermalValue = %d ThermalValue= %d\n",
2521 rtldm->thermalvalue, thermal_value);
2522 /*Record last Power Tracking Thermal Value*/
2523 rtldm->thermalvalue = thermal_value;
2524 }
2525 /* Delta temperature is equal to or larger than
2526 * 20 centigrade (When threshold is 8).
2527 */
2528 if (delta_iqk >= IQK_THRESHOLD) {
2529 if (!rtlphy->lck_inprogress) {
2530 spin_lock(&rtlpriv->locks.iqk_lock);
2531 rtlphy->lck_inprogress = true;
2532 spin_unlock(&rtlpriv->locks.iqk_lock);
2533
2534 rtl8821ae_do_iqk(hw, delta_iqk, thermal_value, 8);
2535
2536 spin_lock(&rtlpriv->locks.iqk_lock);
2537 rtlphy->lck_inprogress = false;
2538 spin_unlock(&rtlpriv->locks.iqk_lock);
2539 }
2540 }
2541
2542 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2543 "<===rtl8812ae_dm_txpower_tracking_callback_thermalmeter\n");
2544}
2545
2546void rtl8821ae_dm_check_txpower_tracking_thermalmeter(struct ieee80211_hw *hw)
2547{
2548 struct rtl_priv *rtlpriv = rtl_priv(hw);
2549 static u8 tm_trigger;
2550
2551 if (!tm_trigger) {
2552 rtl_set_rfreg(hw, RF90_PATH_A, RF_T_METER_88E, BIT(17)|BIT(16),
2553 0x03);
2554 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2555 "Trigger 8821ae Thermal Meter!!\n");
2556 tm_trigger = 1;
2557 return;
2558 } else {
2559 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2560 "Schedule TxPowerTracking !!\n");
2561
2562 rtl8821ae_dm_txpower_tracking_callback_thermalmeter(hw);
2563 tm_trigger = 0;
2564 }
2565}
2566
2567static void rtl8821ae_dm_refresh_rate_adaptive_mask(struct ieee80211_hw *hw)
2568{
2569 struct rtl_priv *rtlpriv = rtl_priv(hw);
2570 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2571 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2572 struct rate_adaptive *p_ra = &rtlpriv->ra;
2573 u32 low_rssithresh_for_ra = p_ra->low2high_rssi_thresh_for_ra40m;
2574 u32 high_rssithresh_for_ra = p_ra->high_rssi_thresh_for_ra;
2575 u8 go_up_gap = 5;
2576 struct ieee80211_sta *sta = NULL;
2577
2578 if (is_hal_stop(rtlhal)) {
2579 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2580 "driver is going to unload\n");
2581 return;
2582 }
2583
2584 if (!rtlpriv->dm.useramask) {
2585 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2586 "driver does not control rate adaptive mask\n");
2587 return;
2588 }
2589
2590 if (mac->link_state == MAC80211_LINKED &&
2591 mac->opmode == NL80211_IFTYPE_STATION) {
2592 switch (p_ra->pre_ratr_state) {
2593 case DM_RATR_STA_MIDDLE:
2594 high_rssithresh_for_ra += go_up_gap;
2595 break;
2596 case DM_RATR_STA_LOW:
2597 high_rssithresh_for_ra += go_up_gap;
2598 low_rssithresh_for_ra += go_up_gap;
2599 break;
2600 default:
2601 break;
2602 }
2603
2604 if (rtlpriv->dm.undec_sm_pwdb >
2605 (long)high_rssithresh_for_ra)
2606 p_ra->ratr_state = DM_RATR_STA_HIGH;
2607 else if (rtlpriv->dm.undec_sm_pwdb >
2608 (long)low_rssithresh_for_ra)
2609 p_ra->ratr_state = DM_RATR_STA_MIDDLE;
2610 else
2611 p_ra->ratr_state = DM_RATR_STA_LOW;
2612
2613 if (p_ra->pre_ratr_state != p_ra->ratr_state) {
2614 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2615 "RSSI = %ld\n",
2616 rtlpriv->dm.undec_sm_pwdb);
2617 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2618 "RSSI_LEVEL = %d\n", p_ra->ratr_state);
2619 RT_TRACE(rtlpriv, COMP_RATE, DBG_LOUD,
2620 "PreState = %d, CurState = %d\n",
2621 p_ra->pre_ratr_state, p_ra->ratr_state);
2622
2623 rcu_read_lock();
2624 sta = rtl_find_sta(hw, mac->bssid);
2625 if (sta)
2626 rtlpriv->cfg->ops->update_rate_tbl(hw,
2627 sta, p_ra->ratr_state);
2628 rcu_read_unlock();
2629
2630 p_ra->pre_ratr_state = p_ra->ratr_state;
2631 }
2632 }
2633}
2634
2635static void rtl8821ae_dm_refresh_basic_rate_mask(struct ieee80211_hw *hw)
2636{
2637 struct rtl_priv *rtlpriv = rtl_priv(hw);
2638 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2639 struct rtl_mac *mac = &rtlpriv->mac80211;
2640 static u8 stage;
2641 u8 cur_stage = 0;
2642 u16 basic_rate = RRSR_1M | RRSR_2M | RRSR_5_5M | RRSR_11M | RRSR_6M;
2643
2644 if (mac->link_state < MAC80211_LINKED)
2645 cur_stage = 0;
2646 else if (dm_digtable->rssi_val_min < 25)
2647 cur_stage = 1;
2648 else if (dm_digtable->rssi_val_min > 30)
2649 cur_stage = 3;
2650 else
2651 cur_stage = 2;
2652
2653 if (cur_stage != stage) {
2654 if (cur_stage == 1) {
2655 basic_rate &= (!(basic_rate ^ mac->basic_rates));
2656 rtlpriv->cfg->ops->set_hw_reg(hw,
2657 HW_VAR_BASIC_RATE, (u8 *)&basic_rate);
2658 } else if (cur_stage == 3 && (stage == 1 || stage == 2)) {
2659 rtlpriv->cfg->ops->set_hw_reg(hw,
2660 HW_VAR_BASIC_RATE, (u8 *)&mac->basic_rates);
2661 }
2662 }
2663 stage = cur_stage;
2664}
2665
2666static void rtl8821ae_dm_edca_choose_traffic_idx(
2667 struct ieee80211_hw *hw, u64 cur_tx_bytes,
2668 u64 cur_rx_bytes, bool b_bias_on_rx,
2669 bool *pb_is_cur_rdl_state)
2670{
2671 struct rtl_priv *rtlpriv = rtl_priv(hw);
2672
2673 if (b_bias_on_rx) {
2674 if (cur_tx_bytes > (cur_rx_bytes*4)) {
2675 *pb_is_cur_rdl_state = false;
2676 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2677 "Uplink Traffic\n ");
2678 } else {
2679 *pb_is_cur_rdl_state = true;
2680 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2681 "Balance Traffic\n");
2682 }
2683 } else {
2684 if (cur_rx_bytes > (cur_tx_bytes*4)) {
2685 *pb_is_cur_rdl_state = true;
2686 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2687 "Downlink Traffic\n");
2688 } else {
2689 *pb_is_cur_rdl_state = false;
2690 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2691 "Balance Traffic\n");
2692 }
2693 }
2694 return;
2695}
2696
2697static void rtl8821ae_dm_check_edca_turbo(struct ieee80211_hw *hw)
2698{
2699 struct rtl_priv *rtlpriv = rtl_priv(hw);
2700 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2701 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2702
2703 /*Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.*/
2704 u64 cur_tx_ok_cnt = 0;
2705 u64 cur_rx_ok_cnt = 0;
2706 u32 edca_be_ul = 0x5ea42b;
2707 u32 edca_be_dl = 0x5ea42b;
2708 u32 edca_be = 0x5ea42b;
2709 u8 iot_peer = 0;
2710 bool *pb_is_cur_rdl_state = NULL;
2711 bool b_last_is_cur_rdl_state = false;
2712 bool b_bias_on_rx = false;
2713 bool b_edca_turbo_on = false;
2714
2715 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2716 "rtl8821ae_dm_check_edca_turbo=====>");
2717 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2718 "Orginial BE PARAM: 0x%x\n",
2719 rtl_read_dword(rtlpriv, DM_REG_EDCA_BE_11N));
2720
2721 if (rtlpriv->dm.dbginfo.num_non_be_pkt > 0x100)
2722 rtlpriv->dm.is_any_nonbepkts = true;
2723 rtlpriv->dm.dbginfo.num_non_be_pkt = 0;
2724
2725 /*===============================
2726 * list paramter for different platform
2727 *===============================
2728 */
2729 b_last_is_cur_rdl_state = rtlpriv->dm.is_cur_rdlstate;
2730 pb_is_cur_rdl_state = &rtlpriv->dm.is_cur_rdlstate;
2731
2732 cur_tx_ok_cnt = rtlpriv->stats.txbytesunicast - rtldm->last_tx_ok_cnt;
2733 cur_rx_ok_cnt = rtlpriv->stats.rxbytesunicast - rtldm->last_rx_ok_cnt;
2734
2735 rtldm->last_tx_ok_cnt = rtlpriv->stats.txbytesunicast;
2736 rtldm->last_rx_ok_cnt = rtlpriv->stats.rxbytesunicast;
2737
2738 iot_peer = rtlpriv->mac80211.vendor;
2739 b_bias_on_rx = false;
2740 b_edca_turbo_on = ((!rtlpriv->dm.is_any_nonbepkts) &&
2741 (!rtlpriv->dm.disable_framebursting)) ?
2742 true : false;
2743
2744 if (rtlpriv->rtlhal.hw_type != HARDWARE_TYPE_RTL8812AE) {
2745 if ((iot_peer == PEER_CISCO) &&
2746 (mac->mode == WIRELESS_MODE_N_24G)) {
2747 edca_be_dl = edca_setting_dl[iot_peer];
2748 edca_be_ul = edca_setting_ul[iot_peer];
2749 }
2750 }
2751
2752 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2753 "bIsAnyNonBEPkts : 0x%x bDisableFrameBursting : 0x%x\n",
2754 rtlpriv->dm.is_any_nonbepkts,
2755 rtlpriv->dm.disable_framebursting);
2756
2757 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2758 "bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",
2759 b_edca_turbo_on, b_bias_on_rx);
2760
2761 if (b_edca_turbo_on) {
2762 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2763 "curTxOkCnt : 0x%llx\n", cur_tx_ok_cnt);
2764 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2765 "curRxOkCnt : 0x%llx\n", cur_rx_ok_cnt);
2766 if (b_bias_on_rx)
2767 rtl8821ae_dm_edca_choose_traffic_idx(hw, cur_tx_ok_cnt,
2768 cur_rx_ok_cnt, true, pb_is_cur_rdl_state);
2769 else
2770 rtl8821ae_dm_edca_choose_traffic_idx(hw, cur_tx_ok_cnt,
2771 cur_rx_ok_cnt, false, pb_is_cur_rdl_state);
2772
2773 edca_be = (*pb_is_cur_rdl_state) ? edca_be_dl : edca_be_ul;
2774
2775 rtl_write_dword(rtlpriv, DM_REG_EDCA_BE_11N, edca_be);
2776
2777 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2778 "EDCA Turbo on: EDCA_BE:0x%x\n", edca_be);
2779
2780 rtlpriv->dm.current_turbo_edca = true;
2781
2782 RT_TRACE(rtlpriv, COMP_TURBO, DBG_LOUD,
2783 "EDCA_BE_DL : 0x%x EDCA_BE_UL : 0x%x EDCA_BE : 0x%x\n",
2784 edca_be_dl, edca_be_ul, edca_be);
2785 } else {
2786 if (rtlpriv->dm.current_turbo_edca) {
2787 u8 tmp = AC0_BE;
2788 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AC_PARAM,
2789 (u8 *)(&tmp));
2790 }
2791 rtlpriv->dm.current_turbo_edca = false;
2792 }
2793
2794 rtlpriv->dm.is_any_nonbepkts = false;
2795 rtldm->last_tx_ok_cnt = rtlpriv->stats.txbytesunicast;
2796 rtldm->last_rx_ok_cnt = rtlpriv->stats.rxbytesunicast;
2797}
2798
2799static void rtl8821ae_dm_cck_packet_detection_thresh(struct ieee80211_hw *hw)
2800{
2801 struct rtl_priv *rtlpriv = rtl_priv(hw);
2802 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
2803 u8 cur_cck_cca_thresh;
2804
2805 if (rtlpriv->mac80211.link_state >= MAC80211_LINKED) {
2806 if (dm_digtable->rssi_val_min > 25) {
2807 cur_cck_cca_thresh = 0xcd;
2808 } else if ((dm_digtable->rssi_val_min <= 25) &&
2809 (dm_digtable->rssi_val_min > 10)) {
2810 cur_cck_cca_thresh = 0x83;
2811 } else {
2812 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
2813 cur_cck_cca_thresh = 0x83;
2814 else
2815 cur_cck_cca_thresh = 0x40;
2816 }
2817 } else {
2818 if (rtlpriv->falsealm_cnt.cnt_cck_fail > 1000)
2819 cur_cck_cca_thresh = 0x83;
2820 else
2821 cur_cck_cca_thresh = 0x40;
2822 }
2823
2824 if (dm_digtable->cur_cck_cca_thres != cur_cck_cca_thresh)
2825 rtl_write_byte(rtlpriv, ODM_REG_CCK_CCA_11AC,
2826 cur_cck_cca_thresh);
2827
2828 dm_digtable->pre_cck_cca_thres = dm_digtable->cur_cck_cca_thres;
2829 dm_digtable->cur_cck_cca_thres = cur_cck_cca_thresh;
2830 RT_TRACE(rtlpriv, COMP_DIG, DBG_TRACE,
2831 "CCK cca thresh hold =%x\n", dm_digtable->cur_cck_cca_thres);
2832}
2833
2834static void rtl8821ae_dm_dynamic_atc_switch(struct ieee80211_hw *hw)
2835{
2836 struct rtl_priv *rtlpriv = rtl_priv(hw);
2837 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
2838 u8 crystal_cap;
2839 u32 packet_count;
2840 int cfo_khz_a, cfo_khz_b, cfo_ave = 0, adjust_xtal = 0;
2841 int cfo_ave_diff;
2842
2843 if (rtlpriv->mac80211.link_state < MAC80211_LINKED) {
2844 /*1.Enable ATC*/
2845 if (rtldm->atc_status == ATC_STATUS_OFF) {
2846 rtl_set_bbreg(hw, RFC_AREA, BIT(14), ATC_STATUS_ON);
2847 rtldm->atc_status = ATC_STATUS_ON;
2848 }
2849
2850 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "No link!!\n");
2851 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2852 "atc_status = %d\n", rtldm->atc_status);
2853
2854 if (rtldm->crystal_cap != rtlpriv->efuse.crystalcap) {
2855 rtldm->crystal_cap = rtlpriv->efuse.crystalcap;
2856 crystal_cap = rtldm->crystal_cap & 0x3f;
2857 crystal_cap = crystal_cap & 0x3f;
2858 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE)
2859 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2860 0x7ff80000, (crystal_cap |
2861 (crystal_cap << 6)));
2862 else
2863 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2864 0xfff000, (crystal_cap |
2865 (crystal_cap << 6)));
2866 }
2867 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD, "crystal_cap = 0x%x\n",
2868 rtldm->crystal_cap);
2869 } else{
2870 /*1. Calculate CFO for path-A & path-B*/
2871 cfo_khz_a = (int)(rtldm->cfo_tail[0] * 3125) / 1280;
2872 cfo_khz_b = (int)(rtldm->cfo_tail[1] * 3125) / 1280;
2873 packet_count = rtldm->packet_count;
2874
2875 /*2.No new packet*/
2876 if (packet_count == rtldm->packet_count_pre) {
2877 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2878 "packet counter doesn't change\n");
2879 return;
2880 }
2881
2882 rtldm->packet_count_pre = packet_count;
2883 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2884 "packet counter = %d\n",
2885 rtldm->packet_count);
2886
2887 /*3.Average CFO*/
2888 if (rtlpriv->phy.rf_type == RF_1T1R)
2889 cfo_ave = cfo_khz_a;
2890 else
2891 cfo_ave = (cfo_khz_a + cfo_khz_b) >> 1;
2892
2893 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2894 "cfo_khz_a = %dkHz, cfo_khz_b = %dkHz, cfo_ave = %dkHz\n",
2895 cfo_khz_a, cfo_khz_b, cfo_ave);
2896
2897 /*4.Avoid abnormal large CFO*/
2898 cfo_ave_diff = (rtldm->cfo_ave_pre >= cfo_ave) ?
2899 (rtldm->cfo_ave_pre - cfo_ave) :
2900 (cfo_ave - rtldm->cfo_ave_pre);
2901
2902 if (cfo_ave_diff > 20 && rtldm->large_cfo_hit == 0) {
2903 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2904 "first large CFO hit\n");
2905 rtldm->large_cfo_hit = 1;
2906 return;
2907 } else
2908 rtldm->large_cfo_hit = 0;
2909
2910 rtldm->cfo_ave_pre = cfo_ave;
2911
2912 /*CFO tracking by adjusting Xtal cap.*/
2913
2914 /*1.Dynamic Xtal threshold*/
2915 if (cfo_ave >= -rtldm->cfo_threshold &&
2916 cfo_ave <= rtldm->cfo_threshold &&
2917 rtldm->is_freeze == 0) {
2918 if (rtldm->cfo_threshold == CFO_THRESHOLD_XTAL) {
2919 rtldm->cfo_threshold = CFO_THRESHOLD_XTAL + 10;
2920 rtldm->is_freeze = 1;
2921 } else {
2922 rtldm->cfo_threshold = CFO_THRESHOLD_XTAL;
2923 }
2924 }
2925 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2926 "Dynamic threshold = %d\n",
2927 rtldm->cfo_threshold);
2928
2929 /* 2.Calculate Xtal offset*/
2930 if (cfo_ave > rtldm->cfo_threshold && rtldm->crystal_cap < 0x3f)
2931 adjust_xtal = ((cfo_ave - CFO_THRESHOLD_XTAL) >> 2) + 1;
2932 else if ((cfo_ave < -rtlpriv->dm.cfo_threshold) &&
2933 rtlpriv->dm.crystal_cap > 0)
2934 adjust_xtal = ((cfo_ave + CFO_THRESHOLD_XTAL) >> 2) - 1;
2935 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2936 "Crystal cap = 0x%x, Crystal cap offset = %d\n",
2937 rtldm->crystal_cap, adjust_xtal);
2938
2939 /*3.Adjudt Crystal Cap.*/
2940 if (adjust_xtal != 0) {
2941 rtldm->is_freeze = 0;
2942 rtldm->crystal_cap += adjust_xtal;
2943
2944 if (rtldm->crystal_cap > 0x3f)
2945 rtldm->crystal_cap = 0x3f;
2946 else if (rtldm->crystal_cap < 0)
2947 rtldm->crystal_cap = 0;
2948
2949 crystal_cap = rtldm->crystal_cap & 0x3f;
2950 crystal_cap = crystal_cap & 0x3f;
2951 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE)
2952 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2953 0x7ff80000, (crystal_cap |
2954 (crystal_cap << 6)));
2955 else
2956 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL,
2957 0xfff000, (crystal_cap |
2958 (crystal_cap << 6)));
2959 RT_TRACE(rtlpriv, COMP_DIG, DBG_LOUD,
2960 "New crystal cap = 0x%x\n",
2961 rtldm->crystal_cap);
2962 }
2963 }
2964}
2965
2966void rtl8821ae_dm_watchdog(struct ieee80211_hw *hw)
2967{
2968 struct rtl_priv *rtlpriv = rtl_priv(hw);
2969 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
2970 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2971 bool fw_current_inpsmode = false;
2972 bool fw_ps_awake = true;
2973
2974 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
2975 (u8 *)(&fw_current_inpsmode));
2976
2977 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_FWLPS_RF_ON,
2978 (u8 *)(&fw_ps_awake));
2979
2980 if (ppsc->p2p_ps_info.p2p_ps_mode)
2981 fw_ps_awake = false;
2982
2983 if ((ppsc->rfpwr_state == ERFON) &&
2984 ((!fw_current_inpsmode) && fw_ps_awake) &&
2985 (!ppsc->rfchange_inprogress)) {
2986 rtl8821ae_dm_common_info_self_update(hw);
2987 rtl8821ae_dm_false_alarm_counter_statistics(hw);
2988 rtl8821ae_dm_check_rssi_monitor(hw);
2989 rtl8821ae_dm_dig(hw);
2990 rtl8821ae_dm_cck_packet_detection_thresh(hw);
2991 rtl8821ae_dm_refresh_rate_adaptive_mask(hw);
2992 rtl8821ae_dm_refresh_basic_rate_mask(hw);
2993 rtl8821ae_dm_check_edca_turbo(hw);
2994 rtl8821ae_dm_dynamic_atc_switch(hw);
2995 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2996 rtl8812ae_dm_check_txpower_tracking_thermalmeter(hw);
2997 else
2998 rtl8821ae_dm_check_txpower_tracking_thermalmeter(hw);
2999 rtl8821ae_dm_iq_calibrate(hw);
3000 }
3001
3002 rtlpriv->dm.dbginfo.num_qry_beacon_pkt = 0;
3003 RT_TRACE(rtlpriv, COMP_DIG, DBG_DMESG, "\n");
3004}
3005
3006void rtl8821ae_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
3007 u8 *pdesc, u32 mac_id)
3008{
3009 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3010 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3011 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
3012 struct fast_ant_training *pfat_table = &rtldm->fat_table;
3013
3014 if (rtlhal->hw_type != HARDWARE_TYPE_RTL8812AE)
3015 return;
3016
3017 if (rtlefuse->antenna_div_type == CG_TRX_HW_ANTDIV)
3018 SET_TX_DESC_TX_ANT(pdesc, pfat_table->antsel_a[mac_id]);
3019}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
new file mode 100644
index 000000000000..9dd40dd316c1
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/dm.h
@@ -0,0 +1,356 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_DM_H__
27#define __RTL8821AE_DM_H__
28
29#define MAIN_ANT 0
30#define AUX_ANT 1
31#define MAIN_ANT_CG_TRX 1
32#define AUX_ANT_CG_TRX 0
33#define MAIN_ANT_CGCS_RX 0
34#define AUX_ANT_CGCS_RX 1
35
36#define TXSCALE_TABLE_SIZE 37
37
38/*RF REG LIST*/
39#define DM_REG_RF_MODE_11N 0x00
40#define DM_REG_RF_0B_11N 0x0B
41#define DM_REG_CHNBW_11N 0x18
42#define DM_REG_T_METER_11N 0x24
43#define DM_REG_RF_25_11N 0x25
44#define DM_REG_RF_26_11N 0x26
45#define DM_REG_RF_27_11N 0x27
46#define DM_REG_RF_2B_11N 0x2B
47#define DM_REG_RF_2C_11N 0x2C
48#define DM_REG_RXRF_A3_11N 0x3C
49#define DM_REG_T_METER_92D_11N 0x42
50#define DM_REG_T_METER_88E_11N 0x42
51
52/*BB REG LIST*/
53/*PAGE 8 */
54#define DM_REG_BB_CTRL_11N 0x800
55#define DM_REG_RF_PIN_11N 0x804
56#define DM_REG_PSD_CTRL_11N 0x808
57#define DM_REG_TX_ANT_CTRL_11N 0x80C
58#define DM_REG_BB_PWR_SAV5_11N 0x818
59#define DM_REG_CCK_RPT_FORMAT_11N 0x824
60#define DM_REG_RX_DEFUALT_A_11N 0x858
61#define DM_REG_RX_DEFUALT_B_11N 0x85A
62#define DM_REG_BB_PWR_SAV3_11N 0x85C
63#define DM_REG_ANTSEL_CTRL_11N 0x860
64#define DM_REG_RX_ANT_CTRL_11N 0x864
65#define DM_REG_PIN_CTRL_11N 0x870
66#define DM_REG_BB_PWR_SAV1_11N 0x874
67#define DM_REG_ANTSEL_PATH_11N 0x878
68#define DM_REG_BB_3WIRE_11N 0x88C
69#define DM_REG_SC_CNT_11N 0x8C4
70#define DM_REG_PSD_DATA_11N 0x8B4
71/*PAGE 9*/
72#define DM_REG_ANT_MAPPING1_11N 0x914
73#define DM_REG_ANT_MAPPING2_11N 0x918
74/*PAGE A*/
75#define DM_REG_CCK_ANTDIV_PARA1_11N 0xA00
76#define DM_REG_CCK_CCA_11N 0xA0A
77#define DM_REG_CCK_CCA_11AC 0xA0A
78#define DM_REG_CCK_ANTDIV_PARA2_11N 0xA0C
79#define DM_REG_CCK_ANTDIV_PARA3_11N 0xA10
80#define DM_REG_CCK_ANTDIV_PARA4_11N 0xA14
81#define DM_REG_CCK_FILTER_PARA1_11N 0xA22
82#define DM_REG_CCK_FILTER_PARA2_11N 0xA23
83#define DM_REG_CCK_FILTER_PARA3_11N 0xA24
84#define DM_REG_CCK_FILTER_PARA4_11N 0xA25
85#define DM_REG_CCK_FILTER_PARA5_11N 0xA26
86#define DM_REG_CCK_FILTER_PARA6_11N 0xA27
87#define DM_REG_CCK_FILTER_PARA7_11N 0xA28
88#define DM_REG_CCK_FILTER_PARA8_11N 0xA29
89#define DM_REG_CCK_FA_RST_11N 0xA2C
90#define DM_REG_CCK_FA_MSB_11N 0xA58
91#define DM_REG_CCK_FA_LSB_11N 0xA5C
92#define DM_REG_CCK_CCA_CNT_11N 0xA60
93#define DM_REG_BB_PWR_SAV4_11N 0xA74
94/*PAGE B */
95#define DM_REG_LNA_SWITCH_11N 0xB2C
96#define DM_REG_PATH_SWITCH_11N 0xB30
97#define DM_REG_RSSI_CTRL_11N 0xB38
98#define DM_REG_CONFIG_ANTA_11N 0xB68
99#define DM_REG_RSSI_BT_11N 0xB9C
100/*PAGE C */
101#define DM_REG_OFDM_FA_HOLDC_11N 0xC00
102#define DM_REG_RX_PATH_11N 0xC04
103#define DM_REG_TRMUX_11N 0xC08
104#define DM_REG_OFDM_FA_RSTC_11N 0xC0C
105#define DM_REG_RXIQI_MATRIX_11N 0xC14
106#define DM_REG_TXIQK_MATRIX_LSB1_11N 0xC4C
107#define DM_REG_IGI_A_11N 0xC50
108#define DM_REG_IGI_A_11AC 0xC50
109#define DM_REG_ANTDIV_PARA2_11N 0xC54
110#define DM_REG_IGI_B_11N 0xC58
111#define DM_REG_IGI_B_11AC 0xE50
112#define DM_REG_ANTDIV_PARA3_11N 0xC5C
113#define DM_REG_BB_PWR_SAV2_11N 0xC70
114#define DM_REG_RX_OFF_11N 0xC7C
115#define DM_REG_TXIQK_MATRIXA_11N 0xC80
116#define DM_REG_TXIQK_MATRIXB_11N 0xC88
117#define DM_REG_TXIQK_MATRIXA_LSB2_11N 0xC94
118#define DM_REG_TXIQK_MATRIXB_LSB2_11N 0xC9C
119#define DM_REG_RXIQK_MATRIX_LSB_11N 0xCA0
120#define DM_REG_ANTDIV_PARA1_11N 0xCA4
121#define DM_REG_OFDM_FA_TYPE1_11N 0xCF0
122/*PAGE D */
123#define DM_REG_OFDM_FA_RSTD_11N 0xD00
124#define DM_REG_OFDM_FA_TYPE2_11N 0xDA0
125#define DM_REG_OFDM_FA_TYPE3_11N 0xDA4
126#define DM_REG_OFDM_FA_TYPE4_11N 0xDA8
127/*PAGE E */
128#define DM_REG_TXAGC_A_6_18_11N 0xE00
129#define DM_REG_TXAGC_A_24_54_11N 0xE04
130#define DM_REG_TXAGC_A_1_MCS32_11N 0xE08
131#define DM_REG_TXAGC_A_MCS0_3_11N 0xE10
132#define DM_REG_TXAGC_A_MCS4_7_11N 0xE14
133#define DM_REG_TXAGC_A_MCS8_11_11N 0xE18
134#define DM_REG_TXAGC_A_MCS12_15_11N 0xE1C
135#define DM_REG_FPGA0_IQK_11N 0xE28
136#define DM_REG_TXIQK_TONE_A_11N 0xE30
137#define DM_REG_RXIQK_TONE_A_11N 0xE34
138#define DM_REG_TXIQK_PI_A_11N 0xE38
139#define DM_REG_RXIQK_PI_A_11N 0xE3C
140#define DM_REG_TXIQK_11N 0xE40
141#define DM_REG_RXIQK_11N 0xE44
142#define DM_REG_IQK_AGC_PTS_11N 0xE48
143#define DM_REG_IQK_AGC_RSP_11N 0xE4C
144#define DM_REG_BLUETOOTH_11N 0xE6C
145#define DM_REG_RX_WAIT_CCA_11N 0xE70
146#define DM_REG_TX_CCK_RFON_11N 0xE74
147#define DM_REG_TX_CCK_BBON_11N 0xE78
148#define DM_REG_OFDM_RFON_11N 0xE7C
149#define DM_REG_OFDM_BBON_11N 0xE80
150#define DM_REG_TX2RX_11N 0xE84
151#define DM_REG_TX2TX_11N 0xE88
152#define DM_REG_RX_CCK_11N 0xE8C
153#define DM_REG_RX_OFDM_11N 0xED0
154#define DM_REG_RX_WAIT_RIFS_11N 0xED4
155#define DM_REG_RX2RX_11N 0xED8
156#define DM_REG_STANDBY_11N 0xEDC
157#define DM_REG_SLEEP_11N 0xEE0
158#define DM_REG_PMPD_ANAEN_11N 0xEEC
159
160/*MAC REG LIST*/
161#define DM_REG_BB_RST_11N 0x02
162#define DM_REG_ANTSEL_PIN_11N 0x4C
163#define DM_REG_EARLY_MODE_11N 0x4D0
164#define DM_REG_RSSI_MONITOR_11N 0x4FE
165#define DM_REG_EDCA_VO_11N 0x500
166#define DM_REG_EDCA_VI_11N 0x504
167#define DM_REG_EDCA_BE_11N 0x508
168#define DM_REG_EDCA_BK_11N 0x50C
169#define DM_REG_TXPAUSE_11N 0x522
170#define DM_REG_RESP_TX_11N 0x6D8
171#define DM_REG_ANT_TRAIN_PARA1_11N 0x7b0
172#define DM_REG_ANT_TRAIN_PARA2_11N 0x7b4
173
174/*DIG Related*/
175#define DM_BIT_IGI_11N 0x0000007F
176#define DM_BIT_IGI_11AC 0xFFFFFFFF
177
178#define HAL_DM_DIG_DISABLE BIT(0)
179#define HAL_DM_HIPWR_DISABLE BIT(1)
180
181#define OFDM_TABLE_LENGTH 43
182#define CCK_TABLE_LENGTH 33
183
184#define OFDM_TABLE_SIZE 37
185#define CCK_TABLE_SIZE 33
186
187#define BW_AUTO_SWITCH_HIGH_LOW 25
188#define BW_AUTO_SWITCH_LOW_HIGH 30
189
190#define DM_DIG_THRESH_HIGH 40
191#define DM_DIG_THRESH_LOW 35
192
193#define DM_FALSEALARM_THRESH_LOW 400
194#define DM_FALSEALARM_THRESH_HIGH 1000
195
196#define DM_DIG_MAX 0x3e
197#define DM_DIG_MIN 0x1e
198
199#define DM_DIG_MAX_AP 0x32
200#define DM_DIG_MIN_AP 0x20
201
202#define DM_DIG_FA_UPPER 0x3e
203#define DM_DIG_FA_LOWER 0x1e
204#define DM_DIG_FA_TH0 200
205#define DM_DIG_FA_TH1 0x300
206#define DM_DIG_FA_TH2 0x400
207
208#define DM_DIG_BACKOFF_MAX 12
209#define DM_DIG_BACKOFF_MIN -4
210#define DM_DIG_BACKOFF_DEFAULT 10
211
212#define RXPATHSELECTION_SS_TH_LOW 30
213#define RXPATHSELECTION_DIFF_TH 18
214
215#define DM_RATR_STA_INIT 0
216#define DM_RATR_STA_HIGH 1
217#define DM_RATR_STA_MIDDLE 2
218#define DM_RATR_STA_LOW 3
219
220#define CTS2SELF_THVAL 30
221#define REGC38_TH 20
222
223#define WAIOTTHVAL 25
224
225#define TXHIGHPWRLEVEL_NORMAL 0
226#define TXHIGHPWRLEVEL_LEVEL1 1
227#define TXHIGHPWRLEVEL_LEVEL2 2
228#define TXHIGHPWRLEVEL_BT1 3
229#define TXHIGHPWRLEVEL_BT2 4
230
231#define DM_TYPE_BYFW 0
232#define DM_TYPE_BYDRIVER 1
233
234#define TX_POWER_NEAR_FIELD_THRESH_LVL2 74
235#define TX_POWER_NEAR_FIELD_THRESH_LVL1 67
236#define TXPWRTRACK_MAX_IDX 6
237
238/* Dynamic ATC switch */
239#define ATC_STATUS_OFF 0x0 /* enable */
240#define ATC_STATUS_ON 0x1 /* disable */
241#define CFO_THRESHOLD_XTAL 10 /* kHz */
242#define CFO_THRESHOLD_ATC 80 /* kHz */
243
244#define AVG_THERMAL_NUM_8812A 4
245#define TXPWR_TRACK_TABLE_SIZE 30
246#define MAX_PATH_NUM_8812A 2
247#define MAX_PATH_NUM_8821A 1
248
249enum FAT_STATE {
250 FAT_NORMAL_STATE = 0,
251 FAT_TRAINING_STATE = 1,
252};
253
254enum tag_dynamic_init_gain_operation_type_definition {
255 DIG_TYPE_THRESH_HIGH = 0,
256 DIG_TYPE_THRESH_LOW = 1,
257 DIG_TYPE_BACKOFF = 2,
258 DIG_TYPE_RX_GAIN_MIN = 3,
259 DIG_TYPE_RX_GAIN_MAX = 4,
260 DIG_TYPE_ENABLE = 5,
261 DIG_TYPE_DISABLE = 6,
262 DIG_OP_TYPE_MAX
263};
264
265enum tag_cck_packet_detection_threshold_type_definition {
266 CCK_PD_STAGE_LOWRSSI = 0,
267 CCK_PD_STAGE_HIGHRSSI = 1,
268 CCK_FA_STAGE_LOW = 2,
269 CCK_FA_STAGE_HIGH = 3,
270 CCK_PD_STAGE_MAX = 4,
271};
272
273enum dm_1r_cca_e {
274 CCA_1R = 0,
275 CCA_2R = 1,
276 CCA_MAX = 2,
277};
278
279enum dm_rf_e {
280 RF_SAVE = 0,
281 RF_NORMAL = 1,
282 RF_MAX = 2,
283};
284
285enum dm_sw_ant_switch_e {
286 ANS_ANTENNA_B = 1,
287 ANS_ANTENNA_A = 2,
288 ANS_ANTENNA_MAX = 3,
289};
290
291enum dm_dig_ext_port_alg_e {
292 DIG_EXT_PORT_STAGE_0 = 0,
293 DIG_EXT_PORT_STAGE_1 = 1,
294 DIG_EXT_PORT_STAGE_2 = 2,
295 DIG_EXT_PORT_STAGE_3 = 3,
296 DIG_EXT_PORT_STAGE_MAX = 4,
297};
298
299enum dm_dig_connect_e {
300 DIG_STA_DISCONNECT = 0,
301 DIG_STA_CONNECT = 1,
302 DIG_STA_BEFORE_CONNECT = 2,
303 DIG_MULTISTA_DISCONNECT = 3,
304 DIG_MULTISTA_CONNECT = 4,
305 DIG_CONNECT_MAX
306};
307
308enum pwr_track_control_method {
309 BBSWING,
310 TXAGC,
311 MIX_MODE
312};
313
314#define BT_RSSI_STATE_NORMAL_POWER BIT_OFFSET_LEN_MASK_32(0, 1)
315#define BT_RSSI_STATE_AMDPU_OFF BIT_OFFSET_LEN_MASK_32(1, 1)
316#define BT_RSSI_STATE_SPECIAL_LOW BIT_OFFSET_LEN_MASK_32(2, 1)
317#define BT_RSSI_STATE_BG_EDCA_LOW BIT_OFFSET_LEN_MASK_32(3, 1)
318#define BT_RSSI_STATE_TXPOWER_LOW BIT_OFFSET_LEN_MASK_32(4, 1)
319#define GET_UNDECORATED_AVERAGE_RSSI(_priv) \
320 ((((struct rtl_priv *)(_priv))->mac80211.opmode == \
321 NL80211_IFTYPE_ADHOC) ? \
322 (((struct rtl_priv *)(_priv))->dm.entry_min_undec_sm_pwdb) : \
323 (((struct rtl_priv *)(_priv))->dm.undec_sm_pwdb))
324
325void rtl8821ae_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
326 u8 *pdesc, u32 mac_id);
327void rtl8821ae_dm_ant_sel_statistics(struct ieee80211_hw *hw,
328 u8 antsel_tr_mux, u32 mac_id,
329 u32 rx_pwdb_all);
330void rtl8821ae_dm_fast_antenna_training_callback(unsigned long data);
331void rtl8821ae_dm_init(struct ieee80211_hw *hw);
332void rtl8821ae_dm_watchdog(struct ieee80211_hw *hw);
333void rtl8821ae_dm_write_dig(struct ieee80211_hw *hw, u8 current_igi);
334void rtl8821ae_dm_init_edca_turbo(struct ieee80211_hw *hw);
335void rtl8821ae_dm_check_txpower_tracking_thermalmeter(struct ieee80211_hw *hw);
336void rtl8821ae_dm_init_rate_adaptive_mask(struct ieee80211_hw *hw);
337void rtl8821ae_dm_txpower_track_adjust(struct ieee80211_hw *hw,
338 u8 type, u8 *pdirection,
339 u32 *poutwrite_val);
340void rtl8821ae_dm_clear_txpower_tracking_state(struct ieee80211_hw *hw);
341void rtl8821ae_dm_write_cck_cca_thres(struct ieee80211_hw *hw, u8 current_cca);
342void rtl8821ae_dm_initialize_txpower_tracking_thermalmeter(struct ieee80211_hw *hw);
343void rtl8812ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
344 enum pwr_track_control_method method,
345 u8 rf_path,
346 u8 channel_mapped_index);
347void rtl8821ae_dm_txpwr_track_set_pwr(struct ieee80211_hw *hw,
348 enum pwr_track_control_method method,
349 u8 rf_path, u8 channel_mapped_index);
350
351void rtl8821ae_dm_update_init_rate(struct ieee80211_hw *hw, u8 rate);
352u8 rtl8821ae_hw_rate_to_mrate(struct ieee80211_hw *hw, u8 rate);
353void rtl8812ae_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw *hw);
354void rtl8821ae_dm_txpower_tracking_callback_thermalmeter(struct ieee80211_hw *hw);
355
356#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c
new file mode 100644
index 000000000000..95e95626b632
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.c
@@ -0,0 +1,1857 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../base.h"
29#include "../core.h"
30#include "reg.h"
31#include "def.h"
32#include "fw.h"
33#include "dm.h"
34
35static void _rtl8821ae_enable_fw_download(struct ieee80211_hw *hw, bool enable)
36{
37 struct rtl_priv *rtlpriv = rtl_priv(hw);
38 u8 tmp;
39
40 if (enable) {
41 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x05);
42
43 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL + 2);
44 rtl_write_byte(rtlpriv, REG_MCUFWDL + 2, tmp & 0xf7);
45
46 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
47 } else {
48 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
49 rtl_write_byte(rtlpriv, REG_MCUFWDL, tmp & 0xfe);
50 tmp = rtl_read_byte(rtlpriv, REG_MCUFWDL);
51 }
52}
53
54static void _rtl8821ae_fw_block_write(struct ieee80211_hw *hw,
55 const u8 *buffer, u32 size)
56{
57 struct rtl_priv *rtlpriv = rtl_priv(hw);
58 u32 blocksize = sizeof(u32);
59 u8 *bufferptr = (u8 *)buffer;
60 u32 *pu4byteptr = (u32 *)buffer;
61 u32 i, offset, blockcount, remainsize;
62
63 blockcount = size / blocksize;
64 remainsize = size % blocksize;
65
66 for (i = 0; i < blockcount; i++) {
67 offset = i * blocksize;
68 rtl_write_dword(rtlpriv, (FW_8821AE_START_ADDRESS + offset),
69 *(pu4byteptr + i));
70 }
71
72 if (remainsize) {
73 offset = blockcount * blocksize;
74 bufferptr += offset;
75 for (i = 0; i < remainsize; i++) {
76 rtl_write_byte(rtlpriv, (FW_8821AE_START_ADDRESS +
77 offset + i), *(bufferptr + i));
78 }
79 }
80}
81
82static void _rtl8821ae_fw_page_write(struct ieee80211_hw *hw,
83 u32 page, const u8 *buffer, u32 size)
84{
85 struct rtl_priv *rtlpriv = rtl_priv(hw);
86 u8 value8;
87 u8 u8page = (u8)(page & 0x07);
88
89 value8 = (rtl_read_byte(rtlpriv, REG_MCUFWDL + 2) & 0xF8) | u8page;
90
91 rtl_write_byte(rtlpriv, (REG_MCUFWDL + 2), value8);
92 _rtl8821ae_fw_block_write(hw, buffer, size);
93}
94
95static void _rtl8821ae_fill_dummy(u8 *pfwbuf, u32 *pfwlen)
96{
97 u32 fwlen = *pfwlen;
98 u8 remain = (u8)(fwlen % 4);
99
100 remain = (remain == 0) ? 0 : (4 - remain);
101
102 while (remain > 0) {
103 pfwbuf[fwlen] = 0;
104 fwlen++;
105 remain--;
106 }
107
108 *pfwlen = fwlen;
109}
110
111static void _rtl8821ae_write_fw(struct ieee80211_hw *hw,
112 enum version_8821ae version,
113 u8 *buffer, u32 size)
114{
115 struct rtl_priv *rtlpriv = rtl_priv(hw);
116 u8 *bufferptr = (u8 *)buffer;
117 u32 pagenums, remainsize;
118 u32 page, offset;
119
120 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "FW size is %d bytes,\n", size);
121
122 _rtl8821ae_fill_dummy(bufferptr, &size);
123
124 pagenums = size / FW_8821AE_PAGE_SIZE;
125 remainsize = size % FW_8821AE_PAGE_SIZE;
126
127 if (pagenums > 8) {
128 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
129 "Page numbers should not greater then 8\n");
130 }
131
132 for (page = 0; page < pagenums; page++) {
133 offset = page * FW_8821AE_PAGE_SIZE;
134 _rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
135 FW_8821AE_PAGE_SIZE);
136 }
137
138 if (remainsize) {
139 offset = pagenums * FW_8821AE_PAGE_SIZE;
140 page = pagenums;
141 _rtl8821ae_fw_page_write(hw, page, (bufferptr + offset),
142 remainsize);
143 }
144}
145
146static int _rtl8821ae_fw_free_to_go(struct ieee80211_hw *hw)
147{
148 struct rtl_priv *rtlpriv = rtl_priv(hw);
149 int err = -EIO;
150 u32 counter = 0;
151 u32 value32;
152
153 do {
154 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
155 } while ((counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT) &&
156 (!(value32 & FWDL_CHKSUM_RPT)));
157
158 if (counter >= FW_8821AE_POLLING_TIMEOUT_COUNT) {
159 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
160 "chksum report faill ! REG_MCUFWDL:0x%08x .\n",
161 value32);
162 goto exit;
163 }
164
165 RT_TRACE(rtlpriv, COMP_FW, DBG_EMERG,
166 "Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32);
167
168 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
169 value32 |= MCUFWDL_RDY;
170 value32 &= ~WINTINI_RDY;
171 rtl_write_dword(rtlpriv, REG_MCUFWDL, value32);
172
173 rtl8821ae_firmware_selfreset(hw);
174
175 counter = 0;
176 do {
177 value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
178 if (value32 & WINTINI_RDY) {
179 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
180 "Polling FW ready success!! REG_MCUFWDL:0x%08x .\n",
181 value32);
182 err = 0;
183 goto exit;
184 }
185
186 udelay(FW_8821AE_POLLING_DELAY);
187 } while (counter++ < FW_8821AE_POLLING_TIMEOUT_COUNT);
188
189 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
190 "Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n",
191 value32);
192
193exit:
194 return err;
195}
196
197static void _rtl8821ae_wait_for_h2c_cmd_finish(struct rtl_priv *rtlpriv)
198{
199 u8 val;
200 u16 count = 0;
201
202 do {
203 val = rtl_read_byte(rtlpriv, REG_HMETFR);
204 mdelay(1);
205 count++;
206 } while ((val & 0x0F) && (count < 1000));
207}
208
209int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw)
210{
211 struct rtl_priv *rtlpriv = rtl_priv(hw);
212 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
213 struct rtl8821a_firmware_header *pfwheader;
214 u8 *pfwdata;
215 u32 fwsize;
216 int err;
217 bool support_remote_wakeup;
218 enum version_8821ae version = rtlhal->version;
219
220 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
221 (u8 *)(&support_remote_wakeup));
222
223 if (support_remote_wakeup)
224 _rtl8821ae_wait_for_h2c_cmd_finish(rtlpriv);
225
226 if (buse_wake_on_wlan_fw) {
227 if (!rtlhal->wowlan_firmware)
228 return 1;
229
230 pfwheader =
231 (struct rtl8821a_firmware_header *)rtlhal->wowlan_firmware;
232 rtlhal->fw_version = pfwheader->version;
233 rtlhal->fw_subversion = pfwheader->subversion;
234 pfwdata = (u8 *)rtlhal->wowlan_firmware;
235 fwsize = rtlhal->wowlan_fwsize;
236 } else {
237 if (!rtlhal->pfirmware)
238 return 1;
239
240 pfwheader =
241 (struct rtl8821a_firmware_header *)rtlhal->pfirmware;
242 rtlhal->fw_version = pfwheader->version;
243 rtlhal->fw_subversion = pfwheader->subversion;
244 pfwdata = (u8 *)rtlhal->pfirmware;
245 fwsize = rtlhal->fwsize;
246 }
247
248 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
249 "%s Firmware SIZE %d\n",
250 buse_wake_on_wlan_fw ? "Wowlan" : "Normal", fwsize);
251
252 if (IS_FW_HEADER_EXIST_8812(pfwheader) ||
253 IS_FW_HEADER_EXIST_8821(pfwheader)) {
254 RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
255 "Firmware Version(%d), Signature(%#x)\n",
256 pfwheader->version, pfwheader->signature);
257
258 pfwdata = pfwdata + sizeof(struct rtl8821a_firmware_header);
259 fwsize = fwsize - sizeof(struct rtl8821a_firmware_header);
260 }
261
262 if (rtlhal->mac_func_enable) {
263 if (rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) {
264 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
265 rtl8821ae_firmware_selfreset(hw);
266 }
267 }
268 _rtl8821ae_enable_fw_download(hw, true);
269 _rtl8821ae_write_fw(hw, version, pfwdata, fwsize);
270 _rtl8821ae_enable_fw_download(hw, false);
271
272 err = _rtl8821ae_fw_free_to_go(hw);
273 if (err) {
274 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
275 "Firmware is not ready to run!\n");
276 } else {
277 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
278 "Firmware is ready to run!\n");
279 }
280
281 return 0;
282}
283
284#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
285void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
286 bool used_wowlan_fw)
287{
288 struct rtl_priv *rtlpriv = rtl_priv(hw);
289 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
290 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
291 /* 1. Before WoWLAN or After WOWLAN we need to re-download Fw. */
292 if (rtl8821ae_download_fw(hw, used_wowlan_fw)) {
293 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
294 "Re-Download Firmware failed!!\n");
295 rtlhal->fw_ready = false;
296 return;
297 }
298 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
299 "Re-Download Firmware Success !!\n");
300 rtlhal->fw_ready = true;
301
302 /* 2. Re-Init the variables about Fw related setting. */
303 ppsc->fw_current_inpsmode = false;
304 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
305 rtlhal->fw_clk_change_in_progress = false;
306 rtlhal->allow_sw_to_change_hwclc = false;
307 rtlhal->last_hmeboxnum = 0;
308}
309#endif
310
311static bool _rtl8821ae_check_fw_read_last_h2c(struct ieee80211_hw *hw,
312 u8 boxnum)
313{
314 struct rtl_priv *rtlpriv = rtl_priv(hw);
315 u8 val_hmetfr;
316 bool result = false;
317
318 val_hmetfr = rtl_read_byte(rtlpriv, REG_HMETFR);
319 if (((val_hmetfr >> boxnum) & BIT(0)) == 0)
320 result = true;
321 return result;
322}
323
324static void _rtl8821ae_fill_h2c_command(struct ieee80211_hw *hw,
325 u8 element_id, u32 cmd_len,
326 u8 *cmdbuffer)
327{
328 struct rtl_priv *rtlpriv = rtl_priv(hw);
329 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
330 u8 boxnum = 0;
331 u16 box_reg = 0, box_extreg = 0;
332 u8 u1b_tmp = 0;
333 bool isfw_read = false;
334 u8 buf_index = 0;
335 bool bwrite_sucess = false;
336 u8 wait_h2c_limmit = 100;
337 /*u8 wait_writeh2c_limmit = 100;*/
338 u8 boxcontent[4], boxextcontent[4];
339 u32 h2c_waitcounter = 0;
340 unsigned long flag = 0;
341 u8 idx = 0;
342
343 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
344
345 while (true) {
346 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
347 if (rtlhal->h2c_setinprogress) {
348 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
349 "H2C set in progress! Wait to set..element_id(%d).\n",
350 element_id);
351
352 while (rtlhal->h2c_setinprogress) {
353 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
354 flag);
355 h2c_waitcounter++;
356 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
357 "Wait 100 us (%d times)...\n",
358 h2c_waitcounter);
359 udelay(100);
360
361 if (h2c_waitcounter > 1000)
362 return;
363 spin_lock_irqsave(&rtlpriv->locks.h2c_lock,
364 flag);
365 }
366 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
367 } else {
368 rtlhal->h2c_setinprogress = true;
369 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
370 break;
371 }
372 }
373
374 while (!bwrite_sucess) {
375 boxnum = rtlhal->last_hmeboxnum;
376 switch (boxnum) {
377 case 0:
378 box_reg = REG_HMEBOX_0;
379 box_extreg = REG_HMEBOX_EXT_0;
380 break;
381 case 1:
382 box_reg = REG_HMEBOX_1;
383 box_extreg = REG_HMEBOX_EXT_1;
384 break;
385 case 2:
386 box_reg = REG_HMEBOX_2;
387 box_extreg = REG_HMEBOX_EXT_2;
388 break;
389 case 3:
390 box_reg = REG_HMEBOX_3;
391 box_extreg = REG_HMEBOX_EXT_3;
392 break;
393 default:
394 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
395 "switch case not process\n");
396 break;
397 }
398
399 isfw_read = false;
400 u1b_tmp = rtl_read_byte(rtlpriv, REG_CR);
401
402 if (u1b_tmp != 0xEA) {
403 isfw_read = true;
404 } else {
405 if (rtl_read_byte(rtlpriv, REG_TXDMA_STATUS) == 0xEA ||
406 rtl_read_byte(rtlpriv, REG_TXPKT_EMPTY) == 0xEA)
407 rtl_write_byte(rtlpriv, REG_SYS_CFG1 + 3, 0xFF);
408 }
409
410 if (isfw_read) {
411 wait_h2c_limmit = 100;
412 isfw_read =
413 _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
414 while (!isfw_read) {
415 /*wait until Fw read*/
416 wait_h2c_limmit--;
417 if (wait_h2c_limmit == 0) {
418 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
419 "Waiting too long for FW read clear HMEBox(%d)!\n",
420 boxnum);
421 break;
422 }
423
424 udelay(10);
425
426 isfw_read =
427 _rtl8821ae_check_fw_read_last_h2c(hw, boxnum);
428 u1b_tmp = rtl_read_byte(rtlpriv, 0x130);
429 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
430 "Waiting for FW read clear HMEBox(%d)!!! 0x130 = %2x\n",
431 boxnum, u1b_tmp);
432 }
433 }
434
435 if (!isfw_read) {
436 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
437 "Write H2C register BOX[%d] fail!!!!! Fw do not read.\n",
438 boxnum);
439 break;
440 }
441
442 memset(boxcontent, 0, sizeof(boxcontent));
443 memset(boxextcontent, 0, sizeof(boxextcontent));
444 boxcontent[0] = element_id;
445 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
446 "Write element_id box_reg(%4x) = %2x\n",
447 box_reg, element_id);
448
449 switch (cmd_len) {
450 case 1:
451 case 2:
452 case 3:
453 /*boxcontent[0] &= ~(BIT(7));*/
454 memcpy((u8 *)(boxcontent) + 1,
455 cmdbuffer + buf_index, cmd_len);
456
457 for (idx = 0; idx < 4; idx++) {
458 rtl_write_byte(rtlpriv, box_reg + idx,
459 boxcontent[idx]);
460 }
461 break;
462 case 4:
463 case 5:
464 case 6:
465 case 7:
466 /*boxcontent[0] |= (BIT(7));*/
467 memcpy((u8 *)(boxextcontent),
468 cmdbuffer + buf_index+3, cmd_len-3);
469 memcpy((u8 *)(boxcontent) + 1,
470 cmdbuffer + buf_index, 3);
471
472 for (idx = 0; idx < 4; idx++) {
473 rtl_write_byte(rtlpriv, box_extreg + idx,
474 boxextcontent[idx]);
475 }
476
477 for (idx = 0; idx < 4; idx++) {
478 rtl_write_byte(rtlpriv, box_reg + idx,
479 boxcontent[idx]);
480 }
481 break;
482 default:
483 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
484 "switch case not process\n");
485 break;
486 }
487
488 bwrite_sucess = true;
489
490 rtlhal->last_hmeboxnum = boxnum + 1;
491 if (rtlhal->last_hmeboxnum == 4)
492 rtlhal->last_hmeboxnum = 0;
493
494 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
495 "pHalData->last_hmeboxnum = %d\n",
496 rtlhal->last_hmeboxnum);
497 }
498
499 spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
500 rtlhal->h2c_setinprogress = false;
501 spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
502
503 RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
504}
505
506void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw,
507 u8 element_id, u32 cmd_len, u8 *cmdbuffer)
508{
509 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
510 u32 tmp_cmdbuf[2];
511
512 if (!rtlhal->fw_ready) {
513 RT_ASSERT(false,
514 "return H2C cmd because of Fw download fail!!!\n");
515 return;
516 }
517
518 memset(tmp_cmdbuf, 0, 8);
519 memcpy(tmp_cmdbuf, cmdbuffer, cmd_len);
520 _rtl8821ae_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
521}
522
523void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw)
524{
525 struct rtl_priv *rtlpriv = rtl_priv(hw);
526 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
527 u8 u1b_tmp;
528
529 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
530 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
531 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(3))));
532 } else {
533 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
534 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp & (~BIT(0))));
535 }
536
537 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
538 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
539 udelay(50);
540
541 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
542 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
543 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(3)));
544 } else {
545 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL+1);
546 rtl_write_byte(rtlpriv, REG_RSV_CTRL+1, (u1b_tmp | BIT(0)));
547 }
548
549 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
550 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp | BIT(2)));
551
552 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
553 "_8051Reset8812ae(): 8051 reset success .\n");
554}
555
556void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
557{
558 struct rtl_priv *rtlpriv = rtl_priv(hw);
559 u8 u1_h2c_set_pwrmode[H2C_8821AE_PWEMODE_LENGTH] = { 0 };
560 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
561 u8 rlbm, power_state = 0;
562
563 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
564
565 SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, ((mode) ? 1 : 0));
566 rlbm = 0;/*YJ,temp,120316. FW now not support RLBM=2.*/
567 SET_H2CCMD_PWRMODE_PARM_RLBM(u1_h2c_set_pwrmode, rlbm);
568 SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode,
569 (rtlpriv->mac80211.p2p) ?
570 ppsc->smart_ps : 1);
571 SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(u1_h2c_set_pwrmode,
572 ppsc->reg_max_lps_awakeintvl);
573 SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(u1_h2c_set_pwrmode, 0);
574 if (mode == FW_PS_ACTIVE_MODE)
575 power_state |= FW_PWR_STATE_ACTIVE;
576 else
577 power_state |= FW_PWR_STATE_RF_OFF;
578
579 SET_H2CCMD_PWRMODE_PARM_PWR_STATE(u1_h2c_set_pwrmode, power_state);
580
581 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
582 "rtl92c_set_fw_pwrmode(): u1_h2c_set_pwrmode\n",
583 u1_h2c_set_pwrmode, H2C_8821AE_PWEMODE_LENGTH);
584 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_SETPWRMODE,
585 H2C_8821AE_PWEMODE_LENGTH,
586 u1_h2c_set_pwrmode);
587}
588
589void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
590 u8 mstatus)
591{
592 u8 parm[3] = { 0, 0, 0 };
593 /* parm[0]: bit0=0-->Disconnect, bit0=1-->Connect
594 * bit1=0-->update Media Status to MACID
595 * bit1=1-->update Media Status from MACID to MACID_End
596 * parm[1]: MACID, if this is INFRA_STA, MacID = 0
597 * parm[2]: MACID_End
598 */
599
600 SET_H2CCMD_MSRRPT_PARM_OPMODE(parm, mstatus);
601 SET_H2CCMD_MSRRPT_PARM_MACID_IND(parm, 0);
602
603 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_MSRRPT, 3, parm);
604}
605
606void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
607 u8 ap_offload_enable)
608{
609 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
610 u8 u1_apoffload_parm[H2C_8821AE_AP_OFFLOAD_LENGTH] = { 0 };
611
612 SET_H2CCMD_AP_OFFLOAD_ON(u1_apoffload_parm, ap_offload_enable);
613 SET_H2CCMD_AP_OFFLOAD_HIDDEN(u1_apoffload_parm, mac->hiddenssid);
614 SET_H2CCMD_AP_OFFLOAD_DENYANY(u1_apoffload_parm, 0);
615
616 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AP_OFFLOAD,
617 H2C_8821AE_AP_OFFLOAD_LENGTH,
618 u1_apoffload_parm);
619}
620
621void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en)
622{
623 struct rtl_priv *rtlpriv = rtl_priv(hw);
624 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
625 u8 fw_wowlan_info[H2C_8821AE_WOWLAN_LENGTH] = {0};
626
627 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "enable(%d)\n", func_en);
628
629 SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(fw_wowlan_info,
630 (func_en ? true : false));
631
632 SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(fw_wowlan_info,
633 ((ppsc->wo_wlan_mode & WAKE_ON_PATTERN_MATCH) ? 1 : 0));
634 SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(fw_wowlan_info,
635 ((ppsc->wo_wlan_mode & WAKE_ON_MAGIC_PACKET) ? 1 : 0));
636
637 SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(fw_wowlan_info, 0);
638 SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(fw_wowlan_info, false);
639 SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(fw_wowlan_info, 0);
640 SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(fw_wowlan_info, 1);
641 SET_8812_H2CCMD_WOWLAN_GPIONUM(fw_wowlan_info, 0);
642 SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(fw_wowlan_info, 0);
643
644 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_DMESG,
645 "wowlan mode: cmd 0x80: Content:\n",
646 fw_wowlan_info, H2C_8821AE_WOWLAN_LENGTH);
647
648 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_WO_WLAN,
649 H2C_8821AE_WOWLAN_LENGTH,
650 fw_wowlan_info);
651}
652
653void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
654 u8 enable)
655{
656 struct rtl_priv *rtlpriv = rtl_priv(hw);
657 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
658 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
659 u8 remote_wake_ctrl_parm[H2C_8821AE_REMOTE_WAKE_CTRL_LEN] = {0};
660
661 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
662 "enable=%d, ARP offload=%d, GTK offload=%d\n",
663 enable, ppsc->arp_offload_enable, ppsc->gtk_offload_enable);
664
665 SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(remote_wake_ctrl_parm, enable);
666 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(remote_wake_ctrl_parm,
667 (ppsc->arp_offload_enable ? 1 : 0));
668 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(remote_wake_ctrl_parm,
669 (ppsc->gtk_offload_enable ? 1 : 0));
670 SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(remote_wake_ctrl_parm,
671 (rtlhal->real_wow_v2_enable ? 1 : 0));
672
673 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
674 "remote_wake_ctrl: cmd 0x4: Content:\n",
675 remote_wake_ctrl_parm, H2C_8821AE_REMOTE_WAKE_CTRL_LEN);
676
677 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_REMOTE_WAKE_CTRL,
678 H2C_8821AE_REMOTE_WAKE_CTRL_LEN,
679 remote_wake_ctrl_parm);
680}
681
682void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw,
683 bool func_en)
684{
685 struct rtl_priv *rtlpriv = rtl_priv(hw);
686 u8 keep_alive_info[H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH] = {0};
687
688 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable(%d)\n", func_en);
689
690 SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(keep_alive_info, func_en);
691 /* 1: the period is controled by driver, 0: by Fw default */
692 SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(keep_alive_info, 1);
693 SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(keep_alive_info, 10); /* 10 sec */
694
695 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
696 "keep alive: cmd 0x3: Content:\n",
697 keep_alive_info, H2C_8821AE_KEEP_ALIVE_CTRL);
698 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL,
699 H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH,
700 keep_alive_info);
701}
702
703void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
704 bool enabled)
705{
706 struct rtl_priv *rtlpriv = rtl_priv(hw);
707 u8 parm[H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN] = {0};
708
709 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(parm, enabled);
710 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(parm, 1);
711 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(parm, 30);
712 SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(parm, 3);
713
714 RT_PRINT_DATA(rtlpriv, COMP_POWER, DBG_TRACE,
715 "disconnect_decision_ctrl: cmd 0x4: Content:\n",
716 parm, H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN);
717 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_DISCONNECT_DECISION,
718 H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN, parm);
719}
720
721void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw)
722{
723 struct rtl_priv *rtlpriv = rtl_priv(hw);
724 struct rtl_security *sec = &rtlpriv->sec;
725 u8 remote_wakeup_sec_info[H2C_8821AE_AOAC_GLOBAL_INFO_LEN] = {0};
726
727 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
728 "PairwiseEncAlgorithm=%d, GroupEncAlgorithm=%d\n",
729 sec->pairwise_enc_algorithm, sec->group_enc_algorithm);
730
731 SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(
732 remote_wakeup_sec_info,
733 sec->pairwise_enc_algorithm);
734 SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(remote_wakeup_sec_info,
735 sec->group_enc_algorithm);
736
737 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_GLOBAL_INFO,
738 H2C_8821AE_AOAC_GLOBAL_INFO_LEN,
739 remote_wakeup_sec_info);
740
741 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_TRACE,
742 "rtl8821ae_set_global_info: cmd 0x82:\n",
743 remote_wakeup_sec_info, H2C_8821AE_AOAC_GLOBAL_INFO_LEN);
744}
745
746#define BEACON_PG 0
747#define PSPOLL_PG 1
748#define NULL_PG 2
749#define QOSNULL_PG 3
750#define ARPRESP_PG 4
751#define REMOTE_PG 5
752#define GTKEXT_PG 6
753
754#define TOTAL_RESERVED_PKT_LEN_8812 3584
755#define TOTAL_RESERVED_PKT_LEN_8821 1792
756
757static u8 reserved_page_packet_8821[TOTAL_RESERVED_PKT_LEN_8821] = {
758 /* page 0: beacon */
759 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
760 0xff, 0xff, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64,
761 0x40, 0x16, 0x9f, 0x23, 0xd4, 0x46, 0x20, 0x00,
762 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
763 0x64, 0x00, 0x20, 0x04, 0x00, 0x06, 0x64, 0x6c,
764 0x69, 0x6e, 0x6b, 0x31, 0x01, 0x08, 0x82, 0x84,
765 0x8b, 0x96, 0x0c, 0x18, 0x30, 0x48, 0x03, 0x01,
766 0x0b, 0x06, 0x02, 0x00, 0x00, 0x2a, 0x01, 0x8b,
767 0x32, 0x04, 0x12, 0x24, 0x60, 0x6c, 0x00, 0x00,
768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
770 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
771 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
772 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
773 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
777 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
778 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
779 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
780 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
784 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
785 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
786 0x10, 0x00, 0x28, 0x8c, 0x00, 0x12, 0x00, 0x00,
787 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00,
788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
791 /* page 1: ps-poll */
792 0xa4, 0x10, 0x01, 0xc0, 0x40, 0x16, 0x9f, 0x23,
793 0xd4, 0x46, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64,
794 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
798 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
799 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
800 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
801 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
805 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
812 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
813 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
814 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
815 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
819 0x18, 0x00, 0x28, 0x8c, 0x00, 0x12, 0x00, 0x00,
820 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
821 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
822 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
823 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
824 /* page 2: null data */
825 0x48, 0x01, 0x00, 0x00, 0x40, 0x16, 0x9f, 0x23,
826 0xd4, 0x46, 0x00, 0xe0, 0x4c, 0x02, 0xe2, 0x64,
827 0x40, 0x16, 0x9f, 0x23, 0xd4, 0x46, 0x00, 0x00,
828 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
829 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
852 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
853 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 /* page 3: qos null data */
858 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
859 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
860 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
861 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
862 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
863 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
864 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
869 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
870 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
871 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
872 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
882 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
883 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
884 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
885 0x3C, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
886 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
887 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
888 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
889 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
890 /* page 4~6 is for wowlan */
891 /* page 4: ARP resp */
892 0x08, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
893 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
894 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
895 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06,
896 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02,
897 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 0x00, 0x00,
898 0x00, 0x00, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
899 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
903 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
904 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
905 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
906 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
907 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
911 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
912 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
913 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
917 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
918 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
919 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
920 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
922 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
924 /* page 5: H2C_REMOTE_WAKE_CTRL_INFO */
925 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
926 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
927 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
928 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
931 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
932 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
933 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
934 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
935 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
941 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
944 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
945 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
946 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
947 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
948 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
949 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
951 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
952 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
953 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
954 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
955 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957 /* page 6: Rsvd GTK extend memory (zero memory) */
958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
959 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
960 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
965 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
966 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
967 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
968 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
969 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
973 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
978 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
979 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
980 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
981 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
982 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
983 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
987 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
988 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
989 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
990};
991
992static u8 reserved_page_packet_8812[TOTAL_RESERVED_PKT_LEN_8812] = {
993 /* page 0: beacon */
994 0x80, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
995 0xFF, 0xFF, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
996 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x60, 0x00,
997 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
998 0x64, 0x00, 0x20, 0x04, 0x00, 0x03, 0x32, 0x31,
999 0x35, 0x01, 0x08, 0x82, 0x84, 0x8B, 0x96, 0x0C,
1000 0x12, 0x18, 0x24, 0x03, 0x01, 0x01, 0x06, 0x02,
1001 0x00, 0x00, 0x2A, 0x01, 0x02, 0x32, 0x04, 0x30,
1002 0x48, 0x60, 0x6C, 0x2D, 0x1A, 0xED, 0x09, 0x03,
1003 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D,
1006 0x00, 0xDD, 0x07, 0x00, 0xE0, 0x4C, 0x02, 0x02,
1007 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1008 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1009 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1010 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1015 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1016 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1017 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1018 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1021 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1022 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1023 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1024 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1026 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1027 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1028 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1029 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1030 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1031 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1032 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1035 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1036 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1037 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1039 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1040 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1042 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1043 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1044 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1045 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1046 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1053 0x10, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1054 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00,
1055 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1056 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1057 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1058 /* page 1: ps-poll */
1059 0xA4, 0x10, 0x09, 0xC0, 0x84, 0xC9, 0xB2, 0xA7,
1060 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1071 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1072 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1073 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1074 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1079 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1080 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1081 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1082 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1085 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1086 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1087 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1088 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1093 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1094 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1095 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1098 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1099 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1100 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1105 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1113 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1118 0x18, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1119 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1122 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1123 /* page 2: null data */
1124 0x48, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
1125 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1126 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
1127 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1130 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1140 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1141 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1147 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1148 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1154 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1155 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1161 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1165 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1168 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1169 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1170 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1171 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1175 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1176 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1177 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1178 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1182 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1183 0x1A, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1184 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1185 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1187 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1188 /* page 3: Qos null data */
1189 0xC8, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
1190 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1191 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
1192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1218 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1219 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1220 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1224 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1227 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1231 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1232 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1233 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1234 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1239 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1245 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1246 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1247 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1248 0x3C, 0x00, 0x28, 0x8C, 0x00, 0x12, 0x00, 0x00,
1249 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
1250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1252 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1253 /* page 4~6 is for wowlan */
1254 /* page 4: ARP resp */
1255 0x08, 0x01, 0x00, 0x00, 0x84, 0xC9, 0xB2, 0xA7,
1256 0xB3, 0x6E, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1257 0x84, 0xC9, 0xB2, 0xA7, 0xB3, 0x6E, 0x00, 0x00,
1258 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00, 0x08, 0x06,
1259 0x00, 0x01, 0x08, 0x00, 0x06, 0x04, 0x00, 0x02,
1260 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02, 0x00, 0x00,
1261 0x00, 0x00, 0x00, 0xE0, 0x4C, 0x02, 0x51, 0x02,
1262 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1267 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1268 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1269 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1274 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1275 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1276 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1280 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1281 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1282 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1288 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1289 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1290 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1294 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1295 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1296 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1297 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1301 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1302 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1303 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1304 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1308 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1309 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1310 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1311 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1317 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1318 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1319 /* page 5: H2C_REMOTE_WAKE_CTRL_INFO */
1320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1322 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1323 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1324 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1325 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1329 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1330 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1336 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1337 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1338 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1339 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1343 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1344 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1345 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1346 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1350 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1351 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1352 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1353 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1357 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1358 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1359 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1360 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1364 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1365 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1366 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1367 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1371 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1372 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1373 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1374 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1378 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1379 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1380 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1381 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1384 /* page 6: Rsvd GTK extend memory (zero memory) */
1385 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1386 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1387 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1388 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1392 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1393 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1394 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1395 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1399 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1400 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1401 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1402 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1406 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1409 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1413 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1414 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1415 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1416 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1420 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1421 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1422 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1423 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1427 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1428 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1429 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1430 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1434 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1435 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1436 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1437 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1441 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1442 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1443 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1444 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1448 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1449};
1450
1451void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1452 bool b_dl_finished, bool dl_whole_packets)
1453{
1454 struct rtl_priv *rtlpriv = rtl_priv(hw);
1455 struct rtl_mac *mac = rtl_mac(rtlpriv);
1456 struct sk_buff *skb = NULL;
1457 u32 totalpacketlen;
1458 bool rtstatus;
1459 u8 u1RsvdPageLoc[5] = { 0 };
1460 u8 u1RsvdPageLoc2[7] = { 0 };
1461 bool b_dlok = false;
1462 u8 *beacon;
1463 u8 *p_pspoll;
1464 u8 *nullfunc;
1465 u8 *qosnull;
1466 u8 *arpresp;
1467
1468 /*---------------------------------------------------------
1469 * (1) beacon
1470 *---------------------------------------------------------
1471 */
1472 beacon = &reserved_page_packet_8812[BEACON_PG * 512];
1473 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1474 SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1475
1476 if (b_dl_finished) {
1477 totalpacketlen = 512 - 40;
1478 goto out;
1479 }
1480 /*-------------------------------------------------------
1481 * (2) ps-poll
1482 *--------------------------------------------------------
1483 */
1484 p_pspoll = &reserved_page_packet_8812[PSPOLL_PG * 512];
1485 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1486 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1487 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1488
1489 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1490
1491 /*--------------------------------------------------------
1492 * (3) null data
1493 *---------------------------------------------------------
1494 */
1495 nullfunc = &reserved_page_packet_8812[NULL_PG * 512];
1496 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1497 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1498 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1499
1500 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1501
1502 /*---------------------------------------------------------
1503 * (4) Qos null data
1504 *----------------------------------------------------------
1505 */
1506 qosnull = &reserved_page_packet_8812[QOSNULL_PG * 512];
1507 SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1508 SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1509 SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1510
1511 SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1512
1513 if (!dl_whole_packets) {
1514 totalpacketlen = 512 * (QOSNULL_PG + 1) - 40;
1515 goto out;
1516 }
1517 /*---------------------------------------------------------
1518 * (5) ARP Resp
1519 *----------------------------------------------------------
1520 */
1521 arpresp = &reserved_page_packet_8812[ARPRESP_PG * 512];
1522 SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1523 SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1524 SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1525
1526 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1527
1528 /*---------------------------------------------------------
1529 * (6) Remote Wake Ctrl
1530 *----------------------------------------------------------
1531 */
1532 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1533 REMOTE_PG);
1534
1535 /*---------------------------------------------------------
1536 * (7) GTK Ext Memory
1537 *----------------------------------------------------------
1538 */
1539 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1540
1541 totalpacketlen = TOTAL_RESERVED_PKT_LEN_8812 - 40;
1542
1543out:
1544 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1545 "rtl8812ae_set_fw_rsvdpagepkt(): packet data\n",
1546 &reserved_page_packet_8812[0], totalpacketlen);
1547
1548 skb = dev_alloc_skb(totalpacketlen);
1549 memcpy((u8 *)skb_put(skb, totalpacketlen),
1550 &reserved_page_packet_8812, totalpacketlen);
1551
1552 rtstatus = rtl_cmd_send_packet(hw, skb);
1553
1554 if (rtstatus)
1555 b_dlok = true;
1556
1557 if (!b_dl_finished && b_dlok) {
1558 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1559 "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1560 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1561 sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1562 if (dl_whole_packets) {
1563 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1564 "wowlan H2C_RSVDPAGE:\n", u1RsvdPageLoc2, 7);
1565 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1566 sizeof(u1RsvdPageLoc2), u1RsvdPageLoc2);
1567 }
1568 }
1569
1570 if (!b_dlok)
1571 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1572 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1573}
1574
1575void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
1576 bool b_dl_finished, bool dl_whole_packets)
1577{
1578 struct rtl_priv *rtlpriv = rtl_priv(hw);
1579 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1580 struct sk_buff *skb = NULL;
1581 u32 totalpacketlen;
1582 bool rtstatus;
1583 u8 u1RsvdPageLoc[5] = { 0 };
1584 u8 u1RsvdPageLoc2[7] = { 0 };
1585 bool b_dlok = false;
1586 u8 *beacon;
1587 u8 *p_pspoll;
1588 u8 *nullfunc;
1589 u8 *qosnull;
1590 u8 *arpresp;
1591
1592 /*---------------------------------------------------------
1593 * (1) beacon
1594 *---------------------------------------------------------
1595 */
1596 beacon = &reserved_page_packet_8821[BEACON_PG * 256];
1597 SET_80211_HDR_ADDRESS2(beacon, mac->mac_addr);
1598 SET_80211_HDR_ADDRESS3(beacon, mac->bssid);
1599
1600 if (b_dl_finished) {
1601 totalpacketlen = 256 - 40;
1602 goto out;
1603 }
1604 /*-------------------------------------------------------
1605 * (2) ps-poll
1606 *--------------------------------------------------------
1607 */
1608 p_pspoll = &reserved_page_packet_8821[PSPOLL_PG * 256];
1609 SET_80211_PS_POLL_AID(p_pspoll, (mac->assoc_id | 0xc000));
1610 SET_80211_PS_POLL_BSSID(p_pspoll, mac->bssid);
1611 SET_80211_PS_POLL_TA(p_pspoll, mac->mac_addr);
1612
1613 SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(u1RsvdPageLoc, PSPOLL_PG);
1614
1615 /*--------------------------------------------------------
1616 * (3) null data
1617 *---------------------------------------------------------i
1618 */
1619 nullfunc = &reserved_page_packet_8821[NULL_PG * 256];
1620 SET_80211_HDR_ADDRESS1(nullfunc, mac->bssid);
1621 SET_80211_HDR_ADDRESS2(nullfunc, mac->mac_addr);
1622 SET_80211_HDR_ADDRESS3(nullfunc, mac->bssid);
1623
1624 SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(u1RsvdPageLoc, NULL_PG);
1625
1626 /*---------------------------------------------------------
1627 * (4) Qos null data
1628 *----------------------------------------------------------
1629 */
1630 qosnull = &reserved_page_packet_8821[QOSNULL_PG * 256];
1631 SET_80211_HDR_ADDRESS1(qosnull, mac->bssid);
1632 SET_80211_HDR_ADDRESS2(qosnull, mac->mac_addr);
1633 SET_80211_HDR_ADDRESS3(qosnull, mac->bssid);
1634
1635 SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(u1RsvdPageLoc, QOSNULL_PG);
1636
1637 if (!dl_whole_packets) {
1638 totalpacketlen = 256 * (QOSNULL_PG + 1) - 40;
1639 goto out;
1640 }
1641 /*---------------------------------------------------------
1642 * (5) ARP Resp
1643 *----------------------------------------------------------
1644 */
1645 arpresp = &reserved_page_packet_8821[ARPRESP_PG * 256];
1646 SET_80211_HDR_ADDRESS1(arpresp, mac->bssid);
1647 SET_80211_HDR_ADDRESS2(arpresp, mac->mac_addr);
1648 SET_80211_HDR_ADDRESS3(arpresp, mac->bssid);
1649
1650 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(u1RsvdPageLoc2, ARPRESP_PG);
1651
1652 /*---------------------------------------------------------
1653 * (6) Remote Wake Ctrl
1654 *----------------------------------------------------------
1655 */
1656 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(u1RsvdPageLoc2,
1657 REMOTE_PG);
1658
1659 /*---------------------------------------------------------
1660 * (7) GTK Ext Memory
1661 *----------------------------------------------------------
1662 */
1663 SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(u1RsvdPageLoc2, GTKEXT_PG);
1664
1665 totalpacketlen = TOTAL_RESERVED_PKT_LEN_8821 - 40;
1666
1667out:
1668
1669 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1670 "rtl8821ae_set_fw_rsvdpagepkt(): packet data\n",
1671 &reserved_page_packet_8821[0], totalpacketlen);
1672
1673 skb = dev_alloc_skb(totalpacketlen);
1674 memcpy((u8 *)skb_put(skb, totalpacketlen),
1675 &reserved_page_packet_8821, totalpacketlen);
1676
1677 rtstatus = rtl_cmd_send_packet(hw, skb);
1678
1679 if (rtstatus)
1680 b_dlok = true;
1681
1682 if (!b_dl_finished && b_dlok) {
1683 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1684 "Set RSVD page location to Fw.\n");
1685 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1686 "H2C_RSVDPAGE:\n", u1RsvdPageLoc, 5);
1687 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RSVDPAGE,
1688 sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
1689 if (dl_whole_packets) {
1690 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
1691 "wowlan H2C_RSVDPAGE:\n",
1692 u1RsvdPageLoc2, 7);
1693 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_AOAC_RSVDPAGE,
1694 sizeof(u1RsvdPageLoc2),
1695 u1RsvdPageLoc2);
1696 }
1697 }
1698
1699 if (!b_dlok) {
1700 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1701 "Set RSVD page location to Fw FAIL!!!!!!.\n");
1702 }
1703}
1704
1705/*Should check FW support p2p or not.*/
1706static void rtl8821ae_set_p2p_ctw_period_cmd(struct ieee80211_hw *hw, u8 ctwindow)
1707{
1708 u8 u1_ctwindow_period[1] = { ctwindow};
1709
1710 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_P2P_PS_CTW_CMD, 1,
1711 u1_ctwindow_period);
1712}
1713
1714void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw, u8 p2p_ps_state)
1715{
1716 struct rtl_priv *rtlpriv = rtl_priv(hw);
1717 struct rtl_ps_ctl *rtlps = rtl_psc(rtl_priv(hw));
1718 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1719 struct rtl_p2p_ps_info *p2pinfo = &rtlps->p2p_ps_info;
1720 struct p2p_ps_offload_t *p2p_ps_offload = &rtlhal->p2p_ps_offload;
1721 u8 i;
1722 u16 ctwindow;
1723 u32 start_time, tsf_low;
1724
1725 switch (p2p_ps_state) {
1726 case P2P_PS_DISABLE:
1727 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_DISABLE\n");
1728 memset(p2p_ps_offload, 0, sizeof(*p2p_ps_offload));
1729 break;
1730 case P2P_PS_ENABLE:
1731 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_ENABLE\n");
1732 /* update CTWindow value. */
1733 if (p2pinfo->ctwindow > 0) {
1734 p2p_ps_offload->ctwindow_en = 1;
1735 ctwindow = p2pinfo->ctwindow;
1736 rtl8821ae_set_p2p_ctw_period_cmd(hw, ctwindow);
1737 }
1738
1739 /* hw only support 2 set of NoA */
1740 for (i = 0 ; i < p2pinfo->noa_num ; i++) {
1741 /* To control the register setting for which NOA*/
1742 rtl_write_byte(rtlpriv, 0x5cf, (i << 4));
1743 if (i == 0)
1744 p2p_ps_offload->noa0_en = 1;
1745 else
1746 p2p_ps_offload->noa1_en = 1;
1747
1748 /* config P2P NoA Descriptor Register */
1749 rtl_write_dword(rtlpriv, 0x5E0, p2pinfo->noa_duration[i]);
1750 rtl_write_dword(rtlpriv, 0x5E4, p2pinfo->noa_interval[i]);
1751
1752 /*Get Current TSF value */
1753 tsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
1754
1755 start_time = p2pinfo->noa_start_time[i];
1756 if (p2pinfo->noa_count_type[i] != 1) {
1757 while (start_time <= (tsf_low+(50*1024))) {
1758 start_time += p2pinfo->noa_interval[i];
1759 if (p2pinfo->noa_count_type[i] != 255)
1760 p2pinfo->noa_count_type[i]--;
1761 }
1762 }
1763 rtl_write_dword(rtlpriv, 0x5E8, start_time);
1764 rtl_write_dword(rtlpriv, 0x5EC,
1765 p2pinfo->noa_count_type[i]);
1766 }
1767
1768 if ((p2pinfo->opp_ps == 1) || (p2pinfo->noa_num > 0)) {
1769 /* rst p2p circuit */
1770 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, BIT(4));
1771
1772 p2p_ps_offload->offload_en = 1;
1773
1774 if (P2P_ROLE_GO == rtlpriv->mac80211.p2p) {
1775 p2p_ps_offload->role = 1;
1776 p2p_ps_offload->allstasleep = 0;
1777 } else {
1778 p2p_ps_offload->role = 0;
1779 }
1780
1781 p2p_ps_offload->discovery = 0;
1782 }
1783 break;
1784 case P2P_PS_SCAN:
1785 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN\n");
1786 p2p_ps_offload->discovery = 1;
1787 break;
1788 case P2P_PS_SCAN_DONE:
1789 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "P2P_PS_SCAN_DONE\n");
1790 p2p_ps_offload->discovery = 0;
1791 p2pinfo->p2p_ps_state = P2P_PS_ENABLE;
1792 break;
1793 default:
1794 break;
1795 }
1796
1797 rtl8821ae_fill_h2c_cmd(hw,
1798 H2C_8821AE_P2P_PS_OFFLOAD, 1, (u8 *)p2p_ps_offload);
1799}
1800
1801static void rtl8821ae_c2h_ra_report_handler(struct ieee80211_hw *hw,
1802 u8 *cmd_buf, u8 cmd_len)
1803{
1804 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1805 u8 rate = cmd_buf[0] & 0x3F;
1806
1807 rtlhal->current_ra_rate = rtl8821ae_hw_rate_to_mrate(hw, rate);
1808
1809 rtl8821ae_dm_update_init_rate(hw, rate);
1810}
1811
1812static void _rtl8821ae_c2h_content_parsing(struct ieee80211_hw *hw,
1813 u8 c2h_cmd_id, u8 c2h_cmd_len,
1814 u8 *tmp_buf)
1815{
1816 struct rtl_priv *rtlpriv = rtl_priv(hw);
1817
1818 switch (c2h_cmd_id) {
1819 case C2H_8812_DBG:
1820 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD, "[C2H], C2H_8812_DBG!!\n");
1821 break;
1822 case C2H_8812_RA_RPT:
1823 rtl8821ae_c2h_ra_report_handler(hw, tmp_buf, c2h_cmd_len);
1824 break;
1825 case C2H_8812_BT_INFO:
1826 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1827 "[C2H], C2H_8812_BT_INFO!!\n");
1828 if (rtlpriv->cfg->ops->get_btc_status())
1829 rtlpriv->btcoexist.btc_ops->btc_btinfo_notify(rtlpriv,
1830 tmp_buf,
1831 c2h_cmd_len);
1832 break;
1833 default:
1834 break;
1835 }
1836}
1837
1838void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw, u8 *buffer,
1839 u8 length)
1840{
1841 struct rtl_priv *rtlpriv = rtl_priv(hw);
1842 u8 c2h_cmd_id = 0, c2h_cmd_seq = 0, c2h_cmd_len = 0;
1843 u8 *tmp_buf = NULL;
1844
1845 c2h_cmd_id = buffer[0];
1846 c2h_cmd_seq = buffer[1];
1847 c2h_cmd_len = length - 2;
1848 tmp_buf = buffer + 2;
1849
1850 RT_TRACE(rtlpriv, COMP_FW, DBG_LOUD,
1851 "[C2H packet], c2hCmdId=0x%x, c2hCmdSeq=0x%x, c2hCmdLen=%d\n",
1852 c2h_cmd_id, c2h_cmd_seq, c2h_cmd_len);
1853
1854 RT_PRINT_DATA(rtlpriv, COMP_FW, DBG_LOUD,
1855 "[C2H packet], Content Hex:\n", tmp_buf, c2h_cmd_len);
1856 _rtl8821ae_c2h_content_parsing(hw, c2h_cmd_id, c2h_cmd_len, tmp_buf);
1857}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/fw.h b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.h
new file mode 100644
index 000000000000..591c14c0b9b5
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/fw.h
@@ -0,0 +1,351 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 * Larry Finger <Larry.Finger@lwfinger.net>
22 *
23 *****************************************************************************/
24
25#ifndef __RTL8821AE__FW__H__
26#define __RTL8821AE__FW__H__
27#include "def.h"
28
29#define FW_8821AE_SIZE 0x8000
30#define FW_8821AE_START_ADDRESS 0x1000
31#define FW_8821AE_END_ADDRESS 0x5FFF
32#define FW_8821AE_PAGE_SIZE 4096
33#define FW_8821AE_POLLING_DELAY 5
34#define FW_8821AE_POLLING_TIMEOUT_COUNT 6000
35
36#define IS_FW_HEADER_EXIST_8812(_pfwhdr) \
37 ((_pfwhdr->signature&0xFFF0) == 0x9500)
38
39#define IS_FW_HEADER_EXIST_8821(_pfwhdr) \
40 ((_pfwhdr->signature&0xFFF0) == 0x2100)
41
42#define USE_OLD_WOWLAN_DEBUG_FW 0
43
44#define H2C_8821AE_RSVDPAGE_LOC_LEN 5
45#define H2C_8821AE_PWEMODE_LENGTH 5
46#define H2C_8821AE_JOINBSSRPT_LENGTH 1
47#define H2C_8821AE_AP_OFFLOAD_LENGTH 3
48#define H2C_8821AE_WOWLAN_LENGTH 3
49#define H2C_8821AE_KEEP_ALIVE_CTRL_LENGTH 3
50#if (USE_OLD_WOWLAN_DEBUG_FW == 0)
51#define H2C_8821AE_REMOTE_WAKE_CTRL_LEN 1
52#else
53#define H2C_8821AE_REMOTE_WAKE_CTRL_LEN 3
54#endif
55#define H2C_8821AE_AOAC_GLOBAL_INFO_LEN 2
56#define H2C_8821AE_AOAC_RSVDPAGE_LOC_LEN 7
57#define H2C_8821AE_DISCONNECT_DECISION_CTRL_LEN 3
58
59/* Fw PS state for RPWM.
60*BIT[2:0] = HW state
61
62*BIT[3] = Protocol PS state,
631: register active state ,
640: register sleep state
65
66*BIT[4] = sub-state
67*/
68#define FW_PS_GO_ON BIT(0)
69#define FW_PS_TX_NULL BIT(1)
70#define FW_PS_RF_ON BIT(2)
71#define FW_PS_REGISTER_ACTIVE BIT(3)
72
73#define FW_PS_DPS BIT(0)
74#define FW_PS_LCLK (FW_PS_DPS)
75#define FW_PS_RF_OFF BIT(1)
76#define FW_PS_ALL_ON BIT(2)
77#define FW_PS_ST_ACTIVE BIT(3)
78#define FW_PS_ISR_ENABLE BIT(4)
79#define FW_PS_IMR_ENABLE BIT(5)
80
81#define FW_PS_ACK BIT(6)
82#define FW_PS_TOGGLE BIT(7)
83
84 /* 8821AE RPWM value*/
85 /* BIT[0] = 1: 32k, 0: 40M*/
86 /* 32k*/
87#define FW_PS_CLOCK_OFF BIT(0)
88/*40M*/
89#define FW_PS_CLOCK_ON 0
90
91#define FW_PS_STATE_MASK (0x0F)
92#define FW_PS_STATE_HW_MASK (0x07)
93/*ISR_ENABLE, IMR_ENABLE, and PS mode should be inherited.*/
94#define FW_PS_STATE_INT_MASK (0x3F)
95
96#define FW_PS_STATE(x) (FW_PS_STATE_MASK & (x))
97#define FW_PS_STATE_HW(x) (FW_PS_STATE_HW_MASK & (x))
98#define FW_PS_STATE_INT(x) (FW_PS_STATE_INT_MASK & (x))
99#define FW_PS_ISR_VAL(x) ((x) & 0x70)
100#define FW_PS_IMR_MASK(x) ((x) & 0xDF)
101#define FW_PS_KEEP_IMR(x) ((x) & 0x20)
102
103#define FW_PS_STATE_S0 (FW_PS_DPS)
104#define FW_PS_STATE_S1 (FW_PS_LCLK)
105#define FW_PS_STATE_S2 (FW_PS_RF_OFF)
106#define FW_PS_STATE_S3 (FW_PS_ALL_ON)
107#define FW_PS_STATE_S4 ((FW_PS_ST_ACTIVE) | (FW_PS_ALL_ON))
108 /* ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))*/
109#define FW_PS_STATE_ALL_ON_8821AE (FW_PS_CLOCK_ON)
110 /* (FW_PS_RF_ON)*/
111#define FW_PS_STATE_RF_ON_8821AE (FW_PS_CLOCK_ON)
112 /* 0x0*/
113#define FW_PS_STATE_RF_OFF_8821AE (FW_PS_CLOCK_ON)
114 /* (FW_PS_STATE_RF_OFF)*/
115#define FW_PS_STATE_RF_OFF_LOW_PWR_8821AE (FW_PS_CLOCK_OFF)
116
117#define FW_PS_STATE_ALL_ON_92C (FW_PS_STATE_S4)
118#define FW_PS_STATE_RF_ON_92C (FW_PS_STATE_S3)
119#define FW_PS_STATE_RF_OFF_92C (FW_PS_STATE_S2)
120#define FW_PS_STATE_RF_OFF_LOW_PWR_92C (FW_PS_STATE_S1)
121
122/* For 8821AE H2C PwrMode Cmd ID 5.*/
123#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
124#define FW_PWR_STATE_RF_OFF 0
125
126#define FW_PS_IS_ACK(x) ((x) & FW_PS_ACK)
127#define FW_PS_IS_CLK_ON(x) ((x) & (FW_PS_RF_OFF | FW_PS_ALL_ON))
128#define FW_PS_IS_RF_ON(x) ((x) & (FW_PS_ALL_ON))
129#define FW_PS_IS_ACTIVE(x) ((x) & (FW_PS_ST_ACTIVE))
130#define FW_PS_IS_CPWM_INT(x) ((x) & 0x40)
131
132#define FW_CLR_PS_STATE(x) ((x) = ((x) & (0xF0)))
133
134#define IS_IN_LOW_POWER_STATE_8821AE(__state) \
135 (FW_PS_STATE(__state) == FW_PS_CLOCK_OFF)
136
137#define FW_PWR_STATE_ACTIVE ((FW_PS_RF_ON) | (FW_PS_REGISTER_ACTIVE))
138#define FW_PWR_STATE_RF_OFF 0
139
140struct rtl8821a_firmware_header {
141 u16 signature;
142 u8 category;
143 u8 function;
144 u16 version;
145 u8 subversion;
146 u8 rsvd1;
147 u8 month;
148 u8 date;
149 u8 hour;
150 u8 minute;
151 u16 ramcodeSize;
152 u16 rsvd2;
153 u32 svnindex;
154 u32 rsvd3;
155 u32 rsvd4;
156 u32 rsvd5;
157};
158
159enum rtl8812_c2h_evt {
160 C2H_8812_DBG = 0,
161 C2H_8812_LB = 1,
162 C2H_8812_TXBF = 2,
163 C2H_8812_TX_REPORT = 3,
164 C2H_8812_BT_INFO = 9,
165 C2H_8812_BT_MP = 11,
166 C2H_8812_RA_RPT = 12,
167
168 C2H_8812_FW_SWCHNL = 0x10,
169 C2H_8812_IQK_FINISH = 0x11,
170 MAX_8812_C2HEVENT
171};
172
173enum rtl8821a_h2c_cmd {
174 H2C_8821AE_RSVDPAGE = 0,
175 H2C_8821AE_MSRRPT = 1,
176 H2C_8821AE_SCAN = 2,
177 H2C_8821AE_KEEP_ALIVE_CTRL = 3,
178 H2C_8821AE_DISCONNECT_DECISION = 4,
179 H2C_8821AE_INIT_OFFLOAD = 6,
180 H2C_8821AE_AP_OFFLOAD = 8,
181 H2C_8821AE_BCN_RSVDPAGE = 9,
182 H2C_8821AE_PROBERSP_RSVDPAGE = 10,
183
184 H2C_8821AE_SETPWRMODE = 0x20,
185 H2C_8821AE_PS_TUNING_PARA = 0x21,
186 H2C_8821AE_PS_TUNING_PARA2 = 0x22,
187 H2C_8821AE_PS_LPS_PARA = 0x23,
188 H2C_8821AE_P2P_PS_OFFLOAD = 024,
189
190 H2C_8821AE_WO_WLAN = 0x80,
191 H2C_8821AE_REMOTE_WAKE_CTRL = 0x81,
192 H2C_8821AE_AOAC_GLOBAL_INFO = 0x82,
193 H2C_8821AE_AOAC_RSVDPAGE = 0x83,
194
195 H2C_RSSI_21AE_REPORT = 0x42,
196 H2C_8821AE_RA_MASK = 0x40,
197 H2C_8821AE_SELECTIVE_SUSPEND_ROF_CMD,
198 H2C_8821AE_P2P_PS_MODE,
199 H2C_8821AE_PSD_RESULT,
200 /*Not defined CTW CMD for P2P yet*/
201 H2C_8821AE_P2P_PS_CTW_CMD,
202 MAX_8821AE_H2CCMD
203};
204
205#define pagenum_128(_len) (u32)(((_len)>>7) + ((_len)&0x7F ? 1 : 0))
206
207#define SET_8812_H2CCMD_WOWLAN_FUNC_ENABLE(__cmd, __value) \
208 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
209#define SET_8812_H2CCMD_WOWLAN_PATTERN_MATCH_ENABLE(__cmd, __value) \
210 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
211#define SET_8812_H2CCMD_WOWLAN_MAGIC_PKT_ENABLE(__cmd, __value) \
212 SET_BITS_TO_LE_1BYTE(__cmd, 2, 1, __value)
213#define SET_8812_H2CCMD_WOWLAN_UNICAST_PKT_ENABLE(__cmd, __value) \
214 SET_BITS_TO_LE_1BYTE(__cmd, 3, 1, __value)
215#define SET_8812_H2CCMD_WOWLAN_ALL_PKT_DROP(__cmd, __value) \
216 SET_BITS_TO_LE_1BYTE(__cmd, 4, 1, __value)
217#define SET_8812_H2CCMD_WOWLAN_GPIO_ACTIVE(__cmd, __value) \
218 SET_BITS_TO_LE_1BYTE(__cmd, 5, 1, __value)
219#define SET_8812_H2CCMD_WOWLAN_REKEY_WAKE_UP(__cmd, __value) \
220 SET_BITS_TO_LE_1BYTE(__cmd, 6, 1, __value)
221#define SET_8812_H2CCMD_WOWLAN_DISCONNECT_WAKE_UP(__cmd, __value) \
222 SET_BITS_TO_LE_1BYTE(__cmd, 7, 1, __value)
223#define SET_8812_H2CCMD_WOWLAN_GPIONUM(__cmd, __value) \
224 SET_BITS_TO_LE_1BYTE((__cmd) + 1, 0, 8, __value)
225#define SET_8812_H2CCMD_WOWLAN_GPIO_DURATION(__cmd, __value) \
226 SET_BITS_TO_LE_1BYTE((__cmd) + 2, 0, 8, __value)
227
228#define SET_H2CCMD_PWRMODE_PARM_MODE(__ph2ccmd, __val) \
229 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
230#define SET_H2CCMD_PWRMODE_PARM_RLBM(__cmd, __value) \
231 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 4, __value)
232#define SET_H2CCMD_PWRMODE_PARM_SMART_PS(__cmd, __value) \
233 SET_BITS_TO_LE_1BYTE((__cmd)+1, 4, 4, __value)
234#define SET_H2CCMD_PWRMODE_PARM_AWAKE_INTERVAL(__cmd, __value) \
235 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
236#define SET_H2CCMD_PWRMODE_PARM_ALL_QUEUE_UAPSD(__cmd, __value) \
237 SET_BITS_TO_LE_1BYTE((__cmd)+3, 0, 8, __value)
238#define SET_H2CCMD_PWRMODE_PARM_PWR_STATE(__cmd, __value) \
239 SET_BITS_TO_LE_1BYTE((__cmd)+4, 0, 8, __value)
240#define GET_8821AE_H2CCMD_PWRMODE_PARM_MODE(__cmd) \
241 LE_BITS_TO_1BYTE(__cmd, 0, 8)
242
243#define SET_H2CCMD_JOINBSSRPT_PARM_OPMODE(__ph2ccmd, __val) \
244 SET_BITS_TO_LE_1BYTE(__ph2ccmd, 0, 8, __val)
245#define SET_H2CCMD_RSVDPAGE_LOC_PSPOLL(__ph2ccmd, __val) \
246 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+1, 0, 8, __val)
247#define SET_H2CCMD_RSVDPAGE_LOC_NULL_DATA(__ph2ccmd, __val) \
248 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+2, 0, 8, __val)
249#define SET_H2CCMD_RSVDPAGE_LOC_QOS_NULL_DATA(__ph2ccmd, __val) \
250 SET_BITS_TO_LE_1BYTE((__ph2ccmd)+3, 0, 8, __val)
251
252/* _MEDIA_STATUS_RPT_PARM_CMD1 */
253#define SET_H2CCMD_MSRRPT_PARM_OPMODE(__cmd, __value) \
254 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
255#define SET_H2CCMD_MSRRPT_PARM_MACID_IND(__cmd, __value) \
256 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
257#define SET_H2CCMD_MSRRPT_PARM_MACID(__cmd, __value) \
258 SET_BITS_TO_LE_1BYTE(__cmd+1, 0, 8, __value)
259#define SET_H2CCMD_MSRRPT_PARM_MACID_END(__cmd, __value) \
260 SET_BITS_TO_LE_1BYTE(__cmd+2, 0, 8, __value)
261
262/* AP_OFFLOAD */
263#define SET_H2CCMD_AP_OFFLOAD_ON(__cmd, __value) \
264 SET_BITS_TO_LE_1BYTE(__cmd, 0, 8, __value)
265#define SET_H2CCMD_AP_OFFLOAD_HIDDEN(__cmd, __value) \
266 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
267#define SET_H2CCMD_AP_OFFLOAD_DENYANY(__cmd, __value) \
268 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
269#define SET_H2CCMD_AP_OFFLOAD_WAKEUP_EVT_RPT(__cmd, __value) \
270 SET_BITS_TO_LE_1BYTE((__cmd)+3, 0, 8, __value)
271
272/* Keep Alive Control*/
273#define SET_8812_H2CCMD_KEEP_ALIVE_ENABLE(__cmd, __value) \
274 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
275#define SET_8812_H2CCMD_KEEP_ALIVE_ACCPEPT_USER_DEFINED(__cmd, __value) \
276 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
277#define SET_8812_H2CCMD_KEEP_ALIVE_PERIOD(__cmd, __value) \
278 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
279
280/*REMOTE_WAKE_CTRL */
281#define SET_8812_H2CCMD_REMOTE_WAKECTRL_ENABLE(__cmd, __value) \
282 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
283#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_ARP_OFFLOAD_EN(__cmd, __value)\
284 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
285#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_NDP_OFFLOAD_EN(__cmd, __value)\
286 SET_BITS_TO_LE_1BYTE(__cmd, 2, 1, __value)
287#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_GTK_OFFLOAD_EN(__cmd, __value)\
288 SET_BITS_TO_LE_1BYTE(__cmd, 3, 1, __value)
289#define SET_8812_H2CCMD_REMOTE_WAKE_CTRL_REALWOWV2_EN(__cmd, __value)\
290 SET_BITS_TO_LE_1BYTE(__cmd, 6, 1, __value)
291
292/* GTK_OFFLOAD */
293#define SET_8812_H2CCMD_AOAC_GLOBAL_INFO_PAIRWISE_ENC_ALG(__cmd, __value)\
294 SET_BITS_TO_LE_1BYTE(__cmd, 0, 8, __value)
295#define SET_8812_H2CCMD_AOAC_GLOBAL_INFO_GROUP_ENC_ALG(__cmd, __value) \
296 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
297
298/* AOAC_RSVDPAGE_LOC */
299#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_REMOTE_WAKE_CTRL_INFO(__cmd, __value) \
300 SET_BITS_TO_LE_1BYTE((__cmd), 0, 8, __value)
301#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_ARP_RSP(__cmd, __value) \
302 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value)
303#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_NEIGHBOR_ADV(__cmd, __value)\
304 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
305#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_RSP(__cmd, __value) \
306 SET_BITS_TO_LE_1BYTE((__cmd)+3, 0, 8, __value)
307#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_INFO(__cmd, __value) \
308 SET_BITS_TO_LE_1BYTE((__cmd)+4, 0, 8, __value)
309#define SET_8821AE_H2CCMD_AOAC_RSVDPAGE_LOC_GTK_EXT_MEM(__cmd, __value) \
310 SET_BITS_TO_LE_1BYTE((__cmd)+5, 0, 8, __value)
311
312/* Disconnect_Decision_Control */
313#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_ENABLE(__cmd, __value) \
314 SET_BITS_TO_LE_1BYTE(__cmd, 0, 1, __value)
315#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_USER_SETTING(__cmd, __value)\
316 SET_BITS_TO_LE_1BYTE(__cmd, 1, 1, __value)
317#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_CHECK_PERIOD(__cmd, __value)\
318 SET_BITS_TO_LE_1BYTE((__cmd)+1, 0, 8, __value) /* unit: beacon period */
319#define SET_8812_H2CCMD_DISCONNECT_DECISION_CTRL_TRYPKT_NUM(__cmd, __value)\
320 SET_BITS_TO_LE_1BYTE((__cmd)+2, 0, 8, __value)
321
322int rtl8821ae_download_fw(struct ieee80211_hw *hw, bool buse_wake_on_wlan_fw);
323#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
324void rtl8821ae_set_fw_related_for_wowlan(struct ieee80211_hw *hw,
325 bool used_wowlan_fw);
326
327#endif
328void rtl8821ae_fill_h2c_cmd(struct ieee80211_hw *hw, u8 element_id,
329 u32 cmd_len, u8 *cmdbuffer);
330void rtl8821ae_firmware_selfreset(struct ieee80211_hw *hw);
331void rtl8821ae_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode);
332void rtl8821ae_set_fw_media_status_rpt_cmd(struct ieee80211_hw *hw,
333 u8 mstatus);
334void rtl8821ae_set_fw_ap_off_load_cmd(struct ieee80211_hw *hw,
335 u8 ap_offload_enable);
336void rtl8821ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
337 bool b_dl_finished, bool dl_whole_packet);
338void rtl8812ae_set_fw_rsvdpagepkt(struct ieee80211_hw *hw,
339 bool b_dl_finished, bool dl_whole_packet);
340void rtl8821ae_set_p2p_ps_offload_cmd(struct ieee80211_hw *hw,
341 u8 p2p_ps_state);
342void rtl8821ae_set_fw_wowlan_mode(struct ieee80211_hw *hw, bool func_en);
343void rtl8821ae_set_fw_remote_wake_ctrl_cmd(struct ieee80211_hw *hw,
344 u8 enable);
345void rtl8821ae_set_fw_keep_alive_cmd(struct ieee80211_hw *hw, bool func_en);
346void rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(struct ieee80211_hw *hw,
347 bool enabled);
348void rtl8821ae_set_fw_global_info_cmd(struct ieee80211_hw *hw);
349void rtl8821ae_c2h_packet_handler(struct ieee80211_hw *hw,
350 u8 *buffer, u8 length);
351#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
new file mode 100644
index 000000000000..310d3163dc5b
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.c
@@ -0,0 +1,4218 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../efuse.h"
28#include "../base.h"
29#include "../regd.h"
30#include "../cam.h"
31#include "../ps.h"
32#include "../pci.h"
33#include "reg.h"
34#include "def.h"
35#include "phy.h"
36#include "dm.h"
37#include "fw.h"
38#include "led.h"
39#include "hw.h"
40#include "../pwrseqcmd.h"
41#include "pwrseq.h"
42#include "../btcoexist/rtl_btc.h"
43
44#define LLT_CONFIG 5
45
46static void _rtl8821ae_return_beacon_queue_skb(struct ieee80211_hw *hw)
47{
48 struct rtl_priv *rtlpriv = rtl_priv(hw);
49 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
50 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE];
51 unsigned long flags;
52
53 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags);
54 while (skb_queue_len(&ring->queue)) {
55 struct rtl_tx_desc *entry = &ring->desc[ring->idx];
56 struct sk_buff *skb = __skb_dequeue(&ring->queue);
57
58 pci_unmap_single(rtlpci->pdev,
59 rtlpriv->cfg->ops->get_desc(
60 (u8 *)entry, true, HW_DESC_TXBUFF_ADDR),
61 skb->len, PCI_DMA_TODEVICE);
62 kfree_skb(skb);
63 ring->idx = (ring->idx + 1) % ring->entries;
64 }
65 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags);
66}
67
68static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
69 u8 set_bits, u8 clear_bits)
70{
71 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
72 struct rtl_priv *rtlpriv = rtl_priv(hw);
73
74 rtlpci->reg_bcn_ctrl_val |= set_bits;
75 rtlpci->reg_bcn_ctrl_val &= ~clear_bits;
76
77 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
78}
79
80void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw)
81{
82 struct rtl_priv *rtlpriv = rtl_priv(hw);
83 u8 tmp1byte;
84
85 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
86 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte & (~BIT(6)));
87 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0x64);
88 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
89 tmp1byte &= ~(BIT(0));
90 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
91}
92
93void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw)
94{
95 struct rtl_priv *rtlpriv = rtl_priv(hw);
96 u8 tmp1byte;
97
98 tmp1byte = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
99 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp1byte | BIT(6));
100 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
101 tmp1byte = rtl_read_byte(rtlpriv, REG_TBTT_PROHIBIT + 2);
102 tmp1byte |= BIT(0);
103 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 2, tmp1byte);
104}
105
106static void _rtl8821ae_enable_bcn_sub_func(struct ieee80211_hw *hw)
107{
108 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(1));
109}
110
111static void _rtl8821ae_disable_bcn_sub_func(struct ieee80211_hw *hw)
112{
113 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(1), 0);
114}
115
116static void _rtl8821ae_set_fw_clock_on(struct ieee80211_hw *hw,
117 u8 rpwm_val, bool b_need_turn_off_ckk)
118{
119 struct rtl_priv *rtlpriv = rtl_priv(hw);
120 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
121 bool b_support_remote_wake_up;
122 u32 count = 0, isr_regaddr, content;
123 bool b_schedule_timer = b_need_turn_off_ckk;
124
125 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
126 (u8 *)(&b_support_remote_wake_up));
127
128 if (!rtlhal->fw_ready)
129 return;
130 if (!rtlpriv->psc.fw_current_inpsmode)
131 return;
132
133 while (1) {
134 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
135 if (rtlhal->fw_clk_change_in_progress) {
136 while (rtlhal->fw_clk_change_in_progress) {
137 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
138 count++;
139 udelay(100);
140 if (count > 1000)
141 goto change_done;
142 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
143 }
144 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
145 } else {
146 rtlhal->fw_clk_change_in_progress = false;
147 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
148 goto change_done;
149 }
150 }
151change_done:
152 if (IS_IN_LOW_POWER_STATE_8821AE(rtlhal->fw_ps_state)) {
153 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_SET_RPWM,
154 (u8 *)(&rpwm_val));
155 if (FW_PS_IS_ACK(rpwm_val)) {
156 isr_regaddr = REG_HISR;
157 content = rtl_read_dword(rtlpriv, isr_regaddr);
158 while (!(content & IMR_CPWM) && (count < 500)) {
159 udelay(50);
160 count++;
161 content = rtl_read_dword(rtlpriv, isr_regaddr);
162 }
163
164 if (content & IMR_CPWM) {
165 rtl_write_word(rtlpriv, isr_regaddr, 0x0100);
166 rtlhal->fw_ps_state = FW_PS_STATE_RF_ON_8821AE;
167 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
168 "Receive CPWM INT!!! Set rtlhal->FwPSState = %X\n",
169 rtlhal->fw_ps_state);
170 }
171 }
172
173 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
174 rtlhal->fw_clk_change_in_progress = false;
175 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
176 if (b_schedule_timer)
177 mod_timer(&rtlpriv->works.fw_clockoff_timer,
178 jiffies + MSECS(10));
179 } else {
180 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
181 rtlhal->fw_clk_change_in_progress = false;
182 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
183 }
184}
185
186static void _rtl8821ae_set_fw_clock_off(struct ieee80211_hw *hw,
187 u8 rpwm_val)
188{
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
191 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
192 struct rtl8192_tx_ring *ring;
193 enum rf_pwrstate rtstate;
194 bool b_schedule_timer = false;
195 u8 queue;
196
197 if (!rtlhal->fw_ready)
198 return;
199 if (!rtlpriv->psc.fw_current_inpsmode)
200 return;
201 if (!rtlhal->allow_sw_to_change_hwclc)
202 return;
203 rtlpriv->cfg->ops->get_hw_reg(hw, HW_VAR_RF_STATE, (u8 *)(&rtstate));
204 if (rtstate == ERFOFF || rtlpriv->psc.inactive_pwrstate == ERFOFF)
205 return;
206
207 for (queue = 0; queue < RTL_PCI_MAX_TX_QUEUE_COUNT; queue++) {
208 ring = &rtlpci->tx_ring[queue];
209 if (skb_queue_len(&ring->queue)) {
210 b_schedule_timer = true;
211 break;
212 }
213 }
214
215 if (b_schedule_timer) {
216 mod_timer(&rtlpriv->works.fw_clockoff_timer,
217 jiffies + MSECS(10));
218 return;
219 }
220
221 if (FW_PS_STATE(rtlhal->fw_ps_state) !=
222 FW_PS_STATE_RF_OFF_LOW_PWR_8821AE) {
223 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
224 if (!rtlhal->fw_clk_change_in_progress) {
225 rtlhal->fw_clk_change_in_progress = true;
226 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
227 rtlhal->fw_ps_state = FW_PS_STATE(rpwm_val);
228 rtl_write_word(rtlpriv, REG_HISR, 0x0100);
229 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
230 (u8 *)(&rpwm_val));
231 spin_lock_bh(&rtlpriv->locks.fw_ps_lock);
232 rtlhal->fw_clk_change_in_progress = false;
233 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
234 } else {
235 spin_unlock_bh(&rtlpriv->locks.fw_ps_lock);
236 mod_timer(&rtlpriv->works.fw_clockoff_timer,
237 jiffies + MSECS(10));
238 }
239 }
240}
241
242static void _rtl8821ae_set_fw_ps_rf_on(struct ieee80211_hw *hw)
243{
244 u8 rpwm_val = 0;
245
246 rpwm_val |= (FW_PS_STATE_RF_OFF_8821AE | FW_PS_ACK);
247 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, true);
248}
249
250static void _rtl8821ae_fwlps_leave(struct ieee80211_hw *hw)
251{
252 struct rtl_priv *rtlpriv = rtl_priv(hw);
253 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
254 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
255 bool fw_current_inps = false;
256 u8 rpwm_val = 0, fw_pwrmode = FW_PS_ACTIVE_MODE;
257
258 if (ppsc->low_power_enable) {
259 rpwm_val = (FW_PS_STATE_ALL_ON_8821AE|FW_PS_ACK);/* RF on */
260 _rtl8821ae_set_fw_clock_on(hw, rpwm_val, false);
261 rtlhal->allow_sw_to_change_hwclc = false;
262 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
263 (u8 *)(&fw_pwrmode));
264 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
265 (u8 *)(&fw_current_inps));
266 } else {
267 rpwm_val = FW_PS_STATE_ALL_ON_8821AE; /* RF on */
268 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SET_RPWM,
269 (u8 *)(&rpwm_val));
270 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_H2C_FW_PWRMODE,
271 (u8 *)(&fw_pwrmode));
272 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_FW_PSMODE_STATUS,
273 (u8 *)(&fw_current_inps));
274 }
275}
276
277static void _rtl8821ae_fwlps_enter(struct ieee80211_hw *hw)
278{
279 struct rtl_priv *rtlpriv = rtl_priv(hw);
280 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
281 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
282 bool fw_current_inps = true;
283 u8 rpwm_val;
284
285 if (ppsc->low_power_enable) {
286 rpwm_val = FW_PS_STATE_RF_OFF_LOW_PWR_8821AE; /* RF off */
287 rtlpriv->cfg->ops->set_hw_reg(hw,
288 HW_VAR_FW_PSMODE_STATUS,
289 (u8 *)(&fw_current_inps));
290 rtlpriv->cfg->ops->set_hw_reg(hw,
291 HW_VAR_H2C_FW_PWRMODE,
292 (u8 *)(&ppsc->fwctrl_psmode));
293 rtlhal->allow_sw_to_change_hwclc = true;
294 _rtl8821ae_set_fw_clock_off(hw, rpwm_val);
295 } else {
296 rpwm_val = FW_PS_STATE_RF_OFF_8821AE; /* RF off */
297 rtlpriv->cfg->ops->set_hw_reg(hw,
298 HW_VAR_FW_PSMODE_STATUS,
299 (u8 *)(&fw_current_inps));
300 rtlpriv->cfg->ops->set_hw_reg(hw,
301 HW_VAR_H2C_FW_PWRMODE,
302 (u8 *)(&ppsc->fwctrl_psmode));
303 rtlpriv->cfg->ops->set_hw_reg(hw,
304 HW_VAR_SET_RPWM,
305 (u8 *)(&rpwm_val));
306 }
307}
308
309static void _rtl8821ae_download_rsvd_page(struct ieee80211_hw *hw,
310 bool dl_whole_packets)
311{
312 struct rtl_priv *rtlpriv = rtl_priv(hw);
313 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
314 u8 tmp_regcr, tmp_reg422, bcnvalid_reg;
315 u8 count = 0, dlbcn_count = 0;
316 bool send_beacon = false;
317
318 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
319 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr | BIT(0)));
320
321 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
322 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
323
324 tmp_reg422 = rtl_read_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2);
325 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2,
326 tmp_reg422 & (~BIT(6)));
327 if (tmp_reg422 & BIT(6))
328 send_beacon = true;
329
330 do {
331 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
332 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
333 (bcnvalid_reg | BIT(0)));
334 _rtl8821ae_return_beacon_queue_skb(hw);
335
336 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
337 rtl8812ae_set_fw_rsvdpagepkt(hw, false,
338 dl_whole_packets);
339 else
340 rtl8821ae_set_fw_rsvdpagepkt(hw, false,
341 dl_whole_packets);
342
343 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
344 count = 0;
345 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
346 count++;
347 udelay(10);
348 bcnvalid_reg = rtl_read_byte(rtlpriv, REG_TDECTRL + 2);
349 }
350 dlbcn_count++;
351 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
352
353 if (!(bcnvalid_reg & BIT(0)))
354 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
355 "Download RSVD page failed!\n");
356 if (bcnvalid_reg & BIT(0) && rtlhal->enter_pnp_sleep) {
357 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, bcnvalid_reg | BIT(0));
358 _rtl8821ae_return_beacon_queue_skb(hw);
359 if (send_beacon) {
360 dlbcn_count = 0;
361 do {
362 rtl_write_byte(rtlpriv, REG_TDECTRL + 2,
363 bcnvalid_reg | BIT(0));
364
365 _rtl8821ae_return_beacon_queue_skb(hw);
366
367 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
368 rtl8812ae_set_fw_rsvdpagepkt(hw, true,
369 false);
370 else
371 rtl8821ae_set_fw_rsvdpagepkt(hw, true,
372 false);
373
374 /* check rsvd page download OK. */
375 bcnvalid_reg = rtl_read_byte(rtlpriv,
376 REG_TDECTRL + 2);
377 count = 0;
378 while (!(bcnvalid_reg & BIT(0)) && count < 20) {
379 count++;
380 udelay(10);
381 bcnvalid_reg =
382 rtl_read_byte(rtlpriv,
383 REG_TDECTRL + 2);
384 }
385 dlbcn_count++;
386 } while (!(bcnvalid_reg & BIT(0)) && dlbcn_count < 5);
387
388 if (!(bcnvalid_reg & BIT(0)))
389 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
390 "2 Download RSVD page failed!\n");
391 }
392 }
393
394 if (bcnvalid_reg & BIT(0))
395 rtl_write_byte(rtlpriv, REG_TDECTRL + 2, BIT(0));
396
397 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
398 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
399
400 if (send_beacon)
401 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 2, tmp_reg422);
402
403 if (!rtlhal->enter_pnp_sleep) {
404 tmp_regcr = rtl_read_byte(rtlpriv, REG_CR + 1);
405 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp_regcr & ~(BIT(0))));
406 }
407}
408
409void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
410{
411 struct rtl_priv *rtlpriv = rtl_priv(hw);
412 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
413 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
414 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
415
416 switch (variable) {
417 case HW_VAR_ETHER_ADDR:
418 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_MACID);
419 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_MACID + 4);
420 break;
421 case HW_VAR_BSSID:
422 *((u32 *)(val)) = rtl_read_dword(rtlpriv, REG_BSSID);
423 *((u16 *)(val+4)) = rtl_read_word(rtlpriv, REG_BSSID+4);
424 break;
425 case HW_VAR_MEDIA_STATUS:
426 val[0] = rtl_read_byte(rtlpriv, REG_CR+2) & 0x3;
427 break;
428 case HW_VAR_SLOT_TIME:
429 *((u8 *)(val)) = mac->slot_time;
430 break;
431 case HW_VAR_BEACON_INTERVAL:
432 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_BCN_INTERVAL);
433 break;
434 case HW_VAR_ATIM_WINDOW:
435 *((u16 *)(val)) = rtl_read_word(rtlpriv, REG_ATIMWND);
436 break;
437 case HW_VAR_RCR:
438 *((u32 *)(val)) = rtlpci->receive_config;
439 break;
440 case HW_VAR_RF_STATE:
441 *((enum rf_pwrstate *)(val)) = ppsc->rfpwr_state;
442 break;
443 case HW_VAR_FWLPS_RF_ON:{
444 enum rf_pwrstate rfstate;
445 u32 val_rcr;
446
447 rtlpriv->cfg->ops->get_hw_reg(hw,
448 HW_VAR_RF_STATE,
449 (u8 *)(&rfstate));
450 if (rfstate == ERFOFF) {
451 *((bool *)(val)) = true;
452 } else {
453 val_rcr = rtl_read_dword(rtlpriv, REG_RCR);
454 val_rcr &= 0x00070000;
455 if (val_rcr)
456 *((bool *)(val)) = false;
457 else
458 *((bool *)(val)) = true;
459 }
460 break; }
461 case HW_VAR_FW_PSMODE_STATUS:
462 *((bool *)(val)) = ppsc->fw_current_inpsmode;
463 break;
464 case HW_VAR_CORRECT_TSF:{
465 u64 tsf;
466 u32 *ptsf_low = (u32 *)&tsf;
467 u32 *ptsf_high = ((u32 *)&tsf) + 1;
468
469 *ptsf_high = rtl_read_dword(rtlpriv, (REG_TSFTR + 4));
470 *ptsf_low = rtl_read_dword(rtlpriv, REG_TSFTR);
471
472 *((u64 *)(val)) = tsf;
473
474 break; }
475 case HAL_DEF_WOWLAN:
476 if (ppsc->wo_wlan_mode)
477 *((bool *)(val)) = true;
478 else
479 *((bool *)(val)) = false;
480 break;
481 default:
482 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
483 "switch case not process %x\n", variable);
484 break;
485 }
486}
487
488void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val)
489{
490 struct rtl_priv *rtlpriv = rtl_priv(hw);
491 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
492 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
493 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
494 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
495 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
496 u8 idx;
497
498 switch (variable) {
499 case HW_VAR_ETHER_ADDR:{
500 for (idx = 0; idx < ETH_ALEN; idx++) {
501 rtl_write_byte(rtlpriv, (REG_MACID + idx),
502 val[idx]);
503 }
504 break;
505 }
506 case HW_VAR_BASIC_RATE:{
507 u16 b_rate_cfg = ((u16 *)val)[0];
508 b_rate_cfg = b_rate_cfg & 0x15f;
509 rtl_write_word(rtlpriv, REG_RRSR, b_rate_cfg);
510 break;
511 }
512 case HW_VAR_BSSID:{
513 for (idx = 0; idx < ETH_ALEN; idx++) {
514 rtl_write_byte(rtlpriv, (REG_BSSID + idx),
515 val[idx]);
516 }
517 break;
518 }
519 case HW_VAR_SIFS:
520 rtl_write_byte(rtlpriv, REG_SIFS_CTX + 1, val[0]);
521 rtl_write_byte(rtlpriv, REG_SIFS_TRX + 1, val[0]);
522
523 rtl_write_byte(rtlpriv, REG_SPEC_SIFS + 1, val[0]);
524 rtl_write_byte(rtlpriv, REG_MAC_SPEC_SIFS + 1, val[0]);
525
526 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
527 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM, val[0]);
528 break;
529 case HW_VAR_R2T_SIFS:
530 rtl_write_byte(rtlpriv, REG_RESP_SIFS_OFDM + 1, val[0]);
531 break;
532 case HW_VAR_SLOT_TIME:{
533 u8 e_aci;
534
535 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
536 "HW_VAR_SLOT_TIME %x\n", val[0]);
537
538 rtl_write_byte(rtlpriv, REG_SLOT, val[0]);
539
540 for (e_aci = 0; e_aci < AC_MAX; e_aci++) {
541 rtlpriv->cfg->ops->set_hw_reg(hw,
542 HW_VAR_AC_PARAM,
543 (u8 *)(&e_aci));
544 }
545 break; }
546 case HW_VAR_ACK_PREAMBLE:{
547 u8 reg_tmp;
548 u8 short_preamble = (bool)(*(u8 *)val);
549
550 reg_tmp = rtl_read_byte(rtlpriv, REG_TRXPTCL_CTL+2);
551 if (short_preamble) {
552 reg_tmp |= BIT(1);
553 rtl_write_byte(rtlpriv, REG_TRXPTCL_CTL + 2,
554 reg_tmp);
555 } else {
556 reg_tmp &= (~BIT(1));
557 rtl_write_byte(rtlpriv,
558 REG_TRXPTCL_CTL + 2,
559 reg_tmp);
560 }
561 break; }
562 case HW_VAR_WPA_CONFIG:
563 rtl_write_byte(rtlpriv, REG_SECCFG, *((u8 *)val));
564 break;
565 case HW_VAR_AMPDU_MIN_SPACE:{
566 u8 min_spacing_to_set;
567 u8 sec_min_space;
568
569 min_spacing_to_set = *((u8 *)val);
570 if (min_spacing_to_set <= 7) {
571 sec_min_space = 0;
572
573 if (min_spacing_to_set < sec_min_space)
574 min_spacing_to_set = sec_min_space;
575
576 mac->min_space_cfg = ((mac->min_space_cfg &
577 0xf8) |
578 min_spacing_to_set);
579
580 *val = min_spacing_to_set;
581
582 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
583 "Set HW_VAR_AMPDU_MIN_SPACE: %#x\n",
584 mac->min_space_cfg);
585
586 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
587 mac->min_space_cfg);
588 }
589 break; }
590 case HW_VAR_SHORTGI_DENSITY:{
591 u8 density_to_set;
592
593 density_to_set = *((u8 *)val);
594 mac->min_space_cfg |= (density_to_set << 3);
595
596 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
597 "Set HW_VAR_SHORTGI_DENSITY: %#x\n",
598 mac->min_space_cfg);
599
600 rtl_write_byte(rtlpriv, REG_AMPDU_MIN_SPACE,
601 mac->min_space_cfg);
602
603 break; }
604 case HW_VAR_AMPDU_FACTOR:{
605 u32 ampdu_len = (*((u8 *)val));
606
607 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
608 if (ampdu_len < VHT_AGG_SIZE_128K)
609 ampdu_len =
610 (0x2000 << (*((u8 *)val))) - 1;
611 else
612 ampdu_len = 0x1ffff;
613 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
614 if (ampdu_len < HT_AGG_SIZE_64K)
615 ampdu_len =
616 (0x2000 << (*((u8 *)val))) - 1;
617 else
618 ampdu_len = 0xffff;
619 }
620 ampdu_len |= BIT(31);
621
622 rtl_write_dword(rtlpriv,
623 REG_AMPDU_MAX_LENGTH_8812, ampdu_len);
624 break; }
625 case HW_VAR_AC_PARAM:{
626 u8 e_aci = *((u8 *)val);
627
628 rtl8821ae_dm_init_edca_turbo(hw);
629 if (rtlpci->acm_method != EACMWAY2_SW)
630 rtlpriv->cfg->ops->set_hw_reg(hw,
631 HW_VAR_ACM_CTRL,
632 (u8 *)(&e_aci));
633 break; }
634 case HW_VAR_ACM_CTRL:{
635 u8 e_aci = *((u8 *)val);
636 union aci_aifsn *p_aci_aifsn =
637 (union aci_aifsn *)(&mac->ac[0].aifs);
638 u8 acm = p_aci_aifsn->f.acm;
639 u8 acm_ctrl = rtl_read_byte(rtlpriv, REG_ACMHWCTRL);
640
641 acm_ctrl =
642 acm_ctrl | ((rtlpci->acm_method == 2) ? 0x0 : 0x1);
643
644 if (acm) {
645 switch (e_aci) {
646 case AC0_BE:
647 acm_ctrl |= ACMHW_BEQEN;
648 break;
649 case AC2_VI:
650 acm_ctrl |= ACMHW_VIQEN;
651 break;
652 case AC3_VO:
653 acm_ctrl |= ACMHW_VOQEN;
654 break;
655 default:
656 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
657 "HW_VAR_ACM_CTRL acm set failed: eACI is %d\n",
658 acm);
659 break;
660 }
661 } else {
662 switch (e_aci) {
663 case AC0_BE:
664 acm_ctrl &= (~ACMHW_BEQEN);
665 break;
666 case AC2_VI:
667 acm_ctrl &= (~ACMHW_VIQEN);
668 break;
669 case AC3_VO:
670 acm_ctrl &= (~ACMHW_BEQEN);
671 break;
672 default:
673 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
674 "switch case not process\n");
675 break;
676 }
677 }
678
679 RT_TRACE(rtlpriv, COMP_QOS, DBG_TRACE,
680 "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n",
681 acm_ctrl);
682 rtl_write_byte(rtlpriv, REG_ACMHWCTRL, acm_ctrl);
683 break; }
684 case HW_VAR_RCR:
685 rtl_write_dword(rtlpriv, REG_RCR, ((u32 *)(val))[0]);
686 rtlpci->receive_config = ((u32 *)(val))[0];
687 break;
688 case HW_VAR_RETRY_LIMIT:{
689 u8 retry_limit = ((u8 *)(val))[0];
690
691 rtl_write_word(rtlpriv, REG_RL,
692 retry_limit << RETRY_LIMIT_SHORT_SHIFT |
693 retry_limit << RETRY_LIMIT_LONG_SHIFT);
694 break; }
695 case HW_VAR_DUAL_TSF_RST:
696 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (BIT(0) | BIT(1)));
697 break;
698 case HW_VAR_EFUSE_BYTES:
699 rtlefuse->efuse_usedbytes = *((u16 *)val);
700 break;
701 case HW_VAR_EFUSE_USAGE:
702 rtlefuse->efuse_usedpercentage = *((u8 *)val);
703 break;
704 case HW_VAR_IO_CMD:
705 rtl8821ae_phy_set_io_cmd(hw, (*(enum io_type *)val));
706 break;
707 case HW_VAR_SET_RPWM:{
708 u8 rpwm_val;
709
710 rpwm_val = rtl_read_byte(rtlpriv, REG_PCIE_HRPWM);
711 udelay(1);
712
713 if (rpwm_val & BIT(7)) {
714 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
715 (*(u8 *)val));
716 } else {
717 rtl_write_byte(rtlpriv, REG_PCIE_HRPWM,
718 ((*(u8 *)val) | BIT(7)));
719 }
720
721 break; }
722 case HW_VAR_H2C_FW_PWRMODE:
723 rtl8821ae_set_fw_pwrmode_cmd(hw, (*(u8 *)val));
724 break;
725 case HW_VAR_FW_PSMODE_STATUS:
726 ppsc->fw_current_inpsmode = *((bool *)val);
727 break;
728 case HW_VAR_INIT_RTS_RATE:
729 break;
730 case HW_VAR_RESUME_CLK_ON:
731 _rtl8821ae_set_fw_ps_rf_on(hw);
732 break;
733 case HW_VAR_FW_LPS_ACTION:{
734 bool b_enter_fwlps = *((bool *)val);
735
736 if (b_enter_fwlps)
737 _rtl8821ae_fwlps_enter(hw);
738 else
739 _rtl8821ae_fwlps_leave(hw);
740 break; }
741 case HW_VAR_H2C_FW_JOINBSSRPT:{
742 u8 mstatus = (*(u8 *)val);
743
744 if (mstatus == RT_MEDIA_CONNECT) {
745 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID,
746 NULL);
747 _rtl8821ae_download_rsvd_page(hw, false);
748 }
749 rtl8821ae_set_fw_media_status_rpt_cmd(hw, mstatus);
750
751 break; }
752 case HW_VAR_H2C_FW_P2P_PS_OFFLOAD:
753 rtl8821ae_set_p2p_ps_offload_cmd(hw, (*(u8 *)val));
754 break;
755 case HW_VAR_AID:{
756 u16 u2btmp;
757 u2btmp = rtl_read_word(rtlpriv, REG_BCN_PSR_RPT);
758 u2btmp &= 0xC000;
759 rtl_write_word(rtlpriv, REG_BCN_PSR_RPT, (u2btmp |
760 mac->assoc_id));
761 break; }
762 case HW_VAR_CORRECT_TSF:{
763 u8 btype_ibss = ((u8 *)(val))[0];
764
765 if (btype_ibss)
766 _rtl8821ae_stop_tx_beacon(hw);
767
768 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(3));
769
770 rtl_write_dword(rtlpriv, REG_TSFTR,
771 (u32)(mac->tsf & 0xffffffff));
772 rtl_write_dword(rtlpriv, REG_TSFTR + 4,
773 (u32)((mac->tsf >> 32) & 0xffffffff));
774
775 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
776
777 if (btype_ibss)
778 _rtl8821ae_resume_tx_beacon(hw);
779 break; }
780 case HW_VAR_NAV_UPPER: {
781 u32 us_nav_upper = ((u32)*val);
782
783 if (us_nav_upper > HAL_92C_NAV_UPPER_UNIT * 0xFF) {
784 RT_TRACE(rtlpriv, COMP_INIT , DBG_WARNING,
785 "The setting value (0x%08X us) of NAV_UPPER is larger than (%d * 0xFF)!!!\n",
786 us_nav_upper, HAL_92C_NAV_UPPER_UNIT);
787 break;
788 }
789 rtl_write_byte(rtlpriv, REG_NAV_UPPER,
790 ((u8)((us_nav_upper +
791 HAL_92C_NAV_UPPER_UNIT - 1) /
792 HAL_92C_NAV_UPPER_UNIT)));
793 break; }
794 case HW_VAR_KEEP_ALIVE: {
795 u8 array[2];
796 array[0] = 0xff;
797 array[1] = *((u8 *)val);
798 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_KEEP_ALIVE_CTRL, 2,
799 array);
800 break; }
801 default:
802 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
803 "switch case not process %x\n", variable);
804 break;
805 }
806}
807
808static bool _rtl8821ae_llt_write(struct ieee80211_hw *hw, u32 address, u32 data)
809{
810 struct rtl_priv *rtlpriv = rtl_priv(hw);
811 bool status = true;
812 long count = 0;
813 u32 value = _LLT_INIT_ADDR(address) | _LLT_INIT_DATA(data) |
814 _LLT_OP(_LLT_WRITE_ACCESS);
815
816 rtl_write_dword(rtlpriv, REG_LLT_INIT, value);
817
818 do {
819 value = rtl_read_dword(rtlpriv, REG_LLT_INIT);
820 if (_LLT_NO_ACTIVE == _LLT_OP_VALUE(value))
821 break;
822
823 if (count > POLLING_LLT_THRESHOLD) {
824 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
825 "Failed to polling write LLT done at address %d!\n",
826 address);
827 status = false;
828 break;
829 }
830 } while (++count);
831
832 return status;
833}
834
835static bool _rtl8821ae_llt_table_init(struct ieee80211_hw *hw)
836{
837 struct rtl_priv *rtlpriv = rtl_priv(hw);
838 unsigned short i;
839 u8 txpktbuf_bndy;
840 u32 rqpn;
841 u8 maxpage;
842 bool status;
843
844 maxpage = 255;
845 txpktbuf_bndy = 0xF8;
846 rqpn = 0x80e70808;
847 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE) {
848 txpktbuf_bndy = 0xFA;
849 rqpn = 0x80e90808;
850 }
851
852 rtl_write_byte(rtlpriv, REG_TRXFF_BNDY, txpktbuf_bndy);
853 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, MAX_RX_DMA_BUFFER_SIZE - 1);
854
855 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, txpktbuf_bndy);
856
857 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, txpktbuf_bndy);
858 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, txpktbuf_bndy);
859
860 rtl_write_byte(rtlpriv, REG_PBP, 0x31);
861 rtl_write_byte(rtlpriv, REG_RX_DRVINFO_SZ, 0x4);
862
863 for (i = 0; i < (txpktbuf_bndy - 1); i++) {
864 status = _rtl8821ae_llt_write(hw, i, i + 1);
865 if (!status)
866 return status;
867 }
868
869 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
870 if (!status)
871 return status;
872
873 for (i = txpktbuf_bndy; i < maxpage; i++) {
874 status = _rtl8821ae_llt_write(hw, i, (i + 1));
875 if (!status)
876 return status;
877 }
878
879 status = _rtl8821ae_llt_write(hw, maxpage, txpktbuf_bndy);
880 if (!status)
881 return status;
882
883 rtl_write_dword(rtlpriv, REG_RQPN, rqpn);
884
885 rtl_write_byte(rtlpriv, REG_RQPN_NPQ, 0x00);
886
887 return true;
888}
889
890static void _rtl8821ae_gen_refresh_led_state(struct ieee80211_hw *hw)
891{
892 struct rtl_priv *rtlpriv = rtl_priv(hw);
893 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
894 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
895 struct rtl_led *pled0 = &pcipriv->ledctl.sw_led0;
896 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
897
898 if (rtlpriv->rtlhal.up_first_time)
899 return;
900
901 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
902 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
903 rtl8812ae_sw_led_on(hw, pled0);
904 else
905 rtl8821ae_sw_led_on(hw, pled0);
906 else if (ppsc->rfoff_reason == RF_CHANGE_BY_INIT)
907 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
908 rtl8812ae_sw_led_on(hw, pled0);
909 else
910 rtl8821ae_sw_led_on(hw, pled0);
911 else
912 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
913 rtl8812ae_sw_led_off(hw, pled0);
914 else
915 rtl8821ae_sw_led_off(hw, pled0);
916}
917
918static bool _rtl8821ae_init_mac(struct ieee80211_hw *hw)
919{
920 struct rtl_priv *rtlpriv = rtl_priv(hw);
921 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
922 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
923
924 u8 bytetmp = 0;
925 u16 wordtmp = 0;
926 bool mac_func_enable = rtlhal->mac_func_enable;
927
928 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x00);
929
930 /*Auto Power Down to CHIP-off State*/
931 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO + 1) & (~BIT(7));
932 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, bytetmp);
933
934 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
935 /* HW Power on sequence*/
936 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK,
937 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
938 RTL8812_NIC_ENABLE_FLOW)) {
939 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
940 "init 8812 MAC Fail as power on failure\n");
941 return false;
942 }
943 } else {
944 /* HW Power on sequence */
945 if (!rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_A_MSK,
946 PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,
947 RTL8821A_NIC_ENABLE_FLOW)){
948 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
949 "init 8821 MAC Fail as power on failure\n");
950 return false;
951 }
952 }
953
954 bytetmp = rtl_read_byte(rtlpriv, REG_APS_FSMCO) | BIT(4);
955 rtl_write_byte(rtlpriv, REG_APS_FSMCO, bytetmp);
956
957 bytetmp = rtl_read_byte(rtlpriv, REG_CR);
958 bytetmp = 0xff;
959 rtl_write_byte(rtlpriv, REG_CR, bytetmp);
960 mdelay(2);
961
962 bytetmp = 0xff;
963 rtl_write_byte(rtlpriv, REG_HWSEQ_CTRL, bytetmp);
964 mdelay(2);
965
966 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
967 bytetmp = rtl_read_byte(rtlpriv, REG_SYS_CFG + 3);
968 if (bytetmp & BIT(0)) {
969 bytetmp = rtl_read_byte(rtlpriv, 0x7c);
970 bytetmp |= BIT(6);
971 rtl_write_byte(rtlpriv, 0x7c, bytetmp);
972 }
973 }
974
975 bytetmp = rtl_read_byte(rtlpriv, REG_GPIO_MUXCFG + 1);
976 bytetmp &= ~BIT(4);
977 rtl_write_byte(rtlpriv, REG_GPIO_MUXCFG + 1, bytetmp);
978
979 rtl_write_word(rtlpriv, REG_CR, 0x2ff);
980
981 if (!mac_func_enable) {
982 if (!_rtl8821ae_llt_table_init(hw))
983 return false;
984 }
985
986 rtl_write_dword(rtlpriv, REG_HISR, 0xffffffff);
987 rtl_write_dword(rtlpriv, REG_HISRE, 0xffffffff);
988
989 /* Enable FW Beamformer Interrupt */
990 bytetmp = rtl_read_byte(rtlpriv, REG_FWIMR + 3);
991 rtl_write_byte(rtlpriv, REG_FWIMR + 3, bytetmp | BIT(6));
992
993 wordtmp = rtl_read_word(rtlpriv, REG_TRXDMA_CTRL);
994 wordtmp &= 0xf;
995 wordtmp |= 0xF5B1;
996 rtl_write_word(rtlpriv, REG_TRXDMA_CTRL, wordtmp);
997
998 rtl_write_byte(rtlpriv, REG_FWHW_TXQ_CTRL + 1, 0x1F);
999 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
1000 rtl_write_word(rtlpriv, REG_RXFLTMAP2, 0xFFFF);
1001 /*low address*/
1002 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1003 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
1004 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1005 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
1006 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1007 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1008 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1009 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1010 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1011 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1012 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1013 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1014 rtl_write_dword(rtlpriv, REG_HQ_DESA,
1015 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
1016 rtl_write_dword(rtlpriv, REG_RX_DESA,
1017 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
1018
1019 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 3, 0x77);
1020
1021 rtl_write_dword(rtlpriv, REG_INT_MIG, 0);
1022
1023 rtl_write_dword(rtlpriv, REG_MCUTST_1, 0);
1024
1025 rtl_write_byte(rtlpriv, REG_SECONDARY_CCA_CTRL, 0x3);
1026 _rtl8821ae_gen_refresh_led_state(hw);
1027
1028 return true;
1029}
1030
1031static void _rtl8821ae_hw_configure(struct ieee80211_hw *hw)
1032{
1033 struct rtl_priv *rtlpriv = rtl_priv(hw);
1034 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1035 u32 reg_rrsr;
1036
1037 reg_rrsr = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
1038
1039 rtl_write_dword(rtlpriv, REG_RRSR, reg_rrsr);
1040 /* ARFB table 9 for 11ac 5G 2SS */
1041 rtl_write_dword(rtlpriv, REG_ARFR0 + 4, 0xfffff000);
1042 /* ARFB table 10 for 11ac 5G 1SS */
1043 rtl_write_dword(rtlpriv, REG_ARFR1 + 4, 0x003ff000);
1044 /* ARFB table 11 for 11ac 24G 1SS */
1045 rtl_write_dword(rtlpriv, REG_ARFR2, 0x00000015);
1046 rtl_write_dword(rtlpriv, REG_ARFR2 + 4, 0x003ff000);
1047 /* ARFB table 12 for 11ac 24G 1SS */
1048 rtl_write_dword(rtlpriv, REG_ARFR3, 0x00000015);
1049 rtl_write_dword(rtlpriv, REG_ARFR3 + 4, 0xffcff000);
1050 /* 0x420[7] = 0 , enable retry AMPDU in new AMPD not singal MPDU. */
1051 rtl_write_word(rtlpriv, REG_FWHW_TXQ_CTRL, 0x1F00);
1052 rtl_write_byte(rtlpriv, REG_AMPDU_MAX_TIME, 0x70);
1053
1054 /*Set retry limit*/
1055 rtl_write_word(rtlpriv, REG_RL, 0x0707);
1056
1057 /* Set Data / Response auto rate fallack retry count*/
1058 rtl_write_dword(rtlpriv, REG_DARFRC, 0x01000000);
1059 rtl_write_dword(rtlpriv, REG_DARFRC + 4, 0x07060504);
1060 rtl_write_dword(rtlpriv, REG_RARFRC, 0x01000000);
1061 rtl_write_dword(rtlpriv, REG_RARFRC + 4, 0x07060504);
1062
1063 rtlpci->reg_bcn_ctrl_val = 0x1d;
1064 rtl_write_byte(rtlpriv, REG_BCN_CTRL, rtlpci->reg_bcn_ctrl_val);
1065
1066 /* TBTT prohibit hold time. Suggested by designer TimChen. */
1067 rtl_write_byte(rtlpriv, REG_TBTT_PROHIBIT + 1, 0xff);
1068
1069 /* AGGR_BK_TIME Reg51A 0x16 */
1070 rtl_write_word(rtlpriv, REG_NAV_PROT_LEN, 0x0040);
1071
1072 /*For Rx TP. Suggested by SD1 Richard. Added by tynli. 2010.04.12.*/
1073 rtl_write_dword(rtlpriv, REG_FAST_EDCA_CTRL, 0x03086666);
1074
1075 rtl_write_byte(rtlpriv, REG_HT_SINGLE_AMPDU, 0x80);
1076 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x20);
1077 rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, 0x1F1F);
1078}
1079
1080static u16 _rtl8821ae_mdio_read(struct rtl_priv *rtlpriv, u8 addr)
1081{
1082 u16 ret = 0;
1083 u8 tmp = 0, count = 0;
1084
1085 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(6));
1086 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1087 count = 0;
1088 while (tmp && count < 20) {
1089 udelay(10);
1090 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(6);
1091 count++;
1092 }
1093 if (0 == tmp)
1094 ret = rtl_read_word(rtlpriv, REG_MDIO_RDATA);
1095
1096 return ret;
1097}
1098
1099static void _rtl8821ae_mdio_write(struct rtl_priv *rtlpriv, u8 addr, u16 data)
1100{
1101 u8 tmp = 0, count = 0;
1102
1103 rtl_write_word(rtlpriv, REG_MDIO_WDATA, data);
1104 rtl_write_byte(rtlpriv, REG_MDIO_CTL, addr | BIT(5));
1105 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1106 count = 0;
1107 while (tmp && count < 20) {
1108 udelay(10);
1109 tmp = rtl_read_byte(rtlpriv, REG_MDIO_CTL) & BIT(5);
1110 count++;
1111 }
1112}
1113
1114static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
1115{
1116 u16 read_addr = addr & 0xfffc;
1117 u8 tmp = 0, count = 0, ret = 0;
1118
1119 rtl_write_word(rtlpriv, REG_DBI_ADDR, read_addr);
1120 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x2);
1121 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1122 count = 0;
1123 while (tmp && count < 20) {
1124 udelay(10);
1125 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1126 count++;
1127 }
1128 if (0 == tmp) {
1129 read_addr = REG_DBI_RDATA + addr % 4;
1130 ret = rtl_read_word(rtlpriv, read_addr);
1131 }
1132 return ret;
1133}
1134
1135static void _rtl8821ae_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
1136{
1137 u8 tmp = 0, count = 0;
1138 u16 wrtie_addr, remainder = addr % 4;
1139
1140 wrtie_addr = REG_DBI_WDATA + remainder;
1141 rtl_write_byte(rtlpriv, wrtie_addr, data);
1142
1143 wrtie_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
1144 rtl_write_word(rtlpriv, REG_DBI_ADDR, wrtie_addr);
1145
1146 rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
1147
1148 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1149 count = 0;
1150 while (tmp && count < 20) {
1151 udelay(10);
1152 tmp = rtl_read_byte(rtlpriv, REG_DBI_FLAG);
1153 count++;
1154 }
1155}
1156
1157static void _rtl8821ae_enable_aspm_back_door(struct ieee80211_hw *hw)
1158{
1159 struct rtl_priv *rtlpriv = rtl_priv(hw);
1160 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1161 u8 tmp;
1162
1163 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1164 if (_rtl8821ae_mdio_read(rtlpriv, 0x04) != 0x8544)
1165 _rtl8821ae_mdio_write(rtlpriv, 0x04, 0x8544);
1166
1167 if (_rtl8821ae_mdio_read(rtlpriv, 0x0b) != 0x0070)
1168 _rtl8821ae_mdio_write(rtlpriv, 0x0b, 0x0070);
1169 }
1170
1171 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x70f);
1172 _rtl8821ae_dbi_write(rtlpriv, 0x70f, tmp | BIT(7));
1173
1174 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x719);
1175 _rtl8821ae_dbi_write(rtlpriv, 0x719, tmp | BIT(3) | BIT(4));
1176
1177 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1178 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1179 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp|BIT(4));
1180 }
1181}
1182
1183void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw)
1184{
1185 struct rtl_priv *rtlpriv = rtl_priv(hw);
1186 u8 sec_reg_value;
1187 u8 tmp;
1188
1189 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
1190 "PairwiseEncAlgorithm = %d GroupEncAlgorithm = %d\n",
1191 rtlpriv->sec.pairwise_enc_algorithm,
1192 rtlpriv->sec.group_enc_algorithm);
1193
1194 if (rtlpriv->cfg->mod_params->sw_crypto || rtlpriv->sec.use_sw_sec) {
1195 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1196 "not open hw encryption\n");
1197 return;
1198 }
1199
1200 sec_reg_value = SCR_TXENCENABLE | SCR_RXDECENABLE;
1201
1202 if (rtlpriv->sec.use_defaultkey) {
1203 sec_reg_value |= SCR_TXUSEDK;
1204 sec_reg_value |= SCR_RXUSEDK;
1205 }
1206
1207 sec_reg_value |= (SCR_RXBCUSEDK | SCR_TXBCUSEDK);
1208
1209 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1210 rtl_write_byte(rtlpriv, REG_CR + 1, tmp | BIT(1));
1211
1212 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
1213 "The SECR-value %x\n", sec_reg_value);
1214
1215 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_WPA_CONFIG, &sec_reg_value);
1216}
1217
1218/* Static MacID Mapping (cf. Used in MacIdDoStaticMapping) ---------- */
1219#define MAC_ID_STATIC_FOR_DEFAULT_PORT 0
1220#define MAC_ID_STATIC_FOR_BROADCAST_MULTICAST 1
1221#define MAC_ID_STATIC_FOR_BT_CLIENT_START 2
1222#define MAC_ID_STATIC_FOR_BT_CLIENT_END 3
1223/* ----------------------------------------------------------- */
1224
1225static void rtl8821ae_macid_initialize_mediastatus(struct ieee80211_hw *hw)
1226{
1227 struct rtl_priv *rtlpriv = rtl_priv(hw);
1228 u8 media_rpt[4] = {RT_MEDIA_CONNECT, 1,
1229 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1230 MAC_ID_STATIC_FOR_BT_CLIENT_END};
1231
1232 rtlpriv->cfg->ops->set_hw_reg(hw,
1233 HW_VAR_H2C_FW_MEDIASTATUSRPT, media_rpt);
1234
1235 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1236 "Initialize MacId media status: from %d to %d\n",
1237 MAC_ID_STATIC_FOR_BROADCAST_MULTICAST,
1238 MAC_ID_STATIC_FOR_BT_CLIENT_END);
1239}
1240
1241static bool _rtl8821ae_check_pcie_dma_hang(struct ieee80211_hw *hw)
1242{
1243 struct rtl_priv *rtlpriv = rtl_priv(hw);
1244 u8 tmp;
1245
1246 /* write reg 0x350 Bit[26]=1. Enable debug port. */
1247 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1248 if (!(tmp & BIT(2))) {
1249 rtl_write_byte(rtlpriv, REG_DBI_CTRL + 3, (tmp | BIT(2)));
1250 mdelay(100);
1251 }
1252
1253 /* read reg 0x350 Bit[25] if 1 : RX hang */
1254 /* read reg 0x350 Bit[24] if 1 : TX hang */
1255 tmp = rtl_read_byte(rtlpriv, REG_DBI_CTRL + 3);
1256 if ((tmp & BIT(0)) || (tmp & BIT(1))) {
1257 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1258 "CheckPcieDMAHang8821AE(): true! Reset PCIE DMA!\n");
1259 return true;
1260 } else {
1261 return false;
1262 }
1263}
1264
1265static bool _rtl8821ae_reset_pcie_interface_dma(struct ieee80211_hw *hw,
1266 bool mac_power_on,
1267 bool in_watchdog)
1268{
1269 struct rtl_priv *rtlpriv = rtl_priv(hw);
1270 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1271 u8 tmp;
1272 bool release_mac_rx_pause;
1273 u8 backup_pcie_dma_pause;
1274
1275 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
1276
1277 /* 1. Disable register write lock. 0x1c[1] = 0 */
1278 tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL);
1279 tmp &= ~(BIT(1));
1280 rtl_write_byte(rtlpriv, REG_RSV_CTRL, tmp);
1281 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1282 /* write 0xCC bit[2] = 1'b1 */
1283 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1284 tmp |= BIT(2);
1285 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1286 }
1287
1288 /* 2. Check and pause TRX DMA */
1289 /* write 0x284 bit[18] = 1'b1 */
1290 /* write 0x301 = 0xFF */
1291 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1292 if (tmp & BIT(2)) {
1293 /* Already pause before the function for another purpose. */
1294 release_mac_rx_pause = false;
1295 } else {
1296 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1297 release_mac_rx_pause = true;
1298 }
1299 backup_pcie_dma_pause = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG + 1);
1300 if (backup_pcie_dma_pause != 0xFF)
1301 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFF);
1302
1303 if (mac_power_on) {
1304 /* 3. reset TRX function */
1305 /* write 0x100 = 0x00 */
1306 rtl_write_byte(rtlpriv, REG_CR, 0);
1307 }
1308
1309 /* 4. Reset PCIe DMA. 0x3[0] = 0 */
1310 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1311 tmp &= ~(BIT(0));
1312 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1313
1314 /* 5. Enable PCIe DMA. 0x3[0] = 1 */
1315 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN + 1);
1316 tmp |= BIT(0);
1317 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN + 1, tmp);
1318
1319 if (mac_power_on) {
1320 /* 6. enable TRX function */
1321 /* write 0x100 = 0xFF */
1322 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1323
1324 /* We should init LLT & RQPN and
1325 * prepare Tx/Rx descrptor address later
1326 * because MAC function is reset.*/
1327 }
1328
1329 /* 7. Restore PCIe autoload down bit */
1330 /* 8812AE does not has the defination. */
1331 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1332 /* write 0xF8 bit[17] = 1'b1 */
1333 tmp = rtl_read_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2);
1334 tmp |= BIT(1);
1335 rtl_write_byte(rtlpriv, REG_MAC_PHY_CTRL_NORMAL + 2, tmp);
1336 }
1337
1338 /* In MAC power on state, BB and RF maybe in ON state,
1339 * if we release TRx DMA here.
1340 * it will cause packets to be started to Tx/Rx,
1341 * so we release Tx/Rx DMA later.*/
1342 if (!mac_power_on/* || in_watchdog*/) {
1343 /* 8. release TRX DMA */
1344 /* write 0x284 bit[18] = 1'b0 */
1345 /* write 0x301 = 0x00 */
1346 if (release_mac_rx_pause) {
1347 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1348 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL,
1349 tmp & (~BIT(2)));
1350 }
1351 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1,
1352 backup_pcie_dma_pause);
1353 }
1354
1355 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1356 /* 9. lock system register */
1357 /* write 0xCC bit[2] = 1'b0 */
1358 tmp = rtl_read_byte(rtlpriv, REG_PMC_DBG_CTRL2);
1359 tmp &= ~(BIT(2));
1360 rtl_write_byte(rtlpriv, REG_PMC_DBG_CTRL2, tmp);
1361 }
1362 return true;
1363}
1364
1365static void _rtl8821ae_get_wakeup_reason(struct ieee80211_hw *hw)
1366{
1367 struct rtl_priv *rtlpriv = rtl_priv(hw);
1368 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1369 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1370 u8 fw_reason = 0;
1371 struct timeval ts;
1372
1373 fw_reason = rtl_read_byte(rtlpriv, REG_MCUTST_WOWLAN);
1374
1375 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "WOL Read 0x1c7 = %02X\n",
1376 fw_reason);
1377
1378 ppsc->wakeup_reason = 0;
1379
1380 rtlhal->last_suspend_sec = ts.tv_sec;
1381
1382 switch (fw_reason) {
1383 case FW_WOW_V2_PTK_UPDATE_EVENT:
1384 ppsc->wakeup_reason = WOL_REASON_PTK_UPDATE;
1385 do_gettimeofday(&ts);
1386 ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000;
1387 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1388 "It's a WOL PTK Key update event!\n");
1389 break;
1390 case FW_WOW_V2_GTK_UPDATE_EVENT:
1391 ppsc->wakeup_reason = WOL_REASON_GTK_UPDATE;
1392 do_gettimeofday(&ts);
1393 ppsc->last_wakeup_time = ts.tv_sec*1000 + ts.tv_usec/1000;
1394 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1395 "It's a WOL GTK Key update event!\n");
1396 break;
1397 case FW_WOW_V2_DISASSOC_EVENT:
1398 ppsc->wakeup_reason = WOL_REASON_DISASSOC;
1399 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1400 "It's a disassociation event!\n");
1401 break;
1402 case FW_WOW_V2_DEAUTH_EVENT:
1403 ppsc->wakeup_reason = WOL_REASON_DEAUTH;
1404 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1405 "It's a deauth event!\n");
1406 break;
1407 case FW_WOW_V2_FW_DISCONNECT_EVENT:
1408 ppsc->wakeup_reason = WOL_REASON_AP_LOST;
1409 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1410 "It's a Fw disconnect decision (AP lost) event!\n");
1411 break;
1412 case FW_WOW_V2_MAGIC_PKT_EVENT:
1413 ppsc->wakeup_reason = WOL_REASON_MAGIC_PKT;
1414 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1415 "It's a magic packet event!\n");
1416 break;
1417 case FW_WOW_V2_UNICAST_PKT_EVENT:
1418 ppsc->wakeup_reason = WOL_REASON_UNICAST_PKT;
1419 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1420 "It's an unicast packet event!\n");
1421 break;
1422 case FW_WOW_V2_PATTERN_PKT_EVENT:
1423 ppsc->wakeup_reason = WOL_REASON_PATTERN_PKT;
1424 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1425 "It's a pattern match event!\n");
1426 break;
1427 case FW_WOW_V2_RTD3_SSID_MATCH_EVENT:
1428 ppsc->wakeup_reason = WOL_REASON_RTD3_SSID_MATCH;
1429 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1430 "It's an RTD3 Ssid match event!\n");
1431 break;
1432 case FW_WOW_V2_REALWOW_V2_WAKEUPPKT:
1433 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_WAKEUPPKT;
1434 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1435 "It's an RealWoW wake packet event!\n");
1436 break;
1437 case FW_WOW_V2_REALWOW_V2_ACKLOST:
1438 ppsc->wakeup_reason = WOL_REASON_REALWOW_V2_ACKLOST;
1439 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1440 "It's an RealWoW ack lost event!\n");
1441 break;
1442 default:
1443 RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
1444 "WOL Read 0x1c7 = %02X, Unknown reason!\n",
1445 fw_reason);
1446 break;
1447 }
1448}
1449
1450static void _rtl8821ae_init_trx_desc_hw_address(struct ieee80211_hw *hw)
1451{
1452 struct rtl_priv *rtlpriv = rtl_priv(hw);
1453 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1454
1455 /*low address*/
1456 rtl_write_dword(rtlpriv, REG_BCNQ_DESA,
1457 rtlpci->tx_ring[BEACON_QUEUE].dma & DMA_BIT_MASK(32));
1458 rtl_write_dword(rtlpriv, REG_MGQ_DESA,
1459 rtlpci->tx_ring[MGNT_QUEUE].dma & DMA_BIT_MASK(32));
1460 rtl_write_dword(rtlpriv, REG_VOQ_DESA,
1461 rtlpci->tx_ring[VO_QUEUE].dma & DMA_BIT_MASK(32));
1462 rtl_write_dword(rtlpriv, REG_VIQ_DESA,
1463 rtlpci->tx_ring[VI_QUEUE].dma & DMA_BIT_MASK(32));
1464 rtl_write_dword(rtlpriv, REG_BEQ_DESA,
1465 rtlpci->tx_ring[BE_QUEUE].dma & DMA_BIT_MASK(32));
1466 rtl_write_dword(rtlpriv, REG_BKQ_DESA,
1467 rtlpci->tx_ring[BK_QUEUE].dma & DMA_BIT_MASK(32));
1468 rtl_write_dword(rtlpriv, REG_HQ_DESA,
1469 rtlpci->tx_ring[HIGH_QUEUE].dma & DMA_BIT_MASK(32));
1470 rtl_write_dword(rtlpriv, REG_RX_DESA,
1471 rtlpci->rx_ring[RX_MPDU_QUEUE].dma & DMA_BIT_MASK(32));
1472}
1473
1474static bool _rtl8821ae_init_llt_table(struct ieee80211_hw *hw, u32 boundary)
1475{
1476 bool status = true;
1477 u32 i;
1478 u32 txpktbuf_bndy = boundary;
1479 u32 last_entry_of_txpktbuf = LAST_ENTRY_OF_TX_PKT_BUFFER;
1480
1481 for (i = 0 ; i < (txpktbuf_bndy - 1) ; i++) {
1482 status = _rtl8821ae_llt_write(hw, i , i + 1);
1483 if (!status)
1484 return status;
1485 }
1486
1487 status = _rtl8821ae_llt_write(hw, (txpktbuf_bndy - 1), 0xFF);
1488 if (!status)
1489 return status;
1490
1491 for (i = txpktbuf_bndy ; i < last_entry_of_txpktbuf ; i++) {
1492 status = _rtl8821ae_llt_write(hw, i, (i + 1));
1493 if (!status)
1494 return status;
1495 }
1496
1497 status = _rtl8821ae_llt_write(hw, last_entry_of_txpktbuf,
1498 txpktbuf_bndy);
1499 if (!status)
1500 return status;
1501
1502 return status;
1503}
1504
1505static bool _rtl8821ae_dynamic_rqpn(struct ieee80211_hw *hw, u32 boundary,
1506 u16 npq_rqpn_value, u32 rqpn_val)
1507{
1508 struct rtl_priv *rtlpriv = rtl_priv(hw);
1509 u8 tmp;
1510 bool ret = true;
1511 u16 count = 0, tmp16;
1512 bool support_remote_wakeup;
1513
1514 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1515 (u8 *)(&support_remote_wakeup));
1516
1517 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1518 "boundary=0x%#X, NPQ_RQPNValue=0x%#X, RQPNValue=0x%#X\n",
1519 boundary, npq_rqpn_value, rqpn_val);
1520
1521 /* stop PCIe DMA
1522 * 1. 0x301[7:0] = 0xFE */
1523 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1524
1525 /* wait TXFF empty
1526 * 2. polling till 0x41A[15:0]=0x07FF */
1527 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1528 while ((tmp16 & 0x07FF) != 0x07FF) {
1529 udelay(100);
1530 tmp16 = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
1531 count++;
1532 if ((count % 200) == 0) {
1533 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1534 "Tx queue is not empty for 20ms!\n");
1535 }
1536 if (count >= 1000) {
1537 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1538 "Wait for Tx FIFO empty timeout!\n");
1539 break;
1540 }
1541 }
1542
1543 /* TX pause
1544 * 3. reg 0x522=0xFF */
1545 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
1546
1547 /* Wait TX State Machine OK
1548 * 4. polling till reg 0x5FB~0x5F8 = 0x00000000 for 50ms */
1549 count = 0;
1550 while (rtl_read_byte(rtlpriv, REG_SCH_TXCMD) != 0) {
1551 udelay(100);
1552 count++;
1553 if (count >= 500) {
1554 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1555 "Wait for TX State Machine ready timeout !!\n");
1556 break;
1557 }
1558 }
1559
1560 /* stop RX DMA path
1561 * 5. 0x284[18] = 1
1562 * 6. wait till 0x284[17] == 1
1563 * wait RX DMA idle */
1564 count = 0;
1565 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1566 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp | BIT(2)));
1567 do {
1568 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1569 udelay(10);
1570 count++;
1571 } while (!(tmp & BIT(1)) && count < 100);
1572
1573 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1574 "Wait until Rx DMA Idle. count=%d REG[0x286]=0x%x\n",
1575 count, tmp);
1576
1577 /* reset BB
1578 * 7. 0x02 [0] = 0 */
1579 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1580 tmp &= ~(BIT(0));
1581 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, tmp);
1582
1583 /* Reset TRX MAC
1584 * 8. 0x100 = 0x00
1585 * Delay (1ms) */
1586 rtl_write_byte(rtlpriv, REG_CR, 0x00);
1587 udelay(1000);
1588
1589 /* Disable MAC Security Engine
1590 * 9. 0x100 bit[9]=0 */
1591 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1592 tmp &= ~(BIT(1));
1593 rtl_write_byte(rtlpriv, REG_CR + 1, tmp);
1594
1595 /* To avoid DD-Tim Circuit hang
1596 * 10. 0x553 bit[5]=1 */
1597 tmp = rtl_read_byte(rtlpriv, REG_DUAL_TSF_RST);
1598 rtl_write_byte(rtlpriv, REG_DUAL_TSF_RST, (tmp | BIT(5)));
1599
1600 /* Enable MAC Security Engine
1601 * 11. 0x100 bit[9]=1 */
1602 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1603 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp | BIT(1)));
1604
1605 /* Enable TRX MAC
1606 * 12. 0x100 = 0xFF
1607 * Delay (1ms) */
1608 rtl_write_byte(rtlpriv, REG_CR, 0xFF);
1609 udelay(1000);
1610
1611 /* Enable BB
1612 * 13. 0x02 [0] = 1 */
1613 tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
1614 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, (tmp | BIT(0)));
1615
1616 /* beacon setting
1617 * 14,15. set beacon head page (reg 0x209 and 0x424) */
1618 rtl_write_byte(rtlpriv, REG_TDECTRL + 1, (u8)boundary);
1619 rtl_write_byte(rtlpriv, REG_TXPKTBUF_BCNQ_BDNY, (u8)boundary);
1620 rtl_write_byte(rtlpriv, REG_TXPKTBUF_MGQ_BDNY, (u8)boundary);
1621
1622 /* 16. WMAC_LBK_BF_HD 0x45D[7:0]
1623 * WMAC_LBK_BF_HD */
1624 rtl_write_byte(rtlpriv, REG_TXPKTBUF_WMAC_LBK_BF_HD,
1625 (u8)boundary);
1626
1627 rtl_write_word(rtlpriv, REG_TRXFF_BNDY, boundary);
1628
1629 /* init LLT
1630 * 17. init LLT */
1631 if (!_rtl8821ae_init_llt_table(hw, boundary)) {
1632 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING,
1633 "Failed to init LLT table!\n");
1634 return false;
1635 }
1636
1637 /* reallocate RQPN
1638 * 18. reallocate RQPN and init LLT */
1639 rtl_write_word(rtlpriv, REG_RQPN_NPQ, npq_rqpn_value);
1640 rtl_write_dword(rtlpriv, REG_RQPN, rqpn_val);
1641
1642 /* release Tx pause
1643 * 19. 0x522=0x00 */
1644 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
1645
1646 /* enable PCIE DMA
1647 * 20. 0x301[7:0] = 0x00
1648 * 21. 0x284[18] = 0 */
1649 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1650 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
1651 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, (tmp&~BIT(2)));
1652
1653 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "End.\n");
1654 return ret;
1655}
1656
1657static void _rtl8821ae_simple_initialize_adapter(struct ieee80211_hw *hw)
1658{
1659 struct rtl_priv *rtlpriv = rtl_priv(hw);
1660 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1661 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
1662
1663#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
1664 /* Re-download normal Fw. */
1665 rtl8821ae_set_fw_related_for_wowlan(hw, false);
1666#endif
1667
1668 /* Re-Initialize LLT table. */
1669 if (rtlhal->re_init_llt_table) {
1670 u32 rqpn = 0x80e70808;
1671 u8 rqpn_npq = 0, boundary = 0xF8;
1672 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1673 rqpn = 0x80e90808;
1674 boundary = 0xFA;
1675 }
1676 if (_rtl8821ae_dynamic_rqpn(hw, boundary, rqpn_npq, rqpn))
1677 rtlhal->re_init_llt_table = false;
1678 }
1679
1680 ppsc->rfpwr_state = ERFON;
1681}
1682
1683static void _rtl8821ae_enable_l1off(struct ieee80211_hw *hw)
1684{
1685 u8 tmp = 0;
1686 struct rtl_priv *rtlpriv = rtl_priv(hw);
1687
1688 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1689
1690 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x160);
1691 if (!(tmp & (BIT(2) | BIT(3)))) {
1692 RT_TRACE(rtlpriv, COMP_POWER | COMP_INIT, DBG_LOUD,
1693 "0x160(%#x)return!!\n", tmp);
1694 return;
1695 }
1696
1697 tmp = _rtl8821ae_mdio_read(rtlpriv, 0x1b);
1698 _rtl8821ae_mdio_write(rtlpriv, 0x1b, (tmp | BIT(4)));
1699
1700 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x718);
1701 _rtl8821ae_dbi_write(rtlpriv, 0x718, tmp | BIT(5));
1702
1703 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1704}
1705
1706static void _rtl8821ae_enable_ltr(struct ieee80211_hw *hw)
1707{
1708 u8 tmp = 0;
1709 struct rtl_priv *rtlpriv = rtl_priv(hw);
1710
1711 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "--->\n");
1712
1713 /* Check 0x98[10] */
1714 tmp = _rtl8821ae_dbi_read(rtlpriv, 0x99);
1715 if (!(tmp & BIT(2))) {
1716 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1717 "<---0x99(%#x) return!!\n", tmp);
1718 return;
1719 }
1720
1721 /* LTR idle latency, 0x90 for 144us */
1722 rtl_write_dword(rtlpriv, 0x798, 0x88908890);
1723
1724 /* LTR active latency, 0x3c for 60us */
1725 rtl_write_dword(rtlpriv, 0x79c, 0x883c883c);
1726
1727 tmp = rtl_read_byte(rtlpriv, 0x7a4);
1728 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(4)));
1729
1730 tmp = rtl_read_byte(rtlpriv, 0x7a4);
1731 rtl_write_byte(rtlpriv, 0x7a4, (tmp & (~BIT(0))));
1732 rtl_write_byte(rtlpriv, 0x7a4, (tmp | BIT(0)));
1733
1734 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<---\n");
1735}
1736
1737static bool _rtl8821ae_wowlan_initialize_adapter(struct ieee80211_hw *hw)
1738{
1739 struct rtl_priv *rtlpriv = rtl_priv(hw);
1740 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1741 bool init_finished = true;
1742 u8 tmp = 0;
1743
1744 /* Get Fw wake up reason. */
1745 _rtl8821ae_get_wakeup_reason(hw);
1746
1747 /* Patch Pcie Rx DMA hang after S3/S4 several times.
1748 * The root cause has not be found. */
1749 if (_rtl8821ae_check_pcie_dma_hang(hw))
1750 _rtl8821ae_reset_pcie_interface_dma(hw, true, false);
1751
1752 /* Prepare Tx/Rx Desc Hw address. */
1753 _rtl8821ae_init_trx_desc_hw_address(hw);
1754
1755 /* Release Pcie Interface Rx DMA to allow wake packet DMA. */
1756 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xFE);
1757 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Enable PCIE Rx DMA.\n");
1758
1759 /* Check wake up event.
1760 * We should check wake packet bit before disable wowlan by H2C or
1761 * Fw will clear the bit. */
1762 tmp = rtl_read_byte(rtlpriv, REG_FTISR + 3);
1763 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1764 "Read REG_FTISR 0x13f = %#X\n", tmp);
1765
1766 /* Set the WoWLAN related function control disable. */
1767 rtl8821ae_set_fw_wowlan_mode(hw, false);
1768 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 0);
1769
1770 if (rtlhal->hw_rof_enable) {
1771 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
1772 if (tmp & BIT(1)) {
1773 /* Clear GPIO9 ISR */
1774 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
1775 init_finished = false;
1776 } else {
1777 init_finished = true;
1778 }
1779 }
1780
1781 if (init_finished) {
1782 _rtl8821ae_simple_initialize_adapter(hw);
1783
1784 /* Release Pcie Interface Tx DMA. */
1785 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0x00);
1786 /* Release Pcie RX DMA */
1787 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, 0x02);
1788
1789 tmp = rtl_read_byte(rtlpriv, REG_CR + 1);
1790 rtl_write_byte(rtlpriv, REG_CR + 1, (tmp & (~BIT(0))));
1791
1792 _rtl8821ae_enable_l1off(hw);
1793 _rtl8821ae_enable_ltr(hw);
1794 }
1795
1796 return init_finished;
1797}
1798
1799static void _rtl8812ae_bb8812_config_1t(struct ieee80211_hw *hw)
1800{
1801 /* BB OFDM RX Path_A */
1802 rtl_set_bbreg(hw, 0x808, 0xff, 0x11);
1803 /* BB OFDM TX Path_A */
1804 rtl_set_bbreg(hw, 0x80c, MASKLWORD, 0x1111);
1805 /* BB CCK R/Rx Path_A */
1806 rtl_set_bbreg(hw, 0xa04, 0x0c000000, 0x0);
1807 /* MCS support */
1808 rtl_set_bbreg(hw, 0x8bc, 0xc0000060, 0x4);
1809 /* RF Path_B HSSI OFF */
1810 rtl_set_bbreg(hw, 0xe00, 0xf, 0x4);
1811 /* RF Path_B Power Down */
1812 rtl_set_bbreg(hw, 0xe90, MASKDWORD, 0);
1813 /* ADDA Path_B OFF */
1814 rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0);
1815 rtl_set_bbreg(hw, 0xe64, MASKDWORD, 0);
1816}
1817
1818static void _rtl8821ae_poweroff_adapter(struct ieee80211_hw *hw)
1819{
1820 struct rtl_priv *rtlpriv = rtl_priv(hw);
1821 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1822 u8 u1b_tmp;
1823
1824 rtlhal->mac_func_enable = false;
1825
1826 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1827 /* Combo (PCIe + USB) Card and PCIe-MF Card */
1828 /* 1. Run LPS WL RFOFF flow */
1829 /* RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1830 "=====>CardDisableRTL8812E,RTL8821A_NIC_LPS_ENTER_FLOW\n");
1831 */
1832 rtl_hal_pwrseqcmdparsing(rtlpriv,
1833 PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1834 PWR_INTF_PCI_MSK, RTL8821A_NIC_LPS_ENTER_FLOW);
1835 }
1836 /* 2. 0x1F[7:0] = 0 */
1837 /* turn off RF */
1838 /* rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x00); */
1839 if ((rtl_read_byte(rtlpriv, REG_MCUFWDL) & BIT(7)) &&
1840 rtlhal->fw_ready) {
1841 rtl8821ae_firmware_selfreset(hw);
1842 }
1843
1844 /* Reset MCU. Suggested by Filen. */
1845 u1b_tmp = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN+1);
1846 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN+1, (u1b_tmp & (~BIT(2))));
1847
1848 /* g. MCUFWDL 0x80[1:0]=0 */
1849 /* reset MCU ready status */
1850 rtl_write_byte(rtlpriv, REG_MCUFWDL, 0x00);
1851
1852 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1853 /* HW card disable configuration. */
1854 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1855 PWR_INTF_PCI_MSK, RTL8821A_NIC_DISABLE_FLOW);
1856 } else {
1857 /* HW card disable configuration. */
1858 rtl_hal_pwrseqcmdparsing(rtlpriv, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK,
1859 PWR_INTF_PCI_MSK, RTL8812_NIC_DISABLE_FLOW);
1860 }
1861
1862 /* Reset MCU IO Wrapper */
1863 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1864 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, (u1b_tmp & (~BIT(0))));
1865 u1b_tmp = rtl_read_byte(rtlpriv, REG_RSV_CTRL + 1);
1866 rtl_write_byte(rtlpriv, REG_RSV_CTRL + 1, u1b_tmp | BIT(0));
1867
1868 /* 7. RSV_CTRL 0x1C[7:0] = 0x0E */
1869 /* lock ISO/CLK/Power control register */
1870 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x0e);
1871}
1872
1873int rtl8821ae_hw_init(struct ieee80211_hw *hw)
1874{
1875 struct rtl_priv *rtlpriv = rtl_priv(hw);
1876 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1877 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1878 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
1879 bool rtstatus = true;
1880 int err;
1881 u8 tmp_u1b;
1882 bool support_remote_wakeup;
1883 u32 nav_upper = WIFI_NAV_UPPER_US;
1884
1885 rtlhal->being_init_adapter = true;
1886 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
1887 (u8 *)(&support_remote_wakeup));
1888 rtlpriv->intf_ops->disable_aspm(hw);
1889
1890 /*YP wowlan not considered*/
1891
1892 tmp_u1b = rtl_read_byte(rtlpriv, REG_CR);
1893 if (tmp_u1b != 0 && tmp_u1b != 0xEA) {
1894 rtlhal->mac_func_enable = true;
1895 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1896 "MAC has already power on.\n");
1897 } else {
1898 rtlhal->mac_func_enable = false;
1899 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1900 }
1901
1902 if (support_remote_wakeup &&
1903 rtlhal->wake_from_pnp_sleep &&
1904 rtlhal->mac_func_enable) {
1905 if (_rtl8821ae_wowlan_initialize_adapter(hw)) {
1906 rtlhal->being_init_adapter = false;
1907 return 0;
1908 }
1909 }
1910
1911 if (_rtl8821ae_check_pcie_dma_hang(hw)) {
1912 _rtl8821ae_reset_pcie_interface_dma(hw,
1913 rtlhal->mac_func_enable,
1914 false);
1915 rtlhal->mac_func_enable = false;
1916 }
1917
1918 /* Reset MAC/BB/RF status if it is not powered off
1919 * before calling initialize Hw flow to prevent
1920 * from interface and MAC status mismatch.
1921 * 2013.06.21, by tynli. Suggested by SD1 JackieLau. */
1922 if (rtlhal->mac_func_enable) {
1923 _rtl8821ae_poweroff_adapter(hw);
1924 rtlhal->mac_func_enable = false;
1925 }
1926
1927 rtstatus = _rtl8821ae_init_mac(hw);
1928 if (rtstatus != true) {
1929 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Init MAC failed\n");
1930 err = 1;
1931 return err;
1932 }
1933
1934 tmp_u1b = rtl_read_byte(rtlpriv, REG_SYS_CFG);
1935 tmp_u1b &= 0x7F;
1936 rtl_write_byte(rtlpriv, REG_SYS_CFG, tmp_u1b);
1937
1938 err = rtl8821ae_download_fw(hw, false);
1939 if (err) {
1940 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
1941 "Failed to download FW. Init HW without FW now\n");
1942 err = 1;
1943 rtlhal->fw_ready = false;
1944 return err;
1945 } else {
1946 rtlhal->fw_ready = true;
1947 }
1948 ppsc->fw_current_inpsmode = false;
1949 rtlhal->fw_ps_state = FW_PS_STATE_ALL_ON_8821AE;
1950 rtlhal->fw_clk_change_in_progress = false;
1951 rtlhal->allow_sw_to_change_hwclc = false;
1952 rtlhal->last_hmeboxnum = 0;
1953
1954 /*SIC_Init(Adapter);
1955 if(rtlhal->AMPDUBurstMode)
1956 rtl_write_byte(rtlpriv,REG_AMPDU_BURST_MODE_8812, 0x7F);*/
1957
1958 rtl8821ae_phy_mac_config(hw);
1959 /* because last function modify RCR, so we update
1960 * rcr var here, or TP will unstable for receive_config
1961 * is wrong, RX RCR_ACRC32 will cause TP unstabel & Rx
1962 * RCR_APP_ICV will cause mac80211 unassoc for cisco 1252
1963 rtlpci->receive_config = rtl_read_dword(rtlpriv, REG_RCR);
1964 rtlpci->receive_config &= ~(RCR_ACRC32 | RCR_AICV);
1965 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);*/
1966 rtl8821ae_phy_bb_config(hw);
1967
1968 rtl8821ae_phy_rf_config(hw);
1969
1970 if (rtlpriv->phy.rf_type == RF_1T1R &&
1971 rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
1972 _rtl8812ae_bb8812_config_1t(hw);
1973
1974 _rtl8821ae_hw_configure(hw);
1975
1976 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
1977
1978 /*set wireless mode*/
1979
1980 rtlhal->mac_func_enable = true;
1981
1982 rtl_cam_reset_all_entry(hw);
1983
1984 rtl8821ae_enable_hw_security_config(hw);
1985
1986 ppsc->rfpwr_state = ERFON;
1987
1988 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_ETHER_ADDR, mac->mac_addr);
1989 _rtl8821ae_enable_aspm_back_door(hw);
1990 rtlpriv->intf_ops->enable_aspm(hw);
1991
1992 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
1993 (rtlhal->rfe_type == 1 || rtlhal->rfe_type == 5))
1994 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x0302);
1995
1996 rtl8821ae_bt_hw_init(hw);
1997 rtlpriv->rtlhal.being_init_adapter = false;
1998
1999 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_NAV_UPPER, (u8 *)&nav_upper);
2000
2001 /* rtl8821ae_dm_check_txpower_tracking(hw); */
2002 /* rtl8821ae_phy_lc_calibrate(hw); */
2003 if (support_remote_wakeup)
2004 rtl_write_byte(rtlpriv, REG_WOW_CTRL, 0);
2005
2006 /* Release Rx DMA*/
2007 tmp_u1b = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2008 if (tmp_u1b & BIT(2)) {
2009 /* Release Rx DMA if needed*/
2010 tmp_u1b &= ~BIT(2);
2011 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, tmp_u1b);
2012 }
2013
2014 /* Release Tx/Rx PCIE DMA if*/
2015 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0);
2016
2017 rtl8821ae_dm_init(hw);
2018 rtl8821ae_macid_initialize_mediastatus(hw);
2019
2020 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_hw_init() <====\n");
2021 return err;
2022}
2023
2024static enum version_8821ae _rtl8821ae_read_chip_version(struct ieee80211_hw *hw)
2025{
2026 struct rtl_priv *rtlpriv = rtl_priv(hw);
2027 struct rtl_phy *rtlphy = &rtlpriv->phy;
2028 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2029 enum version_8821ae version = VERSION_UNKNOWN;
2030 u32 value32;
2031
2032 value32 = rtl_read_dword(rtlpriv, REG_SYS_CFG);
2033 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2034 "ReadChipVersion8812A 0xF0 = 0x%x\n", value32);
2035
2036 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
2037 rtlphy->rf_type = RF_2T2R;
2038 else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE)
2039 rtlphy->rf_type = RF_1T1R;
2040
2041 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2042 "RF_Type is %x!!\n", rtlphy->rf_type);
2043
2044 if (value32 & TRP_VAUX_EN) {
2045 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2046 if (rtlphy->rf_type == RF_2T2R)
2047 version = VERSION_TEST_CHIP_2T2R_8812;
2048 else
2049 version = VERSION_TEST_CHIP_1T1R_8812;
2050 } else
2051 version = VERSION_TEST_CHIP_8821;
2052 } else {
2053 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
2054 u32 rtl_id = ((value32 & CHIP_VER_RTL_MASK) >> 12) + 1;
2055
2056 if (rtlphy->rf_type == RF_2T2R)
2057 version =
2058 (enum version_8821ae)(CHIP_8812
2059 | NORMAL_CHIP |
2060 RF_TYPE_2T2R);
2061 else
2062 version = (enum version_8821ae)(CHIP_8812
2063 | NORMAL_CHIP);
2064
2065 version = (enum version_8821ae)(version | (rtl_id << 12));
2066 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2067 u32 rtl_id = value32 & CHIP_VER_RTL_MASK;
2068
2069 version = (enum version_8821ae)(CHIP_8821
2070 | NORMAL_CHIP | rtl_id);
2071 }
2072 }
2073
2074 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
2075 /*WL_HWROF_EN.*/
2076 value32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
2077 rtlhal->hw_rof_enable = ((value32 & WL_HWROF_EN) ? 1 : 0);
2078 }
2079
2080 switch (version) {
2081 case VERSION_TEST_CHIP_1T1R_8812:
2082 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2083 "Chip Version ID: VERSION_TEST_CHIP_1T1R_8812\n");
2084 break;
2085 case VERSION_TEST_CHIP_2T2R_8812:
2086 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2087 "Chip Version ID: VERSION_TEST_CHIP_2T2R_8812\n");
2088 break;
2089 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812:
2090 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2091 "Chip Version ID:VERSION_NORMAL_TSMC_CHIP_1T1R_8812\n");
2092 break;
2093 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812:
2094 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2095 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812\n");
2096 break;
2097 case VERSION_NORMAL_TSMC_CHIP_1T1R_8812_C_CUT:
2098 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2099 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_1T1R_8812 C CUT\n");
2100 break;
2101 case VERSION_NORMAL_TSMC_CHIP_2T2R_8812_C_CUT:
2102 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2103 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_2T2R_8812 C CUT\n");
2104 break;
2105 case VERSION_TEST_CHIP_8821:
2106 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2107 "Chip Version ID: VERSION_TEST_CHIP_8821\n");
2108 break;
2109 case VERSION_NORMAL_TSMC_CHIP_8821:
2110 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2111 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 A CUT\n");
2112 break;
2113 case VERSION_NORMAL_TSMC_CHIP_8821_B_CUT:
2114 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2115 "Chip Version ID: VERSION_NORMAL_TSMC_CHIP_8821 B CUT\n");
2116 break;
2117 default:
2118 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2119 "Chip Version ID: Unknow (0x%X)\n", version);
2120 break;
2121 }
2122
2123 return version;
2124}
2125
2126static int _rtl8821ae_set_media_status(struct ieee80211_hw *hw,
2127 enum nl80211_iftype type)
2128{
2129 struct rtl_priv *rtlpriv = rtl_priv(hw);
2130 u8 bt_msr = rtl_read_byte(rtlpriv, MSR);
2131 enum led_ctl_mode ledaction = LED_CTL_NO_LINK;
2132 bt_msr &= 0xfc;
2133
2134 rtl_write_dword(rtlpriv, REG_BCN_CTRL, 0);
2135 RT_TRACE(rtlpriv, COMP_BEACON, DBG_LOUD,
2136 "clear 0x550 when set HW_VAR_MEDIA_STATUS\n");
2137
2138 if (type == NL80211_IFTYPE_UNSPECIFIED ||
2139 type == NL80211_IFTYPE_STATION) {
2140 _rtl8821ae_stop_tx_beacon(hw);
2141 _rtl8821ae_enable_bcn_sub_func(hw);
2142 } else if (type == NL80211_IFTYPE_ADHOC ||
2143 type == NL80211_IFTYPE_AP) {
2144 _rtl8821ae_resume_tx_beacon(hw);
2145 _rtl8821ae_disable_bcn_sub_func(hw);
2146 } else {
2147 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
2148 "Set HW_VAR_MEDIA_STATUS: No such media status(%x).\n",
2149 type);
2150 }
2151
2152 switch (type) {
2153 case NL80211_IFTYPE_UNSPECIFIED:
2154 bt_msr |= MSR_NOLINK;
2155 ledaction = LED_CTL_LINK;
2156 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2157 "Set Network type to NO LINK!\n");
2158 break;
2159 case NL80211_IFTYPE_ADHOC:
2160 bt_msr |= MSR_ADHOC;
2161 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2162 "Set Network type to Ad Hoc!\n");
2163 break;
2164 case NL80211_IFTYPE_STATION:
2165 bt_msr |= MSR_INFRA;
2166 ledaction = LED_CTL_LINK;
2167 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2168 "Set Network type to STA!\n");
2169 break;
2170 case NL80211_IFTYPE_AP:
2171 bt_msr |= MSR_AP;
2172 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2173 "Set Network type to AP!\n");
2174 break;
2175 default:
2176 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2177 "Network type %d not support!\n", type);
2178 return 1;
2179 }
2180
2181 rtl_write_byte(rtlpriv, (MSR), bt_msr);
2182 rtlpriv->cfg->ops->led_control(hw, ledaction);
2183 if ((bt_msr & 0xfc) == MSR_AP)
2184 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x00);
2185 else
2186 rtl_write_byte(rtlpriv, REG_BCNTCFG + 1, 0x66);
2187
2188 return 0;
2189}
2190
2191void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid)
2192{
2193 struct rtl_priv *rtlpriv = rtl_priv(hw);
2194 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2195 u32 reg_rcr = rtlpci->receive_config;
2196
2197 if (rtlpriv->psc.rfpwr_state != ERFON)
2198 return;
2199
2200 if (check_bssid) {
2201 reg_rcr |= (RCR_CBSSID_DATA | RCR_CBSSID_BCN);
2202 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_RCR,
2203 (u8 *)(&reg_rcr));
2204 _rtl8821ae_set_bcn_ctrl_reg(hw, 0, BIT(4));
2205 } else if (!check_bssid) {
2206 reg_rcr &= (~(RCR_CBSSID_DATA | RCR_CBSSID_BCN));
2207 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(4), 0);
2208 rtlpriv->cfg->ops->set_hw_reg(hw,
2209 HW_VAR_RCR, (u8 *)(&reg_rcr));
2210 }
2211}
2212
2213int rtl8821ae_set_network_type(struct ieee80211_hw *hw, enum nl80211_iftype type)
2214{
2215 struct rtl_priv *rtlpriv = rtl_priv(hw);
2216
2217 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "rtl8821ae_set_network_type!\n");
2218
2219 if (_rtl8821ae_set_media_status(hw, type))
2220 return -EOPNOTSUPP;
2221
2222 if (rtlpriv->mac80211.link_state == MAC80211_LINKED) {
2223 if (type != NL80211_IFTYPE_AP)
2224 rtl8821ae_set_check_bssid(hw, true);
2225 } else {
2226 rtl8821ae_set_check_bssid(hw, false);
2227 }
2228
2229 return 0;
2230}
2231
2232/* don't set REG_EDCA_BE_PARAM here because mac80211 will send pkt when scan */
2233void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci)
2234{
2235 struct rtl_priv *rtlpriv = rtl_priv(hw);
2236 rtl8821ae_dm_init_edca_turbo(hw);
2237 switch (aci) {
2238 case AC1_BK:
2239 rtl_write_dword(rtlpriv, REG_EDCA_BK_PARAM, 0xa44f);
2240 break;
2241 case AC0_BE:
2242 /* rtl_write_dword(rtlpriv, REG_EDCA_BE_PARAM, u4b_ac_param); */
2243 break;
2244 case AC2_VI:
2245 rtl_write_dword(rtlpriv, REG_EDCA_VI_PARAM, 0x5e4322);
2246 break;
2247 case AC3_VO:
2248 rtl_write_dword(rtlpriv, REG_EDCA_VO_PARAM, 0x2f3222);
2249 break;
2250 default:
2251 RT_ASSERT(false, "invalid aci: %d !\n", aci);
2252 break;
2253 }
2254}
2255
2256static void rtl8821ae_clear_interrupt(struct ieee80211_hw *hw)
2257{
2258 struct rtl_priv *rtlpriv = rtl_priv(hw);
2259 u32 tmp;
2260 tmp = rtl_read_dword(rtlpriv, REG_HISR);
2261 /*printk("clear interrupt first:\n");
2262 printk("0x%x = 0x%08x\n",REG_HISR, tmp);*/
2263 rtl_write_dword(rtlpriv, REG_HISR, tmp);
2264
2265 tmp = rtl_read_dword(rtlpriv, REG_HISRE);
2266 /*printk("0x%x = 0x%08x\n",REG_HISRE, tmp);*/
2267 rtl_write_dword(rtlpriv, REG_HISRE, tmp);
2268
2269 tmp = rtl_read_dword(rtlpriv, REG_HSISR);
2270 /*printk("0x%x = 0x%08x\n",REG_HSISR, tmp);*/
2271 rtl_write_dword(rtlpriv, REG_HSISR, tmp);
2272}
2273
2274void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw)
2275{
2276 struct rtl_priv *rtlpriv = rtl_priv(hw);
2277 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2278
2279 rtl8821ae_clear_interrupt(hw);/*clear it here first*/
2280
2281 rtl_write_dword(rtlpriv, REG_HIMR, rtlpci->irq_mask[0] & 0xFFFFFFFF);
2282 rtl_write_dword(rtlpriv, REG_HIMRE, rtlpci->irq_mask[1] & 0xFFFFFFFF);
2283 rtlpci->irq_enabled = true;
2284 /* there are some C2H CMDs have been sent before
2285 system interrupt is enabled, e.g., C2H, CPWM.
2286 *So we need to clear all C2H events that FW has
2287 notified, otherwise FW won't schedule any commands anymore.
2288 */
2289 /* rtl_write_byte(rtlpriv, REG_C2HEVT_CLEAR, 0); */
2290 /*enable system interrupt*/
2291 rtl_write_dword(rtlpriv, REG_HSIMR, rtlpci->sys_irq_mask & 0xFFFFFFFF);
2292}
2293
2294void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw)
2295{
2296 struct rtl_priv *rtlpriv = rtl_priv(hw);
2297 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2298
2299 rtl_write_dword(rtlpriv, REG_HIMR, IMR_DISABLED);
2300 rtl_write_dword(rtlpriv, REG_HIMRE, IMR_DISABLED);
2301 rtlpci->irq_enabled = false;
2302 /*synchronize_irq(rtlpci->pdev->irq);*/
2303}
2304
2305static void _rtl8821ae_clear_pci_pme_status(struct ieee80211_hw *hw)
2306{
2307 struct rtl_priv *rtlpriv = rtl_priv(hw);
2308 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2309 u16 cap_hdr;
2310 u8 cap_pointer;
2311 u8 cap_id = 0xff;
2312 u8 pmcs_reg;
2313 u8 cnt = 0;
2314
2315 /* Get the Capability pointer first,
2316 * the Capability Pointer is located at
2317 * offset 0x34 from the Function Header */
2318
2319 pci_read_config_byte(rtlpci->pdev, 0x34, &cap_pointer);
2320 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2321 "PCI configration 0x34 = 0x%2x\n", cap_pointer);
2322
2323 do {
2324 pci_read_config_word(rtlpci->pdev, cap_pointer, &cap_hdr);
2325 cap_id = cap_hdr & 0xFF;
2326
2327 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2328 "in pci configration, cap_pointer%x = %x\n",
2329 cap_pointer, cap_id);
2330
2331 if (cap_id == 0x01) {
2332 break;
2333 } else {
2334 /* point to next Capability */
2335 cap_pointer = (cap_hdr >> 8) & 0xFF;
2336 /* 0: end of pci capability, 0xff: invalid value */
2337 if (cap_pointer == 0x00 || cap_pointer == 0xff) {
2338 cap_id = 0xff;
2339 break;
2340 }
2341 }
2342 } while (cnt++ < 200);
2343
2344 if (cap_id == 0x01) {
2345 /* Get the PM CSR (Control/Status Register),
2346 * The PME_Status is located at PM Capatibility offset 5, bit 7
2347 */
2348 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5, &pmcs_reg);
2349
2350 if (pmcs_reg & BIT(7)) {
2351 /* PME event occured, clear the PM_Status by write 1 */
2352 pmcs_reg = pmcs_reg | BIT(7);
2353
2354 pci_write_config_byte(rtlpci->pdev, cap_pointer + 5,
2355 pmcs_reg);
2356 /* Read it back to check */
2357 pci_read_config_byte(rtlpci->pdev, cap_pointer + 5,
2358 &pmcs_reg);
2359 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2360 "Clear PME status 0x%2x to 0x%2x\n",
2361 cap_pointer + 5, pmcs_reg);
2362 } else {
2363 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
2364 "PME status(0x%2x) = 0x%2x\n",
2365 cap_pointer + 5, pmcs_reg);
2366 }
2367 } else {
2368 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING,
2369 "Cannot find PME Capability\n");
2370 }
2371}
2372
2373void rtl8821ae_card_disable(struct ieee80211_hw *hw)
2374{
2375 struct rtl_priv *rtlpriv = rtl_priv(hw);
2376 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2377 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv);
2378 struct rtl_mac *mac = rtl_mac(rtlpriv);
2379 enum nl80211_iftype opmode;
2380 bool support_remote_wakeup;
2381 u8 tmp;
2382 u32 count = 0;
2383
2384 rtlpriv->cfg->ops->get_hw_reg(hw, HAL_DEF_WOWLAN,
2385 (u8 *)(&support_remote_wakeup));
2386
2387 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
2388
2389 if (!(support_remote_wakeup && mac->opmode == NL80211_IFTYPE_STATION)
2390 || !rtlhal->enter_pnp_sleep) {
2391 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Normal Power off\n");
2392 mac->link_state = MAC80211_NOLINK;
2393 opmode = NL80211_IFTYPE_UNSPECIFIED;
2394 _rtl8821ae_set_media_status(hw, opmode);
2395 _rtl8821ae_poweroff_adapter(hw);
2396 } else {
2397 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Wowlan Supported.\n");
2398 /* 3 <1> Prepare for configuring wowlan related infomations */
2399 /* Clear Fw WoWLAN event. */
2400 rtl_write_byte(rtlpriv, REG_MCUTST_WOWLAN, 0x0);
2401
2402#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
2403 rtl8821ae_set_fw_related_for_wowlan(hw, true);
2404#endif
2405 /* Dynamically adjust Tx packet boundary
2406 * for download reserved page packet.
2407 * reserve 30 pages for rsvd page */
2408 if (_rtl8821ae_dynamic_rqpn(hw, 0xE0, 0x3, 0x80c20d0d))
2409 rtlhal->re_init_llt_table = true;
2410
2411 /* 3 <2> Set Fw releted H2C cmd. */
2412
2413 /* Set WoWLAN related security information. */
2414 rtl8821ae_set_fw_global_info_cmd(hw);
2415
2416 _rtl8821ae_download_rsvd_page(hw, true);
2417
2418 /* Just enable AOAC related functions when we connect to AP. */
2419 printk("mac->link_state = %d\n", mac->link_state);
2420 if (mac->link_state >= MAC80211_LINKED &&
2421 mac->opmode == NL80211_IFTYPE_STATION) {
2422 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_AID, NULL);
2423 rtl8821ae_set_fw_media_status_rpt_cmd(hw,
2424 RT_MEDIA_CONNECT);
2425
2426 rtl8821ae_set_fw_wowlan_mode(hw, true);
2427 /* Enable Fw Keep alive mechanism. */
2428 rtl8821ae_set_fw_keep_alive_cmd(hw, true);
2429
2430 /* Enable disconnect decision control. */
2431 rtl8821ae_set_fw_disconnect_decision_ctrl_cmd(hw, true);
2432 }
2433
2434 /* 3 <3> Hw Configutations */
2435
2436 /* Wait untill Rx DMA Finished before host sleep.
2437 * FW Pause Rx DMA may happens when received packet doing dma.
2438 */
2439 rtl_write_byte(rtlpriv, REG_RXDMA_CONTROL, BIT(2));
2440
2441 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2442 count = 0;
2443 while (!(tmp & BIT(1)) && (count++ < 100)) {
2444 udelay(10);
2445 tmp = rtl_read_byte(rtlpriv, REG_RXDMA_CONTROL);
2446 }
2447 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2448 "Wait Rx DMA Finished before host sleep. count=%d\n",
2449 count);
2450
2451 /* reset trx ring */
2452 rtlpriv->intf_ops->reset_trx_ring(hw);
2453
2454 rtl_write_byte(rtlpriv, REG_APS_FSMCO + 1, 0x0);
2455
2456 _rtl8821ae_clear_pci_pme_status(hw);
2457 tmp = rtl_read_byte(rtlpriv, REG_SYS_CLKR);
2458 rtl_write_byte(rtlpriv, REG_SYS_CLKR, tmp | BIT(3));
2459 /* prevent 8051 to be reset by PERST */
2460 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x20);
2461 rtl_write_byte(rtlpriv, REG_RSV_CTRL, 0x60);
2462 }
2463
2464 if (rtlpriv->rtlhal.driver_is_goingto_unload ||
2465 ppsc->rfoff_reason > RF_CHANGE_BY_PS)
2466 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF);
2467 /* For wowlan+LPS+32k. */
2468 if (support_remote_wakeup && rtlhal->enter_pnp_sleep) {
2469 /* Set the WoWLAN related function control enable.
2470 * It should be the last H2C cmd in the WoWLAN flow. */
2471 rtl8821ae_set_fw_remote_wake_ctrl_cmd(hw, 1);
2472
2473 /* Stop Pcie Interface Tx DMA. */
2474 rtl_write_byte(rtlpriv, REG_PCIE_CTRL_REG + 1, 0xff);
2475 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Stop PCIE Tx DMA.\n");
2476
2477 /* Wait for TxDMA idle. */
2478 count = 0;
2479 do {
2480 tmp = rtl_read_byte(rtlpriv, REG_PCIE_CTRL_REG);
2481 udelay(10);
2482 count++;
2483 } while ((tmp != 0) && (count < 100));
2484 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2485 "Wait Tx DMA Finished before host sleep. count=%d\n",
2486 count);
2487
2488 if (rtlhal->hw_rof_enable) {
2489 printk("hw_rof_enable\n");
2490 tmp = rtl_read_byte(rtlpriv, REG_HSISR + 3);
2491 rtl_write_byte(rtlpriv, REG_HSISR + 3, tmp | BIT(1));
2492 }
2493 }
2494 /* after power off we should do iqk again */
2495 rtlpriv->phy.iqk_initialized = false;
2496}
2497
2498void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
2499 u32 *p_inta, u32 *p_intb)
2500{
2501 struct rtl_priv *rtlpriv = rtl_priv(hw);
2502 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2503
2504 *p_inta = rtl_read_dword(rtlpriv, ISR) & rtlpci->irq_mask[0];
2505 rtl_write_dword(rtlpriv, ISR, *p_inta);
2506
2507 *p_intb = rtl_read_dword(rtlpriv, REG_HISRE) & rtlpci->irq_mask[1];
2508 rtl_write_dword(rtlpriv, REG_HISRE, *p_intb);
2509}
2510
2511void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw)
2512{
2513 struct rtl_priv *rtlpriv = rtl_priv(hw);
2514 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2515 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2516 u16 bcn_interval, atim_window;
2517
2518 bcn_interval = mac->beacon_interval;
2519 atim_window = 2; /*FIX MERGE */
2520 rtl8821ae_disable_interrupt(hw);
2521 rtl_write_word(rtlpriv, REG_ATIMWND, atim_window);
2522 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2523 rtl_write_word(rtlpriv, REG_BCNTCFG, 0x660f);
2524 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_CCK, 0x18);
2525 rtl_write_byte(rtlpriv, REG_RXTSF_OFFSET_OFDM, 0x18);
2526 rtl_write_byte(rtlpriv, 0x606, 0x30);
2527 rtlpci->reg_bcn_ctrl_val |= BIT(3);
2528 rtl_write_byte(rtlpriv, REG_BCN_CTRL, (u8)rtlpci->reg_bcn_ctrl_val);
2529 rtl8821ae_enable_interrupt(hw);
2530}
2531
2532void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw)
2533{
2534 struct rtl_priv *rtlpriv = rtl_priv(hw);
2535 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
2536 u16 bcn_interval = mac->beacon_interval;
2537
2538 RT_TRACE(rtlpriv, COMP_BEACON, DBG_DMESG,
2539 "beacon_interval:%d\n", bcn_interval);
2540 rtl8821ae_disable_interrupt(hw);
2541 rtl_write_word(rtlpriv, REG_BCN_INTERVAL, bcn_interval);
2542 rtl8821ae_enable_interrupt(hw);
2543}
2544
2545void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
2546 u32 add_msr, u32 rm_msr)
2547{
2548 struct rtl_priv *rtlpriv = rtl_priv(hw);
2549 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2550
2551 RT_TRACE(rtlpriv, COMP_INTR, DBG_LOUD,
2552 "add_msr:%x, rm_msr:%x\n", add_msr, rm_msr);
2553
2554 if (add_msr)
2555 rtlpci->irq_mask[0] |= add_msr;
2556 if (rm_msr)
2557 rtlpci->irq_mask[0] &= (~rm_msr);
2558 rtl8821ae_disable_interrupt(hw);
2559 rtl8821ae_enable_interrupt(hw);
2560}
2561
2562static u8 _rtl8821ae_get_chnl_group(u8 chnl)
2563{
2564 u8 group = 0;
2565
2566 if (chnl <= 14) {
2567 if (1 <= chnl && chnl <= 2)
2568 group = 0;
2569 else if (3 <= chnl && chnl <= 5)
2570 group = 1;
2571 else if (6 <= chnl && chnl <= 8)
2572 group = 2;
2573 else if (9 <= chnl && chnl <= 11)
2574 group = 3;
2575 else /*if (12 <= chnl && chnl <= 14)*/
2576 group = 4;
2577 } else {
2578 if (36 <= chnl && chnl <= 42)
2579 group = 0;
2580 else if (44 <= chnl && chnl <= 48)
2581 group = 1;
2582 else if (50 <= chnl && chnl <= 58)
2583 group = 2;
2584 else if (60 <= chnl && chnl <= 64)
2585 group = 3;
2586 else if (100 <= chnl && chnl <= 106)
2587 group = 4;
2588 else if (108 <= chnl && chnl <= 114)
2589 group = 5;
2590 else if (116 <= chnl && chnl <= 122)
2591 group = 6;
2592 else if (124 <= chnl && chnl <= 130)
2593 group = 7;
2594 else if (132 <= chnl && chnl <= 138)
2595 group = 8;
2596 else if (140 <= chnl && chnl <= 144)
2597 group = 9;
2598 else if (149 <= chnl && chnl <= 155)
2599 group = 10;
2600 else if (157 <= chnl && chnl <= 161)
2601 group = 11;
2602 else if (165 <= chnl && chnl <= 171)
2603 group = 12;
2604 else if (173 <= chnl && chnl <= 177)
2605 group = 13;
2606 else
2607 /*RT_TRACE(rtlpriv, COMP_EFUSE,DBG_LOUD,
2608 "5G, Channel %d in Group not found\n",chnl);*/
2609 RT_ASSERT(!COMP_EFUSE,
2610 "5G, Channel %d in Group not found\n", chnl);
2611 }
2612 return group;
2613}
2614
2615static void _rtl8821ae_read_power_value_fromprom(struct ieee80211_hw *hw,
2616 struct txpower_info_2g *pwrinfo24g,
2617 struct txpower_info_5g *pwrinfo5g,
2618 bool autoload_fail,
2619 u8 *hwinfo)
2620{
2621 struct rtl_priv *rtlpriv = rtl_priv(hw);
2622 u32 rfPath, eeAddr = EEPROM_TX_PWR_INX, group, TxCount = 0;
2623
2624 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2625 "hal_ReadPowerValueFromPROM8821ae(): hwinfo[0x%x]=0x%x\n",
2626 (eeAddr+1), hwinfo[eeAddr+1]);
2627 if (0xFF == hwinfo[eeAddr+1]) /*YJ,add,120316*/
2628 autoload_fail = true;
2629
2630 if (autoload_fail) {
2631 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2632 "auto load fail : Use Default value!\n");
2633 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
2634 /*2.4G default value*/
2635 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2636 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D;
2637 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
2638 }
2639 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2640 if (TxCount == 0) {
2641 pwrinfo24g->bw20_diff[rfPath][0] = 0x02;
2642 pwrinfo24g->ofdm_diff[rfPath][0] = 0x04;
2643 } else {
2644 pwrinfo24g->bw20_diff[rfPath][TxCount] = 0xFE;
2645 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0xFE;
2646 pwrinfo24g->cck_diff[rfPath][TxCount] = 0xFE;
2647 pwrinfo24g->ofdm_diff[rfPath][TxCount] = 0xFE;
2648 }
2649 }
2650 /*5G default value*/
2651 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++)
2652 pwrinfo5g->index_bw40_base[rfPath][group] = 0x2A;
2653
2654 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2655 if (TxCount == 0) {
2656 pwrinfo5g->ofdm_diff[rfPath][0] = 0x04;
2657 pwrinfo5g->bw20_diff[rfPath][0] = 0x00;
2658 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
2659 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
2660 } else {
2661 pwrinfo5g->ofdm_diff[rfPath][0] = 0xFE;
2662 pwrinfo5g->bw20_diff[rfPath][0] = 0xFE;
2663 pwrinfo5g->bw40_diff[rfPath][0] = 0xFE;
2664 pwrinfo5g->bw80_diff[rfPath][0] = 0xFE;
2665 pwrinfo5g->bw160_diff[rfPath][0] = 0xFE;
2666 }
2667 }
2668 }
2669 return;
2670 }
2671
2672 rtl_priv(hw)->efuse.txpwr_fromeprom = true;
2673
2674 for (rfPath = 0 ; rfPath < MAX_RF_PATH ; rfPath++) {
2675 /*2.4G default value*/
2676 for (group = 0 ; group < MAX_CHNL_GROUP_24G; group++) {
2677 pwrinfo24g->index_cck_base[rfPath][group] = hwinfo[eeAddr++];
2678 if (pwrinfo24g->index_cck_base[rfPath][group] == 0xFF)
2679 pwrinfo24g->index_cck_base[rfPath][group] = 0x2D;
2680 }
2681 for (group = 0 ; group < MAX_CHNL_GROUP_24G - 1; group++) {
2682 pwrinfo24g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
2683 if (pwrinfo24g->index_bw40_base[rfPath][group] == 0xFF)
2684 pwrinfo24g->index_bw40_base[rfPath][group] = 0x2D;
2685 }
2686 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2687 if (TxCount == 0) {
2688 pwrinfo24g->bw40_diff[rfPath][TxCount] = 0;
2689 /*bit sign number to 8 bit sign number*/
2690 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2691 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3))
2692 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2693 /*bit sign number to 8 bit sign number*/
2694 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2695 if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3))
2696 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2697
2698 pwrinfo24g->cck_diff[rfPath][TxCount] = 0;
2699 eeAddr++;
2700 } else {
2701 pwrinfo24g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr]&0xf0) >> 4;
2702 if (pwrinfo24g->bw40_diff[rfPath][TxCount] & BIT(3))
2703 pwrinfo24g->bw40_diff[rfPath][TxCount] |= 0xF0;
2704
2705 pwrinfo24g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2706 if (pwrinfo24g->bw20_diff[rfPath][TxCount] & BIT(3))
2707 pwrinfo24g->bw20_diff[rfPath][TxCount] |= 0xF0;
2708
2709 eeAddr++;
2710
2711 pwrinfo24g->ofdm_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2712 if (pwrinfo24g->ofdm_diff[rfPath][TxCount] & BIT(3))
2713 pwrinfo24g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2714
2715 pwrinfo24g->cck_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2716 if (pwrinfo24g->cck_diff[rfPath][TxCount] & BIT(3))
2717 pwrinfo24g->cck_diff[rfPath][TxCount] |= 0xF0;
2718
2719 eeAddr++;
2720 }
2721 }
2722
2723 /*5G default value*/
2724 for (group = 0 ; group < MAX_CHNL_GROUP_5G; group++) {
2725 pwrinfo5g->index_bw40_base[rfPath][group] = hwinfo[eeAddr++];
2726 if (pwrinfo5g->index_bw40_base[rfPath][group] == 0xFF)
2727 pwrinfo5g->index_bw40_base[rfPath][group] = 0xFE;
2728 }
2729
2730 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2731 if (TxCount == 0) {
2732 pwrinfo5g->bw40_diff[rfPath][TxCount] = 0;
2733
2734 pwrinfo5g->bw20_diff[rfPath][0] = (hwinfo[eeAddr] & 0xf0) >> 4;
2735 if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2736 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2737
2738 pwrinfo5g->ofdm_diff[rfPath][0] = (hwinfo[eeAddr] & 0x0f);
2739 if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2740 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2741
2742 eeAddr++;
2743 } else {
2744 pwrinfo5g->bw40_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2745 if (pwrinfo5g->bw40_diff[rfPath][TxCount] & BIT(3))
2746 pwrinfo5g->bw40_diff[rfPath][TxCount] |= 0xF0;
2747
2748 pwrinfo5g->bw20_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2749 if (pwrinfo5g->bw20_diff[rfPath][TxCount] & BIT(3))
2750 pwrinfo5g->bw20_diff[rfPath][TxCount] |= 0xF0;
2751
2752 eeAddr++;
2753 }
2754 }
2755
2756 pwrinfo5g->ofdm_diff[rfPath][1] = (hwinfo[eeAddr] & 0xf0) >> 4;
2757 pwrinfo5g->ofdm_diff[rfPath][2] = (hwinfo[eeAddr] & 0x0f);
2758
2759 eeAddr++;
2760
2761 pwrinfo5g->ofdm_diff[rfPath][3] = (hwinfo[eeAddr] & 0x0f);
2762
2763 eeAddr++;
2764
2765 for (TxCount = 1; TxCount < MAX_TX_COUNT; TxCount++) {
2766 if (pwrinfo5g->ofdm_diff[rfPath][TxCount] & BIT(3))
2767 pwrinfo5g->ofdm_diff[rfPath][TxCount] |= 0xF0;
2768 }
2769 for (TxCount = 0; TxCount < MAX_TX_COUNT; TxCount++) {
2770 pwrinfo5g->bw80_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0xf0) >> 4;
2771 /* 4bit sign number to 8 bit sign number */
2772 if (pwrinfo5g->bw80_diff[rfPath][TxCount] & BIT(3))
2773 pwrinfo5g->bw80_diff[rfPath][TxCount] |= 0xF0;
2774 /* 4bit sign number to 8 bit sign number */
2775 pwrinfo5g->bw160_diff[rfPath][TxCount] = (hwinfo[eeAddr] & 0x0f);
2776 if (pwrinfo5g->bw160_diff[rfPath][TxCount] & BIT(3))
2777 pwrinfo5g->bw160_diff[rfPath][TxCount] |= 0xF0;
2778
2779 eeAddr++;
2780 }
2781 }
2782}
2783#if 0
2784static void _rtl8812ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2785 bool autoload_fail,
2786 u8 *hwinfo)
2787{
2788 struct rtl_priv *rtlpriv = rtl_priv(hw);
2789 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2790 struct txpower_info_2g pwrinfo24g;
2791 struct txpower_info_5g pwrinfo5g;
2792 u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
2793 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
2794 56, 58, 60, 62, 64, 100, 102, 104, 106,
2795 108, 110, 112, 114, 116, 118, 120, 122,
2796 124, 126, 128, 130, 132, 134, 136, 138,
2797 140, 142, 144, 149, 151, 153, 155, 157,
2798 159, 161, 163, 165, 167, 168, 169, 171, 173, 175, 177};
2799 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171};
2800 u8 rf_path, index;
2801 u8 i;
2802
2803 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2804 &pwrinfo5g, autoload_fail, hwinfo);
2805
2806 for (rf_path = 0; rf_path < 2; rf_path++) {
2807 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2808 index = _rtl8821ae_get_chnl_group(i + 1);
2809
2810 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2811 rtlefuse->txpwrlevel_cck[rf_path][i] =
2812 pwrinfo24g.index_cck_base[rf_path][5];
2813 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2814 pwrinfo24g.index_bw40_base[rf_path][index];
2815 } else {
2816 rtlefuse->txpwrlevel_cck[rf_path][i] =
2817 pwrinfo24g.index_cck_base[rf_path][index];
2818 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2819 pwrinfo24g.index_bw40_base[rf_path][index];
2820 }
2821 }
2822
2823 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2824 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2825 rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2826 pwrinfo5g.index_bw40_base[rf_path][index];
2827 }
2828 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2829 u8 upper, lower;
2830 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2831 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2832 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2833
2834 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2835 }
2836 for (i = 0; i < MAX_TX_COUNT; i++) {
2837 rtlefuse->txpwr_cckdiff[rf_path][i] =
2838 pwrinfo24g.cck_diff[rf_path][i];
2839 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2840 pwrinfo24g.ofdm_diff[rf_path][i];
2841 rtlefuse->txpwr_ht20diff[rf_path][i] =
2842 pwrinfo24g.bw20_diff[rf_path][i];
2843 rtlefuse->txpwr_ht40diff[rf_path][i] =
2844 pwrinfo24g.bw40_diff[rf_path][i];
2845
2846 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2847 pwrinfo5g.ofdm_diff[rf_path][i];
2848 rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2849 pwrinfo5g.bw20_diff[rf_path][i];
2850 rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2851 pwrinfo5g.bw40_diff[rf_path][i];
2852 rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2853 pwrinfo5g.bw80_diff[rf_path][i];
2854 }
2855 }
2856
2857 if (!autoload_fail) {
2858 rtlefuse->eeprom_regulatory =
2859 hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;/*bit0~2*/
2860 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2861 rtlefuse->eeprom_regulatory = 0;
2862 } else {
2863 rtlefuse->eeprom_regulatory = 0;
2864 }
2865
2866 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2867 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2868}
2869#endif
2870static void _rtl8821ae_read_txpower_info_from_hwpg(struct ieee80211_hw *hw,
2871 bool autoload_fail,
2872 u8 *hwinfo)
2873{
2874 struct rtl_priv *rtlpriv = rtl_priv(hw);
2875 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2876 struct txpower_info_2g pwrinfo24g;
2877 struct txpower_info_5g pwrinfo5g;
2878 u8 channel5g[CHANNEL_MAX_NUMBER_5G] = {
2879 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
2880 56, 58, 60, 62, 64, 100, 102, 104, 106,
2881 108, 110, 112, 114, 116, 118, 120, 122,
2882 124, 126, 128, 130, 132, 134, 136, 138,
2883 140, 142, 144, 149, 151, 153, 155, 157,
2884 159, 161, 163, 165, 167, 168, 169, 171,
2885 173, 175, 177};
2886 u8 channel5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
2887 42, 58, 106, 122, 138, 155, 171};
2888 u8 rf_path, index;
2889 u8 i;
2890
2891 _rtl8821ae_read_power_value_fromprom(hw, &pwrinfo24g,
2892 &pwrinfo5g, autoload_fail, hwinfo);
2893
2894 for (rf_path = 0; rf_path < 2; rf_path++) {
2895 for (i = 0; i < CHANNEL_MAX_NUMBER_2G; i++) {
2896 index = _rtl8821ae_get_chnl_group(i + 1);
2897
2898 if (i == CHANNEL_MAX_NUMBER_2G - 1) {
2899 rtlefuse->txpwrlevel_cck[rf_path][i] =
2900 pwrinfo24g.index_cck_base[rf_path][5];
2901 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2902 pwrinfo24g.index_bw40_base[rf_path][index];
2903 } else {
2904 rtlefuse->txpwrlevel_cck[rf_path][i] =
2905 pwrinfo24g.index_cck_base[rf_path][index];
2906 rtlefuse->txpwrlevel_ht40_1s[rf_path][i] =
2907 pwrinfo24g.index_bw40_base[rf_path][index];
2908 }
2909 }
2910
2911 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; i++) {
2912 index = _rtl8821ae_get_chnl_group(channel5g[i]);
2913 rtlefuse->txpwr_5g_bw40base[rf_path][i] =
2914 pwrinfo5g.index_bw40_base[rf_path][index];
2915 }
2916 for (i = 0; i < CHANNEL_MAX_NUMBER_5G_80M; i++) {
2917 u8 upper, lower;
2918 index = _rtl8821ae_get_chnl_group(channel5g_80m[i]);
2919 upper = pwrinfo5g.index_bw40_base[rf_path][index];
2920 lower = pwrinfo5g.index_bw40_base[rf_path][index + 1];
2921
2922 rtlefuse->txpwr_5g_bw80base[rf_path][i] = (upper + lower) / 2;
2923 }
2924 for (i = 0; i < MAX_TX_COUNT; i++) {
2925 rtlefuse->txpwr_cckdiff[rf_path][i] =
2926 pwrinfo24g.cck_diff[rf_path][i];
2927 rtlefuse->txpwr_legacyhtdiff[rf_path][i] =
2928 pwrinfo24g.ofdm_diff[rf_path][i];
2929 rtlefuse->txpwr_ht20diff[rf_path][i] =
2930 pwrinfo24g.bw20_diff[rf_path][i];
2931 rtlefuse->txpwr_ht40diff[rf_path][i] =
2932 pwrinfo24g.bw40_diff[rf_path][i];
2933
2934 rtlefuse->txpwr_5g_ofdmdiff[rf_path][i] =
2935 pwrinfo5g.ofdm_diff[rf_path][i];
2936 rtlefuse->txpwr_5g_bw20diff[rf_path][i] =
2937 pwrinfo5g.bw20_diff[rf_path][i];
2938 rtlefuse->txpwr_5g_bw40diff[rf_path][i] =
2939 pwrinfo5g.bw40_diff[rf_path][i];
2940 rtlefuse->txpwr_5g_bw80diff[rf_path][i] =
2941 pwrinfo5g.bw80_diff[rf_path][i];
2942 }
2943 }
2944 /*bit0~2*/
2945 if (!autoload_fail) {
2946 rtlefuse->eeprom_regulatory = hwinfo[EEPROM_RF_BOARD_OPTION] & 0x07;
2947 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xFF)
2948 rtlefuse->eeprom_regulatory = 0;
2949 } else {
2950 rtlefuse->eeprom_regulatory = 0;
2951 }
2952
2953 RTPRINT(rtlpriv, FINIT, INIT_TXPOWER,
2954 "eeprom_regulatory = 0x%x\n", rtlefuse->eeprom_regulatory);
2955}
2956
2957static void _rtl8812ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2958 bool autoload_fail)
2959{
2960 struct rtl_priv *rtlpriv = rtl_priv(hw);
2961 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2962
2963 if (!autoload_fail) {
2964 rtlhal->pa_type_2g = hwinfo[0xBC];
2965 rtlhal->lna_type_2g = hwinfo[0xBD];
2966 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
2967 rtlhal->pa_type_2g = 0;
2968 rtlhal->lna_type_2g = 0;
2969 }
2970 rtlhal->external_pa_2g = ((rtlhal->pa_type_2g & BIT(5)) &&
2971 (rtlhal->pa_type_2g & BIT(4))) ?
2972 1 : 0;
2973 rtlhal->external_lna_2g = ((rtlhal->lna_type_2g & BIT(7)) &&
2974 (rtlhal->lna_type_2g & BIT(3))) ?
2975 1 : 0;
2976
2977 rtlhal->pa_type_5g = hwinfo[0xBC];
2978 rtlhal->lna_type_5g = hwinfo[0xBF];
2979 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
2980 rtlhal->pa_type_5g = 0;
2981 rtlhal->lna_type_5g = 0;
2982 }
2983 rtlhal->external_pa_5g = ((rtlhal->pa_type_5g & BIT(1)) &&
2984 (rtlhal->pa_type_5g & BIT(0))) ?
2985 1 : 0;
2986 rtlhal->external_lna_5g = ((rtlhal->lna_type_5g & BIT(7)) &&
2987 (rtlhal->lna_type_5g & BIT(3))) ?
2988 1 : 0;
2989 } else {
2990 rtlhal->external_pa_2g = 0;
2991 rtlhal->external_lna_2g = 0;
2992 rtlhal->external_pa_5g = 0;
2993 rtlhal->external_lna_5g = 0;
2994 }
2995}
2996
2997static void _rtl8821ae_read_pa_type(struct ieee80211_hw *hw, u8 *hwinfo,
2998 bool autoload_fail)
2999{
3000 struct rtl_priv *rtlpriv = rtl_priv(hw);
3001 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
3002
3003 if (!autoload_fail) {
3004 rtlhal->pa_type_2g = hwinfo[0xBC];
3005 rtlhal->lna_type_2g = hwinfo[0xBD];
3006 if (rtlhal->pa_type_2g == 0xFF && rtlhal->lna_type_2g == 0xFF) {
3007 rtlhal->pa_type_2g = 0;
3008 rtlhal->lna_type_2g = 0;
3009 }
3010 rtlhal->external_pa_2g = (rtlhal->pa_type_2g & BIT(5)) ? 1 : 0;
3011 rtlhal->external_lna_2g = (rtlhal->lna_type_2g & BIT(7)) ? 1 : 0;
3012
3013 rtlhal->pa_type_5g = hwinfo[0xBC];
3014 rtlhal->lna_type_5g = hwinfo[0xBF];
3015 if (rtlhal->pa_type_5g == 0xFF && rtlhal->lna_type_5g == 0xFF) {
3016 rtlhal->pa_type_5g = 0;
3017 rtlhal->lna_type_5g = 0;
3018 }
3019 rtlhal->external_pa_5g = (rtlhal->pa_type_5g & BIT(1)) ? 1 : 0;
3020 rtlhal->external_lna_5g = (rtlhal->lna_type_5g & BIT(7)) ? 1 : 0;
3021 } else {
3022 rtlhal->external_pa_2g = 0;
3023 rtlhal->external_lna_2g = 0;
3024 rtlhal->external_pa_5g = 0;
3025 rtlhal->external_lna_5g = 0;
3026 }
3027}
3028
3029static void _rtl8821ae_read_rfe_type(struct ieee80211_hw *hw, u8 *hwinfo,
3030 bool autoload_fail)
3031{
3032 struct rtl_priv *rtlpriv = rtl_priv(hw);
3033 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
3034
3035 if (!autoload_fail) {
3036 if (hwinfo[EEPROM_RFE_OPTION] & BIT(7)) {
3037 if (rtlhal->external_lna_5g) {
3038 if (rtlhal->external_pa_5g) {
3039 if (rtlhal->external_lna_2g &&
3040 rtlhal->external_pa_2g)
3041 rtlhal->rfe_type = 3;
3042 else
3043 rtlhal->rfe_type = 0;
3044 } else {
3045 rtlhal->rfe_type = 2;
3046 }
3047 } else {
3048 rtlhal->rfe_type = 4;
3049 }
3050 } else {
3051 rtlhal->rfe_type = hwinfo[EEPROM_RFE_OPTION] & 0x3F;
3052
3053 if (rtlhal->rfe_type == 4 &&
3054 (rtlhal->external_pa_5g ||
3055 rtlhal->external_pa_2g ||
3056 rtlhal->external_lna_5g ||
3057 rtlhal->external_lna_2g)) {
3058 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
3059 rtlhal->rfe_type = 2;
3060 }
3061 }
3062 } else {
3063 rtlhal->rfe_type = 0x04;
3064 }
3065
3066 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3067 "RFE Type: 0x%2x\n", rtlhal->rfe_type);
3068}
3069
3070static void _rtl8812ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3071 bool auto_load_fail, u8 *hwinfo)
3072{
3073 struct rtl_priv *rtlpriv = rtl_priv(hw);
3074 u8 value;
3075
3076 if (!auto_load_fail) {
3077 value = *(u8 *)&hwinfo[EEPROM_RF_BOARD_OPTION];
3078 if (((value & 0xe0) >> 5) == 0x1)
3079 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3080 else
3081 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3082 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3083
3084 value = hwinfo[EEPROM_RF_BT_SETTING];
3085 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3086 } else {
3087 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3088 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8812A;
3089 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3090 }
3091 /*move BT_InitHalVars() to init_sw_vars*/
3092}
3093
3094static void _rtl8821ae_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
3095 bool auto_load_fail, u8 *hwinfo)
3096{
3097 struct rtl_priv *rtlpriv = rtl_priv(hw);
3098 u8 value;
3099 u32 tmpu_32;
3100
3101 if (!auto_load_fail) {
3102 tmpu_32 = rtl_read_dword(rtlpriv, REG_MULTI_FUNC_CTRL);
3103 if (tmpu_32 & BIT(18))
3104 rtlpriv->btcoexist.btc_info.btcoexist = 1;
3105 else
3106 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3107 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3108
3109 value = hwinfo[EEPROM_RF_BT_SETTING];
3110 rtlpriv->btcoexist.btc_info.ant_num = (value & 0x1);
3111 } else {
3112 rtlpriv->btcoexist.btc_info.btcoexist = 0;
3113 rtlpriv->btcoexist.btc_info.bt_type = BT_RTL8821A;
3114 rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
3115 }
3116 /*move BT_InitHalVars() to init_sw_vars*/
3117}
3118
3119static void _rtl8821ae_read_adapter_info(struct ieee80211_hw *hw, bool b_pseudo_test)
3120{
3121 struct rtl_priv *rtlpriv = rtl_priv(hw);
3122 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3123 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3124 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3125 u16 i, usvalue;
3126 u8 hwinfo[HWSET_MAX_SIZE];
3127 u16 eeprom_id;
3128
3129 if (b_pseudo_test) {
3130 ;/* need add */
3131 }
3132
3133 if (rtlefuse->epromtype == EEPROM_BOOT_EFUSE) {
3134 rtl_efuse_shadow_map_update(hw);
3135 memcpy(hwinfo, &rtlefuse->efuse_map[EFUSE_INIT_MAP][0],
3136 HWSET_MAX_SIZE);
3137 } else if (rtlefuse->epromtype == EEPROM_93C46) {
3138 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3139 "RTL819X Not boot from eeprom, check it !!");
3140 }
3141
3142 RT_PRINT_DATA(rtlpriv, COMP_INIT, DBG_DMESG, "MAP\n",
3143 hwinfo, HWSET_MAX_SIZE);
3144
3145 eeprom_id = *((u16 *)&hwinfo[0]);
3146 if (eeprom_id != RTL_EEPROM_ID) {
3147 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3148 "EEPROM ID(%#x) is invalid!!\n", eeprom_id);
3149 rtlefuse->autoload_failflag = true;
3150 } else {
3151 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
3152 rtlefuse->autoload_failflag = false;
3153 }
3154
3155 if (rtlefuse->autoload_failflag) {
3156 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3157 "RTL8812AE autoload_failflag, check it !!");
3158 return;
3159 }
3160
3161 rtlefuse->eeprom_version = *(u8 *)&hwinfo[EEPROM_VERSION];
3162 if (rtlefuse->eeprom_version == 0xff)
3163 rtlefuse->eeprom_version = 0;
3164
3165 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3166 "EEPROM version: 0x%2x\n", rtlefuse->eeprom_version);
3167
3168 rtlefuse->eeprom_vid = *(u16 *)&hwinfo[EEPROM_VID];
3169 rtlefuse->eeprom_did = *(u16 *)&hwinfo[EEPROM_DID];
3170 rtlefuse->eeprom_svid = *(u16 *)&hwinfo[EEPROM_SVID];
3171 rtlefuse->eeprom_smid = *(u16 *)&hwinfo[EEPROM_SMID];
3172 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3173 "EEPROMId = 0x%4x\n", eeprom_id);
3174 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3175 "EEPROM VID = 0x%4x\n", rtlefuse->eeprom_vid);
3176 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3177 "EEPROM DID = 0x%4x\n", rtlefuse->eeprom_did);
3178 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3179 "EEPROM SVID = 0x%4x\n", rtlefuse->eeprom_svid);
3180 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3181 "EEPROM SMID = 0x%4x\n", rtlefuse->eeprom_smid);
3182
3183 /*customer ID*/
3184 rtlefuse->eeprom_oemid = *(u8 *)&hwinfo[EEPROM_CUSTOMER_ID];
3185 if (rtlefuse->eeprom_oemid == 0xFF)
3186 rtlefuse->eeprom_oemid = 0;
3187
3188 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3189 "EEPROM Customer ID: 0x%2x\n", rtlefuse->eeprom_oemid);
3190
3191 for (i = 0; i < 6; i += 2) {
3192 usvalue = *(u16 *)&hwinfo[EEPROM_MAC_ADDR + i];
3193 *((u16 *)(&rtlefuse->dev_addr[i])) = usvalue;
3194 }
3195
3196 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3197 "dev_addr: %pM\n", rtlefuse->dev_addr);
3198
3199 _rtl8821ae_read_txpower_info_from_hwpg(hw, rtlefuse->autoload_failflag,
3200 hwinfo);
3201
3202 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
3203 _rtl8812ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag);
3204 _rtl8812ae_read_bt_coexist_info_from_hwpg(hw,
3205 rtlefuse->autoload_failflag, hwinfo);
3206 } else {
3207 _rtl8821ae_read_pa_type(hw, hwinfo, rtlefuse->autoload_failflag);
3208 _rtl8821ae_read_bt_coexist_info_from_hwpg(hw,
3209 rtlefuse->autoload_failflag, hwinfo);
3210 }
3211
3212 _rtl8821ae_read_rfe_type(hw, hwinfo, rtlefuse->autoload_failflag);
3213 /*board type*/
3214 rtlefuse->board_type = ODM_BOARD_DEFAULT;
3215 if (rtlhal->external_lna_2g != 0)
3216 rtlefuse->board_type |= ODM_BOARD_EXT_LNA;
3217 if (rtlhal->external_lna_5g != 0)
3218 rtlefuse->board_type |= ODM_BOARD_EXT_LNA_5G;
3219 if (rtlhal->external_pa_2g != 0)
3220 rtlefuse->board_type |= ODM_BOARD_EXT_PA;
3221 if (rtlhal->external_pa_5g != 0)
3222 rtlefuse->board_type |= ODM_BOARD_EXT_PA_5G;
3223
3224 if (rtlpriv->btcoexist.btc_info.btcoexist == 1)
3225 rtlefuse->board_type |= ODM_BOARD_BT;
3226
3227 rtlhal->board_type = rtlefuse->board_type;
3228 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3229 "board_type = 0x%x\n", rtlefuse->board_type);
3230
3231 rtlefuse->eeprom_channelplan = *(u8 *)&hwinfo[EEPROM_CHANNELPLAN];
3232 if (rtlefuse->eeprom_channelplan == 0xff)
3233 rtlefuse->eeprom_channelplan = 0x7F;
3234
3235 /* set channel paln to world wide 13 */
3236 /* rtlefuse->channel_plan = (u8)rtlefuse->eeprom_channelplan; */
3237
3238 /*parse xtal*/
3239 rtlefuse->crystalcap = hwinfo[EEPROM_XTAL_8821AE];
3240 if (rtlefuse->crystalcap == 0xFF)
3241 rtlefuse->crystalcap = 0x20;
3242
3243 rtlefuse->eeprom_thermalmeter = *(u8 *)&hwinfo[EEPROM_THERMAL_METER];
3244 if ((rtlefuse->eeprom_thermalmeter == 0xff) ||
3245 rtlefuse->autoload_failflag) {
3246 rtlefuse->apk_thermalmeterignore = true;
3247 rtlefuse->eeprom_thermalmeter = 0xff;
3248 }
3249
3250 rtlefuse->thermalmeter[0] = rtlefuse->eeprom_thermalmeter;
3251 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3252 "thermalmeter = 0x%x\n", rtlefuse->eeprom_thermalmeter);
3253
3254 if (!rtlefuse->autoload_failflag) {
3255 rtlefuse->antenna_div_cfg =
3256 (hwinfo[EEPROM_RF_BOARD_OPTION] & 0x18) >> 3;
3257 if (hwinfo[EEPROM_RF_BOARD_OPTION] == 0xff)
3258 rtlefuse->antenna_div_cfg = 0;
3259
3260 if (rtlpriv->btcoexist.btc_info.btcoexist == 1 &&
3261 rtlpriv->btcoexist.btc_info.ant_num == ANT_X1)
3262 rtlefuse->antenna_div_cfg = 0;
3263
3264 rtlefuse->antenna_div_type = hwinfo[EEPROM_RF_ANTENNA_OPT_88E];
3265 if (rtlefuse->antenna_div_type == 0xff)
3266 rtlefuse->antenna_div_type = FIXED_HW_ANTDIV;
3267 } else {
3268 rtlefuse->antenna_div_cfg = 0;
3269 rtlefuse->antenna_div_type = 0;
3270 }
3271
3272 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3273 "SWAS: bHwAntDiv = %x, TRxAntDivType = %x\n",
3274 rtlefuse->antenna_div_cfg, rtlefuse->antenna_div_type);
3275
3276 pcipriv->ledctl.led_opendrain = true;
3277
3278 if (rtlhal->oem_id == RT_CID_DEFAULT) {
3279 switch (rtlefuse->eeprom_oemid) {
3280 case RT_CID_DEFAULT:
3281 break;
3282 case EEPROM_CID_TOSHIBA:
3283 rtlhal->oem_id = RT_CID_TOSHIBA;
3284 break;
3285 case EEPROM_CID_CCX:
3286 rtlhal->oem_id = RT_CID_CCX;
3287 break;
3288 case EEPROM_CID_QMI:
3289 rtlhal->oem_id = RT_CID_819X_QMI;
3290 break;
3291 case EEPROM_CID_WHQL:
3292 break;
3293 default:
3294 break;
3295 }
3296 }
3297}
3298
3299/*static void _rtl8821ae_hal_customized_behavior(struct ieee80211_hw *hw)
3300{
3301 struct rtl_priv *rtlpriv = rtl_priv(hw);
3302 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3303 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3304
3305 pcipriv->ledctl.led_opendrain = true;
3306 switch (rtlhal->oem_id) {
3307 case RT_CID_819X_HP:
3308 pcipriv->ledctl.led_opendrain = true;
3309 break;
3310 case RT_CID_819X_LENOVO:
3311 case RT_CID_DEFAULT:
3312 case RT_CID_TOSHIBA:
3313 case RT_CID_CCX:
3314 case RT_CID_819X_ACER:
3315 case RT_CID_WHQL:
3316 default:
3317 break;
3318 }
3319 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG,
3320 "RT Customized ID: 0x%02X\n", rtlhal->oem_id);
3321}*/
3322
3323void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw)
3324{
3325 struct rtl_priv *rtlpriv = rtl_priv(hw);
3326 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3327 struct rtl_phy *rtlphy = &rtlpriv->phy;
3328 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3329 u8 tmp_u1b;
3330
3331 rtlhal->version = _rtl8821ae_read_chip_version(hw);
3332 if (get_rf_type(rtlphy) == RF_1T1R)
3333 rtlpriv->dm.rfpath_rxenable[0] = true;
3334 else
3335 rtlpriv->dm.rfpath_rxenable[0] =
3336 rtlpriv->dm.rfpath_rxenable[1] = true;
3337 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "VersionID = 0x%4x\n",
3338 rtlhal->version);
3339
3340 tmp_u1b = rtl_read_byte(rtlpriv, REG_9346CR);
3341 if (tmp_u1b & BIT(4)) {
3342 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EEPROM\n");
3343 rtlefuse->epromtype = EEPROM_93C46;
3344 } else {
3345 RT_TRACE(rtlpriv, COMP_INIT, DBG_DMESG, "Boot from EFUSE\n");
3346 rtlefuse->epromtype = EEPROM_BOOT_EFUSE;
3347 }
3348
3349 if (tmp_u1b & BIT(5)) {
3350 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Autoload OK\n");
3351 rtlefuse->autoload_failflag = false;
3352 _rtl8821ae_read_adapter_info(hw, false);
3353 } else {
3354 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Autoload ERR!!\n");
3355 }
3356 /*hal_ReadRFType_8812A()*/
3357 /* _rtl8821ae_hal_customized_behavior(hw); */
3358}
3359
3360static void rtl8821ae_update_hal_rate_table(struct ieee80211_hw *hw,
3361 struct ieee80211_sta *sta)
3362{
3363 struct rtl_priv *rtlpriv = rtl_priv(hw);
3364 struct rtl_phy *rtlphy = &rtlpriv->phy;
3365 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3366 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3367 u32 ratr_value;
3368 u8 ratr_index = 0;
3369 u8 b_nmode = mac->ht_enable;
3370 u8 mimo_ps = IEEE80211_SMPS_OFF;
3371 u16 shortgi_rate;
3372 u32 tmp_ratr_value;
3373 u8 curtxbw_40mhz = mac->bw_40;
3374 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3375 1 : 0;
3376 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3377 1 : 0;
3378 enum wireless_mode wirelessmode = mac->mode;
3379
3380 if (rtlhal->current_bandtype == BAND_ON_5G)
3381 ratr_value = sta->supp_rates[1] << 4;
3382 else
3383 ratr_value = sta->supp_rates[0];
3384 if (mac->opmode == NL80211_IFTYPE_ADHOC)
3385 ratr_value = 0xfff;
3386 ratr_value |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
3387 sta->ht_cap.mcs.rx_mask[0] << 12);
3388 switch (wirelessmode) {
3389 case WIRELESS_MODE_B:
3390 if (ratr_value & 0x0000000c)
3391 ratr_value &= 0x0000000d;
3392 else
3393 ratr_value &= 0x0000000f;
3394 break;
3395 case WIRELESS_MODE_G:
3396 ratr_value &= 0x00000FF5;
3397 break;
3398 case WIRELESS_MODE_N_24G:
3399 case WIRELESS_MODE_N_5G:
3400 b_nmode = 1;
3401 if (mimo_ps == IEEE80211_SMPS_STATIC) {
3402 ratr_value &= 0x0007F005;
3403 } else {
3404 u32 ratr_mask;
3405
3406 if (get_rf_type(rtlphy) == RF_1T2R ||
3407 get_rf_type(rtlphy) == RF_1T1R)
3408 ratr_mask = 0x000ff005;
3409 else
3410 ratr_mask = 0x0f0ff005;
3411
3412 ratr_value &= ratr_mask;
3413 }
3414 break;
3415 default:
3416 if (rtlphy->rf_type == RF_1T2R)
3417 ratr_value &= 0x000ff0ff;
3418 else
3419 ratr_value &= 0x0f0ff0ff;
3420
3421 break;
3422 }
3423
3424 if ((rtlpriv->btcoexist.bt_coexistence) &&
3425 (rtlpriv->btcoexist.bt_coexist_type == BT_CSR_BC4) &&
3426 (rtlpriv->btcoexist.bt_cur_state) &&
3427 (rtlpriv->btcoexist.bt_ant_isolation) &&
3428 ((rtlpriv->btcoexist.bt_service == BT_SCO) ||
3429 (rtlpriv->btcoexist.bt_service == BT_BUSY)))
3430 ratr_value &= 0x0fffcfc0;
3431 else
3432 ratr_value &= 0x0FFFFFFF;
3433
3434 if (b_nmode && ((curtxbw_40mhz &&
3435 b_curshortgi_40mhz) || (!curtxbw_40mhz &&
3436 b_curshortgi_20mhz))) {
3437 ratr_value |= 0x10000000;
3438 tmp_ratr_value = (ratr_value >> 12);
3439
3440 for (shortgi_rate = 15; shortgi_rate > 0; shortgi_rate--) {
3441 if ((1 << shortgi_rate) & tmp_ratr_value)
3442 break;
3443 }
3444
3445 shortgi_rate = (shortgi_rate << 12) | (shortgi_rate << 8) |
3446 (shortgi_rate << 4) | (shortgi_rate);
3447 }
3448
3449 rtl_write_dword(rtlpriv, REG_ARFR0 + ratr_index * 4, ratr_value);
3450
3451 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
3452 "%x\n", rtl_read_dword(rtlpriv, REG_ARFR0));
3453}
3454
3455static u8 _rtl8821ae_mrate_idx_to_arfr_id(
3456 struct ieee80211_hw *hw, u8 rate_index,
3457 enum wireless_mode wirelessmode)
3458{
3459 struct rtl_priv *rtlpriv = rtl_priv(hw);
3460 struct rtl_phy *rtlphy = &rtlpriv->phy;
3461 u8 ret = 0;
3462 switch (rate_index) {
3463 case RATR_INX_WIRELESS_NGB:
3464 if (rtlphy->rf_type == RF_1T1R)
3465 ret = 1;
3466 else
3467 ret = 0;
3468 ; break;
3469 case RATR_INX_WIRELESS_N:
3470 case RATR_INX_WIRELESS_NG:
3471 if (rtlphy->rf_type == RF_1T1R)
3472 ret = 5;
3473 else
3474 ret = 4;
3475 ; break;
3476 case RATR_INX_WIRELESS_NB:
3477 if (rtlphy->rf_type == RF_1T1R)
3478 ret = 3;
3479 else
3480 ret = 2;
3481 ; break;
3482 case RATR_INX_WIRELESS_GB:
3483 ret = 6;
3484 break;
3485 case RATR_INX_WIRELESS_G:
3486 ret = 7;
3487 break;
3488 case RATR_INX_WIRELESS_B:
3489 ret = 8;
3490 break;
3491 case RATR_INX_WIRELESS_MC:
3492 if ((wirelessmode == WIRELESS_MODE_B)
3493 || (wirelessmode == WIRELESS_MODE_G)
3494 || (wirelessmode == WIRELESS_MODE_N_24G)
3495 || (wirelessmode == WIRELESS_MODE_AC_24G))
3496 ret = 6;
3497 else
3498 ret = 7;
3499 case RATR_INX_WIRELESS_AC_5N:
3500 if (rtlphy->rf_type == RF_1T1R)
3501 ret = 10;
3502 else
3503 ret = 9;
3504 break;
3505 case RATR_INX_WIRELESS_AC_24N:
3506 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
3507 if (rtlphy->rf_type == RF_1T1R)
3508 ret = 10;
3509 else
3510 ret = 9;
3511 } else {
3512 if (rtlphy->rf_type == RF_1T1R)
3513 ret = 11;
3514 else
3515 ret = 12;
3516 }
3517 break;
3518 default:
3519 ret = 0; break;
3520 }
3521 return ret;
3522}
3523
3524static u32 _rtl8821ae_rate_to_bitmap_2ssvht(__le16 vht_rate)
3525{
3526 u8 i, j, tmp_rate;
3527 u32 rate_bitmap = 0;
3528
3529 for (i = j = 0; i < 4; i += 2, j += 10) {
3530 tmp_rate = (le16_to_cpu(vht_rate) >> i) & 3;
3531
3532 switch (tmp_rate) {
3533 case 2:
3534 rate_bitmap = rate_bitmap | (0x03ff << j);
3535 break;
3536 case 1:
3537 rate_bitmap = rate_bitmap | (0x01ff << j);
3538 break;
3539 case 0:
3540 rate_bitmap = rate_bitmap | (0x00ff << j);
3541 break;
3542 default:
3543 break;
3544 }
3545 }
3546
3547 return rate_bitmap;
3548}
3549
3550static u32 _rtl8821ae_set_ra_vht_ratr_bitmap(struct ieee80211_hw *hw,
3551 enum wireless_mode wirelessmode,
3552 u32 ratr_bitmap)
3553{
3554 struct rtl_priv *rtlpriv = rtl_priv(hw);
3555 struct rtl_phy *rtlphy = &rtlpriv->phy;
3556 u32 ret_bitmap = ratr_bitmap;
3557
3558 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40
3559 || rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3560 ret_bitmap = ratr_bitmap;
3561 else if (wirelessmode == WIRELESS_MODE_AC_5G
3562 || wirelessmode == WIRELESS_MODE_AC_24G) {
3563 if (rtlphy->rf_type == RF_1T1R)
3564 ret_bitmap = ratr_bitmap & (~BIT21);
3565 else
3566 ret_bitmap = ratr_bitmap & (~(BIT31|BIT21));
3567 }
3568
3569 return ret_bitmap;
3570}
3571
3572static u8 _rtl8821ae_get_vht_eni(enum wireless_mode wirelessmode,
3573 u32 ratr_bitmap)
3574{
3575 u8 ret = 0;
3576 if (wirelessmode < WIRELESS_MODE_N_24G)
3577 ret = 0;
3578 else if (wirelessmode == WIRELESS_MODE_AC_24G) {
3579 if (ratr_bitmap & 0xfff00000) /* Mix , 2SS */
3580 ret = 3;
3581 else /* Mix, 1SS */
3582 ret = 2;
3583 } else if (wirelessmode == WIRELESS_MODE_AC_5G) {
3584 ret = 1;
3585 } /* VHT */
3586
3587 return ret << 4;
3588}
3589
3590static u8 _rtl8821ae_get_ra_ldpc(struct ieee80211_hw *hw,
3591 u8 mac_id, struct rtl_sta_info *sta_entry,
3592 enum wireless_mode wirelessmode)
3593{
3594 u8 b_ldpc = 0;
3595 /*not support ldpc, do not open*/
3596 return b_ldpc << 2;
3597}
3598
3599static u8 _rtl8821ae_get_ra_rftype(struct ieee80211_hw *hw,
3600 enum wireless_mode wirelessmode,
3601 u32 ratr_bitmap)
3602{
3603 struct rtl_priv *rtlpriv = rtl_priv(hw);
3604 struct rtl_phy *rtlphy = &rtlpriv->phy;
3605 u8 rf_type = RF_1T1R;
3606
3607 if (rtlphy->rf_type == RF_1T1R)
3608 rf_type = RF_1T1R;
3609 else if (wirelessmode == WIRELESS_MODE_AC_5G
3610 || wirelessmode == WIRELESS_MODE_AC_24G
3611 || wirelessmode == WIRELESS_MODE_AC_ONLY) {
3612 if (ratr_bitmap & 0xffc00000)
3613 rf_type = RF_2T2R;
3614 } else if (wirelessmode == WIRELESS_MODE_N_5G
3615 || wirelessmode == WIRELESS_MODE_N_24G) {
3616 if (ratr_bitmap & 0xfff00000)
3617 rf_type = RF_2T2R;
3618 }
3619
3620 return rf_type;
3621}
3622
3623static bool _rtl8821ae_get_ra_shortgi(struct ieee80211_hw *hw, struct ieee80211_sta *sta,
3624 u8 mac_id)
3625{
3626 bool b_short_gi = false;
3627 u8 b_curshortgi_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40) ?
3628 1 : 0;
3629 u8 b_curshortgi_20mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20) ?
3630 1 : 0;
3631 u8 b_curshortgi_80mhz = 0;
3632 b_curshortgi_80mhz = (sta->vht_cap.cap &
3633 IEEE80211_VHT_CAP_SHORT_GI_80) ? 1 : 0;
3634
3635 if (mac_id == MAC_ID_STATIC_FOR_BROADCAST_MULTICAST)
3636 b_short_gi = false;
3637
3638 if (b_curshortgi_40mhz || b_curshortgi_80mhz
3639 || b_curshortgi_20mhz)
3640 b_short_gi = true;
3641
3642 return b_short_gi;
3643}
3644
3645static void rtl8821ae_update_hal_rate_mask(struct ieee80211_hw *hw,
3646 struct ieee80211_sta *sta, u8 rssi_level)
3647{
3648 struct rtl_priv *rtlpriv = rtl_priv(hw);
3649 struct rtl_phy *rtlphy = &rtlpriv->phy;
3650 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3651 struct rtl_sta_info *sta_entry = NULL;
3652 u32 ratr_bitmap;
3653 u8 ratr_index;
3654 enum wireless_mode wirelessmode = 0;
3655 u8 curtxbw_40mhz = (sta->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40)
3656 ? 1 : 0;
3657 bool b_shortgi = false;
3658 u8 rate_mask[7];
3659 u8 macid = 0;
3660 u8 mimo_ps = IEEE80211_SMPS_OFF;
3661 u8 rf_type;
3662
3663 sta_entry = (struct rtl_sta_info *)sta->drv_priv;
3664 wirelessmode = sta_entry->wireless_mode;
3665
3666 RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD,
3667 "wireless mode = 0x%x\n", wirelessmode);
3668 if (mac->opmode == NL80211_IFTYPE_STATION ||
3669 mac->opmode == NL80211_IFTYPE_MESH_POINT) {
3670 curtxbw_40mhz = mac->bw_40;
3671 } else if (mac->opmode == NL80211_IFTYPE_AP ||
3672 mac->opmode == NL80211_IFTYPE_ADHOC)
3673 macid = sta->aid + 1;
3674 if (wirelessmode == WIRELESS_MODE_N_5G ||
3675 wirelessmode == WIRELESS_MODE_AC_5G)
3676 ratr_bitmap = sta->supp_rates[NL80211_BAND_5GHZ];
3677 else
3678 ratr_bitmap = sta->supp_rates[NL80211_BAND_2GHZ];
3679
3680 if (mac->opmode == NL80211_IFTYPE_ADHOC)
3681 ratr_bitmap = 0xfff;
3682
3683 if (wirelessmode == WIRELESS_MODE_N_24G
3684 || wirelessmode == WIRELESS_MODE_N_5G)
3685 ratr_bitmap |= (sta->ht_cap.mcs.rx_mask[1] << 20 |
3686 sta->ht_cap.mcs.rx_mask[0] << 12);
3687 else if (wirelessmode == WIRELESS_MODE_AC_24G
3688 || wirelessmode == WIRELESS_MODE_AC_5G
3689 || wirelessmode == WIRELESS_MODE_AC_ONLY)
3690 ratr_bitmap |= _rtl8821ae_rate_to_bitmap_2ssvht(
3691 sta->vht_cap.vht_mcs.rx_mcs_map) << 12;
3692
3693 b_shortgi = _rtl8821ae_get_ra_shortgi(hw, sta, macid);
3694 rf_type = _rtl8821ae_get_ra_rftype(hw, wirelessmode, ratr_bitmap);
3695
3696/*mac id owner*/
3697 switch (wirelessmode) {
3698 case WIRELESS_MODE_B:
3699 ratr_index = RATR_INX_WIRELESS_B;
3700 if (ratr_bitmap & 0x0000000c)
3701 ratr_bitmap &= 0x0000000d;
3702 else
3703 ratr_bitmap &= 0x0000000f;
3704 break;
3705 case WIRELESS_MODE_G:
3706 ratr_index = RATR_INX_WIRELESS_GB;
3707
3708 if (rssi_level == 1)
3709 ratr_bitmap &= 0x00000f00;
3710 else if (rssi_level == 2)
3711 ratr_bitmap &= 0x00000ff0;
3712 else
3713 ratr_bitmap &= 0x00000ff5;
3714 break;
3715 case WIRELESS_MODE_A:
3716 ratr_index = RATR_INX_WIRELESS_G;
3717 ratr_bitmap &= 0x00000ff0;
3718 break;
3719 case WIRELESS_MODE_N_24G:
3720 case WIRELESS_MODE_N_5G:
3721 if (wirelessmode == WIRELESS_MODE_N_24G)
3722 ratr_index = RATR_INX_WIRELESS_NGB;
3723 else
3724 ratr_index = RATR_INX_WIRELESS_NG;
3725
3726 if (mimo_ps == IEEE80211_SMPS_STATIC
3727 || mimo_ps == IEEE80211_SMPS_DYNAMIC) {
3728 if (rssi_level == 1)
3729 ratr_bitmap &= 0x000f0000;
3730 else if (rssi_level == 2)
3731 ratr_bitmap &= 0x000ff000;
3732 else
3733 ratr_bitmap &= 0x000ff005;
3734 } else {
3735 if (rf_type == RF_1T1R) {
3736 if (curtxbw_40mhz) {
3737 if (rssi_level == 1)
3738 ratr_bitmap &= 0x000f0000;
3739 else if (rssi_level == 2)
3740 ratr_bitmap &= 0x000ff000;
3741 else
3742 ratr_bitmap &= 0x000ff015;
3743 } else {
3744 if (rssi_level == 1)
3745 ratr_bitmap &= 0x000f0000;
3746 else if (rssi_level == 2)
3747 ratr_bitmap &= 0x000ff000;
3748 else
3749 ratr_bitmap &= 0x000ff005;
3750 }
3751 } else {
3752 if (curtxbw_40mhz) {
3753 if (rssi_level == 1)
3754 ratr_bitmap &= 0x0fff0000;
3755 else if (rssi_level == 2)
3756 ratr_bitmap &= 0x0ffff000;
3757 else
3758 ratr_bitmap &= 0x0ffff015;
3759 } else {
3760 if (rssi_level == 1)
3761 ratr_bitmap &= 0x0fff0000;
3762 else if (rssi_level == 2)
3763 ratr_bitmap &= 0x0ffff000;
3764 else
3765 ratr_bitmap &= 0x0ffff005;
3766 }
3767 }
3768 }
3769 break;
3770
3771 case WIRELESS_MODE_AC_24G:
3772 ratr_index = RATR_INX_WIRELESS_AC_24N;
3773 if (rssi_level == 1)
3774 ratr_bitmap &= 0xfc3f0000;
3775 else if (rssi_level == 2)
3776 ratr_bitmap &= 0xfffff000;
3777 else
3778 ratr_bitmap &= 0xffffffff;
3779 break;
3780
3781 case WIRELESS_MODE_AC_5G:
3782 ratr_index = RATR_INX_WIRELESS_AC_5N;
3783
3784 if (rf_type == RF_1T1R) {
3785 if (rssi_level == 1) /*add by Gary for ac-series*/
3786 ratr_bitmap &= 0x003f8000;
3787 else if (rssi_level == 2)
3788 ratr_bitmap &= 0x003ff000;
3789 else
3790 ratr_bitmap &= 0x003ff010;
3791 } else {
3792 if (rssi_level == 1)
3793 ratr_bitmap &= 0xfe3f8000;
3794 else if (rssi_level == 2)
3795 ratr_bitmap &= 0xfffff000;
3796 else
3797 ratr_bitmap &= 0xfffff010;
3798 }
3799 break;
3800
3801 default:
3802 ratr_index = RATR_INX_WIRELESS_NGB;
3803
3804 if (rf_type == RF_1T2R)
3805 ratr_bitmap &= 0x000ff0ff;
3806 else
3807 ratr_bitmap &= 0x0f8ff0ff;
3808 break;
3809 }
3810
3811 ratr_index = _rtl8821ae_mrate_idx_to_arfr_id(hw, ratr_index, wirelessmode);
3812 sta_entry->ratr_index = ratr_index;
3813 ratr_bitmap = _rtl8821ae_set_ra_vht_ratr_bitmap(hw, wirelessmode,
3814 ratr_bitmap);
3815
3816 RT_TRACE(rtlpriv, COMP_RATR, DBG_LOUD,
3817 "ratr_bitmap :%x\n", ratr_bitmap);
3818
3819 /* *(u32 *)& rate_mask = EF4BYTE((ratr_bitmap & 0x0fffffff) |
3820 (ratr_index << 28)); */
3821
3822 rate_mask[0] = macid;
3823 rate_mask[1] = ratr_index | (b_shortgi ? 0x80 : 0x00);
3824 rate_mask[2] = rtlphy->current_chan_bw
3825 | _rtl8821ae_get_vht_eni(wirelessmode, ratr_bitmap)
3826 | _rtl8821ae_get_ra_ldpc(hw, macid, sta_entry, wirelessmode);
3827
3828 rate_mask[3] = (u8)(ratr_bitmap & 0x000000ff);
3829 rate_mask[4] = (u8)((ratr_bitmap & 0x0000ff00) >> 8);
3830 rate_mask[5] = (u8)((ratr_bitmap & 0x00ff0000) >> 16);
3831 rate_mask[6] = (u8)((ratr_bitmap & 0xff000000) >> 24);
3832
3833 RT_TRACE(rtlpriv, COMP_RATR, DBG_DMESG,
3834 "Rate_index:%x, ratr_val:%x, %x:%x:%x:%x:%x:%x:%x\n",
3835 ratr_index, ratr_bitmap,
3836 rate_mask[0], rate_mask[1],
3837 rate_mask[2], rate_mask[3],
3838 rate_mask[4], rate_mask[5],
3839 rate_mask[6]);
3840 rtl8821ae_fill_h2c_cmd(hw, H2C_8821AE_RA_MASK, 7, rate_mask);
3841 _rtl8821ae_set_bcn_ctrl_reg(hw, BIT(3), 0);
3842}
3843
3844void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
3845 struct ieee80211_sta *sta, u8 rssi_level)
3846{
3847 struct rtl_priv *rtlpriv = rtl_priv(hw);
3848 if (rtlpriv->dm.useramask)
3849 rtl8821ae_update_hal_rate_mask(hw, sta, rssi_level);
3850 else
3851 /*RT_TRACE(rtlpriv, COMP_RATR,DBG_LOUD,
3852 "rtl8821ae_update_hal_rate_tbl() Error! 8821ae FW RA Only");*/
3853 rtl8821ae_update_hal_rate_table(hw, sta);
3854}
3855
3856void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw)
3857{
3858 struct rtl_priv *rtlpriv = rtl_priv(hw);
3859 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3860 u8 wireless_mode = mac->mode;
3861 u8 sifs_timer, r2t_sifs;
3862
3863 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SLOT_TIME,
3864 (u8 *)&mac->slot_time);
3865 if (wireless_mode == WIRELESS_MODE_G)
3866 sifs_timer = 0x0a;
3867 else
3868 sifs_timer = 0x0e;
3869 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_SIFS, (u8 *)&sifs_timer);
3870
3871 r2t_sifs = 0xa;
3872
3873 if (wireless_mode == WIRELESS_MODE_AC_5G &&
3874 (mac->vht_ldpc_cap & LDPC_VHT_ENABLE_RX) &&
3875 (mac->vht_stbc_cap & STBC_VHT_ENABLE_RX)) {
3876 if (mac->vendor == PEER_ATH)
3877 r2t_sifs = 0x8;
3878 else
3879 r2t_sifs = 0xa;
3880 } else if (wireless_mode == WIRELESS_MODE_AC_5G) {
3881 r2t_sifs = 0xa;
3882 }
3883
3884 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_R2T_SIFS, (u8 *)&r2t_sifs);
3885}
3886
3887bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid)
3888{
3889 struct rtl_priv *rtlpriv = rtl_priv(hw);
3890 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3891 struct rtl_phy *rtlphy = &rtlpriv->phy;
3892 enum rf_pwrstate e_rfpowerstate_toset, cur_rfstate;
3893 u8 u1tmp = 0;
3894 bool b_actuallyset = false;
3895
3896 if (rtlpriv->rtlhal.being_init_adapter)
3897 return false;
3898
3899 if (ppsc->swrf_processing)
3900 return false;
3901
3902 spin_lock(&rtlpriv->locks.rf_ps_lock);
3903 if (ppsc->rfchange_inprogress) {
3904 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3905 return false;
3906 } else {
3907 ppsc->rfchange_inprogress = true;
3908 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3909 }
3910
3911 cur_rfstate = ppsc->rfpwr_state;
3912
3913 rtl_write_byte(rtlpriv, REG_GPIO_IO_SEL_2,
3914 rtl_read_byte(rtlpriv,
3915 REG_GPIO_IO_SEL_2) & ~(BIT(1)));
3916
3917 u1tmp = rtl_read_byte(rtlpriv, REG_GPIO_PIN_CTRL_2);
3918
3919 if (rtlphy->polarity_ctl)
3920 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFOFF : ERFON;
3921 else
3922 e_rfpowerstate_toset = (u1tmp & BIT(1)) ? ERFON : ERFOFF;
3923
3924 if ((ppsc->hwradiooff) && (e_rfpowerstate_toset == ERFON)) {
3925 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3926 "GPIOChangeRF - HW Radio ON, RF ON\n");
3927
3928 e_rfpowerstate_toset = ERFON;
3929 ppsc->hwradiooff = false;
3930 b_actuallyset = true;
3931 } else if ((!ppsc->hwradiooff)
3932 && (e_rfpowerstate_toset == ERFOFF)) {
3933 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3934 "GPIOChangeRF - HW Radio OFF, RF OFF\n");
3935
3936 e_rfpowerstate_toset = ERFOFF;
3937 ppsc->hwradiooff = true;
3938 b_actuallyset = true;
3939 }
3940
3941 if (b_actuallyset) {
3942 spin_lock(&rtlpriv->locks.rf_ps_lock);
3943 ppsc->rfchange_inprogress = false;
3944 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3945 } else {
3946 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC)
3947 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3948
3949 spin_lock(&rtlpriv->locks.rf_ps_lock);
3950 ppsc->rfchange_inprogress = false;
3951 spin_unlock(&rtlpriv->locks.rf_ps_lock);
3952 }
3953
3954 *valid = 1;
3955 return !ppsc->hwradiooff;
3956}
3957
3958void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
3959 u8 *p_macaddr, bool is_group, u8 enc_algo,
3960 bool is_wepkey, bool clear_all)
3961{
3962 struct rtl_priv *rtlpriv = rtl_priv(hw);
3963 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3964 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3965 u8 *macaddr = p_macaddr;
3966 u32 entry_id = 0;
3967 bool is_pairwise = false;
3968
3969 static u8 cam_const_addr[4][6] = {
3970 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
3971 {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
3972 {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
3973 {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}
3974 };
3975 static u8 cam_const_broad[] = {
3976 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3977 };
3978
3979 if (clear_all) {
3980 u8 idx = 0;
3981 u8 cam_offset = 0;
3982 u8 clear_number = 5;
3983
3984 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG, "clear_all\n");
3985
3986 for (idx = 0; idx < clear_number; idx++) {
3987 rtl_cam_mark_invalid(hw, cam_offset + idx);
3988 rtl_cam_empty_entry(hw, cam_offset + idx);
3989
3990 if (idx < 5) {
3991 memset(rtlpriv->sec.key_buf[idx], 0,
3992 MAX_KEY_LEN);
3993 rtlpriv->sec.key_len[idx] = 0;
3994 }
3995 }
3996 } else {
3997 switch (enc_algo) {
3998 case WEP40_ENCRYPTION:
3999 enc_algo = CAM_WEP40;
4000 break;
4001 case WEP104_ENCRYPTION:
4002 enc_algo = CAM_WEP104;
4003 break;
4004 case TKIP_ENCRYPTION:
4005 enc_algo = CAM_TKIP;
4006 break;
4007 case AESCCMP_ENCRYPTION:
4008 enc_algo = CAM_AES;
4009 break;
4010 default:
4011 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
4012 "switch case not process\n");
4013 enc_algo = CAM_TKIP;
4014 break;
4015 }
4016
4017 if (is_wepkey || rtlpriv->sec.use_defaultkey) {
4018 macaddr = cam_const_addr[key_index];
4019 entry_id = key_index;
4020 } else {
4021 if (is_group) {
4022 macaddr = cam_const_broad;
4023 entry_id = key_index;
4024 } else {
4025 if (mac->opmode == NL80211_IFTYPE_AP) {
4026 entry_id = rtl_cam_get_free_entry(hw, p_macaddr);
4027 if (entry_id >= TOTAL_CAM_ENTRY) {
4028 RT_TRACE(rtlpriv, COMP_SEC, DBG_EMERG,
4029 "Can not find free hwsecurity cam entry\n");
4030 return;
4031 }
4032 } else {
4033 entry_id = CAM_PAIRWISE_KEY_POSITION;
4034 }
4035
4036 key_index = PAIRWISE_KEYIDX;
4037 is_pairwise = true;
4038 }
4039 }
4040
4041 if (rtlpriv->sec.key_len[key_index] == 0) {
4042 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4043 "delete one entry, entry_id is %d\n",
4044 entry_id);
4045 if (mac->opmode == NL80211_IFTYPE_AP)
4046 rtl_cam_del_entry(hw, p_macaddr);
4047 rtl_cam_delete_one_entry(hw, p_macaddr, entry_id);
4048 } else {
4049 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4050 "add one entry\n");
4051 if (is_pairwise) {
4052 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4053 "set Pairwise key\n");
4054
4055 rtl_cam_add_one_entry(hw, macaddr, key_index,
4056 entry_id, enc_algo,
4057 CAM_CONFIG_NO_USEDK,
4058 rtlpriv->sec.key_buf[key_index]);
4059 } else {
4060 RT_TRACE(rtlpriv, COMP_SEC, DBG_DMESG,
4061 "set group key\n");
4062
4063 if (mac->opmode == NL80211_IFTYPE_ADHOC) {
4064 rtl_cam_add_one_entry(hw,
4065 rtlefuse->dev_addr,
4066 PAIRWISE_KEYIDX,
4067 CAM_PAIRWISE_KEY_POSITION,
4068 enc_algo,
4069 CAM_CONFIG_NO_USEDK,
4070 rtlpriv->sec.key_buf
4071 [entry_id]);
4072 }
4073
4074 rtl_cam_add_one_entry(hw, macaddr, key_index,
4075 entry_id, enc_algo,
4076 CAM_CONFIG_NO_USEDK,
4077 rtlpriv->sec.key_buf[entry_id]);
4078 }
4079 }
4080 }
4081}
4082
4083void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw)
4084{
4085 struct rtl_priv *rtlpriv = rtl_priv(hw);
4086
4087 /* 0:Low, 1:High, 2:From Efuse. */
4088 rtlpriv->btcoexist.reg_bt_iso = 2;
4089 /* 0:Idle, 1:None-SCO, 2:SCO, 3:From Counter. */
4090 rtlpriv->btcoexist.reg_bt_sco = 3;
4091 /* 0:Disable BT control A-MPDU, 1:Enable BT control A-MPDU. */
4092 rtlpriv->btcoexist.reg_bt_sco = 0;
4093}
4094
4095void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw)
4096{
4097 struct rtl_priv *rtlpriv = rtl_priv(hw);
4098
4099 if (rtlpriv->cfg->ops->get_btc_status())
4100 rtlpriv->btcoexist.btc_ops->btc_init_hw_config(rtlpriv);
4101}
4102
4103void rtl8821ae_suspend(struct ieee80211_hw *hw)
4104{
4105}
4106
4107void rtl8821ae_resume(struct ieee80211_hw *hw)
4108{
4109}
4110
4111/* Turn on AAP (RCR:bit 0) for promicuous mode. */
4112void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
4113 bool allow_all_da, bool write_into_reg)
4114{
4115 struct rtl_priv *rtlpriv = rtl_priv(hw);
4116 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
4117
4118 if (allow_all_da) /* Set BIT0 */
4119 rtlpci->receive_config |= RCR_AAP;
4120 else /* Clear BIT0 */
4121 rtlpci->receive_config &= ~RCR_AAP;
4122
4123 if (write_into_reg)
4124 rtl_write_dword(rtlpriv, REG_RCR, rtlpci->receive_config);
4125
4126 RT_TRACE(rtlpriv, COMP_TURBO | COMP_INIT, DBG_LOUD,
4127 "receive_config=0x%08X, write_into_reg=%d\n",
4128 rtlpci->receive_config, write_into_reg);
4129}
4130
4131/* WKFMCAMAddAllEntry8812 */
4132void rtl8821ae_add_wowlan_pattern(struct ieee80211_hw *hw,
4133 struct rtl_wow_pattern *rtl_pattern,
4134 u8 index)
4135{
4136 struct rtl_priv *rtlpriv = rtl_priv(hw);
4137 u32 cam = 0;
4138 u8 addr = 0;
4139 u16 rxbuf_addr;
4140 u8 tmp, count = 0;
4141 u16 cam_start;
4142 u16 offset;
4143
4144 /* Count the WFCAM entry start offset. */
4145
4146 /* RX page size = 128 byte */
4147 offset = MAX_RX_DMA_BUFFER_SIZE_8812 / 128;
4148 /* We should start from the boundry */
4149 cam_start = offset * 128;
4150
4151 /* Enable Rx packet buffer access. */
4152 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL, RXPKT_BUF_SELECT);
4153 for (addr = 0; addr < WKFMCAM_ADDR_NUM; addr++) {
4154 /* Set Rx packet buffer offset.
4155 * RxBufer pointer increases 1,
4156 * we can access 8 bytes in Rx packet buffer.
4157 * CAM start offset (unit: 1 byte) = index*WKFMCAM_SIZE
4158 * RxBufer addr = (CAM start offset +
4159 * per entry offset of a WKFM CAM)/8
4160 * * index: The index of the wake up frame mask
4161 * * WKFMCAM_SIZE: the total size of one WKFM CAM
4162 * * per entry offset of a WKFM CAM: Addr*4 bytes
4163 */
4164 rxbuf_addr = (cam_start + index * WKFMCAM_SIZE + addr * 4) >> 3;
4165 /* Set R/W start offset */
4166 rtl_write_word(rtlpriv, REG_PKTBUF_DBG_CTRL, rxbuf_addr);
4167
4168 if (addr == 0) {
4169 cam = BIT(31) | rtl_pattern->crc;
4170
4171 if (rtl_pattern->type == UNICAST_PATTERN)
4172 cam |= BIT(24);
4173 else if (rtl_pattern->type == MULTICAST_PATTERN)
4174 cam |= BIT(25);
4175 else if (rtl_pattern->type == BROADCAST_PATTERN)
4176 cam |= BIT(26);
4177
4178 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4179 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4180 "WRITE entry[%d] 0x%x: %x\n", addr,
4181 REG_PKTBUF_DBG_DATA_L, cam);
4182
4183 /* Write to Rx packet buffer. */
4184 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4185 } else if (addr == 2 || addr == 4) {/* WKFM[127:0] */
4186 cam = rtl_pattern->mask[addr - 2];
4187
4188 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_L, cam);
4189 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4190 "WRITE entry[%d] 0x%x: %x\n", addr,
4191 REG_PKTBUF_DBG_DATA_L, cam);
4192
4193 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0x0f01);
4194 } else if (addr == 3 || addr == 5) {/* WKFM[127:0] */
4195 cam = rtl_pattern->mask[addr - 2];
4196
4197 rtl_write_dword(rtlpriv, REG_PKTBUF_DBG_DATA_H, cam);
4198 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
4199 "WRITE entry[%d] 0x%x: %x\n", addr,
4200 REG_PKTBUF_DBG_DATA_H, cam);
4201
4202 rtl_write_word(rtlpriv, REG_RXPKTBUF_CTRL, 0xf001);
4203 }
4204
4205 count = 0;
4206 do {
4207 tmp = rtl_read_byte(rtlpriv, REG_RXPKTBUF_CTRL);
4208 udelay(2);
4209 count++;
4210 } while (tmp && count < 100);
4211
4212 RT_ASSERT((count < 100),
4213 "Write wake up frame mask FAIL %d value!\n", tmp);
4214 }
4215 /* Disable Rx packet buffer access. */
4216 rtl_write_byte(rtlpriv, REG_PKT_BUFF_ACCESS_CTRL,
4217 DISABLE_TRXPKT_BUF_ACCESS);
4218}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/hw.h b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.h
new file mode 100644
index 000000000000..a3553e3abaa1
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/hw.h
@@ -0,0 +1,70 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_HW_H__
27#define __RTL8821AE_HW_H__
28
29void rtl8821ae_get_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
30void rtl8821ae_read_eeprom_info(struct ieee80211_hw *hw);
31
32void rtl8821ae_interrupt_recognized(struct ieee80211_hw *hw,
33 u32 *p_inta, u32 *p_intb);
34int rtl8821ae_hw_init(struct ieee80211_hw *hw);
35void rtl8821ae_card_disable(struct ieee80211_hw *hw);
36void rtl8821ae_enable_interrupt(struct ieee80211_hw *hw);
37void rtl8821ae_disable_interrupt(struct ieee80211_hw *hw);
38int rtl8821ae_set_network_type(struct ieee80211_hw *hw,
39 enum nl80211_iftype type);
40void rtl8821ae_set_check_bssid(struct ieee80211_hw *hw, bool check_bssid);
41void rtl8821ae_set_qos(struct ieee80211_hw *hw, int aci);
42void rtl8821ae_set_beacon_related_registers(struct ieee80211_hw *hw);
43void rtl8821ae_set_beacon_interval(struct ieee80211_hw *hw);
44void rtl8821ae_update_interrupt_mask(struct ieee80211_hw *hw,
45 u32 add_msr, u32 rm_msr);
46void rtl8821ae_set_hw_reg(struct ieee80211_hw *hw, u8 variable, u8 *val);
47void rtl8821ae_update_hal_rate_tbl(struct ieee80211_hw *hw,
48 struct ieee80211_sta *sta,
49 u8 rssi_level);
50void rtl8821ae_update_channel_access_setting(struct ieee80211_hw *hw);
51bool rtl8821ae_gpio_radio_on_off_checking(struct ieee80211_hw *hw, u8 *valid);
52void rtl8821ae_enable_hw_security_config(struct ieee80211_hw *hw);
53void rtl8821ae_set_key(struct ieee80211_hw *hw, u32 key_index,
54 u8 *p_macaddr, bool is_group, u8 enc_algo,
55 bool is_wepkey, bool clear_all);
56
57void rtl8821ae_bt_reg_init(struct ieee80211_hw *hw);
58void rtl8821ae_bt_hw_init(struct ieee80211_hw *hw);
59void rtl8821ae_suspend(struct ieee80211_hw *hw);
60void rtl8821ae_resume(struct ieee80211_hw *hw);
61void rtl8821ae_allow_all_destaddr(struct ieee80211_hw *hw,
62 bool allow_all_da,
63 bool write_into_reg);
64void _rtl8821ae_stop_tx_beacon(struct ieee80211_hw *hw);
65void _rtl8821ae_resume_tx_beacon(struct ieee80211_hw *hw);
66void rtl8821ae_add_wowlan_pattern(struct ieee80211_hw *hw,
67 struct rtl_wow_pattern *rtl_pattern,
68 u8 index);
69
70#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/led.c b/drivers/net/wireless/rtlwifi/rtl8821ae/led.c
new file mode 100644
index 000000000000..ba1946a0280e
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/led.c
@@ -0,0 +1,237 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "reg.h"
29#include "led.h"
30
31static void _rtl8821ae_init_led(struct ieee80211_hw *hw,
32 struct rtl_led *pled,
33 enum rtl_led_pin ledpin)
34{
35 pled->hw = hw;
36 pled->ledpin = ledpin;
37 pled->ledon = false;
38}
39
40void rtl8821ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
41{
42 u8 ledcfg;
43 struct rtl_priv *rtlpriv = rtl_priv(hw);
44
45 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
46 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
47
48 switch (pled->ledpin) {
49 case LED_PIN_GPIO0:
50 break;
51 case LED_PIN_LED0:
52 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
53 ledcfg &= ~BIT(6);
54 rtl_write_byte(rtlpriv,
55 REG_LEDCFG2, (ledcfg & 0xf0) | BIT(5));
56 break;
57 case LED_PIN_LED1:
58 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
59 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg & 0x10);
60 break;
61 default:
62 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
63 "switch case not process\n");
64 break;
65 }
66 pled->ledon = true;
67}
68
69void rtl8812ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled)
70{
71 u16 ledreg = REG_LEDCFG1;
72 u8 ledcfg = 0;
73 struct rtl_priv *rtlpriv = rtl_priv(hw);
74
75 switch (pled->ledpin) {
76 case LED_PIN_LED0:
77 ledreg = REG_LEDCFG1;
78 break;
79
80 case LED_PIN_LED1:
81 ledreg = REG_LEDCFG2;
82 break;
83
84 case LED_PIN_GPIO0:
85 default:
86 break;
87 }
88
89 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
90 "In SwLedOn, LedAddr:%X LEDPIN=%d\n",
91 ledreg, pled->ledpin);
92
93 ledcfg = rtl_read_byte(rtlpriv, ledreg);
94 ledcfg |= BIT(5); /*Set 0x4c[21]*/
95 ledcfg &= ~(BIT(7) | BIT(6) | BIT(3) | BIT(2) | BIT(1) | BIT(0));
96 /*Clear 0x4c[23:22] and 0x4c[19:16]*/
97 rtl_write_byte(rtlpriv, ledreg, ledcfg); /*SW control led0 on.*/
98 pled->ledon = true;
99}
100
101void rtl8821ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
102{
103 struct rtl_priv *rtlpriv = rtl_priv(hw);
104 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
105 u8 ledcfg;
106
107 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
108 "LedAddr:%X ledpin=%d\n", REG_LEDCFG2, pled->ledpin);
109
110 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG2);
111
112 switch (pled->ledpin) {
113 case LED_PIN_GPIO0:
114 break;
115 case LED_PIN_LED0:
116 ledcfg &= 0xf0;
117 if (pcipriv->ledctl.led_opendrain) {
118 ledcfg &= 0x90; /* Set to software control. */
119 rtl_write_byte(rtlpriv, REG_LEDCFG2, (ledcfg|BIT(3)));
120 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG);
121 ledcfg &= 0xFE;
122 rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, ledcfg);
123 } else {
124 ledcfg &= ~BIT(6);
125 rtl_write_byte(rtlpriv, REG_LEDCFG2,
126 (ledcfg | BIT(3) | BIT(5)));
127 }
128 break;
129 case LED_PIN_LED1:
130 ledcfg = rtl_read_byte(rtlpriv, REG_LEDCFG1);
131 ledcfg &= 0x10; /* Set to software control. */
132 rtl_write_byte(rtlpriv, REG_LEDCFG1, ledcfg|BIT(3));
133 break;
134 default:
135 RT_TRACE(rtlpriv, COMP_ERR, DBG_LOUD,
136 "switch case not process\n");
137 break;
138 }
139 pled->ledon = false;
140}
141
142void rtl8812ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled)
143{
144 u16 ledreg = REG_LEDCFG1;
145 struct rtl_priv *rtlpriv = rtl_priv(hw);
146 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
147
148 switch (pled->ledpin) {
149 case LED_PIN_LED0:
150 ledreg = REG_LEDCFG1;
151 break;
152
153 case LED_PIN_LED1:
154 ledreg = REG_LEDCFG2;
155 break;
156
157 case LED_PIN_GPIO0:
158 default:
159 break;
160 }
161
162 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD,
163 "In SwLedOff,LedAddr:%X LEDPIN=%d\n",
164 ledreg, pled->ledpin);
165 /*Open-drain arrangement for controlling the LED*/
166 if (pcipriv->ledctl.led_opendrain) {
167 u8 ledcfg = rtl_read_byte(rtlpriv, ledreg);
168
169 ledreg &= 0xd0; /* Set to software control.*/
170 rtl_write_byte(rtlpriv, ledreg, (ledcfg | BIT(3)));
171
172 /*Open-drain arrangement*/
173 ledcfg = rtl_read_byte(rtlpriv, REG_MAC_PINMUX_CFG);
174 ledcfg &= 0xFE;/*Set GPIO[8] to input mode*/
175 rtl_write_byte(rtlpriv, REG_MAC_PINMUX_CFG, ledcfg);
176 } else {
177 rtl_write_byte(rtlpriv, ledreg, 0x28);
178 }
179
180 pled->ledon = false;
181}
182
183void rtl8821ae_init_sw_leds(struct ieee80211_hw *hw)
184{
185 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
186
187 _rtl8821ae_init_led(hw, &pcipriv->ledctl.sw_led0, LED_PIN_LED0);
188 _rtl8821ae_init_led(hw, &pcipriv->ledctl.sw_led1, LED_PIN_LED1);
189}
190
191static void _rtl8821ae_sw_led_control(struct ieee80211_hw *hw,
192 enum led_ctl_mode ledaction)
193{
194 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
195 struct rtl_led *pLed0 = &pcipriv->ledctl.sw_led0;
196 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
197
198 switch (ledaction) {
199 case LED_CTL_POWER_ON:
200 case LED_CTL_LINK:
201 case LED_CTL_NO_LINK:
202 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
203 rtl8812ae_sw_led_on(hw, pLed0);
204 else
205 rtl8821ae_sw_led_on(hw, pLed0);
206 break;
207 case LED_CTL_POWER_OFF:
208 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
209 rtl8812ae_sw_led_off(hw, pLed0);
210 else
211 rtl8821ae_sw_led_off(hw, pLed0);
212 break;
213 default:
214 break;
215 }
216}
217
218void rtl8821ae_led_control(struct ieee80211_hw *hw,
219 enum led_ctl_mode ledaction)
220{
221 struct rtl_priv *rtlpriv = rtl_priv(hw);
222 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
223
224 if ((ppsc->rfoff_reason > RF_CHANGE_BY_PS) &&
225 (ledaction == LED_CTL_TX ||
226 ledaction == LED_CTL_RX ||
227 ledaction == LED_CTL_SITE_SURVEY ||
228 ledaction == LED_CTL_LINK ||
229 ledaction == LED_CTL_NO_LINK ||
230 ledaction == LED_CTL_START_TO_LINK ||
231 ledaction == LED_CTL_POWER_ON)) {
232 return;
233 }
234 RT_TRACE(rtlpriv, COMP_LED, DBG_LOUD, "ledaction %d,\n",
235 ledaction);
236 _rtl8821ae_sw_led_control(hw, ledaction);
237}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/led.h b/drivers/net/wireless/rtlwifi/rtl8821ae/led.h
new file mode 100644
index 000000000000..038e64e18ae8
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/led.h
@@ -0,0 +1,37 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_LED_H__
27#define __RTL8821AE_LED_H__
28
29void rtl8821ae_init_sw_leds(struct ieee80211_hw *hw);
30void rtl8821ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled);
31void rtl8812ae_sw_led_on(struct ieee80211_hw *hw, struct rtl_led *pled);
32void rtl8821ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled);
33void rtl8812ae_sw_led_off(struct ieee80211_hw *hw, struct rtl_led *pled);
34void rtl8821ae_led_control(struct ieee80211_hw *hw,
35 enum led_ctl_mode ledaction);
36
37#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c
new file mode 100644
index 000000000000..9786313dc62f
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.c
@@ -0,0 +1,4855 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../ps.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "rf.h"
33#include "dm.h"
34#include "table.h"
35#include "trx.h"
36#include "../btcoexist/halbt_precomp.h"
37#include "hw.h"
38#include "../efuse.h"
39
40#define READ_NEXT_PAIR(array_table, v1, v2, i) \
41 do { \
42 i += 2; \
43 v1 = array_table[i]; \
44 v2 = array_table[i+1]; \
45 } while (0)
46
47static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
48 enum radio_path rfpath, u32 offset);
49static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
50 enum radio_path rfpath, u32 offset,
51 u32 data);
52static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask);
53static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw);
54/*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/
55static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
56static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
57 u8 configtype);
58static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
59 u8 configtype);
60static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw);
61
62static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
63 enum wireless_mode wirelessmode,
64 u8 txpwridx);
65static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw);
66static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw);
67
68static void rtl8812ae_fixspur(struct ieee80211_hw *hw,
69 enum ht_channel_width band_width, u8 channel)
70{
71 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
72
73 /*C cut Item12 ADC FIFO CLOCK*/
74 if (IS_VENDOR_8812A_C_CUT(rtlhal->version)) {
75 if (band_width == HT_CHANNEL_WIDTH_20_40 && channel == 11)
76 rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x3);
77 /* 0x8AC[11:10] = 2'b11*/
78 else
79 rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x2);
80 /* 0x8AC[11:10] = 2'b10*/
81
82 /* <20120914, Kordan> A workarould to resolve
83 * 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson)
84 */
85 if (band_width == HT_CHANNEL_WIDTH_20 &&
86 (channel == 13 || channel == 14)) {
87 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
88 /*0x8AC[9:8] = 2'b11*/
89 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
90 /* 0x8C4[30] = 1*/
91 } else if (band_width == HT_CHANNEL_WIDTH_20_40 &&
92 channel == 11) {
93 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
94 /*0x8C4[30] = 1*/
95 } else if (band_width != HT_CHANNEL_WIDTH_80) {
96 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
97 /*0x8AC[9:8] = 2'b10*/
98 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
99 /*0x8C4[30] = 0*/
100 }
101 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
102 /* <20120914, Kordan> A workarould to resolve
103 * 2480Mhz spur by setting ADC clock as 160M.
104 */
105 if (band_width == HT_CHANNEL_WIDTH_20 &&
106 (channel == 13 || channel == 14))
107 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3);
108 /*0x8AC[9:8] = 11*/
109 else if (channel <= 14) /*2.4G only*/
110 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2);
111 /*0x8AC[9:8] = 10*/
112 }
113}
114
115u32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
116 u32 bitmask)
117{
118 struct rtl_priv *rtlpriv = rtl_priv(hw);
119 u32 returnvalue, originalvalue, bitshift;
120
121 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
122 "regaddr(%#x), bitmask(%#x)\n",
123 regaddr, bitmask);
124 originalvalue = rtl_read_dword(rtlpriv, regaddr);
125 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
126 returnvalue = (originalvalue & bitmask) >> bitshift;
127
128 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
129 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
130 bitmask, regaddr, originalvalue);
131 return returnvalue;
132}
133
134void rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
135 u32 regaddr, u32 bitmask, u32 data)
136{
137 struct rtl_priv *rtlpriv = rtl_priv(hw);
138 u32 originalvalue, bitshift;
139
140 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
141 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
142 regaddr, bitmask, data);
143
144 if (bitmask != MASKDWORD) {
145 originalvalue = rtl_read_dword(rtlpriv, regaddr);
146 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
147 data = ((originalvalue & (~bitmask)) |
148 ((data << bitshift) & bitmask));
149 }
150
151 rtl_write_dword(rtlpriv, regaddr, data);
152
153 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
154 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
155 regaddr, bitmask, data);
156}
157
158u32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
159 enum radio_path rfpath, u32 regaddr,
160 u32 bitmask)
161{
162 struct rtl_priv *rtlpriv = rtl_priv(hw);
163 u32 original_value, readback_value, bitshift;
164 unsigned long flags;
165
166 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
167 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
168 regaddr, rfpath, bitmask);
169
170 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
171
172 original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
173 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
174 readback_value = (original_value & bitmask) >> bitshift;
175
176 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
177
178 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
179 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
180 regaddr, rfpath, bitmask, original_value);
181
182 return readback_value;
183}
184
185void rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
186 enum radio_path rfpath,
187 u32 regaddr, u32 bitmask, u32 data)
188{
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 u32 original_value, bitshift;
191 unsigned long flags;
192
193 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
194 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
195 regaddr, bitmask, data, rfpath);
196
197 spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
198
199 if (bitmask != RFREG_OFFSET_MASK) {
200 original_value =
201 _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr);
202 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask);
203 data = ((original_value & (~bitmask)) | (data << bitshift));
204 }
205
206 _rtl8821ae_phy_rf_serial_write(hw, rfpath, regaddr, data);
207
208 spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
209
210 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
211 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
212 regaddr, bitmask, data, rfpath);
213}
214
215static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw,
216 enum radio_path rfpath, u32 offset)
217{
218 struct rtl_priv *rtlpriv = rtl_priv(hw);
219 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
220 bool is_pi_mode = false;
221 u32 retvalue = 0;
222
223 /* 2009/06/17 MH We can not execute IO for power
224 save or other accident mode.*/
225 if (RT_CANNOT_IO(hw)) {
226 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "return all one\n");
227 return 0xFFFFFFFF;
228 }
229 /* <20120809, Kordan> CCA OFF(when entering),
230 asked by James to avoid reading the wrong value.
231 <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!*/
232 if (offset != 0x0 &&
233 !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
234 (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
235 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 1);
236 offset &= 0xff;
237
238 if (rfpath == RF90_PATH_A)
239 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xC00, 0x4);
240 else if (rfpath == RF90_PATH_B)
241 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xE00, 0x4);
242
243 rtl_set_bbreg(hw, RHSSIREAD_8821AE, 0xff, offset);
244
245 if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
246 (IS_VENDOR_8812A_C_CUT(rtlhal->version)))
247 udelay(20);
248
249 if (is_pi_mode) {
250 if (rfpath == RF90_PATH_A)
251 retvalue =
252 rtl_get_bbreg(hw, RA_PIREAD_8821A, BLSSIREADBACKDATA);
253 else if (rfpath == RF90_PATH_B)
254 retvalue =
255 rtl_get_bbreg(hw, RB_PIREAD_8821A, BLSSIREADBACKDATA);
256 } else {
257 if (rfpath == RF90_PATH_A)
258 retvalue =
259 rtl_get_bbreg(hw, RA_SIREAD_8821A, BLSSIREADBACKDATA);
260 else if (rfpath == RF90_PATH_B)
261 retvalue =
262 rtl_get_bbreg(hw, RB_SIREAD_8821A, BLSSIREADBACKDATA);
263 }
264
265 /*<20120809, Kordan> CCA ON(when exiting),
266 * asked by James to avoid reading the wrong value.
267 * <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!
268 */
269 if (offset != 0x0 &&
270 !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
271 (IS_VENDOR_8812A_C_CUT(rtlhal->version))))
272 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 0);
273 return retvalue;
274}
275
276static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw,
277 enum radio_path rfpath, u32 offset,
278 u32 data)
279{
280 struct rtl_priv *rtlpriv = rtl_priv(hw);
281 struct rtl_phy *rtlphy = &rtlpriv->phy;
282 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
283 u32 data_and_addr;
284 u32 newoffset;
285
286 if (RT_CANNOT_IO(hw)) {
287 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "stop\n");
288 return;
289 }
290 offset &= 0xff;
291 newoffset = offset;
292 data_and_addr = ((newoffset << 20) |
293 (data & 0x000fffff)) & 0x0fffffff;
294 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
295 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
296 "RFW-%d Addr[0x%x]=0x%x\n",
297 rfpath, pphyreg->rf3wire_offset, data_and_addr);
298}
299
300static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask)
301{
302 u32 i;
303
304 for (i = 0; i <= 31; i++) {
305 if (((bitmask >> i) & 0x1) == 1)
306 break;
307 }
308 return i;
309}
310
311bool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw)
312{
313 bool rtstatus = 0;
314
315 rtstatus = _rtl8821ae_phy_config_mac_with_headerfile(hw);
316
317 return rtstatus;
318}
319
320bool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw)
321{
322 bool rtstatus = true;
323 struct rtl_priv *rtlpriv = rtl_priv(hw);
324 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
325 struct rtl_phy *rtlphy = &rtlpriv->phy;
326 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
327 u8 regval;
328 u8 crystal_cap;
329
330 phy_init_bb_rf_register_definition(hw);
331
332 regval = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN);
333 regval |= FEN_PCIEA;
334 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, regval);
335 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
336 regval | FEN_BB_GLB_RSTN | FEN_BBRSTB);
337
338 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x7);
339 rtl_write_byte(rtlpriv, REG_OPT_CTRL + 2, 0x7);
340
341 rtstatus = _rtl8821ae_phy_bb8821a_config_parafile(hw);
342
343 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
344 crystal_cap = rtlefuse->crystalcap & 0x3F;
345 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0x7FF80000,
346 (crystal_cap | (crystal_cap << 6)));
347 } else {
348 crystal_cap = rtlefuse->crystalcap & 0x3F;
349 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
350 (crystal_cap | (crystal_cap << 6)));
351 }
352 rtlphy->reg_837 = rtl_read_byte(rtlpriv, 0x837);
353
354 return rtstatus;
355}
356
357bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw)
358{
359 return rtl8821ae_phy_rf6052_config(hw);
360}
361
362u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8 band,
363 u8 rf_path)
364{
365 struct rtl_priv *rtlpriv = rtl_priv(hw);
366 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
367 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
368 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
369 char reg_swing_2g = -1;/* 0xff; */
370 char reg_swing_5g = -1;/* 0xff; */
371 char swing_2g = -1 * reg_swing_2g;
372 char swing_5g = -1 * reg_swing_5g;
373 u32 out = 0x200;
374 const char auto_temp = -1;
375
376 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
377 "===> PHY_GetTxBBSwing_8812A, bbSwing_2G: %d, bbSwing_5G: %d,autoload_failflag=%d.\n",
378 (int)swing_2g, (int)swing_5g,
379 (int)rtlefuse->autoload_failflag);
380
381 if (rtlefuse->autoload_failflag) {
382 if (band == BAND_ON_2_4G) {
383 rtldm->swing_diff_2g = swing_2g;
384 if (swing_2g == 0) {
385 out = 0x200; /* 0 dB */
386 } else if (swing_2g == -3) {
387 out = 0x16A; /* -3 dB */
388 } else if (swing_2g == -6) {
389 out = 0x101; /* -6 dB */
390 } else if (swing_2g == -9) {
391 out = 0x0B6; /* -9 dB */
392 } else {
393 rtldm->swing_diff_2g = 0;
394 out = 0x200;
395 }
396 } else if (band == BAND_ON_5G) {
397 rtldm->swing_diff_5g = swing_5g;
398 if (swing_5g == 0) {
399 out = 0x200; /* 0 dB */
400 } else if (swing_5g == -3) {
401 out = 0x16A; /* -3 dB */
402 } else if (swing_5g == -6) {
403 out = 0x101; /* -6 dB */
404 } else if (swing_5g == -9) {
405 out = 0x0B6; /* -9 dB */
406 } else {
407 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
408 rtldm->swing_diff_5g = -3;
409 out = 0x16A;
410 } else {
411 rtldm->swing_diff_5g = 0;
412 out = 0x200;
413 }
414 }
415 } else {
416 rtldm->swing_diff_2g = -3;
417 rtldm->swing_diff_5g = -3;
418 out = 0x16A; /* -3 dB */
419 }
420 } else {
421 u32 swing = 0, swing_a = 0, swing_b = 0;
422
423 if (band == BAND_ON_2_4G) {
424 if (reg_swing_2g == auto_temp) {
425 efuse_shadow_read(hw, 1, 0xC6, (u32 *)&swing);
426 swing = (swing == 0xFF) ? 0x00 : swing;
427 } else if (swing_2g == 0) {
428 swing = 0x00; /* 0 dB */
429 } else if (swing_2g == -3) {
430 swing = 0x05; /* -3 dB */
431 } else if (swing_2g == -6) {
432 swing = 0x0A; /* -6 dB */
433 } else if (swing_2g == -9) {
434 swing = 0xFF; /* -9 dB */
435 } else {
436 swing = 0x00;
437 }
438 } else {
439 if (reg_swing_5g == auto_temp) {
440 efuse_shadow_read(hw, 1, 0xC7, (u32 *)&swing);
441 swing = (swing == 0xFF) ? 0x00 : swing;
442 } else if (swing_5g == 0) {
443 swing = 0x00; /* 0 dB */
444 } else if (swing_5g == -3) {
445 swing = 0x05; /* -3 dB */
446 } else if (swing_5g == -6) {
447 swing = 0x0A; /* -6 dB */
448 } else if (swing_5g == -9) {
449 swing = 0xFF; /* -9 dB */
450 } else {
451 swing = 0x00;
452 }
453 }
454
455 swing_a = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */
456 swing_b = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */
457 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
458 "===> PHY_GetTxBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n",
459 swing_a, swing_b);
460
461 /* 3 Path-A */
462 if (swing_a == 0x0) {
463 if (band == BAND_ON_2_4G)
464 rtldm->swing_diff_2g = 0;
465 else
466 rtldm->swing_diff_5g = 0;
467 out = 0x200; /* 0 dB */
468 } else if (swing_a == 0x1) {
469 if (band == BAND_ON_2_4G)
470 rtldm->swing_diff_2g = -3;
471 else
472 rtldm->swing_diff_5g = -3;
473 out = 0x16A; /* -3 dB */
474 } else if (swing_a == 0x2) {
475 if (band == BAND_ON_2_4G)
476 rtldm->swing_diff_2g = -6;
477 else
478 rtldm->swing_diff_5g = -6;
479 out = 0x101; /* -6 dB */
480 } else if (swing_a == 0x3) {
481 if (band == BAND_ON_2_4G)
482 rtldm->swing_diff_2g = -9;
483 else
484 rtldm->swing_diff_5g = -9;
485 out = 0x0B6; /* -9 dB */
486 }
487 /* 3 Path-B */
488 if (swing_b == 0x0) {
489 if (band == BAND_ON_2_4G)
490 rtldm->swing_diff_2g = 0;
491 else
492 rtldm->swing_diff_5g = 0;
493 out = 0x200; /* 0 dB */
494 } else if (swing_b == 0x1) {
495 if (band == BAND_ON_2_4G)
496 rtldm->swing_diff_2g = -3;
497 else
498 rtldm->swing_diff_5g = -3;
499 out = 0x16A; /* -3 dB */
500 } else if (swing_b == 0x2) {
501 if (band == BAND_ON_2_4G)
502 rtldm->swing_diff_2g = -6;
503 else
504 rtldm->swing_diff_5g = -6;
505 out = 0x101; /* -6 dB */
506 } else if (swing_b == 0x3) {
507 if (band == BAND_ON_2_4G)
508 rtldm->swing_diff_2g = -9;
509 else
510 rtldm->swing_diff_5g = -9;
511 out = 0x0B6; /* -9 dB */
512 }
513 }
514
515 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
516 "<=== PHY_GetTxBBSwing_8812A, out = 0x%X\n", out);
517 return out;
518}
519
520void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
521{
522 struct rtl_priv *rtlpriv = rtl_priv(hw);
523 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
524 struct rtl_dm *rtldm = rtl_dm(rtlpriv);
525 u8 current_band = rtlhal->current_bandtype;
526 u32 txpath, rxpath;
527 char bb_diff_between_band;
528
529 txpath = rtl8821ae_phy_query_bb_reg(hw, RTXPATH, 0xf0);
530 rxpath = rtl8821ae_phy_query_bb_reg(hw, RCCK_RX, 0x0f000000);
531 rtlhal->current_bandtype = (enum band_type) band;
532 /* reconfig BB/RF according to wireless mode */
533 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
534 /* BB & RF Config */
535 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
536
537 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
538 /* 0xCB0[15:12] = 0x7 (LNA_On)*/
539 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x7);
540 /* 0xCB0[7:4] = 0x7 (PAPE_A)*/
541 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x7);
542 }
543
544 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
545 /*0x834[1:0] = 0x1*/
546 rtl_set_bbreg(hw, 0x834, 0x3, 0x1);
547 }
548
549 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
550 /* 0xC1C[11:8] = 0 */
551 rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 0);
552 } else {
553 /* 0x82C[1:0] = 2b'00 */
554 rtl_set_bbreg(hw, 0x82c, 0x3, 0);
555 }
556 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
557 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
558 0x77777777);
559 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
560 0x77777777);
561 rtl_set_bbreg(hw, RA_RFE_INV, 0x3ff00000, 0x000);
562 rtl_set_bbreg(hw, RB_RFE_INV, 0x3ff00000, 0x000);
563 }
564
565 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1);
566 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1);
567
568 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x0);
569 } else {/* 5G band */
570 u16 count, reg_41a;
571
572 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
573 /*0xCB0[15:12] = 0x5 (LNA_On)*/
574 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x5);
575 /*0xCB0[7:4] = 0x4 (PAPE_A)*/
576 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x4);
577 }
578 /*CCK_CHECK_en*/
579 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x80);
580
581 count = 0;
582 reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
583 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
584 "Reg41A value %d", reg_41a);
585 reg_41a &= 0x30;
586 while ((reg_41a != 0x30) && (count < 50)) {
587 udelay(50);
588 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "Delay 50us\n");
589
590 reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY);
591 reg_41a &= 0x30;
592 count++;
593 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
594 "Reg41A value %d", reg_41a);
595 }
596 if (count != 0)
597 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD,
598 "PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n",
599 count, reg_41a);
600
601 /* 2012/02/01, Sinda add registry to switch workaround
602 without long-run verification for scan issue. */
603 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03);
604
605 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
606 /*0x834[1:0] = 0x2*/
607 rtl_set_bbreg(hw, 0x834, 0x3, 0x2);
608 }
609
610 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
611 /* AGC table select */
612 /* 0xC1C[11:8] = 1*/
613 rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 1);
614 } else
615 /* 0x82C[1:0] = 2'b00 */
616 rtl_set_bbreg(hw, 0x82c, 0x3, 1);
617
618 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
619 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD,
620 0x77337777);
621 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD,
622 0x77337777);
623 rtl_set_bbreg(hw, RA_RFE_INV, 0x3ff00000, 0x010);
624 rtl_set_bbreg(hw, RB_RFE_INV, 0x3ff00000, 0x010);
625 }
626
627 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0);
628 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf);
629
630 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
631 "==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n",
632 rtlpriv->dm.ofdm_index[RF90_PATH_A]);
633 }
634
635 if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) ||
636 (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)) {
637 /* 0xC1C[31:21] */
638 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000,
639 phy_get_tx_swing_8812A(hw, band, RF90_PATH_A));
640 /* 0xE1C[31:21] */
641 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000,
642 phy_get_tx_swing_8812A(hw, band, RF90_PATH_B));
643
644 /* <20121005, Kordan> When TxPowerTrack is ON,
645 * we should take care of the change of BB swing.
646 * That is, reset all info to trigger Tx power tracking.
647 */
648 if (band != current_band) {
649 bb_diff_between_band =
650 (rtldm->swing_diff_2g - rtldm->swing_diff_5g);
651 bb_diff_between_band = (band == BAND_ON_2_4G) ?
652 bb_diff_between_band :
653 (-1 * bb_diff_between_band);
654 rtldm->default_ofdm_index += bb_diff_between_band * 2;
655 }
656 rtl8821ae_dm_clear_txpower_tracking_state(hw);
657 }
658
659 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
660 "<==rtl8821ae_phy_switch_wirelessband():Switch Band OK.\n");
661 return;
662}
663
664static bool _rtl8821ae_check_condition(struct ieee80211_hw *hw,
665 const u32 condition)
666{
667 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
668 u32 _board = rtlefuse->board_type; /*need efuse define*/
669 u32 _interface = 0x01; /* ODM_ITRF_PCIE */
670 u32 _platform = 0x08;/* ODM_WIN */
671 u32 cond = condition;
672
673 if (condition == 0xCDCDCDCD)
674 return true;
675
676 cond = condition & 0xFF;
677 if ((_board != cond) && cond != 0xFF)
678 return false;
679
680 cond = condition & 0xFF00;
681 cond = cond >> 8;
682 if ((_interface & cond) == 0 && cond != 0x07)
683 return false;
684
685 cond = condition & 0xFF0000;
686 cond = cond >> 16;
687 if ((_platform & cond) == 0 && cond != 0x0F)
688 return false;
689 return true;
690}
691
692static void _rtl8821ae_config_rf_reg(struct ieee80211_hw *hw,
693 u32 addr, u32 data,
694 enum radio_path rfpath, u32 regaddr)
695{
696 if (addr == 0xfe || addr == 0xffe) {
697 /* In order not to disturb BT music when
698 * wifi init.(1ant NIC only)
699 */
700 mdelay(50);
701 } else {
702 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
703 udelay(1);
704 }
705}
706
707static void _rtl8821ae_config_rf_radio_a(struct ieee80211_hw *hw,
708 u32 addr, u32 data)
709{
710 u32 content = 0x1000; /*RF Content: radio_a_txt*/
711 u32 maskforphyset = (u32)(content & 0xE000);
712
713 _rtl8821ae_config_rf_reg(hw, addr, data,
714 RF90_PATH_A, addr | maskforphyset);
715}
716
717static void _rtl8821ae_config_rf_radio_b(struct ieee80211_hw *hw,
718 u32 addr, u32 data)
719{
720 u32 content = 0x1001; /*RF Content: radio_b_txt*/
721 u32 maskforphyset = (u32)(content & 0xE000);
722
723 _rtl8821ae_config_rf_reg(hw, addr, data,
724 RF90_PATH_B, addr | maskforphyset);
725}
726
727static void _rtl8821ae_config_bb_reg(struct ieee80211_hw *hw,
728 u32 addr, u32 data)
729{
730 if (addr == 0xfe)
731 mdelay(50);
732 else if (addr == 0xfd)
733 mdelay(5);
734 else if (addr == 0xfc)
735 mdelay(1);
736 else if (addr == 0xfb)
737 udelay(50);
738 else if (addr == 0xfa)
739 udelay(5);
740 else if (addr == 0xf9)
741 udelay(1);
742 else
743 rtl_set_bbreg(hw, addr, MASKDWORD, data);
744
745 udelay(1);
746}
747
748static void _rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
749{
750 struct rtl_priv *rtlpriv = rtl_priv(hw);
751 struct rtl_phy *rtlphy = &rtlpriv->phy;
752 u8 band, rfpath, txnum, rate_section;
753
754 for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
755 for (rfpath = 0; rfpath < TX_PWR_BY_RATE_NUM_RF; ++rfpath)
756 for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
757 for (rate_section = 0;
758 rate_section < TX_PWR_BY_RATE_NUM_SECTION;
759 ++rate_section)
760 rtlphy->tx_power_by_rate_offset[band]
761 [rfpath][txnum][rate_section] = 0;
762}
763
764static void _rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
765 u8 band, u8 path,
766 u8 rate_section,
767 u8 txnum, u8 value)
768{
769 struct rtl_priv *rtlpriv = rtl_priv(hw);
770 struct rtl_phy *rtlphy = &rtlpriv->phy;
771
772 if (path > RF90_PATH_D) {
773 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
774 "Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", path);
775 return;
776 }
777
778 if (band == BAND_ON_2_4G) {
779 switch (rate_section) {
780 case CCK:
781 rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
782 break;
783 case OFDM:
784 rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
785 break;
786 case HT_MCS0_MCS7:
787 rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
788 break;
789 case HT_MCS8_MCS15:
790 rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
791 break;
792 case VHT_1SSMCS0_1SSMCS9:
793 rtlphy->txpwr_by_rate_base_24g[path][txnum][4] = value;
794 break;
795 case VHT_2SSMCS0_2SSMCS9:
796 rtlphy->txpwr_by_rate_base_24g[path][txnum][5] = value;
797 break;
798 default:
799 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
800 "Invalid RateSection %d in Band 2.4G,Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
801 rate_section, path, txnum);
802 break;
803 };
804 } else if (band == BAND_ON_5G) {
805 switch (rate_section) {
806 case OFDM:
807 rtlphy->txpwr_by_rate_base_5g[path][txnum][0] = value;
808 break;
809 case HT_MCS0_MCS7:
810 rtlphy->txpwr_by_rate_base_5g[path][txnum][1] = value;
811 break;
812 case HT_MCS8_MCS15:
813 rtlphy->txpwr_by_rate_base_5g[path][txnum][2] = value;
814 break;
815 case VHT_1SSMCS0_1SSMCS9:
816 rtlphy->txpwr_by_rate_base_5g[path][txnum][3] = value;
817 break;
818 case VHT_2SSMCS0_2SSMCS9:
819 rtlphy->txpwr_by_rate_base_5g[path][txnum][4] = value;
820 break;
821 default:
822 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
823 "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n",
824 rate_section, path, txnum);
825 break;
826 };
827 } else {
828 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
829 "Invalid Band %d in PHY_SetTxPowerByRateBase()\n", band);
830 }
831}
832
833static u8 _rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
834 u8 band, u8 path,
835 u8 txnum, u8 rate_section)
836{
837 struct rtl_priv *rtlpriv = rtl_priv(hw);
838 struct rtl_phy *rtlphy = &rtlpriv->phy;
839 u8 value = 0;
840
841 if (path > RF90_PATH_D) {
842 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
843 "Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n",
844 path);
845 return 0;
846 }
847
848 if (band == BAND_ON_2_4G) {
849 switch (rate_section) {
850 case CCK:
851 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
852 break;
853 case OFDM:
854 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
855 break;
856 case HT_MCS0_MCS7:
857 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
858 break;
859 case HT_MCS8_MCS15:
860 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
861 break;
862 case VHT_1SSMCS0_1SSMCS9:
863 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][4];
864 break;
865 case VHT_2SSMCS0_2SSMCS9:
866 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][5];
867 break;
868 default:
869 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
870 "Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
871 rate_section, path, txnum);
872 break;
873 };
874 } else if (band == BAND_ON_5G) {
875 switch (rate_section) {
876 case OFDM:
877 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][0];
878 break;
879 case HT_MCS0_MCS7:
880 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][1];
881 break;
882 case HT_MCS8_MCS15:
883 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][2];
884 break;
885 case VHT_1SSMCS0_1SSMCS9:
886 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][3];
887 break;
888 case VHT_2SSMCS0_2SSMCS9:
889 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][4];
890 break;
891 default:
892 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
893 "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
894 rate_section, path, txnum);
895 break;
896 };
897 } else {
898 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
899 "Invalid Band %d in PHY_GetTxPowerByRateBase()\n", band);
900 }
901
902 return value;
903}
904
905static void _rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
906{
907 struct rtl_priv *rtlpriv = rtl_priv(hw);
908 struct rtl_phy *rtlphy = &rtlpriv->phy;
909 u16 rawValue = 0;
910 u8 base = 0, path = 0;
911
912 for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
913 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][0] >> 24) & 0xFF;
914 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
915 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, CCK, RF_1TX, base);
916
917 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][2] >> 24) & 0xFF;
918 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
919 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, base);
920
921 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][4] >> 24) & 0xFF;
922 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
923 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base);
924
925 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][6] >> 24) & 0xFF;
926 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
927 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base);
928
929 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][8] >> 24) & 0xFF;
930 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
931 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
932
933 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][11] >> 8) & 0xFF;
934 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
935 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
936
937 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][2] >> 24) & 0xFF;
938 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
939 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, OFDM, RF_1TX, base);
940
941 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][4] >> 24) & 0xFF;
942 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
943 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base);
944
945 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][6] >> 24) & 0xFF;
946 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
947 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base);
948
949 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][8] >> 24) & 0xFF;
950 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
951 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
952
953 rawValue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][11] >> 8) & 0xFF;
954 base = (rawValue >> 4) * 10 + (rawValue & 0xF);
955 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
956 }
957}
958
959static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
960 u8 end, u8 base_val)
961{
962 char i = 0;
963 u8 temp_value = 0;
964 u32 temp_data = 0;
965
966 for (i = 3; i >= 0; --i) {
967 if (i >= start && i <= end) {
968 /* Get the exact value */
969 temp_value = (u8)(*data >> (i * 8)) & 0xF;
970 temp_value += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
971
972 /* Change the value to a relative value */
973 temp_value = (temp_value > base_val) ? temp_value -
974 base_val : base_val - temp_value;
975 } else {
976 temp_value = (u8)(*data >> (i * 8)) & 0xFF;
977 }
978 temp_data <<= 8;
979 temp_data |= temp_value;
980 }
981 *data = temp_data;
982}
983
984static void _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw *hw)
985{
986 struct rtl_priv *rtlpriv = rtl_priv(hw);
987 struct rtl_phy *rtlphy = &rtlpriv->phy;
988 u8 regulation, bw, channel, rate_section;
989 char temp_pwrlmt = 0;
990
991 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
992 for (bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw) {
993 for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
994 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
995 temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
996 [bw][rate_section][channel][RF90_PATH_A];
997 if (temp_pwrlmt == MAX_POWER_INDEX) {
998 if (bw == 0 || bw == 1) { /*5G 20M 40M VHT and HT can cross reference*/
999 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1000 "No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n",
1001 1, bw, rate_section, channel, RF90_PATH_A);
1002 if (rate_section == 2) {
1003 rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A] =
1004 rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A];
1005 } else if (rate_section == 4) {
1006 rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A] =
1007 rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A];
1008 } else if (rate_section == 3) {
1009 rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A] =
1010 rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A];
1011 } else if (rate_section == 5) {
1012 rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A] =
1013 rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A];
1014 }
1015
1016 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "use other value %d", temp_pwrlmt);
1017 }
1018 }
1019 }
1020 }
1021 }
1022 }
1023}
1024
1025static u8 _rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw *hw,
1026 enum band_type band, u8 rate)
1027{
1028 struct rtl_priv *rtlpriv = rtl_priv(hw);
1029 u8 index = 0;
1030 if (band == BAND_ON_2_4G) {
1031 switch (rate) {
1032 case MGN_1M:
1033 case MGN_2M:
1034 case MGN_5_5M:
1035 case MGN_11M:
1036 index = 0;
1037 break;
1038
1039 case MGN_6M:
1040 case MGN_9M:
1041 case MGN_12M:
1042 case MGN_18M:
1043 case MGN_24M:
1044 case MGN_36M:
1045 case MGN_48M:
1046 case MGN_54M:
1047 index = 1;
1048 break;
1049
1050 case MGN_MCS0:
1051 case MGN_MCS1:
1052 case MGN_MCS2:
1053 case MGN_MCS3:
1054 case MGN_MCS4:
1055 case MGN_MCS5:
1056 case MGN_MCS6:
1057 case MGN_MCS7:
1058 index = 2;
1059 break;
1060
1061 case MGN_MCS8:
1062 case MGN_MCS9:
1063 case MGN_MCS10:
1064 case MGN_MCS11:
1065 case MGN_MCS12:
1066 case MGN_MCS13:
1067 case MGN_MCS14:
1068 case MGN_MCS15:
1069 index = 3;
1070 break;
1071
1072 default:
1073 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1074 "Wrong rate 0x%x to obtain index in 2.4G in PHY_GetTxPowerByRateBaseIndex()\n",
1075 rate);
1076 break;
1077 }
1078 } else if (band == BAND_ON_5G) {
1079 switch (rate) {
1080 case MGN_6M:
1081 case MGN_9M:
1082 case MGN_12M:
1083 case MGN_18M:
1084 case MGN_24M:
1085 case MGN_36M:
1086 case MGN_48M:
1087 case MGN_54M:
1088 index = 0;
1089 break;
1090
1091 case MGN_MCS0:
1092 case MGN_MCS1:
1093 case MGN_MCS2:
1094 case MGN_MCS3:
1095 case MGN_MCS4:
1096 case MGN_MCS5:
1097 case MGN_MCS6:
1098 case MGN_MCS7:
1099 index = 1;
1100 break;
1101
1102 case MGN_MCS8:
1103 case MGN_MCS9:
1104 case MGN_MCS10:
1105 case MGN_MCS11:
1106 case MGN_MCS12:
1107 case MGN_MCS13:
1108 case MGN_MCS14:
1109 case MGN_MCS15:
1110 index = 2;
1111 break;
1112
1113 case MGN_VHT1SS_MCS0:
1114 case MGN_VHT1SS_MCS1:
1115 case MGN_VHT1SS_MCS2:
1116 case MGN_VHT1SS_MCS3:
1117 case MGN_VHT1SS_MCS4:
1118 case MGN_VHT1SS_MCS5:
1119 case MGN_VHT1SS_MCS6:
1120 case MGN_VHT1SS_MCS7:
1121 case MGN_VHT1SS_MCS8:
1122 case MGN_VHT1SS_MCS9:
1123 index = 3;
1124 break;
1125
1126 case MGN_VHT2SS_MCS0:
1127 case MGN_VHT2SS_MCS1:
1128 case MGN_VHT2SS_MCS2:
1129 case MGN_VHT2SS_MCS3:
1130 case MGN_VHT2SS_MCS4:
1131 case MGN_VHT2SS_MCS5:
1132 case MGN_VHT2SS_MCS6:
1133 case MGN_VHT2SS_MCS7:
1134 case MGN_VHT2SS_MCS8:
1135 case MGN_VHT2SS_MCS9:
1136 index = 4;
1137 break;
1138
1139 default:
1140 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1141 "Wrong rate 0x%x to obtain index in 5G in PHY_GetTxPowerByRateBaseIndex()\n",
1142 rate);
1143 break;
1144 }
1145 }
1146
1147 return index;
1148}
1149
1150static void _rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw *hw)
1151{
1152 struct rtl_priv *rtlpriv = rtl_priv(hw);
1153 struct rtl_phy *rtlphy = &rtlpriv->phy;
1154 u8 bw40_pwr_base_dbm2_4G, bw40_pwr_base_dbm5G;
1155 u8 regulation, bw, channel, rate_section;
1156 u8 base_index2_4G = 0;
1157 u8 base_index5G = 0;
1158 char temp_value = 0, temp_pwrlmt = 0;
1159 u8 rf_path = 0;
1160
1161 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1162 "=====> _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
1163
1164 _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(hw);
1165
1166 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1167 for (bw = 0; bw < MAX_2_4G_BANDWITH_NUM; ++bw) {
1168 for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) {
1169 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1170 /* obtain the base dBm values in 2.4G band
1171 CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15*/
1172 if (rate_section == 0) { /*CCK*/
1173 base_index2_4G =
1174 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1175 BAND_ON_2_4G, MGN_11M);
1176 } else if (rate_section == 1) { /*OFDM*/
1177 base_index2_4G =
1178 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1179 BAND_ON_2_4G, MGN_54M);
1180 } else if (rate_section == 2) { /*HT IT*/
1181 base_index2_4G =
1182 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1183 BAND_ON_2_4G, MGN_MCS7);
1184 } else if (rate_section == 3) { /*HT 2T*/
1185 base_index2_4G =
1186 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1187 BAND_ON_2_4G, MGN_MCS15);
1188 }
1189
1190 temp_pwrlmt = rtlphy->txpwr_limit_2_4g[regulation]
1191 [bw][rate_section][channel][RF90_PATH_A];
1192
1193 for (rf_path = RF90_PATH_A;
1194 rf_path < MAX_RF_PATH_NUM;
1195 ++rf_path) {
1196 if (rate_section == 3)
1197 bw40_pwr_base_dbm2_4G =
1198 rtlphy->txpwr_by_rate_base_24g[rf_path][RF_2TX][base_index2_4G];
1199 else
1200 bw40_pwr_base_dbm2_4G =
1201 rtlphy->txpwr_by_rate_base_24g[rf_path][RF_1TX][base_index2_4G];
1202
1203 if (temp_pwrlmt != MAX_POWER_INDEX) {
1204 temp_value = temp_pwrlmt - bw40_pwr_base_dbm2_4G;
1205 rtlphy->txpwr_limit_2_4g[regulation]
1206 [bw][rate_section][channel][rf_path] =
1207 temp_value;
1208 }
1209
1210 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1211 "TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][channel %d] = %d\n(TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfPath %d] %d)\n",
1212 regulation, bw, rate_section, channel,
1213 rtlphy->txpwr_limit_2_4g[regulation][bw]
1214 [rate_section][channel][rf_path], (temp_pwrlmt == 63)
1215 ? 0 : temp_pwrlmt/2, channel, rf_path,
1216 bw40_pwr_base_dbm2_4G);
1217 }
1218 }
1219 }
1220 }
1221 }
1222 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1223 for (bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw) {
1224 for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
1225 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) {
1226 /* obtain the base dBm values in 5G band
1227 OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15,
1228 VHT => 1SSMCS7, VHT 2T => 2SSMCS7*/
1229 if (rate_section == 1) { /*OFDM*/
1230 base_index5G =
1231 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1232 BAND_ON_5G, MGN_54M);
1233 } else if (rate_section == 2) { /*HT 1T*/
1234 base_index5G =
1235 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1236 BAND_ON_5G, MGN_MCS7);
1237 } else if (rate_section == 3) { /*HT 2T*/
1238 base_index5G =
1239 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1240 BAND_ON_5G, MGN_MCS15);
1241 } else if (rate_section == 4) { /*VHT 1T*/
1242 base_index5G =
1243 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1244 BAND_ON_5G, MGN_VHT1SS_MCS7);
1245 } else if (rate_section == 5) { /*VHT 2T*/
1246 base_index5G =
1247 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw,
1248 BAND_ON_5G, MGN_VHT2SS_MCS7);
1249 }
1250
1251 temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation]
1252 [bw][rate_section][channel]
1253 [RF90_PATH_A];
1254
1255 for (rf_path = RF90_PATH_A;
1256 rf_path < MAX_RF_PATH_NUM;
1257 ++rf_path) {
1258 if (rate_section == 3 || rate_section == 5)
1259 bw40_pwr_base_dbm5G =
1260 rtlphy->txpwr_by_rate_base_5g[rf_path]
1261 [RF_2TX][base_index5G];
1262 else
1263 bw40_pwr_base_dbm5G =
1264 rtlphy->txpwr_by_rate_base_5g[rf_path]
1265 [RF_1TX][base_index5G];
1266
1267 if (temp_pwrlmt != MAX_POWER_INDEX) {
1268 temp_value =
1269 temp_pwrlmt - bw40_pwr_base_dbm5G;
1270 rtlphy->txpwr_limit_5g[regulation]
1271 [bw][rate_section][channel]
1272 [rf_path] = temp_value;
1273 }
1274
1275 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1276 "TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][channel %d] =%d\n(TxPwrLimit in dBm %d - BW40PwrLmt5G[chnl group %d][rfPath %d] %d)\n",
1277 regulation, bw, rate_section,
1278 channel, rtlphy->txpwr_limit_5g[regulation]
1279 [bw][rate_section][channel][rf_path],
1280 temp_pwrlmt, channel, rf_path, bw40_pwr_base_dbm5G);
1281 }
1282 }
1283 }
1284 }
1285 }
1286 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1287 "<===== _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n");
1288}
1289
1290static void _rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw *hw)
1291{
1292 struct rtl_priv *rtlpriv = rtl_priv(hw);
1293 struct rtl_phy *rtlphy = &rtlpriv->phy;
1294 u8 i, j, k, l, m;
1295
1296 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1297 "=====> _rtl8821ae_phy_init_txpower_limit()!\n");
1298
1299 for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1300 for (j = 0; j < MAX_2_4G_BANDWITH_NUM; ++j)
1301 for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1302 for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m)
1303 for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1304 rtlphy->txpwr_limit_2_4g
1305 [i][j][k][m][l]
1306 = MAX_POWER_INDEX;
1307 }
1308 for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1309 for (j = 0; j < MAX_5G_BANDWITH_NUM; ++j)
1310 for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1311 for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m)
1312 for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1313 rtlphy->txpwr_limit_5g
1314 [i][j][k][m][l]
1315 = MAX_POWER_INDEX;
1316 }
1317
1318 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1319 "<===== _rtl8821ae_phy_init_txpower_limit()!\n");
1320}
1321
1322static void _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw)
1323{
1324 struct rtl_priv *rtlpriv = rtl_priv(hw);
1325 struct rtl_phy *rtlphy = &rtlpriv->phy;
1326 u8 base = 0, rfPath = 0;
1327
1328 for (rfPath = RF90_PATH_A; rfPath <= RF90_PATH_B; ++rfPath) {
1329 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, CCK);
1330 _phy_convert_txpower_dbm_to_relative_value(
1331 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][0],
1332 0, 3, base);
1333
1334 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, OFDM);
1335 _phy_convert_txpower_dbm_to_relative_value(
1336 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][1],
1337 0, 3, base);
1338 _phy_convert_txpower_dbm_to_relative_value(
1339 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][2],
1340 0, 3, base);
1341
1342 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, HT_MCS0_MCS7);
1343 _phy_convert_txpower_dbm_to_relative_value(
1344 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][3],
1345 0, 3, base);
1346 _phy_convert_txpower_dbm_to_relative_value(
1347 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][4],
1348 0, 3, base);
1349
1350 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_2TX, HT_MCS8_MCS15);
1351
1352 _phy_convert_txpower_dbm_to_relative_value(
1353 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][5],
1354 0, 3, base);
1355
1356 _phy_convert_txpower_dbm_to_relative_value(
1357 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][6],
1358 0, 3, base);
1359
1360 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1361 _phy_convert_txpower_dbm_to_relative_value(
1362 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][7],
1363 0, 3, base);
1364 _phy_convert_txpower_dbm_to_relative_value(
1365 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][8],
1366 0, 3, base);
1367 _phy_convert_txpower_dbm_to_relative_value(
1368 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][9],
1369 0, 1, base);
1370
1371 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfPath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1372 _phy_convert_txpower_dbm_to_relative_value(
1373 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_1TX][9],
1374 2, 3, base);
1375 _phy_convert_txpower_dbm_to_relative_value(
1376 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][10],
1377 0, 3, base);
1378 _phy_convert_txpower_dbm_to_relative_value(
1379 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfPath][RF_2TX][11],
1380 0, 3, base);
1381
1382 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, OFDM);
1383 _phy_convert_txpower_dbm_to_relative_value(
1384 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][1],
1385 0, 3, base);
1386 _phy_convert_txpower_dbm_to_relative_value(
1387 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][2],
1388 0, 3, base);
1389
1390 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, HT_MCS0_MCS7);
1391 _phy_convert_txpower_dbm_to_relative_value(
1392 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][3],
1393 0, 3, base);
1394 _phy_convert_txpower_dbm_to_relative_value(
1395 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][4],
1396 0, 3, base);
1397
1398 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_2TX, HT_MCS8_MCS15);
1399 _phy_convert_txpower_dbm_to_relative_value(
1400 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][5],
1401 0, 3, base);
1402 _phy_convert_txpower_dbm_to_relative_value(
1403 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][6],
1404 0, 3, base);
1405
1406 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_1TX, VHT_1SSMCS0_1SSMCS9);
1407 _phy_convert_txpower_dbm_to_relative_value(
1408 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][7],
1409 0, 3, base);
1410 _phy_convert_txpower_dbm_to_relative_value(
1411 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][8],
1412 0, 3, base);
1413 _phy_convert_txpower_dbm_to_relative_value(
1414 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][9],
1415 0, 1, base);
1416
1417 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfPath, RF_2TX, VHT_2SSMCS0_2SSMCS9);
1418 _phy_convert_txpower_dbm_to_relative_value(
1419 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_1TX][9],
1420 2, 3, base);
1421 _phy_convert_txpower_dbm_to_relative_value(
1422 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][10],
1423 0, 3, base);
1424 _phy_convert_txpower_dbm_to_relative_value(
1425 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfPath][RF_2TX][11],
1426 0, 3, base);
1427 }
1428
1429 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE,
1430 "<===_rtl8821ae_phy_convert_txpower_dbm_to_relative_value()\n");
1431}
1432
1433static void _rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
1434{
1435 _rtl8821ae_phy_store_txpower_by_rate_base(hw);
1436 _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(hw);
1437}
1438
1439/* string is in decimal */
1440static bool _rtl8812ae_get_integer_from_string(char *str, u8 *pint)
1441{
1442 u16 i = 0;
1443 *pint = 0;
1444
1445 while (str[i] != '\0') {
1446 if (str[i] >= '0' && str[i] <= '9') {
1447 *pint *= 10;
1448 *pint += (str[i] - '0');
1449 } else {
1450 return false;
1451 }
1452 ++i;
1453 }
1454
1455 return true;
1456}
1457
1458static bool _rtl8812ae_eq_n_byte(u8 *str1, u8 *str2, u32 num)
1459{
1460 if (num == 0)
1461 return false;
1462 while (num > 0) {
1463 num--;
1464 if (str1[num] != str2[num])
1465 return false;
1466 }
1467 return true;
1468}
1469
1470static char _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw,
1471 u8 band, u8 channel)
1472{
1473 struct rtl_priv *rtlpriv = rtl_priv(hw);
1474 char channel_index = -1;
1475 u8 channel_5g[CHANNEL_MAX_NUMBER_5G] = {
1476 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,
1477 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122,
1478 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 149,
1479 151, 153, 155, 157, 159, 161, 163, 165, 167, 168, 169, 171,
1480 173, 175, 177};
1481 u8 i = 0;
1482 if (band == BAND_ON_2_4G)
1483 channel_index = channel - 1;
1484 else if (band == BAND_ON_5G) {
1485 for (i = 0; i < sizeof(channel_5g)/sizeof(u8); ++i) {
1486 if (channel_5g[i] == channel)
1487 channel_index = i;
1488 }
1489 } else
1490 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Band %d in %s",
1491 band, __func__);
1492
1493 if (channel_index == -1)
1494 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
1495 "Invalid Channel %d of Band %d in %s", channel,
1496 band, __func__);
1497
1498 return channel_index;
1499}
1500
1501static void _rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw *hw, u8 *pregulation,
1502 u8 *pband, u8 *pbandwidth,
1503 u8 *prate_section, u8 *prf_path,
1504 u8 *pchannel, u8 *ppower_limit)
1505{
1506 struct rtl_priv *rtlpriv = rtl_priv(hw);
1507 struct rtl_phy *rtlphy = &rtlpriv->phy;
1508 u8 regulation = 0, bandwidth = 0, rate_section = 0, channel;
1509 u8 channel_index;
1510 char power_limit = 0, prev_power_limit, ret;
1511
1512 if (!_rtl8812ae_get_integer_from_string((char *)pchannel, &channel) ||
1513 !_rtl8812ae_get_integer_from_string((char *)ppower_limit,
1514 &power_limit)) {
1515 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1516 "Illegal index of pwr_lmt table [chnl %d][val %d]\n",
1517 channel, power_limit);
1518 }
1519
1520 power_limit = power_limit > MAX_POWER_INDEX ?
1521 MAX_POWER_INDEX : power_limit;
1522
1523 if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("FCC"), 3))
1524 regulation = 0;
1525 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("MKK"), 3))
1526 regulation = 1;
1527 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("ETSI"), 4))
1528 regulation = 2;
1529 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("WW13"), 4))
1530 regulation = 3;
1531
1532 if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("CCK"), 3))
1533 rate_section = 0;
1534 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("OFDM"), 4))
1535 rate_section = 1;
1536 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) &&
1537 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2))
1538 rate_section = 2;
1539 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) &&
1540 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2))
1541 rate_section = 3;
1542 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) &&
1543 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2))
1544 rate_section = 4;
1545 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) &&
1546 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2))
1547 rate_section = 5;
1548
1549 if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("20M"), 3))
1550 bandwidth = 0;
1551 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("40M"), 3))
1552 bandwidth = 1;
1553 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("80M"), 3))
1554 bandwidth = 2;
1555 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("160M"), 4))
1556 bandwidth = 3;
1557
1558 if (_rtl8812ae_eq_n_byte(pband, (u8 *)("2.4G"), 4)) {
1559 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1560 BAND_ON_2_4G,
1561 channel);
1562
1563 if (ret == -1)
1564 return;
1565
1566 channel_index = ret;
1567
1568 prev_power_limit = rtlphy->txpwr_limit_2_4g[regulation]
1569 [bandwidth][rate_section]
1570 [channel_index][RF90_PATH_A];
1571
1572 if (power_limit < prev_power_limit)
1573 rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1574 [rate_section][channel_index][RF90_PATH_A] =
1575 power_limit;
1576
1577 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1578 "2.4G [regula %d][bw %d][sec %d][chnl %d][val %d]\n",
1579 regulation, bandwidth, rate_section, channel_index,
1580 rtlphy->txpwr_limit_2_4g[regulation][bandwidth]
1581 [rate_section][channel_index][RF90_PATH_A]);
1582 } else if (_rtl8812ae_eq_n_byte(pband, (u8 *)("5G"), 2)) {
1583 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
1584 BAND_ON_5G,
1585 channel);
1586
1587 if (ret == -1)
1588 return;
1589
1590 channel_index = ret;
1591
1592 prev_power_limit = rtlphy->txpwr_limit_5g[regulation][bandwidth]
1593 [rate_section][channel_index]
1594 [RF90_PATH_A];
1595
1596 if (power_limit < prev_power_limit)
1597 rtlphy->txpwr_limit_5g[regulation][bandwidth]
1598 [rate_section][channel_index][RF90_PATH_A] = power_limit;
1599
1600 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1601 "5G: [regul %d][bw %d][sec %d][chnl %d][val %d]\n",
1602 regulation, bandwidth, rate_section, channel,
1603 rtlphy->txpwr_limit_5g[regulation][bandwidth]
1604 [rate_section][channel_index][RF90_PATH_A]);
1605 } else {
1606 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1607 "Cannot recognize the band info in %s\n", pband);
1608 return;
1609 }
1610}
1611
1612static void _rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw *hw,
1613 u8 *regulation, u8 *band,
1614 u8 *bandwidth, u8 *rate_section,
1615 u8 *rf_path, u8 *channel,
1616 u8 *power_limit)
1617{
1618 _rtl8812ae_phy_set_txpower_limit(hw, regulation, band, bandwidth,
1619 rate_section, rf_path, channel,
1620 power_limit);
1621}
1622
1623static void _rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw *hw)
1624{
1625 struct rtl_priv *rtlpriv = rtl_priv(hw);
1626 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1627 u32 i = 0;
1628 u32 array_len;
1629 u8 **array;
1630
1631 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1632 array_len = RTL8812AE_TXPWR_LMT_ARRAY_LEN;
1633 array = RTL8812AE_TXPWR_LMT;
1634 } else {
1635 array_len = RTL8821AE_TXPWR_LMT_ARRAY_LEN;
1636 array = RTL8821AE_TXPWR_LMT;
1637 }
1638
1639 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1640 "\n");
1641
1642 for (i = 0; i < array_len; i += 7) {
1643 u8 *regulation = array[i];
1644 u8 *band = array[i+1];
1645 u8 *bandwidth = array[i+2];
1646 u8 *rate = array[i+3];
1647 u8 *rf_path = array[i+4];
1648 u8 *chnl = array[i+5];
1649 u8 *val = array[i+6];
1650
1651 _rtl8812ae_phy_config_bb_txpwr_lmt(hw, regulation, band,
1652 bandwidth, rate, rf_path,
1653 chnl, val);
1654 }
1655}
1656
1657static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw)
1658{
1659 struct rtl_priv *rtlpriv = rtl_priv(hw);
1660 struct rtl_phy *rtlphy = &rtlpriv->phy;
1661 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1662 bool rtstatus;
1663
1664 _rtl8821ae_phy_init_txpower_limit(hw);
1665
1666 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1667 if (rtlefuse->eeprom_regulatory != 2)
1668 _rtl8821ae_phy_read_and_config_txpwr_lmt(hw);
1669
1670 rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1671 BASEBAND_CONFIG_PHY_REG);
1672 if (rtstatus != true) {
1673 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "Write BB Reg Fail!!");
1674 return false;
1675 }
1676 _rtl8821ae_phy_init_tx_power_by_rate(hw);
1677 if (rtlefuse->autoload_failflag == false) {
1678 rtstatus = _rtl8821ae_phy_config_bb_with_pgheaderfile(hw,
1679 BASEBAND_CONFIG_PHY_REG);
1680 }
1681 if (rtstatus != true) {
1682 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "BB_PG Reg Fail!!");
1683 return false;
1684 }
1685
1686 _rtl8821ae_phy_txpower_by_rate_configuration(hw);
1687
1688 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
1689 if (rtlefuse->eeprom_regulatory != 2)
1690 _rtl8812ae_phy_convert_txpower_limit_to_power_index(hw);
1691
1692 rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw,
1693 BASEBAND_CONFIG_AGC_TAB);
1694
1695 if (rtstatus != true) {
1696 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG, "AGC Table Fail\n");
1697 return false;
1698 }
1699 rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
1700 RFPGA0_XA_HSSIPARAMETER2, 0x200));
1701 return true;
1702}
1703
1704static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
1705{
1706 struct rtl_priv *rtlpriv = rtl_priv(hw);
1707 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1708 u32 i, v1, v2;
1709 u32 arraylength;
1710 u32 *ptrarray;
1711
1712 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read MAC_REG_Array\n");
1713 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1714 arraylength = RTL8821AEMAC_1T_ARRAYLEN;
1715 ptrarray = RTL8821AE_MAC_REG_ARRAY;
1716 } else {
1717 arraylength = RTL8812AEMAC_1T_ARRAYLEN;
1718 ptrarray = RTL8812AE_MAC_REG_ARRAY;
1719 }
1720 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1721 "Img: MAC_REG_ARRAY LEN %d\n", arraylength);
1722 for (i = 0; i < arraylength; i += 2) {
1723 v1 = ptrarray[i];
1724 v2 = (u8)ptrarray[i + 1];
1725 if (v1 < 0xCDCDCDCD) {
1726 rtl_write_byte(rtlpriv, v1, (u8)v2);
1727 continue;
1728 } else {
1729 if (!_rtl8821ae_check_condition(hw, v1)) {
1730 /*Discard the following (offset, data) pairs*/
1731 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1732 while (v2 != 0xDEAD &&
1733 v2 != 0xCDEF &&
1734 v2 != 0xCDCD && i < arraylength - 2) {
1735 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1736 }
1737 i -= 2; /* prevent from for-loop += 2*/
1738 } else {/*Configure matched pairs and skip to end of if-else.*/
1739 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1740 while (v2 != 0xDEAD &&
1741 v2 != 0xCDEF &&
1742 v2 != 0xCDCD && i < arraylength - 2) {
1743 rtl_write_byte(rtlpriv, v1, v2);
1744 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1745 }
1746
1747 while (v2 != 0xDEAD && i < arraylength - 2)
1748 READ_NEXT_PAIR(ptrarray, v1, v2, i);
1749 }
1750 }
1751 }
1752 return true;
1753}
1754
1755static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
1756 u8 configtype)
1757{
1758 struct rtl_priv *rtlpriv = rtl_priv(hw);
1759 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1760 int i;
1761 u32 *array_table;
1762 u16 arraylen;
1763 u32 v1 = 0, v2 = 0;
1764
1765 if (configtype == BASEBAND_CONFIG_PHY_REG) {
1766 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1767 arraylen = RTL8812AEPHY_REG_1TARRAYLEN;
1768 array_table = RTL8812AE_PHY_REG_ARRAY;
1769 } else {
1770 arraylen = RTL8821AEPHY_REG_1TARRAYLEN;
1771 array_table = RTL8821AE_PHY_REG_ARRAY;
1772 }
1773
1774 for (i = 0; i < arraylen; i += 2) {
1775 v1 = array_table[i];
1776 v2 = array_table[i + 1];
1777 if (v1 < 0xCDCDCDCD) {
1778 _rtl8821ae_config_bb_reg(hw, v1, v2);
1779 continue;
1780 } else {/*This line is the start line of branch.*/
1781 if (!_rtl8821ae_check_condition(hw, v1)) {
1782 /*Discard the following (offset, data) pairs*/
1783 READ_NEXT_PAIR(array_table, v1, v2, i);
1784 while (v2 != 0xDEAD &&
1785 v2 != 0xCDEF &&
1786 v2 != 0xCDCD &&
1787 i < arraylen - 2) {
1788 READ_NEXT_PAIR(array_table, v1,
1789 v2, i);
1790 }
1791
1792 i -= 2; /* prevent from for-loop += 2*/
1793 } else {/*Configure matched pairs and skip to end of if-else.*/
1794 READ_NEXT_PAIR(array_table, v1, v2, i);
1795 while (v2 != 0xDEAD &&
1796 v2 != 0xCDEF &&
1797 v2 != 0xCDCD &&
1798 i < arraylen - 2) {
1799 _rtl8821ae_config_bb_reg(hw, v1,
1800 v2);
1801 READ_NEXT_PAIR(array_table, v1,
1802 v2, i);
1803 }
1804
1805 while (v2 != 0xDEAD &&
1806 i < arraylen - 2) {
1807 READ_NEXT_PAIR(array_table, v1,
1808 v2, i);
1809 }
1810 }
1811 }
1812 }
1813 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
1814 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1815 arraylen = RTL8812AEAGCTAB_1TARRAYLEN;
1816 array_table = RTL8812AE_AGC_TAB_ARRAY;
1817 } else {
1818 arraylen = RTL8821AEAGCTAB_1TARRAYLEN;
1819 array_table = RTL8821AE_AGC_TAB_ARRAY;
1820 }
1821
1822 for (i = 0; i < arraylen; i = i + 2) {
1823 v1 = array_table[i];
1824 v2 = array_table[i+1];
1825 if (v1 < 0xCDCDCDCD) {
1826 rtl_set_bbreg(hw, v1, MASKDWORD, v2);
1827 udelay(1);
1828 continue;
1829 } else {/*This line is the start line of branch.*/
1830 if (!_rtl8821ae_check_condition(hw, v1)) {
1831 /*Discard the following (offset, data) pairs*/
1832 READ_NEXT_PAIR(array_table, v1, v2, i);
1833 while (v2 != 0xDEAD &&
1834 v2 != 0xCDEF &&
1835 v2 != 0xCDCD &&
1836 i < arraylen - 2) {
1837 READ_NEXT_PAIR(array_table, v1,
1838 v2, i);
1839 }
1840 i -= 2; /* prevent from for-loop += 2*/
1841 } else {/*Configure matched pairs and skip to end of if-else.*/
1842 READ_NEXT_PAIR(array_table, v1, v2, i);
1843 while (v2 != 0xDEAD &&
1844 v2 != 0xCDEF &&
1845 v2 != 0xCDCD &&
1846 i < arraylen - 2) {
1847 rtl_set_bbreg(hw, v1, MASKDWORD,
1848 v2);
1849 udelay(1);
1850 READ_NEXT_PAIR(array_table, v1,
1851 v2, i);
1852 }
1853
1854 while (v2 != 0xDEAD &&
1855 i < arraylen - 2) {
1856 READ_NEXT_PAIR(array_table, v1,
1857 v2, i);
1858 }
1859 }
1860 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
1861 "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
1862 array_table[i], array_table[i + 1]);
1863 }
1864 }
1865 }
1866 return true;
1867}
1868
1869static u8 _rtl8821ae_get_rate_section_index(u32 regaddr)
1870{
1871 u8 index = 0;
1872 regaddr &= 0xFFF;
1873 if (regaddr >= 0xC20 && regaddr <= 0xC4C)
1874 index = (u8)((regaddr - 0xC20) / 4);
1875 else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
1876 index = (u8)((regaddr - 0xE20) / 4);
1877 else
1878 RT_ASSERT(!COMP_INIT,
1879 "Invalid RegAddr 0x%x\n", regaddr);
1880 return index;
1881}
1882
1883static void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw,
1884 u32 band, u32 rfpath,
1885 u32 txnum, u32 regaddr,
1886 u32 bitmask, u32 data)
1887{
1888 struct rtl_priv *rtlpriv = rtl_priv(hw);
1889 struct rtl_phy *rtlphy = &rtlpriv->phy;
1890 u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr);
1891
1892 if (band != BAND_ON_2_4G && band != BAND_ON_5G)
1893 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band);
1894
1895 if (rfpath >= MAX_RF_PATH)
1896 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath);
1897
1898 if (txnum >= MAX_RF_PATH)
1899 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum);
1900
1901 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data;
1902 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1903 "TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n",
1904 band, rfpath, txnum, rate_section,
1905 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section]);
1906}
1907
1908static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
1909 u8 configtype)
1910{
1911 struct rtl_priv *rtlpriv = rtl_priv(hw);
1912 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1913 int i;
1914 u32 *array;
1915 u16 arraylen;
1916 u32 v1, v2, v3, v4, v5, v6;
1917
1918 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) {
1919 arraylen = RTL8812AEPHY_REG_ARRAY_PGLEN;
1920 array = RTL8812AE_PHY_REG_ARRAY_PG;
1921 } else {
1922 arraylen = RTL8821AEPHY_REG_ARRAY_PGLEN;
1923 array = RTL8821AE_PHY_REG_ARRAY_PG;
1924 }
1925
1926 if (configtype != BASEBAND_CONFIG_PHY_REG) {
1927 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
1928 "configtype != BaseBand_Config_PHY_REG\n");
1929 return true;
1930 }
1931 for (i = 0; i < arraylen; i += 6) {
1932 v1 = array[i];
1933 v2 = array[i+1];
1934 v3 = array[i+2];
1935 v4 = array[i+3];
1936 v5 = array[i+4];
1937 v6 = array[i+5];
1938
1939 if (v1 < 0xCDCDCDCD) {
1940 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE &&
1941 (v4 == 0xfe || v4 == 0xffe)) {
1942 msleep(50);
1943 continue;
1944 }
1945
1946 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
1947 if (v4 == 0xfe)
1948 msleep(50);
1949 else if (v4 == 0xfd)
1950 mdelay(5);
1951 else if (v4 == 0xfc)
1952 mdelay(1);
1953 else if (v4 == 0xfb)
1954 udelay(50);
1955 else if (v4 == 0xfa)
1956 udelay(5);
1957 else if (v4 == 0xf9)
1958 udelay(1);
1959 }
1960 _rtl8821ae_store_tx_power_by_rate(hw, v1, v2, v3,
1961 v4, v5, v6);
1962 continue;
1963 } else {
1964 /*don't need the hw_body*/
1965 if (!_rtl8821ae_check_condition(hw, v1)) {
1966 i += 2; /* skip the pair of expression*/
1967 v1 = array[i];
1968 v2 = array[i+1];
1969 v3 = array[i+2];
1970 while (v2 != 0xDEAD) {
1971 i += 3;
1972 v1 = array[i];
1973 v2 = array[i+1];
1974 v3 = array[i+2];
1975 }
1976 }
1977 }
1978 }
1979
1980 return true;
1981}
1982
1983bool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
1984 enum radio_path rfpath)
1985{
1986 int i;
1987 bool rtstatus = true;
1988 u32 *radioa_array_table_a, *radioa_array_table_b;
1989 u16 radioa_arraylen_a, radioa_arraylen_b;
1990 struct rtl_priv *rtlpriv = rtl_priv(hw);
1991 u32 v1 = 0, v2 = 0;
1992
1993 radioa_arraylen_a = RTL8812AE_RADIOA_1TARRAYLEN;
1994 radioa_array_table_a = RTL8812AE_RADIOA_ARRAY;
1995 radioa_arraylen_b = RTL8812AE_RADIOB_1TARRAYLEN;
1996 radioa_array_table_b = RTL8812AE_RADIOB_ARRAY;
1997 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
1998 "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen_a);
1999 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2000 rtstatus = true;
2001 switch (rfpath) {
2002 case RF90_PATH_A:
2003 for (i = 0; i < radioa_arraylen_a; i = i + 2) {
2004 v1 = radioa_array_table_a[i];
2005 v2 = radioa_array_table_a[i+1];
2006 if (v1 < 0xcdcdcdcd) {
2007 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2008 continue;
2009 } else{/*This line is the start line of branch.*/
2010 if (!_rtl8821ae_check_condition(hw, v1)) {
2011 /*Discard the following (offset, data) pairs*/
2012 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2013 while (v2 != 0xDEAD &&
2014 v2 != 0xCDEF &&
2015 v2 != 0xCDCD && i < radioa_arraylen_a-2)
2016 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2017
2018 i -= 2; /* prevent from for-loop += 2*/
2019 } else {/*Configure matched pairs and skip to end of if-else.*/
2020 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2021 while (v2 != 0xDEAD &&
2022 v2 != 0xCDEF &&
2023 v2 != 0xCDCD && i < radioa_arraylen_a - 2) {
2024 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2025 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2026 }
2027
2028 while (v2 != 0xDEAD && i < radioa_arraylen_a-2)
2029 READ_NEXT_PAIR(radioa_array_table_a, v1, v2, i);
2030
2031 }
2032 }
2033 }
2034 break;
2035 case RF90_PATH_B:
2036 for (i = 0; i < radioa_arraylen_b; i = i + 2) {
2037 v1 = radioa_array_table_b[i];
2038 v2 = radioa_array_table_b[i+1];
2039 if (v1 < 0xcdcdcdcd) {
2040 _rtl8821ae_config_rf_radio_b(hw, v1, v2);
2041 continue;
2042 } else{/*This line is the start line of branch.*/
2043 if (!_rtl8821ae_check_condition(hw, v1)) {
2044 /*Discard the following (offset, data) pairs*/
2045 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2046 while (v2 != 0xDEAD &&
2047 v2 != 0xCDEF &&
2048 v2 != 0xCDCD && i < radioa_arraylen_b-2)
2049 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2050
2051 i -= 2; /* prevent from for-loop += 2*/
2052 } else {/*Configure matched pairs and skip to end of if-else.*/
2053 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2054 while (v2 != 0xDEAD &&
2055 v2 != 0xCDEF &&
2056 v2 != 0xCDCD && i < radioa_arraylen_b-2) {
2057 _rtl8821ae_config_rf_radio_b(hw, v1, v2);
2058 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2059 }
2060
2061 while (v2 != 0xDEAD && i < radioa_arraylen_b-2)
2062 READ_NEXT_PAIR(radioa_array_table_b, v1, v2, i);
2063 }
2064 }
2065 }
2066 break;
2067 case RF90_PATH_C:
2068 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2069 "switch case not process\n");
2070 break;
2071 case RF90_PATH_D:
2072 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2073 "switch case not process\n");
2074 break;
2075 }
2076 return true;
2077}
2078
2079bool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
2080 enum radio_path rfpath)
2081{
2082 #define READ_NEXT_RF_PAIR(v1, v2, i) \
2083 do { \
2084 i += 2; \
2085 v1 = radioa_array_table[i]; \
2086 v2 = radioa_array_table[i+1]; \
2087 } \
2088 while (0)
2089
2090 int i;
2091 bool rtstatus = true;
2092 u32 *radioa_array_table;
2093 u16 radioa_arraylen;
2094 struct rtl_priv *rtlpriv = rtl_priv(hw);
2095 /* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
2096 u32 v1 = 0, v2 = 0;
2097
2098 radioa_arraylen = RTL8821AE_RADIOA_1TARRAYLEN;
2099 radioa_array_table = RTL8821AE_RADIOA_ARRAY;
2100 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2101 "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen);
2102 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
2103 rtstatus = true;
2104 switch (rfpath) {
2105 case RF90_PATH_A:
2106 for (i = 0; i < radioa_arraylen; i = i + 2) {
2107 v1 = radioa_array_table[i];
2108 v2 = radioa_array_table[i+1];
2109 if (v1 < 0xcdcdcdcd)
2110 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2111 else{/*This line is the start line of branch.*/
2112 if (!_rtl8821ae_check_condition(hw, v1)) {
2113 /*Discard the following (offset, data) pairs*/
2114 READ_NEXT_RF_PAIR(v1, v2, i);
2115 while (v2 != 0xDEAD &&
2116 v2 != 0xCDEF &&
2117 v2 != 0xCDCD && i < radioa_arraylen - 2)
2118 READ_NEXT_RF_PAIR(v1, v2, i);
2119
2120 i -= 2; /* prevent from for-loop += 2*/
2121 } else {/*Configure matched pairs and skip to end of if-else.*/
2122 READ_NEXT_RF_PAIR(v1, v2, i);
2123 while (v2 != 0xDEAD &&
2124 v2 != 0xCDEF &&
2125 v2 != 0xCDCD && i < radioa_arraylen - 2) {
2126 _rtl8821ae_config_rf_radio_a(hw, v1, v2);
2127 READ_NEXT_RF_PAIR(v1, v2, i);
2128 }
2129
2130 while (v2 != 0xDEAD && i < radioa_arraylen - 2)
2131 READ_NEXT_RF_PAIR(v1, v2, i);
2132 }
2133 }
2134 }
2135 break;
2136
2137 case RF90_PATH_B:
2138 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2139 "switch case not process\n");
2140 break;
2141 case RF90_PATH_C:
2142 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2143 "switch case not process\n");
2144 break;
2145 case RF90_PATH_D:
2146 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
2147 "switch case not process\n");
2148 break;
2149 }
2150 return true;
2151}
2152
2153void rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
2154{
2155 struct rtl_priv *rtlpriv = rtl_priv(hw);
2156 struct rtl_phy *rtlphy = &rtlpriv->phy;
2157
2158 rtlphy->default_initialgain[0] =
2159 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
2160 rtlphy->default_initialgain[1] =
2161 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
2162 rtlphy->default_initialgain[2] =
2163 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
2164 rtlphy->default_initialgain[3] =
2165 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
2166
2167 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2168 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
2169 rtlphy->default_initialgain[0],
2170 rtlphy->default_initialgain[1],
2171 rtlphy->default_initialgain[2],
2172 rtlphy->default_initialgain[3]);
2173
2174 rtlphy->framesync = (u8)rtl_get_bbreg(hw,
2175 ROFDM0_RXDETECTOR3, MASKBYTE0);
2176 rtlphy->framesync_c34 = rtl_get_bbreg(hw,
2177 ROFDM0_RXDETECTOR2, MASKDWORD);
2178
2179 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
2180 "Default framesync (0x%x) = 0x%x\n",
2181 ROFDM0_RXDETECTOR3, rtlphy->framesync);
2182}
2183
2184static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
2185{
2186 struct rtl_priv *rtlpriv = rtl_priv(hw);
2187 struct rtl_phy *rtlphy = &rtlpriv->phy;
2188
2189 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2190 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
2191
2192 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
2193 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
2194
2195 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
2196 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
2197
2198 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = RA_LSSIWRITE_8821A;
2199 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = RB_LSSIWRITE_8821A;
2200
2201 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RHSSIREAD_8821AE;
2202 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RHSSIREAD_8821AE;
2203
2204 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RA_SIREAD_8821A;
2205 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RB_SIREAD_8821A;
2206
2207 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = RA_PIREAD_8821A;
2208 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = RB_PIREAD_8821A;
2209}
2210
2211void rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
2212{
2213 struct rtl_priv *rtlpriv = rtl_priv(hw);
2214 struct rtl_phy *rtlphy = &rtlpriv->phy;
2215 u8 txpwr_level;
2216 long txpwr_dbm;
2217
2218 txpwr_level = rtlphy->cur_cck_txpwridx;
2219 txpwr_dbm = _rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2220 WIRELESS_MODE_B, txpwr_level);
2221 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2222 if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2223 WIRELESS_MODE_G,
2224 txpwr_level) > txpwr_dbm)
2225 txpwr_dbm =
2226 _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
2227 txpwr_level);
2228 txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
2229 if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw,
2230 WIRELESS_MODE_N_24G,
2231 txpwr_level) > txpwr_dbm)
2232 txpwr_dbm =
2233 _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
2234 txpwr_level);
2235 *powerlevel = txpwr_dbm;
2236}
2237
2238static bool _rtl8821ae_phy_get_chnl_index(u8 channel, u8 *chnl_index)
2239{
2240 u8 channel_5g[CHANNEL_MAX_NUMBER_5G] = {
2241 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62,
2242 64, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118,
2243 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140,
2244 142, 144, 149, 151, 153, 155, 157, 159, 161, 163, 165,
2245 167, 168, 169, 171, 173, 175, 177
2246 };
2247 u8 i = 0;
2248 bool in_24g = true;
2249
2250 if (channel <= 14) {
2251 in_24g = true;
2252 *chnl_index = channel - 1;
2253 } else {
2254 in_24g = false;
2255
2256 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; ++i) {
2257 if (channel_5g[i] == channel) {
2258 *chnl_index = i;
2259 return in_24g;
2260 }
2261 }
2262 }
2263 return in_24g;
2264}
2265
2266static char _rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path, u8 rate)
2267{
2268 char rate_section = 0;
2269 switch (rate) {
2270 case DESC_RATE1M:
2271 case DESC_RATE2M:
2272 case DESC_RATE5_5M:
2273 case DESC_RATE11M:
2274 rate_section = 0;
2275 break;
2276 case DESC_RATE6M:
2277 case DESC_RATE9M:
2278 case DESC_RATE12M:
2279 case DESC_RATE18M:
2280 rate_section = 1;
2281 break;
2282 case DESC_RATE24M:
2283 case DESC_RATE36M:
2284 case DESC_RATE48M:
2285 case DESC_RATE54M:
2286 rate_section = 2;
2287 break;
2288 case DESC_RATEMCS0:
2289 case DESC_RATEMCS1:
2290 case DESC_RATEMCS2:
2291 case DESC_RATEMCS3:
2292 rate_section = 3;
2293 break;
2294 case DESC_RATEMCS4:
2295 case DESC_RATEMCS5:
2296 case DESC_RATEMCS6:
2297 case DESC_RATEMCS7:
2298 rate_section = 4;
2299 break;
2300 case DESC_RATEMCS8:
2301 case DESC_RATEMCS9:
2302 case DESC_RATEMCS10:
2303 case DESC_RATEMCS11:
2304 rate_section = 5;
2305 break;
2306 case DESC_RATEMCS12:
2307 case DESC_RATEMCS13:
2308 case DESC_RATEMCS14:
2309 case DESC_RATEMCS15:
2310 rate_section = 6;
2311 break;
2312 case DESC_RATEVHT1SS_MCS0:
2313 case DESC_RATEVHT1SS_MCS1:
2314 case DESC_RATEVHT1SS_MCS2:
2315 case DESC_RATEVHT1SS_MCS3:
2316 rate_section = 7;
2317 break;
2318 case DESC_RATEVHT1SS_MCS4:
2319 case DESC_RATEVHT1SS_MCS5:
2320 case DESC_RATEVHT1SS_MCS6:
2321 case DESC_RATEVHT1SS_MCS7:
2322 rate_section = 8;
2323 break;
2324 case DESC_RATEVHT1SS_MCS8:
2325 case DESC_RATEVHT1SS_MCS9:
2326 case DESC_RATEVHT2SS_MCS0:
2327 case DESC_RATEVHT2SS_MCS1:
2328 rate_section = 9;
2329 break;
2330 case DESC_RATEVHT2SS_MCS2:
2331 case DESC_RATEVHT2SS_MCS3:
2332 case DESC_RATEVHT2SS_MCS4:
2333 case DESC_RATEVHT2SS_MCS5:
2334 rate_section = 10;
2335 break;
2336 case DESC_RATEVHT2SS_MCS6:
2337 case DESC_RATEVHT2SS_MCS7:
2338 case DESC_RATEVHT2SS_MCS8:
2339 case DESC_RATEVHT2SS_MCS9:
2340 rate_section = 11;
2341 break;
2342 default:
2343 RT_ASSERT(true, "Rate_Section is Illegal\n");
2344 break;
2345 }
2346
2347 return rate_section;
2348}
2349
2350static char _rtl8812ae_phy_get_world_wide_limit(char *limit_table)
2351{
2352 char min = limit_table[0];
2353 u8 i = 0;
2354
2355 for (i = 0; i < MAX_REGULATION_NUM; ++i) {
2356 if (limit_table[i] < min)
2357 min = limit_table[i];
2358 }
2359 return min;
2360}
2361
2362static char _rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw *hw,
2363 u8 band,
2364 enum ht_channel_width bandwidth,
2365 enum radio_path rf_path,
2366 u8 rate, u8 channel)
2367{
2368 struct rtl_priv *rtlpriv = rtl_priv(hw);
2369 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
2370 struct rtl_phy *rtlphy = &rtlpriv->phy;
2371 short band_temp = -1, regulation = -1, bandwidth_temp = -1,
2372 rate_section = -1, channel_temp = -1;
2373 u16 bd, regu, bdwidth, sec, chnl;
2374 char power_limit = MAX_POWER_INDEX;
2375
2376 if (rtlefuse->eeprom_regulatory == 2)
2377 return MAX_POWER_INDEX;
2378
2379 regulation = TXPWR_LMT_WW;
2380
2381 if (band == BAND_ON_2_4G)
2382 band_temp = 0;
2383 else if (band == BAND_ON_5G)
2384 band_temp = 1;
2385
2386 if (bandwidth == HT_CHANNEL_WIDTH_20)
2387 bandwidth_temp = 0;
2388 else if (bandwidth == HT_CHANNEL_WIDTH_20_40)
2389 bandwidth_temp = 1;
2390 else if (bandwidth == HT_CHANNEL_WIDTH_80)
2391 bandwidth_temp = 2;
2392
2393 switch (rate) {
2394 case DESC_RATE1M:
2395 case DESC_RATE2M:
2396 case DESC_RATE5_5M:
2397 case DESC_RATE11M:
2398 rate_section = 0;
2399 break;
2400 case DESC_RATE6M:
2401 case DESC_RATE9M:
2402 case DESC_RATE12M:
2403 case DESC_RATE18M:
2404 case DESC_RATE24M:
2405 case DESC_RATE36M:
2406 case DESC_RATE48M:
2407 case DESC_RATE54M:
2408 rate_section = 1;
2409 break;
2410 case DESC_RATEMCS0:
2411 case DESC_RATEMCS1:
2412 case DESC_RATEMCS2:
2413 case DESC_RATEMCS3:
2414 case DESC_RATEMCS4:
2415 case DESC_RATEMCS5:
2416 case DESC_RATEMCS6:
2417 case DESC_RATEMCS7:
2418 rate_section = 2;
2419 break;
2420 case DESC_RATEMCS8:
2421 case DESC_RATEMCS9:
2422 case DESC_RATEMCS10:
2423 case DESC_RATEMCS11:
2424 case DESC_RATEMCS12:
2425 case DESC_RATEMCS13:
2426 case DESC_RATEMCS14:
2427 case DESC_RATEMCS15:
2428 rate_section = 3;
2429 break;
2430 case DESC_RATEVHT1SS_MCS0:
2431 case DESC_RATEVHT1SS_MCS1:
2432 case DESC_RATEVHT1SS_MCS2:
2433 case DESC_RATEVHT1SS_MCS3:
2434 case DESC_RATEVHT1SS_MCS4:
2435 case DESC_RATEVHT1SS_MCS5:
2436 case DESC_RATEVHT1SS_MCS6:
2437 case DESC_RATEVHT1SS_MCS7:
2438 case DESC_RATEVHT1SS_MCS8:
2439 case DESC_RATEVHT1SS_MCS9:
2440 rate_section = 4;
2441 break;
2442 case DESC_RATEVHT2SS_MCS0:
2443 case DESC_RATEVHT2SS_MCS1:
2444 case DESC_RATEVHT2SS_MCS2:
2445 case DESC_RATEVHT2SS_MCS3:
2446 case DESC_RATEVHT2SS_MCS4:
2447 case DESC_RATEVHT2SS_MCS5:
2448 case DESC_RATEVHT2SS_MCS6:
2449 case DESC_RATEVHT2SS_MCS7:
2450 case DESC_RATEVHT2SS_MCS8:
2451 case DESC_RATEVHT2SS_MCS9:
2452 rate_section = 5;
2453 break;
2454 default:
2455 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2456 "Wrong rate 0x%x\n", rate);
2457 break;
2458 }
2459
2460 if (band_temp == BAND_ON_5G && rate_section == 0)
2461 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2462 "Wrong rate 0x%x: No CCK in 5G Band\n", rate);
2463
2464 /*workaround for wrong index combination to obtain tx power limit,
2465 OFDM only exists in BW 20M*/
2466 if (rate_section == 1)
2467 bandwidth_temp = 0;
2468
2469 /*workaround for wrong index combination to obtain tx power limit,
2470 *HT on 80M will reference to HT on 40M
2471 */
2472 if ((rate_section == 2 || rate_section == 3) && band == BAND_ON_5G &&
2473 bandwidth_temp == 2)
2474 bandwidth_temp = 1;
2475
2476 if (band == BAND_ON_2_4G)
2477 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2478 BAND_ON_2_4G, channel);
2479 else if (band == BAND_ON_5G)
2480 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw,
2481 BAND_ON_5G, channel);
2482 else if (band == BAND_ON_BOTH)
2483 ;/* BAND_ON_BOTH don't care temporarily */
2484
2485 if (band_temp == -1 || regulation == -1 || bandwidth_temp == -1 ||
2486 rate_section == -1 || channel_temp == -1) {
2487 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2488 "Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnl %d]\n",
2489 band_temp, regulation, bandwidth_temp, rf_path,
2490 rate_section, channel_temp);
2491 return MAX_POWER_INDEX;
2492 }
2493
2494 bd = band_temp;
2495 regu = regulation;
2496 bdwidth = bandwidth_temp;
2497 sec = rate_section;
2498 chnl = channel_temp;
2499
2500 if (band == BAND_ON_2_4G) {
2501 char limits[10] = {0};
2502 u8 i;
2503
2504 for (i = 0; i < 4; ++i)
2505 limits[i] = rtlphy->txpwr_limit_2_4g[i][bdwidth]
2506 [sec][chnl][rf_path];
2507
2508 power_limit = (regulation == TXPWR_LMT_WW) ?
2509 _rtl8812ae_phy_get_world_wide_limit(limits) :
2510 rtlphy->txpwr_limit_2_4g[regu][bdwidth]
2511 [sec][chnl][rf_path];
2512 } else if (band == BAND_ON_5G) {
2513 char limits[10] = {0};
2514 u8 i;
2515
2516 for (i = 0; i < MAX_REGULATION_NUM; ++i)
2517 limits[i] = rtlphy->txpwr_limit_5g[i][bdwidth]
2518 [sec][chnl][rf_path];
2519
2520 power_limit = (regulation == TXPWR_LMT_WW) ?
2521 _rtl8812ae_phy_get_world_wide_limit(limits) :
2522 rtlphy->txpwr_limit_5g[regu][chnl]
2523 [sec][chnl][rf_path];
2524 } else {
2525 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2526 "No power limit table of the specified band\n");
2527 }
2528 return power_limit;
2529}
2530
2531static char _rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw *hw,
2532 u8 band, u8 path, u8 rate)
2533{
2534 struct rtl_priv *rtlpriv = rtl_priv(hw);
2535 struct rtl_phy *rtlphy = &rtlpriv->phy;
2536 u8 shift = 0, rate_section, tx_num;
2537 char tx_pwr_diff = 0;
2538 char limit = 0;
2539
2540 rate_section = _rtl8821ae_phy_get_ratesection_intxpower_byrate(path, rate);
2541 tx_num = RF_TX_NUM_NONIMPLEMENT;
2542
2543 if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
2544 if ((rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) ||
2545 (rate >= DESC_RATEVHT2SS_MCS2 && rate <= DESC_RATEVHT2SS_MCS9))
2546 tx_num = RF_2TX;
2547 else
2548 tx_num = RF_1TX;
2549 }
2550
2551 switch (rate) {
2552 case DESC_RATE1M:
2553 case DESC_RATE6M:
2554 case DESC_RATE24M:
2555 case DESC_RATEMCS0:
2556 case DESC_RATEMCS4:
2557 case DESC_RATEMCS8:
2558 case DESC_RATEMCS12:
2559 case DESC_RATEVHT1SS_MCS0:
2560 case DESC_RATEVHT1SS_MCS4:
2561 case DESC_RATEVHT1SS_MCS8:
2562 case DESC_RATEVHT2SS_MCS2:
2563 case DESC_RATEVHT2SS_MCS6:
2564 shift = 0;
2565 break;
2566 case DESC_RATE2M:
2567 case DESC_RATE9M:
2568 case DESC_RATE36M:
2569 case DESC_RATEMCS1:
2570 case DESC_RATEMCS5:
2571 case DESC_RATEMCS9:
2572 case DESC_RATEMCS13:
2573 case DESC_RATEVHT1SS_MCS1:
2574 case DESC_RATEVHT1SS_MCS5:
2575 case DESC_RATEVHT1SS_MCS9:
2576 case DESC_RATEVHT2SS_MCS3:
2577 case DESC_RATEVHT2SS_MCS7:
2578 shift = 8;
2579 break;
2580 case DESC_RATE5_5M:
2581 case DESC_RATE12M:
2582 case DESC_RATE48M:
2583 case DESC_RATEMCS2:
2584 case DESC_RATEMCS6:
2585 case DESC_RATEMCS10:
2586 case DESC_RATEMCS14:
2587 case DESC_RATEVHT1SS_MCS2:
2588 case DESC_RATEVHT1SS_MCS6:
2589 case DESC_RATEVHT2SS_MCS0:
2590 case DESC_RATEVHT2SS_MCS4:
2591 case DESC_RATEVHT2SS_MCS8:
2592 shift = 16;
2593 break;
2594 case DESC_RATE11M:
2595 case DESC_RATE18M:
2596 case DESC_RATE54M:
2597 case DESC_RATEMCS3:
2598 case DESC_RATEMCS7:
2599 case DESC_RATEMCS11:
2600 case DESC_RATEMCS15:
2601 case DESC_RATEVHT1SS_MCS3:
2602 case DESC_RATEVHT1SS_MCS7:
2603 case DESC_RATEVHT2SS_MCS1:
2604 case DESC_RATEVHT2SS_MCS5:
2605 case DESC_RATEVHT2SS_MCS9:
2606 shift = 24;
2607 break;
2608 default:
2609 RT_ASSERT(true, "Rate_Section is Illegal\n");
2610 break;
2611 }
2612
2613 tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][path]
2614 [tx_num][rate_section] >> shift) & 0xff;
2615
2616 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */
2617 if (rtlpriv->efuse.eeprom_regulatory != 2) {
2618 limit = _rtl8812ae_phy_get_txpower_limit(hw, band,
2619 rtlphy->current_chan_bw, path, rate,
2620 rtlphy->current_channel);
2621
2622 if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
2623 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) {
2624 if (limit < 0) {
2625 if (tx_pwr_diff < (-limit))
2626 tx_pwr_diff = -limit;
2627 }
2628 } else {
2629 if (limit < 0)
2630 tx_pwr_diff = limit;
2631 else
2632 tx_pwr_diff = tx_pwr_diff > limit ? limit : tx_pwr_diff;
2633 }
2634 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2635 "Maximum power by rate %d, final power by rate %d\n",
2636 limit, tx_pwr_diff);
2637 }
2638
2639 return tx_pwr_diff;
2640}
2641
2642static u8 _rtl8821ae_get_txpower_index(struct ieee80211_hw *hw, u8 path,
2643 u8 rate, u8 bandwidth, u8 channel)
2644{
2645 struct rtl_priv *rtlpriv = rtl_priv(hw);
2646 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
2647 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2648 u8 index = (channel - 1);
2649 u8 txpower = 0;
2650 bool in_24g = false;
2651 char powerdiff_byrate = 0;
2652
2653 if (((rtlhal->current_bandtype == BAND_ON_2_4G) &&
2654 (channel > 14 || channel < 1)) ||
2655 ((rtlhal->current_bandtype == BAND_ON_5G) && (channel <= 14))) {
2656 index = 0;
2657 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD,
2658 "Illegal channel!!\n");
2659 }
2660
2661 in_24g = _rtl8821ae_phy_get_chnl_index(channel, &index);
2662 if (in_24g) {
2663 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2664 txpower = rtlefuse->txpwrlevel_cck[path][index];
2665 else if (DESC_RATE6M <= rate)
2666 txpower = rtlefuse->txpwrlevel_ht40_1s[path][index];
2667 else
2668 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "invalid rate\n");
2669
2670 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2671 !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2672 txpower += rtlefuse->txpwr_legacyhtdiff[path][TX_1S];
2673
2674 if (bandwidth == HT_CHANNEL_WIDTH_20) {
2675 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2676 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2677 txpower += rtlefuse->txpwr_ht20diff[path][TX_1S];
2678 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2679 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2680 txpower += rtlefuse->txpwr_ht20diff[path][TX_2S];
2681 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2682 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2683 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2684 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2685 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2686 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9))
2687 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2688 } else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2689 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2690 (DESC_RATEVHT1SS_MCS0 <= rate &&
2691 rate <= DESC_RATEVHT2SS_MCS9))
2692 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S];
2693 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2694 (DESC_RATEVHT2SS_MCS0 <= rate &&
2695 rate <= DESC_RATEVHT2SS_MCS9))
2696 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S];
2697 }
2698 } else {
2699 if (DESC_RATE6M <= rate)
2700 txpower = rtlefuse->txpwr_5g_bw40base[path][index];
2701 else
2702 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_WARNING,
2703 "INVALID Rate.\n");
2704
2705 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M &&
2706 !RTL8821AE_RX_HAL_IS_CCK_RATE(rate))
2707 txpower += rtlefuse->txpwr_5g_ofdmdiff[path][TX_1S];
2708
2709 if (bandwidth == HT_CHANNEL_WIDTH_20) {
2710 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2711 (DESC_RATEVHT1SS_MCS0 <= rate &&
2712 rate <= DESC_RATEVHT2SS_MCS9))
2713 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_1S];
2714 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2715 (DESC_RATEVHT2SS_MCS0 <= rate &&
2716 rate <= DESC_RATEVHT2SS_MCS9))
2717 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_2S];
2718 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) {
2719 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2720 (DESC_RATEVHT1SS_MCS0 <= rate &&
2721 rate <= DESC_RATEVHT2SS_MCS9))
2722 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_1S];
2723 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2724 (DESC_RATEVHT2SS_MCS0 <= rate &&
2725 rate <= DESC_RATEVHT2SS_MCS9))
2726 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_2S];
2727 } else if (bandwidth == HT_CHANNEL_WIDTH_80) {
2728 u8 channel_5g_80m[CHANNEL_MAX_NUMBER_5G_80M] = {
2729 42, 58, 106, 122, 138, 155, 171
2730 };
2731 u8 i;
2732
2733 for (i = 0; i < sizeof(channel_5g_80m) / sizeof(u8); ++i)
2734 if (channel_5g_80m[i] == channel)
2735 index = i;
2736
2737 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) ||
2738 (DESC_RATEVHT1SS_MCS0 <= rate &&
2739 rate <= DESC_RATEVHT2SS_MCS9))
2740 txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2741 + rtlefuse->txpwr_5g_bw80diff[path][TX_1S];
2742 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) ||
2743 (DESC_RATEVHT2SS_MCS0 <= rate &&
2744 rate <= DESC_RATEVHT2SS_MCS9))
2745 txpower = rtlefuse->txpwr_5g_bw80base[path][index]
2746 + rtlefuse->txpwr_5g_bw80diff[path][TX_1S]
2747 + rtlefuse->txpwr_5g_bw80diff[path][TX_2S];
2748 }
2749 }
2750 if (rtlefuse->eeprom_regulatory != 2)
2751 powerdiff_byrate =
2752 _rtl8821ae_phy_get_txpower_by_rate(hw, (u8)(!in_24g),
2753 path, rate);
2754
2755 if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 ||
2756 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9)
2757 txpower -= powerdiff_byrate;
2758 else
2759 txpower += powerdiff_byrate;
2760
2761 if (rate > DESC_RATE11M)
2762 txpower += rtlpriv->dm.remnant_ofdm_swing_idx[path];
2763 else
2764 txpower += rtlpriv->dm.remnant_cck_idx;
2765
2766 if (txpower > MAX_POWER_INDEX)
2767 txpower = MAX_POWER_INDEX;
2768
2769 return txpower;
2770}
2771
2772static void _rtl8821ae_phy_set_txpower_index(struct ieee80211_hw *hw,
2773 u8 power_index, u8 path, u8 rate)
2774{
2775 struct rtl_priv *rtlpriv = rtl_priv(hw);
2776
2777 if (path == RF90_PATH_A) {
2778 switch (rate) {
2779 case DESC_RATE1M:
2780 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2781 MASKBYTE0, power_index);
2782 break;
2783 case DESC_RATE2M:
2784 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2785 MASKBYTE1, power_index);
2786 break;
2787 case DESC_RATE5_5M:
2788 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2789 MASKBYTE2, power_index);
2790 break;
2791 case DESC_RATE11M:
2792 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1,
2793 MASKBYTE3, power_index);
2794 break;
2795 case DESC_RATE6M:
2796 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2797 MASKBYTE0, power_index);
2798 break;
2799 case DESC_RATE9M:
2800 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2801 MASKBYTE1, power_index);
2802 break;
2803 case DESC_RATE12M:
2804 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2805 MASKBYTE2, power_index);
2806 break;
2807 case DESC_RATE18M:
2808 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6,
2809 MASKBYTE3, power_index);
2810 break;
2811 case DESC_RATE24M:
2812 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2813 MASKBYTE0, power_index);
2814 break;
2815 case DESC_RATE36M:
2816 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2817 MASKBYTE1, power_index);
2818 break;
2819 case DESC_RATE48M:
2820 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2821 MASKBYTE2, power_index);
2822 break;
2823 case DESC_RATE54M:
2824 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24,
2825 MASKBYTE3, power_index);
2826 break;
2827 case DESC_RATEMCS0:
2828 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2829 MASKBYTE0, power_index);
2830 break;
2831 case DESC_RATEMCS1:
2832 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2833 MASKBYTE1, power_index);
2834 break;
2835 case DESC_RATEMCS2:
2836 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2837 MASKBYTE2, power_index);
2838 break;
2839 case DESC_RATEMCS3:
2840 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00,
2841 MASKBYTE3, power_index);
2842 break;
2843 case DESC_RATEMCS4:
2844 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2845 MASKBYTE0, power_index);
2846 break;
2847 case DESC_RATEMCS5:
2848 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2849 MASKBYTE1, power_index);
2850 break;
2851 case DESC_RATEMCS6:
2852 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2853 MASKBYTE2, power_index);
2854 break;
2855 case DESC_RATEMCS7:
2856 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04,
2857 MASKBYTE3, power_index);
2858 break;
2859 case DESC_RATEMCS8:
2860 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2861 MASKBYTE0, power_index);
2862 break;
2863 case DESC_RATEMCS9:
2864 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2865 MASKBYTE1, power_index);
2866 break;
2867 case DESC_RATEMCS10:
2868 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2869 MASKBYTE2, power_index);
2870 break;
2871 case DESC_RATEMCS11:
2872 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08,
2873 MASKBYTE3, power_index);
2874 break;
2875 case DESC_RATEMCS12:
2876 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2877 MASKBYTE0, power_index);
2878 break;
2879 case DESC_RATEMCS13:
2880 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2881 MASKBYTE1, power_index);
2882 break;
2883 case DESC_RATEMCS14:
2884 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2885 MASKBYTE2, power_index);
2886 break;
2887 case DESC_RATEMCS15:
2888 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12,
2889 MASKBYTE3, power_index);
2890 break;
2891 case DESC_RATEVHT1SS_MCS0:
2892 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2893 MASKBYTE0, power_index);
2894 break;
2895 case DESC_RATEVHT1SS_MCS1:
2896 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2897 MASKBYTE1, power_index);
2898 break;
2899 case DESC_RATEVHT1SS_MCS2:
2900 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2901 MASKBYTE2, power_index);
2902 break;
2903 case DESC_RATEVHT1SS_MCS3:
2904 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0,
2905 MASKBYTE3, power_index);
2906 break;
2907 case DESC_RATEVHT1SS_MCS4:
2908 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2909 MASKBYTE0, power_index);
2910 break;
2911 case DESC_RATEVHT1SS_MCS5:
2912 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2913 MASKBYTE1, power_index);
2914 break;
2915 case DESC_RATEVHT1SS_MCS6:
2916 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2917 MASKBYTE2, power_index);
2918 break;
2919 case DESC_RATEVHT1SS_MCS7:
2920 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4,
2921 MASKBYTE3, power_index);
2922 break;
2923 case DESC_RATEVHT1SS_MCS8:
2924 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2925 MASKBYTE0, power_index);
2926 break;
2927 case DESC_RATEVHT1SS_MCS9:
2928 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2929 MASKBYTE1, power_index);
2930 break;
2931 case DESC_RATEVHT2SS_MCS0:
2932 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2933 MASKBYTE2, power_index);
2934 break;
2935 case DESC_RATEVHT2SS_MCS1:
2936 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8,
2937 MASKBYTE3, power_index);
2938 break;
2939 case DESC_RATEVHT2SS_MCS2:
2940 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2941 MASKBYTE0, power_index);
2942 break;
2943 case DESC_RATEVHT2SS_MCS3:
2944 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2945 MASKBYTE1, power_index);
2946 break;
2947 case DESC_RATEVHT2SS_MCS4:
2948 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2949 MASKBYTE2, power_index);
2950 break;
2951 case DESC_RATEVHT2SS_MCS5:
2952 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2,
2953 MASKBYTE3, power_index);
2954 break;
2955 case DESC_RATEVHT2SS_MCS6:
2956 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2957 MASKBYTE0, power_index);
2958 break;
2959 case DESC_RATEVHT2SS_MCS7:
2960 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2961 MASKBYTE1, power_index);
2962 break;
2963 case DESC_RATEVHT2SS_MCS8:
2964 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2965 MASKBYTE2, power_index);
2966 break;
2967 case DESC_RATEVHT2SS_MCS9:
2968 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6,
2969 MASKBYTE3, power_index);
2970 break;
2971 default:
2972 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
2973 "Invalid Rate!!\n");
2974 break;
2975 }
2976 } else if (path == RF90_PATH_B) {
2977 switch (rate) {
2978 case DESC_RATE1M:
2979 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2980 MASKBYTE0, power_index);
2981 break;
2982 case DESC_RATE2M:
2983 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2984 MASKBYTE1, power_index);
2985 break;
2986 case DESC_RATE5_5M:
2987 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2988 MASKBYTE2, power_index);
2989 break;
2990 case DESC_RATE11M:
2991 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1,
2992 MASKBYTE3, power_index);
2993 break;
2994 case DESC_RATE6M:
2995 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
2996 MASKBYTE0, power_index);
2997 break;
2998 case DESC_RATE9M:
2999 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3000 MASKBYTE1, power_index);
3001 break;
3002 case DESC_RATE12M:
3003 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3004 MASKBYTE2, power_index);
3005 break;
3006 case DESC_RATE18M:
3007 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6,
3008 MASKBYTE3, power_index);
3009 break;
3010 case DESC_RATE24M:
3011 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3012 MASKBYTE0, power_index);
3013 break;
3014 case DESC_RATE36M:
3015 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3016 MASKBYTE1, power_index);
3017 break;
3018 case DESC_RATE48M:
3019 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3020 MASKBYTE2, power_index);
3021 break;
3022 case DESC_RATE54M:
3023 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24,
3024 MASKBYTE3, power_index);
3025 break;
3026 case DESC_RATEMCS0:
3027 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3028 MASKBYTE0, power_index);
3029 break;
3030 case DESC_RATEMCS1:
3031 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3032 MASKBYTE1, power_index);
3033 break;
3034 case DESC_RATEMCS2:
3035 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3036 MASKBYTE2, power_index);
3037 break;
3038 case DESC_RATEMCS3:
3039 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00,
3040 MASKBYTE3, power_index);
3041 break;
3042 case DESC_RATEMCS4:
3043 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3044 MASKBYTE0, power_index);
3045 break;
3046 case DESC_RATEMCS5:
3047 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3048 MASKBYTE1, power_index);
3049 break;
3050 case DESC_RATEMCS6:
3051 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3052 MASKBYTE2, power_index);
3053 break;
3054 case DESC_RATEMCS7:
3055 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04,
3056 MASKBYTE3, power_index);
3057 break;
3058 case DESC_RATEMCS8:
3059 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3060 MASKBYTE0, power_index);
3061 break;
3062 case DESC_RATEMCS9:
3063 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3064 MASKBYTE1, power_index);
3065 break;
3066 case DESC_RATEMCS10:
3067 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3068 MASKBYTE2, power_index);
3069 break;
3070 case DESC_RATEMCS11:
3071 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08,
3072 MASKBYTE3, power_index);
3073 break;
3074 case DESC_RATEMCS12:
3075 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3076 MASKBYTE0, power_index);
3077 break;
3078 case DESC_RATEMCS13:
3079 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3080 MASKBYTE1, power_index);
3081 break;
3082 case DESC_RATEMCS14:
3083 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3084 MASKBYTE2, power_index);
3085 break;
3086 case DESC_RATEMCS15:
3087 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12,
3088 MASKBYTE3, power_index);
3089 break;
3090 case DESC_RATEVHT1SS_MCS0:
3091 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3092 MASKBYTE0, power_index);
3093 break;
3094 case DESC_RATEVHT1SS_MCS1:
3095 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3096 MASKBYTE1, power_index);
3097 break;
3098 case DESC_RATEVHT1SS_MCS2:
3099 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3100 MASKBYTE2, power_index);
3101 break;
3102 case DESC_RATEVHT1SS_MCS3:
3103 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0,
3104 MASKBYTE3, power_index);
3105 break;
3106 case DESC_RATEVHT1SS_MCS4:
3107 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3108 MASKBYTE0, power_index);
3109 break;
3110 case DESC_RATEVHT1SS_MCS5:
3111 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3112 MASKBYTE1, power_index);
3113 break;
3114 case DESC_RATEVHT1SS_MCS6:
3115 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3116 MASKBYTE2, power_index);
3117 break;
3118 case DESC_RATEVHT1SS_MCS7:
3119 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4,
3120 MASKBYTE3, power_index);
3121 break;
3122 case DESC_RATEVHT1SS_MCS8:
3123 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3124 MASKBYTE0, power_index);
3125 break;
3126 case DESC_RATEVHT1SS_MCS9:
3127 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3128 MASKBYTE1, power_index);
3129 break;
3130 case DESC_RATEVHT2SS_MCS0:
3131 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3132 MASKBYTE2, power_index);
3133 break;
3134 case DESC_RATEVHT2SS_MCS1:
3135 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8,
3136 MASKBYTE3, power_index);
3137 break;
3138 case DESC_RATEVHT2SS_MCS2:
3139 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3140 MASKBYTE0, power_index);
3141 break;
3142 case DESC_RATEVHT2SS_MCS3:
3143 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3144 MASKBYTE1, power_index);
3145 break;
3146 case DESC_RATEVHT2SS_MCS4:
3147 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3148 MASKBYTE2, power_index);
3149 break;
3150 case DESC_RATEVHT2SS_MCS5:
3151 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2,
3152 MASKBYTE3, power_index);
3153 break;
3154 case DESC_RATEVHT2SS_MCS6:
3155 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3156 MASKBYTE0, power_index);
3157 break;
3158 case DESC_RATEVHT2SS_MCS7:
3159 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3160 MASKBYTE1, power_index);
3161 break;
3162 case DESC_RATEVHT2SS_MCS8:
3163 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3164 MASKBYTE2, power_index);
3165 break;
3166 case DESC_RATEVHT2SS_MCS9:
3167 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6,
3168 MASKBYTE3, power_index);
3169 break;
3170 default:
3171 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3172 "Invalid Rate!!\n");
3173 break;
3174 }
3175 } else {
3176 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3177 "Invalid RFPath!!\n");
3178 }
3179}
3180
3181static void _rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3182 u8 *array, u8 path,
3183 u8 channel, u8 size)
3184{
3185 struct rtl_priv *rtlpriv = rtl_priv(hw);
3186 struct rtl_phy *rtlphy = &rtlpriv->phy;
3187 u8 i;
3188 u8 power_index;
3189
3190 for (i = 0; i < size; i++) {
3191 power_index =
3192 _rtl8821ae_get_txpower_index(hw, path, array[i],
3193 rtlphy->current_chan_bw,
3194 channel);
3195 _rtl8821ae_phy_set_txpower_index(hw, power_index, path,
3196 array[i]);
3197 }
3198}
3199
3200static void _rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw *hw,
3201 u8 bw, u8 channel, u8 path)
3202{
3203 struct rtl_priv *rtlpriv = rtl_priv(hw);
3204 struct rtl_phy *rtlphy = &rtlpriv->phy;
3205
3206 u8 i;
3207 u32 power_level, data, offset;
3208
3209 if (path >= rtlphy->num_total_rfpath)
3210 return;
3211
3212 data = 0;
3213 if (path == RF90_PATH_A) {
3214 power_level =
3215 _rtl8821ae_get_txpower_index(hw, RF90_PATH_A,
3216 DESC_RATEMCS7, bw, channel);
3217 offset = RA_TXPWRTRAING;
3218 } else {
3219 power_level =
3220 _rtl8821ae_get_txpower_index(hw, RF90_PATH_B,
3221 DESC_RATEMCS7, bw, channel);
3222 offset = RB_TXPWRTRAING;
3223 }
3224
3225 for (i = 0; i < 3; i++) {
3226 if (i == 0)
3227 power_level = power_level - 10;
3228 else if (i == 1)
3229 power_level = power_level - 8;
3230 else
3231 power_level = power_level - 6;
3232
3233 data |= (((power_level > 2) ? (power_level) : 2) << (i * 8));
3234 }
3235 rtl_set_bbreg(hw, offset, 0xffffff, data);
3236}
3237
3238void rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
3239 u8 channel, u8 path)
3240{
3241 /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
3242 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3243 struct rtl_priv *rtlpriv = rtl_priv(hw);
3244 struct rtl_phy *rtlphy = &rtlpriv->phy;
3245 u8 cck_rates[] = {DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M,
3246 DESC_RATE11M};
3247 u8 sizes_of_cck_retes = 4;
3248 u8 ofdm_rates[] = {DESC_RATE6M, DESC_RATE9M, DESC_RATE12M,
3249 DESC_RATE18M, DESC_RATE24M, DESC_RATE36M,
3250 DESC_RATE48M, DESC_RATE54M};
3251 u8 sizes_of_ofdm_retes = 8;
3252 u8 ht_rates_1t[] = {DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2,
3253 DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5,
3254 DESC_RATEMCS6, DESC_RATEMCS7};
3255 u8 sizes_of_ht_retes_1t = 8;
3256 u8 ht_rates_2t[] = {DESC_RATEMCS8, DESC_RATEMCS9,
3257 DESC_RATEMCS10, DESC_RATEMCS11,
3258 DESC_RATEMCS12, DESC_RATEMCS13,
3259 DESC_RATEMCS14, DESC_RATEMCS15};
3260 u8 sizes_of_ht_retes_2t = 8;
3261 u8 vht_rates_1t[] = {DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1,
3262 DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3,
3263 DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5,
3264 DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7,
3265 DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9};
3266 u8 vht_rates_2t[] = {DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1,
3267 DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3,
3268 DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5,
3269 DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7,
3270 DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9};
3271 u8 sizes_of_vht_retes = 10;
3272
3273 if (rtlhal->current_bandtype == BAND_ON_2_4G)
3274 _rtl8821ae_phy_set_txpower_level_by_path(hw, cck_rates, path, channel,
3275 sizes_of_cck_retes);
3276
3277 _rtl8821ae_phy_set_txpower_level_by_path(hw, ofdm_rates, path, channel,
3278 sizes_of_ofdm_retes);
3279 _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_1t, path, channel,
3280 sizes_of_ht_retes_1t);
3281 _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_1t, path, channel,
3282 sizes_of_vht_retes);
3283
3284 if (rtlphy->num_total_rfpath >= 2) {
3285 _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_2t, path,
3286 channel,
3287 sizes_of_ht_retes_2t);
3288 _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_2t, path,
3289 channel,
3290 sizes_of_vht_retes);
3291 }
3292
3293 _rtl8821ae_phy_txpower_training_by_path(hw, rtlphy->current_chan_bw,
3294 channel, path);
3295}
3296
3297/*just in case, write txpower in DW, to reduce time*/
3298void rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
3299{
3300 struct rtl_priv *rtlpriv = rtl_priv(hw);
3301 struct rtl_phy *rtlphy = &rtlpriv->phy;
3302 u8 path = 0;
3303
3304 for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; ++path)
3305 rtl8821ae_phy_set_txpower_level_by_path(hw, channel, path);
3306}
3307
3308static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
3309 enum wireless_mode wirelessmode,
3310 u8 txpwridx)
3311{
3312 long offset;
3313 long pwrout_dbm;
3314
3315 switch (wirelessmode) {
3316 case WIRELESS_MODE_B:
3317 offset = -7;
3318 break;
3319 case WIRELESS_MODE_G:
3320 case WIRELESS_MODE_N_24G:
3321 offset = -8;
3322 break;
3323 default:
3324 offset = -8;
3325 break;
3326 }
3327 pwrout_dbm = txpwridx / 2 + offset;
3328 return pwrout_dbm;
3329}
3330
3331void rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
3332{
3333 struct rtl_priv *rtlpriv = rtl_priv(hw);
3334 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3335 enum io_type iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3336
3337 if (!is_hal_stop(rtlhal)) {
3338 switch (operation) {
3339 case SCAN_OPT_BACKUP_BAND0:
3340 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
3341 rtlpriv->cfg->ops->set_hw_reg(hw,
3342 HW_VAR_IO_CMD,
3343 (u8 *)&iotype);
3344
3345 break;
3346 case SCAN_OPT_BACKUP_BAND1:
3347 iotype = IO_CMD_PAUSE_BAND1_DM_BY_SCAN;
3348 rtlpriv->cfg->ops->set_hw_reg(hw,
3349 HW_VAR_IO_CMD,
3350 (u8 *)&iotype);
3351
3352 break;
3353 case SCAN_OPT_RESTORE:
3354 iotype = IO_CMD_RESUME_DM_BY_SCAN;
3355 rtlpriv->cfg->ops->set_hw_reg(hw,
3356 HW_VAR_IO_CMD,
3357 (u8 *)&iotype);
3358 break;
3359 default:
3360 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3361 "Unknown Scan Backup operation.\n");
3362 break;
3363 }
3364 }
3365}
3366
3367static void _rtl8821ae_phy_set_reg_bw(struct rtl_priv *rtlpriv, u8 bw)
3368{
3369 u16 reg_rf_mode_bw, tmp = 0;
3370
3371 reg_rf_mode_bw = rtl_read_word(rtlpriv, REG_TRXPTCL_CTL);
3372 switch (bw) {
3373 case HT_CHANNEL_WIDTH_20:
3374 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, reg_rf_mode_bw & 0xFE7F);
3375 break;
3376 case HT_CHANNEL_WIDTH_20_40:
3377 tmp = reg_rf_mode_bw | BIT(7);
3378 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFEFF);
3379 break;
3380 case HT_CHANNEL_WIDTH_80:
3381 tmp = reg_rf_mode_bw | BIT(8);
3382 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFF7F);
3383 break;
3384 default:
3385 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "unknown Bandwidth: 0x%x\n", bw);
3386 break;
3387 }
3388}
3389
3390static u8 _rtl8821ae_phy_get_secondary_chnl(struct rtl_priv *rtlpriv)
3391{
3392 struct rtl_phy *rtlphy = &rtlpriv->phy;
3393 struct rtl_mac *mac = rtl_mac(rtlpriv);
3394 u8 sc_set_40 = 0, sc_set_20 = 0;
3395
3396 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
3397 if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3398 sc_set_40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
3399 else if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3400 sc_set_40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
3401 else
3402 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3403 "SCMapping: Not Correct Primary40MHz Setting\n");
3404
3405 if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3406 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3407 sc_set_20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
3408 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3409 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER))
3410 sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3411 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) &&
3412 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3413 sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3414 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) &&
3415 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER))
3416 sc_set_20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
3417 else
3418 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3419 "SCMapping: Not Correct Primary40MHz Setting\n");
3420 } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
3421 if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER)
3422 sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
3423 else if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER)
3424 sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
3425 else
3426 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3427 "SCMapping: Not Correct Primary40MHz Setting\n");
3428 }
3429 return (sc_set_40 << 4) | sc_set_20;
3430}
3431
3432void rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
3433{
3434 struct rtl_priv *rtlpriv = rtl_priv(hw);
3435 struct rtl_phy *rtlphy = &rtlpriv->phy;
3436 u8 sub_chnl = 0;
3437 u8 l1pk_val = 0;
3438
3439 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3440 "Switch to %s bandwidth\n",
3441 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
3442 "20MHz" :
3443 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 ?
3444 "40MHz" : "80MHz")));
3445
3446 _rtl8821ae_phy_set_reg_bw(rtlpriv, rtlphy->current_chan_bw);
3447 sub_chnl = _rtl8821ae_phy_get_secondary_chnl(rtlpriv);
3448 rtl_write_byte(rtlpriv, 0x0483, sub_chnl);
3449
3450 switch (rtlphy->current_chan_bw) {
3451 case HT_CHANNEL_WIDTH_20:
3452 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300200);
3453 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3454
3455 if (rtlphy->rf_type == RF_2T2R)
3456 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 7);
3457 else
3458 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 8);
3459 break;
3460 case HT_CHANNEL_WIDTH_20_40:
3461 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300201);
3462 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0);
3463 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3464 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3465
3466 if (rtlphy->reg_837 & BIT(2))
3467 l1pk_val = 6;
3468 else {
3469 if (rtlphy->rf_type == RF_2T2R)
3470 l1pk_val = 7;
3471 else
3472 l1pk_val = 8;
3473 }
3474 /* 0x848[25:22] = 0x6 */
3475 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3476
3477 if (sub_chnl == VHT_DATA_SC_20_UPPER_OF_80MHZ)
3478 rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 1);
3479 else
3480 rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 0);
3481 break;
3482
3483 case HT_CHANNEL_WIDTH_80:
3484 /* 0x8ac[21,20,9:6,1,0]=8'b11100010 */
3485 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300202);
3486 /* 0x8c4[30] = 1 */
3487 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1);
3488 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl);
3489 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl);
3490
3491 if (rtlphy->reg_837 & BIT(2))
3492 l1pk_val = 5;
3493 else {
3494 if (rtlphy->rf_type == RF_2T2R)
3495 l1pk_val = 6;
3496 else
3497 l1pk_val = 7;
3498 }
3499 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val);
3500
3501 break;
3502 default:
3503 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
3504 "unknown bandwidth: %#X\n", rtlphy->current_chan_bw);
3505 break;
3506 }
3507
3508 rtl8812ae_fixspur(hw, rtlphy->current_chan_bw, rtlphy->current_channel);
3509
3510 rtl8821ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
3511 rtlphy->set_bwmode_inprogress = false;
3512
3513 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
3514}
3515
3516void rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
3517 enum nl80211_channel_type ch_type)
3518{
3519 struct rtl_priv *rtlpriv = rtl_priv(hw);
3520 struct rtl_phy *rtlphy = &rtlpriv->phy;
3521 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3522 u8 tmp_bw = rtlphy->current_chan_bw;
3523
3524 if (rtlphy->set_bwmode_inprogress)
3525 return;
3526 rtlphy->set_bwmode_inprogress = true;
3527 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw)))
3528 rtl8821ae_phy_set_bw_mode_callback(hw);
3529 else {
3530 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3531 "FALSE driver sleep or unload\n");
3532 rtlphy->set_bwmode_inprogress = false;
3533 rtlphy->current_chan_bw = tmp_bw;
3534 }
3535}
3536
3537void rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw)
3538{
3539 struct rtl_priv *rtlpriv = rtl_priv(hw);
3540 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3541 struct rtl_phy *rtlphy = &rtlpriv->phy;
3542 u8 channel = rtlphy->current_channel;
3543 u8 path;
3544 u32 data;
3545
3546 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3547 "switch to channel%d\n", rtlphy->current_channel);
3548 if (is_hal_stop(rtlhal))
3549 return;
3550
3551 if (36 <= channel && channel <= 48)
3552 data = 0x494;
3553 else if (50 <= channel && channel <= 64)
3554 data = 0x453;
3555 else if (100 <= channel && channel <= 116)
3556 data = 0x452;
3557 else if (118 <= channel)
3558 data = 0x412;
3559 else
3560 data = 0x96a;
3561 rtl_set_bbreg(hw, RFC_AREA, 0x1ffe0000, data);
3562
3563 for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; path++) {
3564 if (36 <= channel && channel <= 64)
3565 data = 0x101;
3566 else if (100 <= channel && channel <= 140)
3567 data = 0x301;
3568 else if (140 < channel)
3569 data = 0x501;
3570 else
3571 data = 0x000;
3572 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3573 BIT(18)|BIT(17)|BIT(16)|BIT(9)|BIT(8), data);
3574
3575 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW,
3576 BMASKBYTE0, channel);
3577
3578 if (channel > 14) {
3579 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) {
3580 if (36 <= channel && channel <= 64)
3581 data = 0x114E9;
3582 else if (100 <= channel && channel <= 140)
3583 data = 0x110E9;
3584 else
3585 data = 0x110E9;
3586 rtl8821ae_phy_set_rf_reg(hw, path, RF_APK,
3587 BRFREGOFFSETMASK, data);
3588 }
3589 }
3590 }
3591 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3592}
3593
3594u8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw)
3595{
3596 struct rtl_priv *rtlpriv = rtl_priv(hw);
3597 struct rtl_phy *rtlphy = &rtlpriv->phy;
3598 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3599 u32 timeout = 1000, timecount = 0;
3600 u8 channel = rtlphy->current_channel;
3601
3602 if (rtlphy->sw_chnl_inprogress)
3603 return 0;
3604 if (rtlphy->set_bwmode_inprogress)
3605 return 0;
3606
3607 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
3608 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
3609 "sw_chnl_inprogress false driver sleep or unload\n");
3610 return 0;
3611 }
3612 while (rtlphy->lck_inprogress && timecount < timeout) {
3613 mdelay(50);
3614 timecount += 50;
3615 }
3616
3617 if (rtlphy->current_channel > 14 && rtlhal->current_bandtype != BAND_ON_5G)
3618 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_5G);
3619 else if (rtlphy->current_channel <= 14 && rtlhal->current_bandtype != BAND_ON_2_4G)
3620 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G);
3621
3622 rtlphy->sw_chnl_inprogress = true;
3623 if (channel == 0)
3624 channel = 1;
3625
3626 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
3627 "switch to channel%d, band type is %d\n",
3628 rtlphy->current_channel, rtlhal->current_bandtype);
3629
3630 rtl8821ae_phy_sw_chnl_callback(hw);
3631
3632 rtl8821ae_dm_clear_txpower_tracking_state(hw);
3633 rtl8821ae_phy_set_txpower_level(hw, rtlphy->current_channel);
3634
3635 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
3636 rtlphy->sw_chnl_inprogress = false;
3637 return 1;
3638}
3639
3640u8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl)
3641{
3642 u8 channel_all[TARGET_CHNL_NUM_2G_5G_8812] = {
3643 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
3644 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54,
3645 56, 58, 60, 62, 64, 100, 102, 104, 106, 108,
3646 110, 112, 114, 116, 118, 120, 122, 124, 126,
3647 128, 130, 132, 134, 136, 138, 140, 149, 151,
3648 153, 155, 157, 159, 161, 163, 165};
3649 u8 place = chnl;
3650
3651 if (chnl > 14) {
3652 for (place = 14; place < sizeof(channel_all); place++)
3653 if (channel_all[place] == chnl)
3654 return place-13;
3655 }
3656
3657 return 0;
3658}
3659
3660#define MACBB_REG_NUM 10
3661#define AFE_REG_NUM 14
3662#define RF_REG_NUM 3
3663
3664static void _rtl8821ae_iqk_backup_macbb(struct ieee80211_hw *hw,
3665 u32 *macbb_backup,
3666 u32 *backup_macbb_reg, u32 mac_bb_num)
3667{
3668 struct rtl_priv *rtlpriv = rtl_priv(hw);
3669 u32 i;
3670
3671 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3672 /*save MACBB default value*/
3673 for (i = 0; i < mac_bb_num; i++)
3674 macbb_backup[i] = rtl_read_dword(rtlpriv, backup_macbb_reg[i]);
3675
3676 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupMacBB Success!!!!\n");
3677}
3678
3679static void _rtl8821ae_iqk_backup_afe(struct ieee80211_hw *hw, u32 *afe_backup,
3680 u32 *backup_afe_REG, u32 afe_num)
3681{
3682 struct rtl_priv *rtlpriv = rtl_priv(hw);
3683 u32 i;
3684
3685 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3686 /*Save AFE Parameters */
3687 for (i = 0; i < afe_num; i++)
3688 afe_backup[i] = rtl_read_dword(rtlpriv, backup_afe_REG[i]);
3689 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupAFE Success!!!!\n");
3690}
3691
3692static void _rtl8821ae_iqk_backup_rf(struct ieee80211_hw *hw, u32 *rfa_backup,
3693 u32 *rfb_backup, u32 *backup_rf_reg,
3694 u32 rf_num)
3695{
3696 struct rtl_priv *rtlpriv = rtl_priv(hw);
3697 u32 i;
3698
3699 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3700 /*Save RF Parameters*/
3701 for (i = 0; i < rf_num; i++) {
3702 rfa_backup[i] = rtl_get_rfreg(hw, RF90_PATH_A, backup_rf_reg[i],
3703 BMASKDWORD);
3704 rfb_backup[i] = rtl_get_rfreg(hw, RF90_PATH_B, backup_rf_reg[i],
3705 BMASKDWORD);
3706 }
3707 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupRF Success!!!!\n");
3708}
3709
3710static void _rtl8821ae_iqk_configure_mac(
3711 struct ieee80211_hw *hw
3712 )
3713{
3714 struct rtl_priv *rtlpriv = rtl_priv(hw);
3715 /* ========MAC register setting========*/
3716 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3717 rtl_write_byte(rtlpriv, 0x522, 0x3f);
3718 rtl_set_bbreg(hw, 0x550, BIT(11) | BIT(3), 0x0);
3719 rtl_write_byte(rtlpriv, 0x808, 0x00); /*RX ante off*/
3720 rtl_set_bbreg(hw, 0x838, 0xf, 0xc); /*CCA off*/
3721}
3722
3723static void _rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw *hw,
3724 enum radio_path path, u32 tx_x, u32 tx_y)
3725{
3726 struct rtl_priv *rtlpriv = rtl_priv(hw);
3727 switch (path) {
3728 case RF90_PATH_A:
3729 /* [31] = 1 --> Page C1 */
3730 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1);
3731 rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
3732 rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
3733 rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
3734 rtl_set_bbreg(hw, 0xccc, 0x000007ff, tx_y);
3735 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, tx_x);
3736 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3737 "TX_X = %x;;TX_Y = %x =====> fill to IQC\n",
3738 tx_x, tx_y);
3739 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3740 "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n",
3741 rtl_get_bbreg(hw, 0xcd4, 0x000007ff),
3742 rtl_get_bbreg(hw, 0xccc, 0x000007ff));
3743 break;
3744 default:
3745 break;
3746 };
3747}
3748
3749static void _rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw *hw,
3750 enum radio_path path, u32 rx_x, u32 rx_y)
3751{
3752 struct rtl_priv *rtlpriv = rtl_priv(hw);
3753 switch (path) {
3754 case RF90_PATH_A:
3755 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3756 rtl_set_bbreg(hw, 0xc10, 0x000003ff, rx_x>>1);
3757 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, rx_y>>1);
3758 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3759 "rx_x = %x;;rx_y = %x ====>fill to IQC\n",
3760 rx_x>>1, rx_y>>1);
3761 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3762 "0xc10 = %x ====>fill to IQC\n",
3763 rtl_read_dword(rtlpriv, 0xc10));
3764 break;
3765 default:
3766 break;
3767 };
3768}
3769
3770#define cal_num 10
3771
3772static void _rtl8821ae_iqk_tx(struct ieee80211_hw *hw, enum radio_path path)
3773{
3774 struct rtl_priv *rtlpriv = rtl_priv(hw);
3775 struct rtl_phy *rtlphy = &rtlpriv->phy;
3776 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3777
3778 u32 tx_fail, rx_fail, delay_count, iqk_ready, cal_retry, cal = 0, temp_reg65;
3779 int tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0, tx_average = 0, rx_average = 0;
3780 int tx_x0[cal_num], tx_y0[cal_num], tx_x0_rxk[cal_num],
3781 tx_y0_rxk[cal_num], rx_x0[cal_num], rx_y0[cal_num];
3782 bool tx0iqkok = false, rx0iqkok = false;
3783 bool vdf_enable = false;
3784 int i, k, vdf_y[3], vdf_x[3], tx_dt[3], rx_dt[3],
3785 ii, dx = 0, dy = 0, tx_finish = 0, rx_finish = 0;
3786
3787 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3788 "BandWidth = %d.\n",
3789 rtlphy->current_chan_bw);
3790 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80)
3791 vdf_enable = true;
3792
3793 while (cal < cal_num) {
3794 switch (path) {
3795 case RF90_PATH_A:
3796 temp_reg65 = rtl_get_rfreg(hw, path, 0x65, 0xffffffff);
3797 /* Path-A LOK */
3798 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/
3799 /*========Path-A AFE all on========*/
3800 /*Port 0 DAC/ADC on*/
3801 rtl_write_dword(rtlpriv, 0xc60, 0x77777777);
3802 rtl_write_dword(rtlpriv, 0xc64, 0x77777777);
3803 rtl_write_dword(rtlpriv, 0xc68, 0x19791979);
3804 rtl_write_dword(rtlpriv, 0xc6c, 0x19791979);
3805 rtl_write_dword(rtlpriv, 0xc70, 0x19791979);
3806 rtl_write_dword(rtlpriv, 0xc74, 0x19791979);
3807 rtl_write_dword(rtlpriv, 0xc78, 0x19791979);
3808 rtl_write_dword(rtlpriv, 0xc7c, 0x19791979);
3809 rtl_write_dword(rtlpriv, 0xc80, 0x19791979);
3810 rtl_write_dword(rtlpriv, 0xc84, 0x19791979);
3811
3812 rtl_set_bbreg(hw, 0xc00, 0xf, 0x4); /*hardware 3-wire off*/
3813
3814 /* LOK Setting */
3815 /* ====== LOK ====== */
3816 /*DAC/ADC sampling rate (160 MHz)*/
3817 rtl_set_bbreg(hw, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7);
3818
3819 /* 2. LoK RF Setting (at BW = 20M) */
3820 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80002);
3821 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x3); /* BW 20M */
3822 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3823 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3824 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3825 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3826 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3827 rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
3828 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3829 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3830 rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3831 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3832 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3833 rtl_write_dword(rtlpriv, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */
3834
3835 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3836 rtl_write_dword(rtlpriv, 0xc88, 0x821403f4);
3837
3838 if (rtlhal->current_bandtype)
3839 rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
3840 else
3841 rtl_write_dword(rtlpriv, 0xc8c, 0x28163e96);
3842
3843 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3844 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3845 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3846 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3847 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3848
3849 mdelay(10); /* Delay 10ms */
3850 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3851
3852 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3853 rtl_set_rfreg(hw, path, 0x58, 0x7fe00, rtl_get_rfreg(hw, path, 0x8, 0xffc00)); /* Load LOK */
3854
3855 switch (rtlphy->current_chan_bw) {
3856 case 1:
3857 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x1);
3858 break;
3859 case 2:
3860 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x0);
3861 break;
3862 default:
3863 break;
3864 }
3865
3866 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3867
3868 /* 3. TX RF Setting */
3869 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
3870 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
3871 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000);
3872 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f);
3873 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3);
3874 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5);
3875 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
3876 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
3877 /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); */
3878 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
3879 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
3880 rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1);
3881 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
3882 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
3883 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
3884
3885 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
3886 rtl_write_dword(rtlpriv, 0xc88, 0x821403f1);
3887 if (rtlhal->current_bandtype)
3888 rtl_write_dword(rtlpriv, 0xc8c, 0x40163e96);
3889 else
3890 rtl_write_dword(rtlpriv, 0xc8c, 0x00163e96);
3891
3892 if (vdf_enable == 1) {
3893 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "VDF_enable\n");
3894 for (k = 0; k <= 2; k++) {
3895 switch (k) {
3896 case 0:
3897 rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3898 rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3899 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3900 break;
3901 case 1:
3902 rtl_set_bbreg(hw, 0xc80, BIT(28), 0x0);
3903 rtl_set_bbreg(hw, 0xc84, BIT(28), 0x0);
3904 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0);
3905 break;
3906 case 2:
3907 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3908 "vdf_y[1] = %x;;;vdf_y[0] = %x\n", vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
3909 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
3910 "vdf_x[1] = %x;;;vdf_x[0] = %x\n", vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
3911 tx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
3912 tx_dt[cal] = ((16*tx_dt[cal])*10000/15708);
3913 tx_dt[cal] = (tx_dt[cal] >> 1)+(tx_dt[cal] & BIT(0));
3914 rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3915 rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3916 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1);
3917 rtl_set_bbreg(hw, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff);
3918 break;
3919 default:
3920 break;
3921 }
3922 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3923 cal_retry = 0;
3924 while (1) {
3925 /* one shot */
3926 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3927 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3928
3929 mdelay(10); /* Delay 10ms */
3930 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3931 delay_count = 0;
3932 while (1) {
3933 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3934 if ((~iqk_ready) || (delay_count > 20))
3935 break;
3936 else{
3937 mdelay(1);
3938 delay_count++;
3939 }
3940 }
3941
3942 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
3943 /* ============TXIQK Check============== */
3944 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3945
3946 if (~tx_fail) {
3947 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
3948 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3949 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
3950 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
3951 tx0iqkok = true;
3952 break;
3953 } else {
3954 rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
3955 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
3956 tx0iqkok = false;
3957 cal_retry++;
3958 if (cal_retry == 10)
3959 break;
3960 }
3961 } else {
3962 tx0iqkok = false;
3963 cal_retry++;
3964 if (cal_retry == 10)
3965 break;
3966 }
3967 }
3968 }
3969 if (k == 3) {
3970 tx_x0[cal] = vdf_x[k-1];
3971 tx_y0[cal] = vdf_y[k-1];
3972 }
3973 } else {
3974 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
3975 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
3976 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
3977 cal_retry = 0;
3978 while (1) {
3979 /* one shot */
3980 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
3981 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
3982
3983 mdelay(10); /* Delay 10ms */
3984 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
3985 delay_count = 0;
3986 while (1) {
3987 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
3988 if ((~iqk_ready) || (delay_count > 20))
3989 break;
3990 else{
3991 mdelay(1);
3992 delay_count++;
3993 }
3994 }
3995
3996 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
3997 /* ============TXIQK Check============== */
3998 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
3999
4000 if (~tx_fail) {
4001 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4002 tx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4003 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4004 tx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4005 tx0iqkok = true;
4006 break;
4007 } else {
4008 rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0);
4009 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200);
4010 tx0iqkok = false;
4011 cal_retry++;
4012 if (cal_retry == 10)
4013 break;
4014 }
4015 } else {
4016 tx0iqkok = false;
4017 cal_retry++;
4018 if (cal_retry == 10)
4019 break;
4020 }
4021 }
4022 }
4023
4024 if (tx0iqkok == false)
4025 break; /* TXK fail, Don't do RXK */
4026
4027 if (vdf_enable == 1) {
4028 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0); /* TX VDF Disable */
4029 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RXVDF Start\n");
4030 for (k = 0; k <= 2; k++) {
4031 /* ====== RX mode TXK (RXK Step 1) ====== */
4032 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4033 /* 1. TX RF Setting */
4034 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4035 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4036 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
4037 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
4038 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4039 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
4040 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4041
4042 rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd);
4043 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */
4044 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */
4045 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
4046 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4047 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
4048 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4049 switch (k) {
4050 case 0:
4051 {
4052 rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4053 rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4054 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
4055 }
4056 break;
4057 case 1:
4058 {
4059 rtl_write_dword(rtlpriv, 0xc80, 0x08008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4060 rtl_write_dword(rtlpriv, 0xc84, 0x28008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4061 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0);
4062 }
4063 break;
4064 case 2:
4065 {
4066 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4067 "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n",
4068 vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff);
4069 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4070 "VDF_X[1] = %x;;;VDF_X[0] = %x\n",
4071 vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff);
4072 rx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20);
4073 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "Rx_dt = %d\n", rx_dt[cal]);
4074 rx_dt[cal] = ((16*rx_dt[cal])*10000/13823);
4075 rx_dt[cal] = (rx_dt[cal] >> 1)+(rx_dt[cal] & BIT(0));
4076 rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4077 rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4078 rtl_set_bbreg(hw, 0xce8, 0x00003fff, rx_dt[cal] & 0x00003fff);
4079 }
4080 break;
4081 default:
4082 break;
4083 }
4084 rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4085 rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96);
4086 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4087 cal_retry = 0;
4088 while (1) {
4089 /* one shot */
4090 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4091 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4092
4093 mdelay(10); /* Delay 10ms */
4094 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4095 delay_count = 0;
4096 while (1) {
4097 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4098 if ((~iqk_ready) || (delay_count > 20))
4099 break;
4100 else{
4101 mdelay(1);
4102 delay_count++;
4103 }
4104 }
4105
4106 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4107 /* ============TXIQK Check============== */
4108 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4109
4110 if (~tx_fail) {
4111 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4112 tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4113 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4114 tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4115 tx0iqkok = true;
4116 break;
4117 } else{
4118 tx0iqkok = false;
4119 cal_retry++;
4120 if (cal_retry == 10)
4121 break;
4122 }
4123 } else {
4124 tx0iqkok = false;
4125 cal_retry++;
4126 if (cal_retry == 10)
4127 break;
4128 }
4129 }
4130
4131 if (tx0iqkok == false) { /* If RX mode TXK fail, then take TXK Result */
4132 tx_x0_rxk[cal] = tx_x0[cal];
4133 tx_y0_rxk[cal] = tx_y0[cal];
4134 tx0iqkok = true;
4135 RT_TRACE(rtlpriv,
4136 COMP_IQK,
4137 DBG_LOUD,
4138 "RXK Step 1 fail\n");
4139 }
4140
4141 /* ====== RX IQK ====== */
4142 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4143 /* 1. RX RF Setting */
4144 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4145 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4146 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4147 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4148 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4149 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4150 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4151
4152 rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4153 rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4154 rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4155 rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4156 rtl_set_bbreg(hw, 0xcb8, 0xF, 0xe);
4157 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4158 rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4159
4160 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4161 rtl_set_bbreg(hw, 0xc80, BIT(29), 0x1);
4162 rtl_set_bbreg(hw, 0xc84, BIT(29), 0x0);
4163 rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4164
4165 rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /* pDM_Odm->SupportInterface == 1 */
4166
4167 if (k == 2)
4168 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x1); /* RX VDF Enable */
4169 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4170
4171 cal_retry = 0;
4172 while (1) {
4173 /* one shot */
4174 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4175 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4176
4177 mdelay(10); /* Delay 10ms */
4178 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4179 delay_count = 0;
4180 while (1) {
4181 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4182 if ((~iqk_ready) || (delay_count > 20))
4183 break;
4184 else{
4185 mdelay(1);
4186 delay_count++;
4187 }
4188 }
4189
4190 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4191 /* ============RXIQK Check============== */
4192 rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4193 if (rx_fail == 0) {
4194 rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4195 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4196 rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4197 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4198 rx0iqkok = true;
4199 break;
4200 } else {
4201 rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4202 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4203 rx0iqkok = false;
4204 cal_retry++;
4205 if (cal_retry == 10)
4206 break;
4207
4208 }
4209 } else{
4210 rx0iqkok = false;
4211 cal_retry++;
4212 if (cal_retry == 10)
4213 break;
4214 }
4215 }
4216
4217 }
4218 if (k == 3) {
4219 rx_x0[cal] = vdf_x[k-1];
4220 rx_y0[cal] = vdf_y[k-1];
4221 }
4222 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1); /* TX VDF Enable */
4223 }
4224
4225 else{
4226 /* ====== RX mode TXK (RXK Step 1) ====== */
4227 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4228 /* 1. TX RF Setting */
4229 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4230 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4231 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029);
4232 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb);
4233 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4234 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001);
4235 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4236 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4237 rtl_write_dword(rtlpriv, 0xb00, 0x03000100);
4238 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */
4239
4240 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4241 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4242 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4243 rtl_write_dword(rtlpriv, 0xc88, 0x821603e0);
4244 /* ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); */
4245 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4246 cal_retry = 0;
4247 while (1) {
4248 /* one shot */
4249 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4250 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4251
4252 mdelay(10); /* Delay 10ms */
4253 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4254 delay_count = 0;
4255 while (1) {
4256 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4257 if ((~iqk_ready) || (delay_count > 20))
4258 break;
4259 else{
4260 mdelay(1);
4261 delay_count++;
4262 }
4263 }
4264
4265 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4266 /* ============TXIQK Check============== */
4267 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12));
4268
4269 if (~tx_fail) {
4270 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000);
4271 tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4272 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000);
4273 tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4274 tx0iqkok = true;
4275 break;
4276 } else {
4277 tx0iqkok = false;
4278 cal_retry++;
4279 if (cal_retry == 10)
4280 break;
4281 }
4282 } else{
4283 tx0iqkok = false;
4284 cal_retry++;
4285 if (cal_retry == 10)
4286 break;
4287 }
4288 }
4289
4290 if (tx0iqkok == false) { /* If RX mode TXK fail, then take TXK Result */
4291 tx_x0_rxk[cal] = tx_x0[cal];
4292 tx_y0_rxk[cal] = tx_y0[cal];
4293 tx0iqkok = true;
4294 RT_TRACE(rtlpriv, COMP_IQK,
4295 DBG_LOUD, "1");
4296 }
4297
4298 /* ====== RX IQK ====== */
4299 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4300 /* 1. RX RF Setting */
4301 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000);
4302 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000);
4303 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f);
4304 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb);
4305 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001);
4306 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8);
4307 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000);
4308
4309 rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff);
4310 rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff);
4311 rtl_set_bbreg(hw, 0x978, BIT(31), 0x1);
4312 rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0);
4313 /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); */
4314 rtl_write_dword(rtlpriv, 0x90c, 0x00008000);
4315 rtl_write_dword(rtlpriv, 0x984, 0x0046a911);
4316
4317 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4318 rtl_write_dword(rtlpriv, 0xc80, 0x38008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */
4319 rtl_write_dword(rtlpriv, 0xc84, 0x18008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */
4320 rtl_write_dword(rtlpriv, 0xc88, 0x02140119);
4321
4322 rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /*pDM_Odm->SupportInterface == 1*/
4323
4324 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8Ï¥\CE\C5v\A4\C1\B5\B9 iqk_dpk module */
4325
4326 cal_retry = 0;
4327 while (1) {
4328 /* one shot */
4329 rtl_write_dword(rtlpriv, 0x980, 0xfa000000);
4330 rtl_write_dword(rtlpriv, 0x980, 0xf8000000);
4331
4332 mdelay(10); /* Delay 10ms */
4333 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000);
4334 delay_count = 0;
4335 while (1) {
4336 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10));
4337 if ((~iqk_ready) || (delay_count > 20))
4338 break;
4339 else{
4340 mdelay(1);
4341 delay_count++;
4342 }
4343 }
4344
4345 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */
4346 /* ============RXIQK Check============== */
4347 rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11));
4348 if (rx_fail == 0) {
4349 rtl_write_dword(rtlpriv, 0xcb8, 0x06000000);
4350 rx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4351 rtl_write_dword(rtlpriv, 0xcb8, 0x08000000);
4352 rx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21;
4353 rx0iqkok = true;
4354 break;
4355 } else{
4356 rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1);
4357 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1);
4358 rx0iqkok = false;
4359 cal_retry++;
4360 if (cal_retry == 10)
4361 break;
4362
4363 }
4364 } else{
4365 rx0iqkok = false;
4366 cal_retry++;
4367 if (cal_retry == 10)
4368 break;
4369 }
4370 }
4371 }
4372
4373 if (tx0iqkok)
4374 tx_average++;
4375 if (rx0iqkok)
4376 rx_average++;
4377 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4378 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65);
4379 break;
4380 default:
4381 break;
4382 }
4383 cal++;
4384 }
4385
4386 /* FillIQK Result */
4387 switch (path) {
4388 case RF90_PATH_A:
4389 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4390 "========Path_A =======\n");
4391 if (tx_average == 0)
4392 break;
4393
4394 for (i = 0; i < tx_average; i++) {
4395 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4396 "TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i,
4397 (tx_x0_rxk[i])>>21&0x000007ff, i,
4398 (tx_y0_rxk[i])>>21&0x000007ff);
4399 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4400 "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i,
4401 (tx_x0[i])>>21&0x000007ff, i,
4402 (tx_y0[i])>>21&0x000007ff);
4403 }
4404 for (i = 0; i < tx_average; i++) {
4405 for (ii = i+1; ii < tx_average; ii++) {
4406 dx = (tx_x0[i]>>21) - (tx_x0[ii]>>21);
4407 if (dx < 3 && dx > -3) {
4408 dy = (tx_y0[i]>>21) - (tx_y0[ii]>>21);
4409 if (dy < 3 && dy > -3) {
4410 tx_x = ((tx_x0[i]>>21) + (tx_x0[ii]>>21))/2;
4411 tx_y = ((tx_y0[i]>>21) + (tx_y0[ii]>>21))/2;
4412 tx_finish = 1;
4413 break;
4414 }
4415 }
4416 }
4417 if (tx_finish == 1)
4418 break;
4419 }
4420
4421 if (tx_finish == 1)
4422 _rtl8821ae_iqk_tx_fill_iqc(hw, path, tx_x, tx_y); /* ? */
4423 else
4424 _rtl8821ae_iqk_tx_fill_iqc(hw, path, 0x200, 0x0);
4425
4426 if (rx_average == 0)
4427 break;
4428
4429 for (i = 0; i < rx_average; i++)
4430 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4431 "RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i,
4432 (rx_x0[i])>>21&0x000007ff, i,
4433 (rx_y0[i])>>21&0x000007ff);
4434 for (i = 0; i < rx_average; i++) {
4435 for (ii = i+1; ii < rx_average; ii++) {
4436 dx = (rx_x0[i]>>21) - (rx_x0[ii]>>21);
4437 if (dx < 4 && dx > -4) {
4438 dy = (rx_y0[i]>>21) - (rx_y0[ii]>>21);
4439 if (dy < 4 && dy > -4) {
4440 rx_x = ((rx_x0[i]>>21) + (rx_x0[ii]>>21))/2;
4441 rx_y = ((rx_y0[i]>>21) + (rx_y0[ii]>>21))/2;
4442 rx_finish = 1;
4443 break;
4444 }
4445 }
4446 }
4447 if (rx_finish == 1)
4448 break;
4449 }
4450
4451 if (rx_finish == 1)
4452 _rtl8821ae_iqk_rx_fill_iqc(hw, path, rx_x, rx_y);
4453 else
4454 _rtl8821ae_iqk_rx_fill_iqc(hw, path, 0x200, 0x0);
4455 break;
4456 default:
4457 break;
4458 }
4459}
4460
4461static void _rtl8821ae_iqk_restore_rf(struct ieee80211_hw *hw,
4462 enum radio_path path,
4463 u32 *backup_rf_reg,
4464 u32 *rf_backup, u32 rf_reg_num)
4465{
4466 struct rtl_priv *rtlpriv = rtl_priv(hw);
4467 u32 i;
4468
4469 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4470 for (i = 0; i < RF_REG_NUM; i++)
4471 rtl_set_rfreg(hw, path, backup_rf_reg[i], RFREG_OFFSET_MASK,
4472 rf_backup[i]);
4473
4474 switch (path) {
4475 case RF90_PATH_A:
4476 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4477 "RestoreRF Path A Success!!!!\n");
4478 break;
4479 default:
4480 break;
4481 }
4482}
4483
4484static void _rtl8821ae_iqk_restore_afe(struct ieee80211_hw *hw,
4485 u32 *afe_backup, u32 *backup_afe_reg,
4486 u32 afe_num)
4487{
4488 u32 i;
4489 struct rtl_priv *rtlpriv = rtl_priv(hw);
4490
4491 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4492 /* Reload AFE Parameters */
4493 for (i = 0; i < afe_num; i++)
4494 rtl_write_dword(rtlpriv, backup_afe_reg[i], afe_backup[i]);
4495 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */
4496 rtl_write_dword(rtlpriv, 0xc80, 0x0);
4497 rtl_write_dword(rtlpriv, 0xc84, 0x0);
4498 rtl_write_dword(rtlpriv, 0xc88, 0x0);
4499 rtl_write_dword(rtlpriv, 0xc8c, 0x3c000000);
4500 rtl_write_dword(rtlpriv, 0xc90, 0x00000080);
4501 rtl_write_dword(rtlpriv, 0xc94, 0x00000000);
4502 rtl_write_dword(rtlpriv, 0xcc4, 0x20040000);
4503 rtl_write_dword(rtlpriv, 0xcc8, 0x20000000);
4504 rtl_write_dword(rtlpriv, 0xcb8, 0x0);
4505 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreAFE Success!!!!\n");
4506}
4507
4508static void _rtl8821ae_iqk_restore_macbb(struct ieee80211_hw *hw,
4509 u32 *macbb_backup,
4510 u32 *backup_macbb_reg,
4511 u32 macbb_num)
4512{
4513 u32 i;
4514 struct rtl_priv *rtlpriv = rtl_priv(hw);
4515
4516 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */
4517 /* Reload MacBB Parameters */
4518 for (i = 0; i < macbb_num; i++)
4519 rtl_write_dword(rtlpriv, backup_macbb_reg[i], macbb_backup[i]);
4520 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreMacBB Success!!!!\n");
4521}
4522
4523#undef MACBB_REG_NUM
4524#undef AFE_REG_NUM
4525#undef RF_REG_NUM
4526
4527#define MACBB_REG_NUM 11
4528#define AFE_REG_NUM 12
4529#define RF_REG_NUM 3
4530
4531static void _rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw)
4532{
4533 u32 macbb_backup[MACBB_REG_NUM];
4534 u32 afe_backup[AFE_REG_NUM];
4535 u32 rfa_backup[RF_REG_NUM];
4536 u32 rfb_backup[RF_REG_NUM];
4537 u32 backup_macbb_reg[MACBB_REG_NUM] = {
4538 0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50,
4539 0xe00, 0xe50, 0x838, 0x82c
4540 };
4541 u32 backup_afe_reg[AFE_REG_NUM] = {
4542 0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74,
4543 0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8
4544 };
4545 u32 backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0};
4546
4547 _rtl8821ae_iqk_backup_macbb(hw, macbb_backup, backup_macbb_reg,
4548 MACBB_REG_NUM);
4549 _rtl8821ae_iqk_backup_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4550 _rtl8821ae_iqk_backup_rf(hw, rfa_backup, rfb_backup, backup_rf_reg,
4551 RF_REG_NUM);
4552
4553 _rtl8821ae_iqk_configure_mac(hw);
4554 _rtl8821ae_iqk_tx(hw, RF90_PATH_A);
4555 _rtl8821ae_iqk_restore_rf(hw, RF90_PATH_A, backup_rf_reg, rfa_backup,
4556 RF_REG_NUM);
4557
4558 _rtl8821ae_iqk_restore_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM);
4559 _rtl8821ae_iqk_restore_macbb(hw, macbb_backup, backup_macbb_reg,
4560 MACBB_REG_NUM);
4561}
4562
4563static void _rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool main)
4564{
4565 struct rtl_priv *rtlpriv = rtl_priv(hw);
4566 /* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */
4567 /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */
4568 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
4569
4570 if (main)
4571 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x1);
4572 else
4573 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x2);
4574}
4575
4576#undef IQK_ADDA_REG_NUM
4577#undef IQK_DELAY_TIME
4578
4579void rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4580{
4581}
4582
4583void rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4584 u8 thermal_value, u8 threshold)
4585{
4586 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
4587
4588 rtldm->thermalvalue_iqk = thermal_value;
4589 rtl8812ae_phy_iq_calibrate(hw, false);
4590}
4591
4592void rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
4593{
4594 struct rtl_priv *rtlpriv = rtl_priv(hw);
4595 struct rtl_phy *rtlphy = &rtlpriv->phy;
4596
4597 if (!rtlphy->lck_inprogress) {
4598 spin_lock(&rtlpriv->locks.iqk_lock);
4599 rtlphy->lck_inprogress = true;
4600 spin_unlock(&rtlpriv->locks.iqk_lock);
4601
4602 _rtl8821ae_phy_iq_calibrate(hw);
4603
4604 spin_lock(&rtlpriv->locks.iqk_lock);
4605 rtlphy->lck_inprogress = false;
4606 spin_unlock(&rtlpriv->locks.iqk_lock);
4607 }
4608}
4609
4610void rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw)
4611{
4612 struct rtl_priv *rtlpriv = rtl_priv(hw);
4613 struct rtl_phy *rtlphy = &rtlpriv->phy;
4614 u8 i;
4615
4616 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD,
4617 "rtl8812ae_dm_reset_iqk_result:: settings regs %d default regs %d\n",
4618 (int)(sizeof(rtlphy->iqk_matrix) /
4619 sizeof(struct iqk_matrix_regs)),
4620 IQK_MATRIX_SETTINGS_NUM);
4621
4622 for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
4623 rtlphy->iqk_matrix[i].value[0][0] = 0x100;
4624 rtlphy->iqk_matrix[i].value[0][2] = 0x100;
4625 rtlphy->iqk_matrix[i].value[0][4] = 0x100;
4626 rtlphy->iqk_matrix[i].value[0][6] = 0x100;
4627
4628 rtlphy->iqk_matrix[i].value[0][1] = 0x0;
4629 rtlphy->iqk_matrix[i].value[0][3] = 0x0;
4630 rtlphy->iqk_matrix[i].value[0][5] = 0x0;
4631 rtlphy->iqk_matrix[i].value[0][7] = 0x0;
4632
4633 rtlphy->iqk_matrix[i].iqk_done = false;
4634 }
4635}
4636
4637void rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
4638 u8 thermal_value, u8 threshold)
4639{
4640 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
4641
4642 rtl8821ae_reset_iqk_result(hw);
4643
4644 rtldm->thermalvalue_iqk = thermal_value;
4645 rtl8821ae_phy_iq_calibrate(hw, false);
4646}
4647
4648void rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw)
4649{
4650}
4651
4652void rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, char delta)
4653{
4654}
4655
4656void rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
4657{
4658 _rtl8821ae_phy_set_rfpath_switch(hw, bmain);
4659}
4660
4661bool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
4662{
4663 struct rtl_priv *rtlpriv = rtl_priv(hw);
4664 struct rtl_phy *rtlphy = &rtlpriv->phy;
4665 bool postprocessing = false;
4666
4667 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4668 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
4669 iotype, rtlphy->set_io_inprogress);
4670 do {
4671 switch (iotype) {
4672 case IO_CMD_RESUME_DM_BY_SCAN:
4673 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4674 "[IO CMD] Resume DM after scan.\n");
4675 postprocessing = true;
4676 break;
4677 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4678 case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4679 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4680 "[IO CMD] Pause DM before scan.\n");
4681 postprocessing = true;
4682 break;
4683 default:
4684 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
4685 "switch case not process\n");
4686 break;
4687 }
4688 } while (false);
4689 if (postprocessing && !rtlphy->set_io_inprogress) {
4690 rtlphy->set_io_inprogress = true;
4691 rtlphy->current_io_type = iotype;
4692 } else {
4693 return false;
4694 }
4695 rtl8821ae_phy_set_io(hw);
4696 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
4697 return true;
4698}
4699
4700static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw)
4701{
4702 struct rtl_priv *rtlpriv = rtl_priv(hw);
4703 struct dig_t *dm_digtable = &rtlpriv->dm_digtable;
4704 struct rtl_phy *rtlphy = &rtlpriv->phy;
4705
4706 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4707 "--->Cmd(%#x), set_io_inprogress(%d)\n",
4708 rtlphy->current_io_type, rtlphy->set_io_inprogress);
4709 switch (rtlphy->current_io_type) {
4710 case IO_CMD_RESUME_DM_BY_SCAN:
4711 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4712 _rtl8821ae_resume_tx_beacon(hw);
4713 rtl8821ae_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
4714 rtl8821ae_dm_write_cck_cca_thres(hw,
4715 rtlphy->initgain_backup.cca);
4716 break;
4717 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
4718 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC)
4719 _rtl8821ae_stop_tx_beacon(hw);
4720 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue;
4721 rtl8821ae_dm_write_dig(hw, 0x17);
4722 rtlphy->initgain_backup.cca = dm_digtable->cur_cck_cca_thres;
4723 rtl8821ae_dm_write_cck_cca_thres(hw, 0x40);
4724 break;
4725 case IO_CMD_PAUSE_BAND1_DM_BY_SCAN:
4726 break;
4727 default:
4728 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
4729 "switch case not process\n");
4730 break;
4731 }
4732 rtlphy->set_io_inprogress = false;
4733 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
4734 "(%#x)\n", rtlphy->current_io_type);
4735}
4736
4737static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw)
4738{
4739 struct rtl_priv *rtlpriv = rtl_priv(hw);
4740
4741 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
4742 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4743 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
4744 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
4745 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
4746}
4747
4748static bool _rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4749 enum rf_pwrstate rfpwr_state)
4750{
4751 struct rtl_priv *rtlpriv = rtl_priv(hw);
4752 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
4753 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
4754 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4755 bool bresult = true;
4756 u8 i, queue_id;
4757 struct rtl8192_tx_ring *ring = NULL;
4758
4759 switch (rfpwr_state) {
4760 case ERFON:
4761 if ((ppsc->rfpwr_state == ERFOFF) &&
4762 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
4763 bool rtstatus = false;
4764 u32 initializecount = 0;
4765
4766 do {
4767 initializecount++;
4768 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4769 "IPS Set eRf nic enable\n");
4770 rtstatus = rtl_ps_enable_nic(hw);
4771 } while (!rtstatus && (initializecount < 10));
4772 RT_CLEAR_PS_LEVEL(ppsc,
4773 RT_RF_OFF_LEVL_HALT_NIC);
4774 } else {
4775 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4776 "Set ERFON sleeped:%d ms\n",
4777 jiffies_to_msecs(jiffies -
4778 ppsc->
4779 last_sleep_jiffies));
4780 ppsc->last_awake_jiffies = jiffies;
4781 rtl8821ae_phy_set_rf_on(hw);
4782 }
4783 if (mac->link_state == MAC80211_LINKED) {
4784 rtlpriv->cfg->ops->led_control(hw,
4785 LED_CTL_LINK);
4786 } else {
4787 rtlpriv->cfg->ops->led_control(hw,
4788 LED_CTL_NO_LINK);
4789 }
4790 break;
4791 case ERFOFF:
4792 for (queue_id = 0, i = 0;
4793 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
4794 ring = &pcipriv->dev.tx_ring[queue_id];
4795 if (queue_id == BEACON_QUEUE ||
4796 skb_queue_len(&ring->queue) == 0) {
4797 queue_id++;
4798 continue;
4799 } else {
4800 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
4801 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
4802 (i + 1), queue_id,
4803 skb_queue_len(&ring->queue));
4804
4805 udelay(10);
4806 i++;
4807 }
4808 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
4809 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
4810 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
4811 MAX_DOZE_WAITING_TIMES_9x,
4812 queue_id,
4813 skb_queue_len(&ring->queue));
4814 break;
4815 }
4816 }
4817
4818 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
4819 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
4820 "IPS Set eRf nic disable\n");
4821 rtl_ps_disable_nic(hw);
4822 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
4823 } else {
4824 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
4825 rtlpriv->cfg->ops->led_control(hw,
4826 LED_CTL_NO_LINK);
4827 } else {
4828 rtlpriv->cfg->ops->led_control(hw,
4829 LED_CTL_POWER_OFF);
4830 }
4831 }
4832 break;
4833 default:
4834 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
4835 "switch case not process\n");
4836 bresult = false;
4837 break;
4838 }
4839 if (bresult)
4840 ppsc->rfpwr_state = rfpwr_state;
4841 return bresult;
4842}
4843
4844bool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
4845 enum rf_pwrstate rfpwr_state)
4846{
4847 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
4848
4849 bool bresult = false;
4850
4851 if (rfpwr_state == ppsc->rfpwr_state)
4852 return bresult;
4853 bresult = _rtl8821ae_phy_set_rf_power_state(hw, rfpwr_state);
4854 return bresult;
4855}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/phy.h b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.h
new file mode 100644
index 000000000000..c411f0a95cc4
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/phy.h
@@ -0,0 +1,259 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_PHY_H__
27#define __RTL8821AE_PHY_H__
28
29/* MAX_TX_COUNT must always be set to 4, otherwise read
30 * efuse table sequence will be wrong.
31 */
32#define MAX_TX_COUNT 4
33#define TX_1S 0
34#define TX_2S 1
35#define TX_3S 2
36#define TX_4S 3
37
38#define MAX_POWER_INDEX 0x3F
39
40#define MAX_PRECMD_CNT 16
41#define MAX_RFDEPENDCMD_CNT 16
42#define MAX_POSTCMD_CNT 16
43
44#define MAX_DOZE_WAITING_TIMES_9x 64
45
46#define RT_CANNOT_IO(hw) false
47#define HIGHPOWER_RADIOA_ARRAYLEN 22
48
49#define IQK_ADDA_REG_NUM 16
50#define IQK_BB_REG_NUM 9
51#define MAX_TOLERANCE 5
52#define IQK_DELAY_TIME 10
53#define index_mapping_NUM 15
54
55#define APK_BB_REG_NUM 5
56#define APK_AFE_REG_NUM 16
57#define APK_CURVE_REG_NUM 4
58#define PATH_NUM 2
59
60#define LOOP_LIMIT 5
61#define MAX_STALL_TIME 50
62#define AntennaDiversityValue 0x80
63#define MAX_TXPWR_IDX_NMODE_92S 63
64#define Reset_Cnt_Limit 3
65
66#define IQK_ADDA_REG_NUM 16
67#define IQK_MAC_REG_NUM 4
68
69#define RF6052_MAX_PATH 2
70
71#define CT_OFFSET_MAC_ADDR 0X16
72
73#define CT_OFFSET_CCK_TX_PWR_IDX 0x5A
74#define CT_OFFSET_HT401S_TX_PWR_IDX 0x60
75#define CT_OFFSET_HT402S_TX_PWR_IDX_DIFF 0x66
76#define CT_OFFSET_HT20_TX_PWR_IDX_DIFF 0x69
77#define CT_OFFSET_OFDM_TX_PWR_IDX_DIFF 0x6C
78
79#define CT_OFFSET_HT40_MAX_PWR_OFFSET 0x6F
80#define CT_OFFSET_HT20_MAX_PWR_OFFSET 0x72
81
82#define CT_OFFSET_CHANNEL_PLAH 0x75
83#define CT_OFFSET_THERMAL_METER 0x78
84#define CT_OFFSET_RF_OPTION 0x79
85#define CT_OFFSET_VERSION 0x7E
86#define CT_OFFSET_CUSTOMER_ID 0x7F
87
88#define RTL8821AE_MAX_PATH_NUM 2
89
90#define TARGET_CHNL_NUM_2G_5G_8812 59
91
92enum swchnlcmd_id {
93 CMDID_END,
94 CMDID_SET_TXPOWEROWER_LEVEL,
95 CMDID_BBREGWRITE10,
96 CMDID_WRITEPORT_ULONG,
97 CMDID_WRITEPORT_USHORT,
98 CMDID_WRITEPORT_UCHAR,
99 CMDID_RF_WRITEREG,
100};
101
102struct swchnlcmd {
103 enum swchnlcmd_id cmdid;
104 u32 para1;
105 u32 para2;
106 u32 msdelay;
107};
108
109enum hw90_block_e {
110 HW90_BLOCK_MAC = 0,
111 HW90_BLOCK_PHY0 = 1,
112 HW90_BLOCK_PHY1 = 2,
113 HW90_BLOCK_RF = 3,
114 HW90_BLOCK_MAXIMUM = 4,
115};
116
117enum baseband_config_type {
118 BASEBAND_CONFIG_PHY_REG = 0,
119 BASEBAND_CONFIG_AGC_TAB = 1,
120};
121
122enum ra_offset_area {
123 RA_OFFSET_LEGACY_OFDM1,
124 RA_OFFSET_LEGACY_OFDM2,
125 RA_OFFSET_HT_OFDM1,
126 RA_OFFSET_HT_OFDM2,
127 RA_OFFSET_HT_OFDM3,
128 RA_OFFSET_HT_OFDM4,
129 RA_OFFSET_HT_CCK,
130};
131
132enum antenna_path {
133 ANTENNA_NONE,
134 ANTENNA_D,
135 ANTENNA_C,
136 ANTENNA_CD,
137 ANTENNA_B,
138 ANTENNA_BD,
139 ANTENNA_BC,
140 ANTENNA_BCD,
141 ANTENNA_A,
142 ANTENNA_AD,
143 ANTENNA_AC,
144 ANTENNA_ACD,
145 ANTENNA_AB,
146 ANTENNA_ABD,
147 ANTENNA_ABC,
148 ANTENNA_ABCD
149};
150
151struct r_antenna_select_ofdm {
152 u32 r_tx_antenna:4;
153 u32 r_ant_l:4;
154 u32 r_ant_non_ht:4;
155 u32 r_ant_ht1:4;
156 u32 r_ant_ht2:4;
157 u32 r_ant_ht_s1:4;
158 u32 r_ant_non_ht_s1:4;
159 u32 ofdm_txsc:2;
160 u32 reserved:2;
161};
162
163struct r_antenna_select_cck {
164 u8 r_cckrx_enable_2:2;
165 u8 r_cckrx_enable:2;
166 u8 r_ccktx_enable:4;
167};
168
169struct efuse_contents {
170 u8 mac_addr[ETH_ALEN];
171 u8 cck_tx_power_idx[6];
172 u8 ht40_1s_tx_power_idx[6];
173 u8 ht40_2s_tx_power_idx_diff[3];
174 u8 ht20_tx_power_idx_diff[3];
175 u8 ofdm_tx_power_idx_diff[3];
176 u8 ht40_max_power_offset[3];
177 u8 ht20_max_power_offset[3];
178 u8 channel_plan;
179 u8 thermal_meter;
180 u8 rf_option[5];
181 u8 version;
182 u8 oem_id;
183 u8 regulatory;
184};
185
186struct tx_power_struct {
187 u8 cck[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
188 u8 ht40_1s[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
189 u8 ht40_2s[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
190 u8 ht20_diff[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
191 u8 legacy_ht_diff[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
192 u8 legacy_ht_txpowerdiff;
193 u8 groupht20[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
194 u8 groupht40[RTL8821AE_MAX_PATH_NUM][CHANNEL_MAX_NUMBER];
195 u8 pwrgroup_cnt;
196 u32 mcs_original_offset[4][16];
197};
198enum _ANT_DIV_TYPE {
199 NO_ANTDIV = 0xFF,
200 CG_TRX_HW_ANTDIV = 0x01,
201 CGCS_RX_HW_ANTDIV = 0x02,
202 FIXED_HW_ANTDIV = 0x03,
203 CG_TRX_SMART_ANTDIV = 0x04,
204 CGCS_RX_SW_ANTDIV = 0x05,
205
206};
207
208u32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw,
209 u32 regaddr, u32 bitmask);
210void rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw,
211 u32 regaddr, u32 bitmask, u32 data);
212u32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw,
213 enum radio_path rfpath, u32 regaddr,
214 u32 bitmask);
215void rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw,
216 enum radio_path rfpath, u32 regaddr,
217 u32 bitmask, u32 data);
218bool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw);
219bool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw);
220bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw);
221void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw,
222 u8 band);
223void rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw);
224void rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw,
225 long *powerlevel);
226void rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw,
227 u8 channel);
228void rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw,
229 u8 operation);
230void rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw);
231void rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw,
232 enum nl80211_channel_type ch_type);
233void rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw);
234u8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw);
235void rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw,
236 bool b_recovery);
237void rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw,
238 bool b_recovery);
239void rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, char delta);
240void rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw);
241void rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain);
242bool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
243 enum radio_path rfpath);
244bool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
245 enum radio_path rfpath);
246bool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype);
247bool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw,
248 enum rf_pwrstate rfpwr_state);
249u8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl);
250void rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw,
251 u8 channel, u8 path);
252void rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
253 u8 thermal_value, u8 threshold);
254void rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index,
255 u8 thermal_value, u8 threshold);
256void rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw);
257u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8 band, u8 rf_path);
258
259#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c
new file mode 100644
index 000000000000..9ddf78a187dd
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.c
@@ -0,0 +1,182 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../pwrseqcmd.h"
27#include "pwrseq.h"
28
29/* drivers should parse below arrays and do the corresponding actions */
30/* 3 Power on Array */
31struct wlan_pwr_cfg rtl8812_power_on_flow[RTL8812_TRANS_CARDEMU_TO_ACT_STEPS +
32 RTL8812_TRANS_END_STEPS] = {
33 RTL8812_TRANS_CARDEMU_TO_ACT
34 RTL8812_TRANS_END
35};
36
37/* 3Radio off GPIO Array */
38struct wlan_pwr_cfg rtl8812_radio_off_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
39 RTL8812_TRANS_END_STEPS] = {
40 RTL8812_TRANS_ACT_TO_CARDEMU
41 RTL8812_TRANS_END
42};
43
44/* 3Card Disable Array */
45struct wlan_pwr_cfg rtl8812_card_disable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS
46 + RTL8812_TRANS_CARDEMU_TO_PDN_STEPS
47 + RTL8812_TRANS_END_STEPS] = {
48 RTL8812_TRANS_ACT_TO_CARDEMU
49 RTL8812_TRANS_CARDEMU_TO_CARDDIS
50 RTL8812_TRANS_END
51};
52
53/* 3 Card Enable Array */
54struct wlan_pwr_cfg rtl8812_card_enable_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS
55 + RTL8812_TRANS_CARDEMU_TO_PDN_STEPS
56 + RTL8812_TRANS_END_STEPS] = {
57 RTL8812_TRANS_CARDDIS_TO_CARDEMU
58 RTL8812_TRANS_CARDEMU_TO_ACT
59 RTL8812_TRANS_END
60};
61
62/* 3Suspend Array */
63struct wlan_pwr_cfg rtl8812_suspend_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
64 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
65 RTL8812_TRANS_END_STEPS] = {
66 RTL8812_TRANS_ACT_TO_CARDEMU
67 RTL8812_TRANS_CARDEMU_TO_SUS
68 RTL8812_TRANS_END
69};
70
71/* 3 Resume Array */
72struct wlan_pwr_cfg rtl8812_resume_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
73 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
74 RTL8812_TRANS_END_STEPS] = {
75 RTL8812_TRANS_SUS_TO_CARDEMU
76 RTL8812_TRANS_CARDEMU_TO_ACT
77 RTL8812_TRANS_END
78};
79
80/* 3HWPDN Array */
81struct wlan_pwr_cfg rtl8812_hwpdn_flow[RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
82 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
83 RTL8812_TRANS_END_STEPS] = {
84 RTL8812_TRANS_ACT_TO_CARDEMU
85 RTL8812_TRANS_CARDEMU_TO_PDN
86 RTL8812_TRANS_END
87};
88
89/* 3 Enter LPS */
90struct wlan_pwr_cfg rtl8812_enter_lps_flow[RTL8812_TRANS_ACT_TO_LPS_STEPS +
91 RTL8812_TRANS_END_STEPS] = {
92 /* FW behavior */
93 RTL8812_TRANS_ACT_TO_LPS
94 RTL8812_TRANS_END
95};
96
97/* 3 Leave LPS */
98struct wlan_pwr_cfg rtl8812_leave_lps_flow[RTL8812_TRANS_LPS_TO_ACT_STEPS +
99 RTL8812_TRANS_END_STEPS] = {
100 /* FW behavior */
101 RTL8812_TRANS_LPS_TO_ACT
102 RTL8812_TRANS_END
103};
104
105/* drivers should parse below arrays and do the corresponding actions */
106/*3 Power on Array*/
107struct wlan_pwr_cfg rtl8821A_power_on_flow[RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS
108 + RTL8821A_TRANS_END_STEPS] = {
109 RTL8821A_TRANS_CARDEMU_TO_ACT
110 RTL8821A_TRANS_END
111};
112
113/*3Radio off GPIO Array */
114struct wlan_pwr_cfg rtl8821A_radio_off_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
115 + RTL8821A_TRANS_END_STEPS] = {
116 RTL8821A_TRANS_ACT_TO_CARDEMU
117 RTL8821A_TRANS_END
118};
119
120/*3Card Disable Array*/
121struct wlan_pwr_cfg rtl8821A_card_disable_flow
122 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
123 + RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS
124 + RTL8821A_TRANS_END_STEPS] = {
125 RTL8821A_TRANS_ACT_TO_CARDEMU
126 RTL8821A_TRANS_CARDEMU_TO_CARDDIS
127 RTL8821A_TRANS_END
128};
129
130/*3 Card Enable Array*/
131/*RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS*/
132struct wlan_pwr_cfg rtl8821A_card_enable_flow
133 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
134 + RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS
135 + RTL8821A_TRANS_END_STEPS] = {
136 RTL8821A_TRANS_CARDDIS_TO_CARDEMU
137 RTL8821A_TRANS_CARDEMU_TO_ACT
138 RTL8821A_TRANS_END
139};
140
141/*3Suspend Array*/
142struct wlan_pwr_cfg rtl8821A_suspend_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
143 + RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS
144 + RTL8821A_TRANS_END_STEPS] = {
145 RTL8821A_TRANS_ACT_TO_CARDEMU
146 RTL8821A_TRANS_CARDEMU_TO_SUS
147 RTL8821A_TRANS_END
148};
149
150/*3 Resume Array*/
151struct wlan_pwr_cfg rtl8821A_resume_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
152 + RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS
153 + RTL8821A_TRANS_END_STEPS] = {
154 RTL8821A_TRANS_SUS_TO_CARDEMU
155 RTL8821A_TRANS_CARDEMU_TO_ACT
156 RTL8821A_TRANS_END
157};
158
159/*3HWPDN Array*/
160struct wlan_pwr_cfg rtl8821A_hwpdn_flow[RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS
161 + RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS
162 + RTL8821A_TRANS_END_STEPS] = {
163 RTL8821A_TRANS_ACT_TO_CARDEMU
164 RTL8821A_TRANS_CARDEMU_TO_PDN
165 RTL8821A_TRANS_END
166};
167
168/*3 Enter LPS */
169struct wlan_pwr_cfg rtl8821A_enter_lps_flow[RTL8821A_TRANS_ACT_TO_LPS_STEPS
170 + RTL8821A_TRANS_END_STEPS] = {
171 /*FW behavior*/
172 RTL8821A_TRANS_ACT_TO_LPS
173 RTL8821A_TRANS_END
174};
175
176/*3 Leave LPS */
177struct wlan_pwr_cfg rtl8821A_leave_lps_flow[RTL8821A_TRANS_LPS_TO_ACT_STEPS
178 + RTL8821A_TRANS_END_STEPS] = {
179 /*FW behavior*/
180 RTL8821A_TRANS_LPS_TO_ACT
181 RTL8821A_TRANS_END
182};
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h
new file mode 100644
index 000000000000..bf0b0ce9519c
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/pwrseq.h
@@ -0,0 +1,738 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_PWRSEQ_H__
27#define __RTL8821AE_PWRSEQ_H__
28
29#include "../pwrseqcmd.h"
30#include "../btcoexist/halbt_precomp.h"
31
32#define RTL8812_TRANS_CARDEMU_TO_ACT_STEPS 15
33#define RTL8812_TRANS_ACT_TO_CARDEMU_STEPS 15
34#define RTL8812_TRANS_CARDEMU_TO_SUS_STEPS 15
35#define RTL8812_TRANS_SUS_TO_CARDEMU_STEPS 15
36#define RTL8812_TRANS_CARDEMU_TO_PDN_STEPS 25
37#define RTL8812_TRANS_PDN_TO_CARDEMU_STEPS 15
38#define RTL8812_TRANS_ACT_TO_LPS_STEPS 15
39#define RTL8812_TRANS_LPS_TO_ACT_STEPS 15
40#define RTL8812_TRANS_END_STEPS 1
41
42/* The following macros have the following format:
43 * { offset, cut_msk, fab_msk|interface_msk, base|cmd, msk, value
44 * comments },
45 */
46#define RTL8812_TRANS_CARDEMU_TO_ACT \
47 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
48 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, 0 \
49 /* disable SW LPS 0x04[10]=0*/}, \
50 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
51 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, BIT1 \
52 /* wait till 0x04[17] = 1 power ready*/}, \
53 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
54 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
55 /* disable HWPDN 0x04[15]=0*/}, \
56 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
57 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, 0 \
58 /* disable WL suspend*/}, \
59 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
60 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
61 /* polling until return 0*/}, \
62 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
63 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT0, 0},
64
65#define RTL8812_TRANS_ACT_TO_CARDEMU \
66 {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
67 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
68 /* 0xc00[7:0] = 4 turn off 3-wire */}, \
69 {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
70 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
71 /* 0xe00[7:0] = 4 turn off 3-wire */}, \
72 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
73 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
74 /* 0x2[0] = 0 RESET BB, CLOSE RF */}, \
75 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
76 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US \
77 /*Delay 1us*/}, \
78 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
79 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
80 /* Whole BB is reset*/}, \
81 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
82 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x2A \
83 /* 0x07[7:0] = 0x28 sps pwm mode 0x2a for BT coex*/}, \
84 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
85 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x02, 0 \
86 /*0x8[1] = 0 ANA clk =500k */}, \
87 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
88 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
89 /*0x04[9] = 1 turn off MAC by HW state machine*/}, \
90 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
91 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, 0 \
92 /*wait till 0x04[9] = 0 polling until return 0 to disable*/},
93
94#define RTL8812_TRANS_CARDEMU_TO_SUS \
95 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
96 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xcc}, \
97 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
98 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xEC}, \
99 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
100 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x07 \
101 /* gpio11 input mode, gpio10~8 output mode */}, \
102 {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
103 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
104 /* gpio 0~7 output same value as input ?? */}, \
105 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
106 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xff \
107 /* gpio0~7 output mode */}, \
108 {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
109 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
110 /* 0x47[7:0] = 00 gpio mode */}, \
111 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
112 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
113 /* suspend option all off */}, \
114 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
115 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, BIT7 \
116 /*0x14[7] = 1 turn on ZCD */}, \
117 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
118 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, BIT0 \
119 /* 0x15[0] =1 trun on ZCD */}, \
120 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
121 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, BIT4 \
122 /*0x23[4] = 1 hpon LDO sleep mode */}, \
123 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
124 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x02, 0 \
125 /*0x8[1] = 0 ANA clk =500k */}, \
126 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
127 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, BIT3 \
128 /*0x04[11] = 2b'11 enable WL suspend for PCIe*/},
129
130#define RTL8812_TRANS_SUS_TO_CARDEMU \
131 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
132 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, 0 \
133 /*0x04[11] = 2b'01enable WL suspend*/}, \
134 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
135 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, 0 \
136 /*0x23[4] = 0 hpon LDO sleep mode leave */}, \
137 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
138 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, 0 \
139 /* 0x15[0] =0 trun off ZCD */}, \
140 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
141 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, 0 \
142 /*0x14[7] = 0 turn off ZCD */}, \
143 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
144 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
145 /* gpio0~7 input mode */}, \
146 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
147 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
148 /* gpio11 input mode, gpio10~8 input mode */},
149
150#define RTL8812_TRANS_CARDEMU_TO_CARDDIS \
151 {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
152 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, 0 \
153 /*0x03[2] = 0, reset 8051*/}, \
154 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
155 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x05 \
156 /*0x80=05h if reload fw, fill the default value of host_CPU handshake field*/}, \
157 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
158 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xcc}, \
159 {0x0042, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
160 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xF0, 0xEC}, \
161 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
162 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x07 \
163 /* gpio11 input mode, gpio10~8 output mode */}, \
164 {0x0045, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
165 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
166 /* gpio 0~7 output same value as input ?? */}, \
167 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
168 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xff \
169 /* gpio0~7 output mode */}, \
170 {0x0047, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
171 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
172 /* 0x47[7:0] = 00 gpio mode */}, \
173 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
174 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, BIT7 \
175 /*0x14[7] = 1 turn on ZCD */}, \
176 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
177 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, BIT0 \
178 /* 0x15[0] =1 trun on ZCD */}, \
179 {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
180 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, 0 \
181 /*0x12[0] = 0 force PFM mode */}, \
182 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
183 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, BIT4 \
184 /*0x23[4] = 1 hpon LDO sleep mode */}, \
185 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
186 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x02, 0 \
187 /*0x8[1] = 0 ANA clk =500k */}, \
188 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
189 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
190 /*0x07=0x20 , SOP option to disable BG/MB*/}, \
191 {0x001f, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
192 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
193 /*0x01f[1]=0 , disable RFC_0 control REG_RF_CTRL_8812 */}, \
194 {0x0076, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
195 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
196 /*0x076[1]=0 , disable RFC_1 control REG_OPT_CTRL_8812 +2 */}, \
197 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
198 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, BIT3 \
199 /*0x04[11] = 2b'01 enable WL suspend*/},
200
201#define RTL8812_TRANS_CARDDIS_TO_CARDEMU \
202 {0x0012, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
203 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
204 /*0x12[0] = 1 force PWM mode */}, \
205 {0x0014, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
206 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x80, 0 \
207 /*0x14[7] = 0 turn off ZCD */}, \
208 {0x0015, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
209 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x01, 0 \
210 /* 0x15[0] =0 trun off ZCD */}, \
211 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
212 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0x10, 0 \
213 /*0x23[4] = 0 hpon LDO leave sleep mode */}, \
214 {0x0046, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
215 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
216 /* gpio0~7 input mode */}, \
217 {0x0043, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
218 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
219 /* gpio11 input mode, gpio10~8 input mode */}, \
220 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
221 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, 0 \
222 /*0x04[10] = 0, enable SW LPS PCIE only*/}, \
223 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
224 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3, 0 \
225 /*0x04[11] = 2b'01enable WL suspend*/}, \
226 {0x0003, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
227 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, BIT2 \
228 /*0x03[2] = 1, enable 8051*/}, \
229 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
230 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
231 /*PCIe DMA start*/},
232
233#define RTL8812_TRANS_CARDEMU_TO_PDN \
234 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
235 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, BIT7 \
236 /* 0x04[15] = 1*/},
237
238#define RTL8812_TRANS_PDN_TO_CARDEMU \
239 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
240 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
241 /* 0x04[15] = 0*/},
242
243#define RTL8812_TRANS_ACT_TO_LPS \
244 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
245 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
246 /*PCIe DMA stop*/}, \
247 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
248 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x7F \
249 /*Tx Pause*/}, \
250 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
251 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
252 /*Should be zero if no packet is transmitting*/}, \
253 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
254 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
255 /*Should be zero if no packet is transmitting*/}, \
256 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
257 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
258 /*Should be zero if no packet is transmitting*/}, \
259 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
260 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
261 /*Should be zero if no packet is transmitting*/}, \
262 {0x0c00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
263 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
264 /* 0xc00[7:0] = 4 turn off 3-wire */}, \
265 {0x0e00, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
266 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x04 \
267 /* 0xe00[7:0] = 4 turn off 3-wire */}, \
268 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
269 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
270 /*CCK and OFDM are disabled,and clock are gated,and RF closed*/}, \
271 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
272 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US \
273 /*Delay 1us*/}, \
274 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
275 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
276 /* Whole BB is reset*/}, \
277 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
278 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x03 \
279 /*Reset MAC TRX*/}, \
280 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
281 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
282 /*check if removed later*/}, \
283 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
284 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5 \
285 /*Respond TxOK to scheduler*/},
286
287#define RTL8812_TRANS_LPS_TO_ACT \
288 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
289 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84 \
290 /*SDIO RPWM*/}, \
291 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
292 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
293 /*USB RPWM*/}, \
294 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
295 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
296 /*PCIe RPWM*/}, \
297 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
298 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS \
299 /*Delay*/}, \
300 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
301 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
302 /*. 0x08[4] = 0 switch TSF to 40M*/}, \
303 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
304 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT7, 0 \
305 /*Polling 0x109[7]=0 TSF in 40M*/}, \
306 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
307 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6|BIT7, 0 \
308 /*. 0x29[7:6] = 2b'00 enable BB clock*/}, \
309 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
310 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
311 /*. 0x101[1] = 1*/}, \
312 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
313 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
314 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/}, \
315 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
316 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0 \
317 /*. 0x02[1:0] = 2b'11 enable BB macro*/}, \
318 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
319 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
320 /*. 0x522 = 0*/},
321
322#define RTL8812_TRANS_END \
323 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK, \
324 0, PWR_CMD_END, 0, 0},
325
326extern struct wlan_pwr_cfg rtl8812_power_on_flow
327 [RTL8812_TRANS_CARDEMU_TO_ACT_STEPS +
328 RTL8812_TRANS_END_STEPS];
329extern struct wlan_pwr_cfg rtl8812_radio_off_flow
330 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
331 RTL8812_TRANS_END_STEPS];
332extern struct wlan_pwr_cfg rtl8812_card_disable_flow
333 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
334 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
335 RTL8812_TRANS_END_STEPS];
336extern struct wlan_pwr_cfg rtl8812_card_enable_flow
337 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
338 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
339 RTL8812_TRANS_END_STEPS];
340extern struct wlan_pwr_cfg rtl8812_suspend_flow
341 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
342 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
343 RTL8812_TRANS_END_STEPS];
344extern struct wlan_pwr_cfg rtl8812_resume_flow
345 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
346 RTL8812_TRANS_CARDEMU_TO_SUS_STEPS +
347 RTL8812_TRANS_END_STEPS];
348extern struct wlan_pwr_cfg rtl8812_hwpdn_flow
349 [RTL8812_TRANS_ACT_TO_CARDEMU_STEPS +
350 RTL8812_TRANS_CARDEMU_TO_PDN_STEPS +
351 RTL8812_TRANS_END_STEPS];
352extern struct wlan_pwr_cfg rtl8812_enter_lps_flow
353 [RTL8812_TRANS_ACT_TO_LPS_STEPS +
354 RTL8812_TRANS_END_STEPS];
355extern struct wlan_pwr_cfg rtl8812_leave_lps_flow
356 [RTL8812_TRANS_LPS_TO_ACT_STEPS +
357 RTL8812_TRANS_END_STEPS];
358
359/* Check document WM-20130516-JackieLau-RTL8821A_Power_Architecture-R10.vsd
360 * There are 6 HW Power States:
361 * 0: POFF--Power Off
362 * 1: PDN--Power Down
363 * 2: CARDEMU--Card Emulation
364 * 3: ACT--Active Mode
365 * 4: LPS--Low Power State
366 * 5: SUS--Suspend
367 *
368 * The transision from different states are defined below
369 * TRANS_CARDEMU_TO_ACT
370 * TRANS_ACT_TO_CARDEMU
371 * TRANS_CARDEMU_TO_SUS
372 * TRANS_SUS_TO_CARDEMU
373 * TRANS_CARDEMU_TO_PDN
374 * TRANS_ACT_TO_LPS
375 * TRANS_LPS_TO_ACT
376 *
377 * TRANS_END
378 */
379#define RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS 25
380#define RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS 15
381#define RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS 15
382#define RTL8821A_TRANS_SUS_TO_CARDEMU_STEPS 15
383#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU_STEPS 15
384#define RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS 15
385#define RTL8821A_TRANS_PDN_TO_CARDEMU_STEPS 15
386#define RTL8821A_TRANS_ACT_TO_LPS_STEPS 15
387#define RTL8821A_TRANS_LPS_TO_ACT_STEPS 15
388#define RTL8821A_TRANS_END_STEPS 1
389
390#define RTL8821A_TRANS_CARDEMU_TO_ACT \
391 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
392 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
393 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
394 /*0x20[0] = 1b'1 enable LDOA12 MACRO block for all interface*/}, \
395 {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
396 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
397 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
398 /*0x67[0] = 0 to disable BT_GPS_SEL pins*/}, \
399 {0x0001, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
400 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
401 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 1, PWRSEQ_DELAY_MS \
402 /*Delay 1ms*/}, \
403 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
404 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
405 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, 0 \
406 /*0x00[5] = 1b'0 release analog Ips to digital ,1:isolation*/}, \
407 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
408 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT4|BIT3|BIT2), 0 \
409 /* disable SW LPS 0x04[10]=0 and WLSUS_EN 0x04[12:11]=0*/}, \
410 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
411 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0 , BIT0 \
412 /* Disable USB suspend */}, \
413 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
414 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, BIT1 \
415 /* wait till 0x04[17] = 1 power ready*/}, \
416 {0x0075, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
417 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0 , 0 \
418 /* Enable USB suspend */}, \
419 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
420 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
421 /* release WLON reset 0x04[16]=1*/}, \
422 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
423 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
424 /* disable HWPDN 0x04[15]=0*/}, \
425 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
426 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT4|BIT3), 0 \
427 /* disable WL suspend*/}, \
428 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
429 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
430 /* polling until return 0*/}, \
431 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
432 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT0, 0 \
433 /**/}, \
434 {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
435 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
436 /*0x4C[24] = 0x4F[0] = 1, switch DPDT_SEL_P output from WL BB */},\
437 {0x0067, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
438 PWR_BASEADDR_MAC, PWR_CMD_WRITE, (BIT5|BIT4), (BIT5|BIT4) \
439 /*0x66[13] = 0x67[5] = 1, switch for PAPE_G/PAPE_A \
440 from WL BB ; 0x66[12] = 0x67[4] = 1, switch LNAON from WL BB */},\
441 {0x0025, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
442 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6, 0 \
443 /*anapar_mac<118> , 0x25[6]=0 by wlan single function*/},\
444 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
445 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
446 /*Enable falling edge triggering interrupt*/},\
447 {0x0063, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
448 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
449 /*Enable GPIO9 interrupt mode*/},\
450 {0x0062, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
451 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
452 /*Enable GPIO9 input mode*/},\
453 {0x0058, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
454 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, BIT0 \
455 /*Enable HSISR GPIO[C:0] interrupt*/},\
456 {0x005A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
457 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
458 /*Enable HSISR GPIO9 interrupt*/},\
459 {0x007A, PWR_CUT_TESTCHIP_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
460 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x3A \
461 /*0x7A = 0x3A start BT*/},\
462 {0x002E, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
463 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF , 0x82 \
464 /* 0x2C[23:12]=0x820 ; XTAL trim */}, \
465 {0x0010, PWR_CUT_A_MSK , PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
466 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6 , BIT6 \
467 /* 0x10[6]=1 */},
468
469#define RTL8821A_TRANS_ACT_TO_CARDEMU \
470 {0x001F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
471 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
472 /*0x1F[7:0] = 0 turn off RF*/}, \
473 {0x004F, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
474 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
475 /*0x4C[24] = 0x4F[0] = 0, switch DPDT_SEL_P output from \
476 register 0x65[2] */},\
477 {0x0049, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
478 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
479 /*Enable rising edge triggering interrupt*/}, \
480 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
481 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
482 /*0x04[9] = 1 turn off MAC by HW state machine*/}, \
483 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
484 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT1, 0 \
485 /*wait till 0x04[9] = 0 polling until return 0 to disable*/}, \
486 {0x0000, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
487 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
488 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5 \
489 /*0x00[5] = 1b'1 analog Ips to digital ,1:isolation*/}, \
490 {0x0020, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
491 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
492 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
493 /*0x20[0] = 1b'0 disable LDOA12 MACRO block*/},
494
495#define RTL8821A_TRANS_CARDEMU_TO_SUS \
496 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
497 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4|BIT3, (BIT4|BIT3) \
498 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/}, \
499 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
500 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
501 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, BIT3 \
502 /*0x04[12:11] = 2b'01 enable WL suspend*/}, \
503 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
504 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4 \
505 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/}, \
506 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
507 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
508 /*0x07[7:0] = 0x20 SDIO SOP option to disable BG/MB/ACK/SWR*/}, \
509 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
510 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, BIT3|BIT4 \
511 /*0x04[12:11] = 2b'11 enable WL suspend for PCIe*/}, \
512 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
513 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, BIT0 \
514 /*Set SDIO suspend local register*/}, \
515 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
516 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, 0 \
517 /*wait power state to suspend*/},
518
519#define RTL8821A_TRANS_SUS_TO_CARDEMU \
520 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
521 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3 | BIT7, 0 \
522 /*clear suspend enable and power down enable*/}, \
523 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
524 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, 0 \
525 /*Set SDIO suspend local register*/}, \
526 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
527 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, BIT1 \
528 /*wait power state to suspend*/},\
529 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
530 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
531 /*0x23[4] = 1b'0 12H LDO enter normal mode*/}, \
532 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
533 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, 0 \
534 /*0x04[12:11] = 2b'01enable WL suspend*/},
535
536#define RTL8821A_TRANS_CARDEMU_TO_CARDDIS \
537 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
538 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
539 /*0x07=0x20 , SOP option to disable BG/MB*/}, \
540 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
541 PWR_INTF_USB_MSK|PWR_INTF_SDIO_MSK,\
542 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, BIT3 \
543 /*0x04[12:11] = 2b'01 enable WL suspend*/}, \
544 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
545 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT2, BIT2 \
546 /*0x04[10] = 1, enable SW LPS*/}, \
547 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
548 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 1 \
549 /*0x48[16] = 1 to enable GPIO9 as EXT WAKEUP*/}, \
550 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
551 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4 \
552 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/}, \
553 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
554 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, BIT0 \
555 /*Set SDIO suspend local register*/}, \
556 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
557 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, 0 \
558 /*wait power state to suspend*/},
559
560#define RTL8821A_TRANS_CARDDIS_TO_CARDEMU \
561 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
562 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3 | BIT7, 0 \
563 /*clear suspend enable and power down enable*/}, \
564 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
565 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, BIT0, 0 \
566 /*Set SDIO suspend local register*/}, \
567 {0x0086, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
568 PWR_BASEADDR_SDIO, PWR_CMD_POLLING, BIT1, BIT1 \
569 /*wait power state to suspend*/},\
570 {0x004A, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
571 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
572 /*0x48[16] = 0 to disable GPIO9 as EXT WAKEUP*/}, \
573 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
574 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT3|BIT4, 0 \
575 /*0x04[12:11] = 2b'01enable WL suspend*/},\
576 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
577 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
578 /*0x23[4] = 1b'0 12H LDO enter normal mode*/}, \
579 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
580 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
581 /*PCIe DMA start*/},
582
583#define RTL8821A_TRANS_CARDEMU_TO_PDN \
584 {0x0023, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
585 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, BIT4 \
586 /*0x23[4] = 1b'1 12H LDO enter sleep mode*/}, \
587 {0x0007, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, \
588 PWR_INTF_SDIO_MSK|PWR_INTF_USB_MSK,\
589 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x20 \
590 /*0x07[7:0] = 0x20 SOP option to disable BG/MB/ACK/SWR*/}, \
591 {0x0006, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
592 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
593 /* 0x04[16] = 0*/},\
594 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
595 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, BIT7 \
596 /* 0x04[15] = 1*/},
597
598#define RTL8821A_TRANS_PDN_TO_CARDEMU \
599 {0x0005, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
600 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT7, 0 \
601 /* 0x04[15] = 0*/},
602
603#define RTL8821A_TRANS_ACT_TO_LPS \
604 {0x0301, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
605 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
606 /*PCIe DMA stop*/}, \
607 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
608 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
609 /*Tx Pause*/}, \
610 {0x05F8, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
611 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
612 /*Should be zero if no packet is transmitting*/}, \
613 {0x05F9, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
614 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
615 /*Should be zero if no packet is transmitting*/}, \
616 {0x05FA, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
617 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
618 /*Should be zero if no packet is transmitting*/}, \
619 {0x05FB, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
620 PWR_BASEADDR_MAC, PWR_CMD_POLLING, 0xFF, 0 \
621 /*Should be zero if no packet is transmitting*/}, \
622 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
623 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT0, 0 \
624 /*CCK and OFDM are disabled,and clock are gated*/}, \
625 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
626 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_US \
627 /*Delay 1us*/}, \
628 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
629 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
630 /*Whole BB is reset*/}, \
631 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
632 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x03 \
633 /*Reset MAC TRX*/}, \
634 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
635 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, 0 \
636 /*check if removed later*/}, \
637 {0x0093, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
638 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x00 \
639 /*When driver enter Sus/ Disable, enable LOP for BT*/}, \
640 {0x0553, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
641 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT5, BIT5 \
642 /*Respond TxOK to scheduler*/},
643
644#define RTL8821A_TRANS_LPS_TO_ACT \
645 {0x0080, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_SDIO_MSK,\
646 PWR_BASEADDR_SDIO, PWR_CMD_WRITE, 0xFF, 0x84 \
647 /*SDIO RPWM*/},\
648 {0xFE58, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_USB_MSK,\
649 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
650 /*USB RPWM*/},\
651 {0x0361, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_PCI_MSK,\
652 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0x84 \
653 /*PCIe RPWM*/},\
654 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
655 PWR_BASEADDR_MAC, PWR_CMD_DELAY, 0, PWRSEQ_DELAY_MS \
656 /*Delay*/},\
657 {0x0008, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
658 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT4, 0 \
659 /*. 0x08[4] = 0 switch TSF to 40M*/},\
660 {0x0109, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
661 PWR_BASEADDR_MAC, PWR_CMD_POLLING, BIT7, 0 \
662 /*Polling 0x109[7]=0 TSF in 40M*/},\
663 {0x0029, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
664 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT6|BIT7, 0 \
665 /*. 0x29[7:6] = 2b'00 enable BB clock*/},\
666 {0x0101, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
667 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1, BIT1 \
668 /*. 0x101[1] = 1*/},\
669 {0x0100, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
670 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0xFF \
671 /*. 0x100[7:0] = 0xFF enable WMAC TRX*/},\
672 {0x0002, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
673 PWR_BASEADDR_MAC, PWR_CMD_WRITE, BIT1|BIT0, BIT1|BIT0 \
674 /*. 0x02[1:0] = 2b'11 enable BB macro*/},\
675 {0x0522, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
676 PWR_BASEADDR_MAC, PWR_CMD_WRITE, 0xFF, 0 \
677 /*. 0x522 = 0*/},
678
679#define RTL8821A_TRANS_END \
680 {0xFFFF, PWR_CUT_ALL_MSK, PWR_FAB_ALL_MSK, PWR_INTF_ALL_MSK,\
681 0, PWR_CMD_END, 0, 0},
682
683extern struct wlan_pwr_cfg rtl8821A_power_on_flow
684 [RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS +
685 RTL8821A_TRANS_END_STEPS];
686extern struct wlan_pwr_cfg rtl8821A_radio_off_flow
687 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
688 RTL8821A_TRANS_END_STEPS];
689extern struct wlan_pwr_cfg rtl8821A_card_disable_flow
690 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
691 RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS +
692 RTL8821A_TRANS_END_STEPS];
693extern struct wlan_pwr_cfg rtl8821A_card_enable_flow
694 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
695 RTL8821A_TRANS_CARDEMU_TO_ACT_STEPS +
696 RTL8821A_TRANS_END_STEPS];
697extern struct wlan_pwr_cfg rtl8821A_suspend_flow
698 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
699 RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS +
700 RTL8821A_TRANS_END_STEPS];
701extern struct wlan_pwr_cfg rtl8821A_resume_flow
702 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
703 RTL8821A_TRANS_CARDEMU_TO_SUS_STEPS +
704 RTL8821A_TRANS_END_STEPS];
705extern struct wlan_pwr_cfg rtl8821A_hwpdn_flow
706 [RTL8821A_TRANS_ACT_TO_CARDEMU_STEPS +
707 RTL8821A_TRANS_CARDEMU_TO_PDN_STEPS +
708 RTL8821A_TRANS_END_STEPS];
709extern struct wlan_pwr_cfg rtl8821A_enter_lps_flow
710 [RTL8821A_TRANS_ACT_TO_LPS_STEPS +
711 RTL8821A_TRANS_END_STEPS];
712extern struct wlan_pwr_cfg rtl8821A_leave_lps_flow
713 [RTL8821A_TRANS_LPS_TO_ACT_STEPS +
714 RTL8821A_TRANS_END_STEPS];
715
716/*RTL8812 Power Configuration CMDs for PCIe interface*/
717#define RTL8812_NIC_PWR_ON_FLOW rtl8812_power_on_flow
718#define RTL8812_NIC_RF_OFF_FLOW rtl8812_radio_off_flow
719#define RTL8812_NIC_DISABLE_FLOW rtl8812_card_disable_flow
720#define RTL8812_NIC_ENABLE_FLOW rtl8812_card_enable_flow
721#define RTL8812_NIC_SUSPEND_FLOW rtl8812_suspend_flow
722#define RTL8812_NIC_RESUME_FLOW rtl8812_resume_flow
723#define RTL8812_NIC_PDN_FLOW rtl8812_hwpdn_flow
724#define RTL8812_NIC_LPS_ENTER_FLOW rtl8812_enter_lps_flow
725#define RTL8812_NIC_LPS_LEAVE_FLOW rtl8812_leave_lps_flow
726
727/* RTL8821 Power Configuration CMDs for PCIe interface */
728#define RTL8821A_NIC_PWR_ON_FLOW rtl8821A_power_on_flow
729#define RTL8821A_NIC_RF_OFF_FLOW rtl8821A_radio_off_flow
730#define RTL8821A_NIC_DISABLE_FLOW rtl8821A_card_disable_flow
731#define RTL8821A_NIC_ENABLE_FLOW rtl8821A_card_enable_flow
732#define RTL8821A_NIC_SUSPEND_FLOW rtl8821A_suspend_flow
733#define RTL8821A_NIC_RESUME_FLOW rtl8821A_resume_flow
734#define RTL8821A_NIC_PDN_FLOW rtl8821A_hwpdn_flow
735#define RTL8821A_NIC_LPS_ENTER_FLOW rtl8821A_enter_lps_flow
736#define RTL8821A_NIC_LPS_LEAVE_FLOW rtl8821A_leave_lps_flow
737
738#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/reg.h b/drivers/net/wireless/rtlwifi/rtl8821ae/reg.h
new file mode 100644
index 000000000000..53668fc8f23e
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/reg.h
@@ -0,0 +1,2464 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_REG_H__
27#define __RTL8821AE_REG_H__
28
29#define TXPKT_BUF_SELECT 0x69
30#define RXPKT_BUF_SELECT 0xA5
31#define DISABLE_TRXPKT_BUF_ACCESS 0x0
32
33#define REG_SYS_ISO_CTRL 0x0000
34#define REG_SYS_FUNC_EN 0x0002
35#define REG_APS_FSMCO 0x0004
36#define REG_SYS_CLKR 0x0008
37#define REG_9346CR 0x000A
38#define REG_EE_VPD 0x000C
39#define REG_AFE_MISC 0x0010
40#define REG_SPS0_CTRL 0x0011
41#define REG_SPS_OCP_CFG 0x0018
42#define REG_RSV_CTRL 0x001C
43#define REG_RF_CTRL 0x001F
44#define REG_LDOA15_CTRL 0x0020
45#define REG_LDOV12D_CTRL 0x0021
46#define REG_LDOHCI12_CTRL 0x0022
47#define REG_LPLDO_CTRL 0x0023
48#define REG_AFE_XTAL_CTRL 0x0024
49 /* 1.5v for 8188EE test chip, 1.4v for MP chip */
50#define REG_AFE_LDO_CTRL 0x0027
51#define REG_AFE_PLL_CTRL 0x0028
52#define REG_MAC_PHY_CTRL 0x002c
53#define REG_EFUSE_CTRL 0x0030
54#define REG_EFUSE_TEST 0x0034
55#define REG_PWR_DATA 0x0038
56#define REG_CAL_TIMER 0x003C
57#define REG_ACLK_MON 0x003E
58#define REG_GPIO_MUXCFG 0x0040
59#define REG_GPIO_IO_SEL 0x0042
60#define REG_MAC_PINMUX_CFG 0x0043
61#define REG_GPIO_PIN_CTRL 0x0044
62#define REG_GPIO_INTM 0x0048
63#define REG_LEDCFG0 0x004C
64#define REG_LEDCFG1 0x004D
65#define REG_LEDCFG2 0x004E
66#define REG_LEDCFG3 0x004F
67#define REG_FSIMR 0x0050
68#define REG_FSISR 0x0054
69#define REG_HSIMR 0x0058
70#define REG_HSISR 0x005c
71#define REG_GPIO_PIN_CTRL_2 0x0060
72#define REG_GPIO_IO_SEL_2 0x0062
73#define REG_MULTI_FUNC_CTRL 0x0068
74#define REG_GPIO_OUTPUT 0x006c
75#define REG_OPT_CTRL 0x0074
76#define REG_AFE_XTAL_CTRL_EXT 0x0078
77#define REG_XCK_OUT_CTRL 0x007c
78#define REG_MCUFWDL 0x0080
79#define REG_WOL_EVENT 0x0081
80#define REG_MCUTSTCFG 0x0084
81
82#define REG_HIMR 0x00B0
83#define REG_HISR 0x00B4
84#define REG_HIMRE 0x00B8
85#define REG_HISRE 0x00BC
86
87#define REG_PMC_DBG_CTRL2 0x00CC
88
89#define REG_EFUSE_ACCESS 0x00CF
90
91#define REG_BIST_SCAN 0x00D0
92#define REG_BIST_RPT 0x00D4
93#define REG_BIST_ROM_RPT 0x00D8
94#define REG_USB_SIE_INTF 0x00E0
95#define REG_PCIE_MIO_INTF 0x00E4
96#define REG_PCIE_MIO_INTD 0x00E8
97#define REG_HPON_FSM 0x00EC
98#define REG_SYS_CFG 0x00F0
99#define REG_GPIO_OUTSTS 0x00F4
100#define REG_MAC_PHY_CTRL_NORMAL 0x00F8
101#define REG_SYS_CFG1 0x00FC
102#define REG_ROM_VERSION 0x00FD
103
104#define REG_CR 0x0100
105#define REG_PBP 0x0104
106#define REG_PKT_BUFF_ACCESS_CTRL 0x0106
107#define REG_TRXDMA_CTRL 0x010C
108#define REG_TRXFF_BNDY 0x0114
109#define REG_TRXFF_STATUS 0x0118
110#define REG_RXFF_PTR 0x011C
111
112#define REG_CPWM 0x012F
113#define REG_FWIMR 0x0130
114#define REG_FWISR 0x0134
115#define REG_FTISR 0x013C
116#define REG_PKTBUF_DBG_CTRL 0x0140
117#define REG_PKTBUF_DBG_DATA_L 0x0144
118#define REG_PKTBUF_DBG_DATA_H 0x0148
119#define REG_RXPKTBUF_CTRL (REG_PKTBUF_DBG_CTRL+2)
120
121#define REG_TC0_CTRL 0x0150
122#define REG_TC1_CTRL 0x0154
123#define REG_TC2_CTRL 0x0158
124#define REG_TC3_CTRL 0x015C
125#define REG_TC4_CTRL 0x0160
126#define REG_TCUNIT_BASE 0x0164
127#define REG_MBIST_START 0x0174
128#define REG_MBIST_DONE 0x0178
129#define REG_MBIST_FAIL 0x017C
130#define REG_32K_CTRL 0x0194
131#define REG_C2HEVT_MSG_NORMAL 0x01A0
132#define REG_C2HEVT_CLEAR 0x01AF
133#define REG_C2HEVT_MSG_TEST 0x01B8
134#define REG_MCUTST_1 0x01c0
135#define REG_MCUTST_WOWLAN 0x01C7
136#define REG_FMETHR 0x01C8
137#define REG_HMETFR 0x01CC
138#define REG_HMEBOX_0 0x01D0
139#define REG_HMEBOX_1 0x01D4
140#define REG_HMEBOX_2 0x01D8
141#define REG_HMEBOX_3 0x01DC
142
143#define REG_LLT_INIT 0x01E0
144#define REG_BB_ACCEESS_CTRL 0x01E8
145#define REG_BB_ACCESS_DATA 0x01EC
146
147#define REG_HMEBOX_EXT_0 0x01F0
148#define REG_HMEBOX_EXT_1 0x01F4
149#define REG_HMEBOX_EXT_2 0x01F8
150#define REG_HMEBOX_EXT_3 0x01FC
151
152#define REG_RQPN 0x0200
153#define REG_FIFOPAGE 0x0204
154#define REG_TDECTRL 0x0208
155#define REG_TXDMA_OFFSET_CHK 0x020C
156#define REG_TXDMA_STATUS 0x0210
157#define REG_RQPN_NPQ 0x0214
158
159#define REG_RXDMA_AGG_PG_TH 0x0280
160 /* FW shall update this register before FW write RXPKT_RELEASE_POLL to 1 */
161#define REG_FW_UPD_RDPTR 0x0284
162 /* Control the RX DMA.*/
163#define REG_RXDMA_CONTROL 0x0286
164/* The number of packets in RXPKTBUF. */
165#define REG_RXPKT_NUM 0x0287
166
167#define REG_PCIE_CTRL_REG 0x0300
168#define REG_INT_MIG 0x0304
169#define REG_BCNQ_DESA 0x0308
170#define REG_HQ_DESA 0x0310
171#define REG_MGQ_DESA 0x0318
172#define REG_VOQ_DESA 0x0320
173#define REG_VIQ_DESA 0x0328
174#define REG_BEQ_DESA 0x0330
175#define REG_BKQ_DESA 0x0338
176#define REG_RX_DESA 0x0340
177
178#define REG_DBI_WDATA 0x0348
179#define REG_DBI_RDATA 0x034C
180#define REG_DBI_CTRL 0x0350
181#define REG_DBI_ADDR 0x0350
182#define REG_DBI_FLAG 0x0352
183#define REG_MDIO_WDATA 0x0354
184#define REG_MDIO_RDATA 0x0356
185#define REG_MDIO_CTL 0x0358
186#define REG_DBG_SEL 0x0360
187#define REG_PCIE_HRPWM 0x0361
188#define REG_PCIE_HCPWM 0x0363
189#define REG_UART_CTRL 0x0364
190#define REG_WATCH_DOG 0x0368
191#define REG_UART_TX_DESA 0x0370
192#define REG_UART_RX_DESA 0x0378
193
194#define REG_HDAQ_DESA_NODEF 0x0000
195#define REG_CMDQ_DESA_NODEF 0x0000
196
197#define REG_VOQ_INFORMATION 0x0400
198#define REG_VIQ_INFORMATION 0x0404
199#define REG_BEQ_INFORMATION 0x0408
200#define REG_BKQ_INFORMATION 0x040C
201#define REG_MGQ_INFORMATION 0x0410
202#define REG_HGQ_INFORMATION 0x0414
203#define REG_BCNQ_INFORMATION 0x0418
204#define REG_TXPKT_EMPTY 0x041A
205
206#define REG_CPU_MGQ_INFORMATION 0x041C
207#define REG_FWHW_TXQ_CTRL 0x0420
208#define REG_HWSEQ_CTRL 0x0423
209#define REG_TXPKTBUF_BCNQ_BDNY 0x0424
210#define REG_TXPKTBUF_MGQ_BDNY 0x0425
211#define REG_MULTI_BCNQ_EN 0x0426
212#define REG_MULTI_BCNQ_OFFSET 0x0427
213#define REG_SPEC_SIFS 0x0428
214#define REG_RL 0x042A
215#define REG_DARFRC 0x0430
216#define REG_RARFRC 0x0438
217#define REG_RRSR 0x0440
218#define REG_ARFR0 0x0444
219#define REG_ARFR1 0x044C
220#define REG_CCK_CHECK 0x0454
221#define REG_AMPDU_MAX_TIME 0x0456
222#define REG_AGGLEN_LMT 0x0458
223#define REG_AMPDU_MIN_SPACE 0x045C
224#define REG_TXPKTBUF_WMAC_LBK_BF_HD 0x045D
225#define REG_FAST_EDCA_CTRL 0x0460
226#define REG_RD_RESP_PKT_TH 0x0463
227#define REG_INIRTS_RATE_SEL 0x0480
228#define REG_INIDATA_RATE_SEL 0x0484
229#define REG_ARFR2 0x048C
230#define REG_ARFR3 0x0494
231#define REG_POWER_STATUS 0x04A4
232#define REG_POWER_STAGE1 0x04B4
233#define REG_POWER_STAGE2 0x04B8
234#define REG_PKT_LIFE_TIME 0x04C0
235#define REG_STBC_SETTING 0x04C4
236#define REG_HT_SINGLE_AMPDU 0x04C7
237#define REG_PROT_MODE_CTRL 0x04C8
238#define REG_MAX_AGGR_NUM 0x04CA
239#define REG_BAR_MODE_CTRL 0x04CC
240#define REG_RA_TRY_RATE_AGG_LMT 0x04CF
241#define REG_EARLY_MODE_CONTROL 0x04D0
242#define REG_NQOS_SEQ 0x04DC
243#define REG_QOS_SEQ 0x04DE
244#define REG_NEED_CPU_HANDLE 0x04E0
245#define REG_PKT_LOSE_RPT 0x04E1
246#define REG_PTCL_ERR_STATUS 0x04E2
247#define REG_TX_RPT_CTRL 0x04EC
248#define REG_TX_RPT_TIME 0x04F0
249#define REG_DUMMY 0x04FC
250
251#define REG_EDCA_VO_PARAM 0x0500
252#define REG_EDCA_VI_PARAM 0x0504
253#define REG_EDCA_BE_PARAM 0x0508
254#define REG_EDCA_BK_PARAM 0x050C
255#define REG_BCNTCFG 0x0510
256#define REG_PIFS 0x0512
257#define REG_RDG_PIFS 0x0513
258#define REG_SIFS_CTX 0x0514
259#define REG_SIFS_TRX 0x0516
260#define REG_AGGR_BREAK_TIME 0x051A
261#define REG_SLOT 0x051B
262#define REG_TX_PTCL_CTRL 0x0520
263#define REG_TXPAUSE 0x0522
264#define REG_DIS_TXREQ_CLR 0x0523
265#define REG_RD_CTRL 0x0524
266#define REG_TBTT_PROHIBIT 0x0540
267#define REG_RD_NAV_NXT 0x0544
268#define REG_NAV_PROT_LEN 0x0546
269#define REG_BCN_CTRL 0x0550
270#define REG_USTIME_TSF 0x0551
271#define REG_MBID_NUM 0x0552
272#define REG_DUAL_TSF_RST 0x0553
273#define REG_BCN_INTERVAL 0x0554
274#define REG_MBSSID_BCN_SPACE 0x0554
275#define REG_DRVERLYINT 0x0558
276#define REG_BCNDMATIM 0x0559
277#define REG_ATIMWND 0x055A
278#define REG_BCN_MAX_ERR 0x055D
279#define REG_RXTSF_OFFSET_CCK 0x055E
280#define REG_RXTSF_OFFSET_OFDM 0x055F
281#define REG_TSFTR 0x0560
282#define REG_INIT_TSFTR 0x0564
283#define REG_SECONDARY_CCA_CTRL 0x0577
284#define REG_PSTIMER 0x0580
285#define REG_TIMER0 0x0584
286#define REG_TIMER1 0x0588
287#define REG_ACMHWCTRL 0x05C0
288#define REG_ACMRSTCTRL 0x05C1
289#define REG_ACMAVG 0x05C2
290#define REG_VO_ADMTIME 0x05C4
291#define REG_VI_ADMTIME 0x05C6
292#define REG_BE_ADMTIME 0x05C8
293#define REG_EDCA_RANDOM_GEN 0x05CC
294#define REG_NOA_DESC_SEL 0x05CF
295#define REG_NOA_DESC_DURATION 0x05E0
296#define REG_NOA_DESC_INTERVAL 0x05E4
297#define REG_NOA_DESC_START 0x05E8
298#define REG_NOA_DESC_COUNT 0x05EC
299#define REG_SCH_TXCMD 0x05F8
300
301#define REG_APSD_CTRL 0x0600
302#define REG_BWOPMODE 0x0603
303#define REG_TCR 0x0604
304#define REG_RCR 0x0608
305#define REG_RX_PKT_LIMIT 0x060C
306#define REG_RX_DLK_TIME 0x060D
307#define REG_RX_DRVINFO_SZ 0x060F
308
309#define REG_MACID 0x0610
310#define REG_BSSID 0x0618
311#define REG_MAR 0x0620
312#define REG_MBIDCAMCFG 0x0628
313
314#define REG_USTIME_EDCA 0x0638
315#define REG_MAC_SPEC_SIFS 0x063A
316#define REG_RESP_SIFS_CCK 0x063C
317#define REG_RESP_SIFS_OFDM 0x063E
318#define REG_ACKTO 0x0640
319#define REG_CTS2TO 0x0641
320#define REG_EIFS 0x0642
321
322#define REG_NAV_CTRL 0x0650
323#define REG_NAV_UPPER 0x0652
324#define REG_BACAMCMD 0x0654
325#define REG_BACAMCONTENT 0x0658
326#define REG_LBDLY 0x0660
327#define REG_FWDLY 0x0661
328#define REG_RXERR_RPT 0x0664
329#define REG_TRXPTCL_CTL 0x0668
330
331#define REG_CAMCMD 0x0670
332#define REG_CAMWRITE 0x0674
333#define REG_CAMREAD 0x0678
334#define REG_CAMDBG 0x067C
335#define REG_SECCFG 0x0680
336
337#define REG_WOW_CTRL 0x0690
338#define REG_PSSTATUS 0x0691
339#define REG_PS_RX_INFO 0x0692
340#define REG_UAPSD_TID 0x0693
341#define REG_LPNAV_CTRL 0x0694
342#define REG_WKFMCAM_NUM 0x0698
343#define REG_WKFMCAM_RWD 0x069C
344#define REG_RXFLTMAP0 0x06A0
345#define REG_RXFLTMAP1 0x06A2
346#define REG_RXFLTMAP2 0x06A4
347#define REG_BCN_PSR_RPT 0x06A8
348#define REG_CALB32K_CTRL 0x06AC
349#define REG_PKT_MON_CTRL 0x06B4
350#define REG_BT_COEX_TABLE 0x06C0
351#define REG_WMAC_RESP_TXINFO 0x06D8
352
353#define REG_USB_INFO 0xFE17
354#define REG_USB_SPECIAL_OPTION 0xFE55
355#define REG_USB_DMA_AGG_TO 0xFE5B
356#define REG_USB_AGG_TO 0xFE5C
357#define REG_USB_AGG_TH 0xFE5D
358
359#define REG_TEST_USB_TXQS 0xFE48
360#define REG_TEST_SIE_VID 0xFE60
361#define REG_TEST_SIE_PID 0xFE62
362#define REG_TEST_SIE_OPTIONAL 0xFE64
363#define REG_TEST_SIE_CHIRP_K 0xFE65
364#define REG_TEST_SIE_PHY 0xFE66
365#define REG_TEST_SIE_MAC_ADDR 0xFE70
366#define REG_TEST_SIE_STRING 0xFE80
367
368#define REG_NORMAL_SIE_VID 0xFE60
369#define REG_NORMAL_SIE_PID 0xFE62
370#define REG_NORMAL_SIE_OPTIONAL 0xFE64
371#define REG_NORMAL_SIE_EP 0xFE65
372#define REG_NORMAL_SIE_PHY 0xFE68
373#define REG_NORMAL_SIE_MAC_ADDR 0xFE70
374#define REG_NORMAL_SIE_STRING 0xFE80
375
376#define CR9346 REG_9346CR
377#define MSR (REG_CR + 2)
378#define ISR REG_HISR
379#define TSFR REG_TSFTR
380
381#define MACIDR0 REG_MACID
382#define MACIDR4 (REG_MACID + 4)
383
384#define PBP REG_PBP
385
386#define IDR0 MACIDR0
387#define IDR4 MACIDR4
388
389#define UNUSED_REGISTER 0x1BF
390#define DCAM UNUSED_REGISTER
391#define PSR UNUSED_REGISTER
392#define BBADDR UNUSED_REGISTER
393#define PHYDATAR UNUSED_REGISTER
394
395#define INVALID_BBRF_VALUE 0x12345678
396
397#define MAX_MSS_DENSITY_2T 0x13
398#define MAX_MSS_DENSITY_1T 0x0A
399
400#define CMDEEPROM_EN BIT(5)
401#define CMDEEPROM_SEL BIT(4)
402#define CMD9346CR_9356SEL BIT(4)
403#define AUTOLOAD_EEPROM (CMDEEPROM_EN|CMDEEPROM_SEL)
404#define AUTOLOAD_EFUSE CMDEEPROM_EN
405
406#define GPIOSEL_GPIO 0
407#define GPIOSEL_ENBT BIT(5)
408
409#define GPIO_IN REG_GPIO_PIN_CTRL
410#define GPIO_OUT (REG_GPIO_PIN_CTRL+1)
411#define GPIO_IO_SEL (REG_GPIO_PIN_CTRL+2)
412#define GPIO_MOD (REG_GPIO_PIN_CTRL+3)
413
414/* 8723/8188E Host System Interrupt Mask Register (offset 0x58, 32 byte) */
415#define HSIMR_GPIO12_0_INT_EN BIT(0)
416#define HSIMR_SPS_OCP_INT_EN BIT(5)
417#define HSIMR_RON_INT_EN BIT(6)
418#define HSIMR_PDN_INT_EN BIT(7)
419#define HSIMR_GPIO9_INT_EN BIT(25)
420
421/* 8723/8188E Host System Interrupt Status Register (offset 0x5C, 32 byte) */
422#define HSISR_GPIO12_0_INT BIT(0)
423#define HSISR_SPS_OCP_INT BIT(5)
424#define HSISR_RON_INT_EN BIT(6)
425#define HSISR_PDNINT BIT(7)
426#define HSISR_GPIO9_INT BIT(25)
427
428#define MSR_NOLINK 0x00
429#define MSR_ADHOC 0x01
430#define MSR_INFRA 0x02
431#define MSR_AP 0x03
432
433#define RRSR_RSC_OFFSET 21
434#define RRSR_SHORT_OFFSET 23
435#define RRSR_RSC_BW_40M 0x600000
436#define RRSR_RSC_UPSUBCHNL 0x400000
437#define RRSR_RSC_LOWSUBCHNL 0x200000
438#define RRSR_SHORT 0x800000
439#define RRSR_1M BIT(0)
440#define RRSR_2M BIT(1)
441#define RRSR_5_5M BIT(2)
442#define RRSR_11M BIT(3)
443#define RRSR_6M BIT(4)
444#define RRSR_9M BIT(5)
445#define RRSR_12M BIT(6)
446#define RRSR_18M BIT(7)
447#define RRSR_24M BIT(8)
448#define RRSR_36M BIT(9)
449#define RRSR_48M BIT(10)
450#define RRSR_54M BIT(11)
451#define RRSR_MCS0 BIT(12)
452#define RRSR_MCS1 BIT(13)
453#define RRSR_MCS2 BIT(14)
454#define RRSR_MCS3 BIT(15)
455#define RRSR_MCS4 BIT(16)
456#define RRSR_MCS5 BIT(17)
457#define RRSR_MCS6 BIT(18)
458#define RRSR_MCS7 BIT(19)
459#define BRSR_ACKSHORTPMB BIT(23)
460
461#define RATR_1M 0x00000001
462#define RATR_2M 0x00000002
463#define RATR_55M 0x00000004
464#define RATR_11M 0x00000008
465#define RATR_6M 0x00000010
466#define RATR_9M 0x00000020
467#define RATR_12M 0x00000040
468#define RATR_18M 0x00000080
469#define RATR_24M 0x00000100
470#define RATR_36M 0x00000200
471#define RATR_48M 0x00000400
472#define RATR_54M 0x00000800
473#define RATR_MCS0 0x00001000
474#define RATR_MCS1 0x00002000
475#define RATR_MCS2 0x00004000
476#define RATR_MCS3 0x00008000
477#define RATR_MCS4 0x00010000
478#define RATR_MCS5 0x00020000
479#define RATR_MCS6 0x00040000
480#define RATR_MCS7 0x00080000
481#define RATR_MCS8 0x00100000
482#define RATR_MCS9 0x00200000
483#define RATR_MCS10 0x00400000
484#define RATR_MCS11 0x00800000
485#define RATR_MCS12 0x01000000
486#define RATR_MCS13 0x02000000
487#define RATR_MCS14 0x04000000
488#define RATR_MCS15 0x08000000
489
490#define RATE_1M BIT(0)
491#define RATE_2M BIT(1)
492#define RATE_5_5M BIT(2)
493#define RATE_11M BIT(3)
494#define RATE_6M BIT(4)
495#define RATE_9M BIT(5)
496#define RATE_12M BIT(6)
497#define RATE_18M BIT(7)
498#define RATE_24M BIT(8)
499#define RATE_36M BIT(9)
500#define RATE_48M BIT(10)
501#define RATE_54M BIT(11)
502#define RATE_MCS0 BIT(12)
503#define RATE_MCS1 BIT(13)
504#define RATE_MCS2 BIT(14)
505#define RATE_MCS3 BIT(15)
506#define RATE_MCS4 BIT(16)
507#define RATE_MCS5 BIT(17)
508#define RATE_MCS6 BIT(18)
509#define RATE_MCS7 BIT(19)
510#define RATE_MCS8 BIT(20)
511#define RATE_MCS9 BIT(21)
512#define RATE_MCS10 BIT(22)
513#define RATE_MCS11 BIT(23)
514#define RATE_MCS12 BIT(24)
515#define RATE_MCS13 BIT(25)
516#define RATE_MCS14 BIT(26)
517#define RATE_MCS15 BIT(27)
518
519#define RATE_ALL_CCK (RATR_1M | RATR_2M | RATR_55M | RATR_11M)
520#define RATE_ALL_OFDM_AG (RATR_6M | RATR_9M | RATR_12M | RATR_18M |\
521 RATR_24M | RATR_36M | RATR_48M | RATR_54M)
522#define RATE_ALL_OFDM_1SS (RATR_MCS0 | RATR_MCS1 | RATR_MCS2 |\
523 RATR_MCS3 | RATR_MCS4 | RATR_MCS5 |\
524 RATR_MCS6 | RATR_MCS7)
525#define RATE_ALL_OFDM_2SS (RATR_MCS8 | RATR_MCS9 | RATR_MCS10 |\
526 RATR_MCS11 | RATR_MCS12 | RATR_MCS13 |\
527 RATR_MCS14 | RATR_MCS15)
528
529#define BW_OPMODE_20MHZ BIT(2)
530#define BW_OPMODE_5G BIT(1)
531#define BW_OPMODE_11J BIT(0)
532
533#define CAM_VALID BIT(15)
534#define CAM_NOTVALID 0x0000
535#define CAM_USEDK BIT(5)
536
537#define CAM_NONE 0x0
538#define CAM_WEP40 0x01
539#define CAM_TKIP 0x02
540#define CAM_AES 0x04
541#define CAM_WEP104 0x05
542
543#define TOTAL_CAM_ENTRY 32
544#define HALF_CAM_ENTRY 16
545
546#define CAM_WRITE BIT(16)
547#define CAM_READ 0x00000000
548#define CAM_POLLINIG BIT(31)
549
550#define SCR_USEDK 0x01
551#define SCR_TXSEC_ENABLE 0x02
552#define SCR_RXSEC_ENABLE 0x04
553
554#define WOW_PMEN BIT(0)
555#define WOW_WOMEN BIT(1)
556#define WOW_MAGIC BIT(2)
557#define WOW_UWF BIT(3)
558
559/*********************************************
560* 8188 IMR/ISR bits
561**********************************************/
562#define IMR_DISABLED 0x0
563/* IMR DW0(0x0060-0063) Bit 0-31 */
564/* TXRPT interrupt when CCX bit of the packet is set */
565#define IMR_TXCCK BIT(30)
566/* Power Save Time Out Interrupt */
567#define IMR_PSTIMEOUT BIT(29)
568/* When GTIMER4 expires, this bit is set to 1 */
569#define IMR_GTINT4 BIT(28)
570/* When GTIMER3 expires, this bit is set to 1 */
571#define IMR_GTINT3 BIT(27)
572/* Transmit Beacon0 Error */
573#define IMR_TBDER BIT(26)
574/* Transmit Beacon0 OK */
575#define IMR_TBDOK BIT(25)
576/* TSF Timer BIT32 toggle indication interrupt */
577#define IMR_TSF_BIT32_TOGGLE BIT(24)
578/* Beacon DMA Interrupt 0 */
579#define IMR_BCNDMAINT0 BIT(20)
580/* Beacon Queue DMA OK0 */
581#define IMR_BCNDOK0 BIT(16)
582/* HSISR Indicator (HSIMR & HSISR is true, this bit is set to 1) */
583#define IMR_HSISR_IND_ON_INT BIT(15)
584/* Beacon DMA Interrupt Extension for Win7 */
585#define IMR_BCNDMAINT_E BIT(14)
586/* CTWidnow End or ATIM Window End */
587#define IMR_ATIMEND BIT(12)
588/* HISR1 Indicator (HISR1 & HIMR1 is true, this bit is set to 1)*/
589#define IMR_HISR1_IND_INT BIT(11)
590/* CPU to Host Command INT Status, Write 1 clear */
591#define IMR_C2HCMD BIT(10)
592/* CPU power Mode exchange INT Status, Write 1 clear */
593#define IMR_CPWM2 BIT(9)
594/* CPU power Mode exchange INT Status, Write 1 clear */
595#define IMR_CPWM BIT(8)
596/* High Queue DMA OK */
597#define IMR_HIGHDOK BIT(7)
598/* Management Queue DMA OK */
599#define IMR_MGNTDOK BIT(6)
600/* AC_BK DMA OK */
601#define IMR_BKDOK BIT(5)
602/* AC_BE DMA OK */
603#define IMR_BEDOK BIT(4)
604/* AC_VI DMA OK */
605#define IMR_VIDOK BIT(3)
606/* AC_VO DMA OK */
607#define IMR_VODOK BIT(2)
608/* Rx Descriptor Unavailable */
609#define IMR_RDU BIT(1)
610#define IMR_ROK BIT(0) /* Receive DMA OK */
611
612/* IMR DW1(0x00B4-00B7) Bit 0-31 */
613/* Beacon DMA Interrupt 7 */
614#define IMR_BCNDMAINT7 BIT(27)
615/* Beacon DMA Interrupt 6 */
616#define IMR_BCNDMAINT6 BIT(26)
617/* Beacon DMA Interrupt 5 */
618#define IMR_BCNDMAINT5 BIT(25)
619/* Beacon DMA Interrupt 4 */
620#define IMR_BCNDMAINT4 BIT(24)
621/* Beacon DMA Interrupt 3 */
622#define IMR_BCNDMAINT3 BIT(23)
623/* Beacon DMA Interrupt 2 */
624#define IMR_BCNDMAINT2 BIT(22)
625/* Beacon DMA Interrupt 1 */
626#define IMR_BCNDMAINT1 BIT(21)
627/* Beacon Queue DMA OK Interrup 7 */
628#define IMR_BCNDOK7 BIT(20)
629/* Beacon Queue DMA OK Interrup 6 */
630#define IMR_BCNDOK6 BIT(19)
631/* Beacon Queue DMA OK Interrup 5 */
632#define IMR_BCNDOK5 BIT(18)
633/* Beacon Queue DMA OK Interrup 4 */
634#define IMR_BCNDOK4 BIT(17)
635/* Beacon Queue DMA OK Interrup 3 */
636#define IMR_BCNDOK3 BIT(16)
637/* Beacon Queue DMA OK Interrup 2 */
638#define IMR_BCNDOK2 BIT(15)
639/* Beacon Queue DMA OK Interrup 1 */
640#define IMR_BCNDOK1 BIT(14)
641/* ATIM Window End Extension for Win7 */
642#define IMR_ATIMEND_E BIT(13)
643/* Tx Error Flag Interrupt Status, write 1 clear. */
644#define IMR_TXERR BIT(11)
645/* Rx Error Flag INT Status, Write 1 clear */
646#define IMR_RXERR BIT(10)
647/* Transmit FIFO Overflow */
648#define IMR_TXFOVW BIT(9)
649/* Receive FIFO Overflow */
650#define IMR_RXFOVW BIT(8)
651
652#define HWSET_MAX_SIZE 512
653#define EFUSE_MAX_SECTION 64
654#define EFUSE_REAL_CONTENT_LEN 256
655/* PG data exclude header, dummy 7 bytes frome CP test and reserved 1byte.*/
656#define EFUSE_OOB_PROTECT_BYTES 18
657
658#define EEPROM_DEFAULT_TSSI 0x0
659#define EEPROM_DEFAULT_TXPOWERDIFF 0x0
660#define EEPROM_DEFAULT_CRYSTALCAP 0x5
661#define EEPROM_DEFAULT_BOARDTYPE 0x02
662#define EEPROM_DEFAULT_TXPOWER 0x1010
663#define EEPROM_DEFAULT_HT2T_TXPWR 0x10
664
665#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
666#define EEPROM_DEFAULT_THERMALMETER 0x18
667#define EEPROM_DEFAULT_ANTTXPOWERDIFF 0x0
668#define EEPROM_DEFAULT_TXPWDIFF_CRYSTALCAP 0x5
669#define EEPROM_DEFAULT_TXPOWERLEVEL 0x22
670#define EEPROM_DEFAULT_HT40_2SDIFF 0x0
671#define EEPROM_DEFAULT_HT20_DIFF 2
672#define EEPROM_DEFAULT_LEGACYHTTXPOWERDIFF 0x3
673#define EEPROM_DEFAULT_HT40_PWRMAXOFFSET 0
674#define EEPROM_DEFAULT_HT20_PWRMAXOFFSET 0
675
676#define RF_OPTION1 0x79
677#define RF_OPTION2 0x7A
678#define RF_OPTION3 0x7B
679#define RF_OPTION4 0xC3
680
681#define EEPROM_DEFAULT_PID 0x1234
682#define EEPROM_DEFAULT_VID 0x5678
683#define EEPROM_DEFAULT_CUSTOMERID 0xAB
684#define EEPROM_DEFAULT_SUBCUSTOMERID 0xCD
685#define EEPROM_DEFAULT_VERSION 0
686
687#define EEPROM_CHANNEL_PLAN_FCC 0x0
688#define EEPROM_CHANNEL_PLAN_IC 0x1
689#define EEPROM_CHANNEL_PLAN_ETSI 0x2
690#define EEPROM_CHANNEL_PLAN_SPAIN 0x3
691#define EEPROM_CHANNEL_PLAN_FRANCE 0x4
692#define EEPROM_CHANNEL_PLAN_MKK 0x5
693#define EEPROM_CHANNEL_PLAN_MKK1 0x6
694#define EEPROM_CHANNEL_PLAN_ISRAEL 0x7
695#define EEPROM_CHANNEL_PLAN_TELEC 0x8
696#define EEPROM_CHANNEL_PLAN_GLOBAL_DOMAIN 0x9
697#define EEPROM_CHANNEL_PLAN_WORLD_WIDE_13 0xA
698#define EEPROM_CHANNEL_PLAN_NCC 0xB
699#define EEPROM_CHANNEL_PLAN_BY_HW_MASK 0x80
700
701#define EEPROM_CID_DEFAULT 0x0
702#define EEPROM_CID_TOSHIBA 0x4
703#define EEPROM_CID_CCX 0x10
704#define EEPROM_CID_QMI 0x0D
705#define EEPROM_CID_WHQL 0xFE
706
707#define RTL_EEPROM_ID 0x8129
708
709#define EEPROM_HPON 0x02
710#define EEPROM_CLK 0x06
711#define EEPROM_TESTR 0x08
712
713#define EEPROM_TXPOWERCCK 0x10
714#define EEPROM_TXPOWERHT40_1S 0x16
715#define EEPROM_TXPOWERHT20DIFF 0x1B
716#define EEPROM_TXPOWER_OFDMDIFF 0x1B
717
718#define EEPROM_TX_PWR_INX 0x10
719
720#define EEPROM_CHANNELPLAN 0xB8
721#define EEPROM_XTAL_8821AE 0xB9
722#define EEPROM_THERMAL_METER 0xBA
723#define EEPROM_IQK_LCK_88E 0xBB
724
725#define EEPROM_RF_BOARD_OPTION 0xC1
726#define EEPROM_RF_FEATURE_OPTION_88E 0xC2
727#define EEPROM_RF_BT_SETTING 0xC3
728#define EEPROM_VERSION 0xC4
729#define EEPROM_CUSTOMER_ID 0xC5
730#define EEPROM_RF_ANTENNA_OPT_88E 0xC9
731#define EEPROM_RFE_OPTION 0xCA
732
733#define EEPROM_MAC_ADDR 0xD0
734#define EEPROM_VID 0xD6
735#define EEPROM_DID 0xD8
736#define EEPROM_SVID 0xDA
737#define EEPROM_SMID 0xDC
738
739#define STOPBECON BIT(6)
740#define STOPHIGHT BIT(5)
741#define STOPMGT BIT(4)
742#define STOPVO BIT(3)
743#define STOPVI BIT(2)
744#define STOPBE BIT(1)
745#define STOPBK BIT(0)
746
747#define RCR_APPFCS BIT(31)
748#define RCR_APP_MIC BIT(30)
749#define RCR_APP_ICV BIT(29)
750#define RCR_APP_PHYST_RXFF BIT(28)
751#define RCR_APP_BA_SSN BIT(27)
752#define RCR_NONQOS_VHT BIT(26)
753#define RCR_ENMBID BIT(24)
754#define RCR_LSIGEN BIT(23)
755#define RCR_MFBEN BIT(22)
756#define RCR_HTC_LOC_CTRL BIT(14)
757#define RCR_AMF BIT(13)
758#define RCR_ACF BIT(12)
759#define RCR_ADF BIT(11)
760#define RCR_AICV BIT(9)
761#define RCR_ACRC32 BIT(8)
762#define RCR_CBSSID_BCN BIT(7)
763#define RCR_CBSSID_DATA BIT(6)
764#define RCR_CBSSID RCR_CBSSID_DATA
765#define RCR_APWRMGT BIT(5)
766#define RCR_ADD3 BIT(4)
767#define RCR_AB BIT(3)
768#define RCR_AM BIT(2)
769#define RCR_APM BIT(1)
770#define RCR_AAP BIT(0)
771#define RCR_MXDMA_OFFSET 8
772#define RCR_FIFO_OFFSET 13
773
774#define RSV_CTRL 0x001C
775#define RD_CTRL 0x0524
776
777#define REG_USB_INFO 0xFE17
778#define REG_USB_SPECIAL_OPTION 0xFE55
779#define REG_USB_DMA_AGG_TO 0xFE5B
780#define REG_USB_AGG_TO 0xFE5C
781#define REG_USB_AGG_TH 0xFE5D
782
783#define REG_USB_VID 0xFE60
784#define REG_USB_PID 0xFE62
785#define REG_USB_OPTIONAL 0xFE64
786#define REG_USB_CHIRP_K 0xFE65
787#define REG_USB_PHY 0xFE66
788#define REG_USB_MAC_ADDR 0xFE70
789#define REG_USB_HRPWM 0xFE58
790#define REG_USB_HCPWM 0xFE57
791
792#define SW18_FPWM BIT(3)
793
794#define ISO_MD2PP BIT(0)
795#define ISO_UA2USB BIT(1)
796#define ISO_UD2CORE BIT(2)
797#define ISO_PA2PCIE BIT(3)
798#define ISO_PD2CORE BIT(4)
799#define ISO_IP2MAC BIT(5)
800#define ISO_DIOP BIT(6)
801#define ISO_DIOE BIT(7)
802#define ISO_EB2CORE BIT(8)
803#define ISO_DIOR BIT(9)
804
805#define PWC_EV25V BIT(14)
806#define PWC_EV12V BIT(15)
807
808#define FEN_BBRSTB BIT(0)
809#define FEN_BB_GLB_RSTN BIT(1)
810#define FEN_USBA BIT(2)
811#define FEN_UPLL BIT(3)
812#define FEN_USBD BIT(4)
813#define FEN_DIO_PCIE BIT(5)
814#define FEN_PCIEA BIT(6)
815#define FEN_PPLL BIT(7)
816#define FEN_PCIED BIT(8)
817#define FEN_DIOE BIT(9)
818#define FEN_CPUEN BIT(10)
819#define FEN_DCORE BIT(11)
820#define FEN_ELDR BIT(12)
821#define FEN_DIO_RF BIT(13)
822#define FEN_HWPDN BIT(14)
823#define FEN_MREGEN BIT(15)
824
825#define PFM_LDALL BIT(0)
826#define PFM_ALDN BIT(1)
827#define PFM_LDKP BIT(2)
828#define PFM_WOWL BIT(3)
829#define ENPDN BIT(4)
830#define PDN_PL BIT(5)
831#define APFM_ONMAC BIT(8)
832#define APFM_OFF BIT(9)
833#define APFM_RSM BIT(10)
834#define AFSM_HSUS BIT(11)
835#define AFSM_PCIE BIT(12)
836#define APDM_MAC BIT(13)
837#define APDM_HOST BIT(14)
838#define APDM_HPDN BIT(15)
839#define RDY_MACON BIT(16)
840#define SUS_HOST BIT(17)
841#define ROP_ALD BIT(20)
842#define ROP_PWR BIT(21)
843#define ROP_SPS BIT(22)
844#define SOP_MRST BIT(25)
845#define SOP_FUSE BIT(26)
846#define SOP_ABG BIT(27)
847#define SOP_AMB BIT(28)
848#define SOP_RCK BIT(29)
849#define SOP_A8M BIT(30)
850#define XOP_BTCK BIT(31)
851
852#define ANAD16V_EN BIT(0)
853#define ANA8M BIT(1)
854#define MACSLP BIT(4)
855#define LOADER_CLK_EN BIT(5)
856#define _80M_SSC_DIS BIT(7)
857#define _80M_SSC_EN_HO BIT(8)
858#define PHY_SSC_RSTB BIT(9)
859#define SEC_CLK_EN BIT(10)
860#define MAC_CLK_EN BIT(11)
861#define SYS_CLK_EN BIT(12)
862#define RING_CLK_EN BIT(13)
863
864#define BOOT_FROM_EEPROM BIT(4)
865#define EEPROM_EN BIT(5)
866
867#define AFE_BGEN BIT(0)
868#define AFE_MBEN BIT(1)
869#define MAC_ID_EN BIT(7)
870
871#define WLOCK_ALL BIT(0)
872#define WLOCK_00 BIT(1)
873#define WLOCK_04 BIT(2)
874#define WLOCK_08 BIT(3)
875#define WLOCK_40 BIT(4)
876#define R_DIS_PRST_0 BIT(5)
877#define R_DIS_PRST_1 BIT(6)
878#define LOCK_ALL_EN BIT(7)
879
880#define RF_EN BIT(0)
881#define RF_RSTB BIT(1)
882#define RF_SDMRSTB BIT(2)
883
884#define LDA15_EN BIT(0)
885#define LDA15_STBY BIT(1)
886#define LDA15_OBUF BIT(2)
887#define LDA15_REG_VOS BIT(3)
888#define _LDA15_VOADJ(x) (((x) & 0x7) << 4)
889
890#define LDV12_EN BIT(0)
891#define LDV12_SDBY BIT(1)
892#define LPLDO_HSM BIT(2)
893#define LPLDO_LSM_DIS BIT(3)
894#define _LDV12_VADJ(x) (((x) & 0xF) << 4)
895
896#define XTAL_EN BIT(0)
897#define XTAL_BSEL BIT(1)
898#define _XTAL_BOSC(x) (((x) & 0x3) << 2)
899#define _XTAL_CADJ(x) (((x) & 0xF) << 4)
900#define XTAL_GATE_USB BIT(8)
901#define _XTAL_USB_DRV(x) (((x) & 0x3) << 9)
902#define XTAL_GATE_AFE BIT(11)
903#define _XTAL_AFE_DRV(x) (((x) & 0x3) << 12)
904#define XTAL_RF_GATE BIT(14)
905#define _XTAL_RF_DRV(x) (((x) & 0x3) << 15)
906#define XTAL_GATE_DIG BIT(17)
907#define _XTAL_DIG_DRV(x) (((x) & 0x3) << 18)
908#define XTAL_BT_GATE BIT(20)
909#define _XTAL_BT_DRV(x) (((x) & 0x3) << 21)
910#define _XTAL_GPIO(x) (((x) & 0x7) << 23)
911
912#define CKDLY_AFE BIT(26)
913#define CKDLY_USB BIT(27)
914#define CKDLY_DIG BIT(28)
915#define CKDLY_BT BIT(29)
916
917#define APLL_EN BIT(0)
918#define APLL_320_EN BIT(1)
919#define APLL_FREF_SEL BIT(2)
920#define APLL_EDGE_SEL BIT(3)
921#define APLL_WDOGB BIT(4)
922#define APLL_LPFEN BIT(5)
923
924#define APLL_REF_CLK_13MHZ 0x1
925#define APLL_REF_CLK_19_2MHZ 0x2
926#define APLL_REF_CLK_20MHZ 0x3
927#define APLL_REF_CLK_25MHZ 0x4
928#define APLL_REF_CLK_26MHZ 0x5
929#define APLL_REF_CLK_38_4MHZ 0x6
930#define APLL_REF_CLK_40MHZ 0x7
931
932#define APLL_320EN BIT(14)
933#define APLL_80EN BIT(15)
934#define APLL_1MEN BIT(24)
935
936#define ALD_EN BIT(18)
937#define EF_PD BIT(19)
938#define EF_FLAG BIT(31)
939
940#define EF_TRPT BIT(7)
941#define LDOE25_EN BIT(31)
942
943#define RSM_EN BIT(0)
944#define TIMER_EN BIT(4)
945
946#define TRSW0EN BIT(2)
947#define TRSW1EN BIT(3)
948#define EROM_EN BIT(4)
949#define ENBT BIT(5)
950#define ENUART BIT(8)
951#define UART_910 BIT(9)
952#define ENPMAC BIT(10)
953#define SIC_SWRST BIT(11)
954#define ENSIC BIT(12)
955#define SIC_23 BIT(13)
956#define ENHDP BIT(14)
957#define SIC_LBK BIT(15)
958
959#define LED0PL BIT(4)
960#define LED1PL BIT(12)
961#define LED0DIS BIT(7)
962
963#define MCUFWDL_EN BIT(0)
964#define MCUFWDL_RDY BIT(1)
965#define FWDL_CHKSUM_RPT BIT(2)
966#define MACINI_RDY BIT(3)
967#define BBINI_RDY BIT(4)
968#define RFINI_RDY BIT(5)
969#define WINTINI_RDY BIT(6)
970#define CPRST BIT(23)
971
972#define XCLK_VLD BIT(0)
973#define ACLK_VLD BIT(1)
974#define UCLK_VLD BIT(2)
975#define PCLK_VLD BIT(3)
976#define PCIRSTB BIT(4)
977#define V15_VLD BIT(5)
978#define TRP_B15V_EN BIT(7)
979#define SIC_IDLE BIT(8)
980#define BD_MAC2 BIT(9)
981#define BD_MAC1 BIT(10)
982#define IC_MACPHY_MODE BIT(11)
983#define VENDOR_ID BIT(19)
984#define PAD_HWPD_IDN BIT(22)
985#define TRP_VAUX_EN BIT(23)
986#define TRP_BT_EN BIT(24)
987#define BD_PKG_SEL BIT(25)
988#define BD_HCI_SEL BIT(26)
989#define TYPE_ID BIT(27)
990
991#define CHIP_VER_RTL_MASK 0xF000
992#define CHIP_VER_RTL_SHIFT 12
993
994#define REG_LBMODE (REG_CR + 3)
995
996#define HCI_TXDMA_EN BIT(0)
997#define HCI_RXDMA_EN BIT(1)
998#define TXDMA_EN BIT(2)
999#define RXDMA_EN BIT(3)
1000#define PROTOCOL_EN BIT(4)
1001#define SCHEDULE_EN BIT(5)
1002#define MACTXEN BIT(6)
1003#define MACRXEN BIT(7)
1004#define ENSWBCN BIT(8)
1005#define ENSEC BIT(9)
1006
1007#define _NETTYPE(x) (((x) & 0x3) << 16)
1008#define MASK_NETTYPE 0x30000
1009#define NT_NO_LINK 0x0
1010#define NT_LINK_AD_HOC 0x1
1011#define NT_LINK_AP 0x2
1012#define NT_AS_AP 0x3
1013
1014#define _LBMODE(x) (((x) & 0xF) << 24)
1015#define MASK_LBMODE 0xF000000
1016#define LOOPBACK_NORMAL 0x0
1017#define LOOPBACK_IMMEDIATELY 0xB
1018#define LOOPBACK_MAC_DELAY 0x3
1019#define LOOPBACK_PHY 0x1
1020#define LOOPBACK_DMA 0x7
1021
1022#define GET_RX_PAGE_SIZE(value) ((value) & 0xF)
1023#define GET_TX_PAGE_SIZE(value) (((value) & 0xF0) >> 4)
1024#define _PSRX_MASK 0xF
1025#define _PSTX_MASK 0xF0
1026#define _PSRX(x) (x)
1027#define _PSTX(x) ((x) << 4)
1028
1029#define PBP_64 0x0
1030#define PBP_128 0x1
1031#define PBP_256 0x2
1032#define PBP_512 0x3
1033#define PBP_1024 0x4
1034
1035#define RXDMA_ARBBW_EN BIT(0)
1036#define RXSHFT_EN BIT(1)
1037#define RXDMA_AGG_EN BIT(2)
1038#define QS_VO_QUEUE BIT(8)
1039#define QS_VI_QUEUE BIT(9)
1040#define QS_BE_QUEUE BIT(10)
1041#define QS_BK_QUEUE BIT(11)
1042#define QS_MANAGER_QUEUE BIT(12)
1043#define QS_HIGH_QUEUE BIT(13)
1044
1045#define HQSEL_VOQ BIT(0)
1046#define HQSEL_VIQ BIT(1)
1047#define HQSEL_BEQ BIT(2)
1048#define HQSEL_BKQ BIT(3)
1049#define HQSEL_MGTQ BIT(4)
1050#define HQSEL_HIQ BIT(5)
1051
1052#define _TXDMA_HIQ_MAP(x) (((x)&0x3) << 14)
1053#define _TXDMA_MGQ_MAP(x) (((x)&0x3) << 12)
1054#define _TXDMA_BKQ_MAP(x) (((x)&0x3) << 10)
1055#define _TXDMA_BEQ_MAP(x) (((x)&0x3) << 8)
1056#define _TXDMA_VIQ_MAP(x) (((x)&0x3) << 6)
1057#define _TXDMA_VOQ_MAP(x) (((x)&0x3) << 4)
1058
1059#define QUEUE_LOW 1
1060#define QUEUE_NORMAL 2
1061#define QUEUE_HIGH 3
1062
1063#define _LLT_NO_ACTIVE 0x0
1064#define _LLT_WRITE_ACCESS 0x1
1065#define _LLT_READ_ACCESS 0x2
1066
1067#define _LLT_INIT_DATA(x) ((x) & 0xFF)
1068#define _LLT_INIT_ADDR(x) (((x) & 0xFF) << 8)
1069#define _LLT_OP(x) (((x) & 0x3) << 30)
1070#define _LLT_OP_VALUE(x) (((x) >> 30) & 0x3)
1071
1072#define BB_WRITE_READ_MASK (BIT(31) | BIT(30))
1073#define BB_WRITE_EN BIT(30)
1074#define BB_READ_EN BIT(31)
1075
1076#define _HPQ(x) ((x) & 0xFF)
1077#define _LPQ(x) (((x) & 0xFF) << 8)
1078#define _PUBQ(x) (((x) & 0xFF) << 16)
1079#define _NPQ(x) ((x) & 0xFF)
1080
1081#define HPQ_PUBLIC_DIS BIT(24)
1082#define LPQ_PUBLIC_DIS BIT(25)
1083#define LD_RQPN BIT(31)
1084
1085#define BCN_VALID BIT(16)
1086#define BCN_HEAD(x) (((x) & 0xFF) << 8)
1087#define BCN_HEAD_MASK 0xFF00
1088
1089#define BLK_DESC_NUM_SHIFT 4
1090#define BLK_DESC_NUM_MASK 0xF
1091
1092#define DROP_DATA_EN BIT(9)
1093
1094#define EN_AMPDU_RTY_NEW BIT(7)
1095
1096#define _INIRTSMCS_SEL(x) ((x) & 0x3F)
1097
1098#define _SPEC_SIFS_CCK(x) ((x) & 0xFF)
1099#define _SPEC_SIFS_OFDM(x) (((x) & 0xFF) << 8)
1100
1101#define RATE_REG_BITMAP_ALL 0xFFFFF
1102
1103#define _RRSC_BITMAP(x) ((x) & 0xFFFFF)
1104
1105#define _RRSR_RSC(x) (((x) & 0x3) << 21)
1106#define RRSR_RSC_RESERVED 0x0
1107#define RRSR_RSC_UPPER_SUBCHANNEL 0x1
1108#define RRSR_RSC_LOWER_SUBCHANNEL 0x2
1109#define RRSR_RSC_DUPLICATE_MODE 0x3
1110
1111#define USE_SHORT_G1 BIT(20)
1112
1113#define _AGGLMT_MCS0(x) ((x) & 0xF)
1114#define _AGGLMT_MCS1(x) (((x) & 0xF) << 4)
1115#define _AGGLMT_MCS2(x) (((x) & 0xF) << 8)
1116#define _AGGLMT_MCS3(x) (((x) & 0xF) << 12)
1117#define _AGGLMT_MCS4(x) (((x) & 0xF) << 16)
1118#define _AGGLMT_MCS5(x) (((x) & 0xF) << 20)
1119#define _AGGLMT_MCS6(x) (((x) & 0xF) << 24)
1120#define _AGGLMT_MCS7(x) (((x) & 0xF) << 28)
1121
1122#define RETRY_LIMIT_SHORT_SHIFT 8
1123#define RETRY_LIMIT_LONG_SHIFT 0
1124
1125#define _DARF_RC1(x) ((x) & 0x1F)
1126#define _DARF_RC2(x) (((x) & 0x1F) << 8)
1127#define _DARF_RC3(x) (((x) & 0x1F) << 16)
1128#define _DARF_RC4(x) (((x) & 0x1F) << 24)
1129#define _DARF_RC5(x) ((x) & 0x1F)
1130#define _DARF_RC6(x) (((x) & 0x1F) << 8)
1131#define _DARF_RC7(x) (((x) & 0x1F) << 16)
1132#define _DARF_RC8(x) (((x) & 0x1F) << 24)
1133
1134#define _RARF_RC1(x) ((x) & 0x1F)
1135#define _RARF_RC2(x) (((x) & 0x1F) << 8)
1136#define _RARF_RC3(x) (((x) & 0x1F) << 16)
1137#define _RARF_RC4(x) (((x) & 0x1F) << 24)
1138#define _RARF_RC5(x) ((x) & 0x1F)
1139#define _RARF_RC6(x) (((x) & 0x1F) << 8)
1140#define _RARF_RC7(x) (((x) & 0x1F) << 16)
1141#define _RARF_RC8(x) (((x) & 0x1F) << 24)
1142
1143#define AC_PARAM_TXOP_LIMIT_OFFSET 16
1144#define AC_PARAM_ECW_MAX_OFFSET 12
1145#define AC_PARAM_ECW_MIN_OFFSET 8
1146#define AC_PARAM_AIFS_OFFSET 0
1147
1148#define _AIFS(x) (x)
1149#define _ECW_MAX_MIN(x) ((x) << 8)
1150#define _TXOP_LIMIT(x) ((x) << 16)
1151
1152#define _BCNIFS(x) ((x) & 0xFF)
1153#define _BCNECW(x) ((((x) & 0xF)) << 8)
1154
1155#define _LRL(x) ((x) & 0x3F)
1156#define _SRL(x) (((x) & 0x3F) << 8)
1157
1158#define _SIFS_CCK_CTX(x) ((x) & 0xFF)
1159#define _SIFS_CCK_TRX(x) (((x) & 0xFF) << 8)
1160
1161#define _SIFS_OFDM_CTX(x) ((x) & 0xFF)
1162#define _SIFS_OFDM_TRX(x) (((x) & 0xFF) << 8)
1163
1164#define _TBTT_PROHIBIT_HOLD(x) (((x) & 0xFF) << 8)
1165
1166#define DIS_EDCA_CNT_DWN BIT(11)
1167
1168#define EN_MBSSID BIT(1)
1169#define EN_TXBCN_RPT BIT(2)
1170#define EN_BCN_FUNCTION BIT(3)
1171
1172#define TSFTR_RST BIT(0)
1173#define TSFTR1_RST BIT(1)
1174
1175#define STOP_BCNQ BIT(6)
1176
1177#define DIS_TSF_UDT0_NORMAL_CHIP BIT(4)
1178#define DIS_TSF_UDT0_TEST_CHIP BIT(5)
1179
1180#define ACMHW_HWEN BIT(0)
1181#define ACMHW_BEQEN BIT(1)
1182#define ACMHW_VIQEN BIT(2)
1183#define ACMHW_VOQEN BIT(3)
1184#define ACMHW_BEQSTATUS BIT(4)
1185#define ACMHW_VIQSTATUS BIT(5)
1186#define ACMHW_VOQSTATUS BIT(6)
1187
1188#define APSDOFF BIT(6)
1189#define APSDOFF_STATUS BIT(7)
1190
1191#define BW_20MHZ BIT(2)
1192
1193#define RATE_BITMAP_ALL 0xFFFFF
1194
1195#define RATE_RRSR_CCK_ONLY_1M 0xFFFF1
1196
1197#define TSFRST BIT(0)
1198#define DIS_GCLK BIT(1)
1199#define PAD_SEL BIT(2)
1200#define PWR_ST BIT(6)
1201#define PWRBIT_OW_EN BIT(7)
1202#define ACRC BIT(8)
1203#define CFENDFORM BIT(9)
1204#define ICV BIT(10)
1205
1206#define AAP BIT(0)
1207#define APM BIT(1)
1208#define AM BIT(2)
1209#define AB BIT(3)
1210#define ADD3 BIT(4)
1211#define APWRMGT BIT(5)
1212#define CBSSID BIT(6)
1213#define CBSSID_DATA BIT(6)
1214#define CBSSID_BCN BIT(7)
1215#define ACRC32 BIT(8)
1216#define AICV BIT(9)
1217#define ADF BIT(11)
1218#define ACF BIT(12)
1219#define AMF BIT(13)
1220#define HTC_LOC_CTRL BIT(14)
1221#define UC_DATA_EN BIT(16)
1222#define BM_DATA_EN BIT(17)
1223#define MFBEN BIT(22)
1224#define LSIGEN BIT(23)
1225#define ENMBID BIT(24)
1226#define APP_BASSN BIT(27)
1227#define APP_PHYSTS BIT(28)
1228#define APP_ICV BIT(29)
1229#define APP_MIC BIT(30)
1230#define APP_FCS BIT(31)
1231
1232#define _MIN_SPACE(x) ((x) & 0x7)
1233#define _SHORT_GI_PADDING(x) (((x) & 0x1F) << 3)
1234
1235#define RXERR_TYPE_OFDM_PPDU 0
1236#define RXERR_TYPE_OFDM_FALSE_ALARM 1
1237#define RXERR_TYPE_OFDM_MPDU_OK 2
1238#define RXERR_TYPE_OFDM_MPDU_FAIL 3
1239#define RXERR_TYPE_CCK_PPDU 4
1240#define RXERR_TYPE_CCK_FALSE_ALARM 5
1241#define RXERR_TYPE_CCK_MPDU_OK 6
1242#define RXERR_TYPE_CCK_MPDU_FAIL 7
1243#define RXERR_TYPE_HT_PPDU 8
1244#define RXERR_TYPE_HT_FALSE_ALARM 9
1245#define RXERR_TYPE_HT_MPDU_TOTAL 10
1246#define RXERR_TYPE_HT_MPDU_OK 11
1247#define RXERR_TYPE_HT_MPDU_FAIL 12
1248#define RXERR_TYPE_RX_FULL_DROP 15
1249
1250#define RXERR_COUNTER_MASK 0xFFFFF
1251#define RXERR_RPT_RST BIT(27)
1252#define _RXERR_RPT_SEL(type) ((type) << 28)
1253
1254#define SCR_TXUSEDK BIT(0)
1255#define SCR_RXUSEDK BIT(1)
1256#define SCR_TXENCENABLE BIT(2)
1257#define SCR_RXDECENABLE BIT(3)
1258#define SCR_SKBYA2 BIT(4)
1259#define SCR_NOSKMC BIT(5)
1260#define SCR_TXBCUSEDK BIT(6)
1261#define SCR_RXBCUSEDK BIT(7)
1262
1263#define XCLK_VLD BIT(0)
1264#define ACLK_VLD BIT(1)
1265#define UCLK_VLD BIT(2)
1266#define PCLK_VLD BIT(3)
1267#define PCIRSTB BIT(4)
1268#define V15_VLD BIT(5)
1269#define TRP_B15V_EN BIT(7)
1270#define SIC_IDLE BIT(8)
1271#define BD_MAC2 BIT(9)
1272#define BD_MAC1 BIT(10)
1273#define IC_MACPHY_MODE BIT(11)
1274#define BT_FUNC BIT(16)
1275#define VENDOR_ID BIT(19)
1276#define PAD_HWPD_IDN BIT(22)
1277#define TRP_VAUX_EN BIT(23)
1278#define TRP_BT_EN BIT(24)
1279#define BD_PKG_SEL BIT(25)
1280#define BD_HCI_SEL BIT(26)
1281#define TYPE_ID BIT(27)
1282
1283#define USB_IS_HIGH_SPEED 0
1284#define USB_IS_FULL_SPEED 1
1285#define USB_SPEED_MASK BIT(5)
1286
1287#define USB_NORMAL_SIE_EP_MASK 0xF
1288#define USB_NORMAL_SIE_EP_SHIFT 4
1289
1290#define USB_TEST_EP_MASK 0x30
1291#define USB_TEST_EP_SHIFT 4
1292
1293#define USB_AGG_EN BIT(3)
1294
1295#define MAC_ADDR_LEN 6
1296#define LAST_ENTRY_OF_TX_PKT_BUFFER 255
1297
1298#define POLLING_LLT_THRESHOLD 20
1299#define POLLING_READY_TIMEOUT_COUNT 3000
1300
1301#define MAX_MSS_DENSITY_2T 0x13
1302#define MAX_MSS_DENSITY_1T 0x0A
1303
1304#define EPROM_CMD_OPERATING_MODE_MASK ((1<<7)|(1<<6))
1305#define EPROM_CMD_CONFIG 0x3
1306#define EPROM_CMD_LOAD 1
1307
1308#define HWSET_MAX_SIZE_92S HWSET_MAX_SIZE
1309
1310#define HAL_8192C_HW_GPIO_WPS_BIT BIT(2)
1311
1312#define RA_LSSIWRITE_8821A 0xc90
1313#define RB_LSSIWRITE_8821A 0xe90
1314
1315#define RA_PIREAD_8821A 0xd04
1316#define RB_PIREAD_8821A 0xd44
1317#define RA_SIREAD_8821A 0xd08
1318#define RB_SIREAD_8821A 0xd48
1319
1320#define RPMAC_RESET 0x100
1321#define RPMAC_TXSTART 0x104
1322#define RPMAC_TXLEGACYSIG 0x108
1323#define RPMAC_TXHTSIG1 0x10c
1324#define RPMAC_TXHTSIG2 0x110
1325#define RPMAC_PHYDEBUG 0x114
1326#define RPMAC_TXPACKETNUM 0x118
1327#define RPMAC_TXIDLE 0x11c
1328#define RPMAC_TXMACHEADER0 0x120
1329#define RPMAC_TXMACHEADER1 0x124
1330#define RPMAC_TXMACHEADER2 0x128
1331#define RPMAC_TXMACHEADER3 0x12c
1332#define RPMAC_TXMACHEADER4 0x130
1333#define RPMAC_TXMACHEADER5 0x134
1334#define RPMAC_TXDADATYPE 0x138
1335#define RPMAC_TXRANDOMSEED 0x13c
1336#define RPMAC_CCKPLCPPREAMBLE 0x140
1337#define RPMAC_CCKPLCPHEADER 0x144
1338#define RPMAC_CCKCRC16 0x148
1339#define RPMAC_OFDMRXCRC32OK 0x170
1340#define RPMAC_OFDMRXCRC32ER 0x174
1341#define RPMAC_OFDMRXPARITYER 0x178
1342#define RPMAC_OFDMRXCRC8ER 0x17c
1343#define RPMAC_CCKCRXRC16ER 0x180
1344#define RPMAC_CCKCRXRC32ER 0x184
1345#define RPMAC_CCKCRXRC32OK 0x188
1346#define RPMAC_TXSTATUS 0x18c
1347
1348#define RFPGA0_RFMOD 0x800
1349
1350#define RFPGA0_TXINFO 0x804
1351#define RFPGA0_PSDFUNCTION 0x808
1352
1353#define RFPGA0_TXGAINSTAGE 0x80c
1354
1355#define RFPGA0_RFTIMING1 0x810
1356#define RFPGA0_RFTIMING2 0x814
1357
1358#define RFPGA0_XA_HSSIPARAMETER1 0x820
1359#define RFPGA0_XA_HSSIPARAMETER2 0x824
1360#define RFPGA0_XB_HSSIPARAMETER1 0x828
1361#define RFPGA0_XB_HSSIPARAMETER2 0x82c
1362#define RCCAONSEC 0x838
1363
1364#define RFPGA0_XA_LSSIPARAMETER 0x840
1365#define RFPGA0_XB_LSSIPARAMETER 0x844
1366#define RL1PEAKTH 0x848
1367
1368#define RFPGA0_RFWAKEUPPARAMETER 0x850
1369#define RFPGA0_RFSLEEPUPPARAMETER 0x854
1370
1371#define RFPGA0_XAB_SWITCHCONTROL 0x858
1372#define RFPGA0_XCD_SWITCHCONTROL 0x85c
1373
1374#define RFPGA0_XA_RFINTERFACEOE 0x860
1375#define RFC_AREA 0x860
1376#define RFPGA0_XB_RFINTERFACEOE 0x864
1377
1378#define RFPGA0_XAB_RFINTERFACESW 0x870
1379#define RFPGA0_XCD_RFINTERFACESW 0x874
1380
1381#define RFPGA0_XAB_RFPARAMETER 0x878
1382#define RFPGA0_XCD_RFPARAMETER 0x87c
1383
1384#define RFPGA0_ANALOGPARAMETER1 0x880
1385#define RFPGA0_ANALOGPARAMETER2 0x884
1386#define RFPGA0_ANALOGPARAMETER3 0x888
1387#define RFPGA0_ANALOGPARAMETER4 0x88c
1388
1389#define RFPGA0_XA_LSSIREADBACK 0x8a0
1390#define RFPGA0_XB_LSSIREADBACK 0x8a4
1391#define RFPGA0_XC_LSSIREADBACK 0x8a8
1392#define RRFMOD 0x8ac
1393#define RHSSIREAD_8821AE 0x8b0
1394
1395#define RFPGA0_PSDREPORT 0x8b4
1396#define TRANSCEIVEA_HSPI_READBACK 0x8b8
1397#define TRANSCEIVEB_HSPI_READBACK 0x8bc
1398#define RADC_BUF_CLK 0x8c4
1399#define RFPGA0_XAB_RFINTERFACERB 0x8e0
1400#define RFPGA0_XCD_RFINTERFACERB 0x8e4
1401
1402#define RFPGA1_RFMOD 0x900
1403
1404#define RFPGA1_TXBLOCK 0x904
1405#define RFPGA1_DEBUGSELECT 0x908
1406#define RFPGA1_TXINFO 0x90c
1407
1408#define RCCK_SYSTEM 0xa00
1409#define BCCK_SYSTEM 0x10
1410
1411#define RCCK0_AFESETTING 0xa04
1412#define RCCK0_CCA 0xa08
1413
1414#define RCCK0_RXAGC1 0xa0c
1415#define RCCK0_RXAGC2 0xa10
1416
1417#define RCCK0_RXHP 0xa14
1418
1419#define RCCK0_DSPPARAMETER1 0xa18
1420#define RCCK0_DSPPARAMETER2 0xa1c
1421
1422#define RCCK0_TXFILTER1 0xa20
1423#define RCCK0_TXFILTER2 0xa24
1424#define RCCK0_DEBUGPORT 0xa28
1425#define RCCK0_FALSEALARMREPORT 0xa2c
1426#define RCCK0_TRSSIREPORT 0xa50
1427#define RCCK0_RXREPORT 0xa54
1428#define RCCK0_FACOUNTERLOWER 0xa5c
1429#define RCCK0_FACOUNTERUPPER 0xa58
1430#define RCCK0_CCA_CNT 0xa60
1431
1432/* PageB(0xB00) */
1433#define RPDP_ANTA 0xb00
1434#define RPDP_ANTA_4 0xb04
1435#define RPDP_ANTA_8 0xb08
1436#define RPDP_ANTA_C 0xb0c
1437#define RPDP_ANTA_10 0xb10
1438#define RPDP_ANTA_14 0xb14
1439#define RPDP_ANTA_18 0xb18
1440#define RPDP_ANTA_1C 0xb1c
1441#define RPDP_ANTA_20 0xb20
1442#define RPDP_ANTA_24 0xb24
1443
1444#define RCONFIG_PMPD_ANTA 0xb28
1445#define RCONFIG_RAM64x16 0xb2c
1446
1447#define RBNDA 0xb30
1448#define RHSSIPAR 0xb34
1449
1450#define RCONFIG_ANTA 0xb68
1451#define RCONFIG_ANTB 0xb6c
1452
1453#define RPDP_ANTB 0xb70
1454#define RPDP_ANTB_4 0xb74
1455#define RPDP_ANTB_8 0xb78
1456#define RPDP_ANTB_C 0xb7c
1457#define RPDP_ANTB_10 0xb80
1458#define RPDP_ANTB_14 0xb84
1459#define RPDP_ANTB_18 0xb88
1460#define RPDP_ANTB_1C 0xb8c
1461#define RPDP_ANTB_20 0xb90
1462#define RPDP_ANTB_24 0xb94
1463
1464#define RCONFIG_PMPD_ANTB 0xb98
1465
1466#define RBNDB 0xba0
1467
1468#define RAPK 0xbd8
1469#define RPM_RX0_ANTA 0xbdc
1470#define RPM_RX1_ANTA 0xbe0
1471#define RPM_RX2_ANTA 0xbe4
1472#define RPM_RX3_ANTA 0xbe8
1473#define RPM_RX0_ANTB 0xbec
1474#define RPM_RX1_ANTB 0xbf0
1475#define RPM_RX2_ANTB 0xbf4
1476#define RPM_RX3_ANTB 0xbf8
1477
1478/*RSSI Dump*/
1479#define RA_RSSI_DUMP 0xBF0
1480#define RB_RSSI_DUMP 0xBF1
1481#define RS1_RX_EVM_DUMP 0xBF4
1482#define RS2_RX_EVM_DUMP 0xBF5
1483#define RA_RX_SNR_DUMP 0xBF6
1484#define RB_RX_SNR_DUMP 0xBF7
1485#define RA_CFO_SHORT_DUMP 0xBF8
1486#define RB_CFO_SHORT_DUMP 0xBFA
1487#define RA_CFO_LONG_DUMP 0xBEC
1488#define RB_CFO_LONG_DUMP 0xBEE
1489
1490/*Page C*/
1491#define ROFDM0_LSTF 0xc00
1492
1493#define ROFDM0_TRXPATHENABLE 0xc04
1494#define ROFDM0_TRMUXPAR 0xc08
1495#define ROFDM0_TRSWISOLATION 0xc0c
1496
1497#define ROFDM0_XARXAFE 0xc10
1498#define ROFDM0_XARXIQIMBALANCE 0xc14
1499#define ROFDM0_XBRXAFE 0xc18
1500#define ROFDM0_XBRXIQIMBALANCE 0xc1c
1501#define ROFDM0_XCRXAFE 0xc20
1502#define ROFDM0_XCRXIQIMBANLANCE 0xc24
1503#define ROFDM0_XDRXAFE 0xc28
1504#define ROFDM0_XDRXIQIMBALANCE 0xc2c
1505
1506#define ROFDM0_RXDETECTOR1 0xc30
1507#define ROFDM0_RXDETECTOR2 0xc34
1508#define ROFDM0_RXDETECTOR3 0xc38
1509#define ROFDM0_RXDETECTOR4 0xc3c
1510
1511#define ROFDM0_RXDSP 0xc40
1512#define ROFDM0_CFOANDDAGC 0xc44
1513#define ROFDM0_CCADROPTHRESHOLD 0xc48
1514#define ROFDM0_ECCATHRESHOLD 0xc4c
1515
1516#define ROFDM0_XAAGCCORE1 0xc50
1517#define ROFDM0_XAAGCCORE2 0xc54
1518#define ROFDM0_XBAGCCORE1 0xc58
1519#define ROFDM0_XBAGCCORE2 0xc5c
1520#define ROFDM0_XCAGCCORE1 0xc60
1521#define ROFDM0_XCAGCCORE2 0xc64
1522#define ROFDM0_XDAGCCORE1 0xc68
1523#define ROFDM0_XDAGCCORE2 0xc6c
1524
1525#define ROFDM0_AGCPARAMETER1 0xc70
1526#define ROFDM0_AGCPARAMETER2 0xc74
1527#define ROFDM0_AGCRSSITABLE 0xc78
1528#define ROFDM0_HTSTFAGC 0xc7c
1529
1530#define ROFDM0_XATXIQIMBALANCE 0xc80
1531#define ROFDM0_XATXAFE 0xc84
1532#define ROFDM0_XBTXIQIMBALANCE 0xc88
1533#define ROFDM0_XBTXAFE 0xc8c
1534#define ROFDM0_XCTXIQIMBALANCE 0xc90
1535#define ROFDM0_XCTXAFE 0xc94
1536#define ROFDM0_XDTXIQIMBALANCE 0xc98
1537#define ROFDM0_XDTXAFE 0xc9c
1538
1539#define ROFDM0_RXIQEXTANTA 0xca0
1540#define ROFDM0_TXCOEFF1 0xca4
1541#define ROFDM0_TXCOEFF2 0xca8
1542#define ROFDM0_TXCOEFF3 0xcac
1543#define ROFDM0_TXCOEFF4 0xcb0
1544#define ROFDM0_TXCOEFF5 0xcb4
1545#define ROFDM0_TXCOEFF6 0xcb8
1546
1547/*Path_A RFE cotrol */
1548#define RA_RFE_CTRL_8812 0xcb8
1549/*Path_B RFE control*/
1550#define RB_RFE_CTRL_8812 0xeb8
1551
1552#define ROFDM0_RXHPPARAMETER 0xce0
1553#define ROFDM0_TXPSEUDONOISEWGT 0xce4
1554#define ROFDM0_FRAMESYNC 0xcf0
1555#define ROFDM0_DFSREPORT 0xcf4
1556
1557#define ROFDM1_LSTF 0xd00
1558#define ROFDM1_TRXPATHENABLE 0xd04
1559
1560#define ROFDM1_CF0 0xd08
1561#define ROFDM1_CSI1 0xd10
1562#define ROFDM1_SBD 0xd14
1563#define ROFDM1_CSI2 0xd18
1564#define ROFDM1_CFOTRACKING 0xd2c
1565#define ROFDM1_TRXMESAURE1 0xd34
1566#define ROFDM1_INTFDET 0xd3c
1567#define ROFDM1_PSEUDONOISESTATEAB 0xd50
1568#define ROFDM1_PSEUDONOISESTATECD 0xd54
1569#define ROFDM1_RXPSEUDONOISEWGT 0xd58
1570
1571#define ROFDM_PHYCOUNTER1 0xda0
1572#define ROFDM_PHYCOUNTER2 0xda4
1573#define ROFDM_PHYCOUNTER3 0xda8
1574
1575#define ROFDM_SHORTCFOAB 0xdac
1576#define ROFDM_SHORTCFOCD 0xdb0
1577#define ROFDM_LONGCFOAB 0xdb4
1578#define ROFDM_LONGCFOCD 0xdb8
1579#define ROFDM_TAILCF0AB 0xdbc
1580#define ROFDM_TAILCF0CD 0xdc0
1581#define ROFDM_PWMEASURE1 0xdc4
1582#define ROFDM_PWMEASURE2 0xdc8
1583#define ROFDM_BWREPORT 0xdcc
1584#define ROFDM_AGCREPORT 0xdd0
1585#define ROFDM_RXSNR 0xdd4
1586#define ROFDM_RXEVMCSI 0xdd8
1587#define ROFDM_SIGREPORT 0xddc
1588
1589#define RTXAGC_A_CCK11_CCK1 0xc20
1590#define RTXAGC_A_OFDM18_OFDM6 0xc24
1591#define RTXAGC_A_OFDM54_OFDM24 0xc28
1592#define RTXAGC_A_MCS03_MCS00 0xc2c
1593#define RTXAGC_A_MCS07_MCS04 0xc30
1594#define RTXAGC_A_MCS11_MCS08 0xc34
1595#define RTXAGC_A_MCS15_MCS12 0xc38
1596#define RTXAGC_A_NSS1INDEX3_NSS1INDEX0 0xc3c
1597#define RTXAGC_A_NSS1INDEX7_NSS1INDEX4 0xc40
1598#define RTXAGC_A_NSS2INDEX1_NSS1INDEX8 0xc44
1599#define RTXAGC_A_NSS2INDEX5_NSS2INDEX2 0xc48
1600#define RTXAGC_A_NSS2INDEX9_NSS2INDEX6 0xc4c
1601#define RTXAGC_B_CCK11_CCK1 0xe20
1602#define RTXAGC_B_OFDM18_OFDM6 0xe24
1603#define RTXAGC_B_OFDM54_OFDM24 0xe28
1604#define RTXAGC_B_MCS03_MCS00 0xe2c
1605#define RTXAGC_B_MCS07_MCS04 0xe30
1606#define RTXAGC_B_MCS11_MCS08 0xe34
1607#define RTXAGC_B_MCS15_MCS12 0xe38
1608#define RTXAGC_B_NSS1INDEX3_NSS1INDEX0 0xe3c
1609#define RTXAGC_B_NSS1INDEX7_NSS1INDEX4 0xe40
1610#define RTXAGC_B_NSS2INDEX1_NSS1INDEX8 0xe44
1611#define RTXAGC_B_NSS2INDEX5_NSS2INDEX2 0xe48
1612#define RTXAGC_B_NSS2INDEX9_NSS2INDEX6 0xe4c
1613
1614#define RA_TXPWRTRAING 0xc54
1615#define RB_TXPWRTRAING 0xe54
1616
1617#define RFPGA0_IQK 0xe28
1618#define RTX_IQK_TONE_A 0xe30
1619#define RRX_IQK_TONE_A 0xe34
1620#define RTX_IQK_PI_A 0xe38
1621#define RRX_IQK_PI_A 0xe3c
1622
1623#define RTX_IQK 0xe40
1624#define RRX_IQK 0xe44
1625#define RIQK_AGC_PTS 0xe48
1626#define RIQK_AGC_RSP 0xe4c
1627#define RTX_IQK_TONE_B 0xe50
1628#define RRX_IQK_TONE_B 0xe54
1629#define RTX_IQK_PI_B 0xe58
1630#define RRX_IQK_PI_B 0xe5c
1631#define RIQK_AGC_CONT 0xe60
1632
1633#define RBLUE_TOOTH 0xe6c
1634#define RRX_WAIT_CCA 0xe70
1635#define RTX_CCK_RFON 0xe74
1636#define RTX_CCK_BBON 0xe78
1637#define RTX_OFDM_RFON 0xe7c
1638#define RTX_OFDM_BBON 0xe80
1639#define RTX_TO_RX 0xe84
1640#define RTX_TO_TX 0xe88
1641#define RRX_CCK 0xe8c
1642
1643#define RTX_POWER_BEFORE_IQK_A 0xe94
1644#define RTX_POWER_AFTER_IQK_A 0xe9c
1645
1646#define RRX_POWER_BEFORE_IQK_A 0xea0
1647#define RRX_POWER_BEFORE_IQK_A_2 0xea4
1648#define RRX_POWER_AFTER_IQK_A 0xea8
1649#define RRX_POWER_AFTER_IQK_A_2 0xeac
1650
1651#define RTX_POWER_BEFORE_IQK_B 0xeb4
1652#define RTX_POWER_AFTER_IQK_B 0xebc
1653
1654#define RRX_POER_BEFORE_IQK_B 0xec0
1655#define RRX_POER_BEFORE_IQK_B_2 0xec4
1656#define RRX_POWER_AFTER_IQK_B 0xec8
1657#define RRX_POWER_AFTER_IQK_B_2 0xecc
1658
1659#define RRX_OFDM 0xed0
1660#define RRX_WAIT_RIFS 0xed4
1661#define RRX_TO_RX 0xed8
1662#define RSTANDBY 0xedc
1663#define RSLEEP 0xee0
1664#define RPMPD_ANAEN 0xeec
1665
1666#define RZEBRA1_HSSIENABLE 0x0
1667#define RZEBRA1_TRXENABLE1 0x1
1668#define RZEBRA1_TRXENABLE2 0x2
1669#define RZEBRA1_AGC 0x4
1670#define RZEBRA1_CHARGEPUMP 0x5
1671#define RZEBRA1_CHANNEL 0x7
1672
1673#define RZEBRA1_TXGAIN 0x8
1674#define RZEBRA1_TXLPF 0x9
1675#define RZEBRA1_RXLPF 0xb
1676#define RZEBRA1_RXHPFCORNER 0xc
1677
1678#define RGLOBALCTRL 0
1679#define RRTL8256_TXLPF 19
1680#define RRTL8256_RXLPF 11
1681#define RRTL8258_TXLPF 0x11
1682#define RRTL8258_RXLPF 0x13
1683#define RRTL8258_RSSILPF 0xa
1684
1685#define RF_AC 0x00
1686
1687#define RF_IQADJ_G1 0x01
1688#define RF_IQADJ_G2 0x02
1689#define RF_POW_TRSW 0x05
1690
1691#define RF_GAIN_RX 0x06
1692#define RF_GAIN_TX 0x07
1693
1694#define RF_TXM_IDAC 0x08
1695#define RF_BS_IQGEN 0x0F
1696
1697#define RF_MODE1 0x10
1698#define RF_MODE2 0x11
1699
1700#define RF_RX_AGC_HP 0x12
1701#define RF_TX_AGC 0x13
1702#define RF_BIAS 0x14
1703#define RF_IPA 0x15
1704#define RF_POW_ABILITY 0x17
1705#define RF_MODE_AG 0x18
1706#define RRFCHANNEL 0x18
1707#define RF_CHNLBW 0x18
1708#define RF_TOP 0x19
1709
1710#define RF_RX_G1 0x1A
1711#define RF_RX_G2 0x1B
1712
1713#define RF_RX_BB2 0x1C
1714#define RF_RX_BB1 0x1D
1715
1716#define RF_RCK1 0x1E
1717#define RF_RCK2 0x1F
1718
1719#define RF_TX_G1 0x20
1720#define RF_TX_G2 0x21
1721#define RF_TX_G3 0x22
1722
1723#define RF_TX_BB1 0x23
1724#define RF_T_METER 0x24
1725#define RF_T_METER_88E 0x42
1726#define RF_T_METER_8812A 0x42
1727
1728#define RF_SYN_G1 0x25
1729#define RF_SYN_G2 0x26
1730#define RF_SYN_G3 0x27
1731#define RF_SYN_G4 0x28
1732#define RF_SYN_G5 0x29
1733#define RF_SYN_G6 0x2A
1734#define RF_SYN_G7 0x2B
1735#define RF_SYN_G8 0x2C
1736
1737#define RF_RCK_OS 0x30
1738#define RF_TXPA_G1 0x31
1739#define RF_TXPA_G2 0x32
1740#define RF_TXPA_G3 0x33
1741
1742#define RF_TX_BIAS_A 0x35
1743#define RF_TX_BIAS_D 0x36
1744#define RF_LOBF_9 0x38
1745#define RF_RXRF_A3 0x3C
1746#define RF_TRSW 0x3F
1747
1748#define RF_TXRF_A2 0x41
1749#define RF_TXPA_G4 0x46
1750#define RF_TXPA_A4 0x4B
1751
1752#define RF_APK 0x63
1753
1754#define RF_WE_LUT 0xEF
1755
1756#define BBBRESETB 0x100
1757#define BGLOBALRESETB 0x200
1758#define BOFDMTXSTART 0x4
1759#define BCCKTXSTART 0x8
1760#define BCRC32DEBUG 0x100
1761#define BPMACLOOPBACK 0x10
1762#define BTXLSIG 0xffffff
1763#define BOFDMTXRATE 0xf
1764#define BOFDMTXRESERVED 0x10
1765#define BOFDMTXLENGTH 0x1ffe0
1766#define BOFDMTXPARITY 0x20000
1767#define BTXHTSIG1 0xffffff
1768#define BTXHTMCSRATE 0x7f
1769#define BTXHTBW 0x80
1770#define BTXHTLENGTH 0xffff00
1771#define BTXHTSIG2 0xffffff
1772#define BTXHTSMOOTHING 0x1
1773#define BTXHTSOUNDING 0x2
1774#define BTXHTRESERVED 0x4
1775#define BTXHTAGGREATION 0x8
1776#define BTXHTSTBC 0x30
1777#define BTXHTADVANCECODING 0x40
1778#define BTXHTSHORTGI 0x80
1779#define BTXHTNUMBERHT_LTF 0x300
1780#define BTXHTCRC8 0x3fc00
1781#define BCOUNTERRESET 0x10000
1782#define BNUMOFOFDMTX 0xffff
1783#define BNUMOFCCKTX 0xffff0000
1784#define BTXIDLEINTERVAL 0xffff
1785#define BOFDMSERVICE 0xffff0000
1786#define BTXMACHEADER 0xffffffff
1787#define BTXDATAINIT 0xff
1788#define BTXHTMODE 0x100
1789#define BTXDATATYPE 0x30000
1790#define BTXRANDOMSEED 0xffffffff
1791#define BCCKTXPREAMBLE 0x1
1792#define BCCKTXSFD 0xffff0000
1793#define BCCKTXSIG 0xff
1794#define BCCKTXSERVICE 0xff00
1795#define BCCKLENGTHEXT 0x8000
1796#define BCCKTXLENGHT 0xffff0000
1797#define BCCKTXCRC16 0xffff
1798#define BCCKTXSTATUS 0x1
1799#define BOFDMTXSTATUS 0x2
1800#define IS_BB_REG_OFFSET_92S(__offset) \
1801 ((__offset >= 0x800) && (__offset <= 0xfff))
1802
1803#define BRFMOD 0x1
1804#define BJAPANMODE 0x2
1805#define BCCKTXSC 0x30
1806/* Block & Path enable*/
1807#define ROFDMCCKEN 0x808
1808#define BCCKEN 0x10000000
1809#define BOFDMEN 0x20000000
1810/* Rx antenna*/
1811#define RRXPATH 0x808
1812#define BRXPATH 0xff
1813/* Tx antenna*/
1814#define RTXPATH 0x80c
1815#define BTXPATH 0x0fffffff
1816/* for cck rx path selection*/
1817#define RCCK_RX 0xa04
1818#define BCCK_RX 0x0c000000
1819/* Use LSIG for VHT length*/
1820#define RVHTLEN_USE_LSIG 0x8c3
1821
1822#define BOFDMRXADCPHASE 0x10000
1823#define BOFDMTXDACPHASE 0x40000
1824#define BXATXAGC 0x3f
1825
1826#define BXBTXAGC 0xf00
1827#define BXCTXAGC 0xf000
1828#define BXDTXAGC 0xf0000
1829
1830#define BPASTART 0xf0000000
1831#define BTRSTART 0x00f00000
1832#define BRFSTART 0x0000f000
1833#define BBBSTART 0x000000f0
1834#define BBBCCKSTART 0x0000000f
1835#define BPAEND 0xf
1836#define BTREND 0x0f000000
1837#define BRFEND 0x000f0000
1838#define BCCAMASK 0x000000f0
1839#define BR2RCCAMASK 0x00000f00
1840#define BHSSI_R2TDELAY 0xf8000000
1841#define BHSSI_T2RDELAY 0xf80000
1842#define BCONTXHSSI 0x400
1843#define BIGFROMCCK 0x200
1844#define BAGCADDRESS 0x3f
1845#define BRXHPTX 0x7000
1846#define BRXHP2RX 0x38000
1847#define BRXHPCCKINI 0xc0000
1848#define BAGCTXCODE 0xc00000
1849#define BAGCRXCODE 0x300000
1850
1851#define B3WIREDATALENGTH 0x800
1852#define B3WIREADDREAALENGTH 0x400
1853
1854#define B3WIRERFPOWERDOWN 0x1
1855#define B5GPAPEPOLARITY 0x40000000
1856#define B2GPAPEPOLARITY 0x80000000
1857#define BRFSW_TXDEFAULTANT 0x3
1858#define BRFSW_TXOPTIONANT 0x30
1859#define BRFSW_RXDEFAULTANT 0x300
1860#define BRFSW_RXOPTIONANT 0x3000
1861#define BRFSI_3WIREDATA 0x1
1862#define BRFSI_3WIRECLOCK 0x2
1863#define BRFSI_3WIRELOAD 0x4
1864#define BRFSI_3WIRERW 0x8
1865#define BRFSI_3WIRE 0xf
1866
1867#define BRFSI_RFENV 0x10
1868
1869#define BRFSI_TRSW 0x20
1870#define BRFSI_TRSWB 0x40
1871#define BRFSI_ANTSW 0x100
1872#define BRFSI_ANTSWB 0x200
1873#define BRFSI_PAPE 0x400
1874#define BRFSI_PAPE5G 0x800
1875#define BBANDSELECT 0x1
1876#define BHTSIG2_GI 0x80
1877#define BHTSIG2_SMOOTHING 0x01
1878#define BHTSIG2_SOUNDING 0x02
1879#define BHTSIG2_AGGREATON 0x08
1880#define BHTSIG2_STBC 0x30
1881#define BHTSIG2_ADVCODING 0x40
1882#define BHTSIG2_NUMOFHTLTF 0x300
1883#define BHTSIG2_CRC8 0x3fc
1884#define BHTSIG1_MCS 0x7f
1885#define BHTSIG1_BANDWIDTH 0x80
1886#define BHTSIG1_HTLENGTH 0xffff
1887#define BLSIG_RATE 0xf
1888#define BLSIG_RESERVED 0x10
1889#define BLSIG_LENGTH 0x1fffe
1890#define BLSIG_PARITY 0x20
1891#define BCCKRXPHASE 0x4
1892
1893#define BLSSIREADADDRESS 0x7f800000
1894#define BLSSIREADEDGE 0x80000000
1895
1896#define BLSSIREADBACKDATA 0xfffff
1897
1898#define BLSSIREADOKFLAG 0x1000
1899#define BCCKSAMPLERATE 0x8
1900#define BREGULATOR0STANDBY 0x1
1901#define BREGULATORPLLSTANDBY 0x2
1902#define BREGULATOR1STANDBY 0x4
1903#define BPLLPOWERUP 0x8
1904#define BDPLLPOWERUP 0x10
1905#define BDA10POWERUP 0x20
1906#define BAD7POWERUP 0x200
1907#define BDA6POWERUP 0x2000
1908#define BXTALPOWERUP 0x4000
1909#define B40MDCLKPOWERUP 0x8000
1910#define BDA6DEBUGMODE 0x20000
1911#define BDA6SWING 0x380000
1912
1913#define BADCLKPHASE 0x4000000
1914#define B80MCLKDELAY 0x18000000
1915#define BAFEWATCHDOGENABLE 0x20000000
1916
1917#define BXTALCAP01 0xc0000000
1918#define BXTALCAP23 0x3
1919#define BXTALCAP92X 0x0f000000
1920#define BXTALCAP 0x0f000000
1921
1922#define BINTDIFCLKENABLE 0x400
1923#define BEXTSIGCLKENABLE 0x800
1924#define BBANDGAP_MBIAS_POWERUP 0x10000
1925#define BAD11SH_GAIN 0xc0000
1926#define BAD11NPUT_RANGE 0x700000
1927#define BAD110P_CURRENT 0x3800000
1928#define BLPATH_LOOPBACK 0x4000000
1929#define BQPATH_LOOPBACK 0x8000000
1930#define BAFE_LOOPBACK 0x10000000
1931#define BDA10_SWING 0x7e0
1932#define BDA10_REVERSE 0x800
1933#define BDA_CLK_SOURCE 0x1000
1934#define BDA7INPUT_RANGE 0x6000
1935#define BDA7_GAIN 0x38000
1936#define BDA7OUTPUT_CM_MODE 0x40000
1937#define BDA7INPUT_CM_MODE 0x380000
1938#define BDA7CURRENT 0xc00000
1939#define BREGULATOR_ADJUST 0x7000000
1940#define BAD11POWERUP_ATTX 0x1
1941#define BDA10PS_ATTX 0x10
1942#define BAD11POWERUP_ATRX 0x100
1943#define BDA10PS_ATRX 0x1000
1944#define BCCKRX_AGC_FORMAT 0x200
1945#define BPSDFFT_SAMPLE_POINT 0xc000
1946#define BPSD_AVERAGE_NUM 0x3000
1947#define BIQPATH_CONTROL 0xc00
1948#define BPSD_FREQ 0x3ff
1949#define BPSD_ANTENNA_PATH 0x30
1950#define BPSD_IQ_SWITCH 0x40
1951#define BPSD_RX_TRIGGER 0x400000
1952#define BPSD_TX_TRIGGER 0x80000000
1953#define BPSD_SINE_TONE_SCALE 0x7f000000
1954#define BPSD_REPORT 0xffff
1955
1956#define BOFDM_TXSC 0x30000000
1957#define BCCK_TXON 0x1
1958#define BOFDM_TXON 0x2
1959#define BDEBUG_PAGE 0xfff
1960#define BDEBUG_ITEM 0xff
1961#define BANTL 0x10
1962#define BANT_NONHT 0x100
1963#define BANT_HT1 0x1000
1964#define BANT_HT2 0x10000
1965#define BANT_HT1S1 0x100000
1966#define BANT_NONHTS1 0x1000000
1967
1968#define BCCK_BBMODE 0x3
1969#define BCCK_TXPOWERSAVING 0x80
1970#define BCCK_RXPOWERSAVING 0x40
1971
1972#define BCCK_SIDEBAND 0x10
1973
1974#define BCCK_SCRAMBLE 0x8
1975#define BCCK_ANTDIVERSITY 0x8000
1976#define BCCK_CARRIER_RECOVERY 0x4000
1977#define BCCK_TXRATE 0x3000
1978#define BCCK_DCCANCEL 0x0800
1979#define BCCK_ISICANCEL 0x0400
1980#define BCCK_MATCH_FILTER 0x0200
1981#define BCCK_EQUALIZER 0x0100
1982#define BCCK_PREAMBLE_DETECT 0x800000
1983#define BCCK_FAST_FALSECCA 0x400000
1984#define BCCK_CH_ESTSTART 0x300000
1985#define BCCK_CCA_COUNT 0x080000
1986#define BCCK_CS_LIM 0x070000
1987#define BCCK_BIST_MODE 0x80000000
1988#define BCCK_CCAMASK 0x40000000
1989#define BCCK_TX_DAC_PHASE 0x4
1990#define BCCK_RX_ADC_PHASE 0x20000000
1991#define BCCKR_CP_MODE 0x0100
1992#define BCCK_TXDC_OFFSET 0xf0
1993#define BCCK_RXDC_OFFSET 0xf
1994#define BCCK_CCA_MODE 0xc000
1995#define BCCK_FALSECS_LIM 0x3f00
1996#define BCCK_CS_RATIO 0xc00000
1997#define BCCK_CORGBIT_SEL 0x300000
1998#define BCCK_PD_LIM 0x0f0000
1999#define BCCK_NEWCCA 0x80000000
2000#define BCCK_RXHP_OF_IG 0x8000
2001#define BCCK_RXIG 0x7f00
2002#define BCCK_LNA_POLARITY 0x800000
2003#define BCCK_RX1ST_BAIN 0x7f0000
2004#define BCCK_RF_EXTEND 0x20000000
2005#define BCCK_RXAGC_SATLEVEL 0x1f000000
2006#define BCCK_RXAGC_SATCOUNT 0xe0
2007#define BCCKRXRFSETTLE 0x1f
2008#define BCCK_FIXED_RXAGC 0x8000
2009#define BCCK_ANTENNA_POLARITY 0x2000
2010#define BCCK_TXFILTER_TYPE 0x0c00
2011#define BCCK_RXAGC_REPORTTYPE 0x0300
2012#define BCCK_RXDAGC_EN 0x80000000
2013#define BCCK_RXDAGC_PERIOD 0x20000000
2014#define BCCK_RXDAGC_SATLEVEL 0x1f000000
2015#define BCCK_TIMING_RECOVERY 0x800000
2016#define BCCK_TXC0 0x3f0000
2017#define BCCK_TXC1 0x3f000000
2018#define BCCK_TXC2 0x3f
2019#define BCCK_TXC3 0x3f00
2020#define BCCK_TXC4 0x3f0000
2021#define BCCK_TXC5 0x3f000000
2022#define BCCK_TXC6 0x3f
2023#define BCCK_TXC7 0x3f00
2024#define BCCK_DEBUGPORT 0xff0000
2025#define BCCK_DAC_DEBUG 0x0f000000
2026#define BCCK_FALSEALARM_ENABLE 0x8000
2027#define BCCK_FALSEALARM_READ 0x4000
2028#define BCCK_TRSSI 0x7f
2029#define BCCK_RXAGC_REPORT 0xfe
2030#define BCCK_RXREPORT_ANTSEL 0x80000000
2031#define BCCK_RXREPORT_MFOFF 0x40000000
2032#define BCCK_RXREPORT_SQLOSS 0x20000000
2033#define BCCK_RXREPORT_PKTLOSS 0x10000000
2034#define BCCK_RXREPORT_LOCKEDBIT 0x08000000
2035#define BCCK_RXREPORT_RATEERROR 0x04000000
2036#define BCCK_RXREPORT_RXRATE 0x03000000
2037#define BCCK_RXFA_COUNTER_LOWER 0xff
2038#define BCCK_RXFA_COUNTER_UPPER 0xff000000
2039#define BCCK_RXHPAGC_START 0xe000
2040#define BCCK_RXHPAGC_FINAL 0x1c00
2041#define BCCK_RXFALSEALARM_ENABLE 0x8000
2042#define BCCK_FACOUNTER_FREEZE 0x4000
2043#define BCCK_TXPATH_SEL 0x10000000
2044#define BCCK_DEFAULT_RXPATH 0xc000000
2045#define BCCK_OPTION_RXPATH 0x3000000
2046
2047#define BNUM_OFSTF 0x3
2048#define BSHIFT_L 0xc0
2049#define BGI_TH 0xc
2050#define BRXPATH_A 0x1
2051#define BRXPATH_B 0x2
2052#define BRXPATH_C 0x4
2053#define BRXPATH_D 0x8
2054#define BTXPATH_A 0x1
2055#define BTXPATH_B 0x2
2056#define BTXPATH_C 0x4
2057#define BTXPATH_D 0x8
2058#define BTRSSI_FREQ 0x200
2059#define BADC_BACKOFF 0x3000
2060#define BDFIR_BACKOFF 0xc000
2061#define BTRSSI_LATCH_PHASE 0x10000
2062#define BRX_LDC_OFFSET 0xff
2063#define BRX_QDC_OFFSET 0xff00
2064#define BRX_DFIR_MODE 0x1800000
2065#define BRX_DCNF_TYPE 0xe000000
2066#define BRXIQIMB_A 0x3ff
2067#define BRXIQIMB_B 0xfc00
2068#define BRXIQIMB_C 0x3f0000
2069#define BRXIQIMB_D 0xffc00000
2070#define BDC_DC_NOTCH 0x60000
2071#define BRXNB_NOTCH 0x1f000000
2072#define BPD_TH 0xf
2073#define BPD_TH_OPT2 0xc000
2074#define BPWED_TH 0x700
2075#define BIFMF_WIN_L 0x800
2076#define BPD_OPTION 0x1000
2077#define BMF_WIN_L 0xe000
2078#define BBW_SEARCH_L 0x30000
2079#define BWIN_ENH_L 0xc0000
2080#define BBW_TH 0x700000
2081#define BED_TH2 0x3800000
2082#define BBW_OPTION 0x4000000
2083#define BRADIO_TH 0x18000000
2084#define BWINDOW_L 0xe0000000
2085#define BSBD_OPTION 0x1
2086#define BFRAME_TH 0x1c
2087#define BFS_OPTION 0x60
2088#define BDC_SLOPE_CHECK 0x80
2089#define BFGUARD_COUNTER_DC_L 0xe00
2090#define BFRAME_WEIGHT_SHORT 0x7000
2091#define BSUB_TUNE 0xe00000
2092#define BFRAME_DC_LENGTH 0xe000000
2093#define BSBD_START_OFFSET 0x30000000
2094#define BFRAME_TH_2 0x7
2095#define BFRAME_GI2_TH 0x38
2096#define BGI2_SYNC_EN 0x40
2097#define BSARCH_SHORT_EARLY 0x300
2098#define BSARCH_SHORT_LATE 0xc00
2099#define BSARCH_GI2_LATE 0x70000
2100#define BCFOANTSUM 0x1
2101#define BCFOACC 0x2
2102#define BCFOSTARTOFFSET 0xc
2103#define BCFOLOOPBACK 0x70
2104#define BCFOSUMWEIGHT 0x80
2105#define BDAGCENABLE 0x10000
2106#define BTXIQIMB_A 0x3ff
2107#define BTXIQIMB_b 0xfc00
2108#define BTXIQIMB_C 0x3f0000
2109#define BTXIQIMB_D 0xffc00000
2110#define BTXIDCOFFSET 0xff
2111#define BTXIQDCOFFSET 0xff00
2112#define BTXDFIRMODE 0x10000
2113#define BTXPESUDO_NOISEON 0x4000000
2114#define BTXPESUDO_NOISE_A 0xff
2115#define BTXPESUDO_NOISE_B 0xff00
2116#define BTXPESUDO_NOISE_C 0xff0000
2117#define BTXPESUDO_NOISE_D 0xff000000
2118#define BCCA_DROPOPTION 0x20000
2119#define BCCA_DROPTHRES 0xfff00000
2120#define BEDCCA_H 0xf
2121#define BEDCCA_L 0xf0
2122#define BLAMBDA_ED 0x300
2123#define BRX_INITIALGAIN 0x7f
2124#define BRX_ANTDIV_EN 0x80
2125#define BRX_AGC_ADDRESS_FOR_LNA 0x7f00
2126#define BRX_HIGHPOWER_FLOW 0x8000
2127#define BRX_AGC_FREEZE_THRES 0xc0000
2128#define BRX_FREEZESTEP_AGC1 0x300000
2129#define BRX_FREEZESTEP_AGC2 0xc00000
2130#define BRX_FREEZESTEP_AGC3 0x3000000
2131#define BRX_FREEZESTEP_AGC0 0xc000000
2132#define BRXRSSI_CMP_EN 0x10000000
2133#define BRXQUICK_AGCEN 0x20000000
2134#define BRXAGC_FREEZE_THRES_MODE 0x40000000
2135#define BRX_OVERFLOW_CHECKTYPE 0x80000000
2136#define BRX_AGCSHIFT 0x7f
2137#define BTRSW_TRI_ONLY 0x80
2138#define BPOWER_THRES 0x300
2139#define BRXAGC_EN 0x1
2140#define BRXAGC_TOGETHER_EN 0x2
2141#define BRXAGC_MIN 0x4
2142#define BRXHP_INI 0x7
2143#define BRXHP_TRLNA 0x70
2144#define BRXHP_RSSI 0x700
2145#define BRXHP_BBP1 0x7000
2146#define BRXHP_BBP2 0x70000
2147#define BRXHP_BBP3 0x700000
2148#define BRSSI_H 0x7f0000
2149#define BRSSI_GEN 0x7f000000
2150#define BRXSETTLE_TRSW 0x7
2151#define BRXSETTLE_LNA 0x38
2152#define BRXSETTLE_RSSI 0x1c0
2153#define BRXSETTLE_BBP 0xe00
2154#define BRXSETTLE_RXHP 0x7000
2155#define BRXSETTLE_ANTSW_RSSI 0x38000
2156#define BRXSETTLE_ANTSW 0xc0000
2157#define BRXPROCESS_TIME_DAGC 0x300000
2158#define BRXSETTLE_HSSI 0x400000
2159#define BRXPROCESS_TIME_BBPPW 0x800000
2160#define BRXANTENNA_POWER_SHIFT 0x3000000
2161#define BRSSI_TABLE_SELECT 0xc000000
2162#define BRXHP_FINAL 0x7000000
2163#define BRXHPSETTLE_BBP 0x7
2164#define BRXHTSETTLE_HSSI 0x8
2165#define BRXHTSETTLE_RXHP 0x70
2166#define BRXHTSETTLE_BBPPW 0x80
2167#define BRXHTSETTLE_IDLE 0x300
2168#define BRXHTSETTLE_RESERVED 0x1c00
2169#define BRXHT_RXHP_EN 0x8000
2170#define BRXAGC_FREEZE_THRES 0x30000
2171#define BRXAGC_TOGETHEREN 0x40000
2172#define BRXHTAGC_MIN 0x80000
2173#define BRXHTAGC_EN 0x100000
2174#define BRXHTDAGC_EN 0x200000
2175#define BRXHT_RXHP_BBP 0x1c00000
2176#define BRXHT_RXHP_FINAL 0xe0000000
2177#define BRXPW_RADIO_TH 0x3
2178#define BRXPW_RADIO_EN 0x4
2179#define BRXMF_HOLD 0x3800
2180#define BRXPD_DELAY_TH1 0x38
2181#define BRXPD_DELAY_TH2 0x1c0
2182#define BRXPD_DC_COUNT_MAX 0x600
2183#define BRXPD_DELAY_TH 0x8000
2184#define BRXPROCESS_DELAY 0xf0000
2185#define BRXSEARCHRANGE_GI2_EARLY 0x700000
2186#define BRXFRAME_FUARD_COUNTER_L 0x3800000
2187#define BRXSGI_GUARD_L 0xc000000
2188#define BRXSGI_SEARCH_L 0x30000000
2189#define BRXSGI_TH 0xc0000000
2190#define BDFSCNT0 0xff
2191#define BDFSCNT1 0xff00
2192#define BDFSFLAG 0xf0000
2193#define BMF_WEIGHT_SUM 0x300000
2194#define BMINIDX_TH 0x7f000000
2195#define BDAFORMAT 0x40000
2196#define BTXCH_EMU_ENABLE 0x01000000
2197#define BTRSW_ISOLATION_A 0x7f
2198#define BTRSW_ISOLATION_B 0x7f00
2199#define BTRSW_ISOLATION_C 0x7f0000
2200#define BTRSW_ISOLATION_D 0x7f000000
2201#define BEXT_LNA_GAIN 0x7c00
2202
2203#define BSTBC_EN 0x4
2204#define BANTENNA_MAPPING 0x10
2205#define BNSS 0x20
2206#define BCFO_ANTSUM_ID 0x200
2207#define BPHY_COUNTER_RESET 0x8000000
2208#define BCFO_REPORT_GET 0x4000000
2209#define BOFDM_CONTINUE_TX 0x10000000
2210#define BOFDM_SINGLE_CARRIER 0x20000000
2211#define BOFDM_SINGLE_TONE 0x40000000
2212#define BHT_DETECT 0x100
2213#define BCFOEN 0x10000
2214#define BCFOVALUE 0xfff00000
2215#define BSIGTONE_RE 0x3f
2216#define BSIGTONE_IM 0x7f00
2217#define BCOUNTER_CCA 0xffff
2218#define BCOUNTER_PARITYFAIL 0xffff0000
2219#define BCOUNTER_RATEILLEGAL 0xffff
2220#define BCOUNTER_CRC8FAIL 0xffff0000
2221#define BCOUNTER_MCSNOSUPPORT 0xffff
2222#define BCOUNTER_FASTSYNC 0xffff
2223#define BSHORTCFO 0xfff
2224#define BSHORTCFOT_LENGTH 12
2225#define BSHORTCFOF_LENGTH 11
2226#define BLONGCFO 0x7ff
2227#define BLONGCFOT_LENGTH 11
2228#define BLONGCFOF_LENGTH 11
2229#define BTAILCFO 0x1fff
2230#define BTAILCFOT_LENGTH 13
2231#define BTAILCFOF_LENGTH 12
2232#define BNOISE_EN_PWDB 0xffff
2233#define BCC_POWER_DB 0xffff0000
2234#define BMOISE_PWDB 0xffff
2235#define BPOWERMEAST_LENGTH 10
2236#define BPOWERMEASF_LENGTH 3
2237#define BRX_HT_BW 0x1
2238#define BRXSC 0x6
2239#define BRX_HT 0x8
2240#define BNB_INTF_DET_ON 0x1
2241#define BINTF_WIN_LEN_CFG 0x30
2242#define BNB_INTF_TH_CFG 0x1c0
2243#define BRFGAIN 0x3f
2244#define BTABLESEL 0x40
2245#define BTRSW 0x80
2246#define BRXSNR_A 0xff
2247#define BRXSNR_B 0xff00
2248#define BRXSNR_C 0xff0000
2249#define BRXSNR_D 0xff000000
2250#define BSNR_EVMT_LENGTH 8
2251#define BSNR_EVMF_LENGTH 1
2252#define BCSI1ST 0xff
2253#define BCSI2ND 0xff00
2254#define BRXEVM1ST 0xff0000
2255#define BRXEVM2ND 0xff000000
2256#define BSIGEVM 0xff
2257#define BPWDB 0xff00
2258#define BSGIEN 0x10000
2259
2260#define BSFACTOR_QMA1 0xf
2261#define BSFACTOR_QMA2 0xf0
2262#define BSFACTOR_QMA3 0xf00
2263#define BSFACTOR_QMA4 0xf000
2264#define BSFACTOR_QMA5 0xf0000
2265#define BSFACTOR_QMA6 0xf0000
2266#define BSFACTOR_QMA7 0xf00000
2267#define BSFACTOR_QMA8 0xf000000
2268#define BSFACTOR_QMA9 0xf0000000
2269#define BCSI_SCHEME 0x100000
2270
2271#define BNOISE_LVL_TOP_SET 0x3
2272#define BCHSMOOTH 0x4
2273#define BCHSMOOTH_CFG1 0x38
2274#define BCHSMOOTH_CFG2 0x1c0
2275#define BCHSMOOTH_CFG3 0xe00
2276#define BCHSMOOTH_CFG4 0x7000
2277#define BMRCMODE 0x800000
2278#define BTHEVMCFG 0x7000000
2279
2280#define BLOOP_FIT_TYPE 0x1
2281#define BUPD_CFO 0x40
2282#define BUPD_CFO_OFFDATA 0x80
2283#define BADV_UPD_CFO 0x100
2284#define BADV_TIME_CTRL 0x800
2285#define BUPD_CLKO 0x1000
2286#define BFC 0x6000
2287#define BTRACKING_MODE 0x8000
2288#define BPHCMP_ENABLE 0x10000
2289#define BUPD_CLKO_LTF 0x20000
2290#define BCOM_CH_CFO 0x40000
2291#define BCSI_ESTI_MODE 0x80000
2292#define BADV_UPD_EQZ 0x100000
2293#define BUCHCFG 0x7000000
2294#define BUPDEQZ 0x8000000
2295
2296#define BRX_PESUDO_NOISE_ON 0x20000000
2297#define BRX_PESUDO_NOISE_A 0xff
2298#define BRX_PESUDO_NOISE_B 0xff00
2299#define BRX_PESUDO_NOISE_C 0xff0000
2300#define BRX_PESUDO_NOISE_D 0xff000000
2301#define BRX_PESUDO_NOISESTATE_A 0xffff
2302#define BRX_PESUDO_NOISESTATE_B 0xffff0000
2303#define BRX_PESUDO_NOISESTATE_C 0xffff
2304#define BRX_PESUDO_NOISESTATE_D 0xffff0000
2305
2306#define BZEBRA1_HSSIENABLE 0x8
2307#define BZEBRA1_TRXCONTROL 0xc00
2308#define BZEBRA1_TRXGAINSETTING 0x07f
2309#define BZEBRA1_RXCOUNTER 0xc00
2310#define BZEBRA1_TXCHANGEPUMP 0x38
2311#define BZEBRA1_RXCHANGEPUMP 0x7
2312#define BZEBRA1_CHANNEL_NUM 0xf80
2313#define BZEBRA1_TXLPFBW 0x400
2314#define BZEBRA1_RXLPFBW 0x600
2315
2316#define BRTL8256REG_MODE_CTRL1 0x100
2317#define BRTL8256REG_MODE_CTRL0 0x40
2318#define BRTL8256REG_TXLPFBW 0x18
2319#define BRTL8256REG_RXLPFBW 0x600
2320
2321#define BRTL8258_TXLPFBW 0xc
2322#define BRTL8258_RXLPFBW 0xc00
2323#define BRTL8258_RSSILPFBW 0xc0
2324
2325#define BBYTE0 0x1
2326#define BBYTE1 0x2
2327#define BBYTE2 0x4
2328#define BBYTE3 0x8
2329#define BWORD0 0x3
2330#define BWORD1 0xc
2331#define BWORD 0xf
2332
2333#define MASKBYTE0 0xff
2334#define MASKBYTE1 0xff00
2335#define MASKBYTE2 0xff0000
2336#define MASKBYTE3 0xff000000
2337#define MASKHWORD 0xffff0000
2338#define MASKLWORD 0x0000ffff
2339#define MASKDWORD 0xffffffff
2340#define MASK12BITS 0xfff
2341#define MASKH4BITS 0xf0000000
2342#define MASKOFDM_D 0xffc00000
2343#define MASKCCK 0x3f3f3f3f
2344
2345#define MASK4BITS 0x0f
2346#define MASK20BITS 0xfffff
2347#define RFREG_OFFSET_MASK 0xfffff
2348
2349#define BENABLE 0x1
2350#define BDISABLE 0x0
2351
2352#define LEFT_ANTENNA 0x0
2353#define RIGHT_ANTENNA 0x1
2354
2355#define TCHECK_TXSTATUS 500
2356#define TUPDATE_RXCOUNTER 100
2357
2358#define REG_UN_used_register 0x01bf
2359
2360/* Path_A RFE cotrol pinmux*/
2361#define RA_RFE_PINMUX 0xcb0
2362/* Path_B RFE control pinmux*/
2363#define RB_RFE_PINMUX 0xeb0
2364
2365#define RA_RFE_INV 0xcb4
2366#define RB_RFE_INV 0xeb4
2367
2368/* RXIQC */
2369/*RxIQ imblance matrix coeff. A & B*/
2370#define RA_RXIQC_AB 0xc10
2371/*RxIQ imblance matrix coeff. C & D*/
2372#define RA_RXIQC_CD 0xc14
2373/* Pah_A TX scaling factor*/
2374#define RA_TXSCALE 0xc1c
2375/* Path_B TX scaling factor*/
2376#define RB_TXSCALE 0xe1c
2377/*RxIQ imblance matrix coeff. A & B*/
2378#define RB_RXIQC_AB 0xe10
2379/*RxIQ imblance matrix coeff. C & D*/
2380#define RB_RXIQC_CD 0xe14
2381/*bit mask for IQC matrix element A & C*/
2382#define RXIQC_AC 0x02ff
2383 /*bit mask for IQC matrix element A & C*/
2384#define RXIQC_BD 0x02ff0000
2385
2386/* 2 EFUSE_TEST (For RTL8723 partially) */
2387#define EFUSE_SEL(x) (((x) & 0x3) << 8)
2388#define EFUSE_SEL_MASK 0x300
2389#define EFUSE_WIFI_SEL_0 0x0
2390
2391/*REG_MULTI_FUNC_CTRL(For RTL8723 Only)*/
2392/* Enable GPIO[9] as WiFi HW PDn source*/
2393#define WL_HWPDN_EN BIT(0)
2394/* WiFi HW PDn polarity control*/
2395#define WL_HWPDN_SL BIT(1)
2396/* WiFi function enable */
2397#define WL_FUNC_EN BIT(2)
2398/* Enable GPIO[9] as WiFi RF HW PDn source */
2399#define WL_HWROF_EN BIT(3)
2400/* Enable GPIO[11] as BT HW PDn source */
2401#define BT_HWPDN_EN BIT(16)
2402/* BT HW PDn polarity control */
2403#define BT_HWPDN_SL BIT(17)
2404/* BT function enable */
2405#define BT_FUNC_EN BIT(18)
2406/* Enable GPIO[11] as BT/GPS RF HW PDn source */
2407#define BT_HWROF_EN BIT(19)
2408/* Enable GPIO[10] as GPS HW PDn source */
2409#define GPS_HWPDN_EN BIT(20)
2410/* GPS HW PDn polarity control */
2411#define GPS_HWPDN_SL BIT(21)
2412/* GPS function enable */
2413#define GPS_FUNC_EN BIT(22)
2414
2415#define BMASKBYTE0 0xff
2416#define BMASKBYTE1 0xff00
2417#define BMASKBYTE2 0xff0000
2418#define BMASKBYTE3 0xff000000
2419#define BMASKHWORD 0xffff0000
2420#define BMASKLWORD 0x0000ffff
2421#define BMASKDWORD 0xffffffff
2422#define BMASK12BITS 0xfff
2423#define BMASKH4BITS 0xf0000000
2424#define BMASKOFDM_D 0xffc00000
2425#define BMASKCCK 0x3f3f3f3f
2426
2427#define BRFREGOFFSETMASK 0xfffff
2428
2429#define ODM_REG_CCK_RPT_FORMAT_11AC 0x804
2430#define ODM_REG_BB_RX_PATH_11AC 0x808
2431/*PAGE 9*/
2432#define ODM_REG_OFDM_FA_RST_11AC 0x9A4
2433/*PAGE A*/
2434#define ODM_REG_CCK_CCA_11AC 0xA0A
2435#define ODM_REG_CCK_FA_RST_11AC 0xA2C
2436#define ODM_REG_CCK_FA_11AC 0xA5C
2437/*PAGE C*/
2438#define ODM_REG_IGI_A_11AC 0xC50
2439/*PAGE E*/
2440#define ODM_REG_IGI_B_11AC 0xE50
2441/*PAGE F*/
2442#define ODM_REG_OFDM_FA_11AC 0xF48
2443
2444/* 2 MAC REG LIST */
2445
2446/* DIG Related */
2447#define ODM_BIT_IGI_11AC 0xFFFFFFFF
2448#define ODM_BIT_CCK_RPT_FORMAT_11AC BIT16
2449#define ODM_BIT_BB_RX_PATH_11AC 0xF
2450
2451enum AGGRE_SIZE {
2452 HT_AGG_SIZE_8K = 0,
2453 HT_AGG_SIZE_16K = 1,
2454 HT_AGG_SIZE_32K = 2,
2455 HT_AGG_SIZE_64K = 3,
2456 VHT_AGG_SIZE_128K = 4,
2457 VHT_AGG_SIZE_256K = 5,
2458 VHT_AGG_SIZE_512K = 6,
2459 VHT_AGG_SIZE_1024K = 7,
2460};
2461
2462#define REG_AMPDU_MAX_LENGTH_8812 0x0458
2463
2464#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/rf.c b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.c
new file mode 100644
index 000000000000..2922538160e5
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.c
@@ -0,0 +1,465 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "reg.h"
28#include "def.h"
29#include "phy.h"
30#include "rf.h"
31#include "dm.h"
32
33static bool _rtl8821ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw);
34
35void rtl8821ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw, u8 bandwidth)
36{
37 struct rtl_priv *rtlpriv = rtl_priv(hw);
38
39 switch (bandwidth) {
40 case HT_CHANNEL_WIDTH_20:
41 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, BIT(11)|BIT(10), 3);
42 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, BIT(11)|BIT(10), 3);
43 break;
44 case HT_CHANNEL_WIDTH_20_40:
45 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, BIT(11)|BIT(10), 1);
46 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, BIT(11)|BIT(10), 1);
47 break;
48 case HT_CHANNEL_WIDTH_80:
49 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, BIT(11)|BIT(10), 0);
50 rtl_set_rfreg(hw, RF90_PATH_B, RF_CHNLBW, BIT(11)|BIT(10), 0);
51 break;
52 default:
53 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
54 "unknown bandwidth: %#X\n", bandwidth);
55 break;
56 }
57}
58
59void rtl8821ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
60 u8 *ppowerlevel)
61{
62 struct rtl_priv *rtlpriv = rtl_priv(hw);
63 struct rtl_phy *rtlphy = &rtlpriv->phy;
64 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
65 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
66 u32 tx_agc[2] = {0, 0}, tmpval;
67 bool turbo_scanoff = false;
68 u8 idx1, idx2;
69 u8 *ptr;
70 u8 direction;
71 u32 pwrtrac_value;
72
73 if (rtlefuse->eeprom_regulatory != 0)
74 turbo_scanoff = true;
75
76 if (mac->act_scanning) {
77 tx_agc[RF90_PATH_A] = 0x3f3f3f3f;
78 tx_agc[RF90_PATH_B] = 0x3f3f3f3f;
79
80 if (turbo_scanoff) {
81 for (idx1 = RF90_PATH_A;
82 idx1 <= RF90_PATH_B;
83 idx1++) {
84 tx_agc[idx1] = ppowerlevel[idx1] |
85 (ppowerlevel[idx1] << 8) |
86 (ppowerlevel[idx1] << 16) |
87 (ppowerlevel[idx1] << 24);
88 }
89 }
90 } else {
91 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
92 tx_agc[idx1] = ppowerlevel[idx1] |
93 (ppowerlevel[idx1] << 8) |
94 (ppowerlevel[idx1] << 16) |
95 (ppowerlevel[idx1] << 24);
96 }
97
98 if (rtlefuse->eeprom_regulatory == 0) {
99 tmpval =
100 (rtlphy->mcs_txpwrlevel_origoffset[0][6]) +
101 (rtlphy->mcs_txpwrlevel_origoffset[0][7] <<
102 8);
103 tx_agc[RF90_PATH_A] += tmpval;
104
105 tmpval = (rtlphy->mcs_txpwrlevel_origoffset[0][14]) +
106 (rtlphy->mcs_txpwrlevel_origoffset[0][15] <<
107 24);
108 tx_agc[RF90_PATH_B] += tmpval;
109 }
110 }
111
112 for (idx1 = RF90_PATH_A; idx1 <= RF90_PATH_B; idx1++) {
113 ptr = (u8 *)(&tx_agc[idx1]);
114 for (idx2 = 0; idx2 < 4; idx2++) {
115 if (*ptr > RF6052_MAX_TX_PWR)
116 *ptr = RF6052_MAX_TX_PWR;
117 ptr++;
118 }
119 }
120 rtl8821ae_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value);
121 if (direction == 1) {
122 tx_agc[0] += pwrtrac_value;
123 tx_agc[1] += pwrtrac_value;
124 } else if (direction == 2) {
125 tx_agc[0] -= pwrtrac_value;
126 tx_agc[1] -= pwrtrac_value;
127 }
128 tmpval = tx_agc[RF90_PATH_A];
129 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1, MASKDWORD, tmpval);
130
131 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
132 "CCK PWR 1~11M (rf-A) = 0x%x (reg 0x%x)\n", tmpval,
133 RTXAGC_A_CCK11_CCK1);
134
135 tmpval = tx_agc[RF90_PATH_B];
136 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1, MASKDWORD, tmpval);
137
138 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
139 "CCK PWR 11M (rf-B) = 0x%x (reg 0x%x)\n", tmpval,
140 RTXAGC_B_CCK11_CCK1);
141}
142
143static void rtl8821ae_phy_get_power_base(struct ieee80211_hw *hw,
144 u8 *ppowerlevel_ofdm,
145 u8 *ppowerlevel_bw20,
146 u8 *ppowerlevel_bw40, u8 channel,
147 u32 *ofdmbase, u32 *mcsbase)
148{
149 struct rtl_priv *rtlpriv = rtl_priv(hw);
150 struct rtl_phy *rtlphy = &rtlpriv->phy;
151 u32 powerbase0, powerbase1;
152 u8 i, powerlevel[2];
153
154 for (i = 0; i < 2; i++) {
155 powerbase0 = ppowerlevel_ofdm[i];
156
157 powerbase0 = (powerbase0 << 24) | (powerbase0 << 16) |
158 (powerbase0 << 8) | powerbase0;
159 *(ofdmbase + i) = powerbase0;
160 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
161 " [OFDM power base index rf(%c) = 0x%x]\n",
162 ((i == 0) ? 'A' : 'B'), *(ofdmbase + i));
163 }
164
165 for (i = 0; i < 2; i++) {
166 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20)
167 powerlevel[i] = ppowerlevel_bw20[i];
168 else
169 powerlevel[i] = ppowerlevel_bw40[i];
170
171 powerbase1 = powerlevel[i];
172 powerbase1 = (powerbase1 << 24) |
173 (powerbase1 << 16) | (powerbase1 << 8) | powerbase1;
174
175 *(mcsbase + i) = powerbase1;
176
177 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
178 " [MCS power base index rf(%c) = 0x%x]\n",
179 ((i == 0) ? 'A' : 'B'), *(mcsbase + i));
180 }
181}
182
183static void get_txpower_writeval_by_regulatory(struct ieee80211_hw *hw,
184 u8 channel, u8 index,
185 u32 *powerbase0,
186 u32 *powerbase1,
187 u32 *p_outwriteval)
188{
189 struct rtl_priv *rtlpriv = rtl_priv(hw);
190 struct rtl_phy *rtlphy = &rtlpriv->phy;
191 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
192 u8 i, chnlgroup = 0, pwr_diff_limit[4], pwr_diff = 0, customer_pwr_diff;
193 u32 writeval, customer_limit, rf;
194
195 for (rf = 0; rf < 2; rf++) {
196 switch (rtlefuse->eeprom_regulatory) {
197 case 0:
198 chnlgroup = 0;
199
200 writeval =
201 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup][index +
202 (rf ? 8 : 0)]
203 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
204
205 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
206 "RTK better performance, writeval(%c) = 0x%x\n",
207 ((rf == 0) ? 'A' : 'B'), writeval);
208 break;
209 case 1:
210 if (rtlphy->pwrgroup_cnt == 1) {
211 chnlgroup = 0;
212 } else {
213 if (channel < 3)
214 chnlgroup = 0;
215 else if (channel < 6)
216 chnlgroup = 1;
217 else if (channel < 9)
218 chnlgroup = 2;
219 else if (channel < 12)
220 chnlgroup = 3;
221 else if (channel < 14)
222 chnlgroup = 4;
223 else if (channel == 14)
224 chnlgroup = 5;
225 }
226
227 writeval =
228 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
229 [index + (rf ? 8 : 0)] + ((index < 2) ?
230 powerbase0[rf] :
231 powerbase1[rf]);
232
233 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
234 "Realtek regulatory, 20MHz, writeval(%c) = 0x%x\n",
235 ((rf == 0) ? 'A' : 'B'), writeval);
236
237 break;
238 case 2:
239 writeval =
240 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
241
242 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
243 "Better regulatory, writeval(%c) = 0x%x\n",
244 ((rf == 0) ? 'A' : 'B'), writeval);
245 break;
246 case 3:
247 chnlgroup = 0;
248
249 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
250 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
251 "customer's limit, 40MHz rf(%c) = 0x%x\n",
252 ((rf == 0) ? 'A' : 'B'),
253 rtlefuse->pwrgroup_ht40[rf][channel -
254 1]);
255 } else {
256 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
257 "customer's limit, 20MHz rf(%c) = 0x%x\n",
258 ((rf == 0) ? 'A' : 'B'),
259 rtlefuse->pwrgroup_ht20[rf][channel -
260 1]);
261 }
262
263 if (index < 2)
264 pwr_diff = rtlefuse->txpwr_legacyhtdiff[rf][channel-1];
265 else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20)
266 pwr_diff =
267 rtlefuse->txpwr_ht20diff[rf][channel-1];
268
269 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40)
270 customer_pwr_diff =
271 rtlefuse->pwrgroup_ht40[rf][channel-1];
272 else
273 customer_pwr_diff =
274 rtlefuse->pwrgroup_ht20[rf][channel-1];
275
276 if (pwr_diff > customer_pwr_diff)
277 pwr_diff = 0;
278 else
279 pwr_diff = customer_pwr_diff - pwr_diff;
280
281 for (i = 0; i < 4; i++) {
282 pwr_diff_limit[i] =
283 (u8)((rtlphy->mcs_txpwrlevel_origoffset
284 [chnlgroup][index + (rf ? 8 : 0)] &
285 (0x7f << (i * 8))) >> (i * 8));
286
287 if (pwr_diff_limit[i] > pwr_diff)
288 pwr_diff_limit[i] = pwr_diff;
289 }
290
291 customer_limit = (pwr_diff_limit[3] << 24) |
292 (pwr_diff_limit[2] << 16) |
293 (pwr_diff_limit[1] << 8) | (pwr_diff_limit[0]);
294
295 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
296 "Customer's limit rf(%c) = 0x%x\n",
297 ((rf == 0) ? 'A' : 'B'), customer_limit);
298
299 writeval = customer_limit +
300 ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
301
302 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
303 "Customer, writeval rf(%c)= 0x%x\n",
304 ((rf == 0) ? 'A' : 'B'), writeval);
305 break;
306 default:
307 chnlgroup = 0;
308 writeval =
309 rtlphy->mcs_txpwrlevel_origoffset[chnlgroup]
310 [index + (rf ? 8 : 0)]
311 + ((index < 2) ? powerbase0[rf] : powerbase1[rf]);
312
313 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
314 "RTK better performance, writeval rf(%c) = 0x%x\n",
315 ((rf == 0) ? 'A' : 'B'), writeval);
316 break;
317 }
318
319 if (rtlpriv->dm.dynamic_txhighpower_lvl == TXHIGHPWRLEVEL_BT1)
320 writeval = writeval - 0x06060606;
321 else if (rtlpriv->dm.dynamic_txhighpower_lvl ==
322 TXHIGHPWRLEVEL_BT2)
323 writeval = writeval - 0x0c0c0c0c;
324 *(p_outwriteval + rf) = writeval;
325 }
326}
327
328static void _rtl8821ae_write_ofdm_power_reg(struct ieee80211_hw *hw,
329 u8 index, u32 *pvalue)
330{
331 struct rtl_priv *rtlpriv = rtl_priv(hw);
332 u16 regoffset_a[6] = {
333 RTXAGC_A_OFDM18_OFDM6, RTXAGC_A_OFDM54_OFDM24,
334 RTXAGC_A_MCS03_MCS00, RTXAGC_A_MCS07_MCS04,
335 RTXAGC_A_MCS11_MCS08, RTXAGC_A_MCS15_MCS12
336 };
337 u16 regoffset_b[6] = {
338 RTXAGC_B_OFDM18_OFDM6, RTXAGC_B_OFDM54_OFDM24,
339 RTXAGC_B_MCS03_MCS00, RTXAGC_B_MCS07_MCS04,
340 RTXAGC_B_MCS11_MCS08, RTXAGC_B_MCS15_MCS12
341 };
342 u8 i, rf, pwr_val[4];
343 u32 writeval;
344 u16 regoffset;
345
346 for (rf = 0; rf < 2; rf++) {
347 writeval = pvalue[rf];
348 for (i = 0; i < 4; i++) {
349 pwr_val[i] = (u8)((writeval & (0x7f <<
350 (i * 8))) >> (i * 8));
351
352 if (pwr_val[i] > RF6052_MAX_TX_PWR)
353 pwr_val[i] = RF6052_MAX_TX_PWR;
354 }
355 writeval = (pwr_val[3] << 24) | (pwr_val[2] << 16) |
356 (pwr_val[1] << 8) | pwr_val[0];
357
358 if (rf == 0)
359 regoffset = regoffset_a[index];
360 else
361 regoffset = regoffset_b[index];
362 rtl_set_bbreg(hw, regoffset, MASKDWORD, writeval);
363
364 RTPRINT(rtlpriv, FPHY, PHY_TXPWR,
365 "Set 0x%x = %08x\n", regoffset, writeval);
366 }
367}
368
369void rtl8821ae_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
370 u8 *ppowerlevel_ofdm,
371 u8 *ppowerlevel_bw20,
372 u8 *ppowerlevel_bw40,
373 u8 channel)
374{
375 u32 writeval[2], powerbase0[2], powerbase1[2];
376 u8 index;
377 u8 direction;
378 u32 pwrtrac_value;
379
380 rtl8821ae_phy_get_power_base(hw, ppowerlevel_ofdm,
381 ppowerlevel_bw20,
382 ppowerlevel_bw40,
383 channel,
384 &powerbase0[0],
385 &powerbase1[0]);
386
387 rtl8821ae_dm_txpower_track_adjust(hw, 1, &direction, &pwrtrac_value);
388
389 for (index = 0; index < 6; index++) {
390 get_txpower_writeval_by_regulatory(hw, channel, index,
391 &powerbase0[0],
392 &powerbase1[0],
393 &writeval[0]);
394 if (direction == 1) {
395 writeval[0] += pwrtrac_value;
396 writeval[1] += pwrtrac_value;
397 } else if (direction == 2) {
398 writeval[0] -= pwrtrac_value;
399 writeval[1] -= pwrtrac_value;
400 }
401 _rtl8821ae_write_ofdm_power_reg(hw, index, &writeval[0]);
402 }
403}
404
405bool rtl8821ae_phy_rf6052_config(struct ieee80211_hw *hw)
406{
407 struct rtl_priv *rtlpriv = rtl_priv(hw);
408 struct rtl_phy *rtlphy = &rtlpriv->phy;
409
410 if (rtlphy->rf_type == RF_1T1R)
411 rtlphy->num_total_rfpath = 1;
412 else
413 rtlphy->num_total_rfpath = 2;
414
415 return _rtl8821ae_phy_rf6052_config_parafile(hw);
416}
417
418static bool _rtl8821ae_phy_rf6052_config_parafile(struct ieee80211_hw *hw)
419{
420 struct rtl_priv *rtlpriv = rtl_priv(hw);
421 struct rtl_phy *rtlphy = &rtlpriv->phy;
422 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
423 u8 rfpath;
424 bool rtstatus = true;
425
426 for (rfpath = 0; rfpath < rtlphy->num_total_rfpath; rfpath++) {
427 switch (rfpath) {
428 case RF90_PATH_A: {
429 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
430 rtstatus =
431 rtl8812ae_phy_config_rf_with_headerfile(hw,
432 (enum radio_path)rfpath);
433 else
434 rtstatus =
435 rtl8821ae_phy_config_rf_with_headerfile(hw,
436 (enum radio_path)rfpath);
437 break;
438 }
439 case RF90_PATH_B:
440 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
441 rtstatus =
442 rtl8812ae_phy_config_rf_with_headerfile(hw,
443 (enum radio_path)rfpath);
444 else
445 rtstatus =
446 rtl8821ae_phy_config_rf_with_headerfile(hw,
447 (enum radio_path)rfpath);
448 break;
449 case RF90_PATH_C:
450 break;
451 case RF90_PATH_D:
452 break;
453 }
454
455 if (!rtstatus) {
456 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
457 "Radio[%d] Fail!!", rfpath);
458 return false;
459 }
460 }
461
462 /*put arrays in dm.c*/
463 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "\n");
464 return rtstatus;
465}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h
new file mode 100644
index 000000000000..d9582ee1c335
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/rf.h
@@ -0,0 +1,43 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_RF_H__
27#define __RTL8821AE_RF_H__
28
29#define RF6052_MAX_TX_PWR 0x3F
30#define RF6052_MAX_REG 0x3F
31
32void rtl8821ae_phy_rf6052_set_bandwidth(struct ieee80211_hw *hw,
33 u8 bandwidth);
34void rtl8821ae_phy_rf6052_set_cck_txpower(struct ieee80211_hw *hw,
35 u8 *ppowerlevel);
36void rtl8821ae_phy_rf6052_set_ofdm_txpower(struct ieee80211_hw *hw,
37 u8 *ppowerlevel_ofdm,
38 u8 *ppowerlevel_bw20,
39 u8 *ppowerlevel_bw40,
40 u8 channel);
41bool rtl8821ae_phy_rf6052_config(struct ieee80211_hw *hw);
42
43#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
new file mode 100644
index 000000000000..fc92dd6a0d07
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.c
@@ -0,0 +1,484 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../core.h"
28#include "../pci.h"
29#include "reg.h"
30#include "def.h"
31#include "phy.h"
32#include "dm.h"
33#include "hw.h"
34#include "fw.h"
35#include "sw.h"
36#include "trx.h"
37#include "led.h"
38#include "table.h"
39#include "../btcoexist/rtl_btc.h"
40
41#include <linux/vmalloc.h>
42#include <linux/module.h>
43
44static void rtl8821ae_init_aspm_vars(struct ieee80211_hw *hw)
45{
46 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
47
48 /*close ASPM for AMD defaultly */
49 rtlpci->const_amdpci_aspm = 0;
50
51 /**
52 * ASPM PS mode.
53 * 0 - Disable ASPM,
54 * 1 - Enable ASPM without Clock Req,
55 * 2 - Enable ASPM with Clock Req,
56 * 3 - Alwyas Enable ASPM with Clock Req,
57 * 4 - Always Enable ASPM without Clock Req.
58 * set defult to RTL8192CE:3 RTL8192E:2
59 */
60 rtlpci->const_pci_aspm = 3;
61
62 /*Setting for PCI-E device */
63 rtlpci->const_devicepci_aspm_setting = 0x03;
64
65 /*Setting for PCI-E bridge */
66 rtlpci->const_hostpci_aspm_setting = 0x02;
67
68 /**
69 * In Hw/Sw Radio Off situation.
70 * 0 - Default,
71 * 1 - From ASPM setting without low Mac Pwr,
72 * 2 - From ASPM setting with low Mac Pwr,
73 * 3 - Bus D3
74 * set default to RTL8192CE:0 RTL8192SE:2
75 */
76 rtlpci->const_hwsw_rfoff_d3 = 0;
77
78 /**
79 * This setting works for those device with
80 * backdoor ASPM setting such as EPHY setting.
81 * 0 - Not support ASPM,
82 * 1 - Support ASPM,
83 * 2 - According to chipset.
84 */
85 rtlpci->const_support_pciaspm = 1;
86}
87
88static void load_wowlan_fw(struct rtl_priv *rtlpriv)
89{
90 /* callback routine to load wowlan firmware after main fw has
91 * been loaded
92 */
93 const struct firmware *wowlan_firmware;
94 char *fw_name = NULL;
95 int err;
96
97 /* for wowlan firmware buf */
98 rtlpriv->rtlhal.wowlan_firmware = vzalloc(0x8000);
99 if (!rtlpriv->rtlhal.wowlan_firmware) {
100 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
101 "Can't alloc buffer for wowlan fw.\n");
102 return;
103 }
104
105 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8821AE)
106 fw_name = "rtlwifi/rtl8821aefw_wowlan.bin";
107 else
108 fw_name = "rtlwifi/rtl8812aefw_wowlan.bin";
109 err = request_firmware(&wowlan_firmware, fw_name, rtlpriv->io.dev);
110 if (err) {
111 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
112 "Failed to request wowlan firmware!\n");
113 goto error;
114 }
115
116 if (wowlan_firmware->size > 0x8000) {
117 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
118 "Wowlan Firmware is too big!\n");
119 goto error;
120 }
121
122 memcpy(rtlpriv->rtlhal.wowlan_firmware, wowlan_firmware->data,
123 wowlan_firmware->size);
124 rtlpriv->rtlhal.wowlan_fwsize = wowlan_firmware->size;
125 release_firmware(wowlan_firmware);
126
127 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "WOWLAN FirmwareDownload OK\n");
128 return;
129error:
130 release_firmware(wowlan_firmware);
131 vfree(rtlpriv->rtlhal.wowlan_firmware);
132}
133
134/*InitializeVariables8812E*/
135int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw)
136{
137 int err = 0;
138 struct rtl_priv *rtlpriv = rtl_priv(hw);
139 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
140 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
141 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
142
143 rtl8821ae_bt_reg_init(hw);
144 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
145 rtlpriv->btcoexist.btc_ops = rtl_btc_get_ops_pointer();
146
147 rtlpriv->dm.dm_initialgain_enable = 1;
148 rtlpriv->dm.dm_flag = 0;
149 rtlpriv->dm.disable_framebursting = 0;
150 rtlpriv->dm.thermalvalue = 0;
151 rtlpci->transmit_config = CFENDFORM | BIT(15) | BIT(24) | BIT(25);
152
153 mac->ht_enable = true;
154 mac->ht_cur_stbc = 0;
155 mac->ht_stbc_cap = 0;
156 mac->vht_cur_ldpc = 0;
157 mac->vht_ldpc_cap = 0;
158 mac->vht_cur_stbc = 0;
159 mac->vht_stbc_cap = 0;
160
161 rtlpriv->rtlhal.current_bandtype = BAND_ON_2_4G;
162 /*following 2 is for register 5G band, refer to _rtl_init_mac80211()*/
163 rtlpriv->rtlhal.bandset = BAND_ON_BOTH;
164 rtlpriv->rtlhal.macphymode = SINGLEMAC_SINGLEPHY;
165
166 rtlpci->receive_config = (RCR_APPFCS |
167 RCR_APP_MIC |
168 RCR_APP_ICV |
169 RCR_APP_PHYST_RXFF |
170 RCR_NONQOS_VHT |
171 RCR_HTC_LOC_CTRL |
172 RCR_AMF |
173 RCR_ACF |
174 /*This bit controls the PS-Poll packet filter.*/
175 RCR_ADF |
176 RCR_AICV |
177 RCR_ACRC32 |
178 RCR_AB |
179 RCR_AM |
180 RCR_APM |
181 0);
182
183 rtlpci->irq_mask[0] =
184 (u32)(IMR_PSTIMEOUT |
185 IMR_GTINT3 |
186 IMR_HSISR_IND_ON_INT |
187 IMR_C2HCMD |
188 IMR_HIGHDOK |
189 IMR_MGNTDOK |
190 IMR_BKDOK |
191 IMR_BEDOK |
192 IMR_VIDOK |
193 IMR_VODOK |
194 IMR_RDU |
195 IMR_ROK |
196 0);
197
198 rtlpci->irq_mask[1] =
199 (u32)(IMR_RXFOVW |
200 IMR_TXFOVW |
201 0);
202 rtlpci->sys_irq_mask = (u32)(HSIMR_PDN_INT_EN |
203 HSIMR_RON_INT_EN |
204 0);
205 /* for WOWLAN */
206 rtlpriv->psc.wo_wlan_mode = WAKE_ON_MAGIC_PACKET |
207 WAKE_ON_PATTERN_MATCH;
208
209 /* for debug level */
210 rtlpriv->dbg.global_debuglevel = rtlpriv->cfg->mod_params->debug;
211 /* for LPS & IPS */
212 rtlpriv->psc.inactiveps = rtlpriv->cfg->mod_params->inactiveps;
213 rtlpriv->psc.swctrl_lps = rtlpriv->cfg->mod_params->swctrl_lps;
214 rtlpriv->psc.fwctrl_lps = rtlpriv->cfg->mod_params->fwctrl_lps;
215 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
216 if (rtlpriv->cfg->mod_params->disable_watchdog)
217 pr_info("watchdog disabled\n");
218 rtlpriv->psc.reg_fwctrl_lps = 3;
219 rtlpriv->psc.reg_max_lps_awakeintvl = 5;
220 rtlpci->msi_support = rtlpriv->cfg->mod_params->msi_support;
221
222 /* for ASPM, you can close aspm through
223 * set const_support_pciaspm = 0
224 */
225 rtl8821ae_init_aspm_vars(hw);
226
227 if (rtlpriv->psc.reg_fwctrl_lps == 1)
228 rtlpriv->psc.fwctrl_psmode = FW_PS_MIN_MODE;
229 else if (rtlpriv->psc.reg_fwctrl_lps == 2)
230 rtlpriv->psc.fwctrl_psmode = FW_PS_MAX_MODE;
231 else if (rtlpriv->psc.reg_fwctrl_lps == 3)
232 rtlpriv->psc.fwctrl_psmode = FW_PS_DTIM_MODE;
233
234 rtlpriv->rtl_fw_second_cb = load_wowlan_fw;
235 /* for firmware buf */
236 rtlpriv->rtlhal.pfirmware = vzalloc(0x8000);
237 if (!rtlpriv->rtlhal.pfirmware) {
238 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
239 "Can't alloc buffer for fw.\n");
240 return 1;
241 }
242
243 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)
244 rtlpriv->cfg->fw_name = "rtlwifi/rtl8812aefw.bin";
245 else
246 rtlpriv->cfg->fw_name = "rtlwifi/rtl8821aefw.bin";
247
248 rtlpriv->max_fw_size = 0x8000;
249 pr_info("Using firmware %s\n", rtlpriv->cfg->fw_name);
250 err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name,
251 rtlpriv->io.dev, GFP_KERNEL, hw,
252 rtl_fw_cb);
253 if (err) {
254 RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
255 "Failed to request firmware!\n");
256 return 1;
257 }
258 return 0;
259}
260
261void rtl8821ae_deinit_sw_vars(struct ieee80211_hw *hw)
262{
263 struct rtl_priv *rtlpriv = rtl_priv(hw);
264
265 if (rtlpriv->rtlhal.pfirmware) {
266 vfree(rtlpriv->rtlhal.pfirmware);
267 rtlpriv->rtlhal.pfirmware = NULL;
268 }
269#if (USE_SPECIFIC_FW_TO_SUPPORT_WOWLAN == 1)
270 if (rtlpriv->rtlhal.wowlan_firmware) {
271 vfree(rtlpriv->rtlhal.wowlan_firmware);
272 rtlpriv->rtlhal.wowlan_firmware = NULL;
273 }
274#endif
275}
276
277/* get bt coexist status */
278bool rtl8821ae_get_btc_status(void)
279{
280 return true;
281}
282
283static struct rtl_hal_ops rtl8821ae_hal_ops = {
284 .init_sw_vars = rtl8821ae_init_sw_vars,
285 .deinit_sw_vars = rtl8821ae_deinit_sw_vars,
286 .read_eeprom_info = rtl8821ae_read_eeprom_info,
287 .interrupt_recognized = rtl8821ae_interrupt_recognized,
288 .hw_init = rtl8821ae_hw_init,
289 .hw_disable = rtl8821ae_card_disable,
290 .hw_suspend = rtl8821ae_suspend,
291 .hw_resume = rtl8821ae_resume,
292 .enable_interrupt = rtl8821ae_enable_interrupt,
293 .disable_interrupt = rtl8821ae_disable_interrupt,
294 .set_network_type = rtl8821ae_set_network_type,
295 .set_chk_bssid = rtl8821ae_set_check_bssid,
296 .set_qos = rtl8821ae_set_qos,
297 .set_bcn_reg = rtl8821ae_set_beacon_related_registers,
298 .set_bcn_intv = rtl8821ae_set_beacon_interval,
299 .update_interrupt_mask = rtl8821ae_update_interrupt_mask,
300 .get_hw_reg = rtl8821ae_get_hw_reg,
301 .set_hw_reg = rtl8821ae_set_hw_reg,
302 .update_rate_tbl = rtl8821ae_update_hal_rate_tbl,
303 .fill_tx_desc = rtl8821ae_tx_fill_desc,
304 .fill_tx_cmddesc = rtl8821ae_tx_fill_cmddesc,
305 .query_rx_desc = rtl8821ae_rx_query_desc,
306 .set_channel_access = rtl8821ae_update_channel_access_setting,
307 .radio_onoff_checking = rtl8821ae_gpio_radio_on_off_checking,
308 .set_bw_mode = rtl8821ae_phy_set_bw_mode,
309 .switch_channel = rtl8821ae_phy_sw_chnl,
310 .dm_watchdog = rtl8821ae_dm_watchdog,
311 .scan_operation_backup = rtl8821ae_phy_scan_operation_backup,
312 .set_rf_power_state = rtl8821ae_phy_set_rf_power_state,
313 .led_control = rtl8821ae_led_control,
314 .set_desc = rtl8821ae_set_desc,
315 .get_desc = rtl8821ae_get_desc,
316 .is_tx_desc_closed = rtl8821ae_is_tx_desc_closed,
317 .tx_polling = rtl8821ae_tx_polling,
318 .enable_hw_sec = rtl8821ae_enable_hw_security_config,
319 .set_key = rtl8821ae_set_key,
320 .init_sw_leds = rtl8821ae_init_sw_leds,
321 .get_bbreg = rtl8821ae_phy_query_bb_reg,
322 .set_bbreg = rtl8821ae_phy_set_bb_reg,
323 .get_rfreg = rtl8821ae_phy_query_rf_reg,
324 .set_rfreg = rtl8821ae_phy_set_rf_reg,
325 .fill_h2c_cmd = rtl8821ae_fill_h2c_cmd,
326 .get_btc_status = rtl8821ae_get_btc_status,
327 .rx_command_packet = rtl8821ae_rx_command_packet,
328 .add_wowlan_pattern = rtl8821ae_add_wowlan_pattern,
329};
330
331static struct rtl_mod_params rtl8821ae_mod_params = {
332 .sw_crypto = false,
333 .inactiveps = true,
334 .swctrl_lps = false,
335 .fwctrl_lps = true,
336 .msi_support = true,
337 .debug = DBG_EMERG,
338 .disable_watchdog = 0,
339};
340
341static struct rtl_hal_cfg rtl8821ae_hal_cfg = {
342 .bar_id = 2,
343 .write_readback = true,
344 .name = "rtl8821ae_pci",
345 .fw_name = "rtlwifi/rtl8821aefw.bin",
346 .ops = &rtl8821ae_hal_ops,
347 .mod_params = &rtl8821ae_mod_params,
348 .maps[SYS_ISO_CTRL] = REG_SYS_ISO_CTRL,
349 .maps[SYS_FUNC_EN] = REG_SYS_FUNC_EN,
350 .maps[SYS_CLK] = REG_SYS_CLKR,
351 .maps[MAC_RCR_AM] = AM,
352 .maps[MAC_RCR_AB] = AB,
353 .maps[MAC_RCR_ACRC32] = ACRC32,
354 .maps[MAC_RCR_ACF] = ACF,
355 .maps[MAC_RCR_AAP] = AAP,
356 .maps[MAC_HIMR] = REG_HIMR,
357 .maps[MAC_HIMRE] = REG_HIMRE,
358
359 .maps[EFUSE_ACCESS] = REG_EFUSE_ACCESS,
360
361 .maps[EFUSE_TEST] = REG_EFUSE_TEST,
362 .maps[EFUSE_CTRL] = REG_EFUSE_CTRL,
363 .maps[EFUSE_CLK] = 0,
364 .maps[EFUSE_CLK_CTRL] = REG_EFUSE_CTRL,
365 .maps[EFUSE_PWC_EV12V] = PWC_EV12V,
366 .maps[EFUSE_FEN_ELDR] = FEN_ELDR,
367 .maps[EFUSE_LOADER_CLK_EN] = LOADER_CLK_EN,
368 .maps[EFUSE_ANA8M] = ANA8M,
369 .maps[EFUSE_HWSET_MAX_SIZE] = HWSET_MAX_SIZE,
370 .maps[EFUSE_MAX_SECTION_MAP] = EFUSE_MAX_SECTION,
371 .maps[EFUSE_REAL_CONTENT_SIZE] = EFUSE_REAL_CONTENT_LEN,
372 .maps[EFUSE_OOB_PROTECT_BYTES_LEN] = EFUSE_OOB_PROTECT_BYTES,
373
374 .maps[RWCAM] = REG_CAMCMD,
375 .maps[WCAMI] = REG_CAMWRITE,
376 .maps[RCAMO] = REG_CAMREAD,
377 .maps[CAMDBG] = REG_CAMDBG,
378 .maps[SECR] = REG_SECCFG,
379 .maps[SEC_CAM_NONE] = CAM_NONE,
380 .maps[SEC_CAM_WEP40] = CAM_WEP40,
381 .maps[SEC_CAM_TKIP] = CAM_TKIP,
382 .maps[SEC_CAM_AES] = CAM_AES,
383 .maps[SEC_CAM_WEP104] = CAM_WEP104,
384
385 .maps[RTL_IMR_BCNDMAINT6] = IMR_BCNDMAINT6,
386 .maps[RTL_IMR_BCNDMAINT5] = IMR_BCNDMAINT5,
387 .maps[RTL_IMR_BCNDMAINT4] = IMR_BCNDMAINT4,
388 .maps[RTL_IMR_BCNDMAINT3] = IMR_BCNDMAINT3,
389 .maps[RTL_IMR_BCNDMAINT2] = IMR_BCNDMAINT2,
390 .maps[RTL_IMR_BCNDMAINT1] = IMR_BCNDMAINT1,
391/* .maps[RTL_IMR_BCNDOK8] = IMR_BCNDOK8, */ /*need check*/
392 .maps[RTL_IMR_BCNDOK7] = IMR_BCNDOK7,
393 .maps[RTL_IMR_BCNDOK6] = IMR_BCNDOK6,
394 .maps[RTL_IMR_BCNDOK5] = IMR_BCNDOK5,
395 .maps[RTL_IMR_BCNDOK4] = IMR_BCNDOK4,
396 .maps[RTL_IMR_BCNDOK3] = IMR_BCNDOK3,
397 .maps[RTL_IMR_BCNDOK2] = IMR_BCNDOK2,
398 .maps[RTL_IMR_BCNDOK1] = IMR_BCNDOK1,
399/* .maps[RTL_IMR_TIMEOUT2] = IMR_TIMEOUT2,*/
400/* .maps[RTL_IMR_TIMEOUT1] = IMR_TIMEOUT1,*/
401
402 .maps[RTL_IMR_TXFOVW] = IMR_TXFOVW,
403 .maps[RTL_IMR_PSTIMEOUT] = IMR_PSTIMEOUT,
404 .maps[RTL_IMR_BCNINT] = IMR_BCNDMAINT0,
405 .maps[RTL_IMR_RXFOVW] = IMR_RXFOVW,
406 .maps[RTL_IMR_RDU] = IMR_RDU,
407 .maps[RTL_IMR_ATIMEND] = IMR_ATIMEND,
408 .maps[RTL_IMR_BDOK] = IMR_BCNDOK0,
409 .maps[RTL_IMR_MGNTDOK] = IMR_MGNTDOK,
410 .maps[RTL_IMR_TBDER] = IMR_TBDER,
411 .maps[RTL_IMR_HIGHDOK] = IMR_HIGHDOK,
412 .maps[RTL_IMR_TBDOK] = IMR_TBDOK,
413 .maps[RTL_IMR_BKDOK] = IMR_BKDOK,
414 .maps[RTL_IMR_BEDOK] = IMR_BEDOK,
415 .maps[RTL_IMR_VIDOK] = IMR_VIDOK,
416 .maps[RTL_IMR_VODOK] = IMR_VODOK,
417 .maps[RTL_IMR_ROK] = IMR_ROK,
418 .maps[RTL_IBSS_INT_MASKS] = (IMR_BCNDMAINT0 | IMR_TBDOK | IMR_TBDER),
419
420 .maps[RTL_RC_CCK_RATE1M] = DESC_RATE1M,
421 .maps[RTL_RC_CCK_RATE2M] = DESC_RATE2M,
422 .maps[RTL_RC_CCK_RATE5_5M] = DESC_RATE5_5M,
423 .maps[RTL_RC_CCK_RATE11M] = DESC_RATE11M,
424 .maps[RTL_RC_OFDM_RATE6M] = DESC_RATE6M,
425 .maps[RTL_RC_OFDM_RATE9M] = DESC_RATE9M,
426 .maps[RTL_RC_OFDM_RATE12M] = DESC_RATE12M,
427 .maps[RTL_RC_OFDM_RATE18M] = DESC_RATE18M,
428 .maps[RTL_RC_OFDM_RATE24M] = DESC_RATE24M,
429 .maps[RTL_RC_OFDM_RATE36M] = DESC_RATE36M,
430 .maps[RTL_RC_OFDM_RATE48M] = DESC_RATE48M,
431 .maps[RTL_RC_OFDM_RATE54M] = DESC_RATE54M,
432
433 .maps[RTL_RC_HT_RATEMCS7] = DESC_RATEMCS7,
434 .maps[RTL_RC_HT_RATEMCS15] = DESC_RATEMCS15,
435
436 /*VHT hightest rate*/
437 .maps[RTL_RC_VHT_RATE_1SS_MCS7] = DESC_RATEVHT1SS_MCS7,
438 .maps[RTL_RC_VHT_RATE_1SS_MCS8] = DESC_RATEVHT1SS_MCS8,
439 .maps[RTL_RC_VHT_RATE_1SS_MCS9] = DESC_RATEVHT1SS_MCS9,
440 .maps[RTL_RC_VHT_RATE_2SS_MCS7] = DESC_RATEVHT2SS_MCS7,
441 .maps[RTL_RC_VHT_RATE_2SS_MCS8] = DESC_RATEVHT2SS_MCS8,
442 .maps[RTL_RC_VHT_RATE_2SS_MCS9] = DESC_RATEVHT2SS_MCS9,
443};
444
445static struct pci_device_id rtl8821ae_pci_ids[] = {
446 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8812, rtl8821ae_hal_cfg)},
447 {RTL_PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8821, rtl8821ae_hal_cfg)},
448 {},
449};
450
451MODULE_DEVICE_TABLE(pci, rtl8821ae_pci_ids);
452
453MODULE_AUTHOR("Realtek WlanFAE <wlanfae@realtek.com>");
454MODULE_LICENSE("GPL");
455MODULE_DESCRIPTION("Realtek 8821ae 802.11ac PCI wireless");
456MODULE_FIRMWARE("rtlwifi/rtl8821aefw.bin");
457
458module_param_named(swenc, rtl8821ae_mod_params.sw_crypto, bool, 0444);
459module_param_named(debug, rtl8821ae_mod_params.debug, int, 0444);
460module_param_named(ips, rtl8821ae_mod_params.inactiveps, bool, 0444);
461module_param_named(swlps, rtl8821ae_mod_params.swctrl_lps, bool, 0444);
462module_param_named(fwlps, rtl8821ae_mod_params.fwctrl_lps, bool, 0444);
463module_param_named(msi, rtl8821ae_mod_params.msi_support, bool, 0444);
464module_param_named(disable_watchdog, rtl8821ae_mod_params.disable_watchdog,
465 bool, 0444);
466MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
467MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
468MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
469MODULE_PARM_DESC(fwlps, "Set to 1 to use FW control power save (default 1)\n");
470MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 1)\n");
471MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
472MODULE_PARM_DESC(disable_watchdog, "Set to 1 to disable the watchdog (default 0)\n");
473
474static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
475
476static struct pci_driver rtl8821ae_driver = {
477 .name = KBUILD_MODNAME,
478 .id_table = rtl8821ae_pci_ids,
479 .probe = rtl_pci_probe,
480 .remove = rtl_pci_disconnect,
481 .driver.pm = &rtlwifi_pm_ops,
482};
483
484module_pci_driver(rtl8821ae_driver);
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/sw.h b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.h
new file mode 100644
index 000000000000..d001e7ce3052
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/sw.h
@@ -0,0 +1,34 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_SW_H__
27#define __RTL8821AE_SW_H__
28
29int rtl8821ae_init_sw_vars(struct ieee80211_hw *hw);
30void rtl8821ae_deinit_sw_vars(struct ieee80211_hw *hw);
31void rtl8821ae_init_var_map(struct ieee80211_hw *hw);
32bool rtl8821ae_get_btc_status(void);
33
34#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/table.c b/drivers/net/wireless/rtlwifi/rtl8821ae/table.c
new file mode 100644
index 000000000000..62a0fb76f080
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/table.c
@@ -0,0 +1,4572 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Created on 2010/ 5/18, 1:41
23 *
24 * Larry Finger <Larry.Finger@lwfinger.net>
25 *
26 *****************************************************************************/
27
28#include "table.h"
29u32 RTL8812AE_PHY_REG_ARRAY[] = {
30 0x800, 0x8020D010,
31 0x804, 0x080112E0,
32 0x808, 0x0E028233,
33 0x80C, 0x12131113,
34 0x810, 0x20101263,
35 0x814, 0x020C3D10,
36 0x818, 0x03A00385,
37 0x820, 0x00000000,
38 0x824, 0x00030FE0,
39 0x828, 0x00000000,
40 0x82C, 0x002083DD,
41 0x830, 0x2AAA6C86,
42 0x834, 0x0037A706,
43 0x838, 0x06C89B44,
44 0x83C, 0x0000095B,
45 0x840, 0xC0000001,
46 0x844, 0x40003CDE,
47 0x848, 0x6210FF8B,
48 0x84C, 0x6CFDFFB8,
49 0x850, 0x28874706,
50 0x854, 0x0001520C,
51 0x858, 0x8060E000,
52 0x85C, 0x74210168,
53 0x860, 0x6929C321,
54 0x864, 0x79727432,
55 0x868, 0x8CA7A314,
56 0x86C, 0x338C2878,
57 0x870, 0x03333333,
58 0x874, 0x31602C2E,
59 0x878, 0x00003152,
60 0x87C, 0x000FC000,
61 0x8A0, 0x00000013,
62 0x8A4, 0x7F7F7F7F,
63 0x8A8, 0xA202033E,
64 0x8AC, 0x0FF0FA0A,
65 0x8B0, 0x00000600,
66 0x8B4, 0x000FC080,
67 0x8B8, 0x6C0057FF,
68 0x8BC, 0x4CA520A3,
69 0x8C0, 0x27F00020,
70 0x8C4, 0x00000000,
71 0x8C8, 0x00013169,
72 0x8CC, 0x08248492,
73 0x8D0, 0x0000B800,
74 0x8DC, 0x00000000,
75 0x8D4, 0x940008A0,
76 0x8D8, 0x290B5612,
77 0x8F8, 0x400002C0,
78 0x8FC, 0x00000000,
79 0xFF0F07D8, 0xABCD,
80 0x900, 0x00000701,
81 0xFF0F07D0, 0xCDEF,
82 0x900, 0x00000701,
83 0xCDCDCDCD, 0xCDCD,
84 0x900, 0x00000700,
85 0xFF0F07D8, 0xDEAD,
86 0x90C, 0x00000000,
87 0x910, 0x0000FC00,
88 0x914, 0x00000404,
89 0x918, 0x1C1028C0,
90 0x91C, 0x64B11A1C,
91 0x920, 0xE0767233,
92 0x924, 0x055AA500,
93 0x928, 0x00000004,
94 0x92C, 0xFFFE0000,
95 0x930, 0xFFFFFFFE,
96 0x934, 0x001FFFFF,
97 0x960, 0x00000000,
98 0x964, 0x00000000,
99 0x968, 0x00000000,
100 0x96C, 0x00000000,
101 0x970, 0x801FFFFF,
102 0x978, 0x00000000,
103 0x97C, 0x00000000,
104 0x980, 0x00000000,
105 0x984, 0x00000000,
106 0x988, 0x00000000,
107 0x990, 0x27100000,
108 0x994, 0xFFFF0100,
109 0x998, 0xFFFFFF5C,
110 0x99C, 0xFFFFFFFF,
111 0x9A0, 0x000000FF,
112 0x9A4, 0x00080080,
113 0x9A8, 0x00000000,
114 0x9AC, 0x00000000,
115 0x9B0, 0x81081008,
116 0x9B4, 0x00000000,
117 0x9B8, 0x01081008,
118 0x9BC, 0x01081008,
119 0x9D0, 0x00000000,
120 0x9D4, 0x00000000,
121 0x9D8, 0x00000000,
122 0x9DC, 0x00000000,
123 0x9E4, 0x00000002,
124 0x9E8, 0x000002D5,
125 0xA00, 0x00D047C8,
126 0xA04, 0x01FF000C,
127 0xA08, 0x8C838300,
128 0xA0C, 0x2E7F000F,
129 0xA10, 0x9500BB78,
130 0xA14, 0x11144028,
131 0xA18, 0x00881117,
132 0xA1C, 0x89140F00,
133 0xA20, 0x1A1B0000,
134 0xA24, 0x090E1317,
135 0xA28, 0x00000204,
136 0xA2C, 0x00900000,
137 0xA70, 0x101FFF00,
138 0xA74, 0x00000008,
139 0xA78, 0x00000900,
140 0xA7C, 0x225B0606,
141 0xA80, 0x218075B2,
142 0xA84, 0x001F8C80,
143 0xB00, 0x03100000,
144 0xB04, 0x0000B000,
145 0xB08, 0xAE0201EB,
146 0xB0C, 0x01003207,
147 0xB10, 0x00009807,
148 0xB14, 0x01000000,
149 0xB18, 0x00000002,
150 0xB1C, 0x00000002,
151 0xB20, 0x0000001F,
152 0xB24, 0x03020100,
153 0xB28, 0x07060504,
154 0xB2C, 0x0B0A0908,
155 0xB30, 0x0F0E0D0C,
156 0xB34, 0x13121110,
157 0xB38, 0x17161514,
158 0xB3C, 0x0000003A,
159 0xB40, 0x00000000,
160 0xB44, 0x00000000,
161 0xB48, 0x13000032,
162 0xB4C, 0x48080000,
163 0xB50, 0x00000000,
164 0xB54, 0x00000000,
165 0xB58, 0x00000000,
166 0xB5C, 0x00000000,
167 0xC00, 0x00000007,
168 0xC04, 0x00042020,
169 0xC08, 0x80410231,
170 0xC0C, 0x00000000,
171 0xC10, 0x00000100,
172 0xC14, 0x01000000,
173 0xC1C, 0x40000003,
174 0xC20, 0x12121212,
175 0xC24, 0x12121212,
176 0xC28, 0x12121212,
177 0xC2C, 0x12121212,
178 0xC30, 0x12121212,
179 0xC34, 0x12121212,
180 0xC38, 0x12121212,
181 0xC3C, 0x12121212,
182 0xC40, 0x12121212,
183 0xC44, 0x12121212,
184 0xC48, 0x12121212,
185 0xC4C, 0x12121212,
186 0xC50, 0x00000020,
187 0xC54, 0x0008121C,
188 0xC58, 0x30000C1C,
189 0xC5C, 0x00000058,
190 0xC60, 0x34344443,
191 0xC64, 0x07003333,
192 0xC68, 0x59791979,
193 0xC6C, 0x59795979,
194 0xC70, 0x19795979,
195 0xC74, 0x19795979,
196 0xC78, 0x19791979,
197 0xC7C, 0x19791979,
198 0xC80, 0x19791979,
199 0xC84, 0x19791979,
200 0xC94, 0x0100005C,
201 0xC98, 0x00000000,
202 0xC9C, 0x00000000,
203 0xCA0, 0x00000029,
204 0xCA4, 0x08040201,
205 0xCA8, 0x80402010,
206 0xFF0F0740, 0xABCD,
207 0xCB0, 0x77547717,
208 0xFF0F01C0, 0xCDEF,
209 0xCB0, 0x77547717,
210 0xFF0F02C0, 0xCDEF,
211 0xCB0, 0x77547717,
212 0xFF0F07D8, 0xCDEF,
213 0xCB0, 0x54547710,
214 0xFF0F07D0, 0xCDEF,
215 0xCB0, 0x54547710,
216 0xCDCDCDCD, 0xCDCD,
217 0xCB0, 0x77547777,
218 0xFF0F0740, 0xDEAD,
219 0xCB4, 0x00000077,
220 0xCB8, 0x00508242,
221 0xE00, 0x00000007,
222 0xE04, 0x00042020,
223 0xE08, 0x80410231,
224 0xE0C, 0x00000000,
225 0xE10, 0x00000100,
226 0xE14, 0x01000000,
227 0xE1C, 0x40000003,
228 0xE20, 0x12121212,
229 0xE24, 0x12121212,
230 0xE28, 0x12121212,
231 0xE2C, 0x12121212,
232 0xE30, 0x12121212,
233 0xE34, 0x12121212,
234 0xE38, 0x12121212,
235 0xE3C, 0x12121212,
236 0xE40, 0x12121212,
237 0xE44, 0x12121212,
238 0xE48, 0x12121212,
239 0xE4C, 0x12121212,
240 0xE50, 0x00000020,
241 0xE54, 0x0008121C,
242 0xE58, 0x30000C1C,
243 0xE5C, 0x00000058,
244 0xE60, 0x34344443,
245 0xE64, 0x07003333,
246 0xE68, 0x59791979,
247 0xE6C, 0x59795979,
248 0xE70, 0x19795979,
249 0xE74, 0x19795979,
250 0xE78, 0x19791979,
251 0xE7C, 0x19791979,
252 0xE80, 0x19791979,
253 0xE84, 0x19791979,
254 0xE94, 0x0100005C,
255 0xE98, 0x00000000,
256 0xE9C, 0x00000000,
257 0xEA0, 0x00000029,
258 0xEA4, 0x08040201,
259 0xEA8, 0x80402010,
260 0xFF0F0740, 0xABCD,
261 0xEB0, 0x77547717,
262 0xFF0F01C0, 0xCDEF,
263 0xEB0, 0x77547717,
264 0xFF0F02C0, 0xCDEF,
265 0xEB0, 0x77547717,
266 0xFF0F07D8, 0xCDEF,
267 0xEB0, 0x54547710,
268 0xFF0F07D0, 0xCDEF,
269 0xEB0, 0x54547710,
270 0xCDCDCDCD, 0xCDCD,
271 0xEB0, 0x77547777,
272 0xFF0F0740, 0xDEAD,
273 0xEB4, 0x00000077,
274 0xEB8, 0x00508242,
275};
276
277u32 RTL8821AE_PHY_REG_ARRAY[] = {
278 0x800, 0x0020D090,
279 0x804, 0x080112E0,
280 0x808, 0x0E028211,
281 0x80C, 0x92131111,
282 0x810, 0x20101261,
283 0x814, 0x020C3D10,
284 0x818, 0x03A00385,
285 0x820, 0x00000000,
286 0x824, 0x00030FE0,
287 0x828, 0x00000000,
288 0x82C, 0x002081DD,
289 0x830, 0x2AAA8E24,
290 0x834, 0x0037A706,
291 0x838, 0x06489B44,
292 0x83C, 0x0000095B,
293 0x840, 0xC0000001,
294 0x844, 0x40003CDE,
295 0x848, 0x62103F8B,
296 0x84C, 0x6CFDFFB8,
297 0x850, 0x28874706,
298 0x854, 0x0001520C,
299 0x858, 0x8060E000,
300 0x85C, 0x74210168,
301 0x860, 0x6929C321,
302 0x864, 0x79727432,
303 0x868, 0x8CA7A314,
304 0x86C, 0x888C2878,
305 0x870, 0x08888888,
306 0x874, 0x31612C2E,
307 0x878, 0x00000152,
308 0x87C, 0x000FD000,
309 0x8A0, 0x00000013,
310 0x8A4, 0x7F7F7F7F,
311 0x8A8, 0xA2000338,
312 0x8AC, 0x0FF0FA0A,
313 0x8B4, 0x000FC080,
314 0x8B8, 0x6C10D7FF,
315 0x8BC, 0x0CA52090,
316 0x8C0, 0x1BF00020,
317 0x8C4, 0x00000000,
318 0x8C8, 0x00013169,
319 0x8CC, 0x08248492,
320 0x8D4, 0x940008A0,
321 0x8D8, 0x290B5612,
322 0x8F8, 0x400002C0,
323 0x8FC, 0x00000000,
324 0x900, 0x00000700,
325 0x90C, 0x00000000,
326 0x910, 0x0000FC00,
327 0x914, 0x00000404,
328 0x918, 0x1C1028C0,
329 0x91C, 0x64B11A1C,
330 0x920, 0xE0767233,
331 0x924, 0x055AA500,
332 0x928, 0x00000004,
333 0x92C, 0xFFFE0000,
334 0x930, 0xFFFFFFFE,
335 0x934, 0x001FFFFF,
336 0x960, 0x00000000,
337 0x964, 0x00000000,
338 0x968, 0x00000000,
339 0x96C, 0x00000000,
340 0x970, 0x801FFFFF,
341 0x974, 0x000003FF,
342 0x978, 0x00000000,
343 0x97C, 0x00000000,
344 0x980, 0x00000000,
345 0x984, 0x00000000,
346 0x988, 0x00000000,
347 0x990, 0x27100000,
348 0x994, 0xFFFF0100,
349 0x998, 0xFFFFFF5C,
350 0x99C, 0xFFFFFFFF,
351 0x9A0, 0x000000FF,
352 0x9A4, 0x00480080,
353 0x9A8, 0x00000000,
354 0x9AC, 0x00000000,
355 0x9B0, 0x81081008,
356 0x9B4, 0x01081008,
357 0x9B8, 0x01081008,
358 0x9BC, 0x01081008,
359 0x9D0, 0x00000000,
360 0x9D4, 0x00000000,
361 0x9D8, 0x00000000,
362 0x9DC, 0x00000000,
363 0x9E0, 0x00005D00,
364 0x9E4, 0x00000002,
365 0x9E8, 0x00000001,
366 0xA00, 0x00D047C8,
367 0xA04, 0x01FF000C,
368 0xA08, 0x8C8A8300,
369 0xA0C, 0x2E68000F,
370 0xA10, 0x9500BB78,
371 0xA14, 0x11144028,
372 0xA18, 0x00881117,
373 0xA1C, 0x89140F00,
374 0xA20, 0x1A1B0000,
375 0xA24, 0x090E1317,
376 0xA28, 0x00000204,
377 0xA2C, 0x00900000,
378 0xA70, 0x101FFF00,
379 0xA74, 0x00000008,
380 0xA78, 0x00000900,
381 0xA7C, 0x225B0606,
382 0xA80, 0x21805490,
383 0xA84, 0x001F0000,
384 0xB00, 0x03100040,
385 0xB04, 0x0000B000,
386 0xB08, 0xAE0201EB,
387 0xB0C, 0x01003207,
388 0xB10, 0x00009807,
389 0xB14, 0x01000000,
390 0xB18, 0x00000002,
391 0xB1C, 0x00000002,
392 0xB20, 0x0000001F,
393 0xB24, 0x03020100,
394 0xB28, 0x07060504,
395 0xB2C, 0x0B0A0908,
396 0xB30, 0x0F0E0D0C,
397 0xB34, 0x13121110,
398 0xB38, 0x17161514,
399 0xB3C, 0x0000003A,
400 0xB40, 0x00000000,
401 0xB44, 0x00000000,
402 0xB48, 0x13000032,
403 0xB4C, 0x48080000,
404 0xB50, 0x00000000,
405 0xB54, 0x00000000,
406 0xB58, 0x00000000,
407 0xB5C, 0x00000000,
408 0xC00, 0x00000007,
409 0xC04, 0x00042020,
410 0xC08, 0x80410231,
411 0xC0C, 0x00000000,
412 0xC10, 0x00000100,
413 0xC14, 0x01000000,
414 0xC1C, 0x40000003,
415 0xC20, 0x2C2C2C2C,
416 0xC24, 0x30303030,
417 0xC28, 0x30303030,
418 0xC2C, 0x2C2C2C2C,
419 0xC30, 0x2C2C2C2C,
420 0xC34, 0x2C2C2C2C,
421 0xC38, 0x2C2C2C2C,
422 0xC3C, 0x2A2A2A2A,
423 0xC40, 0x2A2A2A2A,
424 0xC44, 0x2A2A2A2A,
425 0xC48, 0x2A2A2A2A,
426 0xC4C, 0x2A2A2A2A,
427 0xC50, 0x00000020,
428 0xC54, 0x001C1208,
429 0xC58, 0x30000C1C,
430 0xC5C, 0x00000058,
431 0xC60, 0x34344443,
432 0xC64, 0x07003333,
433 0xC68, 0x19791979,
434 0xC6C, 0x19791979,
435 0xC70, 0x19791979,
436 0xC74, 0x19791979,
437 0xC78, 0x19791979,
438 0xC7C, 0x19791979,
439 0xC80, 0x19791979,
440 0xC84, 0x19791979,
441 0xC94, 0x0100005C,
442 0xC98, 0x00000000,
443 0xC9C, 0x00000000,
444 0xCA0, 0x00000029,
445 0xCA4, 0x08040201,
446 0xCA8, 0x80402010,
447 0xCB0, 0x77775747,
448 0xCB4, 0x10000077,
449 0xCB8, 0x00508240,
450};
451
452u32 RTL8812AE_PHY_REG_ARRAY_PG[] = {
453 0, 0, 0, 0x00000c20, 0xffffffff, 0x34363840,
454 0, 0, 0, 0x00000c24, 0xffffffff, 0x42424444,
455 0, 0, 0, 0x00000c28, 0xffffffff, 0x30323638,
456 0, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444,
457 0, 0, 0, 0x00000c30, 0xffffffff, 0x28303236,
458 0, 0, 1, 0x00000c34, 0xffffffff, 0x38404242,
459 0, 0, 1, 0x00000c38, 0xffffffff, 0x26283034,
460 0, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444,
461 0, 0, 0, 0x00000c40, 0xffffffff, 0x28303236,
462 0, 0, 0, 0x00000c44, 0xffffffff, 0x42422426,
463 0, 0, 1, 0x00000c48, 0xffffffff, 0x30343840,
464 0, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,
465 0, 1, 0, 0x00000e20, 0xffffffff, 0x34363840,
466 0, 1, 0, 0x00000e24, 0xffffffff, 0x42424444,
467 0, 1, 0, 0x00000e28, 0xffffffff, 0x30323638,
468 0, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444,
469 0, 1, 0, 0x00000e30, 0xffffffff, 0x28303236,
470 0, 1, 1, 0x00000e34, 0xffffffff, 0x38404242,
471 0, 1, 1, 0x00000e38, 0xffffffff, 0x26283034,
472 0, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444,
473 0, 1, 0, 0x00000e40, 0xffffffff, 0x28303236,
474 0, 1, 0, 0x00000e44, 0xffffffff, 0x42422426,
475 0, 1, 1, 0x00000e48, 0xffffffff, 0x30343840,
476 0, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628,
477 1, 0, 0, 0x00000c24, 0xffffffff, 0x42424444,
478 1, 0, 0, 0x00000c28, 0xffffffff, 0x30323640,
479 1, 0, 0, 0x00000c2c, 0xffffffff, 0x40424444,
480 1, 0, 0, 0x00000c30, 0xffffffff, 0x28303236,
481 1, 0, 1, 0x00000c34, 0xffffffff, 0x38404242,
482 1, 0, 1, 0x00000c38, 0xffffffff, 0x26283034,
483 1, 0, 0, 0x00000c3c, 0xffffffff, 0x40424444,
484 1, 0, 0, 0x00000c40, 0xffffffff, 0x28303236,
485 1, 0, 0, 0x00000c44, 0xffffffff, 0x42422426,
486 1, 0, 1, 0x00000c48, 0xffffffff, 0x30343840,
487 1, 0, 1, 0x00000c4c, 0xffffffff, 0x22242628,
488 1, 1, 0, 0x00000e24, 0xffffffff, 0x42424444,
489 1, 1, 0, 0x00000e28, 0xffffffff, 0x30323640,
490 1, 1, 0, 0x00000e2c, 0xffffffff, 0x40424444,
491 1, 1, 0, 0x00000e30, 0xffffffff, 0x28303236,
492 1, 1, 1, 0x00000e34, 0xffffffff, 0x38404242,
493 1, 1, 1, 0x00000e38, 0xffffffff, 0x26283034,
494 1, 1, 0, 0x00000e3c, 0xffffffff, 0x40424444,
495 1, 1, 0, 0x00000e40, 0xffffffff, 0x28303236,
496 1, 1, 0, 0x00000e44, 0xffffffff, 0x42422426,
497 1, 1, 1, 0x00000e48, 0xffffffff, 0x30343840,
498 1, 1, 1, 0x00000e4c, 0xffffffff, 0x22242628
499};
500
501u32 RTL8821AE_PHY_REG_ARRAY_PG[] = {
502 0, 0, 0, 0x00000c20, 0xffffffff, 0x32343638,
503 0, 0, 0, 0x00000c24, 0xffffffff, 0x36363838,
504 0, 0, 0, 0x00000c28, 0xffffffff, 0x28303234,
505 0, 0, 0, 0x00000c2c, 0xffffffff, 0x34363838,
506 0, 0, 0, 0x00000c30, 0xffffffff, 0x26283032,
507 0, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636,
508 0, 0, 0, 0x00000c40, 0xffffffff, 0x24262830,
509 0, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022,
510 1, 0, 0, 0x00000c24, 0xffffffff, 0x34343636,
511 1, 0, 0, 0x00000c28, 0xffffffff, 0x26283032,
512 1, 0, 0, 0x00000c2c, 0xffffffff, 0x32343636,
513 1, 0, 0, 0x00000c30, 0xffffffff, 0x24262830,
514 1, 0, 0, 0x00000c3c, 0xffffffff, 0x32343636,
515 1, 0, 0, 0x00000c40, 0xffffffff, 0x24262830,
516 1, 0, 0, 0x00000c44, 0x0000ffff, 0x00002022
517};
518
519u32 RTL8812AE_RADIOA_ARRAY[] = {
520 0x000, 0x00010000,
521 0x018, 0x0001712A,
522 0x056, 0x00051CF2,
523 0x066, 0x00040000,
524 0x01E, 0x00080000,
525 0x089, 0x00000080,
526 0xFF0F0740, 0xABCD,
527 0x086, 0x00014B38,
528 0xFF0F02C0, 0xCDEF,
529 0x086, 0x00014B38,
530 0xFF0F01C0, 0xCDEF,
531 0x086, 0x00014B38,
532 0xFF0F07D8, 0xCDEF,
533 0x086, 0x00014B3A,
534 0xFF0F07D0, 0xCDEF,
535 0x086, 0x00014B3A,
536 0xCDCDCDCD, 0xCDCD,
537 0x086, 0x00014B38,
538 0xFF0F0740, 0xDEAD,
539 0x0B1, 0x0001FC1A,
540 0x0B3, 0x000F0810,
541 0x0B4, 0x0001A78D,
542 0x0BA, 0x00086180,
543 0x018, 0x00000006,
544 0x0EF, 0x00002000,
545 0xFF0F07D8, 0xABCD,
546 0x03B, 0x0003F218,
547 0x03B, 0x00030A58,
548 0x03B, 0x0002FA58,
549 0x03B, 0x00022590,
550 0x03B, 0x0001FA50,
551 0x03B, 0x00010248,
552 0x03B, 0x00008240,
553 0xFF0F07D0, 0xCDEF,
554 0x03B, 0x0003F218,
555 0x03B, 0x00030A58,
556 0x03B, 0x0002FA58,
557 0x03B, 0x00022590,
558 0x03B, 0x0001FA50,
559 0x03B, 0x00010248,
560 0x03B, 0x00008240,
561 0xCDCDCDCD, 0xCDCD,
562 0x03B, 0x00038A58,
563 0x03B, 0x00037A58,
564 0x03B, 0x0002A590,
565 0x03B, 0x00027A50,
566 0x03B, 0x00018248,
567 0x03B, 0x00010240,
568 0x03B, 0x00008240,
569 0xFF0F07D8, 0xDEAD,
570 0x0EF, 0x00000100,
571 0xFF0F07D8, 0xABCD,
572 0x034, 0x0000A4EE,
573 0x034, 0x00009076,
574 0x034, 0x00008073,
575 0x034, 0x00007070,
576 0x034, 0x0000606D,
577 0x034, 0x0000506A,
578 0x034, 0x00004049,
579 0x034, 0x00003046,
580 0x034, 0x00002028,
581 0x034, 0x00001025,
582 0x034, 0x00000022,
583 0xCDCDCDCD, 0xCDCD,
584 0x034, 0x0000ADF4,
585 0x034, 0x00009DF1,
586 0x034, 0x00008DEE,
587 0x034, 0x00007DEB,
588 0x034, 0x00006DE8,
589 0x034, 0x00005CEC,
590 0x034, 0x00004CE9,
591 0x034, 0x000034EA,
592 0x034, 0x000024E7,
593 0x034, 0x0000146B,
594 0x034, 0x0000006D,
595 0xFF0F07D8, 0xDEAD,
596 0x0EF, 0x00000000,
597 0x0EF, 0x000020A2,
598 0x0DF, 0x00000080,
599 0x035, 0x00000192,
600 0x035, 0x00008192,
601 0x035, 0x00010192,
602 0x036, 0x00000024,
603 0x036, 0x00008024,
604 0x036, 0x00010024,
605 0x036, 0x00018024,
606 0x0EF, 0x00000000,
607 0x051, 0x00000C21,
608 0x052, 0x000006D9,
609 0x053, 0x000FC649,
610 0x054, 0x0000017E,
611 0x0EF, 0x00000002,
612 0x008, 0x00008400,
613 0x018, 0x0001712A,
614 0x0EF, 0x00001000,
615 0x03A, 0x00000080,
616 0x03B, 0x0003A02C,
617 0x03C, 0x00004000,
618 0x03A, 0x00000400,
619 0x03B, 0x0003202C,
620 0x03C, 0x00010000,
621 0x03A, 0x000000A0,
622 0x03B, 0x0002B064,
623 0x03C, 0x00004000,
624 0x03A, 0x000000D8,
625 0x03B, 0x00023070,
626 0x03C, 0x00004000,
627 0x03A, 0x00000468,
628 0x03B, 0x0001B870,
629 0x03C, 0x00010000,
630 0x03A, 0x00000098,
631 0x03B, 0x00012085,
632 0x03C, 0x000E4000,
633 0x03A, 0x00000418,
634 0x03B, 0x0000A080,
635 0x03C, 0x000F0000,
636 0x03A, 0x00000418,
637 0x03B, 0x00002080,
638 0x03C, 0x00010000,
639 0x03A, 0x00000080,
640 0x03B, 0x0007A02C,
641 0x03C, 0x00004000,
642 0x03A, 0x00000400,
643 0x03B, 0x0007202C,
644 0x03C, 0x00010000,
645 0x03A, 0x000000A0,
646 0x03B, 0x0006B064,
647 0x03C, 0x00004000,
648 0x03A, 0x000000D8,
649 0x03B, 0x00023070,
650 0x03C, 0x00004000,
651 0x03A, 0x00000468,
652 0x03B, 0x0005B870,
653 0x03C, 0x00010000,
654 0x03A, 0x00000098,
655 0x03B, 0x00052085,
656 0x03C, 0x000E4000,
657 0x03A, 0x00000418,
658 0x03B, 0x0004A080,
659 0x03C, 0x000F0000,
660 0x03A, 0x00000418,
661 0x03B, 0x00042080,
662 0x03C, 0x00010000,
663 0x03A, 0x00000080,
664 0x03B, 0x000BA02C,
665 0x03C, 0x00004000,
666 0x03A, 0x00000400,
667 0x03B, 0x000B202C,
668 0x03C, 0x00010000,
669 0x03A, 0x000000A0,
670 0x03B, 0x000AB064,
671 0x03C, 0x00004000,
672 0x03A, 0x000000D8,
673 0x03B, 0x000A3070,
674 0x03C, 0x00004000,
675 0x03A, 0x00000468,
676 0x03B, 0x0009B870,
677 0x03C, 0x00010000,
678 0x03A, 0x00000098,
679 0x03B, 0x00092085,
680 0x03C, 0x000E4000,
681 0x03A, 0x00000418,
682 0x03B, 0x0008A080,
683 0x03C, 0x000F0000,
684 0x03A, 0x00000418,
685 0x03B, 0x00082080,
686 0x03C, 0x00010000,
687 0x0EF, 0x00001100,
688 0xFF0F0740, 0xABCD,
689 0x034, 0x0004A0B2,
690 0x034, 0x000490AF,
691 0x034, 0x00048070,
692 0x034, 0x0004706D,
693 0x034, 0x00046050,
694 0x034, 0x0004504D,
695 0x034, 0x0004404A,
696 0x034, 0x00043047,
697 0x034, 0x0004200A,
698 0x034, 0x00041007,
699 0x034, 0x00040004,
700 0xFF0F02C0, 0xCDEF,
701 0x034, 0x0004A0B2,
702 0x034, 0x000490AF,
703 0x034, 0x00048070,
704 0x034, 0x0004706D,
705 0x034, 0x00046050,
706 0x034, 0x0004504D,
707 0x034, 0x0004404A,
708 0x034, 0x00043047,
709 0x034, 0x0004200A,
710 0x034, 0x00041007,
711 0x034, 0x00040004,
712 0xFF0F01C0, 0xCDEF,
713 0x034, 0x0004A0B2,
714 0x034, 0x000490AF,
715 0x034, 0x00048070,
716 0x034, 0x0004706D,
717 0x034, 0x00046050,
718 0x034, 0x0004504D,
719 0x034, 0x0004404A,
720 0x034, 0x00043047,
721 0x034, 0x0004200A,
722 0x034, 0x00041007,
723 0x034, 0x00040004,
724 0xFF0F07D8, 0xCDEF,
725 0x034, 0x0004A0B2,
726 0x034, 0x000490AF,
727 0x034, 0x00048070,
728 0x034, 0x0004706D,
729 0x034, 0x00046050,
730 0x034, 0x0004504D,
731 0x034, 0x0004404A,
732 0x034, 0x00043047,
733 0x034, 0x0004200A,
734 0x034, 0x00041007,
735 0x034, 0x00040004,
736 0xFF0F07D0, 0xCDEF,
737 0x034, 0x0004A0B2,
738 0x034, 0x000490AF,
739 0x034, 0x00048070,
740 0x034, 0x0004706D,
741 0x034, 0x00046050,
742 0x034, 0x0004504D,
743 0x034, 0x0004404A,
744 0x034, 0x00043047,
745 0x034, 0x0004200A,
746 0x034, 0x00041007,
747 0x034, 0x00040004,
748 0xCDCDCDCD, 0xCDCD,
749 0x034, 0x0004ADF5,
750 0x034, 0x00049DF2,
751 0x034, 0x00048DEF,
752 0x034, 0x00047DEC,
753 0x034, 0x00046DE9,
754 0x034, 0x00045DC9,
755 0x034, 0x00044CE8,
756 0x034, 0x000438CA,
757 0x034, 0x00042889,
758 0x034, 0x0004184A,
759 0x034, 0x0004044A,
760 0xFF0F0740, 0xDEAD,
761 0xFF0F0740, 0xABCD,
762 0x034, 0x0002A0B2,
763 0x034, 0x000290AF,
764 0x034, 0x00028070,
765 0x034, 0x0002706D,
766 0x034, 0x00026050,
767 0x034, 0x0002504D,
768 0x034, 0x0002404A,
769 0x034, 0x00023047,
770 0x034, 0x0002200A,
771 0x034, 0x00021007,
772 0x034, 0x00020004,
773 0xFF0F02C0, 0xCDEF,
774 0x034, 0x0002A0B2,
775 0x034, 0x000290AF,
776 0x034, 0x00028070,
777 0x034, 0x0002706D,
778 0x034, 0x00026050,
779 0x034, 0x0002504D,
780 0x034, 0x0002404A,
781 0x034, 0x00023047,
782 0x034, 0x0002200A,
783 0x034, 0x00021007,
784 0x034, 0x00020004,
785 0xFF0F01C0, 0xCDEF,
786 0x034, 0x0002A0B2,
787 0x034, 0x000290AF,
788 0x034, 0x00028070,
789 0x034, 0x0002706D,
790 0x034, 0x00026050,
791 0x034, 0x0002504D,
792 0x034, 0x0002404A,
793 0x034, 0x00023047,
794 0x034, 0x0002200A,
795 0x034, 0x00021007,
796 0x034, 0x00020004,
797 0xFF0F07D8, 0xCDEF,
798 0x034, 0x0002A0B2,
799 0x034, 0x000290AF,
800 0x034, 0x00028070,
801 0x034, 0x0002706D,
802 0x034, 0x00026050,
803 0x034, 0x0002504D,
804 0x034, 0x0002404A,
805 0x034, 0x00023047,
806 0x034, 0x0002200A,
807 0x034, 0x00021007,
808 0x034, 0x00020004,
809 0xFF0F07D0, 0xCDEF,
810 0x034, 0x0002A0B2,
811 0x034, 0x000290AF,
812 0x034, 0x00028070,
813 0x034, 0x0002706D,
814 0x034, 0x00026050,
815 0x034, 0x0002504D,
816 0x034, 0x0002404A,
817 0x034, 0x00023047,
818 0x034, 0x0002200A,
819 0x034, 0x00021007,
820 0x034, 0x00020004,
821 0xCDCDCDCD, 0xCDCD,
822 0x034, 0x0002ADF5,
823 0x034, 0x00029DF2,
824 0x034, 0x00028DEF,
825 0x034, 0x00027DEC,
826 0x034, 0x00026DE9,
827 0x034, 0x00025DC9,
828 0x034, 0x00024CE8,
829 0x034, 0x000238CA,
830 0x034, 0x00022889,
831 0x034, 0x0002184A,
832 0x034, 0x0002044A,
833 0xFF0F0740, 0xDEAD,
834 0xFF0F0740, 0xABCD,
835 0x034, 0x0000A0B2,
836 0x034, 0x000090AF,
837 0x034, 0x00008070,
838 0x034, 0x0000706D,
839 0x034, 0x00006050,
840 0x034, 0x0000504D,
841 0x034, 0x0000404A,
842 0x034, 0x00003047,
843 0x034, 0x0000200A,
844 0x034, 0x00001007,
845 0x034, 0x00000004,
846 0xFF0F02C0, 0xCDEF,
847 0x034, 0x0000A0B2,
848 0x034, 0x000090AF,
849 0x034, 0x00008070,
850 0x034, 0x0000706D,
851 0x034, 0x00006050,
852 0x034, 0x0000504D,
853 0x034, 0x0000404A,
854 0x034, 0x00003047,
855 0x034, 0x0000200A,
856 0x034, 0x00001007,
857 0x034, 0x00000004,
858 0xFF0F01C0, 0xCDEF,
859 0x034, 0x0000A0B2,
860 0x034, 0x000090AF,
861 0x034, 0x00008070,
862 0x034, 0x0000706D,
863 0x034, 0x00006050,
864 0x034, 0x0000504D,
865 0x034, 0x0000404A,
866 0x034, 0x00003047,
867 0x034, 0x0000200A,
868 0x034, 0x00001007,
869 0x034, 0x00000004,
870 0xFF0F07D8, 0xCDEF,
871 0x034, 0x0000A0B2,
872 0x034, 0x000090AF,
873 0x034, 0x00008070,
874 0x034, 0x0000706D,
875 0x034, 0x00006050,
876 0x034, 0x0000504D,
877 0x034, 0x0000404A,
878 0x034, 0x00003047,
879 0x034, 0x0000200A,
880 0x034, 0x00001007,
881 0x034, 0x00000004,
882 0xFF0F07D0, 0xCDEF,
883 0x034, 0x0000A0B2,
884 0x034, 0x000090AF,
885 0x034, 0x00008070,
886 0x034, 0x0000706D,
887 0x034, 0x00006050,
888 0x034, 0x0000504D,
889 0x034, 0x0000404A,
890 0x034, 0x00003047,
891 0x034, 0x0000200A,
892 0x034, 0x00001007,
893 0x034, 0x00000004,
894 0xCDCDCDCD, 0xCDCD,
895 0x034, 0x0000AFF7,
896 0x034, 0x00009DF7,
897 0x034, 0x00008DF4,
898 0x034, 0x00007DF1,
899 0x034, 0x00006DEE,
900 0x034, 0x00005DCD,
901 0x034, 0x00004CEB,
902 0x034, 0x000038CC,
903 0x034, 0x0000288B,
904 0x034, 0x0000184C,
905 0x034, 0x0000044C,
906 0xFF0F0740, 0xDEAD,
907 0x0EF, 0x00000000,
908 0xFF0F0740, 0xABCD,
909 0x018, 0x0001712A,
910 0x0EF, 0x00000040,
911 0x035, 0x000001D4,
912 0x035, 0x000081D4,
913 0x035, 0x000101D4,
914 0x035, 0x000201B4,
915 0x035, 0x000281B4,
916 0x035, 0x000301B4,
917 0x035, 0x000401B4,
918 0x035, 0x000481B4,
919 0x035, 0x000501B4,
920 0xFF0F02C0, 0xCDEF,
921 0x018, 0x0001712A,
922 0x0EF, 0x00000040,
923 0x035, 0x000001D4,
924 0x035, 0x000081D4,
925 0x035, 0x000101D4,
926 0x035, 0x000201B4,
927 0x035, 0x000281B4,
928 0x035, 0x000301B4,
929 0x035, 0x000401B4,
930 0x035, 0x000481B4,
931 0x035, 0x000501B4,
932 0xFF0F01C0, 0xCDEF,
933 0x018, 0x0001712A,
934 0x0EF, 0x00000040,
935 0x035, 0x000001D4,
936 0x035, 0x000081D4,
937 0x035, 0x000101D4,
938 0x035, 0x000201B4,
939 0x035, 0x000281B4,
940 0x035, 0x000301B4,
941 0x035, 0x000401B4,
942 0x035, 0x000481B4,
943 0x035, 0x000501B4,
944 0xFF0F07D8, 0xCDEF,
945 0x018, 0x0001712A,
946 0x0EF, 0x00000040,
947 0x035, 0x000001D4,
948 0x035, 0x000081D4,
949 0x035, 0x000101D4,
950 0x035, 0x000201B4,
951 0x035, 0x000281B4,
952 0x035, 0x000301B4,
953 0x035, 0x000401B4,
954 0x035, 0x000481B4,
955 0x035, 0x000501B4,
956 0xFF0F07D0, 0xCDEF,
957 0x018, 0x0001712A,
958 0x0EF, 0x00000040,
959 0x035, 0x000001D4,
960 0x035, 0x000081D4,
961 0x035, 0x000101D4,
962 0x035, 0x000201B4,
963 0x035, 0x000281B4,
964 0x035, 0x000301B4,
965 0x035, 0x000401B4,
966 0x035, 0x000481B4,
967 0x035, 0x000501B4,
968 0xCDCDCDCD, 0xCDCD,
969 0x018, 0x0001712A,
970 0x0EF, 0x00000040,
971 0x035, 0x00000188,
972 0x035, 0x00008147,
973 0x035, 0x00010147,
974 0x035, 0x000201D7,
975 0x035, 0x000281D7,
976 0x035, 0x000301D7,
977 0x035, 0x000401D8,
978 0x035, 0x000481D8,
979 0x035, 0x000501D8,
980 0xFF0F0740, 0xDEAD,
981 0x0EF, 0x00000000,
982 0xFF0F0740, 0xABCD,
983 0x018, 0x0001712A,
984 0x0EF, 0x00000010,
985 0x036, 0x00004BFB,
986 0x036, 0x0000CBFB,
987 0x036, 0x00014BFB,
988 0x036, 0x0001CBFB,
989 0x036, 0x00024F4B,
990 0x036, 0x0002CF4B,
991 0x036, 0x00034F4B,
992 0x036, 0x0003CF4B,
993 0x036, 0x00044F4B,
994 0x036, 0x0004CF4B,
995 0x036, 0x00054F4B,
996 0x036, 0x0005CF4B,
997 0xFF0F02C0, 0xCDEF,
998 0x018, 0x0001712A,
999 0x0EF, 0x00000010,
1000 0x036, 0x00004BFB,
1001 0x036, 0x0000CBFB,
1002 0x036, 0x00014BFB,
1003 0x036, 0x0001CBFB,
1004 0x036, 0x00024F4B,
1005 0x036, 0x0002CF4B,
1006 0x036, 0x00034F4B,
1007 0x036, 0x0003CF4B,
1008 0x036, 0x00044F4B,
1009 0x036, 0x0004CF4B,
1010 0x036, 0x00054F4B,
1011 0x036, 0x0005CF4B,
1012 0xFF0F01C0, 0xCDEF,
1013 0x018, 0x0001712A,
1014 0x0EF, 0x00000010,
1015 0x036, 0x00004BFB,
1016 0x036, 0x0000CBFB,
1017 0x036, 0x00014BFB,
1018 0x036, 0x0001CBFB,
1019 0x036, 0x00024F4B,
1020 0x036, 0x0002CF4B,
1021 0x036, 0x00034F4B,
1022 0x036, 0x0003CF4B,
1023 0x036, 0x00044F4B,
1024 0x036, 0x0004CF4B,
1025 0x036, 0x00054F4B,
1026 0x036, 0x0005CF4B,
1027 0xFF0F07D8, 0xCDEF,
1028 0x018, 0x0001712A,
1029 0x0EF, 0x00000010,
1030 0x036, 0x00004BFB,
1031 0x036, 0x0000CBFB,
1032 0x036, 0x00014BFB,
1033 0x036, 0x0001CBFB,
1034 0x036, 0x00024F4B,
1035 0x036, 0x0002CF4B,
1036 0x036, 0x00034F4B,
1037 0x036, 0x0003CF4B,
1038 0x036, 0x00044F4B,
1039 0x036, 0x0004CF4B,
1040 0x036, 0x00054F4B,
1041 0x036, 0x0005CF4B,
1042 0xFF0F07D0, 0xCDEF,
1043 0x018, 0x0001712A,
1044 0x0EF, 0x00000010,
1045 0x036, 0x00004BFB,
1046 0x036, 0x0000CBFB,
1047 0x036, 0x00014BFB,
1048 0x036, 0x0001CBFB,
1049 0x036, 0x00024F4B,
1050 0x036, 0x0002CF4B,
1051 0x036, 0x00034F4B,
1052 0x036, 0x0003CF4B,
1053 0x036, 0x00044F4B,
1054 0x036, 0x0004CF4B,
1055 0x036, 0x00054F4B,
1056 0x036, 0x0005CF4B,
1057 0xCDCDCDCD, 0xCDCD,
1058 0x018, 0x0001712A,
1059 0x0EF, 0x00000010,
1060 0x036, 0x00084EB4,
1061 0x036, 0x0008CC35,
1062 0x036, 0x00094C35,
1063 0x036, 0x0009CC35,
1064 0x036, 0x000A4935,
1065 0x036, 0x000ACC35,
1066 0x036, 0x000B4C35,
1067 0x036, 0x000BCC35,
1068 0x036, 0x000C4EB4,
1069 0x036, 0x000CCEB5,
1070 0x036, 0x000D4EB5,
1071 0x036, 0x000DCEB5,
1072 0xFF0F0740, 0xDEAD,
1073 0x0EF, 0x00000000,
1074 0x0EF, 0x00000008,
1075 0xFF0F0740, 0xABCD,
1076 0x03C, 0x000002CC,
1077 0x03C, 0x00000522,
1078 0x03C, 0x00000902,
1079 0xFF0F02C0, 0xCDEF,
1080 0x03C, 0x000002CC,
1081 0x03C, 0x00000522,
1082 0x03C, 0x00000902,
1083 0xFF0F01C0, 0xCDEF,
1084 0x03C, 0x000002CC,
1085 0x03C, 0x00000522,
1086 0x03C, 0x00000902,
1087 0xFF0F07D8, 0xCDEF,
1088 0x03C, 0x000002CC,
1089 0x03C, 0x00000522,
1090 0x03C, 0x00000902,
1091 0xFF0F07D0, 0xCDEF,
1092 0x03C, 0x000002CC,
1093 0x03C, 0x00000522,
1094 0x03C, 0x00000902,
1095 0xCDCDCDCD, 0xCDCD,
1096 0x03C, 0x000002A8,
1097 0x03C, 0x000005A2,
1098 0x03C, 0x00000880,
1099 0xFF0F0740, 0xDEAD,
1100 0x0EF, 0x00000000,
1101 0x018, 0x0001712A,
1102 0x0EF, 0x00000002,
1103 0x0DF, 0x00000080,
1104 0x01F, 0x00040064,
1105 0xFF0F0740, 0xABCD,
1106 0x061, 0x000FDD43,
1107 0x062, 0x00038F4B,
1108 0x063, 0x00032117,
1109 0x064, 0x000194AC,
1110 0x065, 0x000931D1,
1111 0xFF0F02C0, 0xCDEF,
1112 0x061, 0x000FDD43,
1113 0x062, 0x00038F4B,
1114 0x063, 0x00032117,
1115 0x064, 0x000194AC,
1116 0x065, 0x000931D1,
1117 0xFF0F01C0, 0xCDEF,
1118 0x061, 0x000FDD43,
1119 0x062, 0x00038F4B,
1120 0x063, 0x00032117,
1121 0x064, 0x000194AC,
1122 0x065, 0x000931D1,
1123 0xFF0F07D8, 0xCDEF,
1124 0x061, 0x000FDD43,
1125 0x062, 0x00038F4B,
1126 0x063, 0x00032117,
1127 0x064, 0x000194AC,
1128 0x065, 0x000931D1,
1129 0xFF0F07D0, 0xCDEF,
1130 0x061, 0x000FDD43,
1131 0x062, 0x00038F4B,
1132 0x063, 0x00032117,
1133 0x064, 0x000194AC,
1134 0x065, 0x000931D1,
1135 0xCDCDCDCD, 0xCDCD,
1136 0x061, 0x000E5D53,
1137 0x062, 0x00038FCD,
1138 0x063, 0x000314EB,
1139 0x064, 0x000196AC,
1140 0x065, 0x000911D7,
1141 0xFF0F0740, 0xDEAD,
1142 0x008, 0x00008400,
1143 0x01C, 0x000739D2,
1144 0x0B4, 0x0001E78D,
1145 0x018, 0x0001F12A,
1146 0x0FE, 0x00000000,
1147 0x0FE, 0x00000000,
1148 0x0FE, 0x00000000,
1149 0x0FE, 0x00000000,
1150 0x0B4, 0x0001A78D,
1151 0x018, 0x0001712A,
1152
1153};
1154
1155u32 RTL8812AE_RADIOB_ARRAY[] = {
1156 0x056, 0x00051CF2,
1157 0x066, 0x00040000,
1158 0x089, 0x00000080,
1159 0xFF0F0740, 0xABCD,
1160 0x086, 0x00014B38,
1161 0xFF0F01C0, 0xCDEF,
1162 0x086, 0x00014B38,
1163 0xFF0F02C0, 0xCDEF,
1164 0x086, 0x00014B38,
1165 0xFF0F07D8, 0xCDEF,
1166 0x086, 0x00014B3A,
1167 0xFF0F07D0, 0xCDEF,
1168 0x086, 0x00014B3A,
1169 0xCDCDCDCD, 0xCDCD,
1170 0x086, 0x00014B38,
1171 0xFF0F0740, 0xDEAD,
1172 0x018, 0x00000006,
1173 0x0EF, 0x00002000,
1174 0xFF0F07D8, 0xABCD,
1175 0x03B, 0x0003F218,
1176 0x03B, 0x00030A58,
1177 0x03B, 0x0002FA58,
1178 0x03B, 0x00022590,
1179 0x03B, 0x0001FA50,
1180 0x03B, 0x00010248,
1181 0x03B, 0x00008240,
1182 0xFF0F07D0, 0xCDEF,
1183 0x03B, 0x0003F218,
1184 0x03B, 0x00030A58,
1185 0x03B, 0x0002FA58,
1186 0x03B, 0x00022590,
1187 0x03B, 0x0001FA50,
1188 0x03B, 0x00010248,
1189 0x03B, 0x00008240,
1190 0xCDCDCDCD, 0xCDCD,
1191 0x03B, 0x00038A58,
1192 0x03B, 0x00037A58,
1193 0x03B, 0x0002A590,
1194 0x03B, 0x00027A50,
1195 0x03B, 0x00018248,
1196 0x03B, 0x00010240,
1197 0x03B, 0x00008240,
1198 0xFF0F07D8, 0xDEAD,
1199 0x0EF, 0x00000100,
1200 0xFF0F07D8, 0xABCD,
1201 0x034, 0x0000A4EE,
1202 0x034, 0x00009076,
1203 0x034, 0x00008073,
1204 0x034, 0x00007070,
1205 0x034, 0x0000606D,
1206 0x034, 0x0000506A,
1207 0x034, 0x00004049,
1208 0x034, 0x00003046,
1209 0x034, 0x00002028,
1210 0x034, 0x00001025,
1211 0x034, 0x00000022,
1212 0xCDCDCDCD, 0xCDCD,
1213 0x034, 0x0000ADF4,
1214 0x034, 0x00009DF1,
1215 0x034, 0x00008DEE,
1216 0x034, 0x00007DEB,
1217 0x034, 0x00006DE8,
1218 0x034, 0x00005CEC,
1219 0x034, 0x00004CE9,
1220 0x034, 0x000034EA,
1221 0x034, 0x000024E7,
1222 0x034, 0x0000146B,
1223 0x034, 0x0000006D,
1224 0xFF0F07D8, 0xDEAD,
1225 0x0EF, 0x00000000,
1226 0x0EF, 0x000020A2,
1227 0x0DF, 0x00000080,
1228 0x035, 0x00000192,
1229 0x035, 0x00008192,
1230 0x035, 0x00010192,
1231 0x036, 0x00000024,
1232 0x036, 0x00008024,
1233 0x036, 0x00010024,
1234 0x036, 0x00018024,
1235 0x0EF, 0x00000000,
1236 0x051, 0x00000C21,
1237 0x052, 0x000006D9,
1238 0x053, 0x000FC649,
1239 0x054, 0x0000017E,
1240 0x0EF, 0x00000002,
1241 0x008, 0x00008400,
1242 0x018, 0x0001712A,
1243 0x0EF, 0x00001000,
1244 0x03A, 0x00000080,
1245 0x03B, 0x0003A02C,
1246 0x03C, 0x00004000,
1247 0x03A, 0x00000400,
1248 0x03B, 0x0003202C,
1249 0x03C, 0x00010000,
1250 0x03A, 0x000000A0,
1251 0x03B, 0x0002B064,
1252 0x03C, 0x00004000,
1253 0x03A, 0x000000D8,
1254 0x03B, 0x00023070,
1255 0x03C, 0x00004000,
1256 0x03A, 0x00000468,
1257 0x03B, 0x0001B870,
1258 0x03C, 0x00010000,
1259 0x03A, 0x00000098,
1260 0x03B, 0x00012085,
1261 0x03C, 0x000E4000,
1262 0x03A, 0x00000418,
1263 0x03B, 0x0000A080,
1264 0x03C, 0x000F0000,
1265 0x03A, 0x00000418,
1266 0x03B, 0x00002080,
1267 0x03C, 0x00010000,
1268 0x03A, 0x00000080,
1269 0x03B, 0x0007A02C,
1270 0x03C, 0x00004000,
1271 0x03A, 0x00000400,
1272 0x03B, 0x0007202C,
1273 0x03C, 0x00010000,
1274 0x03A, 0x000000A0,
1275 0x03B, 0x0006B064,
1276 0x03C, 0x00004000,
1277 0x03A, 0x000000D8,
1278 0x03B, 0x00063070,
1279 0x03C, 0x00004000,
1280 0x03A, 0x00000468,
1281 0x03B, 0x0005B870,
1282 0x03C, 0x00010000,
1283 0x03A, 0x00000098,
1284 0x03B, 0x00052085,
1285 0x03C, 0x000E4000,
1286 0x03A, 0x00000418,
1287 0x03B, 0x0004A080,
1288 0x03C, 0x000F0000,
1289 0x03A, 0x00000418,
1290 0x03B, 0x00042080,
1291 0x03C, 0x00010000,
1292 0x03A, 0x00000080,
1293 0x03B, 0x000BA02C,
1294 0x03C, 0x00004000,
1295 0x03A, 0x00000400,
1296 0x03B, 0x000B202C,
1297 0x03C, 0x00010000,
1298 0x03A, 0x000000A0,
1299 0x03B, 0x000AB064,
1300 0x03C, 0x00004000,
1301 0x03A, 0x000000D8,
1302 0x03B, 0x000A3070,
1303 0x03C, 0x00004000,
1304 0x03A, 0x00000468,
1305 0x03B, 0x0009B870,
1306 0x03C, 0x00010000,
1307 0x03A, 0x00000098,
1308 0x03B, 0x00092085,
1309 0x03C, 0x000E4000,
1310 0x03A, 0x00000418,
1311 0x03B, 0x0008A080,
1312 0x03C, 0x000F0000,
1313 0x03A, 0x00000418,
1314 0x03B, 0x00082080,
1315 0x03C, 0x00010000,
1316 0x0EF, 0x00001100,
1317 0xFF0F0740, 0xABCD,
1318 0x034, 0x0004A0B2,
1319 0x034, 0x000490AF,
1320 0x034, 0x00048070,
1321 0x034, 0x0004706D,
1322 0x034, 0x00046050,
1323 0x034, 0x0004504D,
1324 0x034, 0x0004404A,
1325 0x034, 0x00043047,
1326 0x034, 0x0004200A,
1327 0x034, 0x00041007,
1328 0x034, 0x00040004,
1329 0xFF0F01C0, 0xCDEF,
1330 0x034, 0x0004A0B2,
1331 0x034, 0x000490AF,
1332 0x034, 0x00048070,
1333 0x034, 0x0004706D,
1334 0x034, 0x00046050,
1335 0x034, 0x0004504D,
1336 0x034, 0x0004404A,
1337 0x034, 0x00043047,
1338 0x034, 0x0004200A,
1339 0x034, 0x00041007,
1340 0x034, 0x00040004,
1341 0xFF0F02C0, 0xCDEF,
1342 0x034, 0x0004A0B2,
1343 0x034, 0x000490AF,
1344 0x034, 0x00048070,
1345 0x034, 0x0004706D,
1346 0x034, 0x00046050,
1347 0x034, 0x0004504D,
1348 0x034, 0x0004404A,
1349 0x034, 0x00043047,
1350 0x034, 0x0004200A,
1351 0x034, 0x00041007,
1352 0x034, 0x00040004,
1353 0xFF0F07D8, 0xCDEF,
1354 0x034, 0x0004A0B2,
1355 0x034, 0x000490AF,
1356 0x034, 0x00048070,
1357 0x034, 0x0004706D,
1358 0x034, 0x00046050,
1359 0x034, 0x0004504D,
1360 0x034, 0x0004404A,
1361 0x034, 0x00043047,
1362 0x034, 0x0004200A,
1363 0x034, 0x00041007,
1364 0x034, 0x00040004,
1365 0xFF0F07D0, 0xCDEF,
1366 0x034, 0x0004A0B2,
1367 0x034, 0x000490AF,
1368 0x034, 0x00048070,
1369 0x034, 0x0004706D,
1370 0x034, 0x00046050,
1371 0x034, 0x0004504D,
1372 0x034, 0x0004404A,
1373 0x034, 0x00043047,
1374 0x034, 0x0004200A,
1375 0x034, 0x00041007,
1376 0x034, 0x00040004,
1377 0xCDCDCDCD, 0xCDCD,
1378 0x034, 0x0004ADF5,
1379 0x034, 0x00049DF2,
1380 0x034, 0x00048DEF,
1381 0x034, 0x00047DEC,
1382 0x034, 0x00046DE9,
1383 0x034, 0x00045DC9,
1384 0x034, 0x00044CE8,
1385 0x034, 0x000438CA,
1386 0x034, 0x00042889,
1387 0x034, 0x0004184A,
1388 0x034, 0x0004044A,
1389 0xFF0F0740, 0xDEAD,
1390 0xFF0F0740, 0xABCD,
1391 0x034, 0x0002A0B2,
1392 0x034, 0x000290AF,
1393 0x034, 0x00028070,
1394 0x034, 0x0002706D,
1395 0x034, 0x00026050,
1396 0x034, 0x0002504D,
1397 0x034, 0x0002404A,
1398 0x034, 0x00023047,
1399 0x034, 0x0002200A,
1400 0x034, 0x00021007,
1401 0x034, 0x00020004,
1402 0xFF0F01C0, 0xCDEF,
1403 0x034, 0x0002A0B2,
1404 0x034, 0x000290AF,
1405 0x034, 0x00028070,
1406 0x034, 0x0002706D,
1407 0x034, 0x00026050,
1408 0x034, 0x0002504D,
1409 0x034, 0x0002404A,
1410 0x034, 0x00023047,
1411 0x034, 0x0002200A,
1412 0x034, 0x00021007,
1413 0x034, 0x00020004,
1414 0xFF0F02C0, 0xCDEF,
1415 0x034, 0x0002A0B2,
1416 0x034, 0x000290AF,
1417 0x034, 0x00028070,
1418 0x034, 0x0002706D,
1419 0x034, 0x00026050,
1420 0x034, 0x0002504D,
1421 0x034, 0x0002404A,
1422 0x034, 0x00023047,
1423 0x034, 0x0002200A,
1424 0x034, 0x00021007,
1425 0x034, 0x00020004,
1426 0xFF0F07D8, 0xCDEF,
1427 0x034, 0x0002A0B2,
1428 0x034, 0x000290AF,
1429 0x034, 0x00028070,
1430 0x034, 0x0002706D,
1431 0x034, 0x00026050,
1432 0x034, 0x0002504D,
1433 0x034, 0x0002404A,
1434 0x034, 0x00023047,
1435 0x034, 0x0002200A,
1436 0x034, 0x00021007,
1437 0x034, 0x00020004,
1438 0xFF0F07D0, 0xCDEF,
1439 0x034, 0x0002A0B2,
1440 0x034, 0x000290AF,
1441 0x034, 0x00028070,
1442 0x034, 0x0002706D,
1443 0x034, 0x00026050,
1444 0x034, 0x0002504D,
1445 0x034, 0x0002404A,
1446 0x034, 0x00023047,
1447 0x034, 0x0002200A,
1448 0x034, 0x00021007,
1449 0x034, 0x00020004,
1450 0xCDCDCDCD, 0xCDCD,
1451 0x034, 0x0002ADF5,
1452 0x034, 0x00029DF2,
1453 0x034, 0x00028DEF,
1454 0x034, 0x00027DEC,
1455 0x034, 0x00026DE9,
1456 0x034, 0x00025DC9,
1457 0x034, 0x00024CE8,
1458 0x034, 0x000238CA,
1459 0x034, 0x00022889,
1460 0x034, 0x0002184A,
1461 0x034, 0x0002044A,
1462 0xFF0F0740, 0xDEAD,
1463 0xFF0F0740, 0xABCD,
1464 0x034, 0x0000A0B2,
1465 0x034, 0x000090AF,
1466 0x034, 0x00008070,
1467 0x034, 0x0000706D,
1468 0x034, 0x00006050,
1469 0x034, 0x0000504D,
1470 0x034, 0x0000404A,
1471 0x034, 0x00003047,
1472 0x034, 0x0000200A,
1473 0x034, 0x00001007,
1474 0x034, 0x00000004,
1475 0xFF0F01C0, 0xCDEF,
1476 0x034, 0x0000A0B2,
1477 0x034, 0x000090AF,
1478 0x034, 0x00008070,
1479 0x034, 0x0000706D,
1480 0x034, 0x00006050,
1481 0x034, 0x0000504D,
1482 0x034, 0x0000404A,
1483 0x034, 0x00003047,
1484 0x034, 0x0000200A,
1485 0x034, 0x00001007,
1486 0x034, 0x00000004,
1487 0xFF0F02C0, 0xCDEF,
1488 0x034, 0x0000A0B2,
1489 0x034, 0x000090AF,
1490 0x034, 0x00008070,
1491 0x034, 0x0000706D,
1492 0x034, 0x00006050,
1493 0x034, 0x0000504D,
1494 0x034, 0x0000404A,
1495 0x034, 0x00003047,
1496 0x034, 0x0000200A,
1497 0x034, 0x00001007,
1498 0x034, 0x00000004,
1499 0xFF0F07D8, 0xCDEF,
1500 0x034, 0x0000A0B2,
1501 0x034, 0x000090AF,
1502 0x034, 0x00008070,
1503 0x034, 0x0000706D,
1504 0x034, 0x00006050,
1505 0x034, 0x0000504D,
1506 0x034, 0x0000404A,
1507 0x034, 0x00003047,
1508 0x034, 0x0000200A,
1509 0x034, 0x00001007,
1510 0x034, 0x00000004,
1511 0xFF0F07D0, 0xCDEF,
1512 0x034, 0x0000A0B2,
1513 0x034, 0x000090AF,
1514 0x034, 0x00008070,
1515 0x034, 0x0000706D,
1516 0x034, 0x00006050,
1517 0x034, 0x0000504D,
1518 0x034, 0x0000404A,
1519 0x034, 0x00003047,
1520 0x034, 0x0000200A,
1521 0x034, 0x00001007,
1522 0x034, 0x00000004,
1523 0xCDCDCDCD, 0xCDCD,
1524 0x034, 0x0000AFF7,
1525 0x034, 0x00009DF7,
1526 0x034, 0x00008DF4,
1527 0x034, 0x00007DF1,
1528 0x034, 0x00006DEE,
1529 0x034, 0x00005DCD,
1530 0x034, 0x00004CEB,
1531 0x034, 0x000038CC,
1532 0x034, 0x0000288B,
1533 0x034, 0x0000184C,
1534 0x034, 0x0000044C,
1535 0xFF0F0740, 0xDEAD,
1536 0x0EF, 0x00000000,
1537 0xFF0F0740, 0xABCD,
1538 0x018, 0x0001712A,
1539 0x0EF, 0x00000040,
1540 0x035, 0x000001C5,
1541 0x035, 0x000081C5,
1542 0x035, 0x000101C5,
1543 0x035, 0x00020174,
1544 0x035, 0x00028174,
1545 0x035, 0x00030174,
1546 0x035, 0x00040185,
1547 0x035, 0x00048185,
1548 0x035, 0x00050185,
1549 0x0EF, 0x00000000,
1550 0xFF0F01C0, 0xCDEF,
1551 0x018, 0x0001712A,
1552 0x0EF, 0x00000040,
1553 0x035, 0x000001C5,
1554 0x035, 0x000081C5,
1555 0x035, 0x000101C5,
1556 0x035, 0x00020174,
1557 0x035, 0x00028174,
1558 0x035, 0x00030174,
1559 0x035, 0x00040185,
1560 0x035, 0x00048185,
1561 0x035, 0x00050185,
1562 0x0EF, 0x00000000,
1563 0xFF0F02C0, 0xCDEF,
1564 0x018, 0x0001712A,
1565 0x0EF, 0x00000040,
1566 0x035, 0x000001C5,
1567 0x035, 0x000081C5,
1568 0x035, 0x000101C5,
1569 0x035, 0x00020174,
1570 0x035, 0x00028174,
1571 0x035, 0x00030174,
1572 0x035, 0x00040185,
1573 0x035, 0x00048185,
1574 0x035, 0x00050185,
1575 0x0EF, 0x00000000,
1576 0xFF0F07D8, 0xCDEF,
1577 0x018, 0x0001712A,
1578 0x0EF, 0x00000040,
1579 0x035, 0x000001C5,
1580 0x035, 0x000081C5,
1581 0x035, 0x000101C5,
1582 0x035, 0x00020174,
1583 0x035, 0x00028174,
1584 0x035, 0x00030174,
1585 0x035, 0x00040185,
1586 0x035, 0x00048185,
1587 0x035, 0x00050185,
1588 0x0EF, 0x00000000,
1589 0xFF0F07D0, 0xCDEF,
1590 0x018, 0x0001712A,
1591 0x0EF, 0x00000040,
1592 0x035, 0x000001C5,
1593 0x035, 0x000081C5,
1594 0x035, 0x000101C5,
1595 0x035, 0x00020174,
1596 0x035, 0x00028174,
1597 0x035, 0x00030174,
1598 0x035, 0x00040185,
1599 0x035, 0x00048185,
1600 0x035, 0x00050185,
1601 0x0EF, 0x00000000,
1602 0xCDCDCDCD, 0xCDCD,
1603 0x018, 0x0001712A,
1604 0x0EF, 0x00000040,
1605 0x035, 0x00000186,
1606 0x035, 0x00008186,
1607 0x035, 0x00010185,
1608 0x035, 0x000201D5,
1609 0x035, 0x000281D5,
1610 0x035, 0x000301D5,
1611 0x035, 0x000401D5,
1612 0x035, 0x000481D5,
1613 0x035, 0x000501D5,
1614 0x0EF, 0x00000000,
1615 0xFF0F0740, 0xDEAD,
1616 0xFF0F0740, 0xABCD,
1617 0x018, 0x0001712A,
1618 0x0EF, 0x00000010,
1619 0x036, 0x00005B8B,
1620 0x036, 0x0000DB8B,
1621 0x036, 0x00015B8B,
1622 0x036, 0x0001DB8B,
1623 0x036, 0x000262DB,
1624 0x036, 0x0002E2DB,
1625 0x036, 0x000362DB,
1626 0x036, 0x0003E2DB,
1627 0x036, 0x0004553B,
1628 0x036, 0x0004D53B,
1629 0x036, 0x0005553B,
1630 0x036, 0x0005D53B,
1631 0xFF0F01C0, 0xCDEF,
1632 0x018, 0x0001712A,
1633 0x0EF, 0x00000010,
1634 0x036, 0x00005B8B,
1635 0x036, 0x0000DB8B,
1636 0x036, 0x00015B8B,
1637 0x036, 0x0001DB8B,
1638 0x036, 0x000262DB,
1639 0x036, 0x0002E2DB,
1640 0x036, 0x000362DB,
1641 0x036, 0x0003E2DB,
1642 0x036, 0x0004553B,
1643 0x036, 0x0004D53B,
1644 0x036, 0x0005553B,
1645 0x036, 0x0005D53B,
1646 0xFF0F02C0, 0xCDEF,
1647 0x018, 0x0001712A,
1648 0x0EF, 0x00000010,
1649 0x036, 0x00005B8B,
1650 0x036, 0x0000DB8B,
1651 0x036, 0x00015B8B,
1652 0x036, 0x0001DB8B,
1653 0x036, 0x000262DB,
1654 0x036, 0x0002E2DB,
1655 0x036, 0x000362DB,
1656 0x036, 0x0003E2DB,
1657 0x036, 0x0004553B,
1658 0x036, 0x0004D53B,
1659 0x036, 0x0005553B,
1660 0x036, 0x0005D53B,
1661 0xFF0F07D8, 0xCDEF,
1662 0x018, 0x0001712A,
1663 0x0EF, 0x00000010,
1664 0x036, 0x00005B8B,
1665 0x036, 0x0000DB8B,
1666 0x036, 0x00015B8B,
1667 0x036, 0x0001DB8B,
1668 0x036, 0x000262DB,
1669 0x036, 0x0002E2DB,
1670 0x036, 0x000362DB,
1671 0x036, 0x0003E2DB,
1672 0x036, 0x0004553B,
1673 0x036, 0x0004D53B,
1674 0x036, 0x0005553B,
1675 0x036, 0x0005D53B,
1676 0xFF0F07D0, 0xCDEF,
1677 0x018, 0x0001712A,
1678 0x0EF, 0x00000010,
1679 0x036, 0x00005B8B,
1680 0x036, 0x0000DB8B,
1681 0x036, 0x00015B8B,
1682 0x036, 0x0001DB8B,
1683 0x036, 0x000262DB,
1684 0x036, 0x0002E2DB,
1685 0x036, 0x000362DB,
1686 0x036, 0x0003E2DB,
1687 0x036, 0x0004553B,
1688 0x036, 0x0004D53B,
1689 0x036, 0x0005553B,
1690 0x036, 0x0005D53B,
1691 0xCDCDCDCD, 0xCDCD,
1692 0x018, 0x0001712A,
1693 0x0EF, 0x00000010,
1694 0x036, 0x00084EB4,
1695 0x036, 0x0008C9B4,
1696 0x036, 0x000949B4,
1697 0x036, 0x0009C9B4,
1698 0x036, 0x000A4935,
1699 0x036, 0x000AC935,
1700 0x036, 0x000B4935,
1701 0x036, 0x000BC935,
1702 0x036, 0x000C4EB4,
1703 0x036, 0x000CCEB4,
1704 0x036, 0x000D4EB4,
1705 0x036, 0x000DCEB4,
1706 0xFF0F0740, 0xDEAD,
1707 0x0EF, 0x00000000,
1708 0x0EF, 0x00000008,
1709 0xFF0F0740, 0xABCD,
1710 0x03C, 0x000002DC,
1711 0x03C, 0x00000524,
1712 0x03C, 0x00000902,
1713 0xFF0F01C0, 0xCDEF,
1714 0x03C, 0x000002DC,
1715 0x03C, 0x00000524,
1716 0x03C, 0x00000902,
1717 0xFF0F02C0, 0xCDEF,
1718 0x03C, 0x000002DC,
1719 0x03C, 0x00000524,
1720 0x03C, 0x00000902,
1721 0xFF0F07D8, 0xCDEF,
1722 0x03C, 0x000002DC,
1723 0x03C, 0x00000524,
1724 0x03C, 0x00000902,
1725 0xFF0F07D0, 0xCDEF,
1726 0x03C, 0x000002DC,
1727 0x03C, 0x00000524,
1728 0x03C, 0x00000902,
1729 0xCDCDCDCD, 0xCDCD,
1730 0x03C, 0x000002AA,
1731 0x03C, 0x000005A2,
1732 0x03C, 0x00000880,
1733 0xFF0F0740, 0xDEAD,
1734 0x0EF, 0x00000000,
1735 0x018, 0x0001712A,
1736 0x0EF, 0x00000002,
1737 0x0DF, 0x00000080,
1738 0xFF0F0740, 0xABCD,
1739 0x061, 0x000EAC43,
1740 0x062, 0x00038F47,
1741 0x063, 0x00031157,
1742 0x064, 0x0001C4AC,
1743 0x065, 0x000931D1,
1744 0xFF0F01C0, 0xCDEF,
1745 0x061, 0x000EAC43,
1746 0x062, 0x00038F47,
1747 0x063, 0x00031157,
1748 0x064, 0x0001C4AC,
1749 0x065, 0x000931D1,
1750 0xFF0F02C0, 0xCDEF,
1751 0x061, 0x000EAC43,
1752 0x062, 0x00038F47,
1753 0x063, 0x00031157,
1754 0x064, 0x0001C4AC,
1755 0x065, 0x000931D1,
1756 0xFF0F07D8, 0xCDEF,
1757 0x061, 0x000EAC43,
1758 0x062, 0x00038F47,
1759 0x063, 0x00031157,
1760 0x064, 0x0001C4AC,
1761 0x065, 0x000931D1,
1762 0xFF0F07D0, 0xCDEF,
1763 0x061, 0x000EAC43,
1764 0x062, 0x00038F47,
1765 0x063, 0x00031157,
1766 0x064, 0x0001C4AC,
1767 0x065, 0x000931D1,
1768 0xCDCDCDCD, 0xCDCD,
1769 0x061, 0x000E5D53,
1770 0x062, 0x00038FCD,
1771 0x063, 0x000314EB,
1772 0x064, 0x000196AC,
1773 0x065, 0x000931D7,
1774 0xFF0F0740, 0xDEAD,
1775 0x008, 0x00008400,
1776
1777};
1778
1779u32 RTL8821AE_RADIOA_ARRAY[] = {
1780 0x018, 0x0001712A,
1781 0x056, 0x00051CF2,
1782 0x066, 0x00040000,
1783 0x000, 0x00010000,
1784 0x01E, 0x00080000,
1785 0x082, 0x00000830,
1786 0x083, 0x00021800,
1787 0x084, 0x00028000,
1788 0x085, 0x00048000,
1789 0x086, 0x00094838,
1790 0x087, 0x00044980,
1791 0x088, 0x00048000,
1792 0x089, 0x0000D480,
1793 0x08A, 0x00042240,
1794 0x08B, 0x000F0380,
1795 0x08C, 0x00090000,
1796 0x08D, 0x00022852,
1797 0x08E, 0x00065540,
1798 0x08F, 0x00088001,
1799 0x0EF, 0x00020000,
1800 0x03E, 0x00000380,
1801 0x03F, 0x00090018,
1802 0x03E, 0x00020380,
1803 0x03F, 0x000A0018,
1804 0x03E, 0x00040308,
1805 0x03F, 0x000A0018,
1806 0x03E, 0x00060018,
1807 0x03F, 0x000A0018,
1808 0x0EF, 0x00000000,
1809 0x018, 0x0001712A,
1810 0x089, 0x00000080,
1811 0x08B, 0x00080180,
1812 0x0EF, 0x00001000,
1813 0x03A, 0x00000244,
1814 0x03B, 0x00038027,
1815 0x03C, 0x00082000,
1816 0x03A, 0x00000244,
1817 0x03B, 0x00030113,
1818 0x03C, 0x00082000,
1819 0x03A, 0x0000014C,
1820 0x03B, 0x00028027,
1821 0x03C, 0x00082000,
1822 0x03A, 0x000000CC,
1823 0x03B, 0x00027027,
1824 0x03C, 0x00042000,
1825 0x03A, 0x0000014C,
1826 0x03B, 0x0001F913,
1827 0x03C, 0x00042000,
1828 0x03A, 0x0000010C,
1829 0x03B, 0x00017F10,
1830 0x03C, 0x00012000,
1831 0x03A, 0x000000D0,
1832 0x03B, 0x00008027,
1833 0x03C, 0x000CA000,
1834 0x03A, 0x00000244,
1835 0x03B, 0x00078027,
1836 0x03C, 0x00082000,
1837 0x03A, 0x00000244,
1838 0x03B, 0x00070113,
1839 0x03C, 0x00082000,
1840 0x03A, 0x0000014C,
1841 0x03B, 0x00068027,
1842 0x03C, 0x00082000,
1843 0x03A, 0x000000CC,
1844 0x03B, 0x00067027,
1845 0x03C, 0x00042000,
1846 0x03A, 0x0000014C,
1847 0x03B, 0x0005F913,
1848 0x03C, 0x00042000,
1849 0x03A, 0x0000010C,
1850 0x03B, 0x00057F10,
1851 0x03C, 0x00012000,
1852 0x03A, 0x000000D0,
1853 0x03B, 0x00048027,
1854 0x03C, 0x000CA000,
1855 0x03A, 0x00000244,
1856 0x03B, 0x000B8027,
1857 0x03C, 0x00082000,
1858 0x03A, 0x00000244,
1859 0x03B, 0x000B0113,
1860 0x03C, 0x00082000,
1861 0x03A, 0x0000014C,
1862 0x03B, 0x000A8027,
1863 0x03C, 0x00082000,
1864 0x03A, 0x000000CC,
1865 0x03B, 0x000A7027,
1866 0x03C, 0x00042000,
1867 0x03A, 0x0000014C,
1868 0x03B, 0x0009F913,
1869 0x03C, 0x00042000,
1870 0x03A, 0x0000010C,
1871 0x03B, 0x00097F10,
1872 0x03C, 0x00012000,
1873 0x03A, 0x000000D0,
1874 0x03B, 0x00088027,
1875 0x03C, 0x000CA000,
1876 0x0EF, 0x00000000,
1877 0x0EF, 0x00001100,
1878 0xFF0F0104, 0xABCD,
1879 0x034, 0x0004ADF3,
1880 0x034, 0x00049DF0,
1881 0xFF0F0204, 0xCDEF,
1882 0x034, 0x0004ADF3,
1883 0x034, 0x00049DF0,
1884 0xFF0F0404, 0xCDEF,
1885 0x034, 0x0004ADF3,
1886 0x034, 0x00049DF0,
1887 0xFF0F0200, 0xCDEF,
1888 0x034, 0x0004ADF5,
1889 0x034, 0x00049DF2,
1890 0xFF0F02C0, 0xCDEF,
1891 0x034, 0x0004A0F3,
1892 0x034, 0x000490B1,
1893 0xCDCDCDCD, 0xCDCD,
1894 0x034, 0x0004ADF7,
1895 0x034, 0x00049DF3,
1896 0xFF0F0104, 0xDEAD,
1897 0xFF0F0104, 0xABCD,
1898 0x034, 0x00048DED,
1899 0x034, 0x00047DEA,
1900 0x034, 0x00046DE7,
1901 0x034, 0x00045CE9,
1902 0x034, 0x00044CE6,
1903 0x034, 0x000438C6,
1904 0x034, 0x00042886,
1905 0x034, 0x00041486,
1906 0x034, 0x00040447,
1907 0xFF0F0204, 0xCDEF,
1908 0x034, 0x00048DED,
1909 0x034, 0x00047DEA,
1910 0x034, 0x00046DE7,
1911 0x034, 0x00045CE9,
1912 0x034, 0x00044CE6,
1913 0x034, 0x000438C6,
1914 0x034, 0x00042886,
1915 0x034, 0x00041486,
1916 0x034, 0x00040447,
1917 0xFF0F0404, 0xCDEF,
1918 0x034, 0x00048DED,
1919 0x034, 0x00047DEA,
1920 0x034, 0x00046DE7,
1921 0x034, 0x00045CE9,
1922 0x034, 0x00044CE6,
1923 0x034, 0x000438C6,
1924 0x034, 0x00042886,
1925 0x034, 0x00041486,
1926 0x034, 0x00040447,
1927 0xFF0F02C0, 0xCDEF,
1928 0x034, 0x000480AE,
1929 0x034, 0x000470AB,
1930 0x034, 0x0004608B,
1931 0x034, 0x00045069,
1932 0x034, 0x00044048,
1933 0x034, 0x00043045,
1934 0x034, 0x00042026,
1935 0x034, 0x00041023,
1936 0x034, 0x00040002,
1937 0xCDCDCDCD, 0xCDCD,
1938 0x034, 0x00048DEF,
1939 0x034, 0x00047DEC,
1940 0x034, 0x00046DE9,
1941 0x034, 0x00045CCB,
1942 0x034, 0x0004488D,
1943 0x034, 0x0004348D,
1944 0x034, 0x0004248A,
1945 0x034, 0x0004108D,
1946 0x034, 0x0004008A,
1947 0xFF0F0104, 0xDEAD,
1948 0xFF0F0200, 0xABCD,
1949 0x034, 0x0002ADF4,
1950 0xFF0F02C0, 0xCDEF,
1951 0x034, 0x0002A0F3,
1952 0xCDCDCDCD, 0xCDCD,
1953 0x034, 0x0002ADF7,
1954 0xFF0F0200, 0xDEAD,
1955 0xFF0F0104, 0xABCD,
1956 0x034, 0x00029DF4,
1957 0xFF0F0204, 0xCDEF,
1958 0x034, 0x00029DF4,
1959 0xFF0F0404, 0xCDEF,
1960 0x034, 0x00029DF4,
1961 0xFF0F0200, 0xCDEF,
1962 0x034, 0x00029DF1,
1963 0xFF0F02C0, 0xCDEF,
1964 0x034, 0x000290F0,
1965 0xCDCDCDCD, 0xCDCD,
1966 0x034, 0x00029DF2,
1967 0xFF0F0104, 0xDEAD,
1968 0xFF0F0104, 0xABCD,
1969 0x034, 0x00028DF1,
1970 0x034, 0x00027DEE,
1971 0x034, 0x00026DEB,
1972 0x034, 0x00025CEC,
1973 0x034, 0x00024CE9,
1974 0x034, 0x000238CA,
1975 0x034, 0x00022889,
1976 0x034, 0x00021489,
1977 0x034, 0x0002044A,
1978 0xFF0F0204, 0xCDEF,
1979 0x034, 0x00028DF1,
1980 0x034, 0x00027DEE,
1981 0x034, 0x00026DEB,
1982 0x034, 0x00025CEC,
1983 0x034, 0x00024CE9,
1984 0x034, 0x000238CA,
1985 0x034, 0x00022889,
1986 0x034, 0x00021489,
1987 0x034, 0x0002044A,
1988 0xFF0F0404, 0xCDEF,
1989 0x034, 0x00028DF1,
1990 0x034, 0x00027DEE,
1991 0x034, 0x00026DEB,
1992 0x034, 0x00025CEC,
1993 0x034, 0x00024CE9,
1994 0x034, 0x000238CA,
1995 0x034, 0x00022889,
1996 0x034, 0x00021489,
1997 0x034, 0x0002044A,
1998 0xFF0F02C0, 0xCDEF,
1999 0x034, 0x000280AF,
2000 0x034, 0x000270AC,
2001 0x034, 0x0002608B,
2002 0x034, 0x00025069,
2003 0x034, 0x00024048,
2004 0x034, 0x00023045,
2005 0x034, 0x00022026,
2006 0x034, 0x00021023,
2007 0x034, 0x00020002,
2008 0xCDCDCDCD, 0xCDCD,
2009 0x034, 0x00028DEE,
2010 0x034, 0x00027DEB,
2011 0x034, 0x00026CCD,
2012 0x034, 0x00025CCA,
2013 0x034, 0x0002488C,
2014 0x034, 0x0002384C,
2015 0x034, 0x00022849,
2016 0x034, 0x00021449,
2017 0x034, 0x0002004D,
2018 0xFF0F0104, 0xDEAD,
2019 0xFF0F02C0, 0xABCD,
2020 0x034, 0x0000A0D7,
2021 0x034, 0x000090D3,
2022 0x034, 0x000080B1,
2023 0x034, 0x000070AE,
2024 0xCDCDCDCD, 0xCDCD,
2025 0x034, 0x0000ADF7,
2026 0x034, 0x00009DF4,
2027 0x034, 0x00008DF1,
2028 0x034, 0x00007DEE,
2029 0xFF0F02C0, 0xDEAD,
2030 0xFF0F0104, 0xABCD,
2031 0x034, 0x00006DEB,
2032 0x034, 0x00005CEC,
2033 0x034, 0x00004CE9,
2034 0x034, 0x000038CA,
2035 0x034, 0x00002889,
2036 0x034, 0x00001489,
2037 0x034, 0x0000044A,
2038 0xFF0F0204, 0xCDEF,
2039 0x034, 0x00006DEB,
2040 0x034, 0x00005CEC,
2041 0x034, 0x00004CE9,
2042 0x034, 0x000038CA,
2043 0x034, 0x00002889,
2044 0x034, 0x00001489,
2045 0x034, 0x0000044A,
2046 0xFF0F0404, 0xCDEF,
2047 0x034, 0x00006DEB,
2048 0x034, 0x00005CEC,
2049 0x034, 0x00004CE9,
2050 0x034, 0x000038CA,
2051 0x034, 0x00002889,
2052 0x034, 0x00001489,
2053 0x034, 0x0000044A,
2054 0xFF0F02C0, 0xCDEF,
2055 0x034, 0x0000608D,
2056 0x034, 0x0000506B,
2057 0x034, 0x0000404A,
2058 0x034, 0x00003047,
2059 0x034, 0x00002044,
2060 0x034, 0x00001025,
2061 0x034, 0x00000004,
2062 0xCDCDCDCD, 0xCDCD,
2063 0x034, 0x00006DCD,
2064 0x034, 0x00005CCD,
2065 0x034, 0x00004CCA,
2066 0x034, 0x0000388C,
2067 0x034, 0x00002888,
2068 0x034, 0x00001488,
2069 0x034, 0x00000486,
2070 0xFF0F0104, 0xDEAD,
2071 0x0EF, 0x00000000,
2072 0x018, 0x0001712A,
2073 0x0EF, 0x00000040,
2074 0xFF0F0104, 0xABCD,
2075 0x035, 0x00000187,
2076 0x035, 0x00008187,
2077 0x035, 0x00010187,
2078 0x035, 0x00020188,
2079 0x035, 0x00028188,
2080 0x035, 0x00030188,
2081 0x035, 0x00040188,
2082 0x035, 0x00048188,
2083 0x035, 0x00050188,
2084 0xFF0F0204, 0xCDEF,
2085 0x035, 0x00000187,
2086 0x035, 0x00008187,
2087 0x035, 0x00010187,
2088 0x035, 0x00020188,
2089 0x035, 0x00028188,
2090 0x035, 0x00030188,
2091 0x035, 0x00040188,
2092 0x035, 0x00048188,
2093 0x035, 0x00050188,
2094 0xFF0F0404, 0xCDEF,
2095 0x035, 0x00000187,
2096 0x035, 0x00008187,
2097 0x035, 0x00010187,
2098 0x035, 0x00020188,
2099 0x035, 0x00028188,
2100 0x035, 0x00030188,
2101 0x035, 0x00040188,
2102 0x035, 0x00048188,
2103 0x035, 0x00050188,
2104 0xCDCDCDCD, 0xCDCD,
2105 0x035, 0x00000145,
2106 0x035, 0x00008145,
2107 0x035, 0x00010145,
2108 0x035, 0x00020196,
2109 0x035, 0x00028196,
2110 0x035, 0x00030196,
2111 0x035, 0x000401C7,
2112 0x035, 0x000481C7,
2113 0x035, 0x000501C7,
2114 0xFF0F0104, 0xDEAD,
2115 0x0EF, 0x00000000,
2116 0x018, 0x0001712A,
2117 0x0EF, 0x00000010,
2118 0xFF0F0104, 0xABCD,
2119 0x036, 0x00085733,
2120 0x036, 0x0008D733,
2121 0x036, 0x00095733,
2122 0x036, 0x0009D733,
2123 0x036, 0x000A64B4,
2124 0x036, 0x000AE4B4,
2125 0x036, 0x000B64B4,
2126 0x036, 0x000BE4B4,
2127 0x036, 0x000C64B4,
2128 0x036, 0x000CE4B4,
2129 0x036, 0x000D64B4,
2130 0x036, 0x000DE4B4,
2131 0xFF0F0204, 0xCDEF,
2132 0x036, 0x00085733,
2133 0x036, 0x0008D733,
2134 0x036, 0x00095733,
2135 0x036, 0x0009D733,
2136 0x036, 0x000A64B4,
2137 0x036, 0x000AE4B4,
2138 0x036, 0x000B64B4,
2139 0x036, 0x000BE4B4,
2140 0x036, 0x000C64B4,
2141 0x036, 0x000CE4B4,
2142 0x036, 0x000D64B4,
2143 0x036, 0x000DE4B4,
2144 0xFF0F0404, 0xCDEF,
2145 0x036, 0x00085733,
2146 0x036, 0x0008D733,
2147 0x036, 0x00095733,
2148 0x036, 0x0009D733,
2149 0x036, 0x000A64B4,
2150 0x036, 0x000AE4B4,
2151 0x036, 0x000B64B4,
2152 0x036, 0x000BE4B4,
2153 0x036, 0x000C64B4,
2154 0x036, 0x000CE4B4,
2155 0x036, 0x000D64B4,
2156 0x036, 0x000DE4B4,
2157 0xCDCDCDCD, 0xCDCD,
2158 0x036, 0x000056B3,
2159 0x036, 0x0000D6B3,
2160 0x036, 0x000156B3,
2161 0x036, 0x0001D6B3,
2162 0x036, 0x00026634,
2163 0x036, 0x0002E634,
2164 0x036, 0x00036634,
2165 0x036, 0x0003E634,
2166 0x036, 0x000467B4,
2167 0x036, 0x0004E7B4,
2168 0x036, 0x000567B4,
2169 0x036, 0x0005E7B4,
2170 0xFF0F0104, 0xDEAD,
2171 0x0EF, 0x00000000,
2172 0x0EF, 0x00000008,
2173 0xFF0F0104, 0xABCD,
2174 0x03C, 0x000001C8,
2175 0x03C, 0x00000492,
2176 0xFF0F0204, 0xCDEF,
2177 0x03C, 0x000001C8,
2178 0x03C, 0x00000492,
2179 0xFF0F0404, 0xCDEF,
2180 0x03C, 0x000001C8,
2181 0x03C, 0x00000492,
2182 0xCDCDCDCD, 0xCDCD,
2183 0x03C, 0x0000022A,
2184 0x03C, 0x00000594,
2185 0xFF0F0104, 0xDEAD,
2186 0xFF0F0104, 0xABCD,
2187 0x03C, 0x00000800,
2188 0xFF0F0204, 0xCDEF,
2189 0x03C, 0x00000800,
2190 0xFF0F0404, 0xCDEF,
2191 0x03C, 0x00000800,
2192 0xFF0F02C0, 0xCDEF,
2193 0x03C, 0x00000820,
2194 0xCDCDCDCD, 0xCDCD,
2195 0x03C, 0x00000900,
2196 0xFF0F0104, 0xDEAD,
2197 0x0EF, 0x00000000,
2198 0x018, 0x0001712A,
2199 0x0EF, 0x00000002,
2200 0xFF0F0104, 0xABCD,
2201 0x008, 0x0004E400,
2202 0xFF0F0204, 0xCDEF,
2203 0x008, 0x0004E400,
2204 0xFF0F0404, 0xCDEF,
2205 0x008, 0x0004E400,
2206 0xCDCDCDCD, 0xCDCD,
2207 0x008, 0x00002000,
2208 0xFF0F0104, 0xDEAD,
2209 0x0EF, 0x00000000,
2210 0x0DF, 0x000000C0,
2211 0x01F, 0x00040064,
2212 0xFF0F0104, 0xABCD,
2213 0x058, 0x000A7284,
2214 0x059, 0x000600EC,
2215 0xFF0F0204, 0xCDEF,
2216 0x058, 0x000A7284,
2217 0x059, 0x000600EC,
2218 0xFF0F0404, 0xCDEF,
2219 0x058, 0x000A7284,
2220 0x059, 0x000600EC,
2221 0xCDCDCDCD, 0xCDCD,
2222 0x058, 0x00081184,
2223 0x059, 0x0006016C,
2224 0xFF0F0104, 0xDEAD,
2225 0xFF0F0104, 0xABCD,
2226 0x061, 0x000E8D73,
2227 0x062, 0x00093FC5,
2228 0xFF0F0204, 0xCDEF,
2229 0x061, 0x000E8D73,
2230 0x062, 0x00093FC5,
2231 0xFF0F0404, 0xCDEF,
2232 0x061, 0x000E8D73,
2233 0x062, 0x00093FC5,
2234 0xCDCDCDCD, 0xCDCD,
2235 0x061, 0x000EAD53,
2236 0x062, 0x00093BC4,
2237 0xFF0F0104, 0xDEAD,
2238 0xFF0F0104, 0xABCD,
2239 0x063, 0x000110E9,
2240 0xFF0F0204, 0xCDEF,
2241 0x063, 0x000110E9,
2242 0xFF0F0404, 0xCDEF,
2243 0x063, 0x000110E9,
2244 0xFF0F0200, 0xCDEF,
2245 0x063, 0x000710E9,
2246 0xFF0F02C0, 0xCDEF,
2247 0x063, 0x000110E9,
2248 0xCDCDCDCD, 0xCDCD,
2249 0x063, 0x000714E9,
2250 0xFF0F0104, 0xDEAD,
2251 0xFF0F0104, 0xABCD,
2252 0x064, 0x0001C27C,
2253 0xFF0F0204, 0xCDEF,
2254 0x064, 0x0001C27C,
2255 0xFF0F0404, 0xCDEF,
2256 0x064, 0x0001C27C,
2257 0xCDCDCDCD, 0xCDCD,
2258 0x064, 0x0001C67C,
2259 0xFF0F0104, 0xDEAD,
2260 0xFF0F0200, 0xABCD,
2261 0x065, 0x00093016,
2262 0xFF0F02C0, 0xCDEF,
2263 0x065, 0x00093015,
2264 0xCDCDCDCD, 0xCDCD,
2265 0x065, 0x00091016,
2266 0xFF0F0200, 0xDEAD,
2267 0x018, 0x00000006,
2268 0x0EF, 0x00002000,
2269 0x03B, 0x0003824B,
2270 0x03B, 0x0003024B,
2271 0x03B, 0x0002844B,
2272 0x03B, 0x00020F4B,
2273 0x03B, 0x00018F4B,
2274 0x03B, 0x000104B2,
2275 0x03B, 0x00008049,
2276 0x03B, 0x00000148,
2277 0x03B, 0x0007824B,
2278 0x03B, 0x0007024B,
2279 0x03B, 0x0006824B,
2280 0x03B, 0x00060F4B,
2281 0x03B, 0x00058F4B,
2282 0x03B, 0x000504B2,
2283 0x03B, 0x00048049,
2284 0x03B, 0x00040148,
2285 0x0EF, 0x00000000,
2286 0x0EF, 0x00000100,
2287 0x034, 0x0000ADF3,
2288 0x034, 0x00009DEF,
2289 0x034, 0x00008DEC,
2290 0x034, 0x00007DE9,
2291 0x034, 0x00006CED,
2292 0x034, 0x00005CE9,
2293 0x034, 0x000044E9,
2294 0x034, 0x000034E6,
2295 0x034, 0x0000246A,
2296 0x034, 0x00001467,
2297 0x034, 0x00000068,
2298 0x0EF, 0x00000000,
2299 0x0ED, 0x00000010,
2300 0x044, 0x0000ADF2,
2301 0x044, 0x00009DEF,
2302 0x044, 0x00008DEC,
2303 0x044, 0x00007DE9,
2304 0x044, 0x00006CEC,
2305 0x044, 0x00005CE9,
2306 0x044, 0x000044EC,
2307 0x044, 0x000034E9,
2308 0x044, 0x0000246C,
2309 0x044, 0x00001469,
2310 0x044, 0x0000006C,
2311 0x0ED, 0x00000000,
2312 0x0ED, 0x00000001,
2313 0x040, 0x00038DA7,
2314 0x040, 0x000300C2,
2315 0x040, 0x000288E2,
2316 0x040, 0x000200B8,
2317 0x040, 0x000188A5,
2318 0x040, 0x00010FBC,
2319 0x040, 0x00008F71,
2320 0x040, 0x00000240,
2321 0x0ED, 0x00000000,
2322 0x0EF, 0x000020A2,
2323 0x0DF, 0x00000080,
2324 0x035, 0x00000120,
2325 0x035, 0x00008120,
2326 0x035, 0x00010120,
2327 0x036, 0x00000085,
2328 0x036, 0x00008085,
2329 0x036, 0x00010085,
2330 0x036, 0x00018085,
2331 0x0EF, 0x00000000,
2332 0x051, 0x00000C31,
2333 0x052, 0x00000622,
2334 0x053, 0x000FC70B,
2335 0x054, 0x0000017E,
2336 0x056, 0x00051DF3,
2337 0x051, 0x00000C01,
2338 0x052, 0x000006D6,
2339 0x053, 0x000FC649,
2340 0x070, 0x00049661,
2341 0x071, 0x0007843E,
2342 0x072, 0x00000382,
2343 0x074, 0x00051400,
2344 0x035, 0x00000160,
2345 0x035, 0x00008160,
2346 0x035, 0x00010160,
2347 0x036, 0x00000124,
2348 0x036, 0x00008124,
2349 0x036, 0x00010124,
2350 0x036, 0x00018124,
2351 0x0ED, 0x0000000C,
2352 0x045, 0x00000140,
2353 0x045, 0x00008140,
2354 0x045, 0x00010140,
2355 0x046, 0x00000124,
2356 0x046, 0x00008124,
2357 0x046, 0x00010124,
2358 0x046, 0x00018124,
2359 0x0DF, 0x00000088,
2360 0x0B3, 0x000F0E18,
2361 0x0B4, 0x0001214C,
2362 0x0B7, 0x0003000C,
2363 0x01C, 0x000539D2,
2364 0x018, 0x0001F12A,
2365 0x0FE, 0x00000000,
2366 0x0FE, 0x00000000,
2367 0x018, 0x0001712A,
2368};
2369
2370u32 RTL8812AE_MAC_REG_ARRAY[] = {
2371 0x010, 0x0000000C,
2372 0xFF0F0180, 0xABCD,
2373 0x025, 0x0000000F,
2374 0xFF0F01C0, 0xCDEF,
2375 0x025, 0x0000000F,
2376 0xCDCDCDCD, 0xCDCD,
2377 0x025, 0x0000006F,
2378 0xFF0F0180, 0xDEAD,
2379 0x072, 0x00000000,
2380 0x428, 0x0000000A,
2381 0x429, 0x00000010,
2382 0x430, 0x00000000,
2383 0x431, 0x00000000,
2384 0x432, 0x00000000,
2385 0x433, 0x00000001,
2386 0x434, 0x00000004,
2387 0x435, 0x00000005,
2388 0x436, 0x00000007,
2389 0x437, 0x00000008,
2390 0x43C, 0x00000004,
2391 0x43D, 0x00000005,
2392 0x43E, 0x00000007,
2393 0x43F, 0x00000008,
2394 0x440, 0x0000005D,
2395 0x441, 0x00000001,
2396 0x442, 0x00000000,
2397 0x444, 0x00000010,
2398 0x445, 0x00000000,
2399 0x446, 0x00000000,
2400 0x447, 0x00000000,
2401 0x448, 0x00000000,
2402 0x449, 0x000000F0,
2403 0x44A, 0x0000000F,
2404 0x44B, 0x0000003E,
2405 0x44C, 0x00000010,
2406 0x44D, 0x00000000,
2407 0x44E, 0x00000000,
2408 0x44F, 0x00000000,
2409 0x450, 0x00000000,
2410 0x451, 0x000000F0,
2411 0x452, 0x0000000F,
2412 0x453, 0x00000000,
2413 0x45B, 0x00000080,
2414 0x460, 0x00000066,
2415 0x461, 0x00000066,
2416 0x4C8, 0x000000FF,
2417 0x4C9, 0x00000008,
2418 0x4CC, 0x000000FF,
2419 0x4CD, 0x000000FF,
2420 0x4CE, 0x00000001,
2421 0x500, 0x00000026,
2422 0x501, 0x000000A2,
2423 0x502, 0x0000002F,
2424 0x503, 0x00000000,
2425 0x504, 0x00000028,
2426 0x505, 0x000000A3,
2427 0x506, 0x0000005E,
2428 0x507, 0x00000000,
2429 0x508, 0x0000002B,
2430 0x509, 0x000000A4,
2431 0x50A, 0x0000005E,
2432 0x50B, 0x00000000,
2433 0x50C, 0x0000004F,
2434 0x50D, 0x000000A4,
2435 0x50E, 0x00000000,
2436 0x50F, 0x00000000,
2437 0x512, 0x0000001C,
2438 0x514, 0x0000000A,
2439 0x516, 0x0000000A,
2440 0x525, 0x0000004F,
2441 0x550, 0x00000010,
2442 0x551, 0x00000010,
2443 0x559, 0x00000002,
2444 0x55C, 0x00000050,
2445 0x55D, 0x000000FF,
2446 0x604, 0x00000001,
2447 0x605, 0x00000030,
2448 0x607, 0x00000003,
2449 0x608, 0x0000000E,
2450 0x609, 0x0000002A,
2451 0x620, 0x000000FF,
2452 0x621, 0x000000FF,
2453 0x622, 0x000000FF,
2454 0x623, 0x000000FF,
2455 0x624, 0x000000FF,
2456 0x625, 0x000000FF,
2457 0x626, 0x000000FF,
2458 0x627, 0x000000FF,
2459 0x638, 0x00000050,
2460 0x63C, 0x0000000A,
2461 0x63D, 0x0000000A,
2462 0x63E, 0x0000000E,
2463 0x63F, 0x0000000E,
2464 0x640, 0x00000080,
2465 0x642, 0x00000040,
2466 0x643, 0x00000000,
2467 0x652, 0x000000C8,
2468 0x66E, 0x00000005,
2469 0x700, 0x00000021,
2470 0x701, 0x00000043,
2471 0x702, 0x00000065,
2472 0x703, 0x00000087,
2473 0x708, 0x00000021,
2474 0x709, 0x00000043,
2475 0x70A, 0x00000065,
2476 0x70B, 0x00000087,
2477 0x718, 0x00000040,
2478
2479};
2480
2481u32 RTL8821AE_MAC_REG_ARRAY[] = {
2482 0x428, 0x0000000A,
2483 0x429, 0x00000010,
2484 0x430, 0x00000000,
2485 0x431, 0x00000000,
2486 0x432, 0x00000000,
2487 0x433, 0x00000001,
2488 0x434, 0x00000004,
2489 0x435, 0x00000005,
2490 0x436, 0x00000007,
2491 0x437, 0x00000008,
2492 0x43C, 0x00000004,
2493 0x43D, 0x00000005,
2494 0x43E, 0x00000007,
2495 0x43F, 0x00000008,
2496 0x440, 0x0000005D,
2497 0x441, 0x00000001,
2498 0x442, 0x00000000,
2499 0x444, 0x00000010,
2500 0x445, 0x00000000,
2501 0x446, 0x00000000,
2502 0x447, 0x00000000,
2503 0x448, 0x00000000,
2504 0x449, 0x000000F0,
2505 0x44A, 0x0000000F,
2506 0x44B, 0x0000003E,
2507 0x44C, 0x00000010,
2508 0x44D, 0x00000000,
2509 0x44E, 0x00000000,
2510 0x44F, 0x00000000,
2511 0x450, 0x00000000,
2512 0x451, 0x000000F0,
2513 0x452, 0x0000000F,
2514 0x453, 0x00000000,
2515 0x456, 0x0000005E,
2516 0x460, 0x00000066,
2517 0x461, 0x00000066,
2518 0x4C8, 0x0000003F,
2519 0x4C9, 0x000000FF,
2520 0x4CC, 0x000000FF,
2521 0x4CD, 0x000000FF,
2522 0x4CE, 0x00000001,
2523 0x500, 0x00000026,
2524 0x501, 0x000000A2,
2525 0x502, 0x0000002F,
2526 0x503, 0x00000000,
2527 0x504, 0x00000028,
2528 0x505, 0x000000A3,
2529 0x506, 0x0000005E,
2530 0x507, 0x00000000,
2531 0x508, 0x0000002B,
2532 0x509, 0x000000A4,
2533 0x50A, 0x0000005E,
2534 0x50B, 0x00000000,
2535 0x50C, 0x0000004F,
2536 0x50D, 0x000000A4,
2537 0x50E, 0x00000000,
2538 0x50F, 0x00000000,
2539 0x512, 0x0000001C,
2540 0x514, 0x0000000A,
2541 0x516, 0x0000000A,
2542 0x525, 0x0000004F,
2543 0x550, 0x00000010,
2544 0x551, 0x00000010,
2545 0x559, 0x00000002,
2546 0x55C, 0x00000050,
2547 0x55D, 0x000000FF,
2548 0x605, 0x00000030,
2549 0x607, 0x00000007,
2550 0x608, 0x0000000E,
2551 0x609, 0x0000002A,
2552 0x620, 0x000000FF,
2553 0x621, 0x000000FF,
2554 0x622, 0x000000FF,
2555 0x623, 0x000000FF,
2556 0x624, 0x000000FF,
2557 0x625, 0x000000FF,
2558 0x626, 0x000000FF,
2559 0x627, 0x000000FF,
2560 0x638, 0x00000050,
2561 0x63C, 0x0000000A,
2562 0x63D, 0x0000000A,
2563 0x63E, 0x0000000E,
2564 0x63F, 0x0000000E,
2565 0x640, 0x00000040,
2566 0x642, 0x00000040,
2567 0x643, 0x00000000,
2568 0x652, 0x000000C8,
2569 0x66E, 0x00000005,
2570 0x700, 0x00000021,
2571 0x701, 0x00000043,
2572 0x702, 0x00000065,
2573 0x703, 0x00000087,
2574 0x708, 0x00000021,
2575 0x709, 0x00000043,
2576 0x70A, 0x00000065,
2577 0x70B, 0x00000087,
2578 0x718, 0x00000040,
2579};
2580
2581u32 RTL8812AE_AGC_TAB_ARRAY[] = {
2582 0xFF0F07D8, 0xABCD,
2583 0x81C, 0xFC000001,
2584 0x81C, 0xFB020001,
2585 0x81C, 0xFA040001,
2586 0x81C, 0xF9060001,
2587 0x81C, 0xF8080001,
2588 0x81C, 0xF70A0001,
2589 0x81C, 0xF60C0001,
2590 0x81C, 0xF50E0001,
2591 0x81C, 0xF4100001,
2592 0x81C, 0xF3120001,
2593 0x81C, 0xF2140001,
2594 0x81C, 0xF1160001,
2595 0x81C, 0xF0180001,
2596 0x81C, 0xEF1A0001,
2597 0x81C, 0xEE1C0001,
2598 0x81C, 0xED1E0001,
2599 0x81C, 0xEC200001,
2600 0x81C, 0xEB220001,
2601 0x81C, 0xEA240001,
2602 0x81C, 0xCD260001,
2603 0x81C, 0xCC280001,
2604 0x81C, 0xCB2A0001,
2605 0x81C, 0xCA2C0001,
2606 0x81C, 0xC92E0001,
2607 0x81C, 0xC8300001,
2608 0x81C, 0xA6320001,
2609 0x81C, 0xA5340001,
2610 0x81C, 0xA4360001,
2611 0x81C, 0xA3380001,
2612 0x81C, 0xA23A0001,
2613 0x81C, 0x883C0001,
2614 0x81C, 0x873E0001,
2615 0x81C, 0x86400001,
2616 0x81C, 0x85420001,
2617 0x81C, 0x84440001,
2618 0x81C, 0x83460001,
2619 0x81C, 0x82480001,
2620 0x81C, 0x814A0001,
2621 0x81C, 0x484C0001,
2622 0x81C, 0x474E0001,
2623 0x81C, 0x46500001,
2624 0x81C, 0x45520001,
2625 0x81C, 0x44540001,
2626 0x81C, 0x43560001,
2627 0x81C, 0x42580001,
2628 0x81C, 0x415A0001,
2629 0x81C, 0x255C0001,
2630 0x81C, 0x245E0001,
2631 0x81C, 0x23600001,
2632 0x81C, 0x22620001,
2633 0x81C, 0x21640001,
2634 0x81C, 0x21660001,
2635 0x81C, 0x21680001,
2636 0x81C, 0x216A0001,
2637 0x81C, 0x216C0001,
2638 0x81C, 0x216E0001,
2639 0x81C, 0x21700001,
2640 0x81C, 0x21720001,
2641 0x81C, 0x21740001,
2642 0x81C, 0x21760001,
2643 0x81C, 0x21780001,
2644 0x81C, 0x217A0001,
2645 0x81C, 0x217C0001,
2646 0x81C, 0x217E0001,
2647 0xFF0F07D0, 0xCDEF,
2648 0x81C, 0xF9000001,
2649 0x81C, 0xF8020001,
2650 0x81C, 0xF7040001,
2651 0x81C, 0xF6060001,
2652 0x81C, 0xF5080001,
2653 0x81C, 0xF40A0001,
2654 0x81C, 0xF30C0001,
2655 0x81C, 0xF20E0001,
2656 0x81C, 0xF1100001,
2657 0x81C, 0xF0120001,
2658 0x81C, 0xEF140001,
2659 0x81C, 0xEE160001,
2660 0x81C, 0xED180001,
2661 0x81C, 0xEC1A0001,
2662 0x81C, 0xEB1C0001,
2663 0x81C, 0xEA1E0001,
2664 0x81C, 0xCD200001,
2665 0x81C, 0xCC220001,
2666 0x81C, 0xCB240001,
2667 0x81C, 0xCA260001,
2668 0x81C, 0xC9280001,
2669 0x81C, 0xC82A0001,
2670 0x81C, 0xC72C0001,
2671 0x81C, 0xC62E0001,
2672 0x81C, 0xA5300001,
2673 0x81C, 0xA4320001,
2674 0x81C, 0xA3340001,
2675 0x81C, 0xA2360001,
2676 0x81C, 0x88380001,
2677 0x81C, 0x873A0001,
2678 0x81C, 0x863C0001,
2679 0x81C, 0x853E0001,
2680 0x81C, 0x84400001,
2681 0x81C, 0x83420001,
2682 0x81C, 0x82440001,
2683 0x81C, 0x81460001,
2684 0x81C, 0x48480001,
2685 0x81C, 0x474A0001,
2686 0x81C, 0x464C0001,
2687 0x81C, 0x454E0001,
2688 0x81C, 0x44500001,
2689 0x81C, 0x43520001,
2690 0x81C, 0x42540001,
2691 0x81C, 0x41560001,
2692 0x81C, 0x25580001,
2693 0x81C, 0x245A0001,
2694 0x81C, 0x235C0001,
2695 0x81C, 0x225E0001,
2696 0x81C, 0x21600001,
2697 0x81C, 0x21620001,
2698 0x81C, 0x21640001,
2699 0x81C, 0x21660001,
2700 0x81C, 0x21680001,
2701 0x81C, 0x216A0001,
2702 0x81C, 0x236C0001,
2703 0x81C, 0x226E0001,
2704 0x81C, 0x21700001,
2705 0x81C, 0x21720001,
2706 0x81C, 0x21740001,
2707 0x81C, 0x21760001,
2708 0x81C, 0x21780001,
2709 0x81C, 0x217A0001,
2710 0x81C, 0x217C0001,
2711 0x81C, 0x217E0001,
2712 0xCDCDCDCD, 0xCDCD,
2713 0x81C, 0xFF000001,
2714 0x81C, 0xFF020001,
2715 0x81C, 0xFF040001,
2716 0x81C, 0xFF060001,
2717 0x81C, 0xFF080001,
2718 0x81C, 0xFE0A0001,
2719 0x81C, 0xFD0C0001,
2720 0x81C, 0xFC0E0001,
2721 0x81C, 0xFB100001,
2722 0x81C, 0xFA120001,
2723 0x81C, 0xF9140001,
2724 0x81C, 0xF8160001,
2725 0x81C, 0xF7180001,
2726 0x81C, 0xF61A0001,
2727 0x81C, 0xF51C0001,
2728 0x81C, 0xF41E0001,
2729 0x81C, 0xF3200001,
2730 0x81C, 0xF2220001,
2731 0x81C, 0xF1240001,
2732 0x81C, 0xF0260001,
2733 0x81C, 0xEF280001,
2734 0x81C, 0xEE2A0001,
2735 0x81C, 0xED2C0001,
2736 0x81C, 0xEC2E0001,
2737 0x81C, 0xEB300001,
2738 0x81C, 0xEA320001,
2739 0x81C, 0xE9340001,
2740 0x81C, 0xE8360001,
2741 0x81C, 0xE7380001,
2742 0x81C, 0xE63A0001,
2743 0x81C, 0xE53C0001,
2744 0x81C, 0xC73E0001,
2745 0x81C, 0xC6400001,
2746 0x81C, 0xC5420001,
2747 0x81C, 0xC4440001,
2748 0x81C, 0xC3460001,
2749 0x81C, 0xC2480001,
2750 0x81C, 0xC14A0001,
2751 0x81C, 0xA74C0001,
2752 0x81C, 0xA64E0001,
2753 0x81C, 0xA5500001,
2754 0x81C, 0xA4520001,
2755 0x81C, 0xA3540001,
2756 0x81C, 0xA2560001,
2757 0x81C, 0xA1580001,
2758 0x81C, 0x675A0001,
2759 0x81C, 0x665C0001,
2760 0x81C, 0x655E0001,
2761 0x81C, 0x64600001,
2762 0x81C, 0x63620001,
2763 0x81C, 0x48640001,
2764 0x81C, 0x47660001,
2765 0x81C, 0x46680001,
2766 0x81C, 0x456A0001,
2767 0x81C, 0x446C0001,
2768 0x81C, 0x436E0001,
2769 0x81C, 0x42700001,
2770 0x81C, 0x41720001,
2771 0x81C, 0x41740001,
2772 0x81C, 0x41760001,
2773 0x81C, 0x41780001,
2774 0x81C, 0x417A0001,
2775 0x81C, 0x417C0001,
2776 0x81C, 0x417E0001,
2777 0xFF0F07D8, 0xDEAD,
2778 0xFF0F0180, 0xABCD,
2779 0x81C, 0xFC800001,
2780 0x81C, 0xFB820001,
2781 0x81C, 0xFA840001,
2782 0x81C, 0xF9860001,
2783 0x81C, 0xF8880001,
2784 0x81C, 0xF78A0001,
2785 0x81C, 0xF68C0001,
2786 0x81C, 0xF58E0001,
2787 0x81C, 0xF4900001,
2788 0x81C, 0xF3920001,
2789 0x81C, 0xF2940001,
2790 0x81C, 0xF1960001,
2791 0x81C, 0xF0980001,
2792 0x81C, 0xEF9A0001,
2793 0x81C, 0xEE9C0001,
2794 0x81C, 0xED9E0001,
2795 0x81C, 0xECA00001,
2796 0x81C, 0xEBA20001,
2797 0x81C, 0xEAA40001,
2798 0x81C, 0xE9A60001,
2799 0x81C, 0xE8A80001,
2800 0x81C, 0xE7AA0001,
2801 0x81C, 0xE6AC0001,
2802 0x81C, 0xE5AE0001,
2803 0x81C, 0xE4B00001,
2804 0x81C, 0xE3B20001,
2805 0x81C, 0xA8B40001,
2806 0x81C, 0xA7B60001,
2807 0x81C, 0xA6B80001,
2808 0x81C, 0xA5BA0001,
2809 0x81C, 0xA4BC0001,
2810 0x81C, 0xA3BE0001,
2811 0x81C, 0xA2C00001,
2812 0x81C, 0xA1C20001,
2813 0x81C, 0x68C40001,
2814 0x81C, 0x67C60001,
2815 0x81C, 0x66C80001,
2816 0x81C, 0x65CA0001,
2817 0x81C, 0x64CC0001,
2818 0x81C, 0x47CE0001,
2819 0x81C, 0x46D00001,
2820 0x81C, 0x45D20001,
2821 0x81C, 0x44D40001,
2822 0x81C, 0x43D60001,
2823 0x81C, 0x42D80001,
2824 0x81C, 0x08DA0001,
2825 0x81C, 0x07DC0001,
2826 0x81C, 0x06DE0001,
2827 0x81C, 0x05E00001,
2828 0x81C, 0x04E20001,
2829 0x81C, 0x03E40001,
2830 0x81C, 0x02E60001,
2831 0x81C, 0x01E80001,
2832 0x81C, 0x01EA0001,
2833 0x81C, 0x01EC0001,
2834 0x81C, 0x01EE0001,
2835 0x81C, 0x01F00001,
2836 0x81C, 0x01F20001,
2837 0x81C, 0x01F40001,
2838 0x81C, 0x01F60001,
2839 0x81C, 0x01F80001,
2840 0x81C, 0x01FA0001,
2841 0x81C, 0x01FC0001,
2842 0x81C, 0x01FE0001,
2843 0xFF0F0280, 0xCDEF,
2844 0x81C, 0xFC800001,
2845 0x81C, 0xFB820001,
2846 0x81C, 0xFA840001,
2847 0x81C, 0xF9860001,
2848 0x81C, 0xF8880001,
2849 0x81C, 0xF78A0001,
2850 0x81C, 0xF68C0001,
2851 0x81C, 0xF58E0001,
2852 0x81C, 0xF4900001,
2853 0x81C, 0xF3920001,
2854 0x81C, 0xF2940001,
2855 0x81C, 0xF1960001,
2856 0x81C, 0xF0980001,
2857 0x81C, 0xEF9A0001,
2858 0x81C, 0xEE9C0001,
2859 0x81C, 0xED9E0001,
2860 0x81C, 0xECA00001,
2861 0x81C, 0xEBA20001,
2862 0x81C, 0xEAA40001,
2863 0x81C, 0xE9A60001,
2864 0x81C, 0xE8A80001,
2865 0x81C, 0xE7AA0001,
2866 0x81C, 0xE6AC0001,
2867 0x81C, 0xE5AE0001,
2868 0x81C, 0xE4B00001,
2869 0x81C, 0xE3B20001,
2870 0x81C, 0xA8B40001,
2871 0x81C, 0xA7B60001,
2872 0x81C, 0xA6B80001,
2873 0x81C, 0xA5BA0001,
2874 0x81C, 0xA4BC0001,
2875 0x81C, 0xA3BE0001,
2876 0x81C, 0xA2C00001,
2877 0x81C, 0xA1C20001,
2878 0x81C, 0x68C40001,
2879 0x81C, 0x67C60001,
2880 0x81C, 0x66C80001,
2881 0x81C, 0x65CA0001,
2882 0x81C, 0x64CC0001,
2883 0x81C, 0x47CE0001,
2884 0x81C, 0x46D00001,
2885 0x81C, 0x45D20001,
2886 0x81C, 0x44D40001,
2887 0x81C, 0x43D60001,
2888 0x81C, 0x42D80001,
2889 0x81C, 0x08DA0001,
2890 0x81C, 0x07DC0001,
2891 0x81C, 0x06DE0001,
2892 0x81C, 0x05E00001,
2893 0x81C, 0x04E20001,
2894 0x81C, 0x03E40001,
2895 0x81C, 0x02E60001,
2896 0x81C, 0x01E80001,
2897 0x81C, 0x01EA0001,
2898 0x81C, 0x01EC0001,
2899 0x81C, 0x01EE0001,
2900 0x81C, 0x01F00001,
2901 0x81C, 0x01F20001,
2902 0x81C, 0x01F40001,
2903 0x81C, 0x01F60001,
2904 0x81C, 0x01F80001,
2905 0x81C, 0x01FA0001,
2906 0x81C, 0x01FC0001,
2907 0x81C, 0x01FE0001,
2908 0xFF0F01C0, 0xCDEF,
2909 0x81C, 0xFC800001,
2910 0x81C, 0xFB820001,
2911 0x81C, 0xFA840001,
2912 0x81C, 0xF9860001,
2913 0x81C, 0xF8880001,
2914 0x81C, 0xF78A0001,
2915 0x81C, 0xF68C0001,
2916 0x81C, 0xF58E0001,
2917 0x81C, 0xF4900001,
2918 0x81C, 0xF3920001,
2919 0x81C, 0xF2940001,
2920 0x81C, 0xF1960001,
2921 0x81C, 0xF0980001,
2922 0x81C, 0xEF9A0001,
2923 0x81C, 0xEE9C0001,
2924 0x81C, 0xED9E0001,
2925 0x81C, 0xECA00001,
2926 0x81C, 0xEBA20001,
2927 0x81C, 0xEAA40001,
2928 0x81C, 0xE9A60001,
2929 0x81C, 0xE8A80001,
2930 0x81C, 0xE7AA0001,
2931 0x81C, 0xE6AC0001,
2932 0x81C, 0xE5AE0001,
2933 0x81C, 0xE4B00001,
2934 0x81C, 0xE3B20001,
2935 0x81C, 0xA8B40001,
2936 0x81C, 0xA7B60001,
2937 0x81C, 0xA6B80001,
2938 0x81C, 0xA5BA0001,
2939 0x81C, 0xA4BC0001,
2940 0x81C, 0xA3BE0001,
2941 0x81C, 0xA2C00001,
2942 0x81C, 0xA1C20001,
2943 0x81C, 0x68C40001,
2944 0x81C, 0x67C60001,
2945 0x81C, 0x66C80001,
2946 0x81C, 0x65CA0001,
2947 0x81C, 0x64CC0001,
2948 0x81C, 0x47CE0001,
2949 0x81C, 0x46D00001,
2950 0x81C, 0x45D20001,
2951 0x81C, 0x44D40001,
2952 0x81C, 0x43D60001,
2953 0x81C, 0x42D80001,
2954 0x81C, 0x08DA0001,
2955 0x81C, 0x07DC0001,
2956 0x81C, 0x06DE0001,
2957 0x81C, 0x05E00001,
2958 0x81C, 0x04E20001,
2959 0x81C, 0x03E40001,
2960 0x81C, 0x02E60001,
2961 0x81C, 0x01E80001,
2962 0x81C, 0x01EA0001,
2963 0x81C, 0x01EC0001,
2964 0x81C, 0x01EE0001,
2965 0x81C, 0x01F00001,
2966 0x81C, 0x01F20001,
2967 0x81C, 0x01F40001,
2968 0x81C, 0x01F60001,
2969 0x81C, 0x01F80001,
2970 0x81C, 0x01FA0001,
2971 0x81C, 0x01FC0001,
2972 0x81C, 0x01FE0001,
2973 0xFF0F02C0, 0xCDEF,
2974 0x81C, 0xFC800001,
2975 0x81C, 0xFB820001,
2976 0x81C, 0xFA840001,
2977 0x81C, 0xF9860001,
2978 0x81C, 0xF8880001,
2979 0x81C, 0xF78A0001,
2980 0x81C, 0xF68C0001,
2981 0x81C, 0xF58E0001,
2982 0x81C, 0xF4900001,
2983 0x81C, 0xF3920001,
2984 0x81C, 0xF2940001,
2985 0x81C, 0xF1960001,
2986 0x81C, 0xF0980001,
2987 0x81C, 0xEF9A0001,
2988 0x81C, 0xEE9C0001,
2989 0x81C, 0xED9E0001,
2990 0x81C, 0xECA00001,
2991 0x81C, 0xEBA20001,
2992 0x81C, 0xEAA40001,
2993 0x81C, 0xE9A60001,
2994 0x81C, 0xE8A80001,
2995 0x81C, 0xE7AA0001,
2996 0x81C, 0xE6AC0001,
2997 0x81C, 0xE5AE0001,
2998 0x81C, 0xE4B00001,
2999 0x81C, 0xE3B20001,
3000 0x81C, 0xA8B40001,
3001 0x81C, 0xA7B60001,
3002 0x81C, 0xA6B80001,
3003 0x81C, 0xA5BA0001,
3004 0x81C, 0xA4BC0001,
3005 0x81C, 0xA3BE0001,
3006 0x81C, 0xA2C00001,
3007 0x81C, 0xA1C20001,
3008 0x81C, 0x68C40001,
3009 0x81C, 0x67C60001,
3010 0x81C, 0x66C80001,
3011 0x81C, 0x65CA0001,
3012 0x81C, 0x64CC0001,
3013 0x81C, 0x47CE0001,
3014 0x81C, 0x46D00001,
3015 0x81C, 0x45D20001,
3016 0x81C, 0x44D40001,
3017 0x81C, 0x43D60001,
3018 0x81C, 0x42D80001,
3019 0x81C, 0x08DA0001,
3020 0x81C, 0x07DC0001,
3021 0x81C, 0x06DE0001,
3022 0x81C, 0x05E00001,
3023 0x81C, 0x04E20001,
3024 0x81C, 0x03E40001,
3025 0x81C, 0x02E60001,
3026 0x81C, 0x01E80001,
3027 0x81C, 0x01EA0001,
3028 0x81C, 0x01EC0001,
3029 0x81C, 0x01EE0001,
3030 0x81C, 0x01F00001,
3031 0x81C, 0x01F20001,
3032 0x81C, 0x01F40001,
3033 0x81C, 0x01F60001,
3034 0x81C, 0x01F80001,
3035 0x81C, 0x01FA0001,
3036 0x81C, 0x01FC0001,
3037 0x81C, 0x01FE0001,
3038 0xFF0F07D8, 0xCDEF,
3039 0x81C, 0xFC800001,
3040 0x81C, 0xFB820001,
3041 0x81C, 0xFA840001,
3042 0x81C, 0xF9860001,
3043 0x81C, 0xF8880001,
3044 0x81C, 0xF78A0001,
3045 0x81C, 0xF68C0001,
3046 0x81C, 0xF58E0001,
3047 0x81C, 0xF4900001,
3048 0x81C, 0xF3920001,
3049 0x81C, 0xF2940001,
3050 0x81C, 0xF1960001,
3051 0x81C, 0xF0980001,
3052 0x81C, 0xEF9A0001,
3053 0x81C, 0xEE9C0001,
3054 0x81C, 0xED9E0001,
3055 0x81C, 0xECA00001,
3056 0x81C, 0xEBA20001,
3057 0x81C, 0xEAA40001,
3058 0x81C, 0xE9A60001,
3059 0x81C, 0xE8A80001,
3060 0x81C, 0xE7AA0001,
3061 0x81C, 0xE6AC0001,
3062 0x81C, 0xE5AE0001,
3063 0x81C, 0xE4B00001,
3064 0x81C, 0xE3B20001,
3065 0x81C, 0xA8B40001,
3066 0x81C, 0xA7B60001,
3067 0x81C, 0xA6B80001,
3068 0x81C, 0xA5BA0001,
3069 0x81C, 0xA4BC0001,
3070 0x81C, 0xA3BE0001,
3071 0x81C, 0xA2C00001,
3072 0x81C, 0xA1C20001,
3073 0x81C, 0x68C40001,
3074 0x81C, 0x67C60001,
3075 0x81C, 0x66C80001,
3076 0x81C, 0x65CA0001,
3077 0x81C, 0x64CC0001,
3078 0x81C, 0x47CE0001,
3079 0x81C, 0x46D00001,
3080 0x81C, 0x45D20001,
3081 0x81C, 0x44D40001,
3082 0x81C, 0x43D60001,
3083 0x81C, 0x42D80001,
3084 0x81C, 0x08DA0001,
3085 0x81C, 0x07DC0001,
3086 0x81C, 0x06DE0001,
3087 0x81C, 0x05E00001,
3088 0x81C, 0x04E20001,
3089 0x81C, 0x03E40001,
3090 0x81C, 0x02E60001,
3091 0x81C, 0x01E80001,
3092 0x81C, 0x01EA0001,
3093 0x81C, 0x01EC0001,
3094 0x81C, 0x01EE0001,
3095 0x81C, 0x01F00001,
3096 0x81C, 0x01F20001,
3097 0x81C, 0x01F40001,
3098 0x81C, 0x01F60001,
3099 0x81C, 0x01F80001,
3100 0x81C, 0x01FA0001,
3101 0x81C, 0x01FC0001,
3102 0x81C, 0x01FE0001,
3103 0xFF0F07D0, 0xCDEF,
3104 0x81C, 0xFC800001,
3105 0x81C, 0xFB820001,
3106 0x81C, 0xFA840001,
3107 0x81C, 0xF9860001,
3108 0x81C, 0xF8880001,
3109 0x81C, 0xF78A0001,
3110 0x81C, 0xF68C0001,
3111 0x81C, 0xF58E0001,
3112 0x81C, 0xF4900001,
3113 0x81C, 0xF3920001,
3114 0x81C, 0xF2940001,
3115 0x81C, 0xF1960001,
3116 0x81C, 0xF0980001,
3117 0x81C, 0xEF9A0001,
3118 0x81C, 0xEE9C0001,
3119 0x81C, 0xED9E0001,
3120 0x81C, 0xECA00001,
3121 0x81C, 0xEBA20001,
3122 0x81C, 0xEAA40001,
3123 0x81C, 0xE9A60001,
3124 0x81C, 0xE8A80001,
3125 0x81C, 0xE7AA0001,
3126 0x81C, 0xE6AC0001,
3127 0x81C, 0xE5AE0001,
3128 0x81C, 0xE4B00001,
3129 0x81C, 0xE3B20001,
3130 0x81C, 0xA8B40001,
3131 0x81C, 0xA7B60001,
3132 0x81C, 0xA6B80001,
3133 0x81C, 0xA5BA0001,
3134 0x81C, 0xA4BC0001,
3135 0x81C, 0xA3BE0001,
3136 0x81C, 0xA2C00001,
3137 0x81C, 0xA1C20001,
3138 0x81C, 0x68C40001,
3139 0x81C, 0x67C60001,
3140 0x81C, 0x66C80001,
3141 0x81C, 0x65CA0001,
3142 0x81C, 0x64CC0001,
3143 0x81C, 0x47CE0001,
3144 0x81C, 0x46D00001,
3145 0x81C, 0x45D20001,
3146 0x81C, 0x44D40001,
3147 0x81C, 0x43D60001,
3148 0x81C, 0x42D80001,
3149 0x81C, 0x08DA0001,
3150 0x81C, 0x07DC0001,
3151 0x81C, 0x06DE0001,
3152 0x81C, 0x05E00001,
3153 0x81C, 0x04E20001,
3154 0x81C, 0x03E40001,
3155 0x81C, 0x02E60001,
3156 0x81C, 0x01E80001,
3157 0x81C, 0x01EA0001,
3158 0x81C, 0x01EC0001,
3159 0x81C, 0x01EE0001,
3160 0x81C, 0x01F00001,
3161 0x81C, 0x01F20001,
3162 0x81C, 0x01F40001,
3163 0x81C, 0x01F60001,
3164 0x81C, 0x01F80001,
3165 0x81C, 0x01FA0001,
3166 0x81C, 0x01FC0001,
3167 0x81C, 0x01FE0001,
3168 0xCDCDCDCD, 0xCDCD,
3169 0x81C, 0xFF800001,
3170 0x81C, 0xFF820001,
3171 0x81C, 0xFF840001,
3172 0x81C, 0xFE860001,
3173 0x81C, 0xFD880001,
3174 0x81C, 0xFC8A0001,
3175 0x81C, 0xFB8C0001,
3176 0x81C, 0xFA8E0001,
3177 0x81C, 0xF9900001,
3178 0x81C, 0xF8920001,
3179 0x81C, 0xF7940001,
3180 0x81C, 0xF6960001,
3181 0x81C, 0xF5980001,
3182 0x81C, 0xF49A0001,
3183 0x81C, 0xF39C0001,
3184 0x81C, 0xF29E0001,
3185 0x81C, 0xF1A00001,
3186 0x81C, 0xF0A20001,
3187 0x81C, 0xEFA40001,
3188 0x81C, 0xEEA60001,
3189 0x81C, 0xEDA80001,
3190 0x81C, 0xECAA0001,
3191 0x81C, 0xEBAC0001,
3192 0x81C, 0xEAAE0001,
3193 0x81C, 0xE9B00001,
3194 0x81C, 0xE8B20001,
3195 0x81C, 0xE7B40001,
3196 0x81C, 0xE6B60001,
3197 0x81C, 0xE5B80001,
3198 0x81C, 0xE4BA0001,
3199 0x81C, 0xE3BC0001,
3200 0x81C, 0xA8BE0001,
3201 0x81C, 0xA7C00001,
3202 0x81C, 0xA6C20001,
3203 0x81C, 0xA5C40001,
3204 0x81C, 0xA4C60001,
3205 0x81C, 0xA3C80001,
3206 0x81C, 0xA2CA0001,
3207 0x81C, 0xA1CC0001,
3208 0x81C, 0x68CE0001,
3209 0x81C, 0x67D00001,
3210 0x81C, 0x66D20001,
3211 0x81C, 0x65D40001,
3212 0x81C, 0x64D60001,
3213 0x81C, 0x47D80001,
3214 0x81C, 0x46DA0001,
3215 0x81C, 0x45DC0001,
3216 0x81C, 0x44DE0001,
3217 0x81C, 0x43E00001,
3218 0x81C, 0x42E20001,
3219 0x81C, 0x08E40001,
3220 0x81C, 0x07E60001,
3221 0x81C, 0x06E80001,
3222 0x81C, 0x05EA0001,
3223 0x81C, 0x04EC0001,
3224 0x81C, 0x03EE0001,
3225 0x81C, 0x02F00001,
3226 0x81C, 0x01F20001,
3227 0x81C, 0x01F40001,
3228 0x81C, 0x01F60001,
3229 0x81C, 0x01F80001,
3230 0x81C, 0x01FA0001,
3231 0x81C, 0x01FC0001,
3232 0x81C, 0x01FE0001,
3233 0xFF0F0180, 0xDEAD,
3234 0xC50, 0x00000022,
3235 0xC50, 0x00000020,
3236 0xE50, 0x00000022,
3237 0xE50, 0x00000020,
3238
3239};
3240
3241u32 RTL8821AE_AGC_TAB_ARRAY[] = {
3242 0x81C, 0xBF000001,
3243 0x81C, 0xBF020001,
3244 0x81C, 0xBF040001,
3245 0x81C, 0xBF060001,
3246 0x81C, 0xBE080001,
3247 0x81C, 0xBD0A0001,
3248 0x81C, 0xBC0C0001,
3249 0x81C, 0xBA0E0001,
3250 0x81C, 0xB9100001,
3251 0x81C, 0xB8120001,
3252 0x81C, 0xB7140001,
3253 0x81C, 0xB6160001,
3254 0x81C, 0xB5180001,
3255 0x81C, 0xB41A0001,
3256 0x81C, 0xB31C0001,
3257 0x81C, 0xB21E0001,
3258 0x81C, 0xB1200001,
3259 0x81C, 0xB0220001,
3260 0x81C, 0xAF240001,
3261 0x81C, 0xAE260001,
3262 0x81C, 0xAD280001,
3263 0x81C, 0xAC2A0001,
3264 0x81C, 0xAB2C0001,
3265 0x81C, 0xAA2E0001,
3266 0x81C, 0xA9300001,
3267 0x81C, 0xA8320001,
3268 0x81C, 0xA7340001,
3269 0x81C, 0xA6360001,
3270 0x81C, 0xA5380001,
3271 0x81C, 0xA43A0001,
3272 0x81C, 0xA33C0001,
3273 0x81C, 0x673E0001,
3274 0x81C, 0x66400001,
3275 0x81C, 0x65420001,
3276 0x81C, 0x64440001,
3277 0x81C, 0x63460001,
3278 0x81C, 0x62480001,
3279 0x81C, 0x614A0001,
3280 0x81C, 0x474C0001,
3281 0x81C, 0x464E0001,
3282 0x81C, 0x45500001,
3283 0x81C, 0x44520001,
3284 0x81C, 0x43540001,
3285 0x81C, 0x42560001,
3286 0x81C, 0x41580001,
3287 0x81C, 0x285A0001,
3288 0x81C, 0x275C0001,
3289 0x81C, 0x265E0001,
3290 0x81C, 0x25600001,
3291 0x81C, 0x24620001,
3292 0x81C, 0x0A640001,
3293 0x81C, 0x09660001,
3294 0x81C, 0x08680001,
3295 0x81C, 0x076A0001,
3296 0x81C, 0x066C0001,
3297 0x81C, 0x056E0001,
3298 0x81C, 0x04700001,
3299 0x81C, 0x03720001,
3300 0x81C, 0x02740001,
3301 0x81C, 0x01760001,
3302 0x81C, 0x01780001,
3303 0x81C, 0x017A0001,
3304 0x81C, 0x017C0001,
3305 0x81C, 0x017E0001,
3306 0xFF0F02C0, 0xABCD,
3307 0x81C, 0xFB000101,
3308 0x81C, 0xFA020101,
3309 0x81C, 0xF9040101,
3310 0x81C, 0xF8060101,
3311 0x81C, 0xF7080101,
3312 0x81C, 0xF60A0101,
3313 0x81C, 0xF50C0101,
3314 0x81C, 0xF40E0101,
3315 0x81C, 0xF3100101,
3316 0x81C, 0xF2120101,
3317 0x81C, 0xF1140101,
3318 0x81C, 0xF0160101,
3319 0x81C, 0xEF180101,
3320 0x81C, 0xEE1A0101,
3321 0x81C, 0xED1C0101,
3322 0x81C, 0xEC1E0101,
3323 0x81C, 0xEB200101,
3324 0x81C, 0xEA220101,
3325 0x81C, 0xE9240101,
3326 0x81C, 0xE8260101,
3327 0x81C, 0xE7280101,
3328 0x81C, 0xE62A0101,
3329 0x81C, 0xE52C0101,
3330 0x81C, 0xE42E0101,
3331 0x81C, 0xE3300101,
3332 0x81C, 0xA5320101,
3333 0x81C, 0xA4340101,
3334 0x81C, 0xA3360101,
3335 0x81C, 0x87380101,
3336 0x81C, 0x863A0101,
3337 0x81C, 0x853C0101,
3338 0x81C, 0x843E0101,
3339 0x81C, 0x69400101,
3340 0x81C, 0x68420101,
3341 0x81C, 0x67440101,
3342 0x81C, 0x66460101,
3343 0x81C, 0x49480101,
3344 0x81C, 0x484A0101,
3345 0x81C, 0x474C0101,
3346 0x81C, 0x2A4E0101,
3347 0x81C, 0x29500101,
3348 0x81C, 0x28520101,
3349 0x81C, 0x27540101,
3350 0x81C, 0x26560101,
3351 0x81C, 0x25580101,
3352 0x81C, 0x245A0101,
3353 0x81C, 0x235C0101,
3354 0x81C, 0x055E0101,
3355 0x81C, 0x04600101,
3356 0x81C, 0x03620101,
3357 0x81C, 0x02640101,
3358 0x81C, 0x01660101,
3359 0x81C, 0x01680101,
3360 0x81C, 0x016A0101,
3361 0x81C, 0x016C0101,
3362 0x81C, 0x016E0101,
3363 0x81C, 0x01700101,
3364 0x81C, 0x01720101,
3365 0xCDCDCDCD, 0xCDCD,
3366 0x81C, 0xFF000101,
3367 0x81C, 0xFF020101,
3368 0x81C, 0xFE040101,
3369 0x81C, 0xFD060101,
3370 0x81C, 0xFC080101,
3371 0x81C, 0xFD0A0101,
3372 0x81C, 0xFC0C0101,
3373 0x81C, 0xFB0E0101,
3374 0x81C, 0xFA100101,
3375 0x81C, 0xF9120101,
3376 0x81C, 0xF8140101,
3377 0x81C, 0xF7160101,
3378 0x81C, 0xF6180101,
3379 0x81C, 0xF51A0101,
3380 0x81C, 0xF41C0101,
3381 0x81C, 0xF31E0101,
3382 0x81C, 0xF2200101,
3383 0x81C, 0xF1220101,
3384 0x81C, 0xF0240101,
3385 0x81C, 0xEF260101,
3386 0x81C, 0xEE280101,
3387 0x81C, 0xED2A0101,
3388 0x81C, 0xEC2C0101,
3389 0x81C, 0xEB2E0101,
3390 0x81C, 0xEA300101,
3391 0x81C, 0xE9320101,
3392 0x81C, 0xE8340101,
3393 0x81C, 0xE7360101,
3394 0x81C, 0xE6380101,
3395 0x81C, 0xE53A0101,
3396 0x81C, 0xE43C0101,
3397 0x81C, 0xE33E0101,
3398 0x81C, 0xA5400101,
3399 0x81C, 0xA4420101,
3400 0x81C, 0xA3440101,
3401 0x81C, 0x87460101,
3402 0x81C, 0x86480101,
3403 0x81C, 0x854A0101,
3404 0x81C, 0x844C0101,
3405 0x81C, 0x694E0101,
3406 0x81C, 0x68500101,
3407 0x81C, 0x67520101,
3408 0x81C, 0x66540101,
3409 0x81C, 0x49560101,
3410 0x81C, 0x48580101,
3411 0x81C, 0x475A0101,
3412 0x81C, 0x2A5C0101,
3413 0x81C, 0x295E0101,
3414 0x81C, 0x28600101,
3415 0x81C, 0x27620101,
3416 0x81C, 0x26640101,
3417 0x81C, 0x25660101,
3418 0x81C, 0x24680101,
3419 0x81C, 0x236A0101,
3420 0x81C, 0x056C0101,
3421 0x81C, 0x046E0101,
3422 0x81C, 0x03700101,
3423 0x81C, 0x02720101,
3424 0xFF0F02C0, 0xDEAD,
3425 0x81C, 0x01740101,
3426 0x81C, 0x01760101,
3427 0x81C, 0x01780101,
3428 0x81C, 0x017A0101,
3429 0x81C, 0x017C0101,
3430 0x81C, 0x017E0101,
3431 0xC50, 0x00000022,
3432 0xC50, 0x00000020,
3433
3434};
3435
3436/******************************************************************************
3437* TXPWR_LMT.TXT
3438******************************************************************************/
3439
3440u8 *RTL8812AE_TXPWR_LMT[] = {
3441 "FCC", "2.4G", "20M", "CCK", "1T", "01", "36",
3442 "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32",
3443 "MKK", "2.4G", "20M", "CCK", "1T", "01", "32",
3444 "FCC", "2.4G", "20M", "CCK", "1T", "02", "36",
3445 "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32",
3446 "MKK", "2.4G", "20M", "CCK", "1T", "02", "32",
3447 "FCC", "2.4G", "20M", "CCK", "1T", "03", "36",
3448 "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32",
3449 "MKK", "2.4G", "20M", "CCK", "1T", "03", "32",
3450 "FCC", "2.4G", "20M", "CCK", "1T", "04", "36",
3451 "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32",
3452 "MKK", "2.4G", "20M", "CCK", "1T", "04", "32",
3453 "FCC", "2.4G", "20M", "CCK", "1T", "05", "36",
3454 "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32",
3455 "MKK", "2.4G", "20M", "CCK", "1T", "05", "32",
3456 "FCC", "2.4G", "20M", "CCK", "1T", "06", "36",
3457 "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32",
3458 "MKK", "2.4G", "20M", "CCK", "1T", "06", "32",
3459 "FCC", "2.4G", "20M", "CCK", "1T", "07", "36",
3460 "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32",
3461 "MKK", "2.4G", "20M", "CCK", "1T", "07", "32",
3462 "FCC", "2.4G", "20M", "CCK", "1T", "08", "36",
3463 "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32",
3464 "MKK", "2.4G", "20M", "CCK", "1T", "08", "32",
3465 "FCC", "2.4G", "20M", "CCK", "1T", "09", "36",
3466 "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32",
3467 "MKK", "2.4G", "20M", "CCK", "1T", "09", "32",
3468 "FCC", "2.4G", "20M", "CCK", "1T", "10", "36",
3469 "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32",
3470 "MKK", "2.4G", "20M", "CCK", "1T", "10", "32",
3471 "FCC", "2.4G", "20M", "CCK", "1T", "11", "36",
3472 "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32",
3473 "MKK", "2.4G", "20M", "CCK", "1T", "11", "32",
3474 "FCC", "2.4G", "20M", "CCK", "1T", "12", "63",
3475 "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32",
3476 "MKK", "2.4G", "20M", "CCK", "1T", "12", "32",
3477 "FCC", "2.4G", "20M", "CCK", "1T", "13", "63",
3478 "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32",
3479 "MKK", "2.4G", "20M", "CCK", "1T", "13", "32",
3480 "FCC", "2.4G", "20M", "CCK", "1T", "14", "63",
3481 "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63",
3482 "MKK", "2.4G", "20M", "CCK", "1T", "14", "32",
3483 "FCC", "2.4G", "20M", "OFDM", "1T", "01", "34",
3484 "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32",
3485 "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32",
3486 "FCC", "2.4G", "20M", "OFDM", "1T", "02", "36",
3487 "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32",
3488 "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32",
3489 "FCC", "2.4G", "20M", "OFDM", "1T", "03", "36",
3490 "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32",
3491 "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32",
3492 "FCC", "2.4G", "20M", "OFDM", "1T", "04", "36",
3493 "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32",
3494 "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32",
3495 "FCC", "2.4G", "20M", "OFDM", "1T", "05", "36",
3496 "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32",
3497 "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32",
3498 "FCC", "2.4G", "20M", "OFDM", "1T", "06", "36",
3499 "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32",
3500 "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32",
3501 "FCC", "2.4G", "20M", "OFDM", "1T", "07", "36",
3502 "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32",
3503 "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32",
3504 "FCC", "2.4G", "20M", "OFDM", "1T", "08", "36",
3505 "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32",
3506 "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32",
3507 "FCC", "2.4G", "20M", "OFDM", "1T", "09", "36",
3508 "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32",
3509 "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32",
3510 "FCC", "2.4G", "20M", "OFDM", "1T", "10", "36",
3511 "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32",
3512 "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32",
3513 "FCC", "2.4G", "20M", "OFDM", "1T", "11", "32",
3514 "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32",
3515 "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32",
3516 "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63",
3517 "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32",
3518 "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32",
3519 "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63",
3520 "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32",
3521 "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32",
3522 "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63",
3523 "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63",
3524 "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63",
3525 "FCC", "2.4G", "20M", "HT", "1T", "01", "34",
3526 "ETSI", "2.4G", "20M", "HT", "1T", "01", "32",
3527 "MKK", "2.4G", "20M", "HT", "1T", "01", "32",
3528 "FCC", "2.4G", "20M", "HT", "1T", "02", "36",
3529 "ETSI", "2.4G", "20M", "HT", "1T", "02", "32",
3530 "MKK", "2.4G", "20M", "HT", "1T", "02", "32",
3531 "FCC", "2.4G", "20M", "HT", "1T", "03", "36",
3532 "ETSI", "2.4G", "20M", "HT", "1T", "03", "32",
3533 "MKK", "2.4G", "20M", "HT", "1T", "03", "32",
3534 "FCC", "2.4G", "20M", "HT", "1T", "04", "36",
3535 "ETSI", "2.4G", "20M", "HT", "1T", "04", "32",
3536 "MKK", "2.4G", "20M", "HT", "1T", "04", "32",
3537 "FCC", "2.4G", "20M", "HT", "1T", "05", "36",
3538 "ETSI", "2.4G", "20M", "HT", "1T", "05", "32",
3539 "MKK", "2.4G", "20M", "HT", "1T", "05", "32",
3540 "FCC", "2.4G", "20M", "HT", "1T", "06", "36",
3541 "ETSI", "2.4G", "20M", "HT", "1T", "06", "32",
3542 "MKK", "2.4G", "20M", "HT", "1T", "06", "32",
3543 "FCC", "2.4G", "20M", "HT", "1T", "07", "36",
3544 "ETSI", "2.4G", "20M", "HT", "1T", "07", "32",
3545 "MKK", "2.4G", "20M", "HT", "1T", "07", "32",
3546 "FCC", "2.4G", "20M", "HT", "1T", "08", "36",
3547 "ETSI", "2.4G", "20M", "HT", "1T", "08", "32",
3548 "MKK", "2.4G", "20M", "HT", "1T", "08", "32",
3549 "FCC", "2.4G", "20M", "HT", "1T", "09", "36",
3550 "ETSI", "2.4G", "20M", "HT", "1T", "09", "32",
3551 "MKK", "2.4G", "20M", "HT", "1T", "09", "32",
3552 "FCC", "2.4G", "20M", "HT", "1T", "10", "36",
3553 "ETSI", "2.4G", "20M", "HT", "1T", "10", "32",
3554 "MKK", "2.4G", "20M", "HT", "1T", "10", "32",
3555 "FCC", "2.4G", "20M", "HT", "1T", "11", "32",
3556 "ETSI", "2.4G", "20M", "HT", "1T", "11", "32",
3557 "MKK", "2.4G", "20M", "HT", "1T", "11", "32",
3558 "FCC", "2.4G", "20M", "HT", "1T", "12", "63",
3559 "ETSI", "2.4G", "20M", "HT", "1T", "12", "32",
3560 "MKK", "2.4G", "20M", "HT", "1T", "12", "32",
3561 "FCC", "2.4G", "20M", "HT", "1T", "13", "63",
3562 "ETSI", "2.4G", "20M", "HT", "1T", "13", "32",
3563 "MKK", "2.4G", "20M", "HT", "1T", "13", "32",
3564 "FCC", "2.4G", "20M", "HT", "1T", "14", "63",
3565 "ETSI", "2.4G", "20M", "HT", "1T", "14", "63",
3566 "MKK", "2.4G", "20M", "HT", "1T", "14", "63",
3567 "FCC", "2.4G", "20M", "HT", "2T", "01", "32",
3568 "ETSI", "2.4G", "20M", "HT", "2T", "01", "32",
3569 "MKK", "2.4G", "20M", "HT", "2T", "01", "32",
3570 "FCC", "2.4G", "20M", "HT", "2T", "02", "34",
3571 "ETSI", "2.4G", "20M", "HT", "2T", "02", "32",
3572 "MKK", "2.4G", "20M", "HT", "2T", "02", "32",
3573 "FCC", "2.4G", "20M", "HT", "2T", "03", "34",
3574 "ETSI", "2.4G", "20M", "HT", "2T", "03", "32",
3575 "MKK", "2.4G", "20M", "HT", "2T", "03", "32",
3576 "FCC", "2.4G", "20M", "HT", "2T", "04", "34",
3577 "ETSI", "2.4G", "20M", "HT", "2T", "04", "32",
3578 "MKK", "2.4G", "20M", "HT", "2T", "04", "32",
3579 "FCC", "2.4G", "20M", "HT", "2T", "05", "34",
3580 "ETSI", "2.4G", "20M", "HT", "2T", "05", "32",
3581 "MKK", "2.4G", "20M", "HT", "2T", "05", "32",
3582 "FCC", "2.4G", "20M", "HT", "2T", "06", "34",
3583 "ETSI", "2.4G", "20M", "HT", "2T", "06", "32",
3584 "MKK", "2.4G", "20M", "HT", "2T", "06", "32",
3585 "FCC", "2.4G", "20M", "HT", "2T", "07", "34",
3586 "ETSI", "2.4G", "20M", "HT", "2T", "07", "32",
3587 "MKK", "2.4G", "20M", "HT", "2T", "07", "32",
3588 "FCC", "2.4G", "20M", "HT", "2T", "08", "34",
3589 "ETSI", "2.4G", "20M", "HT", "2T", "08", "32",
3590 "MKK", "2.4G", "20M", "HT", "2T", "08", "32",
3591 "FCC", "2.4G", "20M", "HT", "2T", "09", "34",
3592 "ETSI", "2.4G", "20M", "HT", "2T", "09", "32",
3593 "MKK", "2.4G", "20M", "HT", "2T", "09", "32",
3594 "FCC", "2.4G", "20M", "HT", "2T", "10", "34",
3595 "ETSI", "2.4G", "20M", "HT", "2T", "10", "32",
3596 "MKK", "2.4G", "20M", "HT", "2T", "10", "32",
3597 "FCC", "2.4G", "20M", "HT", "2T", "11", "30",
3598 "ETSI", "2.4G", "20M", "HT", "2T", "11", "32",
3599 "MKK", "2.4G", "20M", "HT", "2T", "11", "32",
3600 "FCC", "2.4G", "20M", "HT", "2T", "12", "63",
3601 "ETSI", "2.4G", "20M", "HT", "2T", "12", "32",
3602 "MKK", "2.4G", "20M", "HT", "2T", "12", "32",
3603 "FCC", "2.4G", "20M", "HT", "2T", "13", "63",
3604 "ETSI", "2.4G", "20M", "HT", "2T", "13", "32",
3605 "MKK", "2.4G", "20M", "HT", "2T", "13", "32",
3606 "FCC", "2.4G", "20M", "HT", "2T", "14", "63",
3607 "ETSI", "2.4G", "20M", "HT", "2T", "14", "63",
3608 "MKK", "2.4G", "20M", "HT", "2T", "14", "63",
3609 "FCC", "2.4G", "40M", "HT", "1T", "01", "63",
3610 "ETSI", "2.4G", "40M", "HT", "1T", "01", "63",
3611 "MKK", "2.4G", "40M", "HT", "1T", "01", "63",
3612 "FCC", "2.4G", "40M", "HT", "1T", "02", "63",
3613 "ETSI", "2.4G", "40M", "HT", "1T", "02", "63",
3614 "MKK", "2.4G", "40M", "HT", "1T", "02", "63",
3615 "FCC", "2.4G", "40M", "HT", "1T", "03", "32",
3616 "ETSI", "2.4G", "40M", "HT", "1T", "03", "32",
3617 "MKK", "2.4G", "40M", "HT", "1T", "03", "32",
3618 "FCC", "2.4G", "40M", "HT", "1T", "04", "36",
3619 "ETSI", "2.4G", "40M", "HT", "1T", "04", "32",
3620 "MKK", "2.4G", "40M", "HT", "1T", "04", "32",
3621 "FCC", "2.4G", "40M", "HT", "1T", "05", "36",
3622 "ETSI", "2.4G", "40M", "HT", "1T", "05", "32",
3623 "MKK", "2.4G", "40M", "HT", "1T", "05", "32",
3624 "FCC", "2.4G", "40M", "HT", "1T", "06", "36",
3625 "ETSI", "2.4G", "40M", "HT", "1T", "06", "32",
3626 "MKK", "2.4G", "40M", "HT", "1T", "06", "32",
3627 "FCC", "2.4G", "40M", "HT", "1T", "07", "36",
3628 "ETSI", "2.4G", "40M", "HT", "1T", "07", "32",
3629 "MKK", "2.4G", "40M", "HT", "1T", "07", "32",
3630 "FCC", "2.4G", "40M", "HT", "1T", "08", "36",
3631 "ETSI", "2.4G", "40M", "HT", "1T", "08", "32",
3632 "MKK", "2.4G", "40M", "HT", "1T", "08", "32",
3633 "FCC", "2.4G", "40M", "HT", "1T", "09", "36",
3634 "ETSI", "2.4G", "40M", "HT", "1T", "09", "32",
3635 "MKK", "2.4G", "40M", "HT", "1T", "09", "32",
3636 "FCC", "2.4G", "40M", "HT", "1T", "10", "36",
3637 "ETSI", "2.4G", "40M", "HT", "1T", "10", "32",
3638 "MKK", "2.4G", "40M", "HT", "1T", "10", "32",
3639 "FCC", "2.4G", "40M", "HT", "1T", "11", "32",
3640 "ETSI", "2.4G", "40M", "HT", "1T", "11", "32",
3641 "MKK", "2.4G", "40M", "HT", "1T", "11", "32",
3642 "FCC", "2.4G", "40M", "HT", "1T", "12", "63",
3643 "ETSI", "2.4G", "40M", "HT", "1T", "12", "32",
3644 "MKK", "2.4G", "40M", "HT", "1T", "12", "32",
3645 "FCC", "2.4G", "40M", "HT", "1T", "13", "63",
3646 "ETSI", "2.4G", "40M", "HT", "1T", "13", "32",
3647 "MKK", "2.4G", "40M", "HT", "1T", "13", "32",
3648 "FCC", "2.4G", "40M", "HT", "1T", "14", "63",
3649 "ETSI", "2.4G", "40M", "HT", "1T", "14", "63",
3650 "MKK", "2.4G", "40M", "HT", "1T", "14", "63",
3651 "FCC", "2.4G", "40M", "HT", "2T", "01", "63",
3652 "ETSI", "2.4G", "40M", "HT", "2T", "01", "63",
3653 "MKK", "2.4G", "40M", "HT", "2T", "01", "63",
3654 "FCC", "2.4G", "40M", "HT", "2T", "02", "63",
3655 "ETSI", "2.4G", "40M", "HT", "2T", "02", "63",
3656 "MKK", "2.4G", "40M", "HT", "2T", "02", "63",
3657 "FCC", "2.4G", "40M", "HT", "2T", "03", "30",
3658 "ETSI", "2.4G", "40M", "HT", "2T", "03", "30",
3659 "MKK", "2.4G", "40M", "HT", "2T", "03", "30",
3660 "FCC", "2.4G", "40M", "HT", "2T", "04", "34",
3661 "ETSI", "2.4G", "40M", "HT", "2T", "04", "30",
3662 "MKK", "2.4G", "40M", "HT", "2T", "04", "30",
3663 "FCC", "2.4G", "40M", "HT", "2T", "05", "34",
3664 "ETSI", "2.4G", "40M", "HT", "2T", "05", "30",
3665 "MKK", "2.4G", "40M", "HT", "2T", "05", "30",
3666 "FCC", "2.4G", "40M", "HT", "2T", "06", "34",
3667 "ETSI", "2.4G", "40M", "HT", "2T", "06", "30",
3668 "MKK", "2.4G", "40M", "HT", "2T", "06", "30",
3669 "FCC", "2.4G", "40M", "HT", "2T", "07", "34",
3670 "ETSI", "2.4G", "40M", "HT", "2T", "07", "30",
3671 "MKK", "2.4G", "40M", "HT", "2T", "07", "30",
3672 "FCC", "2.4G", "40M", "HT", "2T", "08", "34",
3673 "ETSI", "2.4G", "40M", "HT", "2T", "08", "30",
3674 "MKK", "2.4G", "40M", "HT", "2T", "08", "30",
3675 "FCC", "2.4G", "40M", "HT", "2T", "09", "34",
3676 "ETSI", "2.4G", "40M", "HT", "2T", "09", "30",
3677 "MKK", "2.4G", "40M", "HT", "2T", "09", "30",
3678 "FCC", "2.4G", "40M", "HT", "2T", "10", "34",
3679 "ETSI", "2.4G", "40M", "HT", "2T", "10", "30",
3680 "MKK", "2.4G", "40M", "HT", "2T", "10", "30",
3681 "FCC", "2.4G", "40M", "HT", "2T", "11", "30",
3682 "ETSI", "2.4G", "40M", "HT", "2T", "11", "30",
3683 "MKK", "2.4G", "40M", "HT", "2T", "11", "30",
3684 "FCC", "2.4G", "40M", "HT", "2T", "12", "63",
3685 "ETSI", "2.4G", "40M", "HT", "2T", "12", "32",
3686 "MKK", "2.4G", "40M", "HT", "2T", "12", "32",
3687 "FCC", "2.4G", "40M", "HT", "2T", "13", "63",
3688 "ETSI", "2.4G", "40M", "HT", "2T", "13", "32",
3689 "MKK", "2.4G", "40M", "HT", "2T", "13", "32",
3690 "FCC", "2.4G", "40M", "HT", "2T", "14", "63",
3691 "ETSI", "2.4G", "40M", "HT", "2T", "14", "63",
3692 "MKK", "2.4G", "40M", "HT", "2T", "14", "63",
3693 "FCC", "5G", "20M", "OFDM", "1T", "36", "30",
3694 "ETSI", "5G", "20M", "OFDM", "1T", "36", "32",
3695 "MKK", "5G", "20M", "OFDM", "1T", "36", "32",
3696 "FCC", "5G", "20M", "OFDM", "1T", "40", "30",
3697 "ETSI", "5G", "20M", "OFDM", "1T", "40", "32",
3698 "MKK", "5G", "20M", "OFDM", "1T", "40", "32",
3699 "FCC", "5G", "20M", "OFDM", "1T", "44", "30",
3700 "ETSI", "5G", "20M", "OFDM", "1T", "44", "32",
3701 "MKK", "5G", "20M", "OFDM", "1T", "44", "32",
3702 "FCC", "5G", "20M", "OFDM", "1T", "48", "30",
3703 "ETSI", "5G", "20M", "OFDM", "1T", "48", "32",
3704 "MKK", "5G", "20M", "OFDM", "1T", "48", "32",
3705 "FCC", "5G", "20M", "OFDM", "1T", "52", "36",
3706 "ETSI", "5G", "20M", "OFDM", "1T", "52", "32",
3707 "MKK", "5G", "20M", "OFDM", "1T", "52", "32",
3708 "FCC", "5G", "20M", "OFDM", "1T", "56", "34",
3709 "ETSI", "5G", "20M", "OFDM", "1T", "56", "32",
3710 "MKK", "5G", "20M", "OFDM", "1T", "56", "32",
3711 "FCC", "5G", "20M", "OFDM", "1T", "60", "32",
3712 "ETSI", "5G", "20M", "OFDM", "1T", "60", "32",
3713 "MKK", "5G", "20M", "OFDM", "1T", "60", "32",
3714 "FCC", "5G", "20M", "OFDM", "1T", "64", "28",
3715 "ETSI", "5G", "20M", "OFDM", "1T", "64", "32",
3716 "MKK", "5G", "20M", "OFDM", "1T", "64", "32",
3717 "FCC", "5G", "20M", "OFDM", "1T", "100", "30",
3718 "ETSI", "5G", "20M", "OFDM", "1T", "100", "32",
3719 "MKK", "5G", "20M", "OFDM", "1T", "100", "32",
3720 "FCC", "5G", "20M", "OFDM", "1T", "114", "30",
3721 "ETSI", "5G", "20M", "OFDM", "1T", "114", "32",
3722 "MKK", "5G", "20M", "OFDM", "1T", "114", "32",
3723 "FCC", "5G", "20M", "OFDM", "1T", "108", "32",
3724 "ETSI", "5G", "20M", "OFDM", "1T", "108", "32",
3725 "MKK", "5G", "20M", "OFDM", "1T", "108", "32",
3726 "FCC", "5G", "20M", "OFDM", "1T", "112", "34",
3727 "ETSI", "5G", "20M", "OFDM", "1T", "112", "32",
3728 "MKK", "5G", "20M", "OFDM", "1T", "112", "32",
3729 "FCC", "5G", "20M", "OFDM", "1T", "116", "34",
3730 "ETSI", "5G", "20M", "OFDM", "1T", "116", "32",
3731 "MKK", "5G", "20M", "OFDM", "1T", "116", "32",
3732 "FCC", "5G", "20M", "OFDM", "1T", "120", "36",
3733 "ETSI", "5G", "20M", "OFDM", "1T", "120", "32",
3734 "MKK", "5G", "20M", "OFDM", "1T", "120", "32",
3735 "FCC", "5G", "20M", "OFDM", "1T", "124", "34",
3736 "ETSI", "5G", "20M", "OFDM", "1T", "124", "32",
3737 "MKK", "5G", "20M", "OFDM", "1T", "124", "32",
3738 "FCC", "5G", "20M", "OFDM", "1T", "128", "32",
3739 "ETSI", "5G", "20M", "OFDM", "1T", "128", "32",
3740 "MKK", "5G", "20M", "OFDM", "1T", "128", "32",
3741 "FCC", "5G", "20M", "OFDM", "1T", "132", "30",
3742 "ETSI", "5G", "20M", "OFDM", "1T", "132", "32",
3743 "MKK", "5G", "20M", "OFDM", "1T", "132", "32",
3744 "FCC", "5G", "20M", "OFDM", "1T", "136", "30",
3745 "ETSI", "5G", "20M", "OFDM", "1T", "136", "32",
3746 "MKK", "5G", "20M", "OFDM", "1T", "136", "32",
3747 "FCC", "5G", "20M", "OFDM", "1T", "140", "28",
3748 "ETSI", "5G", "20M", "OFDM", "1T", "140", "32",
3749 "MKK", "5G", "20M", "OFDM", "1T", "140", "32",
3750 "FCC", "5G", "20M", "OFDM", "1T", "149", "36",
3751 "ETSI", "5G", "20M", "OFDM", "1T", "149", "32",
3752 "MKK", "5G", "20M", "OFDM", "1T", "149", "63",
3753 "FCC", "5G", "20M", "OFDM", "1T", "153", "36",
3754 "ETSI", "5G", "20M", "OFDM", "1T", "153", "32",
3755 "MKK", "5G", "20M", "OFDM", "1T", "153", "63",
3756 "FCC", "5G", "20M", "OFDM", "1T", "157", "36",
3757 "ETSI", "5G", "20M", "OFDM", "1T", "157", "32",
3758 "MKK", "5G", "20M", "OFDM", "1T", "157", "63",
3759 "FCC", "5G", "20M", "OFDM", "1T", "161", "36",
3760 "ETSI", "5G", "20M", "OFDM", "1T", "161", "32",
3761 "MKK", "5G", "20M", "OFDM", "1T", "161", "63",
3762 "FCC", "5G", "20M", "OFDM", "1T", "165", "36",
3763 "ETSI", "5G", "20M", "OFDM", "1T", "165", "32",
3764 "MKK", "5G", "20M", "OFDM", "1T", "165", "63",
3765 "FCC", "5G", "20M", "HT", "1T", "36", "30",
3766 "ETSI", "5G", "20M", "HT", "1T", "36", "32",
3767 "MKK", "5G", "20M", "HT", "1T", "36", "32",
3768 "FCC", "5G", "20M", "HT", "1T", "40", "30",
3769 "ETSI", "5G", "20M", "HT", "1T", "40", "32",
3770 "MKK", "5G", "20M", "HT", "1T", "40", "32",
3771 "FCC", "5G", "20M", "HT", "1T", "44", "30",
3772 "ETSI", "5G", "20M", "HT", "1T", "44", "32",
3773 "MKK", "5G", "20M", "HT", "1T", "44", "32",
3774 "FCC", "5G", "20M", "HT", "1T", "48", "30",
3775 "ETSI", "5G", "20M", "HT", "1T", "48", "32",
3776 "MKK", "5G", "20M", "HT", "1T", "48", "32",
3777 "FCC", "5G", "20M", "HT", "1T", "52", "36",
3778 "ETSI", "5G", "20M", "HT", "1T", "52", "32",
3779 "MKK", "5G", "20M", "HT", "1T", "52", "32",
3780 "FCC", "5G", "20M", "HT", "1T", "56", "34",
3781 "ETSI", "5G", "20M", "HT", "1T", "56", "32",
3782 "MKK", "5G", "20M", "HT", "1T", "56", "32",
3783 "FCC", "5G", "20M", "HT", "1T", "60", "32",
3784 "ETSI", "5G", "20M", "HT", "1T", "60", "32",
3785 "MKK", "5G", "20M", "HT", "1T", "60", "32",
3786 "FCC", "5G", "20M", "HT", "1T", "64", "28",
3787 "ETSI", "5G", "20M", "HT", "1T", "64", "32",
3788 "MKK", "5G", "20M", "HT", "1T", "64", "32",
3789 "FCC", "5G", "20M", "HT", "1T", "100", "30",
3790 "ETSI", "5G", "20M", "HT", "1T", "100", "32",
3791 "MKK", "5G", "20M", "HT", "1T", "100", "32",
3792 "FCC", "5G", "20M", "HT", "1T", "114", "30",
3793 "ETSI", "5G", "20M", "HT", "1T", "114", "32",
3794 "MKK", "5G", "20M", "HT", "1T", "114", "32",
3795 "FCC", "5G", "20M", "HT", "1T", "108", "32",
3796 "ETSI", "5G", "20M", "HT", "1T", "108", "32",
3797 "MKK", "5G", "20M", "HT", "1T", "108", "32",
3798 "FCC", "5G", "20M", "HT", "1T", "112", "34",
3799 "ETSI", "5G", "20M", "HT", "1T", "112", "32",
3800 "MKK", "5G", "20M", "HT", "1T", "112", "32",
3801 "FCC", "5G", "20M", "HT", "1T", "116", "34",
3802 "ETSI", "5G", "20M", "HT", "1T", "116", "32",
3803 "MKK", "5G", "20M", "HT", "1T", "116", "32",
3804 "FCC", "5G", "20M", "HT", "1T", "120", "36",
3805 "ETSI", "5G", "20M", "HT", "1T", "120", "32",
3806 "MKK", "5G", "20M", "HT", "1T", "120", "32",
3807 "FCC", "5G", "20M", "HT", "1T", "124", "34",
3808 "ETSI", "5G", "20M", "HT", "1T", "124", "32",
3809 "MKK", "5G", "20M", "HT", "1T", "124", "32",
3810 "FCC", "5G", "20M", "HT", "1T", "128", "32",
3811 "ETSI", "5G", "20M", "HT", "1T", "128", "32",
3812 "MKK", "5G", "20M", "HT", "1T", "128", "32",
3813 "FCC", "5G", "20M", "HT", "1T", "132", "30",
3814 "ETSI", "5G", "20M", "HT", "1T", "132", "32",
3815 "MKK", "5G", "20M", "HT", "1T", "132", "32",
3816 "FCC", "5G", "20M", "HT", "1T", "136", "30",
3817 "ETSI", "5G", "20M", "HT", "1T", "136", "32",
3818 "MKK", "5G", "20M", "HT", "1T", "136", "32",
3819 "FCC", "5G", "20M", "HT", "1T", "140", "28",
3820 "ETSI", "5G", "20M", "HT", "1T", "140", "32",
3821 "MKK", "5G", "20M", "HT", "1T", "140", "32",
3822 "FCC", "5G", "20M", "HT", "1T", "149", "36",
3823 "ETSI", "5G", "20M", "HT", "1T", "149", "32",
3824 "MKK", "5G", "20M", "HT", "1T", "149", "63",
3825 "FCC", "5G", "20M", "HT", "1T", "153", "36",
3826 "ETSI", "5G", "20M", "HT", "1T", "153", "32",
3827 "MKK", "5G", "20M", "HT", "1T", "153", "63",
3828 "FCC", "5G", "20M", "HT", "1T", "157", "36",
3829 "ETSI", "5G", "20M", "HT", "1T", "157", "32",
3830 "MKK", "5G", "20M", "HT", "1T", "157", "63",
3831 "FCC", "5G", "20M", "HT", "1T", "161", "36",
3832 "ETSI", "5G", "20M", "HT", "1T", "161", "32",
3833 "MKK", "5G", "20M", "HT", "1T", "161", "63",
3834 "FCC", "5G", "20M", "HT", "1T", "165", "36",
3835 "ETSI", "5G", "20M", "HT", "1T", "165", "32",
3836 "MKK", "5G", "20M", "HT", "1T", "165", "63",
3837 "FCC", "5G", "20M", "HT", "2T", "36", "28",
3838 "ETSI", "5G", "20M", "HT", "2T", "36", "30",
3839 "MKK", "5G", "20M", "HT", "2T", "36", "30",
3840 "FCC", "5G", "20M", "HT", "2T", "40", "28",
3841 "ETSI", "5G", "20M", "HT", "2T", "40", "30",
3842 "MKK", "5G", "20M", "HT", "2T", "40", "30",
3843 "FCC", "5G", "20M", "HT", "2T", "44", "28",
3844 "ETSI", "5G", "20M", "HT", "2T", "44", "30",
3845 "MKK", "5G", "20M", "HT", "2T", "44", "30",
3846 "FCC", "5G", "20M", "HT", "2T", "48", "28",
3847 "ETSI", "5G", "20M", "HT", "2T", "48", "30",
3848 "MKK", "5G", "20M", "HT", "2T", "48", "30",
3849 "FCC", "5G", "20M", "HT", "2T", "52", "34",
3850 "ETSI", "5G", "20M", "HT", "2T", "52", "30",
3851 "MKK", "5G", "20M", "HT", "2T", "52", "30",
3852 "FCC", "5G", "20M", "HT", "2T", "56", "32",
3853 "ETSI", "5G", "20M", "HT", "2T", "56", "30",
3854 "MKK", "5G", "20M", "HT", "2T", "56", "30",
3855 "FCC", "5G", "20M", "HT", "2T", "60", "30",
3856 "ETSI", "5G", "20M", "HT", "2T", "60", "30",
3857 "MKK", "5G", "20M", "HT", "2T", "60", "30",
3858 "FCC", "5G", "20M", "HT", "2T", "64", "26",
3859 "ETSI", "5G", "20M", "HT", "2T", "64", "30",
3860 "MKK", "5G", "20M", "HT", "2T", "64", "30",
3861 "FCC", "5G", "20M", "HT", "2T", "100", "28",
3862 "ETSI", "5G", "20M", "HT", "2T", "100", "30",
3863 "MKK", "5G", "20M", "HT", "2T", "100", "30",
3864 "FCC", "5G", "20M", "HT", "2T", "114", "28",
3865 "ETSI", "5G", "20M", "HT", "2T", "114", "30",
3866 "MKK", "5G", "20M", "HT", "2T", "114", "30",
3867 "FCC", "5G", "20M", "HT", "2T", "108", "30",
3868 "ETSI", "5G", "20M", "HT", "2T", "108", "30",
3869 "MKK", "5G", "20M", "HT", "2T", "108", "30",
3870 "FCC", "5G", "20M", "HT", "2T", "112", "32",
3871 "ETSI", "5G", "20M", "HT", "2T", "112", "30",
3872 "MKK", "5G", "20M", "HT", "2T", "112", "30",
3873 "FCC", "5G", "20M", "HT", "2T", "116", "32",
3874 "ETSI", "5G", "20M", "HT", "2T", "116", "30",
3875 "MKK", "5G", "20M", "HT", "2T", "116", "30",
3876 "FCC", "5G", "20M", "HT", "2T", "120", "34",
3877 "ETSI", "5G", "20M", "HT", "2T", "120", "30",
3878 "MKK", "5G", "20M", "HT", "2T", "120", "30",
3879 "FCC", "5G", "20M", "HT", "2T", "124", "32",
3880 "ETSI", "5G", "20M", "HT", "2T", "124", "30",
3881 "MKK", "5G", "20M", "HT", "2T", "124", "30",
3882 "FCC", "5G", "20M", "HT", "2T", "128", "30",
3883 "ETSI", "5G", "20M", "HT", "2T", "128", "30",
3884 "MKK", "5G", "20M", "HT", "2T", "128", "30",
3885 "FCC", "5G", "20M", "HT", "2T", "132", "28",
3886 "ETSI", "5G", "20M", "HT", "2T", "132", "30",
3887 "MKK", "5G", "20M", "HT", "2T", "132", "30",
3888 "FCC", "5G", "20M", "HT", "2T", "136", "28",
3889 "ETSI", "5G", "20M", "HT", "2T", "136", "30",
3890 "MKK", "5G", "20M", "HT", "2T", "136", "30",
3891 "FCC", "5G", "20M", "HT", "2T", "140", "26",
3892 "ETSI", "5G", "20M", "HT", "2T", "140", "30",
3893 "MKK", "5G", "20M", "HT", "2T", "140", "30",
3894 "FCC", "5G", "20M", "HT", "2T", "149", "34",
3895 "ETSI", "5G", "20M", "HT", "2T", "149", "30",
3896 "MKK", "5G", "20M", "HT", "2T", "149", "63",
3897 "FCC", "5G", "20M", "HT", "2T", "153", "34",
3898 "ETSI", "5G", "20M", "HT", "2T", "153", "30",
3899 "MKK", "5G", "20M", "HT", "2T", "153", "63",
3900 "FCC", "5G", "20M", "HT", "2T", "157", "34",
3901 "ETSI", "5G", "20M", "HT", "2T", "157", "30",
3902 "MKK", "5G", "20M", "HT", "2T", "157", "63",
3903 "FCC", "5G", "20M", "HT", "2T", "161", "34",
3904 "ETSI", "5G", "20M", "HT", "2T", "161", "30",
3905 "MKK", "5G", "20M", "HT", "2T", "161", "63",
3906 "FCC", "5G", "20M", "HT", "2T", "165", "34",
3907 "ETSI", "5G", "20M", "HT", "2T", "165", "30",
3908 "MKK", "5G", "20M", "HT", "2T", "165", "63",
3909 "FCC", "5G", "40M", "HT", "1T", "38", "30",
3910 "ETSI", "5G", "40M", "HT", "1T", "38", "32",
3911 "MKK", "5G", "40M", "HT", "1T", "38", "32",
3912 "FCC", "5G", "40M", "HT", "1T", "46", "30",
3913 "ETSI", "5G", "40M", "HT", "1T", "46", "32",
3914 "MKK", "5G", "40M", "HT", "1T", "46", "32",
3915 "FCC", "5G", "40M", "HT", "1T", "54", "32",
3916 "ETSI", "5G", "40M", "HT", "1T", "54", "32",
3917 "MKK", "5G", "40M", "HT", "1T", "54", "32",
3918 "FCC", "5G", "40M", "HT", "1T", "62", "32",
3919 "ETSI", "5G", "40M", "HT", "1T", "62", "32",
3920 "MKK", "5G", "40M", "HT", "1T", "62", "32",
3921 "FCC", "5G", "40M", "HT", "1T", "102", "28",
3922 "ETSI", "5G", "40M", "HT", "1T", "102", "32",
3923 "MKK", "5G", "40M", "HT", "1T", "102", "32",
3924 "FCC", "5G", "40M", "HT", "1T", "110", "32",
3925 "ETSI", "5G", "40M", "HT", "1T", "110", "32",
3926 "MKK", "5G", "40M", "HT", "1T", "110", "32",
3927 "FCC", "5G", "40M", "HT", "1T", "118", "36",
3928 "ETSI", "5G", "40M", "HT", "1T", "118", "32",
3929 "MKK", "5G", "40M", "HT", "1T", "118", "32",
3930 "FCC", "5G", "40M", "HT", "1T", "126", "34",
3931 "ETSI", "5G", "40M", "HT", "1T", "126", "32",
3932 "MKK", "5G", "40M", "HT", "1T", "126", "32",
3933 "FCC", "5G", "40M", "HT", "1T", "134", "32",
3934 "ETSI", "5G", "40M", "HT", "1T", "134", "32",
3935 "MKK", "5G", "40M", "HT", "1T", "134", "32",
3936 "FCC", "5G", "40M", "HT", "1T", "151", "36",
3937 "ETSI", "5G", "40M", "HT", "1T", "151", "32",
3938 "MKK", "5G", "40M", "HT", "1T", "151", "63",
3939 "FCC", "5G", "40M", "HT", "1T", "159", "36",
3940 "ETSI", "5G", "40M", "HT", "1T", "159", "32",
3941 "MKK", "5G", "40M", "HT", "1T", "159", "63",
3942 "FCC", "5G", "40M", "HT", "2T", "38", "28",
3943 "ETSI", "5G", "40M", "HT", "2T", "38", "30",
3944 "MKK", "5G", "40M", "HT", "2T", "38", "30",
3945 "FCC", "5G", "40M", "HT", "2T", "46", "28",
3946 "ETSI", "5G", "40M", "HT", "2T", "46", "30",
3947 "MKK", "5G", "40M", "HT", "2T", "46", "30",
3948 "FCC", "5G", "40M", "HT", "2T", "54", "30",
3949 "ETSI", "5G", "40M", "HT", "2T", "54", "30",
3950 "MKK", "5G", "40M", "HT", "2T", "54", "30",
3951 "FCC", "5G", "40M", "HT", "2T", "62", "30",
3952 "ETSI", "5G", "40M", "HT", "2T", "62", "30",
3953 "MKK", "5G", "40M", "HT", "2T", "62", "30",
3954 "FCC", "5G", "40M", "HT", "2T", "102", "26",
3955 "ETSI", "5G", "40M", "HT", "2T", "102", "30",
3956 "MKK", "5G", "40M", "HT", "2T", "102", "30",
3957 "FCC", "5G", "40M", "HT", "2T", "110", "30",
3958 "ETSI", "5G", "40M", "HT", "2T", "110", "30",
3959 "MKK", "5G", "40M", "HT", "2T", "110", "30",
3960 "FCC", "5G", "40M", "HT", "2T", "118", "34",
3961 "ETSI", "5G", "40M", "HT", "2T", "118", "30",
3962 "MKK", "5G", "40M", "HT", "2T", "118", "30",
3963 "FCC", "5G", "40M", "HT", "2T", "126", "32",
3964 "ETSI", "5G", "40M", "HT", "2T", "126", "30",
3965 "MKK", "5G", "40M", "HT", "2T", "126", "30",
3966 "FCC", "5G", "40M", "HT", "2T", "134", "30",
3967 "ETSI", "5G", "40M", "HT", "2T", "134", "30",
3968 "MKK", "5G", "40M", "HT", "2T", "134", "30",
3969 "FCC", "5G", "40M", "HT", "2T", "151", "34",
3970 "ETSI", "5G", "40M", "HT", "2T", "151", "30",
3971 "MKK", "5G", "40M", "HT", "2T", "151", "63",
3972 "FCC", "5G", "40M", "HT", "2T", "159", "34",
3973 "ETSI", "5G", "40M", "HT", "2T", "159", "30",
3974 "MKK", "5G", "40M", "HT", "2T", "159", "63",
3975 "FCC", "5G", "80M", "VHT", "1T", "42", "30",
3976 "ETSI", "5G", "80M", "VHT", "1T", "42", "32",
3977 "MKK", "5G", "80M", "VHT", "1T", "42", "32",
3978 "FCC", "5G", "80M", "VHT", "1T", "58", "28",
3979 "ETSI", "5G", "80M", "VHT", "1T", "58", "32",
3980 "MKK", "5G", "80M", "VHT", "1T", "58", "32",
3981 "FCC", "5G", "80M", "VHT", "1T", "106", "30",
3982 "ETSI", "5G", "80M", "VHT", "1T", "106", "32",
3983 "MKK", "5G", "80M", "VHT", "1T", "106", "32",
3984 "FCC", "5G", "80M", "VHT", "1T", "122", "34",
3985 "ETSI", "5G", "80M", "VHT", "1T", "122", "32",
3986 "MKK", "5G", "80M", "VHT", "1T", "122", "32",
3987 "FCC", "5G", "80M", "VHT", "1T", "155", "36",
3988 "ETSI", "5G", "80M", "VHT", "1T", "155", "32",
3989 "MKK", "5G", "80M", "VHT", "1T", "155", "63",
3990 "FCC", "5G", "80M", "VHT", "2T", "42", "28",
3991 "ETSI", "5G", "80M", "VHT", "2T", "42", "30",
3992 "MKK", "5G", "80M", "VHT", "2T", "42", "30",
3993 "FCC", "5G", "80M", "VHT", "2T", "58", "26",
3994 "ETSI", "5G", "80M", "VHT", "2T", "58", "30",
3995 "MKK", "5G", "80M", "VHT", "2T", "58", "30",
3996 "FCC", "5G", "80M", "VHT", "2T", "106", "28",
3997 "ETSI", "5G", "80M", "VHT", "2T", "106", "30",
3998 "MKK", "5G", "80M", "VHT", "2T", "106", "30",
3999 "FCC", "5G", "80M", "VHT", "2T", "122", "32",
4000 "ETSI", "5G", "80M", "VHT", "2T", "122", "30",
4001 "MKK", "5G", "80M", "VHT", "2T", "122", "30",
4002 "FCC", "5G", "80M", "VHT", "2T", "155", "34",
4003 "ETSI", "5G", "80M", "VHT", "2T", "155", "30",
4004 "MKK", "5G", "80M", "VHT", "2T", "155", "63"
4005};
4006
4007u8 *RTL8821AE_TXPWR_LMT[] = {
4008 "FCC", "2.4G", "20M", "CCK", "1T", "01", "32",
4009 "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32",
4010 "MKK", "2.4G", "20M", "CCK", "1T", "01", "32",
4011 "FCC", "2.4G", "20M", "CCK", "1T", "02", "32",
4012 "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32",
4013 "MKK", "2.4G", "20M", "CCK", "1T", "02", "32",
4014 "FCC", "2.4G", "20M", "CCK", "1T", "03", "36",
4015 "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32",
4016 "MKK", "2.4G", "20M", "CCK", "1T", "03", "32",
4017 "FCC", "2.4G", "20M", "CCK", "1T", "04", "36",
4018 "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32",
4019 "MKK", "2.4G", "20M", "CCK", "1T", "04", "32",
4020 "FCC", "2.4G", "20M", "CCK", "1T", "05", "36",
4021 "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32",
4022 "MKK", "2.4G", "20M", "CCK", "1T", "05", "32",
4023 "FCC", "2.4G", "20M", "CCK", "1T", "06", "36",
4024 "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32",
4025 "MKK", "2.4G", "20M", "CCK", "1T", "06", "32",
4026 "FCC", "2.4G", "20M", "CCK", "1T", "07", "36",
4027 "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32",
4028 "MKK", "2.4G", "20M", "CCK", "1T", "07", "32",
4029 "FCC", "2.4G", "20M", "CCK", "1T", "08", "36",
4030 "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32",
4031 "MKK", "2.4G", "20M", "CCK", "1T", "08", "32",
4032 "FCC", "2.4G", "20M", "CCK", "1T", "09", "32",
4033 "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32",
4034 "MKK", "2.4G", "20M", "CCK", "1T", "09", "32",
4035 "FCC", "2.4G", "20M", "CCK", "1T", "10", "32",
4036 "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32",
4037 "MKK", "2.4G", "20M", "CCK", "1T", "10", "32",
4038 "FCC", "2.4G", "20M", "CCK", "1T", "11", "32",
4039 "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32",
4040 "MKK", "2.4G", "20M", "CCK", "1T", "11", "32",
4041 "FCC", "2.4G", "20M", "CCK", "1T", "12", "63",
4042 "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32",
4043 "MKK", "2.4G", "20M", "CCK", "1T", "12", "32",
4044 "FCC", "2.4G", "20M", "CCK", "1T", "13", "63",
4045 "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32",
4046 "MKK", "2.4G", "20M", "CCK", "1T", "13", "32",
4047 "FCC", "2.4G", "20M", "CCK", "1T", "14", "63",
4048 "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63",
4049 "MKK", "2.4G", "20M", "CCK", "1T", "14", "32",
4050 "FCC", "2.4G", "20M", "OFDM", "1T", "01", "30",
4051 "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32",
4052 "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32",
4053 "FCC", "2.4G", "20M", "OFDM", "1T", "02", "30",
4054 "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32",
4055 "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32",
4056 "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32",
4057 "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32",
4058 "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32",
4059 "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32",
4060 "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32",
4061 "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32",
4062 "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32",
4063 "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32",
4064 "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32",
4065 "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32",
4066 "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32",
4067 "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32",
4068 "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32",
4069 "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32",
4070 "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32",
4071 "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32",
4072 "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32",
4073 "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32",
4074 "FCC", "2.4G", "20M", "OFDM", "1T", "09", "30",
4075 "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32",
4076 "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32",
4077 "FCC", "2.4G", "20M", "OFDM", "1T", "10", "30",
4078 "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32",
4079 "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32",
4080 "FCC", "2.4G", "20M", "OFDM", "1T", "11", "30",
4081 "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32",
4082 "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32",
4083 "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63",
4084 "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32",
4085 "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32",
4086 "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63",
4087 "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32",
4088 "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32",
4089 "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63",
4090 "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63",
4091 "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63",
4092 "FCC", "2.4G", "20M", "HT", "1T", "01", "26",
4093 "ETSI", "2.4G", "20M", "HT", "1T", "01", "32",
4094 "MKK", "2.4G", "20M", "HT", "1T", "01", "32",
4095 "FCC", "2.4G", "20M", "HT", "1T", "02", "26",
4096 "ETSI", "2.4G", "20M", "HT", "1T", "02", "32",
4097 "MKK", "2.4G", "20M", "HT", "1T", "02", "32",
4098 "FCC", "2.4G", "20M", "HT", "1T", "03", "32",
4099 "ETSI", "2.4G", "20M", "HT", "1T", "03", "32",
4100 "MKK", "2.4G", "20M", "HT", "1T", "03", "32",
4101 "FCC", "2.4G", "20M", "HT", "1T", "04", "32",
4102 "ETSI", "2.4G", "20M", "HT", "1T", "04", "32",
4103 "MKK", "2.4G", "20M", "HT", "1T", "04", "32",
4104 "FCC", "2.4G", "20M", "HT", "1T", "05", "32",
4105 "ETSI", "2.4G", "20M", "HT", "1T", "05", "32",
4106 "MKK", "2.4G", "20M", "HT", "1T", "05", "32",
4107 "FCC", "2.4G", "20M", "HT", "1T", "06", "32",
4108 "ETSI", "2.4G", "20M", "HT", "1T", "06", "32",
4109 "MKK", "2.4G", "20M", "HT", "1T", "06", "32",
4110 "FCC", "2.4G", "20M", "HT", "1T", "07", "32",
4111 "ETSI", "2.4G", "20M", "HT", "1T", "07", "32",
4112 "MKK", "2.4G", "20M", "HT", "1T", "07", "32",
4113 "FCC", "2.4G", "20M", "HT", "1T", "08", "32",
4114 "ETSI", "2.4G", "20M", "HT", "1T", "08", "32",
4115 "MKK", "2.4G", "20M", "HT", "1T", "08", "32",
4116 "FCC", "2.4G", "20M", "HT", "1T", "09", "26",
4117 "ETSI", "2.4G", "20M", "HT", "1T", "09", "32",
4118 "MKK", "2.4G", "20M", "HT", "1T", "09", "32",
4119 "FCC", "2.4G", "20M", "HT", "1T", "10", "26",
4120 "ETSI", "2.4G", "20M", "HT", "1T", "10", "32",
4121 "MKK", "2.4G", "20M", "HT", "1T", "10", "32",
4122 "FCC", "2.4G", "20M", "HT", "1T", "11", "26",
4123 "ETSI", "2.4G", "20M", "HT", "1T", "11", "32",
4124 "MKK", "2.4G", "20M", "HT", "1T", "11", "32",
4125 "FCC", "2.4G", "20M", "HT", "1T", "12", "63",
4126 "ETSI", "2.4G", "20M", "HT", "1T", "12", "32",
4127 "MKK", "2.4G", "20M", "HT", "1T", "12", "32",
4128 "FCC", "2.4G", "20M", "HT", "1T", "13", "63",
4129 "ETSI", "2.4G", "20M", "HT", "1T", "13", "32",
4130 "MKK", "2.4G", "20M", "HT", "1T", "13", "32",
4131 "FCC", "2.4G", "20M", "HT", "1T", "14", "63",
4132 "ETSI", "2.4G", "20M", "HT", "1T", "14", "63",
4133 "MKK", "2.4G", "20M", "HT", "1T", "14", "63",
4134 "FCC", "2.4G", "20M", "HT", "2T", "01", "30",
4135 "ETSI", "2.4G", "20M", "HT", "2T", "01", "32",
4136 "MKK", "2.4G", "20M", "HT", "2T", "01", "32",
4137 "FCC", "2.4G", "20M", "HT", "2T", "02", "32",
4138 "ETSI", "2.4G", "20M", "HT", "2T", "02", "32",
4139 "MKK", "2.4G", "20M", "HT", "2T", "02", "32",
4140 "FCC", "2.4G", "20M", "HT", "2T", "03", "32",
4141 "ETSI", "2.4G", "20M", "HT", "2T", "03", "32",
4142 "MKK", "2.4G", "20M", "HT", "2T", "03", "32",
4143 "FCC", "2.4G", "20M", "HT", "2T", "04", "32",
4144 "ETSI", "2.4G", "20M", "HT", "2T", "04", "32",
4145 "MKK", "2.4G", "20M", "HT", "2T", "04", "32",
4146 "FCC", "2.4G", "20M", "HT", "2T", "05", "32",
4147 "ETSI", "2.4G", "20M", "HT", "2T", "05", "32",
4148 "MKK", "2.4G", "20M", "HT", "2T", "05", "32",
4149 "FCC", "2.4G", "20M", "HT", "2T", "06", "32",
4150 "ETSI", "2.4G", "20M", "HT", "2T", "06", "32",
4151 "MKK", "2.4G", "20M", "HT", "2T", "06", "32",
4152 "FCC", "2.4G", "20M", "HT", "2T", "07", "32",
4153 "ETSI", "2.4G", "20M", "HT", "2T", "07", "32",
4154 "MKK", "2.4G", "20M", "HT", "2T", "07", "32",
4155 "FCC", "2.4G", "20M", "HT", "2T", "08", "32",
4156 "ETSI", "2.4G", "20M", "HT", "2T", "08", "32",
4157 "MKK", "2.4G", "20M", "HT", "2T", "08", "32",
4158 "FCC", "2.4G", "20M", "HT", "2T", "09", "32",
4159 "ETSI", "2.4G", "20M", "HT", "2T", "09", "32",
4160 "MKK", "2.4G", "20M", "HT", "2T", "09", "32",
4161 "FCC", "2.4G", "20M", "HT", "2T", "10", "32",
4162 "ETSI", "2.4G", "20M", "HT", "2T", "10", "32",
4163 "MKK", "2.4G", "20M", "HT", "2T", "10", "32",
4164 "FCC", "2.4G", "20M", "HT", "2T", "11", "30",
4165 "ETSI", "2.4G", "20M", "HT", "2T", "11", "32",
4166 "MKK", "2.4G", "20M", "HT", "2T", "11", "32",
4167 "FCC", "2.4G", "20M", "HT", "2T", "12", "63",
4168 "ETSI", "2.4G", "20M", "HT", "2T", "12", "32",
4169 "MKK", "2.4G", "20M", "HT", "2T", "12", "32",
4170 "FCC", "2.4G", "20M", "HT", "2T", "13", "63",
4171 "ETSI", "2.4G", "20M", "HT", "2T", "13", "32",
4172 "MKK", "2.4G", "20M", "HT", "2T", "13", "32",
4173 "FCC", "2.4G", "20M", "HT", "2T", "14", "63",
4174 "ETSI", "2.4G", "20M", "HT", "2T", "14", "63",
4175 "MKK", "2.4G", "20M", "HT", "2T", "14", "63",
4176 "FCC", "2.4G", "40M", "HT", "1T", "01", "63",
4177 "ETSI", "2.4G", "40M", "HT", "1T", "01", "63",
4178 "MKK", "2.4G", "40M", "HT", "1T", "01", "63",
4179 "FCC", "2.4G", "40M", "HT", "1T", "02", "63",
4180 "ETSI", "2.4G", "40M", "HT", "1T", "02", "63",
4181 "MKK", "2.4G", "40M", "HT", "1T", "02", "63",
4182 "FCC", "2.4G", "40M", "HT", "1T", "03", "26",
4183 "ETSI", "2.4G", "40M", "HT", "1T", "03", "32",
4184 "MKK", "2.4G", "40M", "HT", "1T", "03", "32",
4185 "FCC", "2.4G", "40M", "HT", "1T", "04", "26",
4186 "ETSI", "2.4G", "40M", "HT", "1T", "04", "32",
4187 "MKK", "2.4G", "40M", "HT", "1T", "04", "32",
4188 "FCC", "2.4G", "40M", "HT", "1T", "05", "26",
4189 "ETSI", "2.4G", "40M", "HT", "1T", "05", "32",
4190 "MKK", "2.4G", "40M", "HT", "1T", "05", "32",
4191 "FCC", "2.4G", "40M", "HT", "1T", "06", "32",
4192 "ETSI", "2.4G", "40M", "HT", "1T", "06", "32",
4193 "MKK", "2.4G", "40M", "HT", "1T", "06", "32",
4194 "FCC", "2.4G", "40M", "HT", "1T", "07", "32",
4195 "ETSI", "2.4G", "40M", "HT", "1T", "07", "32",
4196 "MKK", "2.4G", "40M", "HT", "1T", "07", "32",
4197 "FCC", "2.4G", "40M", "HT", "1T", "08", "32",
4198 "ETSI", "2.4G", "40M", "HT", "1T", "08", "32",
4199 "MKK", "2.4G", "40M", "HT", "1T", "08", "32",
4200 "FCC", "2.4G", "40M", "HT", "1T", "09", "26",
4201 "ETSI", "2.4G", "40M", "HT", "1T", "09", "32",
4202 "MKK", "2.4G", "40M", "HT", "1T", "09", "32",
4203 "FCC", "2.4G", "40M", "HT", "1T", "10", "26",
4204 "ETSI", "2.4G", "40M", "HT", "1T", "10", "32",
4205 "MKK", "2.4G", "40M", "HT", "1T", "10", "32",
4206 "FCC", "2.4G", "40M", "HT", "1T", "11", "26",
4207 "ETSI", "2.4G", "40M", "HT", "1T", "11", "32",
4208 "MKK", "2.4G", "40M", "HT", "1T", "11", "32",
4209 "FCC", "2.4G", "40M", "HT", "1T", "12", "63",
4210 "ETSI", "2.4G", "40M", "HT", "1T", "12", "32",
4211 "MKK", "2.4G", "40M", "HT", "1T", "12", "32",
4212 "FCC", "2.4G", "40M", "HT", "1T", "13", "63",
4213 "ETSI", "2.4G", "40M", "HT", "1T", "13", "32",
4214 "MKK", "2.4G", "40M", "HT", "1T", "13", "32",
4215 "FCC", "2.4G", "40M", "HT", "1T", "14", "63",
4216 "ETSI", "2.4G", "40M", "HT", "1T", "14", "63",
4217 "MKK", "2.4G", "40M", "HT", "1T", "14", "63",
4218 "FCC", "2.4G", "40M", "HT", "2T", "01", "63",
4219 "ETSI", "2.4G", "40M", "HT", "2T", "01", "63",
4220 "MKK", "2.4G", "40M", "HT", "2T", "01", "63",
4221 "FCC", "2.4G", "40M", "HT", "2T", "02", "63",
4222 "ETSI", "2.4G", "40M", "HT", "2T", "02", "63",
4223 "MKK", "2.4G", "40M", "HT", "2T", "02", "63",
4224 "FCC", "2.4G", "40M", "HT", "2T", "03", "30",
4225 "ETSI", "2.4G", "40M", "HT", "2T", "03", "30",
4226 "MKK", "2.4G", "40M", "HT", "2T", "03", "30",
4227 "FCC", "2.4G", "40M", "HT", "2T", "04", "32",
4228 "ETSI", "2.4G", "40M", "HT", "2T", "04", "30",
4229 "MKK", "2.4G", "40M", "HT", "2T", "04", "30",
4230 "FCC", "2.4G", "40M", "HT", "2T", "05", "32",
4231 "ETSI", "2.4G", "40M", "HT", "2T", "05", "30",
4232 "MKK", "2.4G", "40M", "HT", "2T", "05", "30",
4233 "FCC", "2.4G", "40M", "HT", "2T", "06", "32",
4234 "ETSI", "2.4G", "40M", "HT", "2T", "06", "30",
4235 "MKK", "2.4G", "40M", "HT", "2T", "06", "30",
4236 "FCC", "2.4G", "40M", "HT", "2T", "07", "32",
4237 "ETSI", "2.4G", "40M", "HT", "2T", "07", "30",
4238 "MKK", "2.4G", "40M", "HT", "2T", "07", "30",
4239 "FCC", "2.4G", "40M", "HT", "2T", "08", "32",
4240 "ETSI", "2.4G", "40M", "HT", "2T", "08", "30",
4241 "MKK", "2.4G", "40M", "HT", "2T", "08", "30",
4242 "FCC", "2.4G", "40M", "HT", "2T", "09", "32",
4243 "ETSI", "2.4G", "40M", "HT", "2T", "09", "30",
4244 "MKK", "2.4G", "40M", "HT", "2T", "09", "30",
4245 "FCC", "2.4G", "40M", "HT", "2T", "10", "32",
4246 "ETSI", "2.4G", "40M", "HT", "2T", "10", "30",
4247 "MKK", "2.4G", "40M", "HT", "2T", "10", "30",
4248 "FCC", "2.4G", "40M", "HT", "2T", "11", "30",
4249 "ETSI", "2.4G", "40M", "HT", "2T", "11", "30",
4250 "MKK", "2.4G", "40M", "HT", "2T", "11", "30",
4251 "FCC", "2.4G", "40M", "HT", "2T", "12", "63",
4252 "ETSI", "2.4G", "40M", "HT", "2T", "12", "32",
4253 "MKK", "2.4G", "40M", "HT", "2T", "12", "32",
4254 "FCC", "2.4G", "40M", "HT", "2T", "13", "63",
4255 "ETSI", "2.4G", "40M", "HT", "2T", "13", "32",
4256 "MKK", "2.4G", "40M", "HT", "2T", "13", "32",
4257 "FCC", "2.4G", "40M", "HT", "2T", "14", "63",
4258 "ETSI", "2.4G", "40M", "HT", "2T", "14", "63",
4259 "MKK", "2.4G", "40M", "HT", "2T", "14", "63",
4260 "FCC", "5G", "20M", "OFDM", "1T", "36", "32",
4261 "ETSI", "5G", "20M", "OFDM", "1T", "36", "30",
4262 "MKK", "5G", "20M", "OFDM", "1T", "36", "30",
4263 "FCC", "5G", "20M", "OFDM", "1T", "40", "32",
4264 "ETSI", "5G", "20M", "OFDM", "1T", "40", "30",
4265 "MKK", "5G", "20M", "OFDM", "1T", "40", "30",
4266 "FCC", "5G", "20M", "OFDM", "1T", "44", "32",
4267 "ETSI", "5G", "20M", "OFDM", "1T", "44", "30",
4268 "MKK", "5G", "20M", "OFDM", "1T", "44", "30",
4269 "FCC", "5G", "20M", "OFDM", "1T", "48", "32",
4270 "ETSI", "5G", "20M", "OFDM", "1T", "48", "30",
4271 "MKK", "5G", "20M", "OFDM", "1T", "48", "30",
4272 "FCC", "5G", "20M", "OFDM", "1T", "52", "32",
4273 "ETSI", "5G", "20M", "OFDM", "1T", "52", "30",
4274 "MKK", "5G", "20M", "OFDM", "1T", "52", "30",
4275 "FCC", "5G", "20M", "OFDM", "1T", "56", "32",
4276 "ETSI", "5G", "20M", "OFDM", "1T", "56", "30",
4277 "MKK", "5G", "20M", "OFDM", "1T", "56", "30",
4278 "FCC", "5G", "20M", "OFDM", "1T", "60", "32",
4279 "ETSI", "5G", "20M", "OFDM", "1T", "60", "30",
4280 "MKK", "5G", "20M", "OFDM", "1T", "60", "30",
4281 "FCC", "5G", "20M", "OFDM", "1T", "64", "32",
4282 "ETSI", "5G", "20M", "OFDM", "1T", "64", "30",
4283 "MKK", "5G", "20M", "OFDM", "1T", "64", "30",
4284 "FCC", "5G", "20M", "OFDM", "1T", "100", "32",
4285 "ETSI", "5G", "20M", "OFDM", "1T", "100", "30",
4286 "MKK", "5G", "20M", "OFDM", "1T", "100", "30",
4287 "FCC", "5G", "20M", "OFDM", "1T", "114", "32",
4288 "ETSI", "5G", "20M", "OFDM", "1T", "114", "30",
4289 "MKK", "5G", "20M", "OFDM", "1T", "114", "30",
4290 "FCC", "5G", "20M", "OFDM", "1T", "108", "32",
4291 "ETSI", "5G", "20M", "OFDM", "1T", "108", "30",
4292 "MKK", "5G", "20M", "OFDM", "1T", "108", "30",
4293 "FCC", "5G", "20M", "OFDM", "1T", "112", "32",
4294 "ETSI", "5G", "20M", "OFDM", "1T", "112", "30",
4295 "MKK", "5G", "20M", "OFDM", "1T", "112", "30",
4296 "FCC", "5G", "20M", "OFDM", "1T", "116", "32",
4297 "ETSI", "5G", "20M", "OFDM", "1T", "116", "30",
4298 "MKK", "5G", "20M", "OFDM", "1T", "116", "30",
4299 "FCC", "5G", "20M", "OFDM", "1T", "120", "32",
4300 "ETSI", "5G", "20M", "OFDM", "1T", "120", "30",
4301 "MKK", "5G", "20M", "OFDM", "1T", "120", "30",
4302 "FCC", "5G", "20M", "OFDM", "1T", "124", "32",
4303 "ETSI", "5G", "20M", "OFDM", "1T", "124", "30",
4304 "MKK", "5G", "20M", "OFDM", "1T", "124", "30",
4305 "FCC", "5G", "20M", "OFDM", "1T", "128", "32",
4306 "ETSI", "5G", "20M", "OFDM", "1T", "128", "30",
4307 "MKK", "5G", "20M", "OFDM", "1T", "128", "30",
4308 "FCC", "5G", "20M", "OFDM", "1T", "132", "32",
4309 "ETSI", "5G", "20M", "OFDM", "1T", "132", "30",
4310 "MKK", "5G", "20M", "OFDM", "1T", "132", "30",
4311 "FCC", "5G", "20M", "OFDM", "1T", "136", "32",
4312 "ETSI", "5G", "20M", "OFDM", "1T", "136", "30",
4313 "MKK", "5G", "20M", "OFDM", "1T", "136", "30",
4314 "FCC", "5G", "20M", "OFDM", "1T", "140", "32",
4315 "ETSI", "5G", "20M", "OFDM", "1T", "140", "30",
4316 "MKK", "5G", "20M", "OFDM", "1T", "140", "30",
4317 "FCC", "5G", "20M", "OFDM", "1T", "149", "32",
4318 "ETSI", "5G", "20M", "OFDM", "1T", "149", "30",
4319 "MKK", "5G", "20M", "OFDM", "1T", "149", "63",
4320 "FCC", "5G", "20M", "OFDM", "1T", "153", "32",
4321 "ETSI", "5G", "20M", "OFDM", "1T", "153", "30",
4322 "MKK", "5G", "20M", "OFDM", "1T", "153", "63",
4323 "FCC", "5G", "20M", "OFDM", "1T", "157", "32",
4324 "ETSI", "5G", "20M", "OFDM", "1T", "157", "30",
4325 "MKK", "5G", "20M", "OFDM", "1T", "157", "63",
4326 "FCC", "5G", "20M", "OFDM", "1T", "161", "32",
4327 "ETSI", "5G", "20M", "OFDM", "1T", "161", "30",
4328 "MKK", "5G", "20M", "OFDM", "1T", "161", "63",
4329 "FCC", "5G", "20M", "OFDM", "1T", "165", "32",
4330 "ETSI", "5G", "20M", "OFDM", "1T", "165", "30",
4331 "MKK", "5G", "20M", "OFDM", "1T", "165", "63",
4332 "FCC", "5G", "20M", "HT", "1T", "36", "32",
4333 "ETSI", "5G", "20M", "HT", "1T", "36", "30",
4334 "MKK", "5G", "20M", "HT", "1T", "36", "30",
4335 "FCC", "5G", "20M", "HT", "1T", "40", "32",
4336 "ETSI", "5G", "20M", "HT", "1T", "40", "30",
4337 "MKK", "5G", "20M", "HT", "1T", "40", "30",
4338 "FCC", "5G", "20M", "HT", "1T", "44", "32",
4339 "ETSI", "5G", "20M", "HT", "1T", "44", "30",
4340 "MKK", "5G", "20M", "HT", "1T", "44", "30",
4341 "FCC", "5G", "20M", "HT", "1T", "48", "32",
4342 "ETSI", "5G", "20M", "HT", "1T", "48", "30",
4343 "MKK", "5G", "20M", "HT", "1T", "48", "30",
4344 "FCC", "5G", "20M", "HT", "1T", "52", "32",
4345 "ETSI", "5G", "20M", "HT", "1T", "52", "30",
4346 "MKK", "5G", "20M", "HT", "1T", "52", "30",
4347 "FCC", "5G", "20M", "HT", "1T", "56", "32",
4348 "ETSI", "5G", "20M", "HT", "1T", "56", "30",
4349 "MKK", "5G", "20M", "HT", "1T", "56", "30",
4350 "FCC", "5G", "20M", "HT", "1T", "60", "32",
4351 "ETSI", "5G", "20M", "HT", "1T", "60", "30",
4352 "MKK", "5G", "20M", "HT", "1T", "60", "30",
4353 "FCC", "5G", "20M", "HT", "1T", "64", "32",
4354 "ETSI", "5G", "20M", "HT", "1T", "64", "30",
4355 "MKK", "5G", "20M", "HT", "1T", "64", "30",
4356 "FCC", "5G", "20M", "HT", "1T", "100", "32",
4357 "ETSI", "5G", "20M", "HT", "1T", "100", "30",
4358 "MKK", "5G", "20M", "HT", "1T", "100", "30",
4359 "FCC", "5G", "20M", "HT", "1T", "114", "32",
4360 "ETSI", "5G", "20M", "HT", "1T", "114", "30",
4361 "MKK", "5G", "20M", "HT", "1T", "114", "30",
4362 "FCC", "5G", "20M", "HT", "1T", "108", "32",
4363 "ETSI", "5G", "20M", "HT", "1T", "108", "30",
4364 "MKK", "5G", "20M", "HT", "1T", "108", "30",
4365 "FCC", "5G", "20M", "HT", "1T", "112", "32",
4366 "ETSI", "5G", "20M", "HT", "1T", "112", "30",
4367 "MKK", "5G", "20M", "HT", "1T", "112", "30",
4368 "FCC", "5G", "20M", "HT", "1T", "116", "32",
4369 "ETSI", "5G", "20M", "HT", "1T", "116", "30",
4370 "MKK", "5G", "20M", "HT", "1T", "116", "30",
4371 "FCC", "5G", "20M", "HT", "1T", "120", "32",
4372 "ETSI", "5G", "20M", "HT", "1T", "120", "30",
4373 "MKK", "5G", "20M", "HT", "1T", "120", "30",
4374 "FCC", "5G", "20M", "HT", "1T", "124", "32",
4375 "ETSI", "5G", "20M", "HT", "1T", "124", "30",
4376 "MKK", "5G", "20M", "HT", "1T", "124", "30",
4377 "FCC", "5G", "20M", "HT", "1T", "128", "32",
4378 "ETSI", "5G", "20M", "HT", "1T", "128", "30",
4379 "MKK", "5G", "20M", "HT", "1T", "128", "30",
4380 "FCC", "5G", "20M", "HT", "1T", "132", "32",
4381 "ETSI", "5G", "20M", "HT", "1T", "132", "30",
4382 "MKK", "5G", "20M", "HT", "1T", "132", "30",
4383 "FCC", "5G", "20M", "HT", "1T", "136", "32",
4384 "ETSI", "5G", "20M", "HT", "1T", "136", "30",
4385 "MKK", "5G", "20M", "HT", "1T", "136", "30",
4386 "FCC", "5G", "20M", "HT", "1T", "140", "32",
4387 "ETSI", "5G", "20M", "HT", "1T", "140", "30",
4388 "MKK", "5G", "20M", "HT", "1T", "140", "30",
4389 "FCC", "5G", "20M", "HT", "1T", "149", "32",
4390 "ETSI", "5G", "20M", "HT", "1T", "149", "30",
4391 "MKK", "5G", "20M", "HT", "1T", "149", "63",
4392 "FCC", "5G", "20M", "HT", "1T", "153", "32",
4393 "ETSI", "5G", "20M", "HT", "1T", "153", "30",
4394 "MKK", "5G", "20M", "HT", "1T", "153", "63",
4395 "FCC", "5G", "20M", "HT", "1T", "157", "32",
4396 "ETSI", "5G", "20M", "HT", "1T", "157", "30",
4397 "MKK", "5G", "20M", "HT", "1T", "157", "63",
4398 "FCC", "5G", "20M", "HT", "1T", "161", "32",
4399 "ETSI", "5G", "20M", "HT", "1T", "161", "30",
4400 "MKK", "5G", "20M", "HT", "1T", "161", "63",
4401 "FCC", "5G", "20M", "HT", "1T", "165", "32",
4402 "ETSI", "5G", "20M", "HT", "1T", "165", "30",
4403 "MKK", "5G", "20M", "HT", "1T", "165", "63",
4404 "FCC", "5G", "20M", "HT", "2T", "36", "28",
4405 "ETSI", "5G", "20M", "HT", "2T", "36", "30",
4406 "MKK", "5G", "20M", "HT", "2T", "36", "30",
4407 "FCC", "5G", "20M", "HT", "2T", "40", "28",
4408 "ETSI", "5G", "20M", "HT", "2T", "40", "30",
4409 "MKK", "5G", "20M", "HT", "2T", "40", "30",
4410 "FCC", "5G", "20M", "HT", "2T", "44", "28",
4411 "ETSI", "5G", "20M", "HT", "2T", "44", "30",
4412 "MKK", "5G", "20M", "HT", "2T", "44", "30",
4413 "FCC", "5G", "20M", "HT", "2T", "48", "28",
4414 "ETSI", "5G", "20M", "HT", "2T", "48", "30",
4415 "MKK", "5G", "20M", "HT", "2T", "48", "30",
4416 "FCC", "5G", "20M", "HT", "2T", "52", "34",
4417 "ETSI", "5G", "20M", "HT", "2T", "52", "30",
4418 "MKK", "5G", "20M", "HT", "2T", "52", "30",
4419 "FCC", "5G", "20M", "HT", "2T", "56", "32",
4420 "ETSI", "5G", "20M", "HT", "2T", "56", "30",
4421 "MKK", "5G", "20M", "HT", "2T", "56", "30",
4422 "FCC", "5G", "20M", "HT", "2T", "60", "30",
4423 "ETSI", "5G", "20M", "HT", "2T", "60", "30",
4424 "MKK", "5G", "20M", "HT", "2T", "60", "30",
4425 "FCC", "5G", "20M", "HT", "2T", "64", "26",
4426 "ETSI", "5G", "20M", "HT", "2T", "64", "30",
4427 "MKK", "5G", "20M", "HT", "2T", "64", "30",
4428 "FCC", "5G", "20M", "HT", "2T", "100", "28",
4429 "ETSI", "5G", "20M", "HT", "2T", "100", "30",
4430 "MKK", "5G", "20M", "HT", "2T", "100", "30",
4431 "FCC", "5G", "20M", "HT", "2T", "114", "28",
4432 "ETSI", "5G", "20M", "HT", "2T", "114", "30",
4433 "MKK", "5G", "20M", "HT", "2T", "114", "30",
4434 "FCC", "5G", "20M", "HT", "2T", "108", "30",
4435 "ETSI", "5G", "20M", "HT", "2T", "108", "30",
4436 "MKK", "5G", "20M", "HT", "2T", "108", "30",
4437 "FCC", "5G", "20M", "HT", "2T", "112", "32",
4438 "ETSI", "5G", "20M", "HT", "2T", "112", "30",
4439 "MKK", "5G", "20M", "HT", "2T", "112", "30",
4440 "FCC", "5G", "20M", "HT", "2T", "116", "32",
4441 "ETSI", "5G", "20M", "HT", "2T", "116", "30",
4442 "MKK", "5G", "20M", "HT", "2T", "116", "30",
4443 "FCC", "5G", "20M", "HT", "2T", "120", "34",
4444 "ETSI", "5G", "20M", "HT", "2T", "120", "30",
4445 "MKK", "5G", "20M", "HT", "2T", "120", "30",
4446 "FCC", "5G", "20M", "HT", "2T", "124", "32",
4447 "ETSI", "5G", "20M", "HT", "2T", "124", "30",
4448 "MKK", "5G", "20M", "HT", "2T", "124", "30",
4449 "FCC", "5G", "20M", "HT", "2T", "128", "30",
4450 "ETSI", "5G", "20M", "HT", "2T", "128", "30",
4451 "MKK", "5G", "20M", "HT", "2T", "128", "30",
4452 "FCC", "5G", "20M", "HT", "2T", "132", "28",
4453 "ETSI", "5G", "20M", "HT", "2T", "132", "30",
4454 "MKK", "5G", "20M", "HT", "2T", "132", "30",
4455 "FCC", "5G", "20M", "HT", "2T", "136", "28",
4456 "ETSI", "5G", "20M", "HT", "2T", "136", "30",
4457 "MKK", "5G", "20M", "HT", "2T", "136", "30",
4458 "FCC", "5G", "20M", "HT", "2T", "140", "26",
4459 "ETSI", "5G", "20M", "HT", "2T", "140", "30",
4460 "MKK", "5G", "20M", "HT", "2T", "140", "30",
4461 "FCC", "5G", "20M", "HT", "2T", "149", "34",
4462 "ETSI", "5G", "20M", "HT", "2T", "149", "30",
4463 "MKK", "5G", "20M", "HT", "2T", "149", "63",
4464 "FCC", "5G", "20M", "HT", "2T", "153", "34",
4465 "ETSI", "5G", "20M", "HT", "2T", "153", "30",
4466 "MKK", "5G", "20M", "HT", "2T", "153", "63",
4467 "FCC", "5G", "20M", "HT", "2T", "157", "34",
4468 "ETSI", "5G", "20M", "HT", "2T", "157", "30",
4469 "MKK", "5G", "20M", "HT", "2T", "157", "63",
4470 "FCC", "5G", "20M", "HT", "2T", "161", "34",
4471 "ETSI", "5G", "20M", "HT", "2T", "161", "30",
4472 "MKK", "5G", "20M", "HT", "2T", "161", "63",
4473 "FCC", "5G", "20M", "HT", "2T", "165", "34",
4474 "ETSI", "5G", "20M", "HT", "2T", "165", "30",
4475 "MKK", "5G", "20M", "HT", "2T", "165", "63",
4476 "FCC", "5G", "40M", "HT", "1T", "38", "26",
4477 "ETSI", "5G", "40M", "HT", "1T", "38", "30",
4478 "MKK", "5G", "40M", "HT", "1T", "38", "30",
4479 "FCC", "5G", "40M", "HT", "1T", "46", "32",
4480 "ETSI", "5G", "40M", "HT", "1T", "46", "30",
4481 "MKK", "5G", "40M", "HT", "1T", "46", "30",
4482 "FCC", "5G", "40M", "HT", "1T", "54", "32",
4483 "ETSI", "5G", "40M", "HT", "1T", "54", "30",
4484 "MKK", "5G", "40M", "HT", "1T", "54", "30",
4485 "FCC", "5G", "40M", "HT", "1T", "62", "24",
4486 "ETSI", "5G", "40M", "HT", "1T", "62", "30",
4487 "MKK", "5G", "40M", "HT", "1T", "62", "30",
4488 "FCC", "5G", "40M", "HT", "1T", "102", "24",
4489 "ETSI", "5G", "40M", "HT", "1T", "102", "30",
4490 "MKK", "5G", "40M", "HT", "1T", "102", "30",
4491 "FCC", "5G", "40M", "HT", "1T", "110", "32",
4492 "ETSI", "5G", "40M", "HT", "1T", "110", "30",
4493 "MKK", "5G", "40M", "HT", "1T", "110", "30",
4494 "FCC", "5G", "40M", "HT", "1T", "118", "32",
4495 "ETSI", "5G", "40M", "HT", "1T", "118", "30",
4496 "MKK", "5G", "40M", "HT", "1T", "118", "30",
4497 "FCC", "5G", "40M", "HT", "1T", "126", "32",
4498 "ETSI", "5G", "40M", "HT", "1T", "126", "30",
4499 "MKK", "5G", "40M", "HT", "1T", "126", "30",
4500 "FCC", "5G", "40M", "HT", "1T", "134", "32",
4501 "ETSI", "5G", "40M", "HT", "1T", "134", "30",
4502 "MKK", "5G", "40M", "HT", "1T", "134", "30",
4503 "FCC", "5G", "40M", "HT", "1T", "151", "30",
4504 "ETSI", "5G", "40M", "HT", "1T", "151", "30",
4505 "MKK", "5G", "40M", "HT", "1T", "151", "63",
4506 "FCC", "5G", "40M", "HT", "1T", "159", "32",
4507 "ETSI", "5G", "40M", "HT", "1T", "159", "30",
4508 "MKK", "5G", "40M", "HT", "1T", "159", "63",
4509 "FCC", "5G", "40M", "HT", "2T", "38", "28",
4510 "ETSI", "5G", "40M", "HT", "2T", "38", "30",
4511 "MKK", "5G", "40M", "HT", "2T", "38", "30",
4512 "FCC", "5G", "40M", "HT", "2T", "46", "28",
4513 "ETSI", "5G", "40M", "HT", "2T", "46", "30",
4514 "MKK", "5G", "40M", "HT", "2T", "46", "30",
4515 "FCC", "5G", "40M", "HT", "2T", "54", "30",
4516 "ETSI", "5G", "40M", "HT", "2T", "54", "30",
4517 "MKK", "5G", "40M", "HT", "2T", "54", "30",
4518 "FCC", "5G", "40M", "HT", "2T", "62", "30",
4519 "ETSI", "5G", "40M", "HT", "2T", "62", "30",
4520 "MKK", "5G", "40M", "HT", "2T", "62", "30",
4521 "FCC", "5G", "40M", "HT", "2T", "102", "26",
4522 "ETSI", "5G", "40M", "HT", "2T", "102", "30",
4523 "MKK", "5G", "40M", "HT", "2T", "102", "30",
4524 "FCC", "5G", "40M", "HT", "2T", "110", "30",
4525 "ETSI", "5G", "40M", "HT", "2T", "110", "30",
4526 "MKK", "5G", "40M", "HT", "2T", "110", "30",
4527 "FCC", "5G", "40M", "HT", "2T", "118", "34",
4528 "ETSI", "5G", "40M", "HT", "2T", "118", "30",
4529 "MKK", "5G", "40M", "HT", "2T", "118", "30",
4530 "FCC", "5G", "40M", "HT", "2T", "126", "32",
4531 "ETSI", "5G", "40M", "HT", "2T", "126", "30",
4532 "MKK", "5G", "40M", "HT", "2T", "126", "30",
4533 "FCC", "5G", "40M", "HT", "2T", "134", "30",
4534 "ETSI", "5G", "40M", "HT", "2T", "134", "30",
4535 "MKK", "5G", "40M", "HT", "2T", "134", "30",
4536 "FCC", "5G", "40M", "HT", "2T", "151", "34",
4537 "ETSI", "5G", "40M", "HT", "2T", "151", "30",
4538 "MKK", "5G", "40M", "HT", "2T", "151", "63",
4539 "FCC", "5G", "40M", "HT", "2T", "159", "34",
4540 "ETSI", "5G", "40M", "HT", "2T", "159", "30",
4541 "MKK", "5G", "40M", "HT", "2T", "159", "63",
4542 "FCC", "5G", "80M", "VHT", "1T", "42", "22",
4543 "ETSI", "5G", "80M", "VHT", "1T", "42", "30",
4544 "MKK", "5G", "80M", "VHT", "1T", "42", "30",
4545 "FCC", "5G", "80M", "VHT", "1T", "58", "20",
4546 "ETSI", "5G", "80M", "VHT", "1T", "58", "30",
4547 "MKK", "5G", "80M", "VHT", "1T", "58", "30",
4548 "FCC", "5G", "80M", "VHT", "1T", "106", "20",
4549 "ETSI", "5G", "80M", "VHT", "1T", "106", "30",
4550 "MKK", "5G", "80M", "VHT", "1T", "106", "30",
4551 "FCC", "5G", "80M", "VHT", "1T", "122", "20",
4552 "ETSI", "5G", "80M", "VHT", "1T", "122", "30",
4553 "MKK", "5G", "80M", "VHT", "1T", "122", "30",
4554 "FCC", "5G", "80M", "VHT", "1T", "155", "28",
4555 "ETSI", "5G", "80M", "VHT", "1T", "155", "30",
4556 "MKK", "5G", "80M", "VHT", "1T", "155", "63",
4557 "FCC", "5G", "80M", "VHT", "2T", "42", "28",
4558 "ETSI", "5G", "80M", "VHT", "2T", "42", "30",
4559 "MKK", "5G", "80M", "VHT", "2T", "42", "30",
4560 "FCC", "5G", "80M", "VHT", "2T", "58", "26",
4561 "ETSI", "5G", "80M", "VHT", "2T", "58", "30",
4562 "MKK", "5G", "80M", "VHT", "2T", "58", "30",
4563 "FCC", "5G", "80M", "VHT", "2T", "106", "28",
4564 "ETSI", "5G", "80M", "VHT", "2T", "106", "30",
4565 "MKK", "5G", "80M", "VHT", "2T", "106", "30",
4566 "FCC", "5G", "80M", "VHT", "2T", "122", "32",
4567 "ETSI", "5G", "80M", "VHT", "2T", "122", "30",
4568 "MKK", "5G", "80M", "VHT", "2T", "122", "30",
4569 "FCC", "5G", "80M", "VHT", "2T", "155", "34",
4570 "ETSI", "5G", "80M", "VHT", "2T", "155", "30",
4571 "MKK", "5G", "80M", "VHT", "2T", "155", "63"
4572};
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/table.h b/drivers/net/wireless/rtlwifi/rtl8821ae/table.h
new file mode 100644
index 000000000000..24bcff6bc507
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/table.h
@@ -0,0 +1,60 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Created on 2010/ 5/18, 1:41
23 *
24 * Larry Finger <Larry.Finger@lwfinger.net>
25 *
26 *****************************************************************************/
27
28#ifndef __RTL8821AE_TABLE__H_
29#define __RTL8821AE_TABLE__H_
30
31#include <linux/types.h>
32#define RTL8821AEPHY_REG_1TARRAYLEN 344
33extern u32 RTL8821AE_PHY_REG_ARRAY[];
34#define RTL8812AEPHY_REG_1TARRAYLEN 490
35extern u32 RTL8812AE_PHY_REG_ARRAY[];
36#define RTL8821AEPHY_REG_ARRAY_PGLEN 90
37extern u32 RTL8821AE_PHY_REG_ARRAY_PG[];
38#define RTL8812AEPHY_REG_ARRAY_PGLEN 276
39extern u32 RTL8812AE_PHY_REG_ARRAY_PG[];
40/* #define RTL8723BE_RADIOA_1TARRAYLEN 206 */
41/* extern u8 *RTL8821AE_TXPWR_LMT_ARRAY[]; */
42#define RTL8812AE_RADIOA_1TARRAYLEN 1264
43extern u32 RTL8812AE_RADIOA_ARRAY[];
44#define RTL8812AE_RADIOB_1TARRAYLEN 1240
45extern u32 RTL8812AE_RADIOB_ARRAY[];
46#define RTL8821AE_RADIOA_1TARRAYLEN 1176
47extern u32 RTL8821AE_RADIOA_ARRAY[];
48#define RTL8821AEMAC_1T_ARRAYLEN 194
49extern u32 RTL8821AE_MAC_REG_ARRAY[];
50#define RTL8812AEMAC_1T_ARRAYLEN 214
51extern u32 RTL8812AE_MAC_REG_ARRAY[];
52#define RTL8821AEAGCTAB_1TARRAYLEN 382
53extern u32 RTL8821AE_AGC_TAB_ARRAY[];
54#define RTL8812AEAGCTAB_1TARRAYLEN 1312
55extern u32 RTL8812AE_AGC_TAB_ARRAY[];
56#define RTL8812AE_TXPWR_LMT_ARRAY_LEN 3948
57extern u8 *RTL8812AE_TXPWR_LMT[];
58#define RTL8821AE_TXPWR_LMT_ARRAY_LEN 3948
59extern u8 *RTL8821AE_TXPWR_LMT[];
60#endif
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
new file mode 100644
index 000000000000..383b86b05cba
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.c
@@ -0,0 +1,1236 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#include "../wifi.h"
27#include "../pci.h"
28#include "../base.h"
29#include "../stats.h"
30#include "reg.h"
31#include "def.h"
32#include "phy.h"
33#include "trx.h"
34#include "led.h"
35#include "dm.h"
36#include "phy.h"
37#include "fw.h"
38
39static u8 _rtl8821ae_map_hwqueue_to_fwqueue(struct sk_buff *skb, u8 hw_queue)
40{
41 __le16 fc = rtl_get_fc(skb);
42
43 if (unlikely(ieee80211_is_beacon(fc)))
44 return QSLT_BEACON;
45 if (ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))
46 return QSLT_MGNT;
47
48 return skb->priority;
49}
50
51/* mac80211's rate_idx is like this:
52 *
53 * 2.4G band:rx_status->band == IEEE80211_BAND_2GHZ
54 *
55 * B/G rate:
56 * (rx_status->flag & RX_FLAG_HT) = 0,
57 * DESC_RATE1M-->DESC_RATE54M ==> idx is 0-->11,
58 *
59 * N rate:
60 * (rx_status->flag & RX_FLAG_HT) = 1,
61 * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
62 *
63 * 5G band:rx_status->band == IEEE80211_BAND_5GHZ
64 * A rate:
65 * (rx_status->flag & RX_FLAG_HT) = 0,
66 * DESC_RATE6M-->DESC_RATE54M ==> idx is 0-->7,
67 *
68 * N rate:
69 * (rx_status->flag & RX_FLAG_HT) = 1,
70 * DESC_RATEMCS0-->DESC_RATEMCS15 ==> idx is 0-->15
71 */
72static int _rtl8821ae_rate_mapping(struct ieee80211_hw *hw,
73 bool isht, bool isvht, u8 desc_rate)
74{
75 int rate_idx;
76
77 if (!isht) {
78 if (IEEE80211_BAND_2GHZ == hw->conf.chandef.chan->band) {
79 switch (desc_rate) {
80 case DESC_RATE1M:
81 rate_idx = 0;
82 break;
83 case DESC_RATE2M:
84 rate_idx = 1;
85 break;
86 case DESC_RATE5_5M:
87 rate_idx = 2;
88 break;
89 case DESC_RATE11M:
90 rate_idx = 3;
91 break;
92 case DESC_RATE6M:
93 rate_idx = 4;
94 break;
95 case DESC_RATE9M:
96 rate_idx = 5;
97 break;
98 case DESC_RATE12M:
99 rate_idx = 6;
100 break;
101 case DESC_RATE18M:
102 rate_idx = 7;
103 break;
104 case DESC_RATE24M:
105 rate_idx = 8;
106 break;
107 case DESC_RATE36M:
108 rate_idx = 9;
109 break;
110 case DESC_RATE48M:
111 rate_idx = 10;
112 break;
113 case DESC_RATE54M:
114 rate_idx = 11;
115 break;
116 default:
117 rate_idx = 0;
118 break;
119 }
120 } else {
121 switch (desc_rate) {
122 case DESC_RATE6M:
123 rate_idx = 0;
124 break;
125 case DESC_RATE9M:
126 rate_idx = 1;
127 break;
128 case DESC_RATE12M:
129 rate_idx = 2;
130 break;
131 case DESC_RATE18M:
132 rate_idx = 3;
133 break;
134 case DESC_RATE24M:
135 rate_idx = 4;
136 break;
137 case DESC_RATE36M:
138 rate_idx = 5;
139 break;
140 case DESC_RATE48M:
141 rate_idx = 6;
142 break;
143 case DESC_RATE54M:
144 rate_idx = 7;
145 break;
146 default:
147 rate_idx = 0;
148 break;
149 }
150 }
151 } else {
152 switch (desc_rate) {
153 case DESC_RATEMCS0:
154 rate_idx = 0;
155 break;
156 case DESC_RATEMCS1:
157 rate_idx = 1;
158 break;
159 case DESC_RATEMCS2:
160 rate_idx = 2;
161 break;
162 case DESC_RATEMCS3:
163 rate_idx = 3;
164 break;
165 case DESC_RATEMCS4:
166 rate_idx = 4;
167 break;
168 case DESC_RATEMCS5:
169 rate_idx = 5;
170 break;
171 case DESC_RATEMCS6:
172 rate_idx = 6;
173 break;
174 case DESC_RATEMCS7:
175 rate_idx = 7;
176 break;
177 case DESC_RATEMCS8:
178 rate_idx = 8;
179 break;
180 case DESC_RATEMCS9:
181 rate_idx = 9;
182 break;
183 case DESC_RATEMCS10:
184 rate_idx = 10;
185 break;
186 case DESC_RATEMCS11:
187 rate_idx = 11;
188 break;
189 case DESC_RATEMCS12:
190 rate_idx = 12;
191 break;
192 case DESC_RATEMCS13:
193 rate_idx = 13;
194 break;
195 case DESC_RATEMCS14:
196 rate_idx = 14;
197 break;
198 case DESC_RATEMCS15:
199 rate_idx = 15;
200 break;
201 default:
202 rate_idx = 0;
203 break;
204 }
205 }
206
207 if (isvht) {
208 switch (desc_rate) {
209 case DESC_RATEVHT1SS_MCS0:
210 rate_idx = 0;
211 break;
212 case DESC_RATEVHT1SS_MCS1:
213 rate_idx = 1;
214 break;
215 case DESC_RATEVHT1SS_MCS2:
216 rate_idx = 2;
217 break;
218 case DESC_RATEVHT1SS_MCS3:
219 rate_idx = 3;
220 break;
221 case DESC_RATEVHT1SS_MCS4:
222 rate_idx = 4;
223 break;
224 case DESC_RATEVHT1SS_MCS5:
225 rate_idx = 5;
226 break;
227 case DESC_RATEVHT1SS_MCS6:
228 rate_idx = 6;
229 break;
230 case DESC_RATEVHT1SS_MCS7:
231 rate_idx = 7;
232 break;
233 case DESC_RATEVHT1SS_MCS8:
234 rate_idx = 8;
235 break;
236 case DESC_RATEVHT1SS_MCS9:
237 rate_idx = 9;
238 break;
239 case DESC_RATEVHT2SS_MCS0:
240 rate_idx = 0;
241 break;
242 case DESC_RATEVHT2SS_MCS1:
243 rate_idx = 1;
244 break;
245 case DESC_RATEVHT2SS_MCS2:
246 rate_idx = 2;
247 break;
248 case DESC_RATEVHT2SS_MCS3:
249 rate_idx = 3;
250 break;
251 case DESC_RATEVHT2SS_MCS4:
252 rate_idx = 4;
253 break;
254 case DESC_RATEVHT2SS_MCS5:
255 rate_idx = 5;
256 break;
257 case DESC_RATEVHT2SS_MCS6:
258 rate_idx = 6;
259 break;
260 case DESC_RATEVHT2SS_MCS7:
261 rate_idx = 7;
262 break;
263 case DESC_RATEVHT2SS_MCS8:
264 rate_idx = 8;
265 break;
266 case DESC_RATEVHT2SS_MCS9:
267 rate_idx = 9;
268 break;
269 default:
270 rate_idx = 0;
271 break;
272 }
273 }
274 return rate_idx;
275}
276
277static u16 odm_cfo(char value)
278{
279 int ret_val;
280
281 if (value < 0) {
282 ret_val = 0 - value;
283 ret_val = (ret_val << 1) + (ret_val >> 1);
284 /* set bit12 as 1 for negative cfo */
285 ret_val = ret_val | BIT(12);
286 } else {
287 ret_val = value;
288 ret_val = (ret_val << 1) + (ret_val >> 1);
289 }
290 return ret_val;
291}
292
293static void query_rxphystatus(struct ieee80211_hw *hw,
294 struct rtl_stats *pstatus, u8 *pdesc,
295 struct rx_fwinfo_8821ae *p_drvinfo,
296 bool bpacket_match_bssid,
297 bool bpacket_toself, bool packet_beacon)
298{
299 struct rtl_priv *rtlpriv = rtl_priv(hw);
300 struct phy_status_rpt *p_phystrpt = (struct phy_status_rpt *)p_drvinfo;
301 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw));
302 struct rtl_phy *rtlphy = &rtlpriv->phy;
303 char rx_pwr_all = 0, rx_pwr[4];
304 u8 rf_rx_num = 0, evm, evmdbm, pwdb_all;
305 u8 i, max_spatial_stream;
306 u32 rssi, total_rssi = 0;
307 bool is_cck = pstatus->is_cck;
308 u8 lan_idx, vga_idx;
309
310 /* Record it for next packet processing */
311 pstatus->packet_matchbssid = bpacket_match_bssid;
312 pstatus->packet_toself = bpacket_toself;
313 pstatus->packet_beacon = packet_beacon;
314 pstatus->rx_mimo_signalquality[0] = -1;
315 pstatus->rx_mimo_signalquality[1] = -1;
316
317 if (is_cck) {
318 u8 cck_highpwr;
319 u8 cck_agc_rpt;
320
321 cck_agc_rpt = p_phystrpt->cfosho[0];
322
323 /* (1)Hardware does not provide RSSI for CCK
324 * (2)PWDB, Average PWDB cacluated by
325 * hardware (for rate adaptive)
326 */
327 cck_highpwr = (u8)rtlphy->cck_high_power;
328
329 lan_idx = ((cck_agc_rpt & 0xE0) >> 5);
330 vga_idx = (cck_agc_rpt & 0x1f);
331 if (rtlpriv->rtlhal.hw_type == HARDWARE_TYPE_RTL8812AE) {
332 switch (lan_idx) {
333 case 7:
334 if (vga_idx <= 27)
335 /*VGA_idx = 27~2*/
336 rx_pwr_all = -100 + 2*(27-vga_idx);
337 else
338 rx_pwr_all = -100;
339 break;
340 case 6:
341 /*VGA_idx = 2~0*/
342 rx_pwr_all = -48 + 2*(2-vga_idx);
343 break;
344 case 5:
345 /*VGA_idx = 7~5*/
346 rx_pwr_all = -42 + 2*(7-vga_idx);
347 break;
348 case 4:
349 /*VGA_idx = 7~4*/
350 rx_pwr_all = -36 + 2*(7-vga_idx);
351 break;
352 case 3:
353 /*VGA_idx = 7~0*/
354 rx_pwr_all = -24 + 2*(7-vga_idx);
355 break;
356 case 2:
357 if (cck_highpwr)
358 /*VGA_idx = 5~0*/
359 rx_pwr_all = -12 + 2*(5-vga_idx);
360 else
361 rx_pwr_all = -6 + 2*(5-vga_idx);
362 break;
363 case 1:
364 rx_pwr_all = 8-2*vga_idx;
365 break;
366 case 0:
367 rx_pwr_all = 14-2*vga_idx;
368 break;
369 default:
370 break;
371 }
372 rx_pwr_all += 6;
373 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
374 if (!cck_highpwr) {
375 if (pwdb_all >= 80)
376 pwdb_all =
377 ((pwdb_all - 80)<<1) +
378 ((pwdb_all - 80)>>1) + 80;
379 else if ((pwdb_all <= 78) && (pwdb_all >= 20))
380 pwdb_all += 3;
381 if (pwdb_all > 100)
382 pwdb_all = 100;
383 }
384 } else { /* 8821 */
385 char pout = -6;
386
387 switch (lan_idx) {
388 case 5:
389 rx_pwr_all = pout - 32 - (2*vga_idx);
390 break;
391 case 4:
392 rx_pwr_all = pout - 24 - (2*vga_idx);
393 break;
394 case 2:
395 rx_pwr_all = pout - 11 - (2*vga_idx);
396 break;
397 case 1:
398 rx_pwr_all = pout + 5 - (2*vga_idx);
399 break;
400 case 0:
401 rx_pwr_all = pout + 21 - (2*vga_idx);
402 break;
403 }
404 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
405 }
406
407 pstatus->rx_pwdb_all = pwdb_all;
408 pstatus->recvsignalpower = rx_pwr_all;
409
410 /* (3) Get Signal Quality (EVM) */
411 if (bpacket_match_bssid) {
412 u8 sq;
413
414 if (pstatus->rx_pwdb_all > 40) {
415 sq = 100;
416 } else {
417 sq = p_phystrpt->pwdb_all;
418 if (sq > 64)
419 sq = 0;
420 else if (sq < 20)
421 sq = 100;
422 else
423 sq = ((64 - sq) * 100) / 44;
424 }
425
426 pstatus->signalquality = sq;
427 pstatus->rx_mimo_signalquality[0] = sq;
428 pstatus->rx_mimo_signalquality[1] = -1;
429 }
430 } else {
431 /* (1)Get RSSI for HT rate */
432 for (i = RF90_PATH_A; i < RF6052_MAX_PATH; i++) {
433 /* we will judge RF RX path now. */
434 if (rtlpriv->dm.rfpath_rxenable[i])
435 rf_rx_num++;
436
437 rx_pwr[i] = (p_phystrpt->gain_trsw[i] & 0x7f) - 110;
438
439 /* Translate DBM to percentage. */
440 rssi = rtl_query_rxpwrpercentage(rx_pwr[i]);
441 total_rssi += rssi;
442
443 /* Get Rx snr value in DB */
444 pstatus->rx_snr[i] = p_phystrpt->rxsnr[i] / 2;
445 rtlpriv->stats.rx_snr_db[i] = p_phystrpt->rxsnr[i] / 2;
446
447 pstatus->cfo_short[i] = odm_cfo(p_phystrpt->cfosho[i]);
448 pstatus->cfo_tail[i] = odm_cfo(p_phystrpt->cfotail[i]);
449 /* Record Signal Strength for next packet */
450 pstatus->rx_mimo_signalstrength[i] = (u8)rssi;
451 }
452
453 /* (2)PWDB, Average PWDB cacluated by
454 * hardware (for rate adaptive)
455 */
456 rx_pwr_all = ((p_drvinfo->pwdb_all >> 1) & 0x7f) - 110;
457
458 pwdb_all = rtl_query_rxpwrpercentage(rx_pwr_all);
459 pstatus->rx_pwdb_all = pwdb_all;
460 pstatus->rxpower = rx_pwr_all;
461 pstatus->recvsignalpower = rx_pwr_all;
462
463 /* (3)EVM of HT rate */
464 if ((pstatus->is_ht && pstatus->rate >= DESC_RATEMCS8 &&
465 pstatus->rate <= DESC_RATEMCS15) ||
466 (pstatus->is_vht &&
467 pstatus->rate >= DESC_RATEVHT2SS_MCS0 &&
468 pstatus->rate <= DESC_RATEVHT2SS_MCS9))
469 max_spatial_stream = 2;
470 else
471 max_spatial_stream = 1;
472
473 for (i = 0; i < max_spatial_stream; i++) {
474 evm = rtl_evm_db_to_percentage(p_phystrpt->rxevm[i]);
475 evmdbm = rtl_evm_dbm_jaguar(p_phystrpt->rxevm[i]);
476
477 if (bpacket_match_bssid) {
478 /* Fill value in RFD, Get the first
479 * spatial stream only
480 */
481 if (i == 0)
482 pstatus->signalquality = evm;
483 pstatus->rx_mimo_signalquality[i] = evm;
484 pstatus->rx_mimo_evm_dbm[i] = evmdbm;
485 }
486 }
487 if (bpacket_match_bssid) {
488 for (i = RF90_PATH_A; i <= RF90_PATH_B; i++)
489 rtl_priv(hw)->dm.cfo_tail[i] =
490 (char)p_phystrpt->cfotail[i];
491
492 rtl_priv(hw)->dm.packet_count++;
493 }
494 }
495
496 /* UI BSS List signal strength(in percentage),
497 * make it good looking, from 0~100.
498 */
499 if (is_cck)
500 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
501 pwdb_all));
502 else if (rf_rx_num != 0)
503 pstatus->signalstrength = (u8)(rtl_signal_scale_mapping(hw,
504 total_rssi /= rf_rx_num));
505 /*HW antenna diversity*/
506 rtldm->fat_table.antsel_rx_keep_0 = p_phystrpt->antidx_anta;
507 rtldm->fat_table.antsel_rx_keep_1 = p_phystrpt->antidx_antb;
508}
509
510static void translate_rx_signal_stuff(struct ieee80211_hw *hw,
511 struct sk_buff *skb,
512 struct rtl_stats *pstatus, u8 *pdesc,
513 struct rx_fwinfo_8821ae *p_drvinfo)
514{
515 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
516 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
517 struct ieee80211_hdr *hdr;
518 u8 *tmp_buf;
519 u8 *praddr;
520 u8 *psaddr;
521 __le16 fc;
522 u16 type;
523 bool packet_matchbssid, packet_toself, packet_beacon;
524
525 tmp_buf = skb->data + pstatus->rx_drvinfo_size + pstatus->rx_bufshift;
526
527 hdr = (struct ieee80211_hdr *)tmp_buf;
528 fc = hdr->frame_control;
529 type = WLAN_FC_GET_TYPE(hdr->frame_control);
530 praddr = hdr->addr1;
531 psaddr = ieee80211_get_SA(hdr);
532 ether_addr_copy(pstatus->psaddr, psaddr);
533
534 packet_matchbssid = (!ieee80211_is_ctl(fc) &&
535 (ether_addr_equal(mac->bssid,
536 ieee80211_has_tods(fc) ?
537 hdr->addr1 :
538 ieee80211_has_fromds(fc) ?
539 hdr->addr2 : hdr->addr3)) &&
540 (!pstatus->hwerror) &&
541 (!pstatus->crc) && (!pstatus->icv));
542
543 packet_toself = packet_matchbssid &&
544 (ether_addr_equal(praddr, rtlefuse->dev_addr));
545
546 if (ieee80211_is_beacon(hdr->frame_control))
547 packet_beacon = true;
548 else
549 packet_beacon = false;
550
551 if (packet_beacon && packet_matchbssid)
552 rtl_priv(hw)->dm.dbginfo.num_qry_beacon_pkt++;
553
554 if (packet_matchbssid &&
555 ieee80211_is_data_qos(hdr->frame_control) &&
556 !is_multicast_ether_addr(ieee80211_get_DA(hdr))) {
557 struct ieee80211_qos_hdr *hdr_qos =
558 (struct ieee80211_qos_hdr *)tmp_buf;
559 u16 tid = le16_to_cpu(hdr_qos->qos_ctrl) & 0xf;
560
561 if (tid != 0 && tid != 3)
562 rtl_priv(hw)->dm.dbginfo.num_non_be_pkt++;
563 }
564
565 query_rxphystatus(hw, pstatus, pdesc, p_drvinfo,
566 packet_matchbssid, packet_toself,
567 packet_beacon);
568 /*_rtl8821ae_smart_antenna(hw, pstatus); */
569 rtl_process_phyinfo(hw, tmp_buf, pstatus);
570}
571
572static void _rtl8821ae_insert_emcontent(struct rtl_tcb_desc *ptcb_desc,
573 u8 *virtualaddress)
574{
575 u32 dwtmp = 0;
576
577 memset(virtualaddress, 0, 8);
578
579 SET_EARLYMODE_PKTNUM(virtualaddress, ptcb_desc->empkt_num);
580 if (ptcb_desc->empkt_num == 1) {
581 dwtmp = ptcb_desc->empkt_len[0];
582 } else {
583 dwtmp = ptcb_desc->empkt_len[0];
584 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
585 dwtmp += ptcb_desc->empkt_len[1];
586 }
587 SET_EARLYMODE_LEN0(virtualaddress, dwtmp);
588
589 if (ptcb_desc->empkt_num <= 3) {
590 dwtmp = ptcb_desc->empkt_len[2];
591 } else {
592 dwtmp = ptcb_desc->empkt_len[2];
593 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
594 dwtmp += ptcb_desc->empkt_len[3];
595 }
596 SET_EARLYMODE_LEN1(virtualaddress, dwtmp);
597 if (ptcb_desc->empkt_num <= 5) {
598 dwtmp = ptcb_desc->empkt_len[4];
599 } else {
600 dwtmp = ptcb_desc->empkt_len[4];
601 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
602 dwtmp += ptcb_desc->empkt_len[5];
603 }
604 SET_EARLYMODE_LEN2_1(virtualaddress, dwtmp & 0xF);
605 SET_EARLYMODE_LEN2_2(virtualaddress, dwtmp >> 4);
606 if (ptcb_desc->empkt_num <= 7) {
607 dwtmp = ptcb_desc->empkt_len[6];
608 } else {
609 dwtmp = ptcb_desc->empkt_len[6];
610 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
611 dwtmp += ptcb_desc->empkt_len[7];
612 }
613 SET_EARLYMODE_LEN3(virtualaddress, dwtmp);
614 if (ptcb_desc->empkt_num <= 9) {
615 dwtmp = ptcb_desc->empkt_len[8];
616 } else {
617 dwtmp = ptcb_desc->empkt_len[8];
618 dwtmp += ((dwtmp % 4) ? (4 - dwtmp % 4) : 0)+4;
619 dwtmp += ptcb_desc->empkt_len[9];
620 }
621 SET_EARLYMODE_LEN4(virtualaddress, dwtmp);
622}
623
624static bool rtl8821ae_get_rxdesc_is_ht(struct ieee80211_hw *hw, u8 *pdesc)
625{
626 struct rtl_priv *rtlpriv = rtl_priv(hw);
627 u8 rx_rate = 0;
628
629 rx_rate = GET_RX_DESC_RXMCS(pdesc);
630
631 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD, "rx_rate=0x%02x.\n", rx_rate);
632
633 if ((rx_rate >= DESC_RATEMCS0) && (rx_rate <= DESC_RATEMCS15))
634 return true;
635 return false;
636}
637
638static bool rtl8821ae_get_rxdesc_is_vht(struct ieee80211_hw *hw, u8 *pdesc)
639{
640 struct rtl_priv *rtlpriv = rtl_priv(hw);
641 u8 rx_rate = 0;
642
643 rx_rate = GET_RX_DESC_RXMCS(pdesc);
644
645 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD, "rx_rate=0x%02x.\n", rx_rate);
646
647 if (rx_rate >= DESC_RATEVHT1SS_MCS0)
648 return true;
649 return false;
650}
651
652static u8 rtl8821ae_get_rx_vht_nss(struct ieee80211_hw *hw, u8 *pdesc)
653{
654 u8 rx_rate = 0;
655 u8 vht_nss = 0;
656
657 rx_rate = GET_RX_DESC_RXMCS(pdesc);
658 if ((rx_rate >= DESC_RATEVHT1SS_MCS0) &&
659 (rx_rate <= DESC_RATEVHT1SS_MCS9))
660 vht_nss = 1;
661 else if ((rx_rate >= DESC_RATEVHT2SS_MCS0) &&
662 (rx_rate <= DESC_RATEVHT2SS_MCS9))
663 vht_nss = 2;
664
665 return vht_nss;
666}
667
668bool rtl8821ae_rx_query_desc(struct ieee80211_hw *hw,
669 struct rtl_stats *status,
670 struct ieee80211_rx_status *rx_status,
671 u8 *pdesc, struct sk_buff *skb)
672{
673 struct rtl_priv *rtlpriv = rtl_priv(hw);
674 struct rx_fwinfo_8821ae *p_drvinfo;
675 struct ieee80211_hdr *hdr;
676
677 u32 phystatus = GET_RX_DESC_PHYST(pdesc);
678
679 status->length = (u16)GET_RX_DESC_PKT_LEN(pdesc);
680 status->rx_drvinfo_size = (u8)GET_RX_DESC_DRV_INFO_SIZE(pdesc) *
681 RX_DRV_INFO_SIZE_UNIT;
682 status->rx_bufshift = (u8)(GET_RX_DESC_SHIFT(pdesc) & 0x03);
683 status->icv = (u16)GET_RX_DESC_ICV(pdesc);
684 status->crc = (u16)GET_RX_DESC_CRC32(pdesc);
685 status->hwerror = (status->crc | status->icv);
686 status->decrypted = !GET_RX_DESC_SWDEC(pdesc);
687 status->rate = (u8)GET_RX_DESC_RXMCS(pdesc);
688 status->shortpreamble = (u16)GET_RX_DESC_SPLCP(pdesc);
689 status->isampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
690 status->isfirst_ampdu = (bool)(GET_RX_DESC_PAGGR(pdesc) == 1);
691 status->timestamp_low = GET_RX_DESC_TSFL(pdesc);
692 status->rx_packet_bw = GET_RX_DESC_BW(pdesc);
693 status->macid = GET_RX_DESC_MACID(pdesc);
694 status->is_short_gi = !(bool)GET_RX_DESC_SPLCP(pdesc);
695 status->is_ht = rtl8821ae_get_rxdesc_is_ht(hw, pdesc);
696 status->is_vht = rtl8821ae_get_rxdesc_is_vht(hw, pdesc);
697 status->vht_nss = rtl8821ae_get_rx_vht_nss(hw, pdesc);
698 status->is_cck = RTL8821AE_RX_HAL_IS_CCK_RATE(status->rate);
699
700 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
701 "rx_packet_bw=%s,is_ht %d, is_vht %d, vht_nss=%d,is_short_gi %d.\n",
702 (status->rx_packet_bw == 2) ? "80M" :
703 (status->rx_packet_bw == 1) ? "40M" : "20M",
704 status->is_ht, status->is_vht, status->vht_nss,
705 status->is_short_gi);
706
707 if (GET_RX_STATUS_DESC_RPT_SEL(pdesc))
708 status->packet_report_type = C2H_PACKET;
709 else
710 status->packet_report_type = NORMAL_RX;
711
712 if (GET_RX_STATUS_DESC_PATTERN_MATCH(pdesc))
713 status->wake_match = BIT(2);
714 else if (GET_RX_STATUS_DESC_MAGIC_MATCH(pdesc))
715 status->wake_match = BIT(1);
716 else if (GET_RX_STATUS_DESC_UNICAST_MATCH(pdesc))
717 status->wake_match = BIT(0);
718 else
719 status->wake_match = 0;
720
721 if (status->wake_match)
722 RT_TRACE(rtlpriv, COMP_RXDESC, DBG_LOUD,
723 "GGGGGGGGGGGGGet Wakeup Packet!! WakeMatch=%d\n",
724 status->wake_match);
725 rx_status->freq = hw->conf.chandef.chan->center_freq;
726 rx_status->band = hw->conf.chandef.chan->band;
727
728 hdr = (struct ieee80211_hdr *)(skb->data +
729 status->rx_drvinfo_size + status->rx_bufshift);
730
731 if (status->crc)
732 rx_status->flag |= RX_FLAG_FAILED_FCS_CRC;
733
734 if (status->rx_packet_bw == HT_CHANNEL_WIDTH_20_40)
735 rx_status->flag |= RX_FLAG_40MHZ;
736 else if (status->rx_packet_bw == HT_CHANNEL_WIDTH_80)
737 rx_status->vht_flag |= RX_VHT_FLAG_80MHZ;
738 if (status->is_ht)
739 rx_status->flag |= RX_FLAG_HT;
740 if (status->is_vht)
741 rx_status->flag |= RX_FLAG_VHT;
742
743 if (status->is_short_gi)
744 rx_status->flag |= RX_FLAG_SHORT_GI;
745
746 rx_status->vht_nss = status->vht_nss;
747 rx_status->flag |= RX_FLAG_MACTIME_START;
748
749 /* hw will set status->decrypted true, if it finds the
750 * frame is open data frame or mgmt frame.
751 * So hw will not decryption robust managment frame
752 * for IEEE80211w but still set status->decrypted
753 * true, so here we should set it back to undecrypted
754 * for IEEE80211w frame, and mac80211 sw will help
755 * to decrypt it
756 */
757 if (status->decrypted) {
758 if ((!_ieee80211_is_robust_mgmt_frame(hdr)) &&
759 (ieee80211_has_protected(hdr->frame_control)))
760 rx_status->flag |= RX_FLAG_DECRYPTED;
761 else
762 rx_status->flag &= ~RX_FLAG_DECRYPTED;
763 }
764
765 /* rate_idx: index of data rate into band's
766 * supported rates or MCS index if HT rates
767 * are use (RX_FLAG_HT)
768 */
769 rx_status->rate_idx =
770 _rtl8821ae_rate_mapping(hw, status->is_ht,
771 status->is_vht, status->rate);
772
773 rx_status->mactime = status->timestamp_low;
774 if (phystatus) {
775 p_drvinfo = (struct rx_fwinfo_8821ae *)(skb->data +
776 status->rx_bufshift);
777
778 translate_rx_signal_stuff(hw, skb, status, pdesc, p_drvinfo);
779 }
780 rx_status->signal = status->recvsignalpower + 10;
781 if (status->packet_report_type == TX_REPORT2) {
782 status->macid_valid_entry[0] =
783 GET_RX_RPT2_DESC_MACID_VALID_1(pdesc);
784 status->macid_valid_entry[1] =
785 GET_RX_RPT2_DESC_MACID_VALID_2(pdesc);
786 }
787 return true;
788}
789
790static u8 rtl8821ae_bw_mapping(struct ieee80211_hw *hw,
791 struct rtl_tcb_desc *ptcb_desc)
792{
793 struct rtl_priv *rtlpriv = rtl_priv(hw);
794 struct rtl_phy *rtlphy = &rtlpriv->phy;
795 u8 bw_setting_of_desc = 0;
796
797 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
798 "rtl8821ae_bw_mapping, current_chan_bw %d, packet_bw %d\n",
799 rtlphy->current_chan_bw, ptcb_desc->packet_bw);
800
801 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
802 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_80)
803 bw_setting_of_desc = 2;
804 else if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40)
805 bw_setting_of_desc = 1;
806 else
807 bw_setting_of_desc = 0;
808 } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
809 if ((ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) ||
810 (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_80))
811 bw_setting_of_desc = 1;
812 else
813 bw_setting_of_desc = 0;
814 } else {
815 bw_setting_of_desc = 0;
816 }
817 return bw_setting_of_desc;
818}
819
820static u8 rtl8821ae_sc_mapping(struct ieee80211_hw *hw,
821 struct rtl_tcb_desc *ptcb_desc)
822{
823 struct rtl_priv *rtlpriv = rtl_priv(hw);
824 struct rtl_phy *rtlphy = &rtlpriv->phy;
825 struct rtl_mac *mac = rtl_mac(rtlpriv);
826 u8 sc_setting_of_desc = 0;
827
828 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) {
829 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_80) {
830 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
831 } else if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
832 if (mac->cur_80_prime_sc ==
833 HAL_PRIME_CHNL_OFFSET_LOWER)
834 sc_setting_of_desc =
835 VHT_DATA_SC_40_LOWER_OF_80MHZ;
836 else if (mac->cur_80_prime_sc ==
837 HAL_PRIME_CHNL_OFFSET_UPPER)
838 sc_setting_of_desc =
839 VHT_DATA_SC_40_UPPER_OF_80MHZ;
840 else
841 RT_TRACE(rtlpriv, COMP_SEND, DBG_LOUD,
842 "rtl8821ae_sc_mapping: Not Correct Primary40MHz Setting\n");
843 } else {
844 if ((mac->cur_40_prime_sc ==
845 HAL_PRIME_CHNL_OFFSET_LOWER) &&
846 (mac->cur_80_prime_sc ==
847 HAL_PRIME_CHNL_OFFSET_LOWER))
848 sc_setting_of_desc =
849 VHT_DATA_SC_20_LOWEST_OF_80MHZ;
850 else if ((mac->cur_40_prime_sc ==
851 HAL_PRIME_CHNL_OFFSET_UPPER) &&
852 (mac->cur_80_prime_sc ==
853 HAL_PRIME_CHNL_OFFSET_LOWER))
854 sc_setting_of_desc =
855 VHT_DATA_SC_20_LOWER_OF_80MHZ;
856 else if ((mac->cur_40_prime_sc ==
857 HAL_PRIME_CHNL_OFFSET_LOWER) &&
858 (mac->cur_80_prime_sc ==
859 HAL_PRIME_CHNL_OFFSET_UPPER))
860 sc_setting_of_desc =
861 VHT_DATA_SC_20_UPPER_OF_80MHZ;
862 else if ((mac->cur_40_prime_sc ==
863 HAL_PRIME_CHNL_OFFSET_UPPER) &&
864 (mac->cur_80_prime_sc ==
865 HAL_PRIME_CHNL_OFFSET_UPPER))
866 sc_setting_of_desc =
867 VHT_DATA_SC_20_UPPERST_OF_80MHZ;
868 else
869 RT_TRACE(rtlpriv, COMP_SEND, DBG_LOUD,
870 "rtl8821ae_sc_mapping: Not Correct Primary40MHz Setting\n");
871 }
872 } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) {
873 if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20_40) {
874 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
875 } else if (ptcb_desc->packet_bw == HT_CHANNEL_WIDTH_20) {
876 if (mac->cur_40_prime_sc ==
877 HAL_PRIME_CHNL_OFFSET_UPPER) {
878 sc_setting_of_desc =
879 VHT_DATA_SC_20_UPPER_OF_80MHZ;
880 } else if (mac->cur_40_prime_sc ==
881 HAL_PRIME_CHNL_OFFSET_LOWER){
882 sc_setting_of_desc =
883 VHT_DATA_SC_20_LOWER_OF_80MHZ;
884 } else {
885 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
886 }
887 }
888 } else {
889 sc_setting_of_desc = VHT_DATA_SC_DONOT_CARE;
890 }
891
892 return sc_setting_of_desc;
893}
894
895void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
896 struct ieee80211_hdr *hdr, u8 *pdesc_tx, u8 *txbd,
897 struct ieee80211_tx_info *info,
898 struct ieee80211_sta *sta,
899 struct sk_buff *skb,
900 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc)
901{
902 struct rtl_priv *rtlpriv = rtl_priv(hw);
903 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
904 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
905 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
906 u8 *pdesc = (u8 *)pdesc_tx;
907 u16 seq_number;
908 __le16 fc = hdr->frame_control;
909 unsigned int buf_len = 0;
910 unsigned int skb_len = skb->len;
911 u8 fw_qsel = _rtl8821ae_map_hwqueue_to_fwqueue(skb, hw_queue);
912 bool firstseg = ((hdr->seq_ctrl &
913 cpu_to_le16(IEEE80211_SCTL_FRAG)) == 0);
914 bool lastseg = ((hdr->frame_control &
915 cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) == 0);
916 dma_addr_t mapping;
917 u8 short_gi = 0;
918
919 seq_number = (le16_to_cpu(hdr->seq_ctrl) & IEEE80211_SCTL_SEQ) >> 4;
920 rtl_get_tcb_desc(hw, info, sta, skb, ptcb_desc);
921 /* reserve 8 byte for AMPDU early mode */
922 if (rtlhal->earlymode_enable) {
923 skb_push(skb, EM_HDR_LEN);
924 memset(skb->data, 0, EM_HDR_LEN);
925 }
926 buf_len = skb->len;
927 mapping = pci_map_single(rtlpci->pdev, skb->data, skb->len,
928 PCI_DMA_TODEVICE);
929 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
930 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
931 "DMA mapping error");
932 return;
933 }
934 CLEAR_PCI_TX_DESC_CONTENT(pdesc, sizeof(struct tx_desc_8821ae));
935 if (ieee80211_is_nullfunc(fc) || ieee80211_is_ctl(fc)) {
936 firstseg = true;
937 lastseg = true;
938 }
939 if (firstseg) {
940 if (rtlhal->earlymode_enable) {
941 SET_TX_DESC_PKT_OFFSET(pdesc, 1);
942 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN +
943 EM_HDR_LEN);
944 if (ptcb_desc->empkt_num) {
945 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
946 "Insert 8 byte.pTcb->EMPktNum:%d\n",
947 ptcb_desc->empkt_num);
948 _rtl8821ae_insert_emcontent(ptcb_desc,
949 (u8 *)(skb->data));
950 }
951 } else {
952 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
953 }
954
955 /* ptcb_desc->use_driver_rate = true; */
956 SET_TX_DESC_TX_RATE(pdesc, ptcb_desc->hw_rate);
957 if (ptcb_desc->hw_rate > DESC_RATEMCS0)
958 short_gi = (ptcb_desc->use_shortgi) ? 1 : 0;
959 else
960 short_gi = (ptcb_desc->use_shortpreamble) ? 1 : 0;
961
962 SET_TX_DESC_DATA_SHORTGI(pdesc, short_gi);
963
964 if (info->flags & IEEE80211_TX_CTL_AMPDU) {
965 SET_TX_DESC_AGG_ENABLE(pdesc, 1);
966 SET_TX_DESC_MAX_AGG_NUM(pdesc, 0x1f);
967 }
968 SET_TX_DESC_SEQ(pdesc, seq_number);
969 SET_TX_DESC_RTS_ENABLE(pdesc, ((ptcb_desc->rts_enable &&
970 !ptcb_desc->cts_enable) ? 1 : 0));
971 SET_TX_DESC_HW_RTS_ENABLE(pdesc, 0);
972 SET_TX_DESC_CTS2SELF(pdesc, ((ptcb_desc->cts_enable) ? 1 : 0));
973
974 SET_TX_DESC_RTS_RATE(pdesc, ptcb_desc->rts_rate);
975 SET_TX_DESC_RTS_SC(pdesc, ptcb_desc->rts_sc);
976 SET_TX_DESC_RTS_SHORT(pdesc,
977 ((ptcb_desc->rts_rate <= DESC_RATE54M) ?
978 (ptcb_desc->rts_use_shortpreamble ? 1 : 0) :
979 (ptcb_desc->rts_use_shortgi ? 1 : 0)));
980
981 if (ptcb_desc->tx_enable_sw_calc_duration)
982 SET_TX_DESC_NAV_USE_HDR(pdesc, 1);
983
984 SET_TX_DESC_DATA_BW(pdesc,
985 rtl8821ae_bw_mapping(hw, ptcb_desc));
986
987 SET_TX_DESC_TX_SUB_CARRIER(pdesc,
988 rtl8821ae_sc_mapping(hw, ptcb_desc));
989
990 SET_TX_DESC_LINIP(pdesc, 0);
991 SET_TX_DESC_PKT_SIZE(pdesc, (u16)skb_len);
992 if (sta) {
993 u8 ampdu_density = sta->ht_cap.ampdu_density;
994
995 SET_TX_DESC_AMPDU_DENSITY(pdesc, ampdu_density);
996 }
997 if (info->control.hw_key) {
998 struct ieee80211_key_conf *keyconf =
999 info->control.hw_key;
1000 switch (keyconf->cipher) {
1001 case WLAN_CIPHER_SUITE_WEP40:
1002 case WLAN_CIPHER_SUITE_WEP104:
1003 case WLAN_CIPHER_SUITE_TKIP:
1004 SET_TX_DESC_SEC_TYPE(pdesc, 0x1);
1005 break;
1006 case WLAN_CIPHER_SUITE_CCMP:
1007 SET_TX_DESC_SEC_TYPE(pdesc, 0x3);
1008 break;
1009 default:
1010 SET_TX_DESC_SEC_TYPE(pdesc, 0x0);
1011 break;
1012 }
1013 }
1014
1015 SET_TX_DESC_QUEUE_SEL(pdesc, fw_qsel);
1016 SET_TX_DESC_DATA_RATE_FB_LIMIT(pdesc, 0x1F);
1017 SET_TX_DESC_RTS_RATE_FB_LIMIT(pdesc, 0xF);
1018 SET_TX_DESC_DISABLE_FB(pdesc, ptcb_desc->disable_ratefallback ?
1019 1 : 0);
1020 SET_TX_DESC_USE_RATE(pdesc, ptcb_desc->use_driver_rate ? 1 : 0);
1021
1022 if (ieee80211_is_data_qos(fc)) {
1023 if (mac->rdg_en) {
1024 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
1025 "Enable RDG function.\n");
1026 SET_TX_DESC_RDG_ENABLE(pdesc, 1);
1027 SET_TX_DESC_HTC(pdesc, 1);
1028 }
1029 }
1030 }
1031
1032 SET_TX_DESC_FIRST_SEG(pdesc, (firstseg ? 1 : 0));
1033 SET_TX_DESC_LAST_SEG(pdesc, (lastseg ? 1 : 0));
1034 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)buf_len);
1035 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
1036 /* if (rtlpriv->dm.useramask) { */
1037 if (1) {
1038 SET_TX_DESC_RATE_ID(pdesc, ptcb_desc->ratr_index);
1039 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
1040 } else {
1041 SET_TX_DESC_RATE_ID(pdesc, 0xC + ptcb_desc->ratr_index);
1042 SET_TX_DESC_MACID(pdesc, ptcb_desc->mac_id);
1043 }
1044 if (!ieee80211_is_data_qos(fc)) {
1045 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
1046 SET_TX_DESC_HWSEQ_SEL(pdesc, 0);
1047 }
1048 SET_TX_DESC_MORE_FRAG(pdesc, (lastseg ? 0 : 1));
1049 if (is_multicast_ether_addr(ieee80211_get_DA(hdr)) ||
1050 is_broadcast_ether_addr(ieee80211_get_DA(hdr))) {
1051 SET_TX_DESC_BMC(pdesc, 1);
1052 }
1053
1054 rtl8821ae_dm_set_tx_ant_by_tx_info(hw, pdesc, ptcb_desc->mac_id);
1055 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, "\n");
1056}
1057
1058void rtl8821ae_tx_fill_cmddesc(struct ieee80211_hw *hw,
1059 u8 *pdesc, bool firstseg,
1060 bool lastseg, struct sk_buff *skb)
1061{
1062 struct rtl_priv *rtlpriv = rtl_priv(hw);
1063 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1064 u8 fw_queue = QSLT_BEACON;
1065
1066 dma_addr_t mapping = pci_map_single(rtlpci->pdev,
1067 skb->data, skb->len,
1068 PCI_DMA_TODEVICE);
1069
1070 if (pci_dma_mapping_error(rtlpci->pdev, mapping)) {
1071 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
1072 "DMA mapping error");
1073 return;
1074 }
1075 CLEAR_PCI_TX_DESC_CONTENT(pdesc, TX_DESC_SIZE);
1076
1077 SET_TX_DESC_FIRST_SEG(pdesc, 1);
1078 SET_TX_DESC_LAST_SEG(pdesc, 1);
1079
1080 SET_TX_DESC_PKT_SIZE((u8 *)pdesc, (u16)(skb->len));
1081
1082 SET_TX_DESC_OFFSET(pdesc, USB_HWDESC_HEADER_LEN);
1083
1084 SET_TX_DESC_USE_RATE(pdesc, 1);
1085 SET_TX_DESC_TX_RATE(pdesc, DESC_RATE1M);
1086 SET_TX_DESC_DISABLE_FB(pdesc, 1);
1087
1088 SET_TX_DESC_DATA_BW(pdesc, 0);
1089
1090 SET_TX_DESC_HWSEQ_EN(pdesc, 1);
1091
1092 SET_TX_DESC_QUEUE_SEL(pdesc, fw_queue);
1093
1094 SET_TX_DESC_TX_BUFFER_SIZE(pdesc, (u16)(skb->len));
1095
1096 SET_TX_DESC_TX_BUFFER_ADDRESS(pdesc, mapping);
1097
1098 SET_TX_DESC_MACID(pdesc, 0);
1099
1100 SET_TX_DESC_OWN(pdesc, 1);
1101
1102 RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
1103 "H2C Tx Cmd Content\n",
1104 pdesc, TX_DESC_SIZE);
1105}
1106
1107void rtl8821ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
1108 bool istx, u8 desc_name, u8 *val)
1109{
1110 if (istx) {
1111 switch (desc_name) {
1112 case HW_DESC_OWN:
1113 SET_TX_DESC_OWN(pdesc, 1);
1114 break;
1115 case HW_DESC_TX_NEXTDESC_ADDR:
1116 SET_TX_DESC_NEXT_DESC_ADDRESS(pdesc, *(u32 *)val);
1117 break;
1118 default:
1119 RT_ASSERT(false,
1120 "ERR txdesc :%d not process\n", desc_name);
1121 break;
1122 }
1123 } else {
1124 switch (desc_name) {
1125 case HW_DESC_RXOWN:
1126 SET_RX_DESC_OWN(pdesc, 1);
1127 break;
1128 case HW_DESC_RXBUFF_ADDR:
1129 SET_RX_DESC_BUFF_ADDR(pdesc, *(u32 *)val);
1130 break;
1131 case HW_DESC_RXPKT_LEN:
1132 SET_RX_DESC_PKT_LEN(pdesc, *(u32 *)val);
1133 break;
1134 case HW_DESC_RXERO:
1135 SET_RX_DESC_EOR(pdesc, 1);
1136 break;
1137 default:
1138 RT_ASSERT(false,
1139 "ERR rxdesc :%d not process\n", desc_name);
1140 break;
1141 }
1142 }
1143}
1144
1145u32 rtl8821ae_get_desc(u8 *pdesc, bool istx, u8 desc_name)
1146{
1147 u32 ret = 0;
1148
1149 if (istx) {
1150 switch (desc_name) {
1151 case HW_DESC_OWN:
1152 ret = GET_TX_DESC_OWN(pdesc);
1153 break;
1154 case HW_DESC_TXBUFF_ADDR:
1155 ret = GET_TX_DESC_TX_BUFFER_ADDRESS(pdesc);
1156 break;
1157 default:
1158 RT_ASSERT(false,
1159 "ERR txdesc :%d not process\n", desc_name);
1160 break;
1161 }
1162 } else {
1163 switch (desc_name) {
1164 case HW_DESC_OWN:
1165 ret = GET_RX_DESC_OWN(pdesc);
1166 break;
1167 case HW_DESC_RXPKT_LEN:
1168 ret = GET_RX_DESC_PKT_LEN(pdesc);
1169 break;
1170 case HW_DESC_RXBUFF_ADDR:
1171 ret = GET_RX_DESC_BUFF_ADDR(pdesc);
1172 break;
1173 default:
1174 RT_ASSERT(false,
1175 "ERR rxdesc :%d not process\n", desc_name);
1176 break;
1177 }
1178 }
1179 return ret;
1180}
1181
1182bool rtl8821ae_is_tx_desc_closed(struct ieee80211_hw *hw,
1183 u8 hw_queue, u16 index)
1184{
1185 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
1186 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[hw_queue];
1187 u8 *entry = (u8 *)(&ring->desc[ring->idx]);
1188 u8 own = (u8)rtl8821ae_get_desc(entry, true, HW_DESC_OWN);
1189
1190 /**
1191 *beacon packet will only use the first
1192 *descriptor defautly,and the own may not
1193 *be cleared by the hardware
1194 */
1195 if (own)
1196 return false;
1197 return true;
1198}
1199
1200void rtl8821ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue)
1201{
1202 struct rtl_priv *rtlpriv = rtl_priv(hw);
1203
1204 if (hw_queue == BEACON_QUEUE) {
1205 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG, BIT(4));
1206 } else {
1207 rtl_write_word(rtlpriv, REG_PCIE_CTRL_REG,
1208 BIT(0) << (hw_queue));
1209 }
1210}
1211
1212u32 rtl8821ae_rx_command_packet(struct ieee80211_hw *hw,
1213 struct rtl_stats status,
1214 struct sk_buff *skb)
1215{
1216 u32 result = 0;
1217 struct rtl_priv *rtlpriv = rtl_priv(hw);
1218
1219 switch (status.packet_report_type) {
1220 case NORMAL_RX:
1221 result = 0;
1222 break;
1223 case C2H_PACKET:
1224 rtl8821ae_c2h_packet_handler(hw, skb->data, (u8)skb->len);
1225 result = 1;
1226 RT_TRACE(rtlpriv, COMP_RECV, DBG_LOUD,
1227 "skb->len=%d\n\n", skb->len);
1228 break;
1229 default:
1230 RT_TRACE(rtlpriv, COMP_RECV, DBG_LOUD,
1231 "No this packet type!!\n");
1232 break;
1233 }
1234
1235 return result;
1236}
diff --git a/drivers/net/wireless/rtlwifi/rtl8821ae/trx.h b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.h
new file mode 100644
index 000000000000..31409042d8dd
--- /dev/null
+++ b/drivers/net/wireless/rtlwifi/rtl8821ae/trx.h
@@ -0,0 +1,620 @@
1/******************************************************************************
2 *
3 * Copyright(c) 2009-2010 Realtek Corporation.
4 *
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
16 *
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
21 *
22 * Larry Finger <Larry.Finger@lwfinger.net>
23 *
24 *****************************************************************************/
25
26#ifndef __RTL8821AE_TRX_H__
27#define __RTL8821AE_TRX_H__
28
29#define TX_DESC_SIZE 40
30#define TX_DESC_AGGR_SUBFRAME_SIZE 32
31
32#define RX_DESC_SIZE 32
33#define RX_DRV_INFO_SIZE_UNIT 8
34
35#define TX_DESC_NEXT_DESC_OFFSET 40
36#define USB_HWDESC_HEADER_LEN 40
37#define CRCLENGTH 4
38
39#define SET_TX_DESC_PKT_SIZE(__pdesc, __val) \
40 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 16, __val)
41#define SET_TX_DESC_OFFSET(__pdesc, __val) \
42 SET_BITS_TO_LE_4BYTE(__pdesc, 16, 8, __val)
43#define SET_TX_DESC_BMC(__pdesc, __val) \
44 SET_BITS_TO_LE_4BYTE(__pdesc, 24, 1, __val)
45#define SET_TX_DESC_HTC(__pdesc, __val) \
46 SET_BITS_TO_LE_4BYTE(__pdesc, 25, 1, __val)
47#define SET_TX_DESC_LAST_SEG(__pdesc, __val) \
48 SET_BITS_TO_LE_4BYTE(__pdesc, 26, 1, __val)
49#define SET_TX_DESC_FIRST_SEG(__pdesc, __val) \
50 SET_BITS_TO_LE_4BYTE(__pdesc, 27, 1, __val)
51#define SET_TX_DESC_LINIP(__pdesc, __val) \
52 SET_BITS_TO_LE_4BYTE(__pdesc, 28, 1, __val)
53#define SET_TX_DESC_NO_ACM(__pdesc, __val) \
54 SET_BITS_TO_LE_4BYTE(__pdesc, 29, 1, __val)
55#define SET_TX_DESC_GF(__pdesc, __val) \
56 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
57#define SET_TX_DESC_OWN(__pdesc, __val) \
58 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
59
60#define GET_TX_DESC_PKT_SIZE(__pdesc) \
61 LE_BITS_TO_4BYTE(__pdesc, 0, 16)
62#define GET_TX_DESC_OFFSET(__pdesc) \
63 LE_BITS_TO_4BYTE(__pdesc, 16, 8)
64#define GET_TX_DESC_BMC(__pdesc) \
65 LE_BITS_TO_4BYTE(__pdesc, 24, 1)
66#define GET_TX_DESC_HTC(__pdesc) \
67 LE_BITS_TO_4BYTE(__pdesc, 25, 1)
68#define GET_TX_DESC_LAST_SEG(__pdesc) \
69 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
70#define GET_TX_DESC_FIRST_SEG(__pdesc) \
71 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
72#define GET_TX_DESC_LINIP(__pdesc) \
73 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
74#define GET_TX_DESC_NO_ACM(__pdesc) \
75 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
76#define GET_TX_DESC_GF(__pdesc) \
77 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
78#define GET_TX_DESC_OWN(__pdesc) \
79 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
80
81#define SET_TX_DESC_MACID(__pdesc, __val) \
82 SET_BITS_TO_LE_4BYTE(__pdesc+4, 0, 7, __val)
83#define SET_TX_DESC_QUEUE_SEL(__pdesc, __val) \
84 SET_BITS_TO_LE_4BYTE(__pdesc+4, 8, 5, __val)
85#define SET_TX_DESC_RDG_NAV_EXT(__pdesc, __val) \
86 SET_BITS_TO_LE_4BYTE(__pdesc+4, 13, 1, __val)
87#define SET_TX_DESC_LSIG_TXOP_EN(__pdesc, __val) \
88 SET_BITS_TO_LE_4BYTE(__pdesc+4, 14, 1, __val)
89#define SET_TX_DESC_PIFS(__pdesc, __val) \
90 SET_BITS_TO_LE_4BYTE(__pdesc+4, 15, 1, __val)
91#define SET_TX_DESC_RATE_ID(__pdesc, __val) \
92 SET_BITS_TO_LE_4BYTE(__pdesc+4, 16, 5, __val)
93#define SET_TX_DESC_EN_DESC_ID(__pdesc, __val) \
94 SET_BITS_TO_LE_4BYTE(__pdesc+4, 21, 1, __val)
95#define SET_TX_DESC_SEC_TYPE(__pdesc, __val) \
96 SET_BITS_TO_LE_4BYTE(__pdesc+4, 22, 2, __val)
97#define SET_TX_DESC_PKT_OFFSET(__pdesc, __val) \
98 SET_BITS_TO_LE_4BYTE(__pdesc+4, 24, 5, __val)
99
100#define SET_TX_DESC_PAID(__pdesc, __val) \
101 SET_BITS_TO_LE_4BYTE(__pdesc+8, 0, 9, __val)
102#define SET_TX_DESC_CCA_RTS(__pdesc, __val) \
103 SET_BITS_TO_LE_4BYTE(__pdesc+8, 10, 2, __val)
104#define SET_TX_DESC_AGG_ENABLE(__pdesc, __val) \
105 SET_BITS_TO_LE_4BYTE(__pdesc+8, 12, 1, __val)
106#define SET_TX_DESC_RDG_ENABLE(__pdesc, __val) \
107 SET_BITS_TO_LE_4BYTE(__pdesc+8, 13, 1, __val)
108#define SET_TX_DESC_BAR_RTY_TH(__pdesc, __val) \
109 SET_BITS_TO_LE_4BYTE(__pdesc+8, 14, 2, __val)
110#define SET_TX_DESC_AGG_BREAK(__pdesc, __val) \
111 SET_BITS_TO_LE_4BYTE(__pdesc+8, 16, 1, __val)
112#define SET_TX_DESC_MORE_FRAG(__pdesc, __val) \
113 SET_BITS_TO_LE_4BYTE(__pdesc+8, 17, 1, __val)
114#define SET_TX_DESC_RAW(__pdesc, __val) \
115 SET_BITS_TO_LE_4BYTE(__pdesc+8, 18, 1, __val)
116#define SET_TX_DESC_SPE_RPT(__pdesc, __val) \
117 SET_BITS_TO_LE_4BYTE(__pdesc+8, 19, 1, __val)
118#define SET_TX_DESC_AMPDU_DENSITY(__pdesc, __val) \
119 SET_BITS_TO_LE_4BYTE(__pdesc+8, 20, 3, __val)
120#define SET_TX_DESC_BT_INT(__pdesc, __val) \
121 SET_BITS_TO_LE_4BYTE(__pdesc+8, 23, 1, __val)
122#define SET_TX_DESC_GID(__pdesc, __val) \
123 SET_BITS_TO_LE_4BYTE(__pdesc+8, 24, 6, __val)
124
125#define SET_TX_DESC_WHEADER_LEN(__pdesc, __val) \
126 SET_BITS_TO_LE_4BYTE(__pdesc+12, 0, 4, __val)
127#define SET_TX_DESC_CHK_EN(__pdesc, __val) \
128 SET_BITS_TO_LE_4BYTE(__pdesc+12, 4, 1, __val)
129#define SET_TX_DESC_EARLY_MODE(__pdesc, __val) \
130 SET_BITS_TO_LE_4BYTE(__pdesc+12, 5, 1, __val)
131#define SET_TX_DESC_HWSEQ_SEL(__pdesc, __val) \
132 SET_BITS_TO_LE_4BYTE(__pdesc+12, 6, 2, __val)
133#define SET_TX_DESC_USE_RATE(__pdesc, __val) \
134 SET_BITS_TO_LE_4BYTE(__pdesc+12, 8, 1, __val)
135#define SET_TX_DESC_DISABLE_RTS_FB(__pdesc, __val) \
136 SET_BITS_TO_LE_4BYTE(__pdesc+12, 9, 1, __val)
137#define SET_TX_DESC_DISABLE_FB(__pdesc, __val) \
138 SET_BITS_TO_LE_4BYTE(__pdesc+12, 10, 1, __val)
139#define SET_TX_DESC_CTS2SELF(__pdesc, __val) \
140 SET_BITS_TO_LE_4BYTE(__pdesc+12, 11, 1, __val)
141#define SET_TX_DESC_RTS_ENABLE(__pdesc, __val) \
142 SET_BITS_TO_LE_4BYTE(__pdesc+12, 12, 1, __val)
143#define SET_TX_DESC_HW_RTS_ENABLE(__pdesc, __val) \
144 SET_BITS_TO_LE_4BYTE(__pdesc+12, 13, 1, __val)
145#define SET_TX_DESC_NAV_USE_HDR(__pdesc, __val) \
146 SET_BITS_TO_LE_4BYTE(__pdesc+12, 15, 1, __val)
147#define SET_TX_DESC_USE_MAX_LEN(__pdesc, __val) \
148 SET_BITS_TO_LE_4BYTE(__pdesc+12, 16, 1, __val)
149#define SET_TX_DESC_MAX_AGG_NUM(__pdesc, __val) \
150 SET_BITS_TO_LE_4BYTE(__pdesc+12, 17, 5, __val)
151#define SET_TX_DESC_NDPA(__pdesc, __val) \
152 SET_BITS_TO_LE_4BYTE(__pdesc+12, 22, 2, __val)
153#define SET_TX_DESC_AMPDU_MAX_TIME(__pdesc, __val) \
154 SET_BITS_TO_LE_4BYTE(__pdesc+12, 24, 8, __val)
155#define SET_TX_DESC_TX_ANT(__pdesc, __val) \
156 SET_BITS_TO_LE_4BYTE(__pdesc+20, 24, 4, __val)
157
158#define SET_TX_DESC_TX_RATE(__pdesc, __val) \
159 SET_BITS_TO_LE_4BYTE(__pdesc+16, 0, 7, __val)
160#define SET_TX_DESC_DATA_RATE_FB_LIMIT(__pdesc, __val) \
161 SET_BITS_TO_LE_4BYTE(__pdesc+16, 8, 5, __val)
162#define SET_TX_DESC_RTS_RATE_FB_LIMIT(__pdesc, __val) \
163 SET_BITS_TO_LE_4BYTE(__pdesc+16, 13, 4, __val)
164#define SET_TX_DESC_RETRY_LIMIT_ENABLE(__pdesc, __val) \
165 SET_BITS_TO_LE_4BYTE(__pdesc+16, 17, 1, __val)
166#define SET_TX_DESC_DATA_RETRY_LIMIT(__pdesc, __val) \
167 SET_BITS_TO_LE_4BYTE(__pdesc+16, 18, 6, __val)
168#define SET_TX_DESC_RTS_RATE(__pdesc, __val) \
169 SET_BITS_TO_LE_4BYTE(__pdesc+16, 24, 5, __val)
170
171#define SET_TX_DESC_TX_SUB_CARRIER(__pdesc, __val) \
172 SET_BITS_TO_LE_4BYTE(__pdesc+20, 0, 4, __val)
173#define SET_TX_DESC_DATA_SHORTGI(__pdesc, __val) \
174 SET_BITS_TO_LE_1BYTE(__pdesc+20, 4, 1, __val)
175#define SET_TX_DESC_DATA_BW(__pdesc, __val) \
176 SET_BITS_TO_LE_4BYTE(__pdesc+20, 5, 2, __val)
177#define SET_TX_DESC_DATA_LDPC(__pdesc, __val) \
178 SET_BITS_TO_LE_4BYTE(__pdesc+20, 7, 1, __val)
179#define SET_TX_DESC_DATA_STBC(__pdesc, __val) \
180 SET_BITS_TO_LE_4BYTE(__pdesc+20, 8, 2, __val)
181#define SET_TX_DESC_CTROL_STBC(__pdesc, __val) \
182 SET_BITS_TO_LE_4BYTE(__pdesc+20, 10, 2, __val)
183#define SET_TX_DESC_RTS_SHORT(__pdesc, __val) \
184 SET_BITS_TO_LE_4BYTE(__pdesc+20, 12, 1, __val)
185#define SET_TX_DESC_RTS_SC(__pdesc, __val) \
186 SET_BITS_TO_LE_4BYTE(__pdesc+20, 13, 4, __val)
187
188#define SET_TX_DESC_TX_BUFFER_SIZE(__pdesc, __val) \
189 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 16, __val)
190
191#define GET_TX_DESC_TX_BUFFER_SIZE(__pdesc) \
192 LE_BITS_TO_4BYTE(__pdesc+28, 0, 16)
193
194#define SET_TX_DESC_HWSEQ_EN(__pdesc, __val) \
195 SET_BITS_TO_LE_4BYTE(__pdesc+32, 15, 1, __val)
196
197#define SET_TX_DESC_SEQ(__pdesc, __val) \
198 SET_BITS_TO_LE_4BYTE(__pdesc+36, 12, 12, __val)
199
200#define SET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc, __val) \
201 SET_BITS_TO_LE_4BYTE(__pdesc+40, 0, 32, __val)
202
203#define GET_TX_DESC_TX_BUFFER_ADDRESS(__pdesc) \
204 LE_BITS_TO_4BYTE(__pdesc+40, 0, 32)
205
206#define SET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc, __val) \
207 SET_BITS_TO_LE_4BYTE(__pdesc+48, 0, 32, __val)
208
209#define GET_TX_DESC_NEXT_DESC_ADDRESS(__pdesc) \
210 LE_BITS_TO_4BYTE(__pdesc+48, 0, 32)
211
212#define GET_RX_DESC_PKT_LEN(__pdesc) \
213 LE_BITS_TO_4BYTE(__pdesc, 0, 14)
214#define GET_RX_DESC_CRC32(__pdesc) \
215 LE_BITS_TO_4BYTE(__pdesc, 14, 1)
216#define GET_RX_DESC_ICV(__pdesc) \
217 LE_BITS_TO_4BYTE(__pdesc, 15, 1)
218#define GET_RX_DESC_DRV_INFO_SIZE(__pdesc) \
219 LE_BITS_TO_4BYTE(__pdesc, 16, 4)
220#define GET_RX_DESC_SECURITY(__pdesc) \
221 LE_BITS_TO_4BYTE(__pdesc, 20, 3)
222#define GET_RX_DESC_QOS(__pdesc) \
223 LE_BITS_TO_4BYTE(__pdesc, 23, 1)
224#define GET_RX_DESC_SHIFT(__pdesc) \
225 LE_BITS_TO_4BYTE(__pdesc, 24, 2)
226#define GET_RX_DESC_PHYST(__pdesc) \
227 LE_BITS_TO_4BYTE(__pdesc, 26, 1)
228#define GET_RX_DESC_SWDEC(__pdesc) \
229 LE_BITS_TO_4BYTE(__pdesc, 27, 1)
230#define GET_RX_DESC_LS(__pdesc) \
231 LE_BITS_TO_4BYTE(__pdesc, 28, 1)
232#define GET_RX_DESC_FS(__pdesc) \
233 LE_BITS_TO_4BYTE(__pdesc, 29, 1)
234#define GET_RX_DESC_EOR(__pdesc) \
235 LE_BITS_TO_4BYTE(__pdesc, 30, 1)
236#define GET_RX_DESC_OWN(__pdesc) \
237 LE_BITS_TO_4BYTE(__pdesc, 31, 1)
238
239#define SET_RX_DESC_PKT_LEN(__pdesc, __val) \
240 SET_BITS_TO_LE_4BYTE(__pdesc, 0, 14, __val)
241#define SET_RX_DESC_EOR(__pdesc, __val) \
242 SET_BITS_TO_LE_4BYTE(__pdesc, 30, 1, __val)
243#define SET_RX_DESC_OWN(__pdesc, __val) \
244 SET_BITS_TO_LE_4BYTE(__pdesc, 31, 1, __val)
245
246#define GET_RX_DESC_MACID(__pdesc) \
247 LE_BITS_TO_4BYTE(__pdesc+4, 0, 7)
248#define GET_RX_DESC_TID(__pdesc) \
249 LE_BITS_TO_4BYTE(__pdesc+4, 8, 4)
250#define GET_RX_DESC_AMSDU(__pdesc) \
251 LE_BITS_TO_4BYTE(__pdesc+4, 13, 1)
252#define GET_RX_STATUS_DESC_RXID_MATCH(__pdesc) \
253 LE_BITS_TO_4BYTE(__pdesc+4, 14, 1)
254#define GET_RX_DESC_PAGGR(__pdesc) \
255 LE_BITS_TO_4BYTE(__pdesc+4, 15, 1)
256#define GET_RX_DESC_A1_FIT(__pdesc) \
257 LE_BITS_TO_4BYTE(__pdesc+4, 16, 4)
258#define GET_RX_DESC_CHKERR(__pdesc) \
259 LE_BITS_TO_4BYTE(__pdesc+4, 20, 1)
260#define GET_RX_DESC_IPVER(__pdesc) \
261 LE_BITS_TO_4BYTE(__pdesc+4, 21, 1)
262#define GET_RX_STATUS_DESC_IS_TCPUDP(__pdesc) \
263 LE_BITS_TO_4BYTE(__pdesc+4, 22, 1)
264#define GET_RX_STATUS_DESC_CHK_VLD(__pdesc) \
265 LE_BITS_TO_4BYTE(__pdesc+4, 23, 1)
266#define GET_RX_DESC_PAM(__pdesc) \
267 LE_BITS_TO_4BYTE(__pdesc+4, 24, 1)
268#define GET_RX_DESC_PWR(__pdesc) \
269 LE_BITS_TO_4BYTE(__pdesc+4, 25, 1)
270#define GET_RX_DESC_MD(__pdesc) \
271 LE_BITS_TO_4BYTE(__pdesc+4, 26, 1)
272#define GET_RX_DESC_MF(__pdesc) \
273 LE_BITS_TO_4BYTE(__pdesc+4, 27, 1)
274#define GET_RX_DESC_TYPE(__pdesc) \
275 LE_BITS_TO_4BYTE(__pdesc+4, 28, 2)
276#define GET_RX_DESC_MC(__pdesc) \
277 LE_BITS_TO_4BYTE(__pdesc+4, 30, 1)
278#define GET_RX_DESC_BC(__pdesc) \
279 LE_BITS_TO_4BYTE(__pdesc+4, 31, 1)
280
281#define GET_RX_DESC_SEQ(__pdesc) \
282 LE_BITS_TO_4BYTE(__pdesc+8, 0, 12)
283#define GET_RX_DESC_FRAG(__pdesc) \
284 LE_BITS_TO_4BYTE(__pdesc+8, 12, 4)
285#define GET_RX_STATUS_DESC_RX_IS_QOS(__pdesc) \
286 LE_BITS_TO_4BYTE(__pdesc+8, 16, 1)
287#define GET_RX_STATUS_DESC_WLANHD_IV_LEN(__pdesc) \
288 LE_BITS_TO_4BYTE(__pdesc+8, 18, 6)
289#define GET_RX_STATUS_DESC_RPT_SEL(__pdesc) \
290 LE_BITS_TO_4BYTE(__pdesc+8, 28, 1)
291
292#define GET_RX_DESC_RXMCS(__pdesc) \
293 LE_BITS_TO_4BYTE(__pdesc+12, 0, 7)
294#define GET_RX_DESC_HTC(__pdesc) \
295 LE_BITS_TO_4BYTE(__pdesc+12, 10, 1)
296#define GET_RX_STATUS_DESC_EOSP(__pdesc) \
297 LE_BITS_TO_4BYTE(__pdesc+12, 11, 1)
298#define GET_RX_STATUS_DESC_BSSID_FIT(__pdesc) \
299 LE_BITS_TO_4BYTE(__pdesc+12, 12, 2)
300
301#define GET_RX_STATUS_DESC_PATTERN_MATCH(__pdesc) \
302 LE_BITS_TO_4BYTE(__pdesc+12, 29, 1)
303#define GET_RX_STATUS_DESC_UNICAST_MATCH(__pdesc) \
304 LE_BITS_TO_4BYTE(__pdesc+12, 30, 1)
305#define GET_RX_STATUS_DESC_MAGIC_MATCH(__pdesc) \
306 LE_BITS_TO_4BYTE(__pdesc+12, 31, 1)
307
308#define GET_RX_DESC_SPLCP(__pdesc) \
309 LE_BITS_TO_4BYTE(__pdesc+16, 0, 1)
310#define GET_RX_STATUS_DESC_LDPC(__pdesc) \
311 LE_BITS_TO_4BYTE(__pdesc+16, 1, 1)
312#define GET_RX_STATUS_DESC_STBC(__pdesc) \
313 LE_BITS_TO_4BYTE(__pdesc+16, 2, 1)
314#define GET_RX_DESC_BW(__pdesc) \
315 LE_BITS_TO_4BYTE(__pdesc+16, 4, 2)
316
317#define GET_RX_DESC_TSFL(__pdesc) \
318 LE_BITS_TO_4BYTE(__pdesc+20, 0, 32)
319
320#define GET_RX_DESC_BUFF_ADDR(__pdesc) \
321 LE_BITS_TO_4BYTE(__pdesc+24, 0, 32)
322#define GET_RX_DESC_BUFF_ADDR64(__pdesc) \
323 LE_BITS_TO_4BYTE(__pdesc+28, 0, 32)
324
325#define SET_RX_DESC_BUFF_ADDR(__pdesc, __val) \
326 SET_BITS_TO_LE_4BYTE(__pdesc+24, 0, 32, __val)
327#define SET_RX_DESC_BUFF_ADDR64(__pdesc, __val) \
328 SET_BITS_TO_LE_4BYTE(__pdesc+28, 0, 32, __val)
329
330/* TX report 2 format in Rx desc*/
331
332#define GET_RX_RPT2_DESC_PKT_LEN(__status) \
333 LE_BITS_TO_4BYTE(__status, 0, 9)
334#define GET_RX_RPT2_DESC_MACID_VALID_1(__status) \
335 LE_BITS_TO_4BYTE(__status+16, 0, 32)
336#define GET_RX_RPT2_DESC_MACID_VALID_2(__status) \
337 LE_BITS_TO_4BYTE(__status+20, 0, 32)
338
339#define SET_EARLYMODE_PKTNUM(__paddr, __value) \
340 SET_BITS_TO_LE_4BYTE(__paddr, 0, 4, __value)
341#define SET_EARLYMODE_LEN0(__paddr, __value) \
342 SET_BITS_TO_LE_4BYTE(__paddr, 4, 12, __value)
343#define SET_EARLYMODE_LEN1(__paddr, __value) \
344 SET_BITS_TO_LE_4BYTE(__paddr, 16, 12, __value)
345#define SET_EARLYMODE_LEN2_1(__paddr, __value) \
346 SET_BITS_TO_LE_4BYTE(__paddr, 28, 4, __value)
347#define SET_EARLYMODE_LEN2_2(__paddr, __value) \
348 SET_BITS_TO_LE_4BYTE(__paddr+4, 0, 8, __value)
349#define SET_EARLYMODE_LEN3(__paddr, __value) \
350 SET_BITS_TO_LE_4BYTE(__paddr+4, 8, 12, __value)
351#define SET_EARLYMODE_LEN4(__paddr, __value) \
352 SET_BITS_TO_LE_4BYTE(__paddr+4, 20, 12, __value)
353
354#define CLEAR_PCI_TX_DESC_CONTENT(__pdesc, _size) \
355do { \
356 if (_size > TX_DESC_NEXT_DESC_OFFSET) \
357 memset(__pdesc, 0, TX_DESC_NEXT_DESC_OFFSET); \
358 else \
359 memset(__pdesc, 0, _size); \
360} while (0)
361
362#define RTL8821AE_RX_HAL_IS_CCK_RATE(rxmcs)\
363 (rxmcs == DESC_RATE1M ||\
364 rxmcs == DESC_RATE2M ||\
365 rxmcs == DESC_RATE5_5M ||\
366 rxmcs == DESC_RATE11M)
367
368struct phy_rx_agc_info_t {
369 #ifdef __LITTLE_ENDIAN
370 u8 gain:7, trsw:1;
371 #else
372 u8 trsw:1, gain:7;
373 #endif
374};
375
376struct phy_status_rpt {
377 /* DWORD 0 */
378 u8 gain_trsw[2];
379#ifdef __LITTLE_ENDIAN
380 u16 chl_num:10;
381 u16 sub_chnl:4;
382 u16 r_rfmod:2;
383#else /* _BIG_ENDIAN_ */
384 u16 r_rfmod:2;
385 u16 sub_chnl:4;
386 u16 chl_num:10;
387#endif
388 /* DWORD 1 */
389 u8 pwdb_all;
390 u8 cfosho[4]; /* DW 1 byte 1 DW 2 byte 0 */
391
392 /* DWORD 2 */
393 char cfotail[4]; /* DW 2 byte 1 DW 3 byte 0 */
394
395 /* DWORD 3 */
396 char rxevm[2]; /* DW 3 byte 1 DW 3 byte 2 */
397 char rxsnr[2]; /* DW 3 byte 3 DW 4 byte 0 */
398
399 /* DWORD 4 */
400 u8 pcts_msk_rpt[2];
401 u8 pdsnr[2]; /* DW 4 byte 3 DW 5 Byte 0 */
402
403 /* DWORD 5 */
404 u8 csi_current[2];
405 u8 rx_gain_c;
406
407 /* DWORD 6 */
408 u8 rx_gain_d;
409 u8 sigevm;
410 u8 resvd_0;
411 u8 antidx_anta:3;
412 u8 antidx_antb:3;
413 u8 resvd_1:2;
414} __packed;
415
416struct rx_fwinfo_8821ae {
417 u8 gain_trsw[4];
418 u8 pwdb_all;
419 u8 cfosho[4];
420 u8 cfotail[4];
421 char rxevm[2];
422 char rxsnr[4];
423 u8 pdsnr[2];
424 u8 csi_current[2];
425 u8 csi_target[2];
426 u8 sigevm;
427 u8 max_ex_pwr;
428 u8 ex_intf_flag:1;
429 u8 sgi_en:1;
430 u8 rxsc:2;
431 u8 reserve:4;
432} __packed;
433
434struct tx_desc_8821ae {
435 u32 pktsize:16;
436 u32 offset:8;
437 u32 bmc:1;
438 u32 htc:1;
439 u32 lastseg:1;
440 u32 firstseg:1;
441 u32 linip:1;
442 u32 noacm:1;
443 u32 gf:1;
444 u32 own:1;
445
446 u32 macid:6;
447 u32 rsvd0:2;
448 u32 queuesel:5;
449 u32 rd_nav_ext:1;
450 u32 lsig_txop_en:1;
451 u32 pifs:1;
452 u32 rateid:4;
453 u32 nav_usehdr:1;
454 u32 en_descid:1;
455 u32 sectype:2;
456 u32 pktoffset:8;
457
458 u32 rts_rc:6;
459 u32 data_rc:6;
460 u32 agg_en:1;
461 u32 rdg_en:1;
462 u32 bar_retryht:2;
463 u32 agg_break:1;
464 u32 morefrag:1;
465 u32 raw:1;
466 u32 ccx:1;
467 u32 ampdudensity:3;
468 u32 bt_int:1;
469 u32 ant_sela:1;
470 u32 ant_selb:1;
471 u32 txant_cck:2;
472 u32 txant_l:2;
473 u32 txant_ht:2;
474
475 u32 nextheadpage:8;
476 u32 tailpage:8;
477 u32 seq:12;
478 u32 cpu_handle:1;
479 u32 tag1:1;
480 u32 trigger_int:1;
481 u32 hwseq_en:1;
482
483 u32 rtsrate:5;
484 u32 apdcfe:1;
485 u32 qos:1;
486 u32 hwseq_ssn:1;
487 u32 userrate:1;
488 u32 dis_rtsfb:1;
489 u32 dis_datafb:1;
490 u32 cts2self:1;
491 u32 rts_en:1;
492 u32 hwrts_en:1;
493 u32 portid:1;
494 u32 pwr_status:3;
495 u32 waitdcts:1;
496 u32 cts2ap_en:1;
497 u32 txsc:2;
498 u32 stbc:2;
499 u32 txshort:1;
500 u32 txbw:1;
501 u32 rtsshort:1;
502 u32 rtsbw:1;
503 u32 rtssc:2;
504 u32 rtsstbc:2;
505
506 u32 txrate:6;
507 u32 shortgi:1;
508 u32 ccxt:1;
509 u32 txrate_fb_lmt:5;
510 u32 rtsrate_fb_lmt:4;
511 u32 retrylmt_en:1;
512 u32 txretrylmt:6;
513 u32 usb_txaggnum:8;
514
515 u32 txagca:5;
516 u32 txagcb:5;
517 u32 usemaxlen:1;
518 u32 maxaggnum:5;
519 u32 mcsg1maxlen:4;
520 u32 mcsg2maxlen:4;
521 u32 mcsg3maxlen:4;
522 u32 mcs7sgimaxlen:4;
523
524 u32 txbuffersize:16;
525 u32 sw_offset30:8;
526 u32 sw_offset31:4;
527 u32 rsvd1:1;
528 u32 antsel_c:1;
529 u32 null_0:1;
530 u32 null_1:1;
531
532 u32 txbuffaddr;
533 u32 txbufferaddr64;
534 u32 nextdescaddress;
535 u32 nextdescaddress64;
536
537 u32 reserve_pass_pcie_mm_limit[4];
538} __packed;
539
540struct rx_desc_8821ae {
541 u32 length:14;
542 u32 crc32:1;
543 u32 icverror:1;
544 u32 drv_infosize:4;
545 u32 security:3;
546 u32 qos:1;
547 u32 shift:2;
548 u32 phystatus:1;
549 u32 swdec:1;
550 u32 lastseg:1;
551 u32 firstseg:1;
552 u32 eor:1;
553 u32 own:1;
554
555 u32 macid:6;
556 u32 tid:4;
557 u32 hwrsvd:5;
558 u32 paggr:1;
559 u32 faggr:1;
560 u32 a1_fit:4;
561 u32 a2_fit:4;
562 u32 pam:1;
563 u32 pwr:1;
564 u32 moredata:1;
565 u32 morefrag:1;
566 u32 type:2;
567 u32 mc:1;
568 u32 bc:1;
569
570 u32 seq:12;
571 u32 frag:4;
572 u32 nextpktlen:14;
573 u32 nextind:1;
574 u32 rsvd:1;
575
576 u32 rxmcs:6;
577 u32 rxht:1;
578 u32 amsdu:1;
579 u32 splcp:1;
580 u32 bandwidth:1;
581 u32 htc:1;
582 u32 tcpchk_rpt:1;
583 u32 ipcchk_rpt:1;
584 u32 tcpchk_valid:1;
585 u32 hwpcerr:1;
586 u32 hwpcind:1;
587 u32 iv0:16;
588
589 u32 iv1;
590
591 u32 tsfl;
592
593 u32 bufferaddress;
594 u32 bufferaddress64;
595
596} __packed;
597
598void rtl8821ae_tx_fill_desc(struct ieee80211_hw *hw,
599 struct ieee80211_hdr *hdr, u8 *pdesc_tx, u8 *txbd,
600 struct ieee80211_tx_info *info,
601 struct ieee80211_sta *sta,
602 struct sk_buff *skb,
603 u8 hw_queue, struct rtl_tcb_desc *ptcb_desc);
604bool rtl8821ae_rx_query_desc(struct ieee80211_hw *hw,
605 struct rtl_stats *status,
606 struct ieee80211_rx_status *rx_status,
607 u8 *pdesc, struct sk_buff *skb);
608void rtl8821ae_set_desc(struct ieee80211_hw *hw, u8 *pdesc,
609 bool istx, u8 desc_name, u8 *val);
610u32 rtl8821ae_get_desc(u8 *pdesc, bool istx, u8 desc_name);
611bool rtl8821ae_is_tx_desc_closed(struct ieee80211_hw *hw,
612 u8 hw_queue, u16 index);
613void rtl8821ae_tx_polling(struct ieee80211_hw *hw, u8 hw_queue);
614void rtl8821ae_tx_fill_cmddesc(struct ieee80211_hw *hw, u8 *pdesc,
615 bool firstseg, bool lastseg,
616 struct sk_buff *skb);
617u32 rtl8821ae_rx_command_packet(struct ieee80211_hw *hw,
618 struct rtl_stats status,
619 struct sk_buff *skb);
620#endif
diff --git a/drivers/net/wireless/rtlwifi/stats.c b/drivers/net/wireless/rtlwifi/stats.c
index 4f083fc1d360..2d0736a09fc0 100644
--- a/drivers/net/wireless/rtlwifi/stats.c
+++ b/drivers/net/wireless/rtlwifi/stats.c
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -59,8 +55,23 @@ u8 rtl_evm_db_to_percentage(char value)
59} 55}
60EXPORT_SYMBOL(rtl_evm_db_to_percentage); 56EXPORT_SYMBOL(rtl_evm_db_to_percentage);
61 57
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
62static long rtl_translate_todbm(struct ieee80211_hw *hw, 73static long rtl_translate_todbm(struct ieee80211_hw *hw,
63 u8 signal_strength_index) 74 u8 signal_strength_index)
64{ 75{
65 long signal_power; 76 long signal_power;
66 77
@@ -106,6 +117,10 @@ static void rtl_process_ui_rssi(struct ieee80211_hw *hw,
106 u8 rfpath; 117 u8 rfpath;
107 u32 last_rssi, tmpval; 118 u32 last_rssi, tmpval;
108 119
120 if (!pstatus->packet_toself && !pstatus->packet_beacon)
121 return;
122
123 rtlpriv->stats.pwdb_all_cnt += pstatus->rx_pwdb_all;
109 rtlpriv->stats.rssi_calculate_cnt++; 124 rtlpriv->stats.rssi_calculate_cnt++;
110 125
111 if (rtlpriv->stats.ui_rssi.total_num++ >= PHY_RSSI_SLID_WIN_MAX) { 126 if (rtlpriv->stats.ui_rssi.total_num++ >= PHY_RSSI_SLID_WIN_MAX) {
@@ -151,6 +166,12 @@ static void rtl_process_ui_rssi(struct ieee80211_hw *hw,
151 (pstatus->rx_mimo_signalstrength[rfpath])) / 166 (pstatus->rx_mimo_signalstrength[rfpath])) /
152 (RX_SMOOTH_FACTOR); 167 (RX_SMOOTH_FACTOR);
153 } 168 }
169 rtlpriv->stats.rx_snr_db[rfpath] = pstatus->rx_snr[rfpath];
170 rtlpriv->stats.rx_evm_dbm[rfpath] =
171 pstatus->rx_mimo_evm_dbm[rfpath];
172 rtlpriv->stats.rx_cfo_short[rfpath] =
173 pstatus->cfo_short[rfpath];
174 rtlpriv->stats.rx_cfo_tail[rfpath] = pstatus->cfo_tail[rfpath];
154 } 175 }
155} 176}
156 177
@@ -176,7 +197,6 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus)
176 struct rtl_sta_info *drv_priv = NULL; 197 struct rtl_sta_info *drv_priv = NULL;
177 struct ieee80211_sta *sta = NULL; 198 struct ieee80211_sta *sta = NULL;
178 long undec_sm_pwdb; 199 long undec_sm_pwdb;
179 long undec_sm_cck;
180 200
181 rcu_read_lock(); 201 rcu_read_lock();
182 if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION) 202 if (rtlpriv->mac80211.opmode != NL80211_IFTYPE_STATION)
@@ -186,33 +206,21 @@ static void rtl_process_pwdb(struct ieee80211_hw *hw, struct rtl_stats *pstatus)
186 if (sta) { 206 if (sta) {
187 drv_priv = (struct rtl_sta_info *) sta->drv_priv; 207 drv_priv = (struct rtl_sta_info *) sta->drv_priv;
188 undec_sm_pwdb = drv_priv->rssi_stat.undec_sm_pwdb; 208 undec_sm_pwdb = drv_priv->rssi_stat.undec_sm_pwdb;
189 undec_sm_cck = drv_priv->rssi_stat.undec_sm_cck;
190 } else { 209 } else {
191 undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb; 210 undec_sm_pwdb = rtlpriv->dm.undec_sm_pwdb;
192 undec_sm_cck = rtlpriv->dm.undec_sm_cck;
193 } 211 }
194 212
195 if (undec_sm_pwdb < 0) 213 if (undec_sm_pwdb < 0)
196 undec_sm_pwdb = pstatus->rx_pwdb_all; 214 undec_sm_pwdb = pstatus->rx_pwdb_all;
197 if (undec_sm_cck < 0)
198 undec_sm_cck = pstatus->rx_pwdb_all;
199 if (pstatus->rx_pwdb_all > (u32) undec_sm_pwdb) { 215 if (pstatus->rx_pwdb_all > (u32) undec_sm_pwdb) {
200 undec_sm_pwdb = (((undec_sm_pwdb) * 216 undec_sm_pwdb = (((undec_sm_pwdb) *
201 (RX_SMOOTH_FACTOR - 1)) + 217 (RX_SMOOTH_FACTOR - 1)) +
202 (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); 218 (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
203 undec_sm_pwdb = undec_sm_pwdb + 1; 219 undec_sm_pwdb = undec_sm_pwdb + 1;
204 } else { 220 } else {
205 undec_sm_pwdb = (((undec_sm_pwdb) * (RX_SMOOTH_FACTOR - 1)) + 221 undec_sm_pwdb = (((undec_sm_pwdb) *
206 (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
207 }
208 if (pstatus->rx_pwdb_all > (u32) undec_sm_cck) {
209 undec_sm_cck = (((undec_sm_pwdb) *
210 (RX_SMOOTH_FACTOR - 1)) + 222 (RX_SMOOTH_FACTOR - 1)) +
211 (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR); 223 (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
212 undec_sm_cck = undec_sm_cck + 1;
213 } else {
214 undec_sm_pwdb = (((undec_sm_cck) * (RX_SMOOTH_FACTOR - 1)) +
215 (pstatus->rx_pwdb_all)) / (RX_SMOOTH_FACTOR);
216 } 224 }
217 225
218 if (sta) { 226 if (sta) {
@@ -245,7 +253,7 @@ static void rtl_process_ui_link_quality(struct ieee80211_hw *hw,
245 rtlpriv->stats.ui_link_quality.total_val += pstatus->signalquality; 253 rtlpriv->stats.ui_link_quality.total_val += pstatus->signalquality;
246 rtlpriv->stats.ui_link_quality.elements[ 254 rtlpriv->stats.ui_link_quality.elements[
247 rtlpriv->stats.ui_link_quality.index++] = 255 rtlpriv->stats.ui_link_quality.index++] =
248 pstatus->signalquality; 256 pstatus->signalquality;
249 if (rtlpriv->stats.ui_link_quality.index >= 257 if (rtlpriv->stats.ui_link_quality.index >=
250 PHY_LINKQUALITY_SLID_WIN_MAX) 258 PHY_LINKQUALITY_SLID_WIN_MAX)
251 rtlpriv->stats.ui_link_quality.index = 0; 259 rtlpriv->stats.ui_link_quality.index = 0;
@@ -269,7 +277,7 @@ static void rtl_process_ui_link_quality(struct ieee80211_hw *hw,
269} 277}
270 278
271void rtl_process_phyinfo(struct ieee80211_hw *hw, u8 *buffer, 279void rtl_process_phyinfo(struct ieee80211_hw *hw, u8 *buffer,
272 struct rtl_stats *pstatus) 280 struct rtl_stats *pstatus)
273{ 281{
274 282
275 if (!pstatus->packet_matchbssid) 283 if (!pstatus->packet_matchbssid)
diff --git a/drivers/net/wireless/rtlwifi/stats.h b/drivers/net/wireless/rtlwifi/stats.h
index 0dbdc5203830..aa4eec80ccf7 100644
--- a/drivers/net/wireless/rtlwifi/stats.h
+++ b/drivers/net/wireless/rtlwifi/stats.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -39,8 +35,9 @@
39 35
40u8 rtl_query_rxpwrpercentage(char antpower); 36u8 rtl_query_rxpwrpercentage(char antpower);
41u8 rtl_evm_db_to_percentage(char value); 37u8 rtl_evm_db_to_percentage(char value);
38u8 rtl_evm_dbm_jaguar(char value);
42long rtl_signal_scale_mapping(struct ieee80211_hw *hw, long currsig); 39long rtl_signal_scale_mapping(struct ieee80211_hw *hw, long currsig);
43void rtl_process_phyinfo(struct ieee80211_hw *hw, u8 *buffer, 40void rtl_process_phyinfo(struct ieee80211_hw *hw, u8 *buffer,
44 struct rtl_stats *pstatus); 41 struct rtl_stats *pstatus);
45 42
46#endif 43#endif
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index 0398d3ea15b0..10cf69c4bc42 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -75,11 +75,11 @@ static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
75 pipe = usb_sndctrlpipe(udev, 0); /* write_out */ 75 pipe = usb_sndctrlpipe(udev, 0); /* write_out */
76 reqtype = REALTEK_USB_VENQT_WRITE; 76 reqtype = REALTEK_USB_VENQT_WRITE;
77 77
78 dr = kmalloc(sizeof(*dr), GFP_ATOMIC); 78 dr = kzalloc(sizeof(*dr), GFP_ATOMIC);
79 if (!dr) 79 if (!dr)
80 return -ENOMEM; 80 return -ENOMEM;
81 81
82 databuf = kmalloc(databuf_maxlen, GFP_ATOMIC); 82 databuf = kzalloc(databuf_maxlen, GFP_ATOMIC);
83 if (!databuf) { 83 if (!databuf) {
84 kfree(dr); 84 kfree(dr);
85 return -ENOMEM; 85 return -ENOMEM;
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h
index 541b077ae867..976667ae8549 100644
--- a/drivers/net/wireless/rtlwifi/wifi.h
+++ b/drivers/net/wireless/rtlwifi/wifi.h
@@ -11,10 +11,6 @@
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details. 12 * more details.
13 * 13 *
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17 *
18 * The full GNU General Public License is included in this distribution in the 14 * The full GNU General Public License is included in this distribution in the
19 * file called LICENSE. 15 * file called LICENSE.
20 * 16 *
@@ -147,7 +143,27 @@
147#define FCS_LEN 4 143#define FCS_LEN 4
148#define EM_HDR_LEN 8 144#define EM_HDR_LEN 8
149 145
146enum rtl8192c_h2c_cmd {
147 H2C_AP_OFFLOAD = 0,
148 H2C_SETPWRMODE = 1,
149 H2C_JOINBSSRPT = 2,
150 H2C_RSVDPAGE = 3,
151 H2C_RSSI_REPORT = 5,
152 H2C_RA_MASK = 6,
153 H2C_MACID_PS_MODE = 7,
154 H2C_P2P_PS_OFFLOAD = 8,
155 H2C_MAC_MODE_SEL = 9,
156 H2C_PWRM = 15,
157 H2C_P2P_PS_CTW_CMD = 24,
158 MAX_H2CCMD
159};
160
150#define MAX_TX_COUNT 4 161#define MAX_TX_COUNT 4
162#define MAX_REGULATION_NUM 4
163#define MAX_RF_PATH_NUM 4
164#define MAX_RATE_SECTION_NUM 6
165#define MAX_2_4G_BANDWITH_NUM 4
166#define MAX_5G_BANDWITH_NUM 4
151#define MAX_RF_PATH 4 167#define MAX_RF_PATH 4
152#define MAX_CHNL_GROUP_24G 6 168#define MAX_CHNL_GROUP_24G 6
153#define MAX_CHNL_GROUP_5G 14 169#define MAX_CHNL_GROUP_5G 14
@@ -163,6 +179,12 @@
163#define DEL_SW_IDX_SZ 30 179#define DEL_SW_IDX_SZ 30
164#define BAND_NUM 3 180#define BAND_NUM 3
165 181
182/* For now, it's just for 8192ee
183 * but not OK yet, keep it 0
184 */
185#define DMA_IS_64BIT 0
186#define RTL8192EE_SEG_NUM 1 /* 0:2 seg, 1: 4 seg, 2: 8 seg */
187
166enum rf_tx_num { 188enum rf_tx_num {
167 RF_1TX = 0, 189 RF_1TX = 0,
168 RF_2TX, 190 RF_2TX,
@@ -175,6 +197,31 @@ enum rf_tx_num {
175#define PACKET_ARP 2 197#define PACKET_ARP 2
176#define PACKET_EAPOL 3 198#define PACKET_EAPOL 3
177 199
200#define MAX_SUPPORT_WOL_PATTERN_NUM 16
201#define RSVD_WOL_PATTERN_NUM 1
202#define WKFMCAM_ADDR_NUM 6
203#define WKFMCAM_SIZE 24
204
205#define MAX_WOL_BIT_MASK_SIZE 16
206/* MIN LEN keeps 13 here */
207#define MIN_WOL_PATTERN_SIZE 13
208#define MAX_WOL_PATTERN_SIZE 128
209
210#define WAKE_ON_MAGIC_PACKET BIT(0)
211#define WAKE_ON_PATTERN_MATCH BIT(1)
212
213#define WOL_REASON_PTK_UPDATE BIT(0)
214#define WOL_REASON_GTK_UPDATE BIT(1)
215#define WOL_REASON_DISASSOC BIT(2)
216#define WOL_REASON_DEAUTH BIT(3)
217#define WOL_REASON_AP_LOST BIT(4)
218#define WOL_REASON_MAGIC_PKT BIT(5)
219#define WOL_REASON_UNICAST_PKT BIT(6)
220#define WOL_REASON_PATTERN_PKT BIT(7)
221#define WOL_REASON_RTD3_SSID_MATCH BIT(8)
222#define WOL_REASON_REALWOW_V2_WAKEUPPKT BIT(9)
223#define WOL_REASON_REALWOW_V2_ACKLOST BIT(10)
224
178struct txpower_info_2g { 225struct txpower_info_2g {
179 u8 index_cck_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; 226 u8 index_cck_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
180 u8 index_bw40_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G]; 227 u8 index_bw40_base[MAX_RF_PATH][MAX_CHNL_GROUP_24G];
@@ -218,6 +265,15 @@ enum radio_path {
218 RF90_PATH_D = 3, 265 RF90_PATH_D = 3,
219}; 266};
220 267
268enum regulation_txpwr_lmt {
269 TXPWR_LMT_FCC = 0,
270 TXPWR_LMT_MKK = 1,
271 TXPWR_LMT_ETSI = 2,
272 TXPWR_LMT_WW = 3,
273
274 TXPWR_LMT_MAX_REGULATION_NUM = 4
275};
276
221enum rt_eeprom_type { 277enum rt_eeprom_type {
222 EEPROM_93C46, 278 EEPROM_93C46,
223 EEPROM_93C56, 279 EEPROM_93C56,
@@ -274,13 +330,7 @@ enum hardware_type {
274#define IS_HARDWARE_TYPE_8723(rtlhal) \ 330#define IS_HARDWARE_TYPE_8723(rtlhal) \
275(IS_HARDWARE_TYPE_8723E(rtlhal) || IS_HARDWARE_TYPE_8723U(rtlhal)) 331(IS_HARDWARE_TYPE_8723E(rtlhal) || IS_HARDWARE_TYPE_8723U(rtlhal))
276 332
277#define RX_HAL_IS_CCK_RATE(_pdesc)\ 333#define RX_HAL_IS_CCK_RATE(rxmcs) \
278 (_pdesc->rxmcs == DESC92_RATE1M || \
279 _pdesc->rxmcs == DESC92_RATE2M || \
280 _pdesc->rxmcs == DESC92_RATE5_5M || \
281 _pdesc->rxmcs == DESC92_RATE11M)
282
283#define RTL8723E_RX_HAL_IS_CCK_RATE(rxmcs) \
284 ((rxmcs) == DESC92_RATE1M || \ 334 ((rxmcs) == DESC92_RATE1M || \
285 (rxmcs) == DESC92_RATE2M || \ 335 (rxmcs) == DESC92_RATE2M || \
286 (rxmcs) == DESC92_RATE5_5M || \ 336 (rxmcs) == DESC92_RATE5_5M || \
@@ -345,6 +395,7 @@ enum hw_variables {
345 HW_VAR_DEFAULTKEY2, 395 HW_VAR_DEFAULTKEY2,
346 HW_VAR_DEFAULTKEY3, 396 HW_VAR_DEFAULTKEY3,
347 HW_VAR_SIFS, 397 HW_VAR_SIFS,
398 HW_VAR_R2T_SIFS,
348 HW_VAR_DIFS, 399 HW_VAR_DIFS,
349 HW_VAR_EIFS, 400 HW_VAR_EIFS,
350 HW_VAR_SLOT_TIME, 401 HW_VAR_SLOT_TIME,
@@ -396,6 +447,7 @@ enum hw_variables {
396 HW_VAR_H2C_FW_MEDIASTATUSRPT, 447 HW_VAR_H2C_FW_MEDIASTATUSRPT,
397 HW_VAR_H2C_FW_P2P_PS_OFFLOAD, 448 HW_VAR_H2C_FW_P2P_PS_OFFLOAD,
398 HW_VAR_FW_PSMODE_STATUS, 449 HW_VAR_FW_PSMODE_STATUS,
450 HW_VAR_INIT_RTS_RATE,
399 HW_VAR_RESUME_CLK_ON, 451 HW_VAR_RESUME_CLK_ON,
400 HW_VAR_FW_LPS_ACTION, 452 HW_VAR_FW_LPS_ACTION,
401 HW_VAR_1X1_RECV_COMBINE, 453 HW_VAR_1X1_RECV_COMBINE,
@@ -636,6 +688,7 @@ enum rtl_var_map {
636 RTL_IMR_VIDOK, /*AC_VI DMA OK Interrupt */ 688 RTL_IMR_VIDOK, /*AC_VI DMA OK Interrupt */
637 RTL_IMR_VODOK, /*AC_VO DMA Interrupt */ 689 RTL_IMR_VODOK, /*AC_VO DMA Interrupt */
638 RTL_IMR_ROK, /*Receive DMA OK Interrupt */ 690 RTL_IMR_ROK, /*Receive DMA OK Interrupt */
691 RTL_IMR_HSISR_IND, /*HSISR Interrupt*/
639 RTL_IBSS_INT_MASKS, /*(RTL_IMR_BCNINT | RTL_IMR_TBDOK | 692 RTL_IBSS_INT_MASKS, /*(RTL_IMR_BCNINT | RTL_IMR_TBDOK |
640 * RTL_IMR_TBDER) */ 693 * RTL_IMR_TBDER) */
641 RTL_IMR_C2HCMD, /*fw interrupt*/ 694 RTL_IMR_C2HCMD, /*fw interrupt*/
@@ -659,6 +712,13 @@ enum rtl_var_map {
659 RTL_RC_HT_RATEMCS7, 712 RTL_RC_HT_RATEMCS7,
660 RTL_RC_HT_RATEMCS15, 713 RTL_RC_HT_RATEMCS15,
661 714
715 RTL_RC_VHT_RATE_1SS_MCS7,
716 RTL_RC_VHT_RATE_1SS_MCS8,
717 RTL_RC_VHT_RATE_1SS_MCS9,
718 RTL_RC_VHT_RATE_2SS_MCS7,
719 RTL_RC_VHT_RATE_2SS_MCS8,
720 RTL_RC_VHT_RATE_2SS_MCS9,
721
662 /*keep it last */ 722 /*keep it last */
663 RTL_VAR_MAP_MAX, 723 RTL_VAR_MAP_MAX,
664}; 724};
@@ -750,7 +810,9 @@ enum wireless_mode {
750 WIRELESS_MODE_N_24G = 0x10, 810 WIRELESS_MODE_N_24G = 0x10,
751 WIRELESS_MODE_N_5G = 0x20, 811 WIRELESS_MODE_N_5G = 0x20,
752 WIRELESS_MODE_AC_5G = 0x40, 812 WIRELESS_MODE_AC_5G = 0x40,
753 WIRELESS_MODE_AC_24G = 0x80 813 WIRELESS_MODE_AC_24G = 0x80,
814 WIRELESS_MODE_AC_ONLY = 0x100,
815 WIRELESS_MODE_MAX = 0x800
754}; 816};
755 817
756#define IS_WIRELESS_MODE_A(wirelessmode) \ 818#define IS_WIRELESS_MODE_A(wirelessmode) \
@@ -804,6 +866,30 @@ enum rt_polarity_ctl {
804 RT_POLARITY_HIGH_ACT = 1, 866 RT_POLARITY_HIGH_ACT = 1,
805}; 867};
806 868
869/* After 8188E, we use V2 reason define. 88C/8723A use V1 reason. */
870enum fw_wow_reason_v2 {
871 FW_WOW_V2_PTK_UPDATE_EVENT = 0x01,
872 FW_WOW_V2_GTK_UPDATE_EVENT = 0x02,
873 FW_WOW_V2_DISASSOC_EVENT = 0x04,
874 FW_WOW_V2_DEAUTH_EVENT = 0x08,
875 FW_WOW_V2_FW_DISCONNECT_EVENT = 0x10,
876 FW_WOW_V2_MAGIC_PKT_EVENT = 0x21,
877 FW_WOW_V2_UNICAST_PKT_EVENT = 0x22,
878 FW_WOW_V2_PATTERN_PKT_EVENT = 0x23,
879 FW_WOW_V2_RTD3_SSID_MATCH_EVENT = 0x24,
880 FW_WOW_V2_REALWOW_V2_WAKEUPPKT = 0x30,
881 FW_WOW_V2_REALWOW_V2_ACKLOST = 0x31,
882 FW_WOW_V2_REASON_MAX = 0xff,
883};
884
885enum wolpattern_type {
886 UNICAST_PATTERN = 0,
887 MULTICAST_PATTERN = 1,
888 BROADCAST_PATTERN = 2,
889 DONT_CARE_DA = 3,
890 UNKNOWN_TYPE = 4,
891};
892
807struct octet_string { 893struct octet_string {
808 u8 *octet; 894 u8 *octet;
809 u16 length; 895 u16 length;
@@ -904,6 +990,7 @@ struct wireless_stats {
904 long last_sigstrength_inpercent; 990 long last_sigstrength_inpercent;
905 991
906 u32 rssi_calculate_cnt; 992 u32 rssi_calculate_cnt;
993 u32 pwdb_all_cnt;
907 994
908 /*Transformed, in dbm. Beautified signal 995 /*Transformed, in dbm. Beautified signal
909 strength for UI, not correct. */ 996 strength for UI, not correct. */
@@ -1112,6 +1199,8 @@ struct rtl_phy {
1112 1199
1113 u8 pwrgroup_cnt; 1200 u8 pwrgroup_cnt;
1114 u8 cck_high_power; 1201 u8 cck_high_power;
1202 /* this is for 88E & 8723A */
1203 u32 mcs_txpwrlevel_origoffset[MAX_PG_GROUP][16];
1115 /* MAX_PG_GROUP groups of pwr diff by rates */ 1204 /* MAX_PG_GROUP groups of pwr diff by rates */
1116 u32 mcs_offset[MAX_PG_GROUP][16]; 1205 u32 mcs_offset[MAX_PG_GROUP][16];
1117 u32 tx_power_by_rate_offset[TX_PWR_BY_RATE_NUM_BAND] 1206 u32 tx_power_by_rate_offset[TX_PWR_BY_RATE_NUM_BAND]
@@ -1132,6 +1221,17 @@ struct rtl_phy {
1132 u8 cur_bw20_txpwridx; 1221 u8 cur_bw20_txpwridx;
1133 u8 cur_bw40_txpwridx; 1222 u8 cur_bw40_txpwridx;
1134 1223
1224 char txpwr_limit_2_4g[MAX_REGULATION_NUM]
1225 [MAX_2_4G_BANDWITH_NUM]
1226 [MAX_RATE_SECTION_NUM]
1227 [CHANNEL_MAX_NUMBER_2G]
1228 [MAX_RF_PATH_NUM];
1229 char txpwr_limit_5g[MAX_REGULATION_NUM]
1230 [MAX_5G_BANDWITH_NUM]
1231 [MAX_RATE_SECTION_NUM]
1232 [CHANNEL_MAX_NUMBER_5G]
1233 [MAX_RF_PATH_NUM];
1234
1135 u32 rfreg_chnlval[2]; 1235 u32 rfreg_chnlval[2];
1136 bool apk_done; 1236 bool apk_done;
1137 u32 reg_rf3c[2]; /* pathA / pathB */ 1237 u32 reg_rf3c[2]; /* pathA / pathB */
@@ -1255,6 +1355,17 @@ struct rtl_mac {
1255 /* skb wait queue */ 1355 /* skb wait queue */
1256 struct sk_buff_head skb_waitq[MAX_TID_COUNT]; 1356 struct sk_buff_head skb_waitq[MAX_TID_COUNT];
1257 1357
1358 u8 ht_stbc_cap;
1359 u8 ht_cur_stbc;
1360
1361 /*vht support*/
1362 u8 vht_enable;
1363 u8 bw_80;
1364 u8 vht_cur_ldpc;
1365 u8 vht_cur_stbc;
1366 u8 vht_stbc_cap;
1367 u8 vht_ldpc_cap;
1368
1258 /*RDG*/ 1369 /*RDG*/
1259 bool rdg_en; 1370 bool rdg_en;
1260 1371
@@ -1267,7 +1378,7 @@ struct rtl_mac {
1267 u8 sgi_40; 1378 u8 sgi_40;
1268 u8 sgi_20; 1379 u8 sgi_20;
1269 u8 bw_40; 1380 u8 bw_40;
1270 u8 mode; /* wireless mode */ 1381 u16 mode; /* wireless mode */
1271 u8 slot_time; 1382 u8 slot_time;
1272 u8 short_preamble; 1383 u8 short_preamble;
1273 u8 use_cts_protect; 1384 u8 use_cts_protect;
@@ -1364,6 +1475,18 @@ struct rtl_hal {
1364 u32 version; /*version of chip */ 1475 u32 version; /*version of chip */
1365 u8 state; /*stop 0, start 1 */ 1476 u8 state; /*stop 0, start 1 */
1366 u8 board_type; 1477 u8 board_type;
1478 u8 external_pa;
1479
1480 u8 pa_mode;
1481 u8 pa_type_2g;
1482 u8 pa_type_5g;
1483 u8 lna_type_2g;
1484 u8 lna_type_5g;
1485 u8 external_pa_2g;
1486 u8 external_lna_2g;
1487 u8 external_pa_5g;
1488 u8 external_lna_5g;
1489 u8 rfe_type;
1367 1490
1368 /*firmware */ 1491 /*firmware */
1369 u32 fwsize; 1492 u32 fwsize;
@@ -1419,6 +1542,20 @@ struct rtl_hal {
1419 1542
1420 u16 rx_tag;/*for 92ee*/ 1543 u16 rx_tag;/*for 92ee*/
1421 u8 rts_en; 1544 u8 rts_en;
1545
1546 /*for wowlan*/
1547 bool wow_enable;
1548 bool enter_pnp_sleep;
1549 bool wake_from_pnp_sleep;
1550 bool wow_enabled;
1551 __kernel_time_t last_suspend_sec;
1552 u32 wowlan_fwsize;
1553 u8 *wowlan_firmware;
1554
1555 u8 hw_rof_enable; /*Enable GPIO[9] as WL RF HW PDn source*/
1556
1557 bool real_wow_v2_enable;
1558 bool re_init_llt_table;
1422}; 1559};
1423 1560
1424struct rtl_security { 1561struct rtl_security {
@@ -1765,6 +1902,15 @@ struct rtl_ps_ctl {
1765 struct rtl_p2p_ps_info p2p_ps_info; 1902 struct rtl_p2p_ps_info p2p_ps_info;
1766 u8 pwr_mode; 1903 u8 pwr_mode;
1767 u8 smart_ps; 1904 u8 smart_ps;
1905
1906 /* wake up on line */
1907 u8 wo_wlan_mode;
1908 u8 arp_offload_enable;
1909 u8 gtk_offload_enable;
1910 /* Used for WOL, indicates the reason for waking event.*/
1911 u32 wakeup_reason;
1912 /* Record the last waking time for comparison with setting key. */
1913 u64 last_wakeup_time;
1768}; 1914};
1769 1915
1770struct rtl_stats { 1916struct rtl_stats {
@@ -1800,17 +1946,26 @@ struct rtl_stats {
1800 u16 wakeup:1; 1946 u16 wakeup:1;
1801 u32 timestamp_low; 1947 u32 timestamp_low;
1802 u32 timestamp_high; 1948 u32 timestamp_high;
1949 bool shift;
1803 1950
1804 u8 rx_drvinfo_size; 1951 u8 rx_drvinfo_size;
1805 u8 rx_bufshift; 1952 u8 rx_bufshift;
1806 bool isampdu; 1953 bool isampdu;
1807 bool isfirst_ampdu; 1954 bool isfirst_ampdu;
1808 bool rx_is40Mhzpacket; 1955 bool rx_is40Mhzpacket;
1956 u8 rx_packet_bw;
1809 u32 rx_pwdb_all; 1957 u32 rx_pwdb_all;
1810 u8 rx_mimo_signalstrength[4]; /*in 0~100 index */ 1958 u8 rx_mimo_signalstrength[4]; /*in 0~100 index */
1959 s8 rx_mimo_signalquality[4];
1960 u8 rx_mimo_evm_dbm[4];
1961 u16 cfo_short[4]; /* per-path's Cfo_short */
1962 u16 cfo_tail[4];
1963
1811 s8 rx_mimo_sig_qual[4]; 1964 s8 rx_mimo_sig_qual[4];
1812 u8 rx_pwr[4]; /* per-path's pwdb */ 1965 u8 rx_pwr[4]; /* per-path's pwdb */
1813 u8 rx_snr[4]; /* per-path's SNR */ 1966 u8 rx_snr[4]; /* per-path's SNR */
1967 u8 bandwidth;
1968 u8 bt_coex_pwr_adjust;
1814 bool packet_matchbssid; 1969 bool packet_matchbssid;
1815 bool is_cck; 1970 bool is_cck;
1816 bool is_ht; 1971 bool is_ht;
@@ -1818,6 +1973,10 @@ struct rtl_stats {
1818 bool packet_beacon; /*for rssi */ 1973 bool packet_beacon; /*for rssi */
1819 char cck_adc_pwdb[4]; /*for rx path selection */ 1974 char cck_adc_pwdb[4]; /*for rx path selection */
1820 1975
1976 bool is_vht;
1977 bool is_short_gi;
1978 u8 vht_nss;
1979
1821 u8 packet_report_type; 1980 u8 packet_report_type;
1822 1981
1823 u32 macid; 1982 u32 macid;
@@ -1850,7 +2009,7 @@ struct rt_link_detect {
1850}; 2009};
1851 2010
1852struct rtl_tcb_desc { 2011struct rtl_tcb_desc {
1853 u8 packet_bw:1; 2012 u8 packet_bw:2;
1854 u8 multicast:1; 2013 u8 multicast:1;
1855 u8 broadcast:1; 2014 u8 broadcast:1;
1856 2015
@@ -1880,11 +2039,19 @@ struct rtl_tcb_desc {
1880 u8 empkt_num; 2039 u8 empkt_num;
1881 /* The max value by HW */ 2040 /* The max value by HW */
1882 u32 empkt_len[10]; 2041 u32 empkt_len[10];
1883 bool btx_enable_sw_calc_duration; 2042 bool tx_enable_sw_calc_duration;
1884}; 2043};
1885 2044
1886struct rtl92c_firmware_header; 2045struct rtl92c_firmware_header;
1887 2046
2047struct rtl_wow_pattern {
2048 u8 type;
2049 u16 crc;
2050 u32 mask[4];
2051};
2052
2053struct rtl8723e_firmware_header;
2054
1888struct rtl_hal_ops { 2055struct rtl_hal_ops {
1889 int (*init_sw_vars) (struct ieee80211_hw *hw); 2056 int (*init_sw_vars) (struct ieee80211_hw *hw);
1890 void (*deinit_sw_vars) (struct ieee80211_hw *hw); 2057 void (*deinit_sw_vars) (struct ieee80211_hw *hw);
@@ -1934,7 +2101,6 @@ struct rtl_hal_ops {
1934 void (*fill_tx_cmddesc) (struct ieee80211_hw *hw, u8 *pdesc, 2101 void (*fill_tx_cmddesc) (struct ieee80211_hw *hw, u8 *pdesc,
1935 bool firstseg, bool lastseg, 2102 bool firstseg, bool lastseg,
1936 struct sk_buff *skb); 2103 struct sk_buff *skb);
1937 bool (*cmd_send_packet)(struct ieee80211_hw *hw, struct sk_buff *skb);
1938 bool (*query_rx_desc) (struct ieee80211_hw *hw, 2104 bool (*query_rx_desc) (struct ieee80211_hw *hw,
1939 struct rtl_stats *stats, 2105 struct rtl_stats *stats,
1940 struct ieee80211_rx_status *rx_status, 2106 struct ieee80211_rx_status *rx_status,
@@ -1989,9 +2155,12 @@ struct rtl_hal_ops {
1989 void (*fill_h2c_cmd) (struct ieee80211_hw *hw, u8 element_id, 2155 void (*fill_h2c_cmd) (struct ieee80211_hw *hw, u8 element_id,
1990 u32 cmd_len, u8 *p_cmdbuffer); 2156 u32 cmd_len, u8 *p_cmdbuffer);
1991 bool (*get_btc_status) (void); 2157 bool (*get_btc_status) (void);
1992 bool (*is_fw_header) (struct rtl92c_firmware_header *hdr); 2158 bool (*is_fw_header)(struct rtl8723e_firmware_header *hdr);
1993 u32 (*rx_command_packet)(struct ieee80211_hw *hw, 2159 u32 (*rx_command_packet)(struct ieee80211_hw *hw,
1994 struct rtl_stats status, struct sk_buff *skb); 2160 struct rtl_stats status, struct sk_buff *skb);
2161 void (*add_wowlan_pattern)(struct ieee80211_hw *hw,
2162 struct rtl_wow_pattern *rtl_pattern,
2163 u8 index);
1995}; 2164};
1996 2165
1997struct rtl_intf_ops { 2166struct rtl_intf_ops {
@@ -2006,7 +2175,7 @@ struct rtl_intf_ops {
2006 struct ieee80211_sta *sta, 2175 struct ieee80211_sta *sta,
2007 struct sk_buff *skb, 2176 struct sk_buff *skb,
2008 struct rtl_tcb_desc *ptcb_desc); 2177 struct rtl_tcb_desc *ptcb_desc);
2009 void (*flush)(struct ieee80211_hw *hw, bool drop); 2178 void (*flush)(struct ieee80211_hw *hw, u32 queues, bool drop);
2010 int (*reset_trx_ring) (struct ieee80211_hw *hw); 2179 int (*reset_trx_ring) (struct ieee80211_hw *hw);
2011 bool (*waitq_insert) (struct ieee80211_hw *hw, 2180 bool (*waitq_insert) (struct ieee80211_hw *hw,
2012 struct ieee80211_sta *sta, 2181 struct ieee80211_sta *sta,
@@ -2035,9 +2204,13 @@ struct rtl_mod_params {
2035 /* default: 1 = using linked fw power save */ 2204 /* default: 1 = using linked fw power save */
2036 bool fwctrl_lps; 2205 bool fwctrl_lps;
2037 2206
2038 /* default: 0 = not using MSI interrupts mode */ 2207 /* default: 0 = not using MSI interrupts mode
2039 /* submodules should set their own defalut value */ 2208 * submodules should set their own default value
2209 */
2040 bool msi_support; 2210 bool msi_support;
2211
2212 /* default 0: 1 means disable */
2213 bool disable_watchdog;
2041}; 2214};
2042 2215
2043struct rtl_hal_usbint_cfg { 2216struct rtl_hal_usbint_cfg {
@@ -2345,6 +2518,8 @@ struct proxim {
2345 2518
2346struct rtl_priv { 2519struct rtl_priv {
2347 struct ieee80211_hw *hw; 2520 struct ieee80211_hw *hw;
2521 /* Used to load a second firmware */
2522 void (*rtl_fw_second_cb)(struct rtl_priv *rtlpriv);
2348 struct completion firmware_loading_complete; 2523 struct completion firmware_loading_complete;
2349 struct list_head list; 2524 struct list_head list;
2350 struct rtl_priv *buddy_priv; 2525 struct rtl_priv *buddy_priv;
@@ -2420,6 +2595,9 @@ struct rtl_priv {
2420 */ 2595 */
2421 bool use_new_trx_flow; 2596 bool use_new_trx_flow;
2422 2597
2598#ifdef CONFIG_PM
2599 struct wiphy_wowlan_support wowlan;
2600#endif
2423 /*This must be the last item so 2601 /*This must be the last item so
2424 that it points to the data allocated 2602 that it points to the data allocated
2425 beyond this structure like: 2603 beyond this structure like:
@@ -2668,6 +2846,26 @@ value to host byte ordering.*/
2668 (des)[2] = (src)[2], (des)[3] = (src)[3],\ 2846 (des)[2] = (src)[2], (des)[3] = (src)[3],\
2669 (des)[4] = (src)[4], (des)[5] = (src)[5]) 2847 (des)[4] = (src)[4], (des)[5] = (src)[5])
2670 2848
2849#define LDPC_HT_ENABLE_RX BIT(0)
2850#define LDPC_HT_ENABLE_TX BIT(1)
2851#define LDPC_HT_TEST_TX_ENABLE BIT(2)
2852#define LDPC_HT_CAP_TX BIT(3)
2853
2854#define STBC_HT_ENABLE_RX BIT(0)
2855#define STBC_HT_ENABLE_TX BIT(1)
2856#define STBC_HT_TEST_TX_ENABLE BIT(2)
2857#define STBC_HT_CAP_TX BIT(3)
2858
2859#define LDPC_VHT_ENABLE_RX BIT(0)
2860#define LDPC_VHT_ENABLE_TX BIT(1)
2861#define LDPC_VHT_TEST_TX_ENABLE BIT(2)
2862#define LDPC_VHT_CAP_TX BIT(3)
2863
2864#define STBC_VHT_ENABLE_RX BIT(0)
2865#define STBC_VHT_ENABLE_TX BIT(1)
2866#define STBC_VHT_TEST_TX_ENABLE BIT(2)
2867#define STBC_VHT_CAP_TX BIT(3)
2868
2671static inline u8 rtl_read_byte(struct rtl_priv *rtlpriv, u32 addr) 2869static inline u8 rtl_read_byte(struct rtl_priv *rtlpriv, u32 addr)
2672{ 2870{
2673 return rtlpriv->io.read8_sync(rtlpriv, addr); 2871 return rtlpriv->io.read8_sync(rtlpriv, addr);
diff --git a/drivers/nfc/st21nfca/i2c.c b/drivers/nfc/st21nfca/i2c.c
index ff31939978ae..0ea756b77519 100644
--- a/drivers/nfc/st21nfca/i2c.c
+++ b/drivers/nfc/st21nfca/i2c.c
@@ -271,6 +271,7 @@ static int st21nfca_hci_i2c_write(void *phy_id, struct sk_buff *skb)
271static int get_frame_size(u8 *buf, int buflen) 271static int get_frame_size(u8 *buf, int buflen)
272{ 272{
273 int len = 0; 273 int len = 0;
274
274 if (buf[len + 1] == ST21NFCA_SOF_EOF) 275 if (buf[len + 1] == ST21NFCA_SOF_EOF)
275 return 0; 276 return 0;
276 277
@@ -311,6 +312,7 @@ static int check_crc(u8 *buf, int buflen)
311static int st21nfca_hci_i2c_repack(struct sk_buff *skb) 312static int st21nfca_hci_i2c_repack(struct sk_buff *skb)
312{ 313{
313 int i, j, r, size; 314 int i, j, r, size;
315
314 if (skb->len < 1 || (skb->len > 1 && skb->data[1] != 0)) 316 if (skb->len < 1 || (skb->len > 1 && skb->data[1] != 0))
315 return -EBADMSG; 317 return -EBADMSG;
316 318
@@ -525,24 +527,19 @@ static int st21nfca_hci_i2c_of_request_resources(struct i2c_client *client)
525 } 527 }
526 528
527 /* GPIO request and configuration */ 529 /* GPIO request and configuration */
528 r = devm_gpio_request(&client->dev, gpio, "clf_enable"); 530 r = devm_gpio_request_one(&client->dev, gpio, GPIOF_OUT_INIT_HIGH,
531 "clf_enable");
529 if (r) { 532 if (r) {
530 nfc_err(&client->dev, "Failed to request enable pin\n"); 533 nfc_err(&client->dev, "Failed to request enable pin\n");
531 return -ENODEV; 534 return -ENODEV;
532 } 535 }
533 536
534 r = gpio_direction_output(gpio, 1);
535 if (r) {
536 nfc_err(&client->dev, "Failed to set enable pin direction as output\n");
537 return -ENODEV;
538 }
539 phy->gpio_ena = gpio; 537 phy->gpio_ena = gpio;
540 538
541 /* IRQ */ 539 /* IRQ */
542 r = irq_of_parse_and_map(pp, 0); 540 r = irq_of_parse_and_map(pp, 0);
543 if (r < 0) { 541 if (r < 0) {
544 nfc_err(&client->dev, 542 nfc_err(&client->dev, "Unable to get irq, error: %d\n", r);
545 "Unable to get irq, error: %d\n", r);
546 return r; 543 return r;
547 } 544 }
548 545
@@ -576,32 +573,20 @@ static int st21nfca_hci_i2c_request_resources(struct i2c_client *client)
576 phy->gpio_ena = pdata->gpio_ena; 573 phy->gpio_ena = pdata->gpio_ena;
577 phy->irq_polarity = pdata->irq_polarity; 574 phy->irq_polarity = pdata->irq_polarity;
578 575
579 r = devm_gpio_request(&client->dev, phy->gpio_irq, "wake_up"); 576 r = devm_gpio_request_one(&client->dev, phy->gpio_irq, GPIOF_IN,
577 "wake_up");
580 if (r) { 578 if (r) {
581 pr_err("%s : gpio_request failed\n", __FILE__); 579 pr_err("%s : gpio_request failed\n", __FILE__);
582 return -ENODEV; 580 return -ENODEV;
583 } 581 }
584 582
585 r = gpio_direction_input(phy->gpio_irq);
586 if (r) {
587 pr_err("%s : gpio_direction_input failed\n", __FILE__);
588 return -ENODEV;
589 }
590
591 if (phy->gpio_ena > 0) { 583 if (phy->gpio_ena > 0) {
592 r = devm_gpio_request(&client->dev, 584 r = devm_gpio_request_one(&client->dev, phy->gpio_ena,
593 phy->gpio_ena, "clf_enable"); 585 GPIOF_OUT_INIT_HIGH, "clf_enable");
594 if (r) { 586 if (r) {
595 pr_err("%s : ena gpio_request failed\n", __FILE__); 587 pr_err("%s : ena gpio_request failed\n", __FILE__);
596 return -ENODEV; 588 return -ENODEV;
597 } 589 }
598 r = gpio_direction_output(phy->gpio_ena, 1);
599
600 if (r) {
601 pr_err("%s : ena gpio_direction_output failed\n",
602 __FILE__);
603 return -ENODEV;
604 }
605 } 590 }
606 591
607 /* IRQ */ 592 /* IRQ */
@@ -711,7 +696,6 @@ static struct i2c_driver st21nfca_hci_i2c_driver = {
711 .driver = { 696 .driver = {
712 .owner = THIS_MODULE, 697 .owner = THIS_MODULE,
713 .name = ST21NFCA_HCI_I2C_DRIVER_NAME, 698 .name = ST21NFCA_HCI_I2C_DRIVER_NAME,
714 .owner = THIS_MODULE,
715 .of_match_table = of_match_ptr(of_st21nfca_i2c_match), 699 .of_match_table = of_match_ptr(of_st21nfca_i2c_match),
716 }, 700 },
717 .probe = st21nfca_hci_i2c_probe, 701 .probe = st21nfca_hci_i2c_probe,
diff --git a/drivers/nfc/st21nfca/st21nfca.c b/drivers/nfc/st21nfca/st21nfca.c
index a902b0551c86..a89e56c2c749 100644
--- a/drivers/nfc/st21nfca/st21nfca.c
+++ b/drivers/nfc/st21nfca/st21nfca.c
@@ -34,7 +34,7 @@
34#define ST21NFCA_RF_READER_CMD_PRESENCE_CHECK 0x30 34#define ST21NFCA_RF_READER_CMD_PRESENCE_CHECK 0x30
35 35
36#define ST21NFCA_RF_READER_ISO15693_GATE 0x12 36#define ST21NFCA_RF_READER_ISO15693_GATE 0x12
37#define ST21NFCA_RF_READER_ISO15693_INVENTORY 0x01 37#define ST21NFCA_RF_READER_ISO15693_INVENTORY 0x01
38 38
39/* 39/*
40 * Reader gate for communication with contact-less cards using Type A 40 * Reader gate for communication with contact-less cards using Type A
@@ -45,21 +45,42 @@
45#define ST21NFCA_RF_READER_14443_3_A_ATQA 0x03 45#define ST21NFCA_RF_READER_14443_3_A_ATQA 0x03
46#define ST21NFCA_RF_READER_14443_3_A_SAK 0x04 46#define ST21NFCA_RF_READER_14443_3_A_SAK 0x04
47 47
48#define ST21NFCA_RF_READER_F_DATARATE 0x01
49#define ST21NFCA_RF_READER_F_DATARATE_106 0x01
50#define ST21NFCA_RF_READER_F_DATARATE_212 0x02
51#define ST21NFCA_RF_READER_F_DATARATE_424 0x04
52#define ST21NFCA_RF_READER_F_POL_REQ 0x02
53#define ST21NFCA_RF_READER_F_POL_REQ_DEFAULT 0xffff0000
54#define ST21NFCA_RF_READER_F_NFCID2 0x03
55#define ST21NFCA_RF_READER_F_NFCID1 0x04
56
57#define ST21NFCA_RF_CARD_F_MODE 0x01
58#define ST21NFCA_RF_CARD_F_NFCID2_LIST 0x04
59#define ST21NFCA_RF_CARD_F_NFCID1 0x05
60#define ST21NFCA_RF_CARD_F_SENS_RES 0x06
61#define ST21NFCA_RF_CARD_F_SEL_RES 0x07
62#define ST21NFCA_RF_CARD_F_DATARATE 0x08
63#define ST21NFCA_RF_CARD_F_DATARATE_212_424 0x01
64
48#define ST21NFCA_DEVICE_MGNT_GATE 0x01 65#define ST21NFCA_DEVICE_MGNT_GATE 0x01
49#define ST21NFCA_DEVICE_MGNT_PIPE 0x02 66#define ST21NFCA_DEVICE_MGNT_PIPE 0x02
50 67
51#define ST21NFCA_DM_GETINFO 0x13 68#define ST21NFCA_DM_GETINFO 0x13
52#define ST21NFCA_DM_GETINFO_PIPE_LIST 0x02 69#define ST21NFCA_DM_GETINFO_PIPE_LIST 0x02
53#define ST21NFCA_DM_GETINFO_PIPE_INFO 0x01 70#define ST21NFCA_DM_GETINFO_PIPE_INFO 0x01
54#define ST21NFCA_DM_PIPE_CREATED 0x02 71#define ST21NFCA_DM_PIPE_CREATED 0x02
55#define ST21NFCA_DM_PIPE_OPEN 0x04 72#define ST21NFCA_DM_PIPE_OPEN 0x04
56#define ST21NFCA_DM_RF_ACTIVE 0x80 73#define ST21NFCA_DM_RF_ACTIVE 0x80
57#define ST21NFCA_DM_DISCONNECT 0x30 74#define ST21NFCA_DM_DISCONNECT 0x30
58 75
59#define ST21NFCA_DM_IS_PIPE_OPEN(p) \ 76#define ST21NFCA_DM_IS_PIPE_OPEN(p) \
60 ((p & 0x0f) == (ST21NFCA_DM_PIPE_CREATED | ST21NFCA_DM_PIPE_OPEN)) 77 ((p & 0x0f) == (ST21NFCA_DM_PIPE_CREATED | ST21NFCA_DM_PIPE_OPEN))
61 78
62#define ST21NFCA_NFC_MODE 0x03 /* NFC_MODE parameter*/ 79#define ST21NFCA_NFC_MODE 0x03 /* NFC_MODE parameter*/
80#define ST21NFCA_EVT_FIELD_ON 0x11
81#define ST21NFCA_EVT_CARD_DEACTIVATED 0x12
82#define ST21NFCA_EVT_CARD_ACTIVATED 0x13
83#define ST21NFCA_EVT_FIELD_OFF 0x14
63 84
64static DECLARE_BITMAP(dev_mask, ST21NFCA_NUM_DEVICES); 85static DECLARE_BITMAP(dev_mask, ST21NFCA_NUM_DEVICES);
65 86
@@ -355,8 +376,8 @@ static int st21nfca_hci_start_poll(struct nfc_hci_dev *hdev,
355 if (r < 0) 376 if (r < 0)
356 return r; 377 return r;
357 378
358 pol_req = 379 pol_req = be32_to_cpu((__force __be32)
359 be32_to_cpu(ST21NFCA_RF_READER_F_POL_REQ_DEFAULT); 380 ST21NFCA_RF_READER_F_POL_REQ_DEFAULT);
360 r = nfc_hci_set_param(hdev, ST21NFCA_RF_READER_F_GATE, 381 r = nfc_hci_set_param(hdev, ST21NFCA_RF_READER_F_GATE,
361 ST21NFCA_RF_READER_F_POL_REQ, 382 ST21NFCA_RF_READER_F_POL_REQ,
362 (u8 *) &pol_req, 4); 383 (u8 *) &pol_req, 4);
@@ -790,6 +811,7 @@ static int st21nfca_hci_check_presence(struct nfc_hci_dev *hdev,
790 struct nfc_target *target) 811 struct nfc_target *target)
791{ 812{
792 u8 fwi = 0x11; 813 u8 fwi = 0x11;
814
793 switch (target->hci_reader_gate) { 815 switch (target->hci_reader_gate) {
794 case NFC_HCI_RF_READER_A_GATE: 816 case NFC_HCI_RF_READER_A_GATE:
795 case NFC_HCI_RF_READER_B_GATE: 817 case NFC_HCI_RF_READER_B_GATE:
@@ -839,20 +861,16 @@ static int st21nfca_hci_event_received(struct nfc_hci_dev *hdev, u8 gate,
839 if (gate == ST21NFCA_RF_CARD_F_GATE) { 861 if (gate == ST21NFCA_RF_CARD_F_GATE) {
840 r = st21nfca_tm_event_send_data(hdev, skb, gate); 862 r = st21nfca_tm_event_send_data(hdev, skb, gate);
841 if (r < 0) 863 if (r < 0)
842 goto exit; 864 return r;
843 return 0; 865 return 0;
844 } else {
845 info->dep_info.curr_nfc_dep_pni = 0;
846 return 1;
847 } 866 }
848 break; 867 info->dep_info.curr_nfc_dep_pni = 0;
868 return 1;
849 default: 869 default:
850 return 1; 870 return 1;
851 } 871 }
852 kfree_skb(skb); 872 kfree_skb(skb);
853 return 0; 873 return 0;
854exit:
855 return r;
856} 874}
857 875
858static struct nfc_hci_ops st21nfca_hci_ops = { 876static struct nfc_hci_ops st21nfca_hci_ops = {
@@ -904,8 +922,11 @@ int st21nfca_hci_probe(void *phy_id, struct nfc_phy_ops *phy_ops,
904 * persistent info to discriminate 2 identical chips 922 * persistent info to discriminate 2 identical chips
905 */ 923 */
906 dev_num = find_first_zero_bit(dev_mask, ST21NFCA_NUM_DEVICES); 924 dev_num = find_first_zero_bit(dev_mask, ST21NFCA_NUM_DEVICES);
925
907 if (dev_num >= ST21NFCA_NUM_DEVICES) 926 if (dev_num >= ST21NFCA_NUM_DEVICES)
908 goto err_alloc_hdev; 927 return -ENODEV;
928
929 set_bit(dev_num, dev_mask);
909 930
910 scnprintf(init_data.session_id, sizeof(init_data.session_id), "%s%2x", 931 scnprintf(init_data.session_id, sizeof(init_data.session_id), "%s%2x",
911 "ST21AH", dev_num); 932 "ST21AH", dev_num);
diff --git a/drivers/nfc/st21nfca/st21nfca.h b/drivers/nfc/st21nfca/st21nfca.h
index 96fe5a62dc0d..a0b77f1ba6d9 100644
--- a/drivers/nfc/st21nfca/st21nfca.h
+++ b/drivers/nfc/st21nfca/st21nfca.h
@@ -82,30 +82,9 @@ struct st21nfca_hci_info {
82#define ST21NFCA_WR_XCHG_DATA 0x10 82#define ST21NFCA_WR_XCHG_DATA 0x10
83 83
84#define ST21NFCA_RF_READER_F_GATE 0x14 84#define ST21NFCA_RF_READER_F_GATE 0x14
85#define ST21NFCA_RF_READER_F_DATARATE 0x01
86#define ST21NFCA_RF_READER_F_DATARATE_106 0x01
87#define ST21NFCA_RF_READER_F_DATARATE_212 0x02
88#define ST21NFCA_RF_READER_F_DATARATE_424 0x04
89#define ST21NFCA_RF_READER_F_POL_REQ 0x02
90#define ST21NFCA_RF_READER_F_POL_REQ_DEFAULT 0xffff0000
91#define ST21NFCA_RF_READER_F_NFCID2 0x03
92#define ST21NFCA_RF_READER_F_NFCID1 0x04
93#define ST21NFCA_RF_READER_F_SENS_RES 0x05
94 85
95#define ST21NFCA_RF_CARD_F_GATE 0x24 86#define ST21NFCA_RF_CARD_F_GATE 0x24
96#define ST21NFCA_RF_CARD_F_MODE 0x01
97#define ST21NFCA_RF_CARD_F_NFCID2_LIST 0x04
98#define ST21NFCA_RF_CARD_F_NFCID1 0x05
99#define ST21NFCA_RF_CARD_F_SENS_RES 0x06
100#define ST21NFCA_RF_CARD_F_SEL_RES 0x07
101#define ST21NFCA_RF_CARD_F_DATARATE 0x08
102#define ST21NFCA_RF_CARD_F_DATARATE_106 0x00
103#define ST21NFCA_RF_CARD_F_DATARATE_212_424 0x01
104 87
105#define ST21NFCA_EVT_SEND_DATA 0x10 88#define ST21NFCA_EVT_SEND_DATA 0x10
106#define ST21NFCA_EVT_FIELD_ON 0x11
107#define ST21NFCA_EVT_CARD_DEACTIVATED 0x12
108#define ST21NFCA_EVT_CARD_ACTIVATED 0x13
109#define ST21NFCA_EVT_FIELD_OFF 0x14
110 89
111#endif /* __LOCAL_ST21NFCA_H_ */ 90#endif /* __LOCAL_ST21NFCA_H_ */
diff --git a/drivers/nfc/st21nfca/st21nfca_dep.c b/drivers/nfc/st21nfca/st21nfca_dep.c
index b2d9957b57f8..bfb6df56c505 100644
--- a/drivers/nfc/st21nfca/st21nfca_dep.c
+++ b/drivers/nfc/st21nfca/st21nfca_dep.c
@@ -121,6 +121,7 @@ static void st21nfca_tx_work(struct work_struct *work)
121 121
122 struct nfc_dev *dev; 122 struct nfc_dev *dev;
123 struct sk_buff *skb; 123 struct sk_buff *skb;
124
124 if (info) { 125 if (info) {
125 dev = info->hdev->ndev; 126 dev = info->hdev->ndev;
126 skb = info->dep_info.tx_pending; 127 skb = info->dep_info.tx_pending;
@@ -128,9 +129,8 @@ static void st21nfca_tx_work(struct work_struct *work)
128 device_lock(&dev->dev); 129 device_lock(&dev->dev);
129 130
130 nfc_hci_send_cmd_async(info->hdev, ST21NFCA_RF_READER_F_GATE, 131 nfc_hci_send_cmd_async(info->hdev, ST21NFCA_RF_READER_F_GATE,
131 ST21NFCA_WR_XCHG_DATA, 132 ST21NFCA_WR_XCHG_DATA, skb->data, skb->len,
132 skb->data, skb->len, 133 info->async_cb, info);
133 info->async_cb, info);
134 device_unlock(&dev->dev); 134 device_unlock(&dev->dev);
135 kfree_skb(skb); 135 kfree_skb(skb);
136 } 136 }
@@ -185,8 +185,10 @@ static int st21nfca_tm_send_atr_res(struct nfc_hci_dev *hdev,
185 185
186 info->dep_info.curr_nfc_dep_pni = 0; 186 info->dep_info.curr_nfc_dep_pni = 0;
187 187
188 return nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE, 188 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
189 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len); 189 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
190 kfree_skb(skb);
191 return r;
190} 192}
191 193
192static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev, 194static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
@@ -197,10 +199,6 @@ static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
197 int r; 199 int r;
198 200
199 skb_trim(skb, skb->len - 1); 201 skb_trim(skb, skb->len - 1);
200 if (IS_ERR(skb)) {
201 r = PTR_ERR(skb);
202 goto exit;
203 }
204 202
205 if (!skb->len) { 203 if (!skb->len) {
206 r = -EIO; 204 r = -EIO;
@@ -214,6 +212,11 @@ static int st21nfca_tm_recv_atr_req(struct nfc_hci_dev *hdev,
214 212
215 atr_req = (struct st21nfca_atr_req *)skb->data; 213 atr_req = (struct st21nfca_atr_req *)skb->data;
216 214
215 if (atr_req->length < sizeof(struct st21nfca_atr_req)) {
216 r = -EPROTO;
217 goto exit;
218 }
219
217 r = st21nfca_tm_send_atr_res(hdev, atr_req); 220 r = st21nfca_tm_send_atr_res(hdev, atr_req);
218 if (r) 221 if (r)
219 goto exit; 222 goto exit;
@@ -237,7 +240,6 @@ static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
237 struct st21nfca_psl_res *psl_res; 240 struct st21nfca_psl_res *psl_res;
238 struct sk_buff *skb; 241 struct sk_buff *skb;
239 u8 bitrate[2] = {0, 0}; 242 u8 bitrate[2] = {0, 0};
240
241 int r; 243 int r;
242 244
243 skb = alloc_skb(sizeof(struct st21nfca_psl_res), GFP_KERNEL); 245 skb = alloc_skb(sizeof(struct st21nfca_psl_res), GFP_KERNEL);
@@ -254,6 +256,8 @@ static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
254 256
255 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE, 257 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
256 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len); 258 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
259 if (r < 0)
260 goto error;
257 261
258 /* 262 /*
259 * ST21NFCA only support P2P passive. 263 * ST21NFCA only support P2P passive.
@@ -269,8 +273,11 @@ static int st21nfca_tm_send_psl_res(struct nfc_hci_dev *hdev,
269 } 273 }
270 274
271 /* Send an event to change bitrate change event to card f */ 275 /* Send an event to change bitrate change event to card f */
272 return nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE, 276 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
273 ST21NFCA_EVT_CARD_F_BITRATE, bitrate, 2); 277 ST21NFCA_EVT_CARD_F_BITRATE, bitrate, 2);
278error:
279 kfree_skb(skb);
280 return r;
274} 281}
275 282
276static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev, 283static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
@@ -280,11 +287,6 @@ static int st21nfca_tm_recv_psl_req(struct nfc_hci_dev *hdev,
280 int r; 287 int r;
281 288
282 skb_trim(skb, skb->len - 1); 289 skb_trim(skb, skb->len - 1);
283 if (IS_ERR(skb)) {
284 r = PTR_ERR(skb);
285 skb = NULL;
286 goto exit;
287 }
288 290
289 if (!skb->len) { 291 if (!skb->len) {
290 r = -EIO; 292 r = -EIO;
@@ -314,7 +316,7 @@ int st21nfca_tm_send_dep_res(struct nfc_hci_dev *hdev, struct sk_buff *skb)
314 *skb_push(skb, 1) = skb->len; 316 *skb_push(skb, 1) = skb->len;
315 317
316 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE, 318 r = nfc_hci_send_event(hdev, ST21NFCA_RF_CARD_F_GATE,
317 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len); 319 ST21NFCA_EVT_SEND_DATA, skb->data, skb->len);
318 kfree_skb(skb); 320 kfree_skb(skb);
319 321
320 return r; 322 return r;
@@ -330,11 +332,6 @@ static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
330 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev); 332 struct st21nfca_hci_info *info = nfc_hci_get_clientdata(hdev);
331 333
332 skb_trim(skb, skb->len - 1); 334 skb_trim(skb, skb->len - 1);
333 if (IS_ERR(skb)) {
334 r = PTR_ERR(skb);
335 skb = NULL;
336 goto exit;
337 }
338 335
339 size = 4; 336 size = 4;
340 337
@@ -368,12 +365,6 @@ static int st21nfca_tm_recv_dep_req(struct nfc_hci_dev *hdev,
368 break; 365 break;
369 } 366 }
370 367
371 if (IS_ERR(skb)) {
372 r = PTR_ERR(skb);
373 skb = NULL;
374 goto exit;
375 }
376
377 skb_pull(skb, size); 368 skb_pull(skb, size);
378 369
379 return nfc_tm_data_received(hdev->ndev, skb); 370 return nfc_tm_data_received(hdev->ndev, skb);
@@ -437,8 +428,6 @@ static void st21nfca_im_send_psl_req(struct nfc_hci_dev *hdev, u8 did, u8 bsi,
437 *skb_push(skb, 1) = info->dep_info.to | 0x10; 428 *skb_push(skb, 1) = info->dep_info.to | 0x10;
438 429
439 st21nfca_im_send_pdu(info, skb); 430 st21nfca_im_send_pdu(info, skb);
440
441 kfree_skb(skb);
442} 431}
443 432
444#define ST21NFCA_CB_TYPE_READER_F 1 433#define ST21NFCA_CB_TYPE_READER_F 1
@@ -452,7 +441,7 @@ static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
452 if (err != 0) 441 if (err != 0)
453 return; 442 return;
454 443
455 if (IS_ERR(skb)) 444 if (!skb)
456 return; 445 return;
457 446
458 switch (info->async_cb_type) { 447 switch (info->async_cb_type) {
@@ -484,8 +473,7 @@ static void st21nfca_im_recv_atr_res_cb(void *context, struct sk_buff *skb,
484 ST21NFCA_PP2LRI(atr_res->ppi)); 473 ST21NFCA_PP2LRI(atr_res->ppi));
485 break; 474 break;
486 default: 475 default:
487 if (err == 0) 476 kfree_skb(skb);
488 kfree_skb(skb);
489 break; 477 break;
490 } 478 }
491} 479}
@@ -522,7 +510,7 @@ int st21nfca_im_send_atr_req(struct nfc_hci_dev *hdev, u8 *gb, size_t gb_len)
522 memset(atr_req->nfcid3, 0, NFC_NFCID3_MAXSIZE); 510 memset(atr_req->nfcid3, 0, NFC_NFCID3_MAXSIZE);
523 target = hdev->ndev->targets; 511 target = hdev->ndev->targets;
524 512
525 if (target->sensf_res) 513 if (target->sensf_res_len > 0)
526 memcpy(atr_req->nfcid3, target->sensf_res, 514 memcpy(atr_req->nfcid3, target->sensf_res,
527 target->sensf_res_len); 515 target->sensf_res_len);
528 else 516 else
@@ -565,7 +553,7 @@ static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
565 if (err != 0) 553 if (err != 0)
566 return; 554 return;
567 555
568 if (IS_ERR(skb)) 556 if (!skb)
569 return; 557 return;
570 558
571 switch (info->async_cb_type) { 559 switch (info->async_cb_type) {
@@ -615,8 +603,7 @@ static void st21nfca_im_recv_dep_res_cb(void *context, struct sk_buff *skb,
615 } 603 }
616 604
617exit: 605exit:
618 if (err == 0) 606 kfree_skb(skb);
619 kfree_skb(skb);
620} 607}
621 608
622int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb) 609int st21nfca_im_send_dep_req(struct nfc_hci_dev *hdev, struct sk_buff *skb)
diff --git a/drivers/nfc/st21nfcb/i2c.c b/drivers/nfc/st21nfcb/i2c.c
index 8af880ead5db..c5d2427a3db2 100644
--- a/drivers/nfc/st21nfcb/i2c.c
+++ b/drivers/nfc/st21nfcb/i2c.c
@@ -17,24 +17,16 @@
17 17
18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
19 19
20#include <linux/crc-ccitt.h>
21#include <linux/module.h> 20#include <linux/module.h>
22#include <linux/i2c.h> 21#include <linux/i2c.h>
23#include <linux/gpio.h> 22#include <linux/gpio.h>
24#include <linux/of_irq.h> 23#include <linux/of_irq.h>
25#include <linux/of_gpio.h> 24#include <linux/of_gpio.h>
26#include <linux/miscdevice.h>
27#include <linux/interrupt.h> 25#include <linux/interrupt.h>
28#include <linux/delay.h> 26#include <linux/delay.h>
29#include <linux/nfc.h> 27#include <linux/nfc.h>
30#include <linux/firmware.h>
31#include <linux/unaligned/access_ok.h>
32#include <linux/platform_data/st21nfcb.h> 28#include <linux/platform_data/st21nfcb.h>
33 29
34#include <net/nfc/nci.h>
35#include <net/nfc/llc.h>
36#include <net/nfc/nfc.h>
37
38#include "ndlc.h" 30#include "ndlc.h"
39 31
40#define DRIVER_DESC "NCI NFC driver for ST21NFCB" 32#define DRIVER_DESC "NCI NFC driver for ST21NFCB"
@@ -63,12 +55,6 @@ struct st21nfcb_i2c_phy {
63 unsigned int irq_polarity; 55 unsigned int irq_polarity;
64 56
65 int powered; 57 int powered;
66
67 /*
68 * < 0 if hardware error occured (e.g. i2c err)
69 * and prevents normal operation.
70 */
71 int hard_fault;
72}; 58};
73 59
74#define I2C_DUMP_SKB(info, skb) \ 60#define I2C_DUMP_SKB(info, skb) \
@@ -122,8 +108,8 @@ static int st21nfcb_nci_i2c_write(void *phy_id, struct sk_buff *skb)
122 108
123 I2C_DUMP_SKB("st21nfcb_nci_i2c_write", skb); 109 I2C_DUMP_SKB("st21nfcb_nci_i2c_write", skb);
124 110
125 if (phy->hard_fault != 0) 111 if (phy->ndlc->hard_fault != 0)
126 return phy->hard_fault; 112 return phy->ndlc->hard_fault;
127 113
128 r = i2c_master_send(client, skb->data, skb->len); 114 r = i2c_master_send(client, skb->data, skb->len);
129 if (r == -EREMOTEIO) { /* Retry, chip was in standby */ 115 if (r == -EREMOTEIO) { /* Retry, chip was in standby */
@@ -168,11 +154,11 @@ static int st21nfcb_nci_i2c_read(struct st21nfcb_i2c_phy *phy,
168 if (r == -EREMOTEIO) { /* Retry, chip was in standby */ 154 if (r == -EREMOTEIO) { /* Retry, chip was in standby */
169 usleep_range(1000, 4000); 155 usleep_range(1000, 4000);
170 r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE); 156 r = i2c_master_recv(client, buf, ST21NFCB_NCI_I2C_MIN_SIZE);
171 } else if (r != ST21NFCB_NCI_I2C_MIN_SIZE) {
172 nfc_err(&client->dev, "cannot read ndlc & nci header\n");
173 return -EREMOTEIO;
174 } 157 }
175 158
159 if (r != ST21NFCB_NCI_I2C_MIN_SIZE)
160 return -EREMOTEIO;
161
176 len = be16_to_cpu(*(__be16 *) (buf + 2)); 162 len = be16_to_cpu(*(__be16 *) (buf + 2));
177 if (len > ST21NFCB_NCI_I2C_MAX_SIZE) { 163 if (len > ST21NFCB_NCI_I2C_MAX_SIZE) {
178 nfc_err(&client->dev, "invalid frame len\n"); 164 nfc_err(&client->dev, "invalid frame len\n");
@@ -224,7 +210,7 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
224 client = phy->i2c_dev; 210 client = phy->i2c_dev;
225 dev_dbg(&client->dev, "IRQ\n"); 211 dev_dbg(&client->dev, "IRQ\n");
226 212
227 if (phy->hard_fault) 213 if (phy->ndlc->hard_fault)
228 return IRQ_HANDLED; 214 return IRQ_HANDLED;
229 215
230 if (!phy->powered) { 216 if (!phy->powered) {
@@ -233,13 +219,8 @@ static irqreturn_t st21nfcb_nci_irq_thread_fn(int irq, void *phy_id)
233 } 219 }
234 220
235 r = st21nfcb_nci_i2c_read(phy, &skb); 221 r = st21nfcb_nci_i2c_read(phy, &skb);
236 if (r == -EREMOTEIO) { 222 if (r == -EREMOTEIO || r == -ENOMEM || r == -EBADMSG)
237 phy->hard_fault = r;
238 ndlc_recv(phy->ndlc, NULL);
239 return IRQ_HANDLED;
240 } else if (r == -ENOMEM || r == -EBADMSG) {
241 return IRQ_HANDLED; 223 return IRQ_HANDLED;
242 }
243 224
244 ndlc_recv(phy->ndlc, skb); 225 ndlc_recv(phy->ndlc, skb);
245 226
@@ -273,25 +254,18 @@ static int st21nfcb_nci_i2c_of_request_resources(struct i2c_client *client)
273 } 254 }
274 255
275 /* GPIO request and configuration */ 256 /* GPIO request and configuration */
276 r = devm_gpio_request(&client->dev, gpio, "clf_reset"); 257 r = devm_gpio_request_one(&client->dev, gpio,
258 GPIOF_OUT_INIT_HIGH, "clf_reset");
277 if (r) { 259 if (r) {
278 nfc_err(&client->dev, "Failed to request reset pin\n"); 260 nfc_err(&client->dev, "Failed to request reset pin\n");
279 return -ENODEV; 261 return -ENODEV;
280 } 262 }
281
282 r = gpio_direction_output(gpio, 1);
283 if (r) {
284 nfc_err(&client->dev,
285 "Failed to set reset pin direction as output\n");
286 return -ENODEV;
287 }
288 phy->gpio_reset = gpio; 263 phy->gpio_reset = gpio;
289 264
290 /* IRQ */ 265 /* IRQ */
291 r = irq_of_parse_and_map(pp, 0); 266 r = irq_of_parse_and_map(pp, 0);
292 if (r < 0) { 267 if (r < 0) {
293 nfc_err(&client->dev, 268 nfc_err(&client->dev, "Unable to get irq, error: %d\n", r);
294 "Unable to get irq, error: %d\n", r);
295 return r; 269 return r;
296 } 270 }
297 271
@@ -325,32 +299,20 @@ static int st21nfcb_nci_i2c_request_resources(struct i2c_client *client)
325 phy->gpio_reset = pdata->gpio_reset; 299 phy->gpio_reset = pdata->gpio_reset;
326 phy->irq_polarity = pdata->irq_polarity; 300 phy->irq_polarity = pdata->irq_polarity;
327 301
328 r = devm_gpio_request(&client->dev, phy->gpio_irq, "wake_up"); 302 r = devm_gpio_request_one(&client->dev, phy->gpio_irq,
303 GPIOF_IN, "clf_irq");
329 if (r) { 304 if (r) {
330 pr_err("%s : gpio_request failed\n", __FILE__); 305 pr_err("%s : gpio_request failed\n", __FILE__);
331 return -ENODEV; 306 return -ENODEV;
332 } 307 }
333 308
334 r = gpio_direction_input(phy->gpio_irq); 309 r = devm_gpio_request_one(&client->dev,
335 if (r) { 310 phy->gpio_reset, GPIOF_OUT_INIT_HIGH, "clf_reset");
336 pr_err("%s : gpio_direction_input failed\n", __FILE__);
337 return -ENODEV;
338 }
339
340 r = devm_gpio_request(&client->dev,
341 phy->gpio_reset, "clf_reset");
342 if (r) { 311 if (r) {
343 pr_err("%s : reset gpio_request failed\n", __FILE__); 312 pr_err("%s : reset gpio_request failed\n", __FILE__);
344 return -ENODEV; 313 return -ENODEV;
345 } 314 }
346 315
347 r = gpio_direction_output(phy->gpio_reset, 1);
348 if (r) {
349 pr_err("%s : reset gpio_direction_output failed\n",
350 __FILE__);
351 return -ENODEV;
352 }
353
354 /* IRQ */ 316 /* IRQ */
355 irq = gpio_to_irq(phy->gpio_irq); 317 irq = gpio_to_irq(phy->gpio_irq);
356 if (irq < 0) { 318 if (irq < 0) {
@@ -448,7 +410,6 @@ static struct i2c_driver st21nfcb_nci_i2c_driver = {
448 .driver = { 410 .driver = {
449 .owner = THIS_MODULE, 411 .owner = THIS_MODULE,
450 .name = ST21NFCB_NCI_I2C_DRIVER_NAME, 412 .name = ST21NFCB_NCI_I2C_DRIVER_NAME,
451 .owner = THIS_MODULE,
452 .of_match_table = of_match_ptr(of_st21nfcb_i2c_match), 413 .of_match_table = of_match_ptr(of_st21nfcb_i2c_match),
453 }, 414 },
454 .probe = st21nfcb_nci_i2c_probe, 415 .probe = st21nfcb_nci_i2c_probe,
diff --git a/drivers/nfc/st21nfcb/ndlc.c b/drivers/nfc/st21nfcb/ndlc.c
index 83c97c36112b..e7bff8921d11 100644
--- a/drivers/nfc/st21nfcb/ndlc.c
+++ b/drivers/nfc/st21nfcb/ndlc.c
@@ -112,6 +112,10 @@ static void llt_ndlc_send_queue(struct llt_ndlc *ndlc)
112 ndlc->t1_active = true; 112 ndlc->t1_active = true;
113 mod_timer(&ndlc->t1_timer, time_sent + 113 mod_timer(&ndlc->t1_timer, time_sent +
114 msecs_to_jiffies(NDLC_TIMER_T1)); 114 msecs_to_jiffies(NDLC_TIMER_T1));
115 /* start timer t2 for chip availability */
116 ndlc->t2_active = true;
117 mod_timer(&ndlc->t2_timer, time_sent +
118 msecs_to_jiffies(NDLC_TIMER_T2));
115 } 119 }
116} 120}
117 121
@@ -207,7 +211,7 @@ static void llt_ndlc_sm_work(struct work_struct *work)
207 ndlc->t2_active = false; 211 ndlc->t2_active = false;
208 ndlc->t1_active = false; 212 ndlc->t1_active = false;
209 del_timer_sync(&ndlc->t1_timer); 213 del_timer_sync(&ndlc->t1_timer);
210 214 del_timer_sync(&ndlc->t2_timer);
211 ndlc_close(ndlc); 215 ndlc_close(ndlc);
212 ndlc->hard_fault = -EREMOTEIO; 216 ndlc->hard_fault = -EREMOTEIO;
213 } 217 }
diff --git a/drivers/nfc/st21nfcb/ndlc.h b/drivers/nfc/st21nfcb/ndlc.h
index c30a2f0faa5f..b28140e0cd78 100644
--- a/drivers/nfc/st21nfcb/ndlc.h
+++ b/drivers/nfc/st21nfcb/ndlc.h
@@ -42,6 +42,10 @@ struct llt_ndlc {
42 42
43 struct device *dev; 43 struct device *dev;
44 44
45 /*
46 * < 0 if hardware error occured
47 * and prevents normal operation.
48 */
45 int hard_fault; 49 int hard_fault;
46}; 50};
47 51
diff --git a/drivers/nfc/st21nfcb/st21nfcb.c b/drivers/nfc/st21nfcb/st21nfcb.c
index 4d95863e3063..ea63d5877831 100644
--- a/drivers/nfc/st21nfcb/st21nfcb.c
+++ b/drivers/nfc/st21nfcb/st21nfcb.c
@@ -22,10 +22,11 @@
22#include <net/nfc/nci_core.h> 22#include <net/nfc/nci_core.h>
23 23
24#include "st21nfcb.h" 24#include "st21nfcb.h"
25#include "ndlc.h"
26 25
27#define DRIVER_DESC "NCI NFC driver for ST21NFCB" 26#define DRIVER_DESC "NCI NFC driver for ST21NFCB"
28 27
28#define ST21NFCB_NCI1_X_PROPRIETARY_ISO15693 0x83
29
29static int st21nfcb_nci_open(struct nci_dev *ndev) 30static int st21nfcb_nci_open(struct nci_dev *ndev)
30{ 31{
31 struct st21nfcb_nci_info *info = nci_get_drvdata(ndev); 32 struct st21nfcb_nci_info *info = nci_get_drvdata(ndev);
@@ -65,10 +66,18 @@ static int st21nfcb_nci_send(struct nci_dev *ndev, struct sk_buff *skb)
65 return ndlc_send(info->ndlc, skb); 66 return ndlc_send(info->ndlc, skb);
66} 67}
67 68
69static __u32 st21nfcb_nci_get_rfprotocol(struct nci_dev *ndev,
70 __u8 rf_protocol)
71{
72 return rf_protocol == ST21NFCB_NCI1_X_PROPRIETARY_ISO15693 ?
73 NFC_PROTO_ISO15693_MASK : 0;
74}
75
68static struct nci_ops st21nfcb_nci_ops = { 76static struct nci_ops st21nfcb_nci_ops = {
69 .open = st21nfcb_nci_open, 77 .open = st21nfcb_nci_open,
70 .close = st21nfcb_nci_close, 78 .close = st21nfcb_nci_close,
71 .send = st21nfcb_nci_send, 79 .send = st21nfcb_nci_send,
80 .get_rfprotocol = st21nfcb_nci_get_rfprotocol,
72}; 81};
73 82
74int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom, 83int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
@@ -88,29 +97,25 @@ int st21nfcb_nci_probe(struct llt_ndlc *ndlc, int phy_headroom,
88 | NFC_PROTO_FELICA_MASK 97 | NFC_PROTO_FELICA_MASK
89 | NFC_PROTO_ISO14443_MASK 98 | NFC_PROTO_ISO14443_MASK
90 | NFC_PROTO_ISO14443_B_MASK 99 | NFC_PROTO_ISO14443_B_MASK
100 | NFC_PROTO_ISO15693_MASK
91 | NFC_PROTO_NFC_DEP_MASK; 101 | NFC_PROTO_NFC_DEP_MASK;
92 102
93 ndlc->ndev = nci_allocate_device(&st21nfcb_nci_ops, protocols, 103 ndlc->ndev = nci_allocate_device(&st21nfcb_nci_ops, protocols,
94 phy_headroom, phy_tailroom); 104 phy_headroom, phy_tailroom);
95 if (!ndlc->ndev) { 105 if (!ndlc->ndev) {
96 pr_err("Cannot allocate nfc ndev\n"); 106 pr_err("Cannot allocate nfc ndev\n");
97 r = -ENOMEM; 107 return -ENOMEM;
98 goto err_alloc_ndev;
99 } 108 }
100 info->ndlc = ndlc; 109 info->ndlc = ndlc;
101 110
102 nci_set_drvdata(ndlc->ndev, info); 111 nci_set_drvdata(ndlc->ndev, info);
103 112
104 r = nci_register_device(ndlc->ndev); 113 r = nci_register_device(ndlc->ndev);
105 if (r) 114 if (r) {
106 goto err_regdev; 115 pr_err("Cannot register nfc device to nci core\n");
107 116 nci_free_device(ndlc->ndev);
108 return r; 117 }
109err_regdev:
110 nci_free_device(ndlc->ndev);
111 118
112err_alloc_ndev:
113 kfree(info);
114 return r; 119 return r;
115} 120}
116EXPORT_SYMBOL_GPL(st21nfcb_nci_probe); 121EXPORT_SYMBOL_GPL(st21nfcb_nci_probe);
diff --git a/drivers/nfc/st21nfcb/st21nfcb.h b/drivers/nfc/st21nfcb/st21nfcb.h
index 4bbbebb9f34d..ea58a56ad794 100644
--- a/drivers/nfc/st21nfcb/st21nfcb.h
+++ b/drivers/nfc/st21nfcb/st21nfcb.h
@@ -19,8 +19,6 @@
19#ifndef __LOCAL_ST21NFCB_H_ 19#ifndef __LOCAL_ST21NFCB_H_
20#define __LOCAL_ST21NFCB_H_ 20#define __LOCAL_ST21NFCB_H_
21 21
22#include <net/nfc/nci_core.h>
23
24#include "ndlc.h" 22#include "ndlc.h"
25 23
26/* Define private flags: */ 24/* Define private flags: */
diff --git a/drivers/nfc/trf7970a.c b/drivers/nfc/trf7970a.c
index 3b78b031e617..d2ccd2890647 100644
--- a/drivers/nfc/trf7970a.c
+++ b/drivers/nfc/trf7970a.c
@@ -36,7 +36,13 @@
36 * The trf7970a is very timing sensitive and the VIN, EN2, and EN 36 * The trf7970a is very timing sensitive and the VIN, EN2, and EN
37 * pins must asserted in that order and with specific delays in between. 37 * pins must asserted in that order and with specific delays in between.
38 * The delays used in the driver were provided by TI and have been 38 * The delays used in the driver were provided by TI and have been
39 * confirmed to work with this driver. 39 * confirmed to work with this driver. There is a bug with the current
40 * version of the trf7970a that requires that EN2 remain low no matter
41 * what. If it goes high, it will generate an RF field even when in
42 * passive target mode. TI has indicated that the chip will work okay
43 * when EN2 is left low. The 'en2-rf-quirk' device tree property
44 * indicates that trf7970a currently being used has the erratum and
45 * that EN2 must be kept low.
40 * 46 *
41 * Timeouts are implemented using the delayed workqueue kernel facility. 47 * Timeouts are implemented using the delayed workqueue kernel facility.
42 * Timeouts are required so things don't hang when there is no response 48 * Timeouts are required so things don't hang when there is no response
@@ -56,7 +62,7 @@
56 * way to abort a command that's already been sent to the tag is so turn 62 * way to abort a command that's already been sent to the tag is so turn
57 * off power to the tag. If we do that, though, we'd have to go through 63 * off power to the tag. If we do that, though, we'd have to go through
58 * the entire anticollision procedure again but the digital layer doesn't 64 * the entire anticollision procedure again but the digital layer doesn't
59 * support that. So, if an abort is received before trf7970a_in_send_cmd() 65 * support that. So, if an abort is received before trf7970a_send_cmd()
60 * has sent the command to the tag, it simply returns -ECANCELED. If the 66 * has sent the command to the tag, it simply returns -ECANCELED. If the
61 * command has already been sent to the tag, then the driver continues 67 * command has already been sent to the tag, then the driver continues
62 * normally and recieves the response data (or error) but just before 68 * normally and recieves the response data (or error) but just before
@@ -77,6 +83,13 @@
77 * been received and there isn't an error). The delay is 20 ms since delays 83 * been received and there isn't an error). The delay is 20 ms since delays
78 * of ~16 ms have been observed during testing. 84 * of ~16 ms have been observed during testing.
79 * 85 *
86 * When transmitting a frame larger than the FIFO size (127 bytes), the
87 * driver will wait 20 ms for the FIFO to drain past the low-watermark
88 * and generate an interrupt. The low-watermark set to 32 bytes so the
89 * interrupt should fire after 127 - 32 = 95 bytes have been sent. At
90 * the lowest possible bit rate (6.62 kbps for 15693), it will take up
91 * to ~14.35 ms so 20 ms is used for the timeout.
92 *
80 * Type 2 write and sector select commands respond with a 4-bit ACK or NACK. 93 * Type 2 write and sector select commands respond with a 4-bit ACK or NACK.
81 * Having only 4 bits in the FIFO won't normally generate an interrupt so 94 * Having only 4 bits in the FIFO won't normally generate an interrupt so
82 * driver enables the '4_bit_RX' bit of the Special Functions register 1 95 * driver enables the '4_bit_RX' bit of the Special Functions register 1
@@ -99,40 +112,43 @@
99 * Note under Table 1-1 in section 1.6 of 112 * Note under Table 1-1 in section 1.6 of
100 * http://www.ti.com/lit/ug/scbu011/scbu011.pdf, that wait should be at least 113 * http://www.ti.com/lit/ug/scbu011/scbu011.pdf, that wait should be at least
101 * 10 ms for TI Tag-it HF-I tags; however testing has shown that is not long 114 * 10 ms for TI Tag-it HF-I tags; however testing has shown that is not long
102 * enough. For this reason, the driver waits 20 ms which seems to work 115 * enough so 20 ms is used. So the timer is set to 40 ms - 20 ms to drain
116 * up to 127 bytes in the FIFO at the lowest bit rate plus another 20 ms to
117 * ensure the wait is long enough before sending the EOF. This seems to work
103 * reliably. 118 * reliably.
104 */ 119 */
105 120
106#define TRF7970A_SUPPORTED_PROTOCOLS \ 121#define TRF7970A_SUPPORTED_PROTOCOLS \
107 (NFC_PROTO_MIFARE_MASK | NFC_PROTO_ISO14443_MASK | \ 122 (NFC_PROTO_MIFARE_MASK | NFC_PROTO_ISO14443_MASK | \
108 NFC_PROTO_ISO14443_B_MASK | NFC_PROTO_FELICA_MASK | \ 123 NFC_PROTO_ISO14443_B_MASK | NFC_PROTO_FELICA_MASK | \
109 NFC_PROTO_ISO15693_MASK) 124 NFC_PROTO_ISO15693_MASK | NFC_PROTO_NFC_DEP_MASK)
110 125
111#define TRF7970A_AUTOSUSPEND_DELAY 30000 /* 30 seconds */ 126#define TRF7970A_AUTOSUSPEND_DELAY 30000 /* 30 seconds */
112 127
113/* TX data must be prefixed with a FIFO reset cmd, a cmd that depends
114 * on what the current framing is, the address of the TX length byte 1
115 * register (0x1d), and the 2 byte length of the data to be transmitted.
116 * That totals 5 bytes.
117 */
118#define TRF7970A_TX_SKB_HEADROOM 5
119
120#define TRF7970A_RX_SKB_ALLOC_SIZE 256 128#define TRF7970A_RX_SKB_ALLOC_SIZE 256
121 129
122#define TRF7970A_FIFO_SIZE 128 130#define TRF7970A_FIFO_SIZE 127
123 131
124/* TX length is 3 nibbles long ==> 4KB - 1 bytes max */ 132/* TX length is 3 nibbles long ==> 4KB - 1 bytes max */
125#define TRF7970A_TX_MAX (4096 - 1) 133#define TRF7970A_TX_MAX (4096 - 1)
126 134
135#define TRF7970A_WAIT_FOR_TX_IRQ 20
127#define TRF7970A_WAIT_FOR_RX_DATA_TIMEOUT 20 136#define TRF7970A_WAIT_FOR_RX_DATA_TIMEOUT 20
128#define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 3 137#define TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT 20
129#define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 20 138#define TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF 40
139
140/* Guard times for various RF technologies (in us) */
141#define TRF7970A_GUARD_TIME_NFCA 5000
142#define TRF7970A_GUARD_TIME_NFCB 5000
143#define TRF7970A_GUARD_TIME_NFCF 20000
144#define TRF7970A_GUARD_TIME_15693 1000
130 145
131/* Quirks */ 146/* Quirks */
132/* Erratum: When reading IRQ Status register on trf7970a, we must issue a 147/* Erratum: When reading IRQ Status register on trf7970a, we must issue a
133 * read continuous command for IRQ Status and Collision Position registers. 148 * read continuous command for IRQ Status and Collision Position registers.
134 */ 149 */
135#define TRF7970A_QUIRK_IRQ_STATUS_READ_ERRATA BIT(0) 150#define TRF7970A_QUIRK_IRQ_STATUS_READ BIT(0)
151#define TRF7970A_QUIRK_EN2_MUST_STAY_LOW BIT(1)
136 152
137/* Direct commands */ 153/* Direct commands */
138#define TRF7970A_CMD_IDLE 0x00 154#define TRF7970A_CMD_IDLE 0x00
@@ -149,8 +165,8 @@
149#define TRF7970A_CMD_CLOSE_SLOT 0x15 165#define TRF7970A_CMD_CLOSE_SLOT 0x15
150#define TRF7970A_CMD_BLOCK_RX 0x16 166#define TRF7970A_CMD_BLOCK_RX 0x16
151#define TRF7970A_CMD_ENABLE_RX 0x17 167#define TRF7970A_CMD_ENABLE_RX 0x17
152#define TRF7970A_CMD_TEST_EXT_RF 0x18 168#define TRF7970A_CMD_TEST_INT_RF 0x18
153#define TRF7970A_CMD_TEST_INT_RF 0x19 169#define TRF7970A_CMD_TEST_EXT_RF 0x19
154#define TRF7970A_CMD_RX_GAIN_ADJUST 0x1a 170#define TRF7970A_CMD_RX_GAIN_ADJUST 0x1a
155 171
156/* Bits determining whether its a direct command or register R/W, 172/* Bits determining whether its a direct command or register R/W,
@@ -224,6 +240,15 @@
224#define TRF7970A_ISO_CTRL_14443B_848 0x0f 240#define TRF7970A_ISO_CTRL_14443B_848 0x0f
225#define TRF7970A_ISO_CTRL_FELICA_212 0x1a 241#define TRF7970A_ISO_CTRL_FELICA_212 0x1a
226#define TRF7970A_ISO_CTRL_FELICA_424 0x1b 242#define TRF7970A_ISO_CTRL_FELICA_424 0x1b
243#define TRF7970A_ISO_CTRL_NFC_NFCA_106 0x01
244#define TRF7970A_ISO_CTRL_NFC_NFCF_212 0x02
245#define TRF7970A_ISO_CTRL_NFC_NFCF_424 0x03
246#define TRF7970A_ISO_CTRL_NFC_CE_14443A 0x00
247#define TRF7970A_ISO_CTRL_NFC_CE_14443B 0x01
248#define TRF7970A_ISO_CTRL_NFC_CE BIT(2)
249#define TRF7970A_ISO_CTRL_NFC_ACTIVE BIT(3)
250#define TRF7970A_ISO_CTRL_NFC_INITIATOR BIT(4)
251#define TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE BIT(5)
227#define TRF7970A_ISO_CTRL_RFID BIT(5) 252#define TRF7970A_ISO_CTRL_RFID BIT(5)
228#define TRF7970A_ISO_CTRL_DIR_MODE BIT(6) 253#define TRF7970A_ISO_CTRL_DIR_MODE BIT(6)
229#define TRF7970A_ISO_CTRL_RX_CRC_N BIT(7) /* true == No CRC */ 254#define TRF7970A_ISO_CTRL_RX_CRC_N BIT(7) /* true == No CRC */
@@ -249,12 +274,32 @@
249#define TRF7970A_MODULATOR_EN_OOK BIT(6) 274#define TRF7970A_MODULATOR_EN_OOK BIT(6)
250#define TRF7970A_MODULATOR_27MHZ BIT(7) 275#define TRF7970A_MODULATOR_27MHZ BIT(7)
251 276
277#define TRF7970A_RX_SPECIAL_SETTINGS_NO_LIM BIT(0)
278#define TRF7970A_RX_SPECIAL_SETTINGS_AGCR BIT(1)
279#define TRF7970A_RX_SPECIAL_SETTINGS_GD_0DB (0x0 << 2)
280#define TRF7970A_RX_SPECIAL_SETTINGS_GD_5DB (0x1 << 2)
281#define TRF7970A_RX_SPECIAL_SETTINGS_GD_10DB (0x2 << 2)
282#define TRF7970A_RX_SPECIAL_SETTINGS_GD_15DB (0x3 << 2)
283#define TRF7970A_RX_SPECIAL_SETTINGS_HBT BIT(4)
284#define TRF7970A_RX_SPECIAL_SETTINGS_M848 BIT(5)
285#define TRF7970A_RX_SPECIAL_SETTINGS_C424 BIT(6)
286#define TRF7970A_RX_SPECIAL_SETTINGS_C212 BIT(7)
287
288#define TRF7970A_REG_IO_CTRL_VRS(v) ((v) & 0x07)
289#define TRF7970A_REG_IO_CTRL_IO_LOW BIT(5)
290#define TRF7970A_REG_IO_CTRL_EN_EXT_PA BIT(6)
291#define TRF7970A_REG_IO_CTRL_AUTO_REG BIT(7)
292
252/* IRQ Status Register Bits */ 293/* IRQ Status Register Bits */
253#define TRF7970A_IRQ_STATUS_NORESP BIT(0) /* ISO15693 only */ 294#define TRF7970A_IRQ_STATUS_NORESP BIT(0) /* ISO15693 only */
295#define TRF7970A_IRQ_STATUS_NFC_COL_ERROR BIT(0)
254#define TRF7970A_IRQ_STATUS_COL BIT(1) 296#define TRF7970A_IRQ_STATUS_COL BIT(1)
255#define TRF7970A_IRQ_STATUS_FRAMING_EOF_ERROR BIT(2) 297#define TRF7970A_IRQ_STATUS_FRAMING_EOF_ERROR BIT(2)
298#define TRF7970A_IRQ_STATUS_NFC_RF BIT(2)
256#define TRF7970A_IRQ_STATUS_PARITY_ERROR BIT(3) 299#define TRF7970A_IRQ_STATUS_PARITY_ERROR BIT(3)
300#define TRF7970A_IRQ_STATUS_NFC_SDD BIT(3)
257#define TRF7970A_IRQ_STATUS_CRC_ERROR BIT(4) 301#define TRF7970A_IRQ_STATUS_CRC_ERROR BIT(4)
302#define TRF7970A_IRQ_STATUS_NFC_PROTO_ERROR BIT(4)
258#define TRF7970A_IRQ_STATUS_FIFO BIT(5) 303#define TRF7970A_IRQ_STATUS_FIFO BIT(5)
259#define TRF7970A_IRQ_STATUS_SRX BIT(6) 304#define TRF7970A_IRQ_STATUS_SRX BIT(6)
260#define TRF7970A_IRQ_STATUS_TX BIT(7) 305#define TRF7970A_IRQ_STATUS_TX BIT(7)
@@ -265,6 +310,10 @@
265 TRF7970A_IRQ_STATUS_PARITY_ERROR | \ 310 TRF7970A_IRQ_STATUS_PARITY_ERROR | \
266 TRF7970A_IRQ_STATUS_CRC_ERROR) 311 TRF7970A_IRQ_STATUS_CRC_ERROR)
267 312
313#define TRF7970A_RSSI_OSC_STATUS_RSSI_MASK (BIT(2) | BIT(1) | BIT(0))
314#define TRF7970A_RSSI_OSC_STATUS_RSSI_X_MASK (BIT(5) | BIT(4) | BIT(3))
315#define TRF7970A_RSSI_OSC_STATUS_RSSI_OSC_OK BIT(6)
316
268#define TRF7970A_SPECIAL_FCN_REG1_COL_7_6 BIT(0) 317#define TRF7970A_SPECIAL_FCN_REG1_COL_7_6 BIT(0)
269#define TRF7970A_SPECIAL_FCN_REG1_14_ANTICOLL BIT(1) 318#define TRF7970A_SPECIAL_FCN_REG1_14_ANTICOLL BIT(1)
270#define TRF7970A_SPECIAL_FCN_REG1_4_BIT_RX BIT(2) 319#define TRF7970A_SPECIAL_FCN_REG1_4_BIT_RX BIT(2)
@@ -281,6 +330,49 @@
281#define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_16 0x2 330#define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_16 0x2
282#define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32 0x3 331#define TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32 0x3
283 332
333#define TRF7970A_NFC_LOW_FIELD_LEVEL_RFDET(v) ((v) & 0x07)
334#define TRF7970A_NFC_LOW_FIELD_LEVEL_CLEX_DIS BIT(7)
335
336#define TRF7970A_NFC_TARGET_LEVEL_RFDET(v) ((v) & 0x07)
337#define TRF7970A_NFC_TARGET_LEVEL_HI_RF BIT(3)
338#define TRF7970A_NFC_TARGET_LEVEL_SDD_EN BIT(3)
339#define TRF7970A_NFC_TARGET_LEVEL_LD_S_4BYTES (0x0 << 6)
340#define TRF7970A_NFC_TARGET_LEVEL_LD_S_7BYTES (0x1 << 6)
341#define TRF7970A_NFC_TARGET_LEVEL_LD_S_10BYTES (0x2 << 6)
342
343#define TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_106 BIT(0)
344#define TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_212 BIT(1)
345#define TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_424 (BIT(0) | BIT(1))
346#define TRF79070A_NFC_TARGET_PROTOCOL_PAS_14443B BIT(2)
347#define TRF79070A_NFC_TARGET_PROTOCOL_PAS_106 BIT(3)
348#define TRF79070A_NFC_TARGET_PROTOCOL_FELICA BIT(4)
349#define TRF79070A_NFC_TARGET_PROTOCOL_RF_L BIT(6)
350#define TRF79070A_NFC_TARGET_PROTOCOL_RF_H BIT(7)
351
352#define TRF79070A_NFC_TARGET_PROTOCOL_106A \
353 (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
354 TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
355 TRF79070A_NFC_TARGET_PROTOCOL_PAS_106 | \
356 TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_106)
357
358#define TRF79070A_NFC_TARGET_PROTOCOL_106B \
359 (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
360 TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
361 TRF79070A_NFC_TARGET_PROTOCOL_PAS_14443B | \
362 TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_106)
363
364#define TRF79070A_NFC_TARGET_PROTOCOL_212F \
365 (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
366 TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
367 TRF79070A_NFC_TARGET_PROTOCOL_FELICA | \
368 TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_212)
369
370#define TRF79070A_NFC_TARGET_PROTOCOL_424F \
371 (TRF79070A_NFC_TARGET_PROTOCOL_RF_H | \
372 TRF79070A_NFC_TARGET_PROTOCOL_RF_L | \
373 TRF79070A_NFC_TARGET_PROTOCOL_FELICA | \
374 TRF79070A_NFC_TARGET_PROTOCOL_NFCBR_424)
375
284#define TRF7970A_FIFO_STATUS_OVERFLOW BIT(7) 376#define TRF7970A_FIFO_STATUS_OVERFLOW BIT(7)
285 377
286/* NFC (ISO/IEC 14443A) Type 2 Tag commands */ 378/* NFC (ISO/IEC 14443A) Type 2 Tag commands */
@@ -317,13 +409,16 @@
317 (ISO15693_REQ_FLAG_SUB_CARRIER | ISO15693_REQ_FLAG_DATA_RATE) 409 (ISO15693_REQ_FLAG_SUB_CARRIER | ISO15693_REQ_FLAG_DATA_RATE)
318 410
319enum trf7970a_state { 411enum trf7970a_state {
320 TRF7970A_ST_OFF, 412 TRF7970A_ST_PWR_OFF,
413 TRF7970A_ST_RF_OFF,
321 TRF7970A_ST_IDLE, 414 TRF7970A_ST_IDLE,
322 TRF7970A_ST_IDLE_RX_BLOCKED, 415 TRF7970A_ST_IDLE_RX_BLOCKED,
323 TRF7970A_ST_WAIT_FOR_TX_FIFO, 416 TRF7970A_ST_WAIT_FOR_TX_FIFO,
324 TRF7970A_ST_WAIT_FOR_RX_DATA, 417 TRF7970A_ST_WAIT_FOR_RX_DATA,
325 TRF7970A_ST_WAIT_FOR_RX_DATA_CONT, 418 TRF7970A_ST_WAIT_FOR_RX_DATA_CONT,
326 TRF7970A_ST_WAIT_TO_ISSUE_EOF, 419 TRF7970A_ST_WAIT_TO_ISSUE_EOF,
420 TRF7970A_ST_LISTENING,
421 TRF7970A_ST_LISTENING_MD,
327 TRF7970A_ST_MAX 422 TRF7970A_ST_MAX
328}; 423};
329 424
@@ -334,6 +429,7 @@ struct trf7970a {
334 struct regulator *regulator; 429 struct regulator *regulator;
335 struct nfc_digital_dev *ddev; 430 struct nfc_digital_dev *ddev;
336 u32 quirks; 431 u32 quirks;
432 bool is_initiator;
337 bool aborting; 433 bool aborting;
338 struct sk_buff *tx_skb; 434 struct sk_buff *tx_skb;
339 struct sk_buff *rx_skb; 435 struct sk_buff *rx_skb;
@@ -344,8 +440,10 @@ struct trf7970a {
344 u8 iso_ctrl_tech; 440 u8 iso_ctrl_tech;
345 u8 modulator_sys_clk_ctrl; 441 u8 modulator_sys_clk_ctrl;
346 u8 special_fcn_reg1; 442 u8 special_fcn_reg1;
443 unsigned int guard_time;
347 int technology; 444 int technology;
348 int framing; 445 int framing;
446 u8 md_rf_tech;
349 u8 tx_cmd; 447 u8 tx_cmd;
350 bool issue_eof; 448 bool issue_eof;
351 int en2_gpio; 449 int en2_gpio;
@@ -386,15 +484,28 @@ static int trf7970a_read(struct trf7970a *trf, u8 reg, u8 *val)
386 return ret; 484 return ret;
387} 485}
388 486
389static int trf7970a_read_cont(struct trf7970a *trf, u8 reg, 487static int trf7970a_read_cont(struct trf7970a *trf, u8 reg, u8 *buf, size_t len)
390 u8 *buf, size_t len)
391{ 488{
392 u8 addr = reg | TRF7970A_CMD_BIT_RW | TRF7970A_CMD_BIT_CONTINUOUS; 489 u8 addr = reg | TRF7970A_CMD_BIT_RW | TRF7970A_CMD_BIT_CONTINUOUS;
490 struct spi_transfer t[2];
491 struct spi_message m;
393 int ret; 492 int ret;
394 493
395 dev_dbg(trf->dev, "read_cont(0x%x, %zd)\n", addr, len); 494 dev_dbg(trf->dev, "read_cont(0x%x, %zd)\n", addr, len);
396 495
397 ret = spi_write_then_read(trf->spi, &addr, 1, buf, len); 496 spi_message_init(&m);
497
498 memset(&t, 0, sizeof(t));
499
500 t[0].tx_buf = &addr;
501 t[0].len = sizeof(addr);
502 spi_message_add_tail(&t[0], &m);
503
504 t[1].rx_buf = buf;
505 t[1].len = len;
506 spi_message_add_tail(&t[1], &m);
507
508 ret = spi_sync(trf->spi, &m);
398 if (ret) 509 if (ret)
399 dev_err(trf->dev, "%s - addr: 0x%x, ret: %d\n", __func__, addr, 510 dev_err(trf->dev, "%s - addr: 0x%x, ret: %d\n", __func__, addr,
400 ret); 511 ret);
@@ -424,7 +535,7 @@ static int trf7970a_read_irqstatus(struct trf7970a *trf, u8 *status)
424 535
425 addr = TRF7970A_IRQ_STATUS | TRF7970A_CMD_BIT_RW; 536 addr = TRF7970A_IRQ_STATUS | TRF7970A_CMD_BIT_RW;
426 537
427 if (trf->quirks & TRF7970A_QUIRK_IRQ_STATUS_READ_ERRATA) { 538 if (trf->quirks & TRF7970A_QUIRK_IRQ_STATUS_READ) {
428 addr |= TRF7970A_CMD_BIT_CONTINUOUS; 539 addr |= TRF7970A_CMD_BIT_CONTINUOUS;
429 ret = spi_write_then_read(trf->spi, &addr, 1, buf, 2); 540 ret = spi_write_then_read(trf->spi, &addr, 1, buf, 2);
430 } else { 541 } else {
@@ -440,10 +551,60 @@ static int trf7970a_read_irqstatus(struct trf7970a *trf, u8 *status)
440 return ret; 551 return ret;
441} 552}
442 553
443static void trf7970a_send_upstream(struct trf7970a *trf) 554static int trf7970a_read_target_proto(struct trf7970a *trf, u8 *target_proto)
444{ 555{
445 u8 rssi; 556 int ret;
557 u8 buf[2];
558 u8 addr;
446 559
560 addr = TRF79070A_NFC_TARGET_PROTOCOL | TRF7970A_CMD_BIT_RW |
561 TRF7970A_CMD_BIT_CONTINUOUS;
562
563 ret = spi_write_then_read(trf->spi, &addr, 1, buf, 2);
564 if (ret)
565 dev_err(trf->dev, "%s - target_proto: Read failed: %d\n",
566 __func__, ret);
567 else
568 *target_proto = buf[0];
569
570 return ret;
571}
572
573static int trf7970a_mode_detect(struct trf7970a *trf, u8 *rf_tech)
574{
575 int ret;
576 u8 target_proto, tech;
577
578 ret = trf7970a_read_target_proto(trf, &target_proto);
579 if (ret)
580 return ret;
581
582 switch (target_proto) {
583 case TRF79070A_NFC_TARGET_PROTOCOL_106A:
584 tech = NFC_DIGITAL_RF_TECH_106A;
585 break;
586 case TRF79070A_NFC_TARGET_PROTOCOL_106B:
587 tech = NFC_DIGITAL_RF_TECH_106B;
588 break;
589 case TRF79070A_NFC_TARGET_PROTOCOL_212F:
590 tech = NFC_DIGITAL_RF_TECH_212F;
591 break;
592 case TRF79070A_NFC_TARGET_PROTOCOL_424F:
593 tech = NFC_DIGITAL_RF_TECH_424F;
594 break;
595 default:
596 dev_dbg(trf->dev, "%s - mode_detect: target_proto: 0x%x\n",
597 __func__, target_proto);
598 return -EIO;
599 }
600
601 *rf_tech = tech;
602
603 return ret;
604}
605
606static void trf7970a_send_upstream(struct trf7970a *trf)
607{
447 dev_kfree_skb_any(trf->tx_skb); 608 dev_kfree_skb_any(trf->tx_skb);
448 trf->tx_skb = NULL; 609 trf->tx_skb = NULL;
449 610
@@ -452,13 +613,6 @@ static void trf7970a_send_upstream(struct trf7970a *trf)
452 16, 1, trf->rx_skb->data, trf->rx_skb->len, 613 16, 1, trf->rx_skb->data, trf->rx_skb->len,
453 false); 614 false);
454 615
455 /* According to the manual it is "good form" to reset the fifo and
456 * read the RSSI levels & oscillator status register here. It doesn't
457 * explain why.
458 */
459 trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET);
460 trf7970a_read(trf, TRF7970A_RSSI_OSC_STATUS, &rssi);
461
462 trf->state = TRF7970A_ST_IDLE; 616 trf->state = TRF7970A_ST_IDLE;
463 617
464 if (trf->aborting) { 618 if (trf->aborting) {
@@ -481,6 +635,8 @@ static void trf7970a_send_err_upstream(struct trf7970a *trf, int errno)
481{ 635{
482 dev_dbg(trf->dev, "Error - state: %d, errno: %d\n", trf->state, errno); 636 dev_dbg(trf->dev, "Error - state: %d, errno: %d\n", trf->state, errno);
483 637
638 cancel_delayed_work(&trf->timeout_work);
639
484 kfree_skb(trf->rx_skb); 640 kfree_skb(trf->rx_skb);
485 trf->rx_skb = ERR_PTR(errno); 641 trf->rx_skb = ERR_PTR(errno);
486 642
@@ -488,15 +644,29 @@ static void trf7970a_send_err_upstream(struct trf7970a *trf, int errno)
488} 644}
489 645
490static int trf7970a_transmit(struct trf7970a *trf, struct sk_buff *skb, 646static int trf7970a_transmit(struct trf7970a *trf, struct sk_buff *skb,
491 unsigned int len) 647 unsigned int len, u8 *prefix, unsigned int prefix_len)
492{ 648{
649 struct spi_transfer t[2];
650 struct spi_message m;
493 unsigned int timeout; 651 unsigned int timeout;
494 int ret; 652 int ret;
495 653
496 print_hex_dump_debug("trf7970a tx data: ", DUMP_PREFIX_NONE, 654 print_hex_dump_debug("trf7970a tx data: ", DUMP_PREFIX_NONE,
497 16, 1, skb->data, len, false); 655 16, 1, skb->data, len, false);
498 656
499 ret = spi_write(trf->spi, skb->data, len); 657 spi_message_init(&m);
658
659 memset(&t, 0, sizeof(t));
660
661 t[0].tx_buf = prefix;
662 t[0].len = prefix_len;
663 spi_message_add_tail(&t[0], &m);
664
665 t[1].tx_buf = skb->data;
666 t[1].len = len;
667 spi_message_add_tail(&t[1], &m);
668
669 ret = spi_sync(trf->spi, &m);
500 if (ret) { 670 if (ret) {
501 dev_err(trf->dev, "%s - Can't send tx data: %d\n", __func__, 671 dev_err(trf->dev, "%s - Can't send tx data: %d\n", __func__,
502 ret); 672 ret);
@@ -514,7 +684,11 @@ static int trf7970a_transmit(struct trf7970a *trf, struct sk_buff *skb,
514 timeout = TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF; 684 timeout = TRF7970A_WAIT_TO_ISSUE_ISO15693_EOF;
515 } else { 685 } else {
516 trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA; 686 trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA;
517 timeout = trf->timeout; 687
688 if (!trf->timeout)
689 timeout = TRF7970A_WAIT_FOR_TX_IRQ;
690 else
691 timeout = trf->timeout;
518 } 692 }
519 } 693 }
520 694
@@ -532,6 +706,7 @@ static void trf7970a_fill_fifo(struct trf7970a *trf)
532 unsigned int len; 706 unsigned int len;
533 int ret; 707 int ret;
534 u8 fifo_bytes; 708 u8 fifo_bytes;
709 u8 prefix;
535 710
536 ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS, &fifo_bytes); 711 ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS, &fifo_bytes);
537 if (ret) { 712 if (ret) {
@@ -541,18 +716,21 @@ static void trf7970a_fill_fifo(struct trf7970a *trf)
541 716
542 dev_dbg(trf->dev, "Filling FIFO - fifo_bytes: 0x%x\n", fifo_bytes); 717 dev_dbg(trf->dev, "Filling FIFO - fifo_bytes: 0x%x\n", fifo_bytes);
543 718
544 if (fifo_bytes & TRF7970A_FIFO_STATUS_OVERFLOW) { 719 fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
545 dev_err(trf->dev, "%s - fifo overflow: 0x%x\n", __func__,
546 fifo_bytes);
547 trf7970a_send_err_upstream(trf, -EIO);
548 return;
549 }
550 720
551 /* Calculate how much more data can be written to the fifo */ 721 /* Calculate how much more data can be written to the fifo */
552 len = TRF7970A_FIFO_SIZE - fifo_bytes; 722 len = TRF7970A_FIFO_SIZE - fifo_bytes;
723 if (!len) {
724 schedule_delayed_work(&trf->timeout_work,
725 msecs_to_jiffies(TRF7970A_WAIT_FOR_FIFO_DRAIN_TIMEOUT));
726 return;
727 }
728
553 len = min(skb->len, len); 729 len = min(skb->len, len);
554 730
555 ret = trf7970a_transmit(trf, skb, len); 731 prefix = TRF7970A_CMD_BIT_CONTINUOUS | TRF7970A_FIFO_IO_REGISTER;
732
733 ret = trf7970a_transmit(trf, skb, len, &prefix, sizeof(prefix));
556 if (ret) 734 if (ret)
557 trf7970a_send_err_upstream(trf, ret); 735 trf7970a_send_err_upstream(trf, ret);
558} 736}
@@ -576,16 +754,11 @@ static void trf7970a_drain_fifo(struct trf7970a *trf, u8 status)
576 754
577 dev_dbg(trf->dev, "Draining FIFO - fifo_bytes: 0x%x\n", fifo_bytes); 755 dev_dbg(trf->dev, "Draining FIFO - fifo_bytes: 0x%x\n", fifo_bytes);
578 756
757 fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
758
579 if (!fifo_bytes) 759 if (!fifo_bytes)
580 goto no_rx_data; 760 goto no_rx_data;
581 761
582 if (fifo_bytes & TRF7970A_FIFO_STATUS_OVERFLOW) {
583 dev_err(trf->dev, "%s - fifo overflow: 0x%x\n", __func__,
584 fifo_bytes);
585 trf7970a_send_err_upstream(trf, -EIO);
586 return;
587 }
588
589 if (fifo_bytes > skb_tailroom(skb)) { 762 if (fifo_bytes > skb_tailroom(skb)) {
590 skb = skb_copy_expand(skb, skb_headroom(skb), 763 skb = skb_copy_expand(skb, skb_headroom(skb),
591 max_t(int, fifo_bytes, 764 max_t(int, fifo_bytes,
@@ -615,6 +788,21 @@ static void trf7970a_drain_fifo(struct trf7970a *trf, u8 status)
615 status = TRF7970A_IRQ_STATUS_SRX; 788 status = TRF7970A_IRQ_STATUS_SRX;
616 } else { 789 } else {
617 trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA_CONT; 790 trf->state = TRF7970A_ST_WAIT_FOR_RX_DATA_CONT;
791
792 ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS, &fifo_bytes);
793 if (ret) {
794 trf7970a_send_err_upstream(trf, ret);
795 return;
796 }
797
798 fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
799
800 /* If there are bytes in the FIFO, set status to '0' so
801 * the if stmt below doesn't fire and the driver will wait
802 * for the trf7970a to generate another RX interrupt.
803 */
804 if (fifo_bytes)
805 status = 0;
618 } 806 }
619 807
620no_rx_data: 808no_rx_data:
@@ -634,11 +822,11 @@ static irqreturn_t trf7970a_irq(int irq, void *dev_id)
634{ 822{
635 struct trf7970a *trf = dev_id; 823 struct trf7970a *trf = dev_id;
636 int ret; 824 int ret;
637 u8 status; 825 u8 status, fifo_bytes, iso_ctrl;
638 826
639 mutex_lock(&trf->lock); 827 mutex_lock(&trf->lock);
640 828
641 if (trf->state == TRF7970A_ST_OFF) { 829 if (trf->state == TRF7970A_ST_RF_OFF) {
642 mutex_unlock(&trf->lock); 830 mutex_unlock(&trf->lock);
643 return IRQ_NONE; 831 return IRQ_NONE;
644 } 832 }
@@ -660,12 +848,12 @@ static irqreturn_t trf7970a_irq(int irq, void *dev_id)
660 switch (trf->state) { 848 switch (trf->state) {
661 case TRF7970A_ST_IDLE: 849 case TRF7970A_ST_IDLE:
662 case TRF7970A_ST_IDLE_RX_BLOCKED: 850 case TRF7970A_ST_IDLE_RX_BLOCKED:
663 /* If getting interrupts caused by RF noise, turn off the 851 /* If initiator and getting interrupts caused by RF noise,
664 * receiver to avoid unnecessary interrupts. It will be 852 * turn off the receiver to avoid unnecessary interrupts.
665 * turned back on in trf7970a_in_send_cmd() when the next 853 * It will be turned back on in trf7970a_send_cmd() when
666 * command is issued. 854 * the next command is issued.
667 */ 855 */
668 if (status & TRF7970A_IRQ_STATUS_ERROR) { 856 if (trf->is_initiator && (status & TRF7970A_IRQ_STATUS_ERROR)) {
669 trf7970a_cmd(trf, TRF7970A_CMD_BLOCK_RX); 857 trf7970a_cmd(trf, TRF7970A_CMD_BLOCK_RX);
670 trf->state = TRF7970A_ST_IDLE_RX_BLOCKED; 858 trf->state = TRF7970A_ST_IDLE_RX_BLOCKED;
671 } 859 }
@@ -687,8 +875,68 @@ static irqreturn_t trf7970a_irq(int irq, void *dev_id)
687 trf->ignore_timeout = 875 trf->ignore_timeout =
688 !cancel_delayed_work(&trf->timeout_work); 876 !cancel_delayed_work(&trf->timeout_work);
689 trf7970a_drain_fifo(trf, status); 877 trf7970a_drain_fifo(trf, status);
690 } else if (status == TRF7970A_IRQ_STATUS_TX) { 878 } else if (status & TRF7970A_IRQ_STATUS_FIFO) {
879 ret = trf7970a_read(trf, TRF7970A_FIFO_STATUS,
880 &fifo_bytes);
881
882 fifo_bytes &= ~TRF7970A_FIFO_STATUS_OVERFLOW;
883
884 if (ret)
885 trf7970a_send_err_upstream(trf, ret);
886 else if (!fifo_bytes)
887 trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET);
888 } else if ((status == TRF7970A_IRQ_STATUS_TX) ||
889 (!trf->is_initiator &&
890 (status == (TRF7970A_IRQ_STATUS_TX |
891 TRF7970A_IRQ_STATUS_NFC_RF)))) {
691 trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET); 892 trf7970a_cmd(trf, TRF7970A_CMD_FIFO_RESET);
893
894 if (!trf->timeout) {
895 trf->ignore_timeout = !cancel_delayed_work(
896 &trf->timeout_work);
897 trf->rx_skb = ERR_PTR(0);
898 trf7970a_send_upstream(trf);
899 break;
900 }
901
902 if (trf->is_initiator)
903 break;
904
905 iso_ctrl = trf->iso_ctrl;
906
907 switch (trf->framing) {
908 case NFC_DIGITAL_FRAMING_NFCA_STANDARD:
909 trf->tx_cmd = TRF7970A_CMD_TRANSMIT_NO_CRC;
910 iso_ctrl |= TRF7970A_ISO_CTRL_RX_CRC_N;
911 trf->iso_ctrl = 0xff; /* Force ISO_CTRL write */
912 break;
913 case NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A:
914 trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
915 iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
916 trf->iso_ctrl = 0xff; /* Force ISO_CTRL write */
917 break;
918 case NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE:
919 ret = trf7970a_write(trf,
920 TRF7970A_SPECIAL_FCN_REG1,
921 TRF7970A_SPECIAL_FCN_REG1_14_ANTICOLL);
922 if (ret)
923 goto err_unlock_exit;
924
925 trf->special_fcn_reg1 =
926 TRF7970A_SPECIAL_FCN_REG1_14_ANTICOLL;
927 break;
928 default:
929 break;
930 }
931
932 if (iso_ctrl != trf->iso_ctrl) {
933 ret = trf7970a_write(trf, TRF7970A_ISO_CTRL,
934 iso_ctrl);
935 if (ret)
936 goto err_unlock_exit;
937
938 trf->iso_ctrl = iso_ctrl;
939 }
692 } else { 940 } else {
693 trf7970a_send_err_upstream(trf, -EIO); 941 trf7970a_send_err_upstream(trf, -EIO);
694 } 942 }
@@ -697,11 +945,37 @@ static irqreturn_t trf7970a_irq(int irq, void *dev_id)
697 if (status != TRF7970A_IRQ_STATUS_TX) 945 if (status != TRF7970A_IRQ_STATUS_TX)
698 trf7970a_send_err_upstream(trf, -EIO); 946 trf7970a_send_err_upstream(trf, -EIO);
699 break; 947 break;
948 case TRF7970A_ST_LISTENING:
949 if (status & TRF7970A_IRQ_STATUS_SRX) {
950 trf->ignore_timeout =
951 !cancel_delayed_work(&trf->timeout_work);
952 trf7970a_drain_fifo(trf, status);
953 } else if (!(status & TRF7970A_IRQ_STATUS_NFC_RF)) {
954 trf7970a_send_err_upstream(trf, -EIO);
955 }
956 break;
957 case TRF7970A_ST_LISTENING_MD:
958 if (status & TRF7970A_IRQ_STATUS_SRX) {
959 trf->ignore_timeout =
960 !cancel_delayed_work(&trf->timeout_work);
961
962 ret = trf7970a_mode_detect(trf, &trf->md_rf_tech);
963 if (ret) {
964 trf7970a_send_err_upstream(trf, ret);
965 } else {
966 trf->state = TRF7970A_ST_LISTENING;
967 trf7970a_drain_fifo(trf, status);
968 }
969 } else if (!(status & TRF7970A_IRQ_STATUS_NFC_RF)) {
970 trf7970a_send_err_upstream(trf, -EIO);
971 }
972 break;
700 default: 973 default:
701 dev_err(trf->dev, "%s - Driver in invalid state: %d\n", 974 dev_err(trf->dev, "%s - Driver in invalid state: %d\n",
702 __func__, trf->state); 975 __func__, trf->state);
703 } 976 }
704 977
978err_unlock_exit:
705 mutex_unlock(&trf->lock); 979 mutex_unlock(&trf->lock);
706 return IRQ_HANDLED; 980 return IRQ_HANDLED;
707} 981}
@@ -742,7 +1016,7 @@ static void trf7970a_timeout_work_handler(struct work_struct *work)
742 if (trf->ignore_timeout) 1016 if (trf->ignore_timeout)
743 trf->ignore_timeout = false; 1017 trf->ignore_timeout = false;
744 else if (trf->state == TRF7970A_ST_WAIT_FOR_RX_DATA_CONT) 1018 else if (trf->state == TRF7970A_ST_WAIT_FOR_RX_DATA_CONT)
745 trf7970a_send_upstream(trf); /* No more rx data so send up */ 1019 trf7970a_drain_fifo(trf, TRF7970A_IRQ_STATUS_SRX);
746 else if (trf->state == TRF7970A_ST_WAIT_TO_ISSUE_EOF) 1020 else if (trf->state == TRF7970A_ST_WAIT_TO_ISSUE_EOF)
747 trf7970a_issue_eof(trf); 1021 trf7970a_issue_eof(trf);
748 else 1022 else
@@ -765,11 +1039,16 @@ static int trf7970a_init(struct trf7970a *trf)
765 if (ret) 1039 if (ret)
766 goto err_out; 1040 goto err_out;
767 1041
768 /* Must clear NFC Target Detection Level reg due to erratum */ 1042 usleep_range(1000, 2000);
769 ret = trf7970a_write(trf, TRF7970A_NFC_TARGET_LEVEL, 0); 1043
1044 trf->chip_status_ctrl &= ~TRF7970A_CHIP_STATUS_RF_ON;
1045
1046 ret = trf7970a_write(trf, TRF7970A_MODULATOR_SYS_CLK_CTRL, 0);
770 if (ret) 1047 if (ret)
771 goto err_out; 1048 goto err_out;
772 1049
1050 trf->modulator_sys_clk_ctrl = 0;
1051
773 ret = trf7970a_write(trf, TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS, 1052 ret = trf7970a_write(trf, TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS,
774 TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_96 | 1053 TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLH_96 |
775 TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32); 1054 TRF7970A_ADJUTABLE_FIFO_IRQ_LEVELS_WLL_32);
@@ -792,6 +1071,10 @@ err_out:
792 1071
793static void trf7970a_switch_rf_off(struct trf7970a *trf) 1072static void trf7970a_switch_rf_off(struct trf7970a *trf)
794{ 1073{
1074 if ((trf->state == TRF7970A_ST_PWR_OFF) ||
1075 (trf->state == TRF7970A_ST_RF_OFF))
1076 return;
1077
795 dev_dbg(trf->dev, "Switching rf off\n"); 1078 dev_dbg(trf->dev, "Switching rf off\n");
796 1079
797 trf->chip_status_ctrl &= ~TRF7970A_CHIP_STATUS_RF_ON; 1080 trf->chip_status_ctrl &= ~TRF7970A_CHIP_STATUS_RF_ON;
@@ -799,24 +1082,41 @@ static void trf7970a_switch_rf_off(struct trf7970a *trf)
799 trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL, trf->chip_status_ctrl); 1082 trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL, trf->chip_status_ctrl);
800 1083
801 trf->aborting = false; 1084 trf->aborting = false;
802 trf->state = TRF7970A_ST_OFF; 1085 trf->state = TRF7970A_ST_RF_OFF;
803 1086
804 pm_runtime_mark_last_busy(trf->dev); 1087 pm_runtime_mark_last_busy(trf->dev);
805 pm_runtime_put_autosuspend(trf->dev); 1088 pm_runtime_put_autosuspend(trf->dev);
806} 1089}
807 1090
808static void trf7970a_switch_rf_on(struct trf7970a *trf) 1091static int trf7970a_switch_rf_on(struct trf7970a *trf)
809{ 1092{
1093 int ret;
1094
810 dev_dbg(trf->dev, "Switching rf on\n"); 1095 dev_dbg(trf->dev, "Switching rf on\n");
811 1096
812 pm_runtime_get_sync(trf->dev); 1097 pm_runtime_get_sync(trf->dev);
813 1098
1099 if (trf->state != TRF7970A_ST_RF_OFF) { /* Power on, RF off */
1100 dev_err(trf->dev, "%s - Incorrect state: %d\n", __func__,
1101 trf->state);
1102 return -EINVAL;
1103 }
1104
1105 ret = trf7970a_init(trf);
1106 if (ret) {
1107 dev_err(trf->dev, "%s - Can't initialize: %d\n", __func__, ret);
1108 return ret;
1109 }
1110
814 trf->state = TRF7970A_ST_IDLE; 1111 trf->state = TRF7970A_ST_IDLE;
1112
1113 return 0;
815} 1114}
816 1115
817static int trf7970a_switch_rf(struct nfc_digital_dev *ddev, bool on) 1116static int trf7970a_switch_rf(struct nfc_digital_dev *ddev, bool on)
818{ 1117{
819 struct trf7970a *trf = nfc_digital_get_drvdata(ddev); 1118 struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1119 int ret = 0;
820 1120
821 dev_dbg(trf->dev, "Switching RF - state: %d, on: %d\n", trf->state, on); 1121 dev_dbg(trf->dev, "Switching RF - state: %d, on: %d\n", trf->state, on);
822 1122
@@ -824,8 +1124,9 @@ static int trf7970a_switch_rf(struct nfc_digital_dev *ddev, bool on)
824 1124
825 if (on) { 1125 if (on) {
826 switch (trf->state) { 1126 switch (trf->state) {
827 case TRF7970A_ST_OFF: 1127 case TRF7970A_ST_PWR_OFF:
828 trf7970a_switch_rf_on(trf); 1128 case TRF7970A_ST_RF_OFF:
1129 ret = trf7970a_switch_rf_on(trf);
829 break; 1130 break;
830 case TRF7970A_ST_IDLE: 1131 case TRF7970A_ST_IDLE:
831 case TRF7970A_ST_IDLE_RX_BLOCKED: 1132 case TRF7970A_ST_IDLE_RX_BLOCKED:
@@ -834,26 +1135,31 @@ static int trf7970a_switch_rf(struct nfc_digital_dev *ddev, bool on)
834 dev_err(trf->dev, "%s - Invalid request: %d %d\n", 1135 dev_err(trf->dev, "%s - Invalid request: %d %d\n",
835 __func__, trf->state, on); 1136 __func__, trf->state, on);
836 trf7970a_switch_rf_off(trf); 1137 trf7970a_switch_rf_off(trf);
1138 ret = -EINVAL;
837 } 1139 }
838 } else { 1140 } else {
839 switch (trf->state) { 1141 switch (trf->state) {
840 case TRF7970A_ST_OFF: 1142 case TRF7970A_ST_PWR_OFF:
1143 case TRF7970A_ST_RF_OFF:
841 break; 1144 break;
842 default: 1145 default:
843 dev_err(trf->dev, "%s - Invalid request: %d %d\n", 1146 dev_err(trf->dev, "%s - Invalid request: %d %d\n",
844 __func__, trf->state, on); 1147 __func__, trf->state, on);
1148 ret = -EINVAL;
845 /* FALLTHROUGH */ 1149 /* FALLTHROUGH */
846 case TRF7970A_ST_IDLE: 1150 case TRF7970A_ST_IDLE:
847 case TRF7970A_ST_IDLE_RX_BLOCKED: 1151 case TRF7970A_ST_IDLE_RX_BLOCKED:
1152 case TRF7970A_ST_WAIT_FOR_RX_DATA:
1153 case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
848 trf7970a_switch_rf_off(trf); 1154 trf7970a_switch_rf_off(trf);
849 } 1155 }
850 } 1156 }
851 1157
852 mutex_unlock(&trf->lock); 1158 mutex_unlock(&trf->lock);
853 return 0; 1159 return ret;
854} 1160}
855 1161
856static int trf7970a_config_rf_tech(struct trf7970a *trf, int tech) 1162static int trf7970a_in_config_rf_tech(struct trf7970a *trf, int tech)
857{ 1163{
858 int ret = 0; 1164 int ret = 0;
859 1165
@@ -863,22 +1169,27 @@ static int trf7970a_config_rf_tech(struct trf7970a *trf, int tech)
863 case NFC_DIGITAL_RF_TECH_106A: 1169 case NFC_DIGITAL_RF_TECH_106A:
864 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106; 1170 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443A_106;
865 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK; 1171 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
1172 trf->guard_time = TRF7970A_GUARD_TIME_NFCA;
866 break; 1173 break;
867 case NFC_DIGITAL_RF_TECH_106B: 1174 case NFC_DIGITAL_RF_TECH_106B:
868 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106; 1175 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_14443B_106;
869 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10; 1176 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
1177 trf->guard_time = TRF7970A_GUARD_TIME_NFCB;
870 break; 1178 break;
871 case NFC_DIGITAL_RF_TECH_212F: 1179 case NFC_DIGITAL_RF_TECH_212F:
872 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212; 1180 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_212;
873 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10; 1181 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
1182 trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
874 break; 1183 break;
875 case NFC_DIGITAL_RF_TECH_424F: 1184 case NFC_DIGITAL_RF_TECH_424F:
876 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424; 1185 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_FELICA_424;
877 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10; 1186 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
1187 trf->guard_time = TRF7970A_GUARD_TIME_NFCF;
878 break; 1188 break;
879 case NFC_DIGITAL_RF_TECH_ISO15693: 1189 case NFC_DIGITAL_RF_TECH_ISO15693:
880 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648; 1190 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_15693_SGL_1OF4_2648;
881 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK; 1191 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
1192 trf->guard_time = TRF7970A_GUARD_TIME_15693;
882 break; 1193 break;
883 default: 1194 default:
884 dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech); 1195 dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
@@ -887,12 +1198,54 @@ static int trf7970a_config_rf_tech(struct trf7970a *trf, int tech)
887 1198
888 trf->technology = tech; 1199 trf->technology = tech;
889 1200
1201 /* If in initiator mode and not changing the RF tech due to a
1202 * PSL sequence (indicated by 'trf->iso_ctrl == 0xff' from
1203 * trf7970a_init()), clear the NFC Target Detection Level register
1204 * due to erratum.
1205 */
1206 if (trf->iso_ctrl == 0xff)
1207 ret = trf7970a_write(trf, TRF7970A_NFC_TARGET_LEVEL, 0);
1208
890 return ret; 1209 return ret;
891} 1210}
892 1211
893static int trf7970a_config_framing(struct trf7970a *trf, int framing) 1212static int trf7970a_is_rf_field(struct trf7970a *trf, bool *is_rf_field)
1213{
1214 int ret;
1215 u8 rssi;
1216
1217 ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
1218 trf->chip_status_ctrl | TRF7970A_CHIP_STATUS_REC_ON);
1219 if (ret)
1220 return ret;
1221
1222 ret = trf7970a_cmd(trf, TRF7970A_CMD_TEST_EXT_RF);
1223 if (ret)
1224 return ret;
1225
1226 usleep_range(50, 60);
1227
1228 ret = trf7970a_read(trf, TRF7970A_RSSI_OSC_STATUS, &rssi);
1229 if (ret)
1230 return ret;
1231
1232 ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
1233 trf->chip_status_ctrl);
1234 if (ret)
1235 return ret;
1236
1237 if (rssi & TRF7970A_RSSI_OSC_STATUS_RSSI_MASK)
1238 *is_rf_field = true;
1239 else
1240 *is_rf_field = false;
1241
1242 return 0;
1243}
1244
1245static int trf7970a_in_config_framing(struct trf7970a *trf, int framing)
894{ 1246{
895 u8 iso_ctrl = trf->iso_ctrl_tech; 1247 u8 iso_ctrl = trf->iso_ctrl_tech;
1248 bool is_rf_field = false;
896 int ret; 1249 int ret;
897 1250
898 dev_dbg(trf->dev, "framing: %d\n", framing); 1251 dev_dbg(trf->dev, "framing: %d\n", framing);
@@ -911,6 +1264,8 @@ static int trf7970a_config_framing(struct trf7970a *trf, int framing)
911 case NFC_DIGITAL_FRAMING_NFCF_T3T: 1264 case NFC_DIGITAL_FRAMING_NFCF_T3T:
912 case NFC_DIGITAL_FRAMING_ISO15693_INVENTORY: 1265 case NFC_DIGITAL_FRAMING_ISO15693_INVENTORY:
913 case NFC_DIGITAL_FRAMING_ISO15693_T5T: 1266 case NFC_DIGITAL_FRAMING_ISO15693_T5T:
1267 case NFC_DIGITAL_FRAMING_NFCA_NFC_DEP:
1268 case NFC_DIGITAL_FRAMING_NFCF_NFC_DEP:
914 trf->tx_cmd = TRF7970A_CMD_TRANSMIT; 1269 trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
915 iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N; 1270 iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
916 break; 1271 break;
@@ -925,6 +1280,15 @@ static int trf7970a_config_framing(struct trf7970a *trf, int framing)
925 1280
926 trf->framing = framing; 1281 trf->framing = framing;
927 1282
1283 if (!(trf->chip_status_ctrl & TRF7970A_CHIP_STATUS_RF_ON)) {
1284 ret = trf7970a_is_rf_field(trf, &is_rf_field);
1285 if (ret)
1286 return ret;
1287
1288 if (is_rf_field)
1289 return -EBUSY;
1290 }
1291
928 if (iso_ctrl != trf->iso_ctrl) { 1292 if (iso_ctrl != trf->iso_ctrl) {
929 ret = trf7970a_write(trf, TRF7970A_ISO_CTRL, iso_ctrl); 1293 ret = trf7970a_write(trf, TRF7970A_ISO_CTRL, iso_ctrl);
930 if (ret) 1294 if (ret)
@@ -947,7 +1311,7 @@ static int trf7970a_config_framing(struct trf7970a *trf, int framing)
947 1311
948 trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON; 1312 trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON;
949 1313
950 usleep_range(5000, 6000); 1314 usleep_range(trf->guard_time, trf->guard_time + 1000);
951 } 1315 }
952 1316
953 return 0; 1317 return 0;
@@ -963,21 +1327,28 @@ static int trf7970a_in_configure_hw(struct nfc_digital_dev *ddev, int type,
963 1327
964 mutex_lock(&trf->lock); 1328 mutex_lock(&trf->lock);
965 1329
966 if (trf->state == TRF7970A_ST_OFF) 1330 trf->is_initiator = true;
967 trf7970a_switch_rf_on(trf); 1331
1332 if ((trf->state == TRF7970A_ST_PWR_OFF) ||
1333 (trf->state == TRF7970A_ST_RF_OFF)) {
1334 ret = trf7970a_switch_rf_on(trf);
1335 if (ret)
1336 goto err_unlock;
1337 }
968 1338
969 switch (type) { 1339 switch (type) {
970 case NFC_DIGITAL_CONFIG_RF_TECH: 1340 case NFC_DIGITAL_CONFIG_RF_TECH:
971 ret = trf7970a_config_rf_tech(trf, param); 1341 ret = trf7970a_in_config_rf_tech(trf, param);
972 break; 1342 break;
973 case NFC_DIGITAL_CONFIG_FRAMING: 1343 case NFC_DIGITAL_CONFIG_FRAMING:
974 ret = trf7970a_config_framing(trf, param); 1344 ret = trf7970a_in_config_framing(trf, param);
975 break; 1345 break;
976 default: 1346 default:
977 dev_dbg(trf->dev, "Unknown type: %d\n", type); 1347 dev_dbg(trf->dev, "Unknown type: %d\n", type);
978 ret = -EINVAL; 1348 ret = -EINVAL;
979 } 1349 }
980 1350
1351err_unlock:
981 mutex_unlock(&trf->lock); 1352 mutex_unlock(&trf->lock);
982 return ret; 1353 return ret;
983} 1354}
@@ -1067,14 +1438,15 @@ static int trf7970a_per_cmd_config(struct trf7970a *trf, struct sk_buff *skb)
1067 return 0; 1438 return 0;
1068} 1439}
1069 1440
1070static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev, 1441static int trf7970a_send_cmd(struct nfc_digital_dev *ddev,
1071 struct sk_buff *skb, u16 timeout, 1442 struct sk_buff *skb, u16 timeout,
1072 nfc_digital_cmd_complete_t cb, void *arg) 1443 nfc_digital_cmd_complete_t cb, void *arg)
1073{ 1444{
1074 struct trf7970a *trf = nfc_digital_get_drvdata(ddev); 1445 struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1075 char *prefix; 1446 u8 prefix[5];
1076 unsigned int len; 1447 unsigned int len;
1077 int ret; 1448 int ret;
1449 u8 status;
1078 1450
1079 dev_dbg(trf->dev, "New request - state: %d, timeout: %d ms, len: %d\n", 1451 dev_dbg(trf->dev, "New request - state: %d, timeout: %d ms, len: %d\n",
1080 trf->state, timeout, skb->len); 1452 trf->state, timeout, skb->len);
@@ -1099,12 +1471,14 @@ static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev,
1099 goto out_err; 1471 goto out_err;
1100 } 1472 }
1101 1473
1102 trf->rx_skb = nfc_alloc_recv_skb(TRF7970A_RX_SKB_ALLOC_SIZE, 1474 if (timeout) {
1103 GFP_KERNEL); 1475 trf->rx_skb = nfc_alloc_recv_skb(TRF7970A_RX_SKB_ALLOC_SIZE,
1104 if (!trf->rx_skb) { 1476 GFP_KERNEL);
1105 dev_dbg(trf->dev, "Can't alloc rx_skb\n"); 1477 if (!trf->rx_skb) {
1106 ret = -ENOMEM; 1478 dev_dbg(trf->dev, "Can't alloc rx_skb\n");
1107 goto out_err; 1479 ret = -ENOMEM;
1480 goto out_err;
1481 }
1108 } 1482 }
1109 1483
1110 if (trf->state == TRF7970A_ST_IDLE_RX_BLOCKED) { 1484 if (trf->state == TRF7970A_ST_IDLE_RX_BLOCKED) {
@@ -1115,9 +1489,11 @@ static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev,
1115 trf->state = TRF7970A_ST_IDLE; 1489 trf->state = TRF7970A_ST_IDLE;
1116 } 1490 }
1117 1491
1118 ret = trf7970a_per_cmd_config(trf, skb); 1492 if (trf->is_initiator) {
1119 if (ret) 1493 ret = trf7970a_per_cmd_config(trf, skb);
1120 goto out_err; 1494 if (ret)
1495 goto out_err;
1496 }
1121 1497
1122 trf->ddev = ddev; 1498 trf->ddev = ddev;
1123 trf->tx_skb = skb; 1499 trf->tx_skb = skb;
@@ -1127,11 +1503,11 @@ static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev,
1127 trf->ignore_timeout = false; 1503 trf->ignore_timeout = false;
1128 1504
1129 len = skb->len; 1505 len = skb->len;
1130 prefix = skb_push(skb, TRF7970A_TX_SKB_HEADROOM);
1131 1506
1132 /* TX data must be prefixed with a FIFO reset cmd, a cmd that depends 1507 /* TX data must be prefixed with a FIFO reset cmd, a cmd that depends
1133 * on what the current framing is, the address of the TX length byte 1 1508 * on what the current framing is, the address of the TX length byte 1
1134 * register (0x1d), and the 2 byte length of the data to be transmitted. 1509 * register (0x1d), and the 2 byte length of the data to be transmitted.
1510 * That totals 5 bytes.
1135 */ 1511 */
1136 prefix[0] = TRF7970A_CMD_BIT_CTRL | 1512 prefix[0] = TRF7970A_CMD_BIT_CTRL |
1137 TRF7970A_CMD_BIT_OPCODE(TRF7970A_CMD_FIFO_RESET); 1513 TRF7970A_CMD_BIT_OPCODE(TRF7970A_CMD_FIFO_RESET);
@@ -1150,9 +1526,12 @@ static int trf7970a_in_send_cmd(struct nfc_digital_dev *ddev,
1150 1526
1151 len = min_t(int, skb->len, TRF7970A_FIFO_SIZE); 1527 len = min_t(int, skb->len, TRF7970A_FIFO_SIZE);
1152 1528
1153 usleep_range(1000, 2000); 1529 /* Clear possible spurious interrupt */
1530 ret = trf7970a_read_irqstatus(trf, &status);
1531 if (ret)
1532 goto out_err;
1154 1533
1155 ret = trf7970a_transmit(trf, skb, len); 1534 ret = trf7970a_transmit(trf, skb, len, prefix, sizeof(prefix));
1156 if (ret) { 1535 if (ret) {
1157 kfree_skb(trf->rx_skb); 1536 kfree_skb(trf->rx_skb);
1158 trf->rx_skb = NULL; 1537 trf->rx_skb = NULL;
@@ -1163,46 +1542,272 @@ out_err:
1163 return ret; 1542 return ret;
1164} 1543}
1165 1544
1166static int trf7970a_tg_configure_hw(struct nfc_digital_dev *ddev, 1545static int trf7970a_tg_config_rf_tech(struct trf7970a *trf, int tech)
1167 int type, int param) 1546{
1547 int ret = 0;
1548
1549 dev_dbg(trf->dev, "rf technology: %d\n", tech);
1550
1551 switch (tech) {
1552 case NFC_DIGITAL_RF_TECH_106A:
1553 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
1554 TRF7970A_ISO_CTRL_NFC_CE |
1555 TRF7970A_ISO_CTRL_NFC_CE_14443A;
1556 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_OOK;
1557 break;
1558 case NFC_DIGITAL_RF_TECH_212F:
1559 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
1560 TRF7970A_ISO_CTRL_NFC_NFCF_212;
1561 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
1562 break;
1563 case NFC_DIGITAL_RF_TECH_424F:
1564 trf->iso_ctrl_tech = TRF7970A_ISO_CTRL_NFC_NFC_CE_MODE |
1565 TRF7970A_ISO_CTRL_NFC_NFCF_424;
1566 trf->modulator_sys_clk_ctrl = TRF7970A_MODULATOR_DEPTH_ASK10;
1567 break;
1568 default:
1569 dev_dbg(trf->dev, "Unsupported rf technology: %d\n", tech);
1570 return -EINVAL;
1571 }
1572
1573 trf->technology = tech;
1574
1575 /* Normally we write the ISO_CTRL register in
1576 * trf7970a_tg_config_framing() because the framing can change
1577 * the value written. However, when sending a PSL RES,
1578 * digital_tg_send_psl_res_complete() doesn't call
1579 * trf7970a_tg_config_framing() so we must write the register
1580 * here.
1581 */
1582 if ((trf->framing == NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED) &&
1583 (trf->iso_ctrl_tech != trf->iso_ctrl)) {
1584 ret = trf7970a_write(trf, TRF7970A_ISO_CTRL,
1585 trf->iso_ctrl_tech);
1586
1587 trf->iso_ctrl = trf->iso_ctrl_tech;
1588 }
1589
1590 return ret;
1591}
1592
1593/* Since this is a target routine, several of the framing calls are
1594 * made between receiving the request and sending the response so they
1595 * should take effect until after the response is sent. This is accomplished
1596 * by skipping the ISO_CTRL register write here and doing it in the interrupt
1597 * handler.
1598 */
1599static int trf7970a_tg_config_framing(struct trf7970a *trf, int framing)
1600{
1601 u8 iso_ctrl = trf->iso_ctrl_tech;
1602 int ret;
1603
1604 dev_dbg(trf->dev, "framing: %d\n", framing);
1605
1606 switch (framing) {
1607 case NFC_DIGITAL_FRAMING_NFCA_NFC_DEP:
1608 trf->tx_cmd = TRF7970A_CMD_TRANSMIT_NO_CRC;
1609 iso_ctrl |= TRF7970A_ISO_CTRL_RX_CRC_N;
1610 break;
1611 case NFC_DIGITAL_FRAMING_NFCA_STANDARD:
1612 case NFC_DIGITAL_FRAMING_NFCA_STANDARD_WITH_CRC_A:
1613 case NFC_DIGITAL_FRAMING_NFCA_ANTICOL_COMPLETE:
1614 /* These ones are applied in the interrupt handler */
1615 iso_ctrl = trf->iso_ctrl; /* Don't write to ISO_CTRL yet */
1616 break;
1617 case NFC_DIGITAL_FRAMING_NFCF_NFC_DEP:
1618 trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
1619 iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
1620 break;
1621 case NFC_DIGITAL_FRAMING_NFC_DEP_ACTIVATED:
1622 trf->tx_cmd = TRF7970A_CMD_TRANSMIT;
1623 iso_ctrl &= ~TRF7970A_ISO_CTRL_RX_CRC_N;
1624 break;
1625 default:
1626 dev_dbg(trf->dev, "Unsupported Framing: %d\n", framing);
1627 return -EINVAL;
1628 }
1629
1630 trf->framing = framing;
1631
1632 if (iso_ctrl != trf->iso_ctrl) {
1633 ret = trf7970a_write(trf, TRF7970A_ISO_CTRL, iso_ctrl);
1634 if (ret)
1635 return ret;
1636
1637 trf->iso_ctrl = iso_ctrl;
1638
1639 ret = trf7970a_write(trf, TRF7970A_MODULATOR_SYS_CLK_CTRL,
1640 trf->modulator_sys_clk_ctrl);
1641 if (ret)
1642 return ret;
1643 }
1644
1645 if (!(trf->chip_status_ctrl & TRF7970A_CHIP_STATUS_RF_ON)) {
1646 ret = trf7970a_write(trf, TRF7970A_CHIP_STATUS_CTRL,
1647 trf->chip_status_ctrl |
1648 TRF7970A_CHIP_STATUS_RF_ON);
1649 if (ret)
1650 return ret;
1651
1652 trf->chip_status_ctrl |= TRF7970A_CHIP_STATUS_RF_ON;
1653 }
1654
1655 return 0;
1656}
1657
1658static int trf7970a_tg_configure_hw(struct nfc_digital_dev *ddev, int type,
1659 int param)
1660{
1661 struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1662 int ret;
1663
1664 dev_dbg(trf->dev, "Configure hw - type: %d, param: %d\n", type, param);
1665
1666 mutex_lock(&trf->lock);
1667
1668 trf->is_initiator = false;
1669
1670 if ((trf->state == TRF7970A_ST_PWR_OFF) ||
1671 (trf->state == TRF7970A_ST_RF_OFF)) {
1672 ret = trf7970a_switch_rf_on(trf);
1673 if (ret)
1674 goto err_unlock;
1675 }
1676
1677 switch (type) {
1678 case NFC_DIGITAL_CONFIG_RF_TECH:
1679 ret = trf7970a_tg_config_rf_tech(trf, param);
1680 break;
1681 case NFC_DIGITAL_CONFIG_FRAMING:
1682 ret = trf7970a_tg_config_framing(trf, param);
1683 break;
1684 default:
1685 dev_dbg(trf->dev, "Unknown type: %d\n", type);
1686 ret = -EINVAL;
1687 }
1688
1689err_unlock:
1690 mutex_unlock(&trf->lock);
1691 return ret;
1692}
1693
1694static int _trf7970a_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
1695 nfc_digital_cmd_complete_t cb, void *arg, bool mode_detect)
1168{ 1696{
1169 struct trf7970a *trf = nfc_digital_get_drvdata(ddev); 1697 struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1698 int ret;
1699
1700 mutex_lock(&trf->lock);
1170 1701
1171 dev_dbg(trf->dev, "Unsupported interface\n"); 1702 if ((trf->state != TRF7970A_ST_IDLE) &&
1703 (trf->state != TRF7970A_ST_IDLE_RX_BLOCKED)) {
1704 dev_err(trf->dev, "%s - Bogus state: %d\n", __func__,
1705 trf->state);
1706 ret = -EIO;
1707 goto out_err;
1708 }
1172 1709
1173 return -EINVAL; 1710 if (trf->aborting) {
1711 dev_dbg(trf->dev, "Abort process complete\n");
1712 trf->aborting = false;
1713 ret = -ECANCELED;
1714 goto out_err;
1715 }
1716
1717 trf->rx_skb = nfc_alloc_recv_skb(TRF7970A_RX_SKB_ALLOC_SIZE,
1718 GFP_KERNEL);
1719 if (!trf->rx_skb) {
1720 dev_dbg(trf->dev, "Can't alloc rx_skb\n");
1721 ret = -ENOMEM;
1722 goto out_err;
1723 }
1724
1725 ret = trf7970a_write(trf, TRF7970A_RX_SPECIAL_SETTINGS,
1726 TRF7970A_RX_SPECIAL_SETTINGS_HBT |
1727 TRF7970A_RX_SPECIAL_SETTINGS_M848 |
1728 TRF7970A_RX_SPECIAL_SETTINGS_C424 |
1729 TRF7970A_RX_SPECIAL_SETTINGS_C212);
1730 if (ret)
1731 goto out_err;
1732
1733 ret = trf7970a_write(trf, TRF7970A_REG_IO_CTRL,
1734 TRF7970A_REG_IO_CTRL_VRS(0x1));
1735 if (ret)
1736 goto out_err;
1737
1738 ret = trf7970a_write(trf, TRF7970A_NFC_LOW_FIELD_LEVEL,
1739 TRF7970A_NFC_LOW_FIELD_LEVEL_RFDET(0x3));
1740 if (ret)
1741 goto out_err;
1742
1743 ret = trf7970a_write(trf, TRF7970A_NFC_TARGET_LEVEL,
1744 TRF7970A_NFC_TARGET_LEVEL_RFDET(0x7));
1745 if (ret)
1746 goto out_err;
1747
1748 trf->ddev = ddev;
1749 trf->cb = cb;
1750 trf->cb_arg = arg;
1751 trf->timeout = timeout;
1752 trf->ignore_timeout = false;
1753
1754 ret = trf7970a_cmd(trf, TRF7970A_CMD_ENABLE_RX);
1755 if (ret)
1756 goto out_err;
1757
1758 trf->state = mode_detect ? TRF7970A_ST_LISTENING_MD :
1759 TRF7970A_ST_LISTENING;
1760
1761 schedule_delayed_work(&trf->timeout_work, msecs_to_jiffies(timeout));
1762
1763out_err:
1764 mutex_unlock(&trf->lock);
1765 return ret;
1174} 1766}
1175 1767
1176static int trf7970a_tg_send_cmd(struct nfc_digital_dev *ddev, 1768static int trf7970a_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
1177 struct sk_buff *skb, u16 timeout,
1178 nfc_digital_cmd_complete_t cb, void *arg) 1769 nfc_digital_cmd_complete_t cb, void *arg)
1179{ 1770{
1180 struct trf7970a *trf = nfc_digital_get_drvdata(ddev); 1771 struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1181 1772
1182 dev_dbg(trf->dev, "Unsupported interface\n"); 1773 dev_dbg(trf->dev, "Listen - state: %d, timeout: %d ms\n",
1774 trf->state, timeout);
1183 1775
1184 return -EINVAL; 1776 return _trf7970a_tg_listen(ddev, timeout, cb, arg, false);
1185} 1777}
1186 1778
1187static int trf7970a_tg_listen(struct nfc_digital_dev *ddev, 1779static int trf7970a_tg_listen_md(struct nfc_digital_dev *ddev,
1188 u16 timeout, nfc_digital_cmd_complete_t cb, void *arg) 1780 u16 timeout, nfc_digital_cmd_complete_t cb, void *arg)
1189{ 1781{
1190 struct trf7970a *trf = nfc_digital_get_drvdata(ddev); 1782 struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1783 int ret;
1784
1785 dev_dbg(trf->dev, "Listen MD - state: %d, timeout: %d ms\n",
1786 trf->state, timeout);
1191 1787
1192 dev_dbg(trf->dev, "Unsupported interface\n"); 1788 ret = trf7970a_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
1789 NFC_DIGITAL_RF_TECH_106A);
1790 if (ret)
1791 return ret;
1193 1792
1194 return -EINVAL; 1793 ret = trf7970a_tg_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
1794 NFC_DIGITAL_FRAMING_NFCA_NFC_DEP);
1795 if (ret)
1796 return ret;
1797
1798 return _trf7970a_tg_listen(ddev, timeout, cb, arg, true);
1195} 1799}
1196 1800
1197static int trf7970a_tg_listen_mdaa(struct nfc_digital_dev *ddev, 1801static int trf7970a_tg_get_rf_tech(struct nfc_digital_dev *ddev, u8 *rf_tech)
1198 struct digital_tg_mdaa_params *mdaa_params,
1199 u16 timeout, nfc_digital_cmd_complete_t cb, void *arg)
1200{ 1802{
1201 struct trf7970a *trf = nfc_digital_get_drvdata(ddev); 1803 struct trf7970a *trf = nfc_digital_get_drvdata(ddev);
1202 1804
1203 dev_dbg(trf->dev, "Unsupported interface\n"); 1805 dev_dbg(trf->dev, "Get RF Tech - state: %d, rf_tech: %d\n",
1806 trf->state, trf->md_rf_tech);
1204 1807
1205 return -EINVAL; 1808 *rf_tech = trf->md_rf_tech;
1809
1810 return 0;
1206} 1811}
1207 1812
1208static void trf7970a_abort_cmd(struct nfc_digital_dev *ddev) 1813static void trf7970a_abort_cmd(struct nfc_digital_dev *ddev)
@@ -1220,6 +1825,11 @@ static void trf7970a_abort_cmd(struct nfc_digital_dev *ddev)
1220 case TRF7970A_ST_WAIT_TO_ISSUE_EOF: 1825 case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
1221 trf->aborting = true; 1826 trf->aborting = true;
1222 break; 1827 break;
1828 case TRF7970A_ST_LISTENING:
1829 trf->ignore_timeout = !cancel_delayed_work(&trf->timeout_work);
1830 trf7970a_send_err_upstream(trf, -ECANCELED);
1831 dev_dbg(trf->dev, "Abort process complete\n");
1832 break;
1223 default: 1833 default:
1224 break; 1834 break;
1225 } 1835 }
@@ -1229,15 +1839,114 @@ static void trf7970a_abort_cmd(struct nfc_digital_dev *ddev)
1229 1839
1230static struct nfc_digital_ops trf7970a_nfc_ops = { 1840static struct nfc_digital_ops trf7970a_nfc_ops = {
1231 .in_configure_hw = trf7970a_in_configure_hw, 1841 .in_configure_hw = trf7970a_in_configure_hw,
1232 .in_send_cmd = trf7970a_in_send_cmd, 1842 .in_send_cmd = trf7970a_send_cmd,
1233 .tg_configure_hw = trf7970a_tg_configure_hw, 1843 .tg_configure_hw = trf7970a_tg_configure_hw,
1234 .tg_send_cmd = trf7970a_tg_send_cmd, 1844 .tg_send_cmd = trf7970a_send_cmd,
1235 .tg_listen = trf7970a_tg_listen, 1845 .tg_listen = trf7970a_tg_listen,
1236 .tg_listen_mdaa = trf7970a_tg_listen_mdaa, 1846 .tg_listen_md = trf7970a_tg_listen_md,
1847 .tg_get_rf_tech = trf7970a_tg_get_rf_tech,
1237 .switch_rf = trf7970a_switch_rf, 1848 .switch_rf = trf7970a_switch_rf,
1238 .abort_cmd = trf7970a_abort_cmd, 1849 .abort_cmd = trf7970a_abort_cmd,
1239}; 1850};
1240 1851
1852static int trf7970a_power_up(struct trf7970a *trf)
1853{
1854 int ret;
1855
1856 dev_dbg(trf->dev, "Powering up - state: %d\n", trf->state);
1857
1858 if (trf->state != TRF7970A_ST_PWR_OFF)
1859 return 0;
1860
1861 ret = regulator_enable(trf->regulator);
1862 if (ret) {
1863 dev_err(trf->dev, "%s - Can't enable VIN: %d\n", __func__, ret);
1864 return ret;
1865 }
1866
1867 usleep_range(5000, 6000);
1868
1869 if (!(trf->quirks & TRF7970A_QUIRK_EN2_MUST_STAY_LOW)) {
1870 gpio_set_value(trf->en2_gpio, 1);
1871 usleep_range(1000, 2000);
1872 }
1873
1874 gpio_set_value(trf->en_gpio, 1);
1875
1876 usleep_range(20000, 21000);
1877
1878 trf->state = TRF7970A_ST_RF_OFF;
1879
1880 return 0;
1881}
1882
1883static int trf7970a_power_down(struct trf7970a *trf)
1884{
1885 int ret;
1886
1887 dev_dbg(trf->dev, "Powering down - state: %d\n", trf->state);
1888
1889 if (trf->state == TRF7970A_ST_PWR_OFF)
1890 return 0;
1891
1892 if (trf->state != TRF7970A_ST_RF_OFF) {
1893 dev_dbg(trf->dev, "Can't power down - not RF_OFF state (%d)\n",
1894 trf->state);
1895 return -EBUSY;
1896 }
1897
1898 gpio_set_value(trf->en_gpio, 0);
1899 gpio_set_value(trf->en2_gpio, 0);
1900
1901 ret = regulator_disable(trf->regulator);
1902 if (ret)
1903 dev_err(trf->dev, "%s - Can't disable VIN: %d\n", __func__,
1904 ret);
1905
1906 trf->state = TRF7970A_ST_PWR_OFF;
1907
1908 return ret;
1909}
1910
1911static int trf7970a_startup(struct trf7970a *trf)
1912{
1913 int ret;
1914
1915 ret = trf7970a_power_up(trf);
1916 if (ret)
1917 return ret;
1918
1919 pm_runtime_set_active(trf->dev);
1920 pm_runtime_enable(trf->dev);
1921 pm_runtime_mark_last_busy(trf->dev);
1922
1923 return 0;
1924}
1925
1926static void trf7970a_shutdown(struct trf7970a *trf)
1927{
1928 switch (trf->state) {
1929 case TRF7970A_ST_WAIT_FOR_TX_FIFO:
1930 case TRF7970A_ST_WAIT_FOR_RX_DATA:
1931 case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
1932 case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
1933 case TRF7970A_ST_LISTENING:
1934 trf7970a_send_err_upstream(trf, -ECANCELED);
1935 /* FALLTHROUGH */
1936 case TRF7970A_ST_IDLE:
1937 case TRF7970A_ST_IDLE_RX_BLOCKED:
1938 trf7970a_switch_rf_off(trf);
1939 break;
1940 default:
1941 break;
1942 }
1943
1944 pm_runtime_disable(trf->dev);
1945 pm_runtime_set_suspended(trf->dev);
1946
1947 trf7970a_power_down(trf);
1948}
1949
1241static int trf7970a_get_autosuspend_delay(struct device_node *np) 1950static int trf7970a_get_autosuspend_delay(struct device_node *np)
1242{ 1951{
1243 int autosuspend_delay, ret; 1952 int autosuspend_delay, ret;
@@ -1246,15 +1955,18 @@ static int trf7970a_get_autosuspend_delay(struct device_node *np)
1246 if (ret) 1955 if (ret)
1247 autosuspend_delay = TRF7970A_AUTOSUSPEND_DELAY; 1956 autosuspend_delay = TRF7970A_AUTOSUSPEND_DELAY;
1248 1957
1249 of_node_put(np);
1250
1251 return autosuspend_delay; 1958 return autosuspend_delay;
1252} 1959}
1253 1960
1961static int trf7970a_get_vin_voltage_override(struct device_node *np,
1962 u32 *vin_uvolts)
1963{
1964 return of_property_read_u32(np, "vin-voltage-override", vin_uvolts);
1965}
1966
1254static int trf7970a_probe(struct spi_device *spi) 1967static int trf7970a_probe(struct spi_device *spi)
1255{ 1968{
1256 struct device_node *np = spi->dev.of_node; 1969 struct device_node *np = spi->dev.of_node;
1257 const struct spi_device_id *id = spi_get_device_id(spi);
1258 struct trf7970a *trf; 1970 struct trf7970a *trf;
1259 int uvolts, autosuspend_delay, ret; 1971 int uvolts, autosuspend_delay, ret;
1260 1972
@@ -1267,14 +1979,22 @@ static int trf7970a_probe(struct spi_device *spi)
1267 if (!trf) 1979 if (!trf)
1268 return -ENOMEM; 1980 return -ENOMEM;
1269 1981
1270 trf->state = TRF7970A_ST_OFF; 1982 trf->state = TRF7970A_ST_PWR_OFF;
1271 trf->dev = &spi->dev; 1983 trf->dev = &spi->dev;
1272 trf->spi = spi; 1984 trf->spi = spi;
1273 trf->quirks = id->driver_data;
1274 1985
1275 spi->mode = SPI_MODE_1; 1986 spi->mode = SPI_MODE_1;
1276 spi->bits_per_word = 8; 1987 spi->bits_per_word = 8;
1277 1988
1989 ret = spi_setup(spi);
1990 if (ret < 0) {
1991 dev_err(trf->dev, "Can't set up SPI Communication\n");
1992 return ret;
1993 }
1994
1995 if (of_property_read_bool(np, "irq-status-read-quirk"))
1996 trf->quirks |= TRF7970A_QUIRK_IRQ_STATUS_READ;
1997
1278 /* There are two enable pins - both must be present */ 1998 /* There are two enable pins - both must be present */
1279 trf->en_gpio = of_get_named_gpio(np, "ti,enable-gpios", 0); 1999 trf->en_gpio = of_get_named_gpio(np, "ti,enable-gpios", 0);
1280 if (!gpio_is_valid(trf->en_gpio)) { 2000 if (!gpio_is_valid(trf->en_gpio)) {
@@ -1283,7 +2003,7 @@ static int trf7970a_probe(struct spi_device *spi)
1283 } 2003 }
1284 2004
1285 ret = devm_gpio_request_one(trf->dev, trf->en_gpio, 2005 ret = devm_gpio_request_one(trf->dev, trf->en_gpio,
1286 GPIOF_DIR_OUT | GPIOF_INIT_LOW, "EN"); 2006 GPIOF_DIR_OUT | GPIOF_INIT_LOW, "trf7970a EN");
1287 if (ret) { 2007 if (ret) {
1288 dev_err(trf->dev, "Can't request EN GPIO: %d\n", ret); 2008 dev_err(trf->dev, "Can't request EN GPIO: %d\n", ret);
1289 return ret; 2009 return ret;
@@ -1296,12 +2016,15 @@ static int trf7970a_probe(struct spi_device *spi)
1296 } 2016 }
1297 2017
1298 ret = devm_gpio_request_one(trf->dev, trf->en2_gpio, 2018 ret = devm_gpio_request_one(trf->dev, trf->en2_gpio,
1299 GPIOF_DIR_OUT | GPIOF_INIT_LOW, "EN2"); 2019 GPIOF_DIR_OUT | GPIOF_INIT_LOW, "trf7970a EN2");
1300 if (ret) { 2020 if (ret) {
1301 dev_err(trf->dev, "Can't request EN2 GPIO: %d\n", ret); 2021 dev_err(trf->dev, "Can't request EN2 GPIO: %d\n", ret);
1302 return ret; 2022 return ret;
1303 } 2023 }
1304 2024
2025 if (of_property_read_bool(np, "en2-rf-quirk"))
2026 trf->quirks |= TRF7970A_QUIRK_EN2_MUST_STAY_LOW;
2027
1305 ret = devm_request_threaded_irq(trf->dev, spi->irq, NULL, 2028 ret = devm_request_threaded_irq(trf->dev, spi->irq, NULL,
1306 trf7970a_irq, IRQF_TRIGGER_RISING | IRQF_ONESHOT, 2029 trf7970a_irq, IRQF_TRIGGER_RISING | IRQF_ONESHOT,
1307 "trf7970a", trf); 2030 "trf7970a", trf);
@@ -1326,15 +2049,17 @@ static int trf7970a_probe(struct spi_device *spi)
1326 goto err_destroy_lock; 2049 goto err_destroy_lock;
1327 } 2050 }
1328 2051
1329 uvolts = regulator_get_voltage(trf->regulator); 2052 ret = trf7970a_get_vin_voltage_override(np, &uvolts);
2053 if (ret)
2054 uvolts = regulator_get_voltage(trf->regulator);
1330 2055
1331 if (uvolts > 4000000) 2056 if (uvolts > 4000000)
1332 trf->chip_status_ctrl = TRF7970A_CHIP_STATUS_VRS5_3; 2057 trf->chip_status_ctrl = TRF7970A_CHIP_STATUS_VRS5_3;
1333 2058
1334 trf->ddev = nfc_digital_allocate_device(&trf7970a_nfc_ops, 2059 trf->ddev = nfc_digital_allocate_device(&trf7970a_nfc_ops,
1335 TRF7970A_SUPPORTED_PROTOCOLS, 2060 TRF7970A_SUPPORTED_PROTOCOLS,
1336 NFC_DIGITAL_DRV_CAPS_IN_CRC, TRF7970A_TX_SKB_HEADROOM, 2061 NFC_DIGITAL_DRV_CAPS_IN_CRC |
1337 0); 2062 NFC_DIGITAL_DRV_CAPS_TG_CRC, 0, 0);
1338 if (!trf->ddev) { 2063 if (!trf->ddev) {
1339 dev_err(trf->dev, "Can't allocate NFC digital device\n"); 2064 dev_err(trf->dev, "Can't allocate NFC digital device\n");
1340 ret = -ENOMEM; 2065 ret = -ENOMEM;
@@ -1349,19 +2074,23 @@ static int trf7970a_probe(struct spi_device *spi)
1349 2074
1350 pm_runtime_set_autosuspend_delay(trf->dev, autosuspend_delay); 2075 pm_runtime_set_autosuspend_delay(trf->dev, autosuspend_delay);
1351 pm_runtime_use_autosuspend(trf->dev); 2076 pm_runtime_use_autosuspend(trf->dev);
1352 pm_runtime_enable(trf->dev); 2077
2078 ret = trf7970a_startup(trf);
2079 if (ret)
2080 goto err_free_ddev;
1353 2081
1354 ret = nfc_digital_register_device(trf->ddev); 2082 ret = nfc_digital_register_device(trf->ddev);
1355 if (ret) { 2083 if (ret) {
1356 dev_err(trf->dev, "Can't register NFC digital device: %d\n", 2084 dev_err(trf->dev, "Can't register NFC digital device: %d\n",
1357 ret); 2085 ret);
1358 goto err_free_ddev; 2086 goto err_shutdown;
1359 } 2087 }
1360 2088
1361 return 0; 2089 return 0;
1362 2090
2091err_shutdown:
2092 trf7970a_shutdown(trf);
1363err_free_ddev: 2093err_free_ddev:
1364 pm_runtime_disable(trf->dev);
1365 nfc_digital_free_device(trf->ddev); 2094 nfc_digital_free_device(trf->ddev);
1366err_disable_regulator: 2095err_disable_regulator:
1367 regulator_disable(trf->regulator); 2096 regulator_disable(trf->regulator);
@@ -1376,25 +2105,10 @@ static int trf7970a_remove(struct spi_device *spi)
1376 2105
1377 mutex_lock(&trf->lock); 2106 mutex_lock(&trf->lock);
1378 2107
1379 switch (trf->state) { 2108 trf7970a_shutdown(trf);
1380 case TRF7970A_ST_WAIT_FOR_TX_FIFO:
1381 case TRF7970A_ST_WAIT_FOR_RX_DATA:
1382 case TRF7970A_ST_WAIT_FOR_RX_DATA_CONT:
1383 case TRF7970A_ST_WAIT_TO_ISSUE_EOF:
1384 trf7970a_send_err_upstream(trf, -ECANCELED);
1385 /* FALLTHROUGH */
1386 case TRF7970A_ST_IDLE:
1387 case TRF7970A_ST_IDLE_RX_BLOCKED:
1388 pm_runtime_put_sync(trf->dev);
1389 break;
1390 default:
1391 break;
1392 }
1393 2109
1394 mutex_unlock(&trf->lock); 2110 mutex_unlock(&trf->lock);
1395 2111
1396 pm_runtime_disable(trf->dev);
1397
1398 nfc_digital_unregister_device(trf->ddev); 2112 nfc_digital_unregister_device(trf->ddev);
1399 nfc_digital_free_device(trf->ddev); 2113 nfc_digital_free_device(trf->ddev);
1400 2114
@@ -1405,72 +2119,83 @@ static int trf7970a_remove(struct spi_device *spi)
1405 return 0; 2119 return 0;
1406} 2120}
1407 2121
1408#ifdef CONFIG_PM_RUNTIME 2122#ifdef CONFIG_PM_SLEEP
1409static int trf7970a_pm_runtime_suspend(struct device *dev) 2123static int trf7970a_suspend(struct device *dev)
2124{
2125 struct spi_device *spi = container_of(dev, struct spi_device, dev);
2126 struct trf7970a *trf = spi_get_drvdata(spi);
2127
2128 dev_dbg(dev, "Suspend\n");
2129
2130 mutex_lock(&trf->lock);
2131
2132 trf7970a_shutdown(trf);
2133
2134 mutex_unlock(&trf->lock);
2135
2136 return 0;
2137}
2138
2139static int trf7970a_resume(struct device *dev)
1410{ 2140{
1411 struct spi_device *spi = container_of(dev, struct spi_device, dev); 2141 struct spi_device *spi = container_of(dev, struct spi_device, dev);
1412 struct trf7970a *trf = spi_get_drvdata(spi); 2142 struct trf7970a *trf = spi_get_drvdata(spi);
1413 int ret; 2143 int ret;
1414 2144
1415 dev_dbg(dev, "Runtime suspend\n"); 2145 dev_dbg(dev, "Resume\n");
1416 2146
1417 if (trf->state != TRF7970A_ST_OFF) { 2147 mutex_lock(&trf->lock);
1418 dev_dbg(dev, "Can't suspend - not in OFF state (%d)\n",
1419 trf->state);
1420 return -EBUSY;
1421 }
1422 2148
1423 gpio_set_value(trf->en_gpio, 0); 2149 ret = trf7970a_startup(trf);
1424 gpio_set_value(trf->en2_gpio, 0);
1425 2150
1426 ret = regulator_disable(trf->regulator); 2151 mutex_unlock(&trf->lock);
1427 if (ret)
1428 dev_err(dev, "%s - Can't disable VIN: %d\n", __func__, ret);
1429 2152
1430 return ret; 2153 return ret;
1431} 2154}
2155#endif
1432 2156
1433static int trf7970a_pm_runtime_resume(struct device *dev) 2157#ifdef CONFIG_PM_RUNTIME
2158static int trf7970a_pm_runtime_suspend(struct device *dev)
1434{ 2159{
1435 struct spi_device *spi = container_of(dev, struct spi_device, dev); 2160 struct spi_device *spi = container_of(dev, struct spi_device, dev);
1436 struct trf7970a *trf = spi_get_drvdata(spi); 2161 struct trf7970a *trf = spi_get_drvdata(spi);
1437 int ret; 2162 int ret;
1438 2163
1439 dev_dbg(dev, "Runtime resume\n"); 2164 dev_dbg(dev, "Runtime suspend\n");
1440 2165
1441 ret = regulator_enable(trf->regulator); 2166 mutex_lock(&trf->lock);
1442 if (ret) {
1443 dev_err(dev, "%s - Can't enable VIN: %d\n", __func__, ret);
1444 return ret;
1445 }
1446 2167
1447 usleep_range(5000, 6000); 2168 ret = trf7970a_power_down(trf);
1448 2169
1449 gpio_set_value(trf->en2_gpio, 1); 2170 mutex_unlock(&trf->lock);
1450 usleep_range(1000, 2000);
1451 gpio_set_value(trf->en_gpio, 1);
1452 2171
1453 usleep_range(20000, 21000); 2172 return ret;
2173}
1454 2174
1455 ret = trf7970a_init(trf); 2175static int trf7970a_pm_runtime_resume(struct device *dev)
1456 if (ret) { 2176{
1457 dev_err(dev, "%s - Can't initialize: %d\n", __func__, ret); 2177 struct spi_device *spi = container_of(dev, struct spi_device, dev);
1458 return ret; 2178 struct trf7970a *trf = spi_get_drvdata(spi);
1459 } 2179 int ret;
1460 2180
1461 pm_runtime_mark_last_busy(dev); 2181 dev_dbg(dev, "Runtime resume\n");
1462 2182
1463 return 0; 2183 ret = trf7970a_power_up(trf);
2184 if (!ret)
2185 pm_runtime_mark_last_busy(dev);
2186
2187 return ret;
1464} 2188}
1465#endif 2189#endif
1466 2190
1467static const struct dev_pm_ops trf7970a_pm_ops = { 2191static const struct dev_pm_ops trf7970a_pm_ops = {
2192 SET_SYSTEM_SLEEP_PM_OPS(trf7970a_suspend, trf7970a_resume)
1468 SET_RUNTIME_PM_OPS(trf7970a_pm_runtime_suspend, 2193 SET_RUNTIME_PM_OPS(trf7970a_pm_runtime_suspend,
1469 trf7970a_pm_runtime_resume, NULL) 2194 trf7970a_pm_runtime_resume, NULL)
1470}; 2195};
1471 2196
1472static const struct spi_device_id trf7970a_id_table[] = { 2197static const struct spi_device_id trf7970a_id_table[] = {
1473 { "trf7970a", TRF7970A_QUIRK_IRQ_STATUS_READ_ERRATA }, 2198 { "trf7970a", 0 },
1474 { } 2199 { }
1475}; 2200};
1476MODULE_DEVICE_TABLE(spi, trf7970a_id_table); 2201MODULE_DEVICE_TABLE(spi, trf7970a_id_table);
diff --git a/include/linux/bcma/bcma.h b/include/linux/bcma/bcma.h
index 634597917670..729f48e6b20b 100644
--- a/include/linux/bcma/bcma.h
+++ b/include/linux/bcma/bcma.h
@@ -323,6 +323,8 @@ struct bcma_bus {
323 struct pci_dev *host_pci; 323 struct pci_dev *host_pci;
324 /* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */ 324 /* Pointer to the SDIO device (only for BCMA_HOSTTYPE_SDIO) */
325 struct sdio_func *host_sdio; 325 struct sdio_func *host_sdio;
326 /* Pointer to platform device (only for BCMA_HOSTTYPE_SOC) */
327 struct platform_device *host_pdev;
326 }; 328 };
327 329
328 struct bcma_chipinfo chipinfo; 330 struct bcma_chipinfo chipinfo;
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
index 373000de610d..58695ffeb138 100644
--- a/include/net/bluetooth/bluetooth.h
+++ b/include/net/bluetooth/bluetooth.h
@@ -120,9 +120,9 @@ struct bt_voice {
120#define BT_RCVMTU 13 120#define BT_RCVMTU 13
121 121
122__printf(1, 2) 122__printf(1, 2)
123int bt_info(const char *fmt, ...); 123void bt_info(const char *fmt, ...);
124__printf(1, 2) 124__printf(1, 2)
125int bt_err(const char *fmt, ...); 125void bt_err(const char *fmt, ...);
126 126
127#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__) 127#define BT_INFO(fmt, ...) bt_info(fmt "\n", ##__VA_ARGS__)
128#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__) 128#define BT_ERR(fmt, ...) bt_err(fmt "\n", ##__VA_ARGS__)
@@ -284,6 +284,7 @@ struct hci_req_ctrl {
284struct bt_skb_cb { 284struct bt_skb_cb {
285 __u8 pkt_type; 285 __u8 pkt_type;
286 __u8 incoming; 286 __u8 incoming;
287 __u16 opcode;
287 __u16 expect; 288 __u16 expect;
288 __u8 force_active; 289 __u8 force_active;
289 struct l2cap_chan *chan; 290 struct l2cap_chan *chan;
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index 3f8547f1c6f8..6e8f24967308 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -385,6 +385,7 @@ enum {
385#define HCI_ERROR_AUTH_FAILURE 0x05 385#define HCI_ERROR_AUTH_FAILURE 0x05
386#define HCI_ERROR_MEMORY_EXCEEDED 0x07 386#define HCI_ERROR_MEMORY_EXCEEDED 0x07
387#define HCI_ERROR_CONNECTION_TIMEOUT 0x08 387#define HCI_ERROR_CONNECTION_TIMEOUT 0x08
388#define HCI_ERROR_REJ_LIMITED_RESOURCES 0x0d
388#define HCI_ERROR_REJ_BAD_ADDR 0x0f 389#define HCI_ERROR_REJ_BAD_ADDR 0x0f
389#define HCI_ERROR_REMOTE_USER_TERM 0x13 390#define HCI_ERROR_REMOTE_USER_TERM 0x13
390#define HCI_ERROR_REMOTE_LOW_RESOURCES 0x14 391#define HCI_ERROR_REMOTE_LOW_RESOURCES 0x14
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
index 206b92bfeebb..37ff1aef0845 100644
--- a/include/net/bluetooth/hci_core.h
+++ b/include/net/bluetooth/hci_core.h
@@ -926,7 +926,6 @@ int hci_remove_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr);
926void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb); 926void hci_event_packet(struct hci_dev *hdev, struct sk_buff *skb);
927 927
928int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb); 928int hci_recv_frame(struct hci_dev *hdev, struct sk_buff *skb);
929int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count);
930int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count); 929int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count);
931 930
932void hci_init_sysfs(struct hci_dev *hdev); 931void hci_init_sysfs(struct hci_dev *hdev);
diff --git a/include/net/nfc/nci.h b/include/net/nfc/nci.h
index fbfa4e471abb..9eca9ae2280c 100644
--- a/include/net/nfc/nci.h
+++ b/include/net/nfc/nci.h
@@ -2,6 +2,7 @@
2 * The NFC Controller Interface is the communication protocol between an 2 * The NFC Controller Interface is the communication protocol between an
3 * NFC Controller (NFCC) and a Device Host (DH). 3 * NFC Controller (NFCC) and a Device Host (DH).
4 * 4 *
5 * Copyright (C) 2014 Marvell International Ltd.
5 * Copyright (C) 2011 Texas Instruments, Inc. 6 * Copyright (C) 2011 Texas Instruments, Inc.
6 * 7 *
7 * Written by Ilan Elias <ilane@ti.com> 8 * Written by Ilan Elias <ilane@ti.com>
@@ -65,19 +66,18 @@
65#define NCI_NFC_F_PASSIVE_POLL_MODE 0x02 66#define NCI_NFC_F_PASSIVE_POLL_MODE 0x02
66#define NCI_NFC_A_ACTIVE_POLL_MODE 0x03 67#define NCI_NFC_A_ACTIVE_POLL_MODE 0x03
67#define NCI_NFC_F_ACTIVE_POLL_MODE 0x05 68#define NCI_NFC_F_ACTIVE_POLL_MODE 0x05
68#define NCI_NFC_15693_PASSIVE_POLL_MODE 0x06 69#define NCI_NFC_V_PASSIVE_POLL_MODE 0x06
69#define NCI_NFC_A_PASSIVE_LISTEN_MODE 0x80 70#define NCI_NFC_A_PASSIVE_LISTEN_MODE 0x80
70#define NCI_NFC_B_PASSIVE_LISTEN_MODE 0x81 71#define NCI_NFC_B_PASSIVE_LISTEN_MODE 0x81
71#define NCI_NFC_F_PASSIVE_LISTEN_MODE 0x82 72#define NCI_NFC_F_PASSIVE_LISTEN_MODE 0x82
72#define NCI_NFC_A_ACTIVE_LISTEN_MODE 0x83 73#define NCI_NFC_A_ACTIVE_LISTEN_MODE 0x83
73#define NCI_NFC_F_ACTIVE_LISTEN_MODE 0x85 74#define NCI_NFC_F_ACTIVE_LISTEN_MODE 0x85
74#define NCI_NFC_15693_PASSIVE_LISTEN_MODE 0x86
75 75
76/* NCI RF Technologies */ 76/* NCI RF Technologies */
77#define NCI_NFC_RF_TECHNOLOGY_A 0x00 77#define NCI_NFC_RF_TECHNOLOGY_A 0x00
78#define NCI_NFC_RF_TECHNOLOGY_B 0x01 78#define NCI_NFC_RF_TECHNOLOGY_B 0x01
79#define NCI_NFC_RF_TECHNOLOGY_F 0x02 79#define NCI_NFC_RF_TECHNOLOGY_F 0x02
80#define NCI_NFC_RF_TECHNOLOGY_15693 0x03 80#define NCI_NFC_RF_TECHNOLOGY_V 0x03
81 81
82/* NCI Bit Rates */ 82/* NCI Bit Rates */
83#define NCI_NFC_BIT_RATE_106 0x00 83#define NCI_NFC_BIT_RATE_106 0x00
@@ -87,6 +87,7 @@
87#define NCI_NFC_BIT_RATE_1695 0x04 87#define NCI_NFC_BIT_RATE_1695 0x04
88#define NCI_NFC_BIT_RATE_3390 0x05 88#define NCI_NFC_BIT_RATE_3390 0x05
89#define NCI_NFC_BIT_RATE_6780 0x06 89#define NCI_NFC_BIT_RATE_6780 0x06
90#define NCI_NFC_BIT_RATE_26 0x20
90 91
91/* NCI RF Protocols */ 92/* NCI RF Protocols */
92#define NCI_RF_PROTOCOL_UNKNOWN 0x00 93#define NCI_RF_PROTOCOL_UNKNOWN 0x00
@@ -95,6 +96,7 @@
95#define NCI_RF_PROTOCOL_T3T 0x03 96#define NCI_RF_PROTOCOL_T3T 0x03
96#define NCI_RF_PROTOCOL_ISO_DEP 0x04 97#define NCI_RF_PROTOCOL_ISO_DEP 0x04
97#define NCI_RF_PROTOCOL_NFC_DEP 0x05 98#define NCI_RF_PROTOCOL_NFC_DEP 0x05
99#define NCI_RF_PROTOCOL_T5T 0x06
98 100
99/* NCI RF Interfaces */ 101/* NCI RF Interfaces */
100#define NCI_RF_INTERFACE_NFCEE_DIRECT 0x00 102#define NCI_RF_INTERFACE_NFCEE_DIRECT 0x00
@@ -328,6 +330,12 @@ struct rf_tech_specific_params_nfcf_poll {
328 __u8 sensf_res[18]; /* 16 or 18 Bytes */ 330 __u8 sensf_res[18]; /* 16 or 18 Bytes */
329} __packed; 331} __packed;
330 332
333struct rf_tech_specific_params_nfcv_poll {
334 __u8 res_flags;
335 __u8 dsfid;
336 __u8 uid[8]; /* 8 Bytes */
337} __packed;
338
331struct nci_rf_discover_ntf { 339struct nci_rf_discover_ntf {
332 __u8 rf_discovery_id; 340 __u8 rf_discovery_id;
333 __u8 rf_protocol; 341 __u8 rf_protocol;
@@ -338,6 +346,7 @@ struct nci_rf_discover_ntf {
338 struct rf_tech_specific_params_nfca_poll nfca_poll; 346 struct rf_tech_specific_params_nfca_poll nfca_poll;
339 struct rf_tech_specific_params_nfcb_poll nfcb_poll; 347 struct rf_tech_specific_params_nfcb_poll nfcb_poll;
340 struct rf_tech_specific_params_nfcf_poll nfcf_poll; 348 struct rf_tech_specific_params_nfcf_poll nfcf_poll;
349 struct rf_tech_specific_params_nfcv_poll nfcv_poll;
341 } rf_tech_specific_params; 350 } rf_tech_specific_params;
342 351
343 __u8 ntf_type; 352 __u8 ntf_type;
@@ -372,6 +381,7 @@ struct nci_rf_intf_activated_ntf {
372 struct rf_tech_specific_params_nfca_poll nfca_poll; 381 struct rf_tech_specific_params_nfca_poll nfca_poll;
373 struct rf_tech_specific_params_nfcb_poll nfcb_poll; 382 struct rf_tech_specific_params_nfcb_poll nfcb_poll;
374 struct rf_tech_specific_params_nfcf_poll nfcf_poll; 383 struct rf_tech_specific_params_nfcf_poll nfcf_poll;
384 struct rf_tech_specific_params_nfcv_poll nfcv_poll;
375 } rf_tech_specific_params; 385 } rf_tech_specific_params;
376 386
377 __u8 data_exch_rf_tech_and_mode; 387 __u8 data_exch_rf_tech_and_mode;
diff --git a/include/net/nfc/nci_core.h b/include/net/nfc/nci_core.h
index 1f9a0f5272fe..75d10e625c49 100644
--- a/include/net/nfc/nci_core.h
+++ b/include/net/nfc/nci_core.h
@@ -64,10 +64,11 @@ enum nci_state {
64struct nci_dev; 64struct nci_dev;
65 65
66struct nci_ops { 66struct nci_ops {
67 int (*open)(struct nci_dev *ndev); 67 int (*open)(struct nci_dev *ndev);
68 int (*close)(struct nci_dev *ndev); 68 int (*close)(struct nci_dev *ndev);
69 int (*send)(struct nci_dev *ndev, struct sk_buff *skb); 69 int (*send)(struct nci_dev *ndev, struct sk_buff *skb);
70 int (*setup)(struct nci_dev *ndev); 70 int (*setup)(struct nci_dev *ndev);
71 __u32 (*get_rfprotocol)(struct nci_dev *ndev, __u8 rf_protocol);
71}; 72};
72 73
73#define NCI_MAX_SUPPORTED_RF_INTERFACES 4 74#define NCI_MAX_SUPPORTED_RF_INTERFACES 4
diff --git a/include/uapi/linux/wil6210_uapi.h b/include/uapi/linux/wil6210_uapi.h
new file mode 100644
index 000000000000..6a3cddd156c4
--- /dev/null
+++ b/include/uapi/linux/wil6210_uapi.h
@@ -0,0 +1,87 @@
1/*
2 * Copyright (c) 2014 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 __WIL6210_UAPI_H__
18#define __WIL6210_UAPI_H__
19
20#if !defined(__KERNEL__)
21#define __user
22#endif
23
24#include <linux/sockios.h>
25
26/* Numbers SIOCDEVPRIVATE and SIOCDEVPRIVATE + 1
27 * are used by Android devices to implement PNO (preferred network offload).
28 * Albeit it is temporary solution, use different numbers to avoid conflicts
29 */
30
31/**
32 * Perform 32-bit I/O operation to the card memory
33 *
34 * User code should arrange data in memory like this:
35 *
36 * struct wil_memio io;
37 * struct ifreq ifr = {
38 * .ifr_data = &io,
39 * };
40 */
41#define WIL_IOCTL_MEMIO (SIOCDEVPRIVATE + 2)
42
43/**
44 * Perform block I/O operation to the card memory
45 *
46 * User code should arrange data in memory like this:
47 *
48 * void *buf;
49 * struct wil_memio_block io = {
50 * .block = buf,
51 * };
52 * struct ifreq ifr = {
53 * .ifr_data = &io,
54 * };
55 */
56#define WIL_IOCTL_MEMIO_BLOCK (SIOCDEVPRIVATE + 3)
57
58/**
59 * operation to perform
60 *
61 * @wil_mmio_op_mask - bits defining operation,
62 * @wil_mmio_addr_mask - bits defining addressing mode
63 */
64enum wil_memio_op {
65 wil_mmio_read = 0,
66 wil_mmio_write = 1,
67 wil_mmio_op_mask = 0xff,
68 wil_mmio_addr_linker = 0 << 8,
69 wil_mmio_addr_ahb = 1 << 8,
70 wil_mmio_addr_bar = 2 << 8,
71 wil_mmio_addr_mask = 0xff00,
72};
73
74struct wil_memio {
75 uint32_t op; /* enum wil_memio_op */
76 uint32_t addr; /* should be 32-bit aligned */
77 uint32_t val;
78};
79
80struct wil_memio_block {
81 uint32_t op; /* enum wil_memio_op */
82 uint32_t addr; /* should be 32-bit aligned */
83 uint32_t size; /* should be multiple of 4 */
84 void __user *block; /* block address */
85};
86
87#endif /* __WIL6210_UAPI_H__ */
diff --git a/net/bluetooth/6lowpan.c b/net/bluetooth/6lowpan.c
index 0920cb6ed572..c2e0d14433df 100644
--- a/net/bluetooth/6lowpan.c
+++ b/net/bluetooth/6lowpan.c
@@ -426,38 +426,33 @@ static void convert_dest_bdaddr(struct in6_addr *ip6_daddr,
426 *addr_type = get_addr_type_from_eui64(addr->b[5]); 426 *addr_type = get_addr_type_from_eui64(addr->b[5]);
427} 427}
428 428
429static int header_create(struct sk_buff *skb, struct net_device *netdev, 429static int setup_header(struct sk_buff *skb, struct net_device *netdev,
430 unsigned short type, const void *_daddr, 430 bdaddr_t *peer_addr, u8 *peer_addr_type)
431 const void *_saddr, unsigned int len)
432{ 431{
433 struct ipv6hdr *hdr; 432 struct in6_addr ipv6_daddr;
434 struct lowpan_dev *dev; 433 struct lowpan_dev *dev;
435 struct lowpan_peer *peer; 434 struct lowpan_peer *peer;
436 bdaddr_t addr, *any = BDADDR_ANY; 435 bdaddr_t addr, *any = BDADDR_ANY;
437 u8 *saddr, *daddr = any->b; 436 u8 *daddr = any->b;
438 u8 addr_type; 437 int err, status = 0;
439
440 if (type != ETH_P_IPV6)
441 return -EINVAL;
442
443 hdr = ipv6_hdr(skb);
444 438
445 dev = lowpan_dev(netdev); 439 dev = lowpan_dev(netdev);
446 440
447 if (ipv6_addr_is_multicast(&hdr->daddr)) { 441 memcpy(&ipv6_daddr, &lowpan_cb(skb)->addr, sizeof(ipv6_daddr));
448 memcpy(&lowpan_cb(skb)->addr, &hdr->daddr, 442
449 sizeof(struct in6_addr)); 443 if (ipv6_addr_is_multicast(&ipv6_daddr)) {
450 lowpan_cb(skb)->chan = NULL; 444 lowpan_cb(skb)->chan = NULL;
451 } else { 445 } else {
452 unsigned long flags; 446 unsigned long flags;
447 u8 addr_type;
453 448
454 /* Get destination BT device from skb. 449 /* Get destination BT device from skb.
455 * If there is no such peer then discard the packet. 450 * If there is no such peer then discard the packet.
456 */ 451 */
457 convert_dest_bdaddr(&hdr->daddr, &addr, &addr_type); 452 convert_dest_bdaddr(&ipv6_daddr, &addr, &addr_type);
458 453
459 BT_DBG("dest addr %pMR type %d IP %pI6c", &addr, 454 BT_DBG("dest addr %pMR type %d IP %pI6c", &addr,
460 addr_type, &hdr->daddr); 455 addr_type, &ipv6_daddr);
461 456
462 read_lock_irqsave(&devices_lock, flags); 457 read_lock_irqsave(&devices_lock, flags);
463 peer = peer_lookup_ba(dev, &addr, addr_type); 458 peer = peer_lookup_ba(dev, &addr, addr_type);
@@ -470,7 +465,7 @@ static int header_create(struct sk_buff *skb, struct net_device *netdev,
470 * the destination address. 465 * the destination address.
471 */ 466 */
472 read_lock_irqsave(&devices_lock, flags); 467 read_lock_irqsave(&devices_lock, flags);
473 peer = peer_lookup_dst(dev, &hdr->daddr, skb); 468 peer = peer_lookup_dst(dev, &ipv6_daddr, skb);
474 read_unlock_irqrestore(&devices_lock, flags); 469 read_unlock_irqrestore(&devices_lock, flags);
475 if (!peer) { 470 if (!peer) {
476 BT_DBG("no such peer %pMR found", &addr); 471 BT_DBG("no such peer %pMR found", &addr);
@@ -479,15 +474,37 @@ static int header_create(struct sk_buff *skb, struct net_device *netdev,
479 } 474 }
480 475
481 daddr = peer->eui64_addr; 476 daddr = peer->eui64_addr;
482 477 *peer_addr = addr;
483 memcpy(&lowpan_cb(skb)->addr, &hdr->daddr, 478 *peer_addr_type = addr_type;
484 sizeof(struct in6_addr));
485 lowpan_cb(skb)->chan = peer->chan; 479 lowpan_cb(skb)->chan = peer->chan;
480
481 status = 1;
486 } 482 }
487 483
488 saddr = dev->netdev->dev_addr; 484 lowpan_header_compress(skb, netdev, ETH_P_IPV6, daddr,
485 dev->netdev->dev_addr, skb->len);
489 486
490 return lowpan_header_compress(skb, netdev, type, daddr, saddr, len); 487 err = dev_hard_header(skb, netdev, ETH_P_IPV6, NULL, NULL, 0);
488 if (err < 0)
489 return err;
490
491 return status;
492}
493
494static int header_create(struct sk_buff *skb, struct net_device *netdev,
495 unsigned short type, const void *_daddr,
496 const void *_saddr, unsigned int len)
497{
498 struct ipv6hdr *hdr;
499
500 if (type != ETH_P_IPV6)
501 return -EINVAL;
502
503 hdr = ipv6_hdr(skb);
504
505 memcpy(&lowpan_cb(skb)->addr, &hdr->daddr, sizeof(struct in6_addr));
506
507 return 0;
491} 508}
492 509
493/* Packet to BT LE device */ 510/* Packet to BT LE device */
@@ -529,11 +546,12 @@ static int send_pkt(struct l2cap_chan *chan, struct sk_buff *skb,
529 return err; 546 return err;
530} 547}
531 548
532static void send_mcast_pkt(struct sk_buff *skb, struct net_device *netdev) 549static int send_mcast_pkt(struct sk_buff *skb, struct net_device *netdev)
533{ 550{
534 struct sk_buff *local_skb; 551 struct sk_buff *local_skb;
535 struct lowpan_dev *entry, *tmp; 552 struct lowpan_dev *entry, *tmp;
536 unsigned long flags; 553 unsigned long flags;
554 int err = 0;
537 555
538 read_lock_irqsave(&devices_lock, flags); 556 read_lock_irqsave(&devices_lock, flags);
539 557
@@ -547,57 +565,77 @@ static void send_mcast_pkt(struct sk_buff *skb, struct net_device *netdev)
547 dev = lowpan_dev(entry->netdev); 565 dev = lowpan_dev(entry->netdev);
548 566
549 list_for_each_entry_safe(pentry, ptmp, &dev->peers, list) { 567 list_for_each_entry_safe(pentry, ptmp, &dev->peers, list) {
568 int ret;
569
550 local_skb = skb_clone(skb, GFP_ATOMIC); 570 local_skb = skb_clone(skb, GFP_ATOMIC);
551 571
552 send_pkt(pentry->chan, local_skb, netdev); 572 BT_DBG("xmit %s to %pMR type %d IP %pI6c chan %p",
573 netdev->name,
574 &pentry->chan->dst, pentry->chan->dst_type,
575 &pentry->peer_addr, pentry->chan);
576 ret = send_pkt(pentry->chan, local_skb, netdev);
577 if (ret < 0)
578 err = ret;
553 579
554 kfree_skb(local_skb); 580 kfree_skb(local_skb);
555 } 581 }
556 } 582 }
557 583
558 read_unlock_irqrestore(&devices_lock, flags); 584 read_unlock_irqrestore(&devices_lock, flags);
585
586 return err;
559} 587}
560 588
561static netdev_tx_t bt_xmit(struct sk_buff *skb, struct net_device *netdev) 589static netdev_tx_t bt_xmit(struct sk_buff *skb, struct net_device *netdev)
562{ 590{
563 int err = 0; 591 int err = 0;
564 struct lowpan_dev *dev;
565 struct lowpan_peer *peer;
566 bdaddr_t addr; 592 bdaddr_t addr;
567 u8 addr_type; 593 u8 addr_type;
594 struct sk_buff *tmpskb;
568 595
569 if (ipv6_addr_is_multicast(&lowpan_cb(skb)->addr)) { 596 /* We must take a copy of the skb before we modify/replace the ipv6
570 /* We need to send the packet to every device 597 * header as the header could be used elsewhere
571 * behind this interface. 598 */
572 */ 599 tmpskb = skb_unshare(skb, GFP_ATOMIC);
573 send_mcast_pkt(skb, netdev); 600 if (!tmpskb) {
574 } else { 601 kfree_skb(skb);
575 unsigned long flags; 602 return NET_XMIT_DROP;
576 603 }
577 convert_dest_bdaddr(&lowpan_cb(skb)->addr, &addr, &addr_type); 604 skb = tmpskb;
578 dev = lowpan_dev(netdev);
579
580 read_lock_irqsave(&devices_lock, flags);
581 peer = peer_lookup_ba(dev, &addr, addr_type);
582 if (!peer)
583 peer = peer_lookup_dst(dev, &lowpan_cb(skb)->addr, skb);
584 read_unlock_irqrestore(&devices_lock, flags);
585 605
586 BT_DBG("xmit %s to %pMR type %d IP %pI6c peer %p", 606 /* Return values from setup_header()
587 netdev->name, &addr, addr_type, 607 * <0 - error, packet is dropped
588 &lowpan_cb(skb)->addr, peer); 608 * 0 - this is a multicast packet
609 * 1 - this is unicast packet
610 */
611 err = setup_header(skb, netdev, &addr, &addr_type);
612 if (err < 0) {
613 kfree_skb(skb);
614 return NET_XMIT_DROP;
615 }
589 616
590 if (peer && peer->chan) 617 if (err) {
591 err = send_pkt(peer->chan, skb, netdev); 618 if (lowpan_cb(skb)->chan) {
592 else 619 BT_DBG("xmit %s to %pMR type %d IP %pI6c chan %p",
620 netdev->name, &addr, addr_type,
621 &lowpan_cb(skb)->addr, lowpan_cb(skb)->chan);
622 err = send_pkt(lowpan_cb(skb)->chan, skb, netdev);
623 } else {
593 err = -ENOENT; 624 err = -ENOENT;
625 }
626 } else {
627 /* We need to send the packet to every device behind this
628 * interface.
629 */
630 err = send_mcast_pkt(skb, netdev);
594 } 631 }
632
595 dev_kfree_skb(skb); 633 dev_kfree_skb(skb);
596 634
597 if (err) 635 if (err)
598 BT_DBG("ERROR: xmit failed (%d)", err); 636 BT_DBG("ERROR: xmit failed (%d)", err);
599 637
600 return (err < 0) ? NET_XMIT_DROP : err; 638 return err < 0 ? NET_XMIT_DROP : err;
601} 639}
602 640
603static const struct net_device_ops netdev_ops = { 641static const struct net_device_ops netdev_ops = {
@@ -617,7 +655,8 @@ static void netdev_setup(struct net_device *dev)
617 dev->needed_tailroom = 0; 655 dev->needed_tailroom = 0;
618 dev->mtu = IPV6_MIN_MTU; 656 dev->mtu = IPV6_MIN_MTU;
619 dev->tx_queue_len = 0; 657 dev->tx_queue_len = 0;
620 dev->flags = IFF_RUNNING | IFF_POINTOPOINT; 658 dev->flags = IFF_RUNNING | IFF_POINTOPOINT |
659 IFF_MULTICAST;
621 dev->watchdog_timeo = 0; 660 dev->watchdog_timeo = 0;
622 661
623 dev->netdev_ops = &netdev_ops; 662 dev->netdev_ops = &netdev_ops;
@@ -950,6 +989,9 @@ static void chan_suspend_cb(struct l2cap_chan *chan)
950 989
951 BT_DBG("chan %p conn %p skb %p", chan, chan->conn, skb); 990 BT_DBG("chan %p conn %p skb %p", chan, chan->conn, skb);
952 991
992 if (!skb)
993 return;
994
953 lowpan_cb(skb)->status = -EAGAIN; 995 lowpan_cb(skb)->status = -EAGAIN;
954} 996}
955 997
@@ -959,6 +1001,9 @@ static void chan_resume_cb(struct l2cap_chan *chan)
959 1001
960 BT_DBG("chan %p conn %p skb %p", chan, chan->conn, skb); 1002 BT_DBG("chan %p conn %p skb %p", chan, chan->conn, skb);
961 1003
1004 if (!skb)
1005 return;
1006
962 lowpan_cb(skb)->status = 0; 1007 lowpan_cb(skb)->status = 0;
963} 1008}
964 1009
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index 4dca0299ed96..339c74ad4553 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -709,8 +709,11 @@ EXPORT_SYMBOL_GPL(bt_debugfs);
709 709
710static int __init bt_init(void) 710static int __init bt_init(void)
711{ 711{
712 struct sk_buff *skb;
712 int err; 713 int err;
713 714
715 BUILD_BUG_ON(sizeof(struct bt_skb_cb) > sizeof(skb->cb));
716
714 BT_INFO("Core ver %s", VERSION); 717 BT_INFO("Core ver %s", VERSION);
715 718
716 bt_debugfs = debugfs_create_dir("bluetooth", NULL); 719 bt_debugfs = debugfs_create_dir("bluetooth", NULL);
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
index e3d7ae9e2edd..b9517bd17190 100644
--- a/net/bluetooth/hci_conn.c
+++ b/net/bluetooth/hci_conn.c
@@ -36,19 +36,25 @@
36struct sco_param { 36struct sco_param {
37 u16 pkt_type; 37 u16 pkt_type;
38 u16 max_latency; 38 u16 max_latency;
39 u8 retrans_effort;
40};
41
42static const struct sco_param esco_param_cvsd[] = {
43 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x000a, 0x01 }, /* S3 */
44 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x0007, 0x01 }, /* S2 */
45 { EDR_ESCO_MASK | ESCO_EV3, 0x0007, 0x01 }, /* S1 */
46 { EDR_ESCO_MASK | ESCO_HV3, 0xffff, 0x01 }, /* D1 */
47 { EDR_ESCO_MASK | ESCO_HV1, 0xffff, 0x01 }, /* D0 */
39}; 48};
40 49
41static const struct sco_param sco_param_cvsd[] = { 50static const struct sco_param sco_param_cvsd[] = {
42 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x000a }, /* S3 */ 51 { EDR_ESCO_MASK | ESCO_HV3, 0xffff, 0xff }, /* D1 */
43 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x0007 }, /* S2 */ 52 { EDR_ESCO_MASK | ESCO_HV1, 0xffff, 0xff }, /* D0 */
44 { EDR_ESCO_MASK | ESCO_EV3, 0x0007 }, /* S1 */
45 { EDR_ESCO_MASK | ESCO_HV3, 0xffff }, /* D1 */
46 { EDR_ESCO_MASK | ESCO_HV1, 0xffff }, /* D0 */
47}; 53};
48 54
49static const struct sco_param sco_param_wideband[] = { 55static const struct sco_param esco_param_msbc[] = {
50 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x000d }, /* T2 */ 56 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x000d, 0x02 }, /* T2 */
51 { EDR_ESCO_MASK | ESCO_EV3, 0x0008 }, /* T1 */ 57 { EDR_ESCO_MASK | ESCO_EV3, 0x0008, 0x02 }, /* T1 */
52}; 58};
53 59
54static void hci_le_create_connection_cancel(struct hci_conn *conn) 60static void hci_le_create_connection_cancel(struct hci_conn *conn)
@@ -116,7 +122,7 @@ static void hci_reject_sco(struct hci_conn *conn)
116{ 122{
117 struct hci_cp_reject_sync_conn_req cp; 123 struct hci_cp_reject_sync_conn_req cp;
118 124
119 cp.reason = HCI_ERROR_REMOTE_USER_TERM; 125 cp.reason = HCI_ERROR_REJ_LIMITED_RESOURCES;
120 bacpy(&cp.bdaddr, &conn->dst); 126 bacpy(&cp.bdaddr, &conn->dst);
121 127
122 hci_send_cmd(conn->hdev, HCI_OP_REJECT_SYNC_CONN_REQ, sizeof(cp), &cp); 128 hci_send_cmd(conn->hdev, HCI_OP_REJECT_SYNC_CONN_REQ, sizeof(cp), &cp);
@@ -201,21 +207,26 @@ bool hci_setup_sync(struct hci_conn *conn, __u16 handle)
201 207
202 switch (conn->setting & SCO_AIRMODE_MASK) { 208 switch (conn->setting & SCO_AIRMODE_MASK) {
203 case SCO_AIRMODE_TRANSP: 209 case SCO_AIRMODE_TRANSP:
204 if (conn->attempt > ARRAY_SIZE(sco_param_wideband)) 210 if (conn->attempt > ARRAY_SIZE(esco_param_msbc))
205 return false; 211 return false;
206 cp.retrans_effort = 0x02; 212 param = &esco_param_msbc[conn->attempt - 1];
207 param = &sco_param_wideband[conn->attempt - 1];
208 break; 213 break;
209 case SCO_AIRMODE_CVSD: 214 case SCO_AIRMODE_CVSD:
210 if (conn->attempt > ARRAY_SIZE(sco_param_cvsd)) 215 if (lmp_esco_capable(conn->link)) {
211 return false; 216 if (conn->attempt > ARRAY_SIZE(esco_param_cvsd))
212 cp.retrans_effort = 0x01; 217 return false;
213 param = &sco_param_cvsd[conn->attempt - 1]; 218 param = &esco_param_cvsd[conn->attempt - 1];
219 } else {
220 if (conn->attempt > ARRAY_SIZE(sco_param_cvsd))
221 return false;
222 param = &sco_param_cvsd[conn->attempt - 1];
223 }
214 break; 224 break;
215 default: 225 default:
216 return false; 226 return false;
217 } 227 }
218 228
229 cp.retrans_effort = param->retrans_effort;
219 cp.pkt_type = __cpu_to_le16(param->pkt_type); 230 cp.pkt_type = __cpu_to_le16(param->pkt_type);
220 cp.max_latency = __cpu_to_le16(param->max_latency); 231 cp.max_latency = __cpu_to_le16(param->max_latency);
221 232
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 067526d9680d..cb05d7f16a34 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -4374,26 +4374,6 @@ static int hci_reassembly(struct hci_dev *hdev, int type, void *data,
4374 return remain; 4374 return remain;
4375} 4375}
4376 4376
4377int hci_recv_fragment(struct hci_dev *hdev, int type, void *data, int count)
4378{
4379 int rem = 0;
4380
4381 if (type < HCI_ACLDATA_PKT || type > HCI_EVENT_PKT)
4382 return -EILSEQ;
4383
4384 while (count) {
4385 rem = hci_reassembly(hdev, type, data, count, type - 1);
4386 if (rem < 0)
4387 return rem;
4388
4389 data += (count - rem);
4390 count = rem;
4391 }
4392
4393 return rem;
4394}
4395EXPORT_SYMBOL(hci_recv_fragment);
4396
4397#define STREAM_REASSEMBLY 0 4377#define STREAM_REASSEMBLY 0
4398 4378
4399int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count) 4379int hci_recv_stream_fragment(struct hci_dev *hdev, void *data, int count)
@@ -4547,6 +4527,7 @@ static struct sk_buff *hci_prepare_cmd(struct hci_dev *hdev, u16 opcode,
4547 BT_DBG("skb len %d", skb->len); 4527 BT_DBG("skb len %d", skb->len);
4548 4528
4549 bt_cb(skb)->pkt_type = HCI_COMMAND_PKT; 4529 bt_cb(skb)->pkt_type = HCI_COMMAND_PKT;
4530 bt_cb(skb)->opcode = opcode;
4550 4531
4551 return skb; 4532 return skb;
4552} 4533}
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c
index 8d53fc57faba..b6f9777e057d 100644
--- a/net/bluetooth/l2cap_core.c
+++ b/net/bluetooth/l2cap_core.c
@@ -6980,8 +6980,6 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
6980 6980
6981 hci_dev_lock(hdev); 6981 hci_dev_lock(hdev);
6982 6982
6983 l2cap_chan_lock(chan);
6984
6985 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid && 6983 if (!is_valid_psm(__le16_to_cpu(psm), dst_type) && !cid &&
6986 chan->chan_type != L2CAP_CHAN_RAW) { 6984 chan->chan_type != L2CAP_CHAN_RAW) {
6987 err = -EINVAL; 6985 err = -EINVAL;
@@ -7078,17 +7076,20 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7078 goto done; 7076 goto done;
7079 } 7077 }
7080 7078
7079 mutex_lock(&conn->chan_lock);
7080 l2cap_chan_lock(chan);
7081
7081 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) { 7082 if (cid && __l2cap_get_chan_by_dcid(conn, cid)) {
7082 hci_conn_drop(hcon); 7083 hci_conn_drop(hcon);
7083 err = -EBUSY; 7084 err = -EBUSY;
7084 goto done; 7085 goto chan_unlock;
7085 } 7086 }
7086 7087
7087 /* Update source addr of the socket */ 7088 /* Update source addr of the socket */
7088 bacpy(&chan->src, &hcon->src); 7089 bacpy(&chan->src, &hcon->src);
7089 chan->src_type = bdaddr_type(hcon, hcon->src_type); 7090 chan->src_type = bdaddr_type(hcon, hcon->src_type);
7090 7091
7091 l2cap_chan_add(conn, chan); 7092 __l2cap_chan_add(conn, chan);
7092 7093
7093 /* l2cap_chan_add takes its own ref so we can drop this one */ 7094 /* l2cap_chan_add takes its own ref so we can drop this one */
7094 hci_conn_drop(hcon); 7095 hci_conn_drop(hcon);
@@ -7114,8 +7115,10 @@ int l2cap_chan_connect(struct l2cap_chan *chan, __le16 psm, u16 cid,
7114 7115
7115 err = 0; 7116 err = 0;
7116 7117
7117done: 7118chan_unlock:
7118 l2cap_chan_unlock(chan); 7119 l2cap_chan_unlock(chan);
7120 mutex_unlock(&conn->chan_lock);
7121done:
7119 hci_dev_unlock(hdev); 7122 hci_dev_unlock(hdev);
7120 hci_dev_put(hdev); 7123 hci_dev_put(hdev);
7121 return err; 7124 return err;
diff --git a/net/bluetooth/lib.c b/net/bluetooth/lib.c
index 941ad7530eda..b36bc0415854 100644
--- a/net/bluetooth/lib.c
+++ b/net/bluetooth/lib.c
@@ -135,40 +135,34 @@ int bt_to_errno(__u16 code)
135} 135}
136EXPORT_SYMBOL(bt_to_errno); 136EXPORT_SYMBOL(bt_to_errno);
137 137
138int bt_info(const char *format, ...) 138void bt_info(const char *format, ...)
139{ 139{
140 struct va_format vaf; 140 struct va_format vaf;
141 va_list args; 141 va_list args;
142 int r;
143 142
144 va_start(args, format); 143 va_start(args, format);
145 144
146 vaf.fmt = format; 145 vaf.fmt = format;
147 vaf.va = &args; 146 vaf.va = &args;
148 147
149 r = pr_info("%pV", &vaf); 148 pr_info("%pV", &vaf);
150 149
151 va_end(args); 150 va_end(args);
152
153 return r;
154} 151}
155EXPORT_SYMBOL(bt_info); 152EXPORT_SYMBOL(bt_info);
156 153
157int bt_err(const char *format, ...) 154void bt_err(const char *format, ...)
158{ 155{
159 struct va_format vaf; 156 struct va_format vaf;
160 va_list args; 157 va_list args;
161 int r;
162 158
163 va_start(args, format); 159 va_start(args, format);
164 160
165 vaf.fmt = format; 161 vaf.fmt = format;
166 vaf.va = &args; 162 vaf.va = &args;
167 163
168 r = pr_err("%pV", &vaf); 164 pr_err("%pV", &vaf);
169 165
170 va_end(args); 166 va_end(args);
171
172 return r;
173} 167}
174EXPORT_SYMBOL(bt_err); 168EXPORT_SYMBOL(bt_err);
diff --git a/net/bluetooth/smp.c b/net/bluetooth/smp.c
index 51fc7db2d84e..f09b6b65cf6b 100644
--- a/net/bluetooth/smp.c
+++ b/net/bluetooth/smp.c
@@ -494,8 +494,11 @@ static int tk_request(struct l2cap_conn *conn, u8 remote_oob, u8 auth,
494 } 494 }
495 495
496 /* Not Just Works/Confirm results in MITM Authentication */ 496 /* Not Just Works/Confirm results in MITM Authentication */
497 if (method != JUST_CFM) 497 if (method != JUST_CFM) {
498 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags); 498 set_bit(SMP_FLAG_MITM_AUTH, &smp->flags);
499 if (hcon->pending_sec_level < BT_SECURITY_HIGH)
500 hcon->pending_sec_level = BT_SECURITY_HIGH;
501 }
499 502
500 /* If both devices have Keyoard-Display I/O, the master 503 /* If both devices have Keyoard-Display I/O, the master
501 * Confirms and the slave Enters the passkey. 504 * Confirms and the slave Enters the passkey.
diff --git a/net/ieee802154/6lowpan_rtnl.c b/net/ieee802154/6lowpan_rtnl.c
index 5e788cdc499a..44136297b673 100644
--- a/net/ieee802154/6lowpan_rtnl.c
+++ b/net/ieee802154/6lowpan_rtnl.c
@@ -71,20 +71,42 @@ struct lowpan_dev_record {
71 struct list_head list; 71 struct list_head list;
72}; 72};
73 73
74/* don't save pan id, it's intra pan */
75struct lowpan_addr {
76 u8 mode;
77 union {
78 /* IPv6 needs big endian here */
79 __be64 extended_addr;
80 __be16 short_addr;
81 } u;
82};
83
84struct lowpan_addr_info {
85 struct lowpan_addr daddr;
86 struct lowpan_addr saddr;
87};
88
74static inline struct 89static inline struct
75lowpan_dev_info *lowpan_dev_info(const struct net_device *dev) 90lowpan_dev_info *lowpan_dev_info(const struct net_device *dev)
76{ 91{
77 return netdev_priv(dev); 92 return netdev_priv(dev);
78} 93}
79 94
95static inline struct
96lowpan_addr_info *lowpan_skb_priv(const struct sk_buff *skb)
97{
98 WARN_ON_ONCE(skb_headroom(skb) < sizeof(struct lowpan_addr_info));
99 return (struct lowpan_addr_info *)(skb->data -
100 sizeof(struct lowpan_addr_info));
101}
102
80static int lowpan_header_create(struct sk_buff *skb, struct net_device *dev, 103static int lowpan_header_create(struct sk_buff *skb, struct net_device *dev,
81 unsigned short type, const void *_daddr, 104 unsigned short type, const void *_daddr,
82 const void *_saddr, unsigned int len) 105 const void *_saddr, unsigned int len)
83{ 106{
84 const u8 *saddr = _saddr; 107 const u8 *saddr = _saddr;
85 const u8 *daddr = _daddr; 108 const u8 *daddr = _daddr;
86 struct ieee802154_addr sa, da; 109 struct lowpan_addr_info *info;
87 struct ieee802154_mac_cb *cb = mac_cb_init(skb);
88 110
89 /* TODO: 111 /* TODO:
90 * if this package isn't ipv6 one, where should it be routed? 112 * if this package isn't ipv6 one, where should it be routed?
@@ -98,41 +120,17 @@ static int lowpan_header_create(struct sk_buff *skb, struct net_device *dev,
98 raw_dump_inline(__func__, "saddr", (unsigned char *)saddr, 8); 120 raw_dump_inline(__func__, "saddr", (unsigned char *)saddr, 8);
99 raw_dump_inline(__func__, "daddr", (unsigned char *)daddr, 8); 121 raw_dump_inline(__func__, "daddr", (unsigned char *)daddr, 8);
100 122
101 lowpan_header_compress(skb, dev, type, daddr, saddr, len); 123 info = lowpan_skb_priv(skb);
102
103 /* NOTE1: I'm still unsure about the fact that compression and WPAN
104 * header are created here and not later in the xmit. So wait for
105 * an opinion of net maintainers.
106 */
107 /* NOTE2: to be absolutely correct, we must derive PANid information
108 * from MAC subif of the 'dev' and 'real_dev' network devices, but
109 * this isn't implemented in mainline yet, so currently we assign 0xff
110 */
111 cb->type = IEEE802154_FC_TYPE_DATA;
112
113 /* prepare wpan address data */
114 sa.mode = IEEE802154_ADDR_LONG;
115 sa.pan_id = ieee802154_mlme_ops(dev)->get_pan_id(dev);
116 sa.extended_addr = ieee802154_devaddr_from_raw(saddr);
117
118 /* intra-PAN communications */
119 da.pan_id = sa.pan_id;
120
121 /* if the destination address is the broadcast address, use the
122 * corresponding short address
123 */
124 if (lowpan_is_addr_broadcast(daddr)) {
125 da.mode = IEEE802154_ADDR_SHORT;
126 da.short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST);
127 } else {
128 da.mode = IEEE802154_ADDR_LONG;
129 da.extended_addr = ieee802154_devaddr_from_raw(daddr);
130 }
131 124
132 cb->ackreq = !lowpan_is_addr_broadcast(daddr); 125 /* TODO: Currently we only support extended_addr */
126 info->daddr.mode = IEEE802154_ADDR_LONG;
127 memcpy(&info->daddr.u.extended_addr, daddr,
128 sizeof(info->daddr.u.extended_addr));
129 info->saddr.mode = IEEE802154_ADDR_LONG;
130 memcpy(&info->saddr.u.extended_addr, saddr,
131 sizeof(info->daddr.u.extended_addr));
133 132
134 return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev, 133 return 0;
135 type, (void *)&da, (void *)&sa, 0);
136} 134}
137 135
138static int lowpan_give_skb_to_devices(struct sk_buff *skb, 136static int lowpan_give_skb_to_devices(struct sk_buff *skb,
@@ -330,13 +328,68 @@ err:
330 return rc; 328 return rc;
331} 329}
332 330
331static int lowpan_header(struct sk_buff *skb, struct net_device *dev)
332{
333 struct ieee802154_addr sa, da;
334 struct ieee802154_mac_cb *cb = mac_cb_init(skb);
335 struct lowpan_addr_info info;
336 void *daddr, *saddr;
337
338 memcpy(&info, lowpan_skb_priv(skb), sizeof(info));
339
340 /* TODO: Currently we only support extended_addr */
341 daddr = &info.daddr.u.extended_addr;
342 saddr = &info.saddr.u.extended_addr;
343
344 lowpan_header_compress(skb, dev, ETH_P_IPV6, daddr, saddr, skb->len);
345
346 cb->type = IEEE802154_FC_TYPE_DATA;
347
348 /* prepare wpan address data */
349 sa.mode = IEEE802154_ADDR_LONG;
350 sa.pan_id = ieee802154_mlme_ops(dev)->get_pan_id(dev);
351 sa.extended_addr = ieee802154_devaddr_from_raw(saddr);
352
353 /* intra-PAN communications */
354 da.pan_id = sa.pan_id;
355
356 /* if the destination address is the broadcast address, use the
357 * corresponding short address
358 */
359 if (lowpan_is_addr_broadcast((const u8 *)daddr)) {
360 da.mode = IEEE802154_ADDR_SHORT;
361 da.short_addr = cpu_to_le16(IEEE802154_ADDR_BROADCAST);
362 cb->ackreq = false;
363 } else {
364 da.mode = IEEE802154_ADDR_LONG;
365 da.extended_addr = ieee802154_devaddr_from_raw(daddr);
366 cb->ackreq = true;
367 }
368
369 return dev_hard_header(skb, lowpan_dev_info(dev)->real_dev,
370 ETH_P_IPV6, (void *)&da, (void *)&sa, 0);
371}
372
333static netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *dev) 373static netdev_tx_t lowpan_xmit(struct sk_buff *skb, struct net_device *dev)
334{ 374{
335 struct ieee802154_hdr wpan_hdr; 375 struct ieee802154_hdr wpan_hdr;
336 int max_single; 376 int max_single, ret;
337 377
338 pr_debug("package xmit\n"); 378 pr_debug("package xmit\n");
339 379
380 /* We must take a copy of the skb before we modify/replace the ipv6
381 * header as the header could be used elsewhere
382 */
383 skb = skb_unshare(skb, GFP_ATOMIC);
384 if (!skb)
385 return NET_XMIT_DROP;
386
387 ret = lowpan_header(skb, dev);
388 if (ret < 0) {
389 kfree_skb(skb);
390 return NET_XMIT_DROP;
391 }
392
340 if (ieee802154_hdr_peek(skb, &wpan_hdr) < 0) { 393 if (ieee802154_hdr_peek(skb, &wpan_hdr) < 0) {
341 kfree_skb(skb); 394 kfree_skb(skb);
342 return NET_XMIT_DROP; 395 return NET_XMIT_DROP;
diff --git a/net/nfc/digital_dep.c b/net/nfc/digital_dep.c
index e1638dab076d..b60aa35c074f 100644
--- a/net/nfc/digital_dep.c
+++ b/net/nfc/digital_dep.c
@@ -33,6 +33,8 @@
33#define DIGITAL_ATR_REQ_MAX_SIZE 64 33#define DIGITAL_ATR_REQ_MAX_SIZE 64
34 34
35#define DIGITAL_LR_BITS_PAYLOAD_SIZE_254B 0x30 35#define DIGITAL_LR_BITS_PAYLOAD_SIZE_254B 0x30
36#define DIGITAL_FSL_BITS_PAYLOAD_SIZE_254B \
37 (DIGITAL_LR_BITS_PAYLOAD_SIZE_254B >> 4)
36#define DIGITAL_GB_BIT 0x02 38#define DIGITAL_GB_BIT 0x02
37 39
38#define DIGITAL_NFC_DEP_PFB_TYPE(pfb) ((pfb) & 0xE0) 40#define DIGITAL_NFC_DEP_PFB_TYPE(pfb) ((pfb) & 0xE0)
@@ -127,6 +129,98 @@ static int digital_skb_pull_dep_sod(struct nfc_digital_dev *ddev,
127 return 0; 129 return 0;
128} 130}
129 131
132static void digital_in_recv_psl_res(struct nfc_digital_dev *ddev, void *arg,
133 struct sk_buff *resp)
134{
135 struct nfc_target *target = arg;
136 struct digital_psl_res *psl_res;
137 int rc;
138
139 if (IS_ERR(resp)) {
140 rc = PTR_ERR(resp);
141 resp = NULL;
142 goto exit;
143 }
144
145 rc = ddev->skb_check_crc(resp);
146 if (rc) {
147 PROTOCOL_ERR("14.4.1.6");
148 goto exit;
149 }
150
151 rc = digital_skb_pull_dep_sod(ddev, resp);
152 if (rc) {
153 PROTOCOL_ERR("14.4.1.2");
154 goto exit;
155 }
156
157 psl_res = (struct digital_psl_res *)resp->data;
158
159 if ((resp->len != sizeof(*psl_res)) ||
160 (psl_res->dir != DIGITAL_NFC_DEP_FRAME_DIR_IN) ||
161 (psl_res->cmd != DIGITAL_CMD_PSL_RES)) {
162 rc = -EIO;
163 goto exit;
164 }
165
166 rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_RF_TECH,
167 NFC_DIGITAL_RF_TECH_424F);
168 if (rc)
169 goto exit;
170
171 rc = digital_in_configure_hw(ddev, NFC_DIGITAL_CONFIG_FRAMING,
172 NFC_DIGITAL_FRAMING_NFCF_NFC_DEP);
173 if (rc)
174 goto exit;
175
176 if (!DIGITAL_DRV_CAPS_IN_CRC(ddev) &&
177 (ddev->curr_rf_tech == NFC_DIGITAL_RF_TECH_106A)) {
178 ddev->skb_add_crc = digital_skb_add_crc_f;
179 ddev->skb_check_crc = digital_skb_check_crc_f;
180 }
181
182 ddev->curr_rf_tech = NFC_DIGITAL_RF_TECH_424F;
183
184 nfc_dep_link_is_up(ddev->nfc_dev, target->idx, NFC_COMM_ACTIVE,
185 NFC_RF_INITIATOR);
186
187 ddev->curr_nfc_dep_pni = 0;
188
189exit:
190 dev_kfree_skb(resp);
191
192 if (rc)
193 ddev->curr_protocol = 0;
194}
195
196static int digital_in_send_psl_req(struct nfc_digital_dev *ddev,
197 struct nfc_target *target)
198{
199 struct sk_buff *skb;
200 struct digital_psl_req *psl_req;
201
202 skb = digital_skb_alloc(ddev, sizeof(*psl_req));
203 if (!skb)
204 return -ENOMEM;
205
206 skb_put(skb, sizeof(*psl_req));
207
208 psl_req = (struct digital_psl_req *)skb->data;
209
210 psl_req->dir = DIGITAL_NFC_DEP_FRAME_DIR_OUT;
211 psl_req->cmd = DIGITAL_CMD_PSL_REQ;
212 psl_req->did = 0;
213 psl_req->brs = (0x2 << 3) | 0x2; /* 424F both directions */
214 psl_req->fsl = DIGITAL_FSL_BITS_PAYLOAD_SIZE_254B;
215
216 digital_skb_push_dep_sod(ddev, skb);
217
218 ddev->skb_add_crc(skb);
219
220 return digital_in_send_cmd(ddev, skb, 500, digital_in_recv_psl_res,
221 target);
222}
223
130static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg, 224static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg,
131 struct sk_buff *resp) 225 struct sk_buff *resp)
132{ 226{
@@ -166,6 +260,13 @@ static void digital_in_recv_atr_res(struct nfc_digital_dev *ddev, void *arg,
166 if (rc) 260 if (rc)
167 goto exit; 261 goto exit;
168 262
263 if ((ddev->protocols & NFC_PROTO_FELICA_MASK) &&
264 (ddev->curr_rf_tech != NFC_DIGITAL_RF_TECH_424F)) {
265 rc = digital_in_send_psl_req(ddev, target);
266 if (!rc)
267 goto exit;
268 }
269
169 rc = nfc_dep_link_is_up(ddev->nfc_dev, target->idx, NFC_COMM_ACTIVE, 270 rc = nfc_dep_link_is_up(ddev->nfc_dev, target->idx, NFC_COMM_ACTIVE,
170 NFC_RF_INITIATOR); 271 NFC_RF_INITIATOR);
171 272
diff --git a/net/nfc/nci/core.c b/net/nfc/nci/core.c
index 2b400e1a8695..90b16cb40058 100644
--- a/net/nfc/nci/core.c
+++ b/net/nfc/nci/core.c
@@ -231,6 +231,14 @@ static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
231 cmd.num_disc_configs++; 231 cmd.num_disc_configs++;
232 } 232 }
233 233
234 if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
235 (protocols & NFC_PROTO_ISO15693_MASK)) {
236 cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
237 NCI_NFC_V_PASSIVE_POLL_MODE;
238 cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
239 cmd.num_disc_configs++;
240 }
241
234 nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD, 242 nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
235 (1 + (cmd.num_disc_configs * sizeof(struct disc_config))), 243 (1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
236 &cmd); 244 &cmd);
@@ -751,10 +759,6 @@ int nci_register_device(struct nci_dev *ndev)
751 struct device *dev = &ndev->nfc_dev->dev; 759 struct device *dev = &ndev->nfc_dev->dev;
752 char name[32]; 760 char name[32];
753 761
754 rc = nfc_register_device(ndev->nfc_dev);
755 if (rc)
756 goto exit;
757
758 ndev->flags = 0; 762 ndev->flags = 0;
759 763
760 INIT_WORK(&ndev->cmd_work, nci_cmd_work); 764 INIT_WORK(&ndev->cmd_work, nci_cmd_work);
@@ -762,7 +766,7 @@ int nci_register_device(struct nci_dev *ndev)
762 ndev->cmd_wq = create_singlethread_workqueue(name); 766 ndev->cmd_wq = create_singlethread_workqueue(name);
763 if (!ndev->cmd_wq) { 767 if (!ndev->cmd_wq) {
764 rc = -ENOMEM; 768 rc = -ENOMEM;
765 goto unreg_exit; 769 goto exit;
766 } 770 }
767 771
768 INIT_WORK(&ndev->rx_work, nci_rx_work); 772 INIT_WORK(&ndev->rx_work, nci_rx_work);
@@ -792,6 +796,10 @@ int nci_register_device(struct nci_dev *ndev)
792 796
793 mutex_init(&ndev->req_lock); 797 mutex_init(&ndev->req_lock);
794 798
799 rc = nfc_register_device(ndev->nfc_dev);
800 if (rc)
801 goto destroy_rx_wq_exit;
802
795 goto exit; 803 goto exit;
796 804
797destroy_rx_wq_exit: 805destroy_rx_wq_exit:
@@ -800,9 +808,6 @@ destroy_rx_wq_exit:
800destroy_cmd_wq_exit: 808destroy_cmd_wq_exit:
801 destroy_workqueue(ndev->cmd_wq); 809 destroy_workqueue(ndev->cmd_wq);
802 810
803unreg_exit:
804 nfc_unregister_device(ndev->nfc_dev);
805
806exit: 811exit:
807 return rc; 812 return rc;
808} 813}
diff --git a/net/nfc/nci/data.c b/net/nfc/nci/data.c
index 6c3aef852876..427ef2c7ab68 100644
--- a/net/nfc/nci/data.c
+++ b/net/nfc/nci/data.c
@@ -241,9 +241,12 @@ void nci_rx_data_packet(struct nci_dev *ndev, struct sk_buff *skb)
241 /* strip the nci data header */ 241 /* strip the nci data header */
242 skb_pull(skb, NCI_DATA_HDR_SIZE); 242 skb_pull(skb, NCI_DATA_HDR_SIZE);
243 243
244 if (ndev->target_active_prot == NFC_PROTO_MIFARE) { 244 if (ndev->target_active_prot == NFC_PROTO_MIFARE ||
245 ndev->target_active_prot == NFC_PROTO_JEWEL ||
246 ndev->target_active_prot == NFC_PROTO_FELICA ||
247 ndev->target_active_prot == NFC_PROTO_ISO15693) {
245 /* frame I/F => remove the status byte */ 248 /* frame I/F => remove the status byte */
246 pr_debug("NFC_PROTO_MIFARE => remove the status byte\n"); 249 pr_debug("frame I/F => remove the status byte\n");
247 skb_trim(skb, (skb->len - 1)); 250 skb_trim(skb, (skb->len - 1));
248 } 251 }
249 252
diff --git a/net/nfc/nci/ntf.c b/net/nfc/nci/ntf.c
index df91bb95b12a..205b35f666db 100644
--- a/net/nfc/nci/ntf.c
+++ b/net/nfc/nci/ntf.c
@@ -2,6 +2,7 @@
2 * The NFC Controller Interface is the communication protocol between an 2 * The NFC Controller Interface is the communication protocol between an
3 * NFC Controller (NFCC) and a Device Host (DH). 3 * NFC Controller (NFCC) and a Device Host (DH).
4 * 4 *
5 * Copyright (C) 2014 Marvell International Ltd.
5 * Copyright (C) 2011 Texas Instruments, Inc. 6 * Copyright (C) 2011 Texas Instruments, Inc.
6 * 7 *
7 * Written by Ilan Elias <ilane@ti.com> 8 * Written by Ilan Elias <ilane@ti.com>
@@ -155,6 +156,24 @@ static __u8 *nci_extract_rf_params_nfcf_passive_poll(struct nci_dev *ndev,
155 return data; 156 return data;
156} 157}
157 158
159static __u8 *nci_extract_rf_params_nfcv_passive_poll(struct nci_dev *ndev,
160 struct rf_tech_specific_params_nfcv_poll *nfcv_poll,
161 __u8 *data)
162{
163 ++data;
164 nfcv_poll->dsfid = *data++;
165 memcpy(nfcv_poll->uid, data, NFC_ISO15693_UID_MAXSIZE);
166 data += NFC_ISO15693_UID_MAXSIZE;
167 return data;
168}
169
170__u32 nci_get_prop_rf_protocol(struct nci_dev *ndev, __u8 rf_protocol)
171{
172 if (ndev->ops->get_rfprotocol)
173 return ndev->ops->get_rfprotocol(ndev, rf_protocol);
174 return 0;
175}
176
158static int nci_add_new_protocol(struct nci_dev *ndev, 177static int nci_add_new_protocol(struct nci_dev *ndev,
159 struct nfc_target *target, 178 struct nfc_target *target,
160 __u8 rf_protocol, 179 __u8 rf_protocol,
@@ -164,6 +183,7 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
164 struct rf_tech_specific_params_nfca_poll *nfca_poll; 183 struct rf_tech_specific_params_nfca_poll *nfca_poll;
165 struct rf_tech_specific_params_nfcb_poll *nfcb_poll; 184 struct rf_tech_specific_params_nfcb_poll *nfcb_poll;
166 struct rf_tech_specific_params_nfcf_poll *nfcf_poll; 185 struct rf_tech_specific_params_nfcf_poll *nfcf_poll;
186 struct rf_tech_specific_params_nfcv_poll *nfcv_poll;
167 __u32 protocol; 187 __u32 protocol;
168 188
169 if (rf_protocol == NCI_RF_PROTOCOL_T1T) 189 if (rf_protocol == NCI_RF_PROTOCOL_T1T)
@@ -179,8 +199,10 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
179 protocol = NFC_PROTO_FELICA_MASK; 199 protocol = NFC_PROTO_FELICA_MASK;
180 else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP) 200 else if (rf_protocol == NCI_RF_PROTOCOL_NFC_DEP)
181 protocol = NFC_PROTO_NFC_DEP_MASK; 201 protocol = NFC_PROTO_NFC_DEP_MASK;
202 else if (rf_protocol == NCI_RF_PROTOCOL_T5T)
203 protocol = NFC_PROTO_ISO15693_MASK;
182 else 204 else
183 protocol = 0; 205 protocol = nci_get_prop_rf_protocol(ndev, rf_protocol);
184 206
185 if (!(protocol & ndev->poll_prots)) { 207 if (!(protocol & ndev->poll_prots)) {
186 pr_err("the target found does not have the desired protocol\n"); 208 pr_err("the target found does not have the desired protocol\n");
@@ -213,6 +235,12 @@ static int nci_add_new_protocol(struct nci_dev *ndev,
213 memcpy(target->sensf_res, nfcf_poll->sensf_res, 235 memcpy(target->sensf_res, nfcf_poll->sensf_res,
214 target->sensf_res_len); 236 target->sensf_res_len);
215 } 237 }
238 } else if (rf_tech_and_mode == NCI_NFC_V_PASSIVE_POLL_MODE) {
239 nfcv_poll = (struct rf_tech_specific_params_nfcv_poll *)params;
240
241 target->is_iso15693 = 1;
242 target->iso15693_dsfid = nfcv_poll->dsfid;
243 memcpy(target->iso15693_uid, nfcv_poll->uid, NFC_ISO15693_UID_MAXSIZE);
216 } else { 244 } else {
217 pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode); 245 pr_err("unsupported rf_tech_and_mode 0x%x\n", rf_tech_and_mode);
218 return -EPROTO; 246 return -EPROTO;
@@ -305,6 +333,11 @@ static void nci_rf_discover_ntf_packet(struct nci_dev *ndev,
305 &(ntf.rf_tech_specific_params.nfcf_poll), data); 333 &(ntf.rf_tech_specific_params.nfcf_poll), data);
306 break; 334 break;
307 335
336 case NCI_NFC_V_PASSIVE_POLL_MODE:
337 data = nci_extract_rf_params_nfcv_passive_poll(ndev,
338 &(ntf.rf_tech_specific_params.nfcv_poll), data);
339 break;
340
308 default: 341 default:
309 pr_err("unsupported rf_tech_and_mode 0x%x\n", 342 pr_err("unsupported rf_tech_and_mode 0x%x\n",
310 ntf.rf_tech_and_mode); 343 ntf.rf_tech_and_mode);
@@ -455,6 +488,11 @@ static void nci_rf_intf_activated_ntf_packet(struct nci_dev *ndev,
455 &(ntf.rf_tech_specific_params.nfcf_poll), data); 488 &(ntf.rf_tech_specific_params.nfcf_poll), data);
456 break; 489 break;
457 490
491 case NCI_NFC_V_PASSIVE_POLL_MODE:
492 data = nci_extract_rf_params_nfcv_passive_poll(ndev,
493 &(ntf.rf_tech_specific_params.nfcv_poll), data);
494 break;
495
458 default: 496 default:
459 pr_err("unsupported activation_rf_tech_and_mode 0x%x\n", 497 pr_err("unsupported activation_rf_tech_and_mode 0x%x\n",
460 ntf.activation_rf_tech_and_mode); 498 ntf.activation_rf_tech_and_mode);